Git的交叉編譯

Git的交叉編譯

gitea的服務啓動是不依賴於Git的。但在初始化時會檢測Git程序是否存在,同時也是創建、克隆倉庫所必需。

默認安裝系統提供的Git庫也是可行,但依賴很多,感覺很不實在。

因此直接從官方下載源代碼過來,交叉編譯一個定製版本出來。

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

編譯器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:~/BigEye$ 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.依賴

git 2.34.1編譯時,會依賴於如下一些包:openssl、zlib、pcre2、curl、expat等等(git想要支持https的推送與拉取,需要curl及expat的支持)。

env CURL_CONFIG=/data/app/bin/curl-config CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " CPPFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 -I/data/app/include" LDFLAGS="-L/data/app/lib -Wl,--rpath=/data/app/lib"  ./configure --prefix=/data/app --host=arm-himix200-linux --target=arm-himix200-linux --without-iconv --with-expat=/data/app --without-tcltk --with-curl=/data/app ac_cv_lib_curl_curl_global_init=yes ac_cv_prog_CURL_CONFIG=/data/app/bin/curl-config NO_ICONV=true ac_cv_fread_reads_directories=true ac_cv_snprintf_returns_bogus=false
make V=1
make DESTDIR=/XXX install

執行命令後,將安裝git相應的共享庫、頭文件等至/XXX目錄下。

Gitea如需要支持此版本,則需要修改配置文件,

2.1 openssl

下載鏈接:https://www.openssl.org/source/old/1.1.1/openssl-1.1.1k.tar.gz

編譯命令如下(生成的Makefile不太正確,需要用sed命令修正):

./Configure --prefix=/data/app --openssldir=/data/app/etc/ssl --libdir=lib  --with-zlib-include=/data/app/include --with-zlib-lib=/data/app/lib/ no-asm no-async shared zlib-dynamic no-ssl3-method linux-armv4 --cross-compile-prefix=arm-himix200-linux-
sed -i 's|arm-himix200-linux-gcc|gcc|g' Makefile
sed -i 's|-O3|-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4|g' Makefile
sed -i 's|./demoCA|/data/app/etc/ssl|g' apps/CA.pl.in
sed -i 's|./demoCA|/data/app/etc/ssl|g' apps/openssl.cnf
make
make DESTDIR=/XXX install

執行命令後,將安裝openssl相應的共享庫、頭文件等至/XXX目錄下。

2.2 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.3 libpcre2

下載鏈接:https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.bz2

編譯命令如下:

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

執行命令後,將安裝libpcre2相應的共享庫、頭文件等至/XXX目錄下。

2.4 curl

下載鏈接:https://curl.haxx.se/download/curl-7.80.0.tar.gz

編譯命令如下:

env PKG_CONFIG_LIBDIR=/data/app/lib/pkgconfig/ LDFLAGS="-L/data/app/lib -Wl,--rpath-link=/data/app/lib"  CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " ./configure --prefix=/data/app --host=arm-himix200-linux --target=arm-himix200-linux --disable-ldap --disable-ldaps --disable-manual --enable-ipv6 --enable-versioned-symbols --enable-threaded-resolver --with-openssl --with-libssh2 --with-random='/dev/urandom' 
//sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool
make V=1
make DESTDIR=/XXX install

執行命令後,將安裝curl相應的共享庫、頭文件等至/XXX目錄下。
編譯安裝完成後的curl,某些使用curl-config腳本來鏈接libcurl的,可能會有鏈接問題,則可以直接修改/data/app/bin/curl-config腳本,將166行修改爲

echo ${CURLLIBDIR}-lcurl -lnghttp2 -lssh2 -L/data/app/lib -lssh2 -lssl -lcrypto -lssl -lcrypto -lzstd -lbrotlidec -lbrotlicommon -lz -pthread

2.4.1 libnghttp2

下載鏈接:https://github.com/nghttp2/nghttp2/releases/download/v1.46.0/nghttp2-1.46.0.tar.gz

編譯命令如下:

autoreconf -i
env PKG_CONFIG_LIBDIR=/data/app/lib/pkgconfig/  CFLAGS="-g -O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " CXXFLAGS="-g -O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " LDFLAGS="-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4" ./configure --prefix=/data/app --disable-examples --disable-python-bindings --enable-lib-only --host=arm-himix200-linux --target=arm-himix200-linux
make V=1
make DESTDIR=/XXX install

執行命令後,將安裝libnghttp2相應的共享庫、頭文件等至/XXX目錄下。

2.4.2 brotli

下載鏈接:https://github.com/google/brotli/archive/refs/tags/v1.0.9.tar.gz

拷貝libzip的cross.cmake文件過來

編譯命令如下:

mkdir build && cd build
env PKG_CONFIG_LIBDIR=/data/app/lib/pkgconfig/  CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " cmake -DCMAKE_TOOLCHAIN_FILE=../cross.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/data/app -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_SHARED_LIBS=True ..
make VERBOSE=1
make DESTDIR=/XXX install

執行命令後,將安裝brotli相應的共享庫、頭文件等至/XXX目錄下。

2.4.3 libssh2

下載鏈接:https://www.libssh2.org/download/libssh2-1.10.0.tar.gz

編譯命令如下:

env PKG_CONFIG_LIBDIR=/data/app/lib/pkgconfig/  CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " LDFLAGS="-L/data/app/lib -Wl,--rpath-link=/data/app/lib" ./configure --prefix=/data/app --host=arm-himix200-linux --target=arm-himix200-linux --disable-static --disable-examples-build
make V=1
make DESTDIR=/XXX install

執行命令後,將安裝libssh2相應的共享庫、頭文件等至/XXX目錄下。

2.5 expat

下載鏈接:https://github.com/libexpat/libexpat/releases/download/R_2_4_2/expat-2.4.2.tar.gz

拷貝libzip的cross.cmake文件過來

編譯命令如下(由於Host環境的cmake版本很老,expat的CMakeLists.txt腳本需要較新的cmake,因此編譯時去掉了生成pkg-config文件):

mkdir build && cd build
env PKG_CONFIG_LIBDIR=/data/app/lib/pkgconfig/ LDFLAGS="-L/data/app/lib -Wl,--rpath-link=/data/app/lib"  CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " cmake -DCMAKE_INSTALL_PREFIX=/data/app -DCMAKE_TOOLCHAIN_FILE=../cross.cmake -DCMAKE_BUILD_TYPE=None -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_DOCS=OFF -DEXPAT_BUILD_PKGCONFIG=OFF ../
make VERBOSE=1
make DESTDIR=/XXX install

或者

env PKG_CONFIG_LIBDIR=/data/app/lib/pkgconfig/ LDFLAGS="-L/data/app/lib -Wl,--rpath-link=/data/app/lib"  CFLAGS="-O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 " ./configure --host=arm-himix200-linux --target=arm-himix200-linux --prefix=/data/app --without-xmlwf --without-examples --without-tests --disable-static --without-docbook
make V=1
make DESTDIR=/XXX install

執行命令後,將安裝expat相應的共享庫、頭文件等至/XXX目錄下。

如果使用cmake編譯,由於未生成.pc文件,所以需要手工添加相應文件data/app/lib/pkgconfig/expat.pc

prefix=/data/app
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: expat
Version: 2.4.2
Description: expat XML parser
URL: https://libexpat.github.io/
Libs: -L${libdir} -lexpat -lm
Cflags: -I${includedir}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章