MariaDB移植到mipsel-buildroot-linux-uclibc记录

移植MariaDB到MT7621这款CPU上,交叉编译工具链为mipsel-buildroot-linux-uclibc,是公司工程中的工具链,这里做个简单的记录。MariaDB使用的版本为mariadb-5.5.52,与现在的centos 7一致,保证后续的使用能与现在的系统差距不大。

Ralink提供的工具链,坑还是比较多的:

  1. 没有合理利用pkgconfig的pc文件来做工程,导致很多的configure需要指定.so路径,复杂度提高不少
  2. 所提供的编译好的工具链,没有加上-fPIC导致链接libstdc++.a的时候出错,因此结果是我自己重新编译了工具链,重新编译工具链可以阅读 《在CENTOS7上编译RALINK SDK 64-BIT工具链》,不过文章中没有编译mksquash_lzma,这个要自己补充下,否则生成img的时候会有异常。
  3. 工具链版本较低,而且使用的是uClibc,而非uClibc-ng,编译的MariaDB需要ucontext,因此自己打了补丁。
  4. 工程中利用了linux的区分大小写,同一个目录下有Makefile以及makefile同时存在,如果代码被解压到windows这种不敏感大小写的,会出现异常。

由于MariaDB使用的是5.5.52版本,这个版本其实对于交叉编译的支持没有10版本的好,因此需要打上以下的补丁,才能区分编译一些本地的可执行文件,用来生产用于编译的新文件。补丁如下:


补丁都打好了之后,将MariaDB加入工程,由于工程会export CC PATH等一些交叉编译的全局变量。我这里把我的makefile贴出来。

DB_VER=5.5.52
CUR_DIR=$(shell pwd)/


all:
        [ -f import_executables/cmake_success ] || rm -rf import_executables && mkdir -p import_executables && cd import_executables \
                && CC=gcc CPP=g++ CXX=g++ AR=ar NM=nm LD=ld CFLAGS="-I/usr/include" LDFLAGS="-L/usr/lib -L/usr/lib64 -L/lib -L/lib64" \
                CPPFLAGS="-I/usr/include" CPPLDFLAGS="-L/usr/lib -L/usr/lib64 -L/lib -L/lib64" CXXFLAGS="-I/usr/include" \
                CXXLDFLAGS="-L/usr/lib -L/usr/lib64 -L/lib -L/lib64" $(CMAKE) ../mariadb-$(DB_VER) \
                && touch cmake_success && $(MAKE) import_executables
        [ -f build/cmake_success ] || rm -rf build && mkdir -p build && cd build && $(CMAKE) ../mariadb-$(DB_VER) \
                -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER="$(CC)" -DCMAKE_CXX_COMPILER="$(CXX)"\
                -DIMPORT_EXECUTABLES=$(CUR_DIR)/import_executables/import_executables.cmake\
                -DWITH_UNIT_TESTS=0 -DSTACK_DIRECTION=-1 -DWITH_JEMALLOC=no -DWITHOUT_TOKUDB=1 \
                -DENABLE_DTRACE=0 -DWITH_EMBEDDED_SERVER=ON -DINSTALL_DOCDIR=share/doc/mariadb \
                -DINSTALL_DOCREADMEDIR=share/doc/mariadb -DINSTALL_MANDIR=share/man -DINSTALL_MYSQLSHAREDIR=share/mysql \
                -DINSTALL_MYSQLTESTDIR=share/mysql/test -DINSTALL_PLUGINDIR=lib/mysql/plugin -DINSTALL_SBINDIR=sbin \
                -DINSTALL_SCRIPTDIR=bin -DINSTALL_SQLBENCHDIR=share/mysql/bench -DINSTALL_SUPPORTFILESDIR=share/mysql \
                -DMYSQL_DATADIR=/var/lib/mysql -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
                -DCURSES_LIBRARY=$(ROOTDIR)/lib/lib/libncurses.so \
                && touch cmake_success && $(MAKE)

romfs:


clean:
        $(RM) -rf build import_executables

import_executables目录用来生成本地可执行文件,而build则用来生成交叉编译的MariaDB。重点说一下,由于cmake只能是一个目录下一个cmake,所以import_executables和build要分开,否则会有问题;而在生产build的cmake工程的时候,需要将-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER=”$(CC)” -DCMAKE_CXX_COMPILER=”$(CXX)” 这些给带上去,因为cmake会自动根据CMAKE_C_COMPILER以及CMAKE_CXX_COMPILER来判定CMAKE_CROSSCOMPILING是否为TRUE,如果你自己-DCMAKE_CROSSCOMPILING=1则可能不生效。这点需要特别注意。

工程目录结构如下:

[root@centos7dev source]# ls user/mariadb/
build  import_executables  Makefile  mariadb-5.5.52

目前也只是正常编译通过,具体运行情况如何,后续再来补充下,看MT7621这颗CPU估计比较呛,好歹移植我们这的数据量不会太大。

参考资料:

Cross-compiling MariaDB

CMake Cross Compiling

转载请注明: 转载自elkPi.com

本文链接地址: MariaDB移植到mipsel-buildroot-linux-uclibc记录

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top