移植MariaDB到MT7621这款CPU上,交叉编译工具链为mipsel-buildroot-linux-uclibc,是公司工程中的工具链,这里做个简单的记录。MariaDB使用的版本为mariadb-5.5.52,与现在的centos 7一致,保证后续的使用能与现在的系统差距不大。
Ralink提供的工具链,坑还是比较多的:
- 没有合理利用pkgconfig的pc文件来做工程,导致很多的configure需要指定.so路径,复杂度提高不少
- 所提供的编译好的工具链,没有加上-fPIC导致链接libstdc++.a的时候出错,因此结果是我自己重新编译了工具链,重新编译工具链可以阅读 《在CENTOS7上编译RALINK SDK 64-BIT工具链》,不过文章中没有编译mksquash_lzma,这个要自己补充下,否则生成img的时候会有异常。
- 工具链版本较低,而且使用的是uClibc,而非uClibc-ng,编译的MariaDB需要ucontext,因此自己打了补丁。
- 工程中利用了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估计比较呛,好歹移植我们这的数据量不会太大。
参考资料:
转载请注明: 转载自elkPi.com