Skip to content

Commit

Permalink
Merge pull request #34 from asaaki/ubuntu-20.04
Browse files Browse the repository at this point in the history
Upgrade base to ubuntu 20.04
  • Loading branch information
messense committed Mar 22, 2021
2 parents 81cb02c + 50c3616 commit d4bcc80
Show file tree
Hide file tree
Showing 6 changed files with 282 additions and 263 deletions.
24 changes: 21 additions & 3 deletions .github/workflows/Build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,30 +16,39 @@ jobs:
- IMAGE_TAG: aarch64-musl
TARGET: aarch64-unknown-linux-musl
OPENSSL_ARCH: linux-aarch64
RUST_MUSL_MAKE_CONFIG: config.mak
- 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
OPENSSL_ARCH: linux-generic32
RUST_MUSL_MAKE_CONFIG: config.mak.32
- 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
Expand All @@ -49,16 +58,25 @@ 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
env: ${{ matrix.env }}
steps:
- uses: actions/checkout@v2
- name: Build Docker image
run: |
docker build --build-arg TARGET="$TARGET" --build-arg OPENSSL_ARCH="$OPENSSL_ARCH" -t messense/rust-musl-cross:$IMAGE_TAG .
docker run --rm -v "$(pwd)/tests":/home/rust/src messense/rust-musl-cross:$IMAGE_TAG cargo build
docker build \
--build-arg TARGET="$TARGET" \
--build-arg OPENSSL_ARCH="$OPENSSL_ARCH" \
--build-arg RUST_MUSL_MAKE_CONFIG="$RUST_MUSL_MAKE_CONFIG" \
-t messense/rust-musl-cross:$IMAGE_TAG .
docker run --rm \
-e CFLAGS_armv7_unknown_linux_musleabihf='-mfpu=vfpv3-d16' \
-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
run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} && docker push messense/rust-musl-cross:$IMAGE_TAG
41 changes: 24 additions & 17 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
FROM ubuntu:16.04
FROM ubuntu:20.04

# The Rust toolchain to use when building our image
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

# Make sure we have basic dev tools for building C libraries. Our goal
Expand All @@ -26,15 +29,14 @@ RUN apt-get update && \
apt-get clean && rm -rf /var/lib/apt/lists/*

# Install cross-signed Let's Encrypt R3 CA certificate
ADD lets-encrypt-r3-cross-signed.crt /usr/local/share/ca-certificates
COPY lets-encrypt-r3-cross-signed.crt /usr/local/share/ca-certificates
RUN update-ca-certificates

ADD config.mak /tmp/config.mak
RUN cd /tmp && \
curl -Lsq -o musl-cross-make.zip https://github.com/richfelker/musl-cross-make/archive/v0.9.8.zip && \
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 && \
mv musl-cross-make-0.9.8 musl-cross-make && \
mv musl-cross-make-$RUST_MUSL_MAKE_VER musl-cross-make && \
cp /tmp/config.mak /tmp/musl-cross-make/config.mak && \
cd /tmp/musl-cross-make && \
TARGET=$TARGET make install -j 4 > /tmp/musl-cross-make.log && \
Expand All @@ -49,7 +51,8 @@ RUN mkdir -p /home/rust/libs /home/rust/src
ENV PATH=/root/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV TARGET_CC=$TARGET-gcc
ENV TARGET_CXX=$TARGET-g++
ENV TARGET_C_INCLUDE_PATH=/usr/local/musl/$TARGET/include/
ENV TARGET_HOME=/usr/local/musl/$TARGET
ENV TARGET_C_INCLUDE_PATH=$TARGET_HOME/include/

# Install our Rust toolchain and the `musl` target. We patch the
# command-line we pass to the installer so that it won't attempt to
Expand Down Expand Up @@ -79,25 +82,29 @@ RUN export CC=$TARGET_CC && \
echo "$CHECKSUM zlib-$VERS.tar.gz" > checksums.txt && \
sha256sum -c checksums.txt && \
tar xzf zlib-$VERS.tar.gz && cd zlib-$VERS && \
./configure --static --archs="-fPIC" --prefix=/usr/local/musl/$TARGET && \
./configure --static --archs="-fPIC" --prefix=$TARGET_HOME && \
make && sudo make install -j 4 && \
cd .. && rm -rf zlib-$VERS.tar.gz zlib-$VERS checksums.txt && \
cd .. && rm -rf zlib-$VERS.tar.gz zlib-$VERS checksums.txt

RUN export CC=$TARGET_CC && \
export C_INCLUDE_PATH=$TARGET_C_INCLUDE_PATH && \
export LD=$TARGET-ld && \
echo "Building OpenSSL" && \
VERS=1.0.2q && \
CHECKSUM=5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684 && \
VERS=1.0.2u && \
CHECKSUM=ecd0c6ffb493dd06707d38b14bb4d8c2288bb7033735606569d8f90f89669d16 && \
curl -sqO https://www.openssl.org/source/openssl-$VERS.tar.gz && \
echo "$CHECKSUM openssl-$VERS.tar.gz" > checksums.txt && \
sha256sum -c checksums.txt && \
tar xzf openssl-$VERS.tar.gz && cd openssl-$VERS && \
./Configure $OPENSSL_ARCH -fPIC --prefix=/usr/local/musl/$TARGET && \
./Configure $OPENSSL_ARCH -fPIC --prefix=$TARGET_HOME && \
make depend && \
make && sudo make install -j 4 && \
make && sudo make install && \
cd .. && rm -rf openssl-$VERS.tar.gz openssl-$VERS checksums.txt

ENV OPENSSL_DIR=/usr/local/musl/$TARGET/ \
OPENSSL_INCLUDE_DIR=/usr/local/musl/$TARGET/include/ \
DEP_OPENSSL_INCLUDE=/usr/local/musl/$TARGET/include/ \
OPENSSL_LIB_DIR=/usr/local/musl/$TARGET/lib/ \
ENV OPENSSL_DIR=$TARGET_HOME/ \
OPENSSL_INCLUDE_DIR=$TARGET_HOME/include/ \
DEP_OPENSSL_INCLUDE=$TARGET_HOME/include/ \
OPENSSL_LIB_DIR=$TARGET_HOME/lib/ \
OPENSSL_STATIC=1

# Remove docs and more stuff not needed in this images to make them smaller
Expand Down
16 changes: 9 additions & 7 deletions build.sh
Original file line number Diff line number Diff line change
@@ -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 .
7 changes: 3 additions & 4 deletions config.mak
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@ OUTPUT = /usr/local/musl
# Setting a blank version for linux will suppress installation of kernel
# headers, which are not needed unless compiling programs that use them.

# BINUTILS_VER = 2.25.1
GCC_VER = 7.2.0

# MUSL_VER = 1.1.19
# BINUTILS_VER =
# GCC_VER =
# MUSL_VER =
# GMP_VER =
# MPC_VER =
# MPFR_VER =
Expand Down
60 changes: 60 additions & 0 deletions config.mak.32
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# 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)=

0 comments on commit d4bcc80

Please sign in to comment.