移植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