From b0577db04eb94fb34597297249f5ec45aefba71d Mon Sep 17 00:00:00 2001 From: DanyLE Date: Sun, 10 Mar 2024 15:45:27 +0100 Subject: [PATCH] feat: add cross compile support for arm64 and arm --- Jenkinsfile | 227 ++++++---------------------------------- Makefile | 91 ++++++++++------ docker/antos/Dockerfile | 8 +- docker/dev/Dockerfile | 18 +++- scripts/ckarch.sh | 69 ++++++++++++ scripts/mkappimg.sh | 17 ++- scripts/mkdeb.sh | 8 +- 7 files changed, 188 insertions(+), 250 deletions(-) create mode 100755 scripts/ckarch.sh diff --git a/Jenkinsfile b/Jenkinsfile index 76de548..92106f3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,85 +1,5 @@ -def build_rust_mod() { - sh '''#!/bin/bash - set -e - set -x - TARGET= - case "$arch" in - amd64) - TARGET="x86_64-unknown-linux-gnu" - ;; - arm64) - TARGET="aarch64-unknown-linux-gnu" - ;; - arm) - TARGET="armv7-unknown-linux-gnueabihf" - ;; - *) - echo "unknown target for architecture $arch" - exit 1 - ;; - esac - mkdir -p build/$arch/ - DESTDIR=$(realpath build/$arch/) \ - PLATFORM=$arch \ - RUST_TARGET=$TARGET \ - RUSTUP_HOME=/opt/rust/rustup \ - CARGO_HOME=/opt/rust/cargo \ - make luafcgi - ''' -} - -def build_server_and_backend() { - sh '''#!/bin/bash - set -e - set -x - TARGET= - case "$arch" in - amd64) - ;; - arm64) - ;; - arm) - ;; - *) - echo "unknown target for architecture $arch" - exit 1 - ;; - esac - mkdir -p build/$arch/ - DESTDIR=$(realpath build/$arch/) \ - PLATFORM=$arch \ - FRONTEND_IGNORE=true \ - LUAFCGI_IGNORE=true \ - make clean_c all - ''' -} - -def build_package() { - sh '''#!/bin/bash - set -e - set -x - TARGET= - case "$arch" in - amd64) - ;; - arm64) - ;; - arm) - ;; - *) - echo "unknown target for architecture $arch" - exit 1 - ;; - esac - mkdir -p build/$arch/ - DESTDIR=$(realpath build/$arch/) \ - PLATFORM=$arch \ - make deb appimg - ''' -} - pipeline { - agent { node { label'master' } } + agent { node { label'xsangle/ci-tools:latest' } } options { // Limit build history with buildDiscarder option: // daysToKeepStr: history is only kept up to this many days. @@ -104,140 +24,53 @@ pipeline { } steps { sh''' + cd antd/luasocket && git stash || true + cd $WORKSPACE git submodule update --init make clean || true rm -rf build/* || true + mkdir build ''' } } - stage('Build Frontend (TS)') { - agent { - node { label'workstation' } - } + stage('Build AMD64)') { steps { sh''' - mkdir -p build/frontend/ - DESTDIR=$(realpath build/frontend/) make frontend - for arch in arm arm64 amd64; do - mkdir build/$arch - cp -rf build/frontend/* build/$arch/ - done - rm -rf build/frontend + DESTDIR=$(realpath build) \ + ARCH=amd64 \ + RUSTUP_HOME=/opt/rust/rustup \ + CARGO_HOME=/opt/rust/cargo \ + make all deb appimg ''' } } - stage('Build RUST MODULE AMD64') { - agent { - node { label'workstation' } - } + stage('Build ARM64)') { steps { - script { - env.arch = 'amd64' - } - build_rust_mod() + sh''' + DESTDIR=$(realpath build) \ + ARCH=arm64 \ + RUSTUP_HOME=/opt/rust/rustup \ + CARGO_HOME=/opt/rust/cargo \ + make all deb appimg + ''' } } - stage('Build RUST MODULE ARM64') { - agent { - node { label'workstation' } - } + stage('Build ARM)') { steps { - script { - env.arch = 'arm64' - } - build_rust_mod() + sh''' + DESTDIR=$(realpath build) \ + ARCH=arm \ + RUSTUP_HOME=/opt/rust/rustup \ + CARGO_HOME=/opt/rust/cargo \ + make all deb appimg + ''' } } - stage('Build RUST MODULE ARM') { - agent { - node { label'workstation' } - } + stage('Checking build)') { steps { - script { - env.arch = 'arm' - } - build_rust_mod() - } - } - - stage('Build Server + backend AMD64') { - agent { - docker { - image 'xsangle/ci-tools:latest-amd64' - reuseNode true - } - } - steps { - script { - env.arch = 'amd64' - } - build_server_and_backend() - } - } - - stage('Build Server + backend ARM64') { - agent { - docker { - image 'xsangle/ci-tools:latest-arm64' - reuseNode true - } - } - steps { - script { - env.arch = 'arm64' - } - build_server_and_backend() - } - } - - stage('Build Server + backend ARM') { - agent { - docker { - image 'xsangle/ci-tools:latest-arm' - reuseNode true - } - } - steps { - script { - env.arch = 'arm' - } - build_server_and_backend() - } - } - - stage('Build package AMD64') { - agent { - node { label'workstation' } - } - steps { - script { - env.arch = 'amd64' - } - build_package() - } - } - - stage('Build package ARM64') { - agent { - node { label'workstation' } - } - steps { - script { - env.arch = 'arm64' - } - build_package() - } - } - - stage('Build package ARM') { - agent { - node { label'workstation' } - } - steps { - script { - env.arch = 'arm' - } - build_package() + sh''' + ./scripts/ckarch.sh build + ''' } } stage('Archive') { diff --git a/Makefile b/Makefile index 3be8642..b26b94b 100644 --- a/Makefile +++ b/Makefile @@ -1,76 +1,104 @@ ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) -PLATFORM?=x86_64 - -RUSTUP_HOME?=/opt/rust -CARGO_HOME?=/opt/rust/cargo -RUST_TARGET?=x86_64-unknown-linux-gnu - -DESTDIR?=$(ROOT_DIR)/build/ -BUILD_PREFIX:=/opt/www -INSTALL_DIR:=$(DESTDIR)/$(BUILD_PREFIX) - +ARCH?=amd64 VERSION?=2.0.0 BRANCH?=b -BUILDID=$(shell git rev-parse --short HEAD) +RUSTUP_HOME?=/opt/rust +CARGO_HOME?=/opt/rust/cargo +DESTDIR?=$(ROOT_DIR)/build/ + +ifeq ('$(ARCH)','amd64') +RUST_TARGET?=x86_64-unknown-linux-gnu +CC_PREFIX?= +HOST?= +endif + +ifeq ('$(ARCH)','arm64') +RUST_TARGET?=aarch64-unknown-linux-gnu +CC_PREFIX?=aarch64-linux-gnu- +HOST?=--host=aarch64-linux-gnu +endif + +ifeq ('$(ARCH)','arm') +RUST_TARGET?=armv7-unknown-linux-gnueabihf +CC_PREFIX?=arm-linux-gnueabihf- +HOST?=--host=arm-linux-gnueabihf +endif + +CC:=$(CC_PREFIX)gcc +CXX:=$(CC_PREFIX)g++ +BUILD_PREFIX:=/opt/www +INSTALL_DIR:=$(DESTDIR)/$(ARCH)/$(BUILD_PREFIX) + +BUILDID:=$(shell git rev-parse --short HEAD) VERSION_STR=$(VERSION)-$(BRANCH)-$(BUILDID) -PKG_NAME="AntOS_${VERSION_STR}_${PLATFORM}" +PKG_NAME="AntOS_${VERSION_STR}_${ARCH}" all: antos tar.gz antos: antd backend frontend + cp $(ROOT_DIR)/README.md $(INSTALL_DIR)/htdocs/os antd: httpd plugins luasec luasocket silk luafcgi rm $(INSTALL_DIR)/runner.ini cp $(ROOT_DIR)/config/*.ini $(INSTALL_DIR)/etc - cp $(ROOT_DIR)/README.md $(INSTALL_DIR)/htdocs/os + rm $(INSTALL_DIR)/bin/ant-d $(INSTALL_DIR)/bin/runnerd @echo "Finish building Antd server" -httpd: +httpd: clean_c cd $(ROOT_DIR)/antd/ant-http && libtoolize && aclocal && autoconf && automake --add-missing - cd $(ROOT_DIR)/antd/ant-http && ./configure --prefix=$(BUILD_PREFIX) - make -C $(ROOT_DIR)/antd/ant-http install + cd $(ROOT_DIR)/antd/ant-http && ./configure $(HOST) --prefix=$(BUILD_PREFIX) + DESTDIR=$(DESTDIR)/$(ARCH) make -C $(ROOT_DIR)/antd/ant-http install plugins: antd-fcgi-plugin antd-tunnel-plugin antd-wvnc-plugin antd-tunnel-publishers @echo "Finish making plugins" -luasec: +luasec: clean_c @echo "Building $@" lua5.3 $(ROOT_DIR)/antd/luasec/src/options.lua -g \ /usr/include/openssl/ssl.h \ > $(ROOT_DIR)/antd/luasec/src/options.c + CC=$(CC) \ INC_PATH=-I$(ROOT_DIR)/antd/silk/modules/lua/lua54/ \ make -C $(ROOT_DIR)/antd/luasec linux + CC=$(CC) \ INC_PATH=-I$(ROOT_DIR)/antd/silk/modules/lua/lua54/ \ - DESTDIR=$(DESTDIR) \ + DESTDIR=$(DESTDIR)/$(ARCH) \ LUAPATH=/opt/www/lib/lua \ LUACPATH=/opt/www/lib/lua \ make -C $(ROOT_DIR)/antd/luasec install -luasocket: +luasocket: clean_c @echo "Building $@" + sed -i 's/^CC_linux=/CC_linux?=/g' $(ROOT_DIR)/antd/luasocket/src/makefile + sed -i 's/^LD_linux=/LD_linux?=/g' $(ROOT_DIR)/antd/luasocket/src/makefile + CC_linux=$(CC) \ + LD_linux=$(CC) \ LUAV=5.4 \ LUAINC_linux=$(ROOT_DIR)/antd/silk/modules/lua/lua54/ \ LUAPREFIX_linux=$(BUILD_PREFIX) \ PLAT=linux \ make -C $(ROOT_DIR)/antd/luasocket linux + CC_linux=$(CC) \ + LD_linux=$(CC) \ LUAV=5.4 \ LUAINC_linux=$(ROOT_DIR)/antd/silk/modules/lua/lua54/ \ LUAPREFIX_linux=$(BUILD_PREFIX) \ PLAT=linux \ - make -C $(ROOT_DIR)/antd/luasocket install-unix + DESTDIR=$(DESTDIR)/$(ARCH) make -C $(ROOT_DIR)/antd/luasocket install-unix -mkdir -p $(INSTALL_DIR)/lib/lua cp -rf $(INSTALL_DIR)/lib/lua/5.4/* $(INSTALL_DIR)/lib/lua/ cp -rf $(INSTALL_DIR)/share/lua/5.4/* $(INSTALL_DIR)/lib/lua/ rm -rf $(INSTALL_DIR)/lib/lua/5.4 $(INSTALL_DIR)/share -antd-% sil%: httpd +antd-% sil%: clean_c @echo "Building $@" cd $(ROOT_DIR)/antd/$@ && libtoolize && aclocal && autoconf && automake --add-missing - cd $(ROOT_DIR)/antd/$@ && CFLAGS="-I$(INSTALL_DIR)/include" LDFLAGS="-L$(INSTALL_DIR)/lib" ./configure --prefix=$(BUILD_PREFIX) - make -C $(ROOT_DIR)/antd/$@ install + cd $(ROOT_DIR)/antd/$@ && CFLAGS="-I$(INSTALL_DIR)/include" LDFLAGS="-L$(INSTALL_DIR)/lib" \ + ./configure $(HOST) --prefix=$(BUILD_PREFIX) + DESTDIR=$(DESTDIR)/$(ARCH) make -C $(ROOT_DIR)/antd/$@ install luafcgi: ifeq ($(LUAFCGI_IGNORE),) @@ -78,6 +106,7 @@ ifeq ($(LUAFCGI_IGNORE),) mkdir -p $(INSTALL_DIR)/bin RUSTUP_HOME=$(RUSTUP_HOME) CARGO_HOME=$(CARGO_HOME) \ . $(CARGO_HOME)/env && \ + rustup default stable && \ rustup target add $(RUST_TARGET) && \ cargo build --target=$(RUST_TARGET) --release \ --manifest-path=$(ROOT_DIR)/antd/luafcgi/Cargo.toml \ @@ -101,7 +130,9 @@ clean_c: clean: clean_c @echo "Clean Rust project and output DIR" RUSTUP_HOME=$(RUSTUP_HOME) CARGO_HOME=$(CARGO_HOME) \ - . $(CARGO_HOME)/env && cargo clean \ + . $(CARGO_HOME)/env && \ + rustup default stable && \ + cargo clean \ --manifest-path=$(ROOT_DIR)/antd/luafcgi/Cargo.toml \ --config=$(ROOT_DIR)/antd/luafcgi/.cargo/config.toml -rm -rf $(DESTDIR)/* @@ -121,15 +152,15 @@ else endif deb: - -rm $(DESTDIR)/*.deb - scripts/mkdeb.sh $(VERSION_STR) $(PLATFORM) $(DESTDIR) + -rm $(DESTDIR)/$(ARCH)/*.deb + scripts/mkdeb.sh $(VERSION_STR) $(ARCH) $(DESTDIR)/$(ARCH) tar.gz: antos - -rm $(DESTDIR)/$(PKG_NAME).tar.gz - cd $(DESTDIR)/ && tar cvzf $(PKG_NAME).tar.gz opt + -rm $(DESTDIR)/$(ARCH)/$(PKG_NAME).tar.gz + cd $(DESTDIR)/$(ARCH)/ && tar cvzf $(PKG_NAME).tar.gz opt appimg: - -rm $(DESTDIR)/*.AppImage - scripts/mkappimg.sh $(PLATFORM) $(VERSION_STR) $(DESTDIR) $(ROOT_DIR)/antos-64.png + -rm $(DESTDIR)/$(ARCH)/*.AppImage + scripts/mkappimg.sh $(ARCH) $(VERSION_STR) $(DESTDIR)/$(ARCH) $(ROOT_DIR)/antos-64.png .PHONY: antd antos \ No newline at end of file diff --git a/docker/antos/Dockerfile b/docker/antos/Dockerfile index c3b50f5..19b7e85 100644 --- a/docker/antos/Dockerfile +++ b/docker/antos/Dockerfile @@ -1,10 +1,8 @@ -FROM ubuntu:jammy AS deploy-env +FROM debian:bookworm AS deploy-env ARG tag COPY deps/ / -RUN dpkg -i /libssl1.1_1.1.1f-$(uname -m).deb -# manual install libssl1.1 -RUN apt-get update && apt-get --yes --no-install-recommends install libsqlite3-0 zlib1g libreadline8 wget libvncclient1 libjpeg-turbo8 openssh-client tar tree +RUN apt-get update && apt-get --yes --no-install-recommends install libsqlite3-0 zlib1g libreadline8 wget libssl3 libvncclient1 libturbojpeg0 openssh-client tar tree RUN apt clean && rm -rf /var/lib/apt/lists/* RUN mkdir /ulib RUN cp -rf /lib/*-linux-*/libsqlite3*.so* /ulib @@ -61,7 +59,7 @@ RUN chown -R root:root /platform RUN tree /platform RUN ls -al /platform -FROM busybox:stable-glibc +FROM busybox:1.36.1-glibc #copy all necessary libraries COPY --from=deploy-env /ulib/ /lib/ COPY --from=deploy-env /bin/wget /bin/ diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile index 8dc5cbf..8289f49 100644 --- a/docker/dev/Dockerfile +++ b/docker/dev/Dockerfile @@ -1,6 +1,5 @@ -FROM ubuntu:jammy AS deploy-env +FROM debian:bookworm AS deploy-env -# manual install libssl1.1 RUN apt-get update && apt-get --yes --no-install-recommends install \ build-essential \ make \ @@ -17,11 +16,22 @@ RUN apt-get update && apt-get --yes --no-install-recommends install \ libffi-dev \ ca-certificates \ unzip \ - libjpeg-turbo8-dev \ + libturbojpeg0-dev \ libvncserver-dev \ lua5.3 RUN RUSTUP_HOME=/opt/rust/rustup CARGO_HOME=/opt/rust/cargo bash -c 'curl https://sh.rustup.rs -sSf | sh -s -- -y' RUN chmod -R 777 /opt/rust/ RUN apt-get update && apt-get --yes --no-install-recommends install \ - nodejs npm git wget libfuse2 fuse3 \ No newline at end of file + nodejs npm git wget libfuse2 fuse3 + +# cross build support +RUN dpkg --add-architecture armhf +RUN dpkg --add-architecture arm64 +RUN apt-get update && apt-get --yes --no-install-recommends install \ + crossbuild-essential-armhf \ + crossbuild-essential-armhf \ + libsqlite3-0:arm64 zlib1g:arm64 libreadline8:arm64 libssl3:arm64 \ + libffi-dev:arm64 libturbojpeg0:arm64 libvncclient1:arm64 \ + libsqlite3-0:armhf zlib1g:armhf libreadline8:armhf libssl3:armhf \ + libffi-dev:armhf libturbojpeg0:armhf libvncclient1:armhf \ No newline at end of file diff --git a/scripts/ckarch.sh b/scripts/ckarch.sh new file mode 100755 index 0000000..3a3c9e3 --- /dev/null +++ b/scripts/ckarch.sh @@ -0,0 +1,69 @@ +#!/bin/bash +set -e + +TARGET=$1 + +[[ -z "$TARGET" ]] && echo "No taget provided" && exit 1 +[[ ! -d "$TARGET" ]] && echo "Target is not a directory" && exit 1 + +DIRS=$(ls "$TARGET") +EXIT_CODE=0 + +BLUE="\e[1;34m" +NC="\e[0m" +CERR="\e[1;31m" +COK="\e[1;32m" +GRAY="\e[90m" +YELLOW="\e[93m" + +check_file() { + FILE=$1 + LD=$2 + echo -n -e "${YELLOW}Checking $FILE:....................${NC}" + if ! file "$(realpath "$FILE")" | grep "$LD" > /dev/null ; then + echo -e "${CERR}FAILED${NC}" + EXIT_CODE=1 + echo -e -n "${GRAY}" + file "$(realpath "$FILE")" + echo -e "${NC}" + else + echo -e "${COK}OK${NC}" + echo -e -n "${GRAY}" + readelf -d "$FILE" | grep NEEDED || true + echo -e "${NC}" + fi +} + +check() { + ARCH=$1 + LD=$2 + ROOT=$TARGET/$ARCH/opt/www + echo -e "${BLUE}Checking: $TARGET/$ARCH${NC}" + # check bin directory + for file in "$ROOT"/bin/*; do + check_file "$file" "$LD" + done + # check for libraries + libs=$(find "$ROOT"/lib/ -name "*.so*") + for lib in $libs; do + check_file "$lib" "$LD" + done +} + +for dir in $DIRS; do + case $dir in + arm64) + check "$dir" "ARM aarch64" + ;; + arm) + check "$dir" "ARM, EABI" + ;; + amd64) + check "$dir" "x86-64" + ;; + *) + echo "Unkown architecture: $dir, ignore it" + ;; +esac +done +exit $EXIT_CODE \ No newline at end of file diff --git a/scripts/mkappimg.sh b/scripts/mkappimg.sh index 550005e..eb1d113 100755 --- a/scripts/mkappimg.sh +++ b/scripts/mkappimg.sh @@ -6,25 +6,22 @@ arch=$1 tag=$2 DIR=$3 logo=$4 -[ -z $arch ] && echo "1. No architecture provided" && exit 1 -[ -z $tag ] && echo "2. No version provided" && exit 1 -[ -z $DIR ] && echo "3. No input dir provided" && exit 1 -[ -z $logo ] && echo "4. No logo file provided" && exit 1 +[ -z "$arch" ] && echo "1. No architecture provided" && exit 1 +[ -z "$tag" ] && echo "2. No version provided" && exit 1 +[ -z "$DIR" ] && echo "3. No input dir provided" && exit 1 +[ -z "$logo" ] && echo "4. No logo file provided" && exit 1 # download the appimagetools echo "Downloading the appimage tools" archname=x86_64 case $arch in amd64|x86_64) archname=x86_64 - suffix=x86_64 ;; aarch64|arm64) archname=aarch64 - suffix=aarch64 ;; armv7l|arm) archname=armhf - suffix=armv7l ;; *) echo "Unkown architecture" @@ -46,7 +43,7 @@ echo "Building app image for $arch" mkdir -p "$APP_DIR" -cp -rf $DIR/opt "$APP_DIR" +cp -rf "$DIR/opt" "$APP_DIR" rm -rf $APP_DIR/opt/www/include || true rm -rf $APP_DIR/opt/www/etc/* || true @@ -186,6 +183,6 @@ Categories=Utility; Terminal=true EOF -cp $logo $APP_DIR/antos.png +cp "$logo" "$APP_DIR/antos.png" -$APP_IMG --runtime-file $APP_RUNT $APP_DIR $DIR/$NAME.AppImage \ No newline at end of file +$APP_IMG --runtime-file $APP_RUNT $APP_DIR "$DIR/$NAME.AppImage" \ No newline at end of file diff --git a/scripts/mkdeb.sh b/scripts/mkdeb.sh index f2b92f1..0bb15bb 100755 --- a/scripts/mkdeb.sh +++ b/scripts/mkdeb.sh @@ -42,11 +42,11 @@ NAME="AntOS_${TAG}_${archname}" FILE="$NAME.deb" TMP="/tmp/$NAME" [ -d "$TMP" ] && rm -rf "$TMP" -mkdir -p $TMP +mkdir -p "$TMP" echo "Copying binaries of version $TAG, architecture $ARCH to $TMP" -cp $DIR/opt $TMP/ -rf -cd $TMP +cp "$DIR/opt" "$TMP/" -rf +cd "$TMP" mkdir DEBIAN cat << EOF >> DEBIAN/control @@ -59,6 +59,6 @@ Description: All-in-one AntOS web-based remote desktop environment EOF cat DEBIAN/control cd .. -dpkg-deb --build $TMP +dpkg-deb --build "$TMP" mv "$FILE" "$DIR/"