1. 程式人生 > 其它 >MariaDB 10.6.5的交叉編譯

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