diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f2f939..ec6c20f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,7 @@ jobs: run: | docker load --input /tmp/image.tar docker run -i --name builder gcc-cc \ - /scripts/build-arch.sh aarch64-unknown-linux-gnu + /scripts/build-arch.sh aarch64-unknown-linux-gnu aarch64 docker cp builder:/export/aarch64-unknown-linux-gnu /tmp/aarch64-unknown-linux-gnu docker rm -f builder @@ -62,6 +62,8 @@ jobs: file /tmp/aarch64-unknown-linux-gnu/diesel_ext file /tmp/aarch64-unknown-linux-gnu/cargo-audit file /tmp/aarch64-unknown-linux-gnu/cargo-watch + file /tmp/aarch64-unknown-linux-gnu/cargo-dylint + file /tmp/aarch64-unknown-linux-gnu/dylint-link file /tmp/aarch64-unknown-linux-gnu/penguin - name: Upload artifact @@ -88,7 +90,7 @@ jobs: run: | docker load --input /tmp/image.tar docker run -i --name builder gcc-cc \ - /scripts/build-arch.sh x86_64-unknown-linux-gnu + /scripts/build-arch.sh x86_64-unknown-linux-gnu x86_64 docker cp builder:/export/x86_64-unknown-linux-gnu /tmp/x86_64-unknown-linux-gnu docker rm -f builder @@ -100,12 +102,16 @@ jobs: file /tmp/x86_64-unknown-linux-gnu/diesel_ext file /tmp/x86_64-unknown-linux-gnu/cargo-audit file /tmp/x86_64-unknown-linux-gnu/cargo-watch + file /tmp/x86_64-unknown-linux-gnu/cargo-dylint + file /tmp/x86_64-unknown-linux-gnu/dylint-link file /tmp/x86_64-unknown-linux-gnu/penguin /tmp/x86_64-unknown-linux-gnu/sccache --help /tmp/x86_64-unknown-linux-gnu/diesel --help /tmp/x86_64-unknown-linux-gnu/diesel_ext --help /tmp/x86_64-unknown-linux-gnu/cargo-audit --help /tmp/x86_64-unknown-linux-gnu/cargo-watch --help + /tmp/x86_64-unknown-linux-gnu/cargo-dylint --help + RUSTUP_TOOLCHAIN="stable" /tmp/x86_64-unknown-linux-gnu/dylint-link --help /tmp/x86_64-unknown-linux-gnu/penguin --help - name: Upload artifact diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6f66c74 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.zip \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 7d2396a..0c30cd7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,8 @@ ENV RUSTUP_HOME=/usr/local/rustup \ RUN curl https://sh.rustup.rs -sSf | sh -s -- \ --profile minimal --default-toolchain "$TOOLCHAIN" -y && \ - rustup target add aarch64-unknown-linux-gnu + rustup target add aarch64-unknown-linux-gnu && \ + rustup target add x86_64-unknown-linux-gnu RUN rustup --version && \ cargo --version && \ diff --git a/scripts/build-arch.sh b/scripts/build-arch.sh index 3ac3712..4fb7a77 100755 --- a/scripts/build-arch.sh +++ b/scripts/build-arch.sh @@ -1,7 +1,18 @@ #!/bin/bash set -eu -export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu +export PKG_CONFIG_SYSROOT_DIR="/usr/${2}-linux-gnu" +export RUSTFLAGS="-C linker=${2}-linux-gnu-gcc" +export HOST_CC=gcc + +# We have to point directly to the right cross compilation tools, becuase cargo +# isnt smart enough to choose them automatically +export CC_x86_64_unknown_linux_gnu=/usr/bin/x86_64-linux-gnu-gcc +export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/x86_64-linux-gnu-gcc +export CC_aarch64_unknown_linux_gnu=/usr/bin/aarch64-linux-gnu-gcc +export CARGO_TARGET_AARCH_64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/aarch64-linux-gnu-gcc + +echo "building '$1'" cargo install sccache --version 0.8.0 --no-default-features --target "$1" printf "\n" @@ -13,6 +24,10 @@ cargo install cargo-audit --version 0.20.0 --target "$1" printf "\n" cargo install cargo-watch --version 8.5.2 --target "$1" printf "\n" +cargo install cargo-dylint --version 3.1.0 --target "$1" +printf "\n" +cargo install dylint-link --version 3.1.0 --target "$1" +printf "\n" # For doing live reload of documentation cargo install penguin-app --version 0.2.6 --target "$1" printf "\n" @@ -24,4 +39,6 @@ cp $CARGO_HOME/bin/diesel /export/$1/ cp $CARGO_HOME/bin/diesel_ext /export/$1/ cp $CARGO_HOME/bin/cargo-audit /export/$1/ cp $CARGO_HOME/bin/cargo-watch /export/$1/ +cp $CARGO_HOME/bin/cargo-dylint /export/$1/ +cp $CARGO_HOME/bin/dylint-link /export/$1/ cp $CARGO_HOME/bin/penguin /export/$1/ diff --git a/scripts/build.sh b/scripts/build.sh index 1fd191e..9206d8e 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -15,7 +15,7 @@ build-arch() { return 1 fi - docker run -i --name "builder-$INSTANCE" imperocom/image-tools /scripts/build-arch.sh "$ARCH" + docker run -i --name "builder-$INSTANCE" imperocom/image-tools /scripts/build-arch.sh "$ARCH" "$SHORT_ARCH" if [ $( docker ps -a | grep "builder-$INSTANCE" | wc -l ) -le 0 ]; then echo "builder-$INSTANCE does not exist" @@ -29,7 +29,7 @@ build-arch() { docker rm -f "builder-$INSTANCE" cd "/tmp/builder-$INSTANCE" - for f in sccache diesel diesel_ext cargo-audit cargo-watch penguin + for f in sccache diesel diesel_ext cargo-audit cargo-watch cargo-dylint dylint-link penguin do echo "Checking $f" test -f "$SHORT_ARCH/$f" diff --git a/scripts/image/install.sh b/scripts/image/install.sh index e85d916..cdec974 100755 --- a/scripts/image/install.sh +++ b/scripts/image/install.sh @@ -1,24 +1,44 @@ #!/bin/bash set -eu +CROSS_ARM_SHORT="arm64" +CROSS_ARM_LONG="aarch64" + +CROSS_X86_SHORT="amd64" +CROSS_X86_LONG="x86_64" + +NATIVE_ARCH="$(uname -m)" + +# Depending whether we are building it on host amd64 or arm64, we need to install +# the cross-compilation tools for the other architecture. +if [ "$NATIVE_ARCH" = "$CROSS_ARM_LONG" ]; then + CROSS_ARCH_SHORT="$CROSS_X86_SHORT" + CROSS_ARCH_LONG="$CROSS_X86_LONG" +else + CROSS_ARCH_SHORT="$CROSS_ARM_SHORT" + CROSS_ARCH_LONG="$CROSS_ARM_LONG" +fi + +echo "Building on $NATIVE_ARCH, also crosscompiling for $CROSS_ARCH_SHORT" + apt-get install -qq \ - crossbuild-essential-arm64 \ - libc6-arm64-cross \ - libc6-dev-arm64-cross + "crossbuild-essential-${CROSS_ARCH_SHORT}" \ + "libc6-${CROSS_ARCH_SHORT}-cross" \ + "libc6-dev-${CROSS_ARCH_SHORT}-cross" # Build libssl OPENSSL_TAG=openssl-3.0.2 git clone https://github.com/openssl/openssl.git --depth 1 --tag "$OPENSSL_TAG" cd "$OPENSSL_TAG" && \ - ./Configure linux-aarch64 --cross-compile-prefix=aarch64-linux-gnu- --prefix=/usr/aarch64-linux-gnu && \ + ./Configure "linux-${CROSS_ARCH_LONG}" "--cross-compile-prefix=${CROSS_ARCH_LONG}-linux-gnu-" "--prefix=/usr/${CROSS_ARCH_LONG}-linux-gnu" && \ make && make install cd .. && rm -rf "$OPENSSL_TAG" # Build libpq git clone https://github.com/postgres/postgres.git --depth 1 --branch REL_14_2 cd postgres && \ - CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ AR=aarch64-linux-gnu-ar RANLIB=aarch64-linux-gnu-ranlib; \ - ./configure --host=aarch64-linux-gnu --prefix=/usr/aarch64-linux-gnu --without-zlib --without-readline && \ + CC="${CROSS_ARCH_LONG}-linux-gnu-gcc" CXX="${CROSS_ARCH_LONG}-linux-gnu-g++" AR="${CROSS_ARCH_LONG}-linux-gnu-ar" RANLIB="${CROSS_ARCH_LONG}-linux-gnu-ranlib"; \ + ./configure "--host=${CROSS_ARCH_LONG}-linux-gnu" "--prefix=/usr/${CROSS_ARCH_LONG}-linux-gnu" --without-zlib --without-readline && \ cd src/interfaces/libpq && make install && \ cd ../../bin/pg_config && make && make install