From 8e121191c0cb46f860b10d552f80efda4e217890 Mon Sep 17 00:00:00 2001 From: Christoph Grabo Date: Sat, 20 Mar 2021 05:45:01 +0100 Subject: [PATCH] Use musl 1.1.24 for 32 bit targets There are issues around time64 and similar types. See: - https://github.com/rust-embedded/cross/issues/478 - https://github.com/rust-lang/libc/issues/1848 --- .github/workflows/Build.yml | 12 +++++++- Dockerfile | 3 +- build.sh | 16 +++++----- config.mak.32 | 59 +++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 config.mak.32 diff --git a/.github/workflows/Build.yml b/.github/workflows/Build.yml index 11ae60c..597e08f 100644 --- a/.github/workflows/Build.yml +++ b/.github/workflows/Build.yml @@ -19,27 +19,35 @@ jobs: - IMAGE_TAG: arm-musleabi TARGET: arm-unknown-linux-musleabi OPENSSL_ARCH: linux-generic32 + RUST_MUSL_MAKE_CONFIG: config.mak.32 - IMAGE_TAG: arm-musleabihf TARGET: arm-unknown-linux-musleabihf + RUST_MUSL_MAKE_CONFIG: config.mak.32 OPENSSL_ARCH: linux-generic32 - IMAGE_TAG: armv5te-musleabi TARGET: armv5te-unknown-linux-musleabi OPENSSL_ARCH: linux-generic32 + RUST_MUSL_MAKE_CONFIG: config.mak.32 - IMAGE_TAG: armv7-musleabi TARGET: armv7-unknown-linux-musleabi OPENSSL_ARCH: linux-generic32 + RUST_MUSL_MAKE_CONFIG: config.mak.32 - IMAGE_TAG: armv7-musleabihf TARGET: armv7-unknown-linux-musleabihf OPENSSL_ARCH: linux-generic32 + RUST_MUSL_MAKE_CONFIG: config.mak.32 - IMAGE_TAG: i586-musl TARGET: i586-unknown-linux-musl OPENSSL_ARCH: linux-elf + RUST_MUSL_MAKE_CONFIG: config.mak.32 - IMAGE_TAG: i686-musl TARGET: i686-unknown-linux-musl OPENSSL_ARCH: linux-elf + RUST_MUSL_MAKE_CONFIG: config.mak.32 - IMAGE_TAG: mips-musl TARGET: mips-unknown-linux-musl OPENSSL_ARCH: linux-mips32 + RUST_MUSL_MAKE_CONFIG: config.mak.32 # - IMAGE_TAG: mips64-muslabi64 # TARGET: mips64-unknown-linux-muslabi64 # OPENSSL_ARCH: linux64-mips64 @@ -49,9 +57,11 @@ jobs: - IMAGE_TAG: mipsel-musl TARGET: mipsel-unknown-linux-musl OPENSSL_ARCH: linux-mips32 + RUST_MUSL_MAKE_CONFIG: config.mak.32 - IMAGE_TAG: x86_64-musl TARGET: x86_64-unknown-linux-musl OPENSSL_ARCH: linux-x86_64 + RUST_MUSL_MAKE_CONFIG: config.mak.32 env: ${{ matrix.env }} steps: - uses: actions/checkout@v2 @@ -61,4 +71,4 @@ jobs: docker run --rm -v "$(pwd)/tests":/home/rust/src messense/rust-musl-cross:$IMAGE_TAG cargo build - name: Push Docker image if: github.ref == 'refs/heads/master' - run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} && docker push messense/rust-musl-cross:$IMAGE_TAG \ No newline at end of file + run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} && docker push messense/rust-musl-cross:$IMAGE_TAG diff --git a/Dockerfile b/Dockerfile index 1706d1c..5cdcb67 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,7 @@ ARG TOOLCHAIN=stable ARG TARGET=x86_64-unknown-linux-musl ARG OPENSSL_ARCH=linux-x86_64 ARG RUST_MUSL_MAKE_VER=0.9.9 +ARG RUST_MUSL_MAKE_CONFIG=config.mak ENV DEBIAN_FRONTEND=noninteractive ENV RUST_MUSL_CROSS_TARGET=$TARGET @@ -31,7 +32,7 @@ RUN apt-get update && \ COPY lets-encrypt-r3-cross-signed.crt /usr/local/share/ca-certificates RUN update-ca-certificates -COPY config.mak /tmp/config.mak +COPY $RUST_MUSL_MAKE_CONFIG /tmp/config.mak RUN cd /tmp && curl -Lsq -o musl-cross-make.zip https://github.com/richfelker/musl-cross-make/archive/v$RUST_MUSL_MAKE_VER.zip && \ unzip -q musl-cross-make.zip && \ rm musl-cross-make.zip && \ diff --git a/build.sh b/build.sh index b1d2fbc..0b11236 100755 --- a/build.sh +++ b/build.sh @@ -1,17 +1,19 @@ #!/bin/bash +set -ex + # x86_64-unknown-linux-musl docker build -t messense/rust-musl-cross:x86_64-musl . # arm-unknown-linux-musleabi -docker build --build-arg TARGET=arm-unknown-linux-musleabi --build-arg OPENSSL_ARCH=linux-generic32 -t messense/rust-musl-cross:arm-musleabi . +docker build --build-arg TARGET=arm-unknown-linux-musleabi --build-arg OPENSSL_ARCH=linux-generic32 --build-arg RUST_MUSL_MAKE_CONFIG=config.mak.32 -t messense/rust-musl-cross:arm-musleabi . # arm-unknown-linux-musleabihf -docker build --build-arg TARGET=arm-unknown-linux-musleabihf --build-arg OPENSSL_ARCH=linux-generic32 -t messense/rust-musl-cross:arm-musleabihf . +docker build --build-arg TARGET=arm-unknown-linux-musleabihf --build-arg OPENSSL_ARCH=linux-generic32 --build-arg RUST_MUSL_MAKE_CONFIG=config.mak.32 -t messense/rust-musl-cross:arm-musleabihf . # armv5te-unknown-linux-musleabi -docker build --build-arg TARGET=armv5te-unknown-linux-musleabi --build-arg OPENSSL_ARCH=linux-generic32 -t messense/rust-musl-cross:arm-musleabi . +docker build --build-arg TARGET=armv5te-unknown-linux-musleabi --build-arg OPENSSL_ARCH=linux-generic32 --build-arg RUST_MUSL_MAKE_CONFIG=config.mak.32 -t messense/rust-musl-cross:armv5te-musleabi . # armv7-unknown-linux-musleabihf -docker build --build-arg TARGET=armv7-unknown-linux-musleabihf --build-arg OPENSSL_ARCH=linux-generic32 -t messense/rust-musl-cross:armv7-musleabihf . +docker build --build-arg TARGET=armv7-unknown-linux-musleabihf --build-arg OPENSSL_ARCH=linux-generic32 --build-arg RUST_MUSL_MAKE_CONFIG=config.mak.32 -t messense/rust-musl-cross:armv7-musleabihf . # i686-unknown-linux-musl -docker build --build-arg TARGET=i686-unknown-linux-musl --build-arg OPENSSL_ARCH=linux-generic32 -t messense/rust-musl-cross:i686-musl . +docker build --build-arg TARGET=i686-unknown-linux-musl --build-arg OPENSSL_ARCH=linux-generic32 --build-arg RUST_MUSL_MAKE_CONFIG=config.mak.32 -t messense/rust-musl-cross:i686-musl . # mips-unknown-linux-musl -docker build --build-arg TARGET=mips-unknown-linux-musl --build-arg OPENSSL_ARCH=linux-mips32 -t messense/rust-musl-cross:mips-musl . +docker build --build-arg TARGET=mips-unknown-linux-musl --build-arg OPENSSL_ARCH=linux-mips32 --build-arg RUST_MUSL_MAKE_CONFIG=config.mak.32 -t messense/rust-musl-cross:mips-musl . # mipsel-unknown-linux-musl -docker build --build-arg TARGET=mipsel-unknown-linux-musl --build-arg OPENSSL_ARCH=linux-mips32 -t messense/rust-musl-cross:mipsel-musl . +docker build --build-arg TARGET=mipsel-unknown-linux-musl --build-arg OPENSSL_ARCH=linux-mips32 --build-arg RUST_MUSL_MAKE_CONFIG=config.mak.32 -t messense/rust-musl-cross:mipsel-musl . diff --git a/config.mak.32 b/config.mak.32 new file mode 100644 index 0000000..4b4f0f7 --- /dev/null +++ b/config.mak.32 @@ -0,0 +1,59 @@ +# By default, cross compilers are installed to ./output under the top-level +# musl-cross-make directory and can later be moved wherever you want them. +# To install directly to a specific location, set it here. Multiple targets +# can safely be installed in the same location. Some examples: + +OUTPUT = /usr/local/musl + +# By default, latest supported release versions of musl and the toolchain +# components are used. You can override those here, but the version selected +# must be supported (under hashes/ and patches/) to work. For musl, you +# can use "git-refname" (e.g. git-master) instead of a release. Setting a +# blank version for gmp, mpc, mpfr and isl will suppress download and +# in-tree build of these libraries and instead depend on pre-installed +# libraries when available (isl is optional and not set by default). +# Setting a blank version for linux will suppress installation of kernel +# headers, which are not needed unless compiling programs that use them. + +# BINUTILS_VER = +# GCC_VER = + +# https://github.com/rust-embedded/cross/issues/478 +# https://github.com/rust-lang/libc/issues/1848 +MUSL_VER = 1.1.24 + +# GMP_VER = +# MPC_VER = +# MPFR_VER = +# ISL_VER = +# LINUX_VER = + +# By default source archives are downloaded with wget. curl is also an option. + +# DL_CMD = wget -c -O +DL_CMD = curl -C - -L -o + +# Something like the following can be used to produce a static-linked +# toolchain that's deployable to any system with matching arch, using +# an existing musl-targeted cross compiler. This only # works if the +# system you build on can natively (or via binfmt_misc and # qemu) run +# binaries produced by the existing toolchain (in this example, i486). + +# COMMON_CONFIG += CC="i486-linux-musl-gcc -static --static" CXX="i486-linux-musl-g++ -static --static" + +# Recommended options for smaller build for deploying binaries: + +COMMON_CONFIG += CFLAGS="-g0 -Os" CXXFLAGS="-g0 -Os" LDFLAGS="-s" + +# Recommended options for faster/simpler build: + +COMMON_CONFIG += --disable-nls +GCC_CONFIG += --enable-languages=c,c++ +GCC_CONFIG += --disable-libquadmath --disable-decimal-float +GCC_CONFIG += --disable-multilib + +# You can keep the local build path out of your toolchain binaries and +# target libraries with the following, but then gdb needs to be told +# where to look for source files. + +COMMON_CONFIG += --with-debug-prefix-map=$(CURDIR)=