MariaDB 10.6.5的交叉编译

MariaDB的交叉编译

1.环境

Host环境:Ubuntu 18.04.5 (PC)

编译工具链:arm-himix200-linux(解包自arm-himix200-linux.tgz,据说来自Hi3516dv300SDK),海思提供的arm编译工具链

环境变量:执行命令:export PATH=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin:$PATH

Nginx目标安装目录:/data/app

编译器arm-himix200-linux默认输出的ELF格式为private flags = 5000200: [Version5 EABI] [soft-float ABI],与ubuntu-armhf的格式private flags = 5000400: [Version5 EABI] [hard-float ABI]不兼容(soft-float ABI与hard-float ABI的传参规则不一样,因此会不兼容)。

通过gcc的print-multi-lib查询

xxx@xxx-HP-ProDesk-480-G5-MT:~/YYY$ arm-himix200-linux-gcc --print-multi-lib
.;
armv5te_arm9;@mcpu=arm926ej-s
a9;@mcpu=cortex-a9
a7;@mcpu=cortex-a7
a17;@mcpu=cortex-a17
a17_a7;@mcpu=cortex-a17.cortex-a7
a53;@mcpu=cortex-a53
a73;@mcpu=cortex-a73
a73_a53;@mcpu=cortex-a73.cortex-a53
armv5te_arm9_soft;@mcpu=arm926ej-s@mfloat-abi=soft
armv5te_arm9_vfp;@mcpu=arm926ej-s@mfloat-abi=softfp@mfpu=vfp
a9_soft;@mcpu=cortex-a9@mfloat-abi=soft
a9_softfp_vfp;@mcpu=cortex-a9@mfloat-abi=softfp@mfpu=vfp
a9_softfp_vfpv3-d16;@mcpu=cortex-a9@mfloat-abi=softfp@mfpu=vfpv3-d16
a9_vfpv3;@mcpu=cortex-a9@mfloat-abi=softfp@mfpu=vfpv3
a9_vfpv3_neon;@mcpu=cortex-a9@mfloat-abi=softfp@mfpu=neon
a9_hard_neon;@mcpu=cortex-a9@mfloat-abi=hard@mfpu=neon
a7_soft;@mcpu=cortex-a7@mfloat-abi=soft
a7_softfp_vfpv4;@mcpu=cortex-a7@mfloat-abi=softfp@mfpu=vfpv4
a7_softfp_neon-vfpv4;@mcpu=cortex-a7@mfloat-abi=softfp@mfpu=neon-vfpv4
a7_hard_neon-vfpv4;@mcpu=cortex-a7@mfloat-abi=hard@mfpu=neon-vfpv4
a17_soft;@mcpu=cortex-a17@mfloat-abi=soft
a17_softfp_vfpv4;@mcpu=cortex-a17@mfloat-abi=softfp@mfpu=vfpv4
a17_softfp_neon-vfpv4;@mcpu=cortex-a17@mfloat-abi=softfp@mfpu=neon-vfpv4
a17_hard_neon-vfpv4;@mcpu=cortex-a17@mfloat-abi=hard@mfpu=neon-vfpv4
a17_a7_soft;@mcpu=cortex-a17.cortex-a7@mfloat-abi=soft
a17_a7_softfp_vfpv4;@mcpu=cortex-a17.cortex-a7@mfloat-abi=softfp@mfpu=vfpv4
a17_a7_softfp_neon-vfpv4;@mcpu=cortex-a17.cortex-a7@mfloat-abi=softfp@mfpu=neon-vfpv4
a17_a7_hard_neon-vfpv4;@mcpu=cortex-a17.cortex-a7@mfloat-abi=hard@mfpu=neon-vfpv4
a53_soft;@mcpu=cortex-a53@mfloat-abi=soft
a53_softfp_vfpv4;@mcpu=cortex-a53@mfloat-abi=softfp@mfpu=vfpv4
a53_softfp_neon-vfpv4;@mcpu=cortex-a53@mfloat-abi=softfp@mfpu=neon-vfpv4
a53_hard_neon-vfpv4;@mcpu=cortex-a53@mfloat-abi=hard@mfpu=neon-vfpv4
a73_soft;@mcpu=cortex-a73@mfloat-abi=soft
a73_softfp_vfpv4;@mcpu=cortex-a73@mfloat-abi=softfp@mfpu=vfpv4
a73_softfp_neon-vfpv4;@mcpu=cortex-a73@mfloat-abi=softfp@mfpu=neon-vfpv4
a73_hard_neon-vfpv4;@mcpu=cortex-a73@mfloat-abi=hard@mfpu=neon-vfpv4
a73_a53_soft;@mcpu=cortex-a73.cortex-a53@mfloat-abi=soft
a73_a53_softfp_vfpv4;@mcpu=cortex-a73.cortex-a53@mfloat-abi=softfp@mfpu=vfpv4
a73_a53_softfp_neon-vfpv4;@mcpu=cortex-a73.cortex-a53@mfloat-abi=softfp@mfpu=neon-vfpv4
a73_a53_hard_neon-vfpv4;@mcpu=cortex-a73.cortex-a53@mfloat-abi=hard@mfpu=neon-vfpv4

所以,所有库的编译都需要修改默认CFLAGS,添加上:

CFLAGS="-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4"

2.依赖

mariadb 10.6.5编译时,默认选项,会依赖于如下一些包:zstd、libxml2、jemalloc、ncurses 等等。

在当前目录中创建一个cross.cmake文件,内容如下:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(TOOLCHAIN_PATH "/opt/hisi-linux/x86-arm/arm-himix200-linux")
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/bin/arm-himix200-linux-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/arm-himix200-linux-g++)
SET(CMAKE_FIND_ROOT_PATH "/data/app")

编译命令如下

mkdir host && cd host
cmake ..
make import_executables
cd ../
mkdir build && cd build
env PKG_CONFIG_LIBDIR=/data/app/lib/pkgconfig/ CFLAGS="-I/data/app/include -I/data/app/include/ncursesw -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 "  CXXFLAGS="-I/data/app/include -I/data/app/include/ncursesw -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " LDFLAGS="-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 -L/data/app/lib -Wl,--rpath-link=/data/app/lib" cmake -DCMAKE_TOOLCHAIN_FILE=../cross.cmake -DCMAKE_INSTALL_PREFIX=/data/app -DINSTALL_SCRIPTDIR=bin -DINSTALL_SYSCONFDIR=/data/app/etc -DINSTALL_SYSCONF2DIR=/data/app/etc/my.cnf.d -DINSTALL_UNIX_ADDRDIR=/run/mysqld/mysqld.sock -DINSTALL_PLUGINDIR=lib/mysql/plugin -DINSTALL_SHAREDIR=share -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_BUILD_TYPE=Release -DWITH_UNIT_TESTS=OFF -DENABLED_LOCAL_INFILE=ON -DPLUGIN_EXAMPLE=NO -DPLUGIN_FEDERATED=NO -DPLUGIN_FEEDBACK=NO -DWITH_EMBEDDED_SERVER=ON -DWITH_JEMALLOC=ON -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DSTACK_DIRECTION=-1 -DHAVE_IB_GCC_ATOMIC_BUILTINS=1  -DIMPORT_EXECUTABLES=../host/import_executables.cmake ..
sed -i 's|&& defined(HAVE_TERM_H)||g' ../client/mysql.cc
make VERBOSE=1
make DESTDIR=/XXX install
cd ../
rm bin/data/app/{COPYING,CREDITS,INSTALL-BINARY}
rm -rf bin/data/app/{mysql-test,sql-bench}

执行命令后,将安装mariadb相应的程序、共享库、头文件等至/XXX目录下。

2.1 libxml2

下载链接:ftp://xmlsoft.org/libxml2/libxml2-2.9.12.tar.gz

libxml2依赖于zlib、lzma等库,先编译好相应的依赖库。

编译命令如下(使用环境变量PKG_CONFIG_LIBDIR,替换系统中默认的pkg-config路径):

env PKG_CONFIG_LIBDIR=/data/app/lib/pkgconfig/ CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " ./configure --target=arm-himix200-linux- --host=arm-himix200-linux --prefix=/data/app --without-python
make V=1
make DESTDIR=/XXX install

执行命令后,将安装libxml2相应的共享库、头文件等至/XXX目录下。

2.1.1 zlib

下载链接:http://www.zlib.net/zlib-1.2.11.tar.gz

编译命令如下(默认会是O3,建议用O2):

//export CC=arm-himix200-linux-gcc
env CC=arm-himix200-linux-gcc CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " ./configure --prefix=/data/app
make
make DESTDIR=/XXX install

执行命令后,将安装zlib相应的共享库、头文件等至/XXX目录下。

2.1.2 lzma

下载链接:https://nchc.dl.sourceforge.net/project/lzmautils/xz-5.2.5.tar.gz

编译命令如下(默认会是O3,建议用O2):

env CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " ./configure --target=arm-himix200-linux- --host=arm-himix200-linux --prefix=/data/app
make
make DESTDIR=/XXX install

执行命令后,将安装lzma相应的共享库、头文件等至/XXX目录下。

2.2 zstd

下载链接:https://github.com/facebook/zstd/releases/download/v1.5.0/zstd-1.5.0.tar.gz

编译命令如下:

env CC=arm-himix200-linux-gcc CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " make
make install prefix=/data/app DESTDIR=/XXX

执行命令后,将安装zstd相应的共享库、头文件等至/XXX目录下。

2.3 jemalloc

下载链接:https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2

编译命令如下:

sed -i -e 's|-O3|-O2|g' -e 's|-g3|-g|g' ./configure.ac
sed -i -e 's|-O3|-O2|g' -e 's|-g3|-g|g' ./configure
env CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " CXXFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " LDFLAGS="-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4" ./configure --target=arm-himix200-linux- --host=arm-himix200-linux --prefix=/data/app --enable-autogen
make
make DESTDIR=/XXX install

执行命令后,将安装jemalloc 相应的共享库、头文件等至/XXX目录下。

2.4 ncurses

下载链接:https://invisible-mirror.net/archives/ncurses/ncurses-6.3.tar.gz

ncurses在安装时,会使用编译出来的tic转化terminfo文件,而交叉编译是不能直接运行tic程序的,因此,需要预先编译一个Host上能用的tic程序

编译命令如下:

AWK=gawk ./configure --prefix=/data/app/cross-tools --without-debug
make -C include
make -C progs tic
install -v -m755 progs/tic /data/app/cross-tools/bin
env CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " CXXFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " LDFLAGS="-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4" CC=arm-himix200-linux-gcc ./configure --host=arm-himix200-linux --prefix=/data/app --disable-static --with-shared --with-cxx-binding --with-cxx-shared --with-versioned-syms --without-ada --without-debug --with-ticlib --enable-widec
sed -i 's|${INSTALL} -s|${INSTALL}|g' progs/Makefile
make V=1
sed -i 's|TIC_PATH:=tic|TIC_PATH:=/data/app/cross-tools/bin/tic|g' misc/run_tic.sh
make DESTDIR=/XXX install
cd bin/data/app/lib
for lib in ncurses ncurses++ form panel menu; do   printf "INPUT(-l%sw)\n" "${lib}" > "lib${lib}.so"; done
ln -sv libncurses.so libcurses.so

执行命令后,将安装ncurses 相应的共享库、头文件等至/XXX目录下,同时建立了一些MariaDB所需要的so链接关系。

原文地址:https://www.cnblogs.com/eaglexmw/p/15632454.html