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]
通過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連結關係。