diff --git a/.github/workflows/build-clang-toolchain.yml b/.github/workflows/build-clang-toolchain.yml new file mode 100644 index 0000000..39a21ad --- /dev/null +++ b/.github/workflows/build-clang-toolchain.yml @@ -0,0 +1,38 @@ +name: Build Clang + +on: + push: + branches: [ master ] + #pull_request: + +jobs: + + build-clang-musl-toolchain: + + runs-on: self-hosted + container: generalbeck/docker-cross-rust:alpine-sccache + steps: + - name: Checkout sources + uses: actions/checkout@v2 + - name: Build Clang MUSL toolchain + run: | + cd dockerfiles + ls -a + sh sync.sh release/9.x + sh configure.sh + sh build.sh + sh install.sh + ls -a + shell: sh + - name: Upload artifact's + uses: actions/upload-artifact@v1 + with: + name: x86_64-unknown-linux-musl.zip + path: dockerfiles/artifact/ + - name: Upload release + uses: yakuhzi/action-release@v1 + with: + file: dockerfiles/artifact/x86_64-unknown-linux-musl.zip + #changelog: /path/to/CHANGELOG.txt + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/dockerimage.yml b/.github/workflows/dockerimage.yml index 779dcc0..af23b83 100644 --- a/.github/workflows/dockerimage.yml +++ b/.github/workflows/dockerimage.yml @@ -4,10 +4,10 @@ on: push: branches: [ master ] pull_request: - + branches: [ master ] jobs: - build: + build-x86_64-unknown-linux-musl: runs-on: ubuntu-latest @@ -15,10 +15,10 @@ jobs: - name: Checkout sources uses: actions/checkout@v2 - name: Build the Docker image - run: docker build . --file dockerfiles/Dockerfile.x86_64-unknown-linux-musl --tag generalbeck/docker-cross-rust:x86_64-unknown-linux-musl + run: docker build . --file dockerfiles/Dockerfile.x86_64-unknown-linux-musl --tag docker.pkg.github.com/general-beck/docker-cross-rust/docker-cross-rust:x86_64-unknown-linux-musl + - name: Docker login + run: docker login docker.pkg.github.com -u General-Beck -p ${{ secrets.GITHUB_TOKEN }} - name: Push the Docker image - run: | - docker login -u ${{ secrets.REGISTRY_USERNAME }} -p ${{ secrets.REGISTRY_PASSWORD }} - docker push generalbeck/docker-cross-rust:x86_64-unknown-linux-musl + run: docker push docker.pkg.github.com/general-beck/docker-cross-rust/docker-cross-rust:x86_64-unknown-linux-musl - name: Docker logout run: docker logout diff --git a/dockerfiles/Dockerfile.aarch64-unknown-linux-musl b/dockerfiles/Dockerfile.aarch64-unknown-linux-musl new file mode 100644 index 0000000..9efe117 --- /dev/null +++ b/dockerfiles/Dockerfile.aarch64-unknown-linux-musl @@ -0,0 +1,126 @@ +FROM ubuntu:focal + +# metadata +ARG TARGET=aarch64-unknown-linux-musl +ARG OPENSSL_ARCH=linux-aarch64 +ARG MUSL_TARGET=aarch64-linux-musl + + +ENV RUST_MUSL_CROSS_TARGET=$TARGET \ + TARGET_HOST=$TARGET +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /builds + +# install tools and dependencies +RUN set -eux; \ + apt update; \ + apt install -qq -y --no-install-recommends \ + autoconf automake binutils ca-certificates cmake file gcc g++ git jq \ + libc6-dev libtool m4 make pkg-config curl libssl-dev zlib1g-dev mc \ + qemu binfmt-support qemu-user-static; + +# install musl + +RUN curl -sLO https://musl.cc/$MUSL_TARGET-cross.tgz&& \ + tar xzf $MUSL_TARGET-cross.tgz&& \ + cd $MUSL_TARGET-cross&& \ + cp -fR * ../../usr/local/&& \ + cd ..&& rm -rf $MUSL_TARGET-cross* + +ENV CC=$MUSL_TARGET-gcc \ + CXX=$MUSL_TARGET-g++ \ + CC_aarch64_unknown_linux_musl=$MUSL_TARGET-gcc \ + CXX_aarch64_unknown_linux_musl=$MUSL_TARGET-g++\ + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=$MUSL_TARGET-gcc \ + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUNNER=qemu-user-static \ + TARGET_CC=$MUSL_TARGET-gcc\ + TARGET_CXX=$MUSL_TARGET-g++\ + TARGET_AR=$MUSL_TARGET-ar\ + TARGET_C_INCLUDE_PATH=/usr/local/$MUSL_TARGET/include/\ + CXX_LIB_PATH_aarch64_unknown_linux_musl=/usr/local/$MUSL_TARGET/lib/ \ + C_LIB_PATH_aarch64_unknown_linux_musl=/usr/local/$MUSL_TARGET/lib/\ + CXXSTDLIB=stdc++ \ + TARGET_CXXSTDLIB=stdc++ \ + CXXSTDLIB_aarch64_unknown_linux_musl=stdc++ \ + LDFLAGS_aarch64_unknown_linux_musl=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$MUSL_TARGET/lib" \ + LDFLAGS=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$MUSL_TARGET/lib" \ + CFLAGS_aarch64_unknown_linux_musl=" -fPIC -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CXXFLAGS_aarch64_unknown_linux_musl=" -fPIC -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CFLAGS=" -fPIC -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CXXFLAGS=" -fPIC -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + LD_LIBRARY_PATH=/usr/local/lib:/usr/local/$MUSL_TARGET/lib:$LD_LIBRARY_PATH \ + PKG_CONFIG_ALLOW_CROSS=1 \ + PKG_CONFIG_ALL_STATIC=1 \ + OPENSSL_STATIC=1 \ + LIBZ_SYS_STATIC=1 \ + PATH=/usr/local/$MUSL_TARGET/bin:$PATH + +# ZLib & OpenSSL +RUN set -eux; \ + echo "Building zlib" && \ + VERS=1.2.11 && \ + curl -sLO https://zlib.net/zlib-$VERS.tar.gz && \ + tar xzf zlib-$VERS.tar.gz && cd zlib-$VERS && \ + $CC -v&&\ + CHOST=$TARGET CC=$TARGET_CC ./configure --static --prefix=/usr/local/$MUSL_TARGET && \ + make --silent && make --silent install && \ + cd .. && rm -rf zlib-$VERS.tar.gz zlib-$VERS checksums.txt +RUN set -eux; \ + echo "Building OpenSSL" && \ + VERS=1.1.1d && \ + curl -sLO https://www.openssl.org/source/openssl-$VERS.tar.gz && \ + tar xzf openssl-$VERS.tar.gz && cd openssl-$VERS && \ + ./Configure $OPENSSL_ARCH no-async no-afalgeng no-shared --static --prefix=/usr/local/$MUSL_TARGET && \ + make depend && \ + make --silent && make --silent install && \ + cd .. && rm -rf openssl-$VERS.tar.gz openssl-$VERS checksums.txt /usr/local/$MUSL_TARGET/share + +#Install QEMU +RUN curl -s https://api.github.com/repos/multiarch/qemu-user-static/releases/latest \ + | grep 'browser_download_url.*qemu-aarch64_be-static.tar.gz"' \ + | cut -d : -f 2,3 | xargs -n 1 curl -sSL | tar -xzC /usr/local/bin/ + +# Allows qemu run dynamic linked binaries +RUN ln -sf \ + /usr/local/$MUSL_TARGET/lib/libc.so \ + /usr/local/$MUSL_TARGET/lib/ld-musl-aarch64.so.1 +ENV QEMU_LD_PREFIX=/usr/local/$MUSL_TARGET + +# download rustup +ADD "https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init" rustup-init + +# rustup directory +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH + +RUN chmod +x rustup-init; \ + ./rustup-init -y --no-modify-path --default-toolchain stable; \ + rm rustup-init; \ + chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ + rustup install nightly; \ +# install x86_64_unknown_linux_musl toolchain + rustup target add $TARGET; \ + rustup target add $TARGET --toolchain nightly; \ + SCCACHE_LATEST_URL=`curl -sL https://api.github.com/repos/mozilla/sccache/releases/latest | jq -r '.assets[2].browser_download_url'`; \ + curl -L $SCCACHE_LATEST_URL | tar zxf - --overwrite --strip-components=1 -C /usr/local/cargo/bin ; \ + rm -rf /usr/local/rustup/toolchains/*/share; \ +# apt clean up + apt autoremove -y; \ + apt clean; \ + rm -rf /var/lib/apt/lists/*; + +COPY dockerfiles/config/$TARGET.config /root/.cargo/config + +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/ + +#Prepare sccache ENV +RUN mkdir $HOME/sccache +ENV RUST_BACKTRACE=full\ + RUST_TEST_THREADS=1 \ + RUSTC_WRAPPER=sccache \ + SCCACHE_DIR=$HOME/sccache \ + SCCACHE_CACHE_SIZE=1G diff --git a/dockerfiles/Dockerfile.armv7-unknown-linux-musleabihf b/dockerfiles/Dockerfile.armv7-unknown-linux-musleabihf new file mode 100644 index 0000000..1bd60d3 --- /dev/null +++ b/dockerfiles/Dockerfile.armv7-unknown-linux-musleabihf @@ -0,0 +1,125 @@ +FROM ubuntu:focal + +# metadata +ARG TARGET=armv7-unknown-linux-musleabihf +ARG OPENSSL_ARCH=linux-armv4 +ARG MUSL_TARGET=armeb-linux-musleabihf + +ENV RUST_MUSL_CROSS_TARGET=$TARGET \ + TARGET_HOST=$TARGET +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /builds + +# install tools and dependencies +RUN set -eux; \ + apt update; \ + apt install -qq -y --no-install-recommends \ + autoconf automake binutils ca-certificates cmake file gcc g++ git jq \ + libc6-dev libtool m4 make pkg-config curl libssl-dev zlib1g-dev mc \ + qemu binfmt-support qemu-user-static; + +# install musl + + +RUN curl -sLO https://musl.cc/$MUSL_TARGET-cross.tgz&& \ + tar xzf $MUSL_TARGET-cross.tgz&& \ + cd $MUSL_TARGET-cross&& \ + cp -fR * ../../usr/local/&& \ + cd ..&& rm -rf $MUSL_TARGET-cross* + +ENV CC=$MUSL_TARGET-gcc \ + CXX=$MUSL_TARGET-g++ \ + CC_armv7_unknown_linux_musleabihf=$MUSL_TARGET-gcc \ + CXX_armv7_unknown_linux_musleabihf=$MUSL_TARGET-g++\ + CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER=$MUSL_TARGET-gcc \ + CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUNNER=qemu-user-static \ + TARGET_CC=$MUSL_TARGET-gcc\ + TARGET_CXX=$MUSL_TARGET-g++\ + TARGET_AR=$MUSL_TARGET-ar\ + TARGET_C_INCLUDE_PATH=/usr/local/$MUSL_TARGET/include/\ + CXX_LIB_PATH_armv7_unknown_linux_musleabihf=/usr/local/$MUSL_TARGET/lib/ \ + C_LIB_PATH_armv7_unknown_linux_musleabihf=/usr/local/$MUSL_TARGET/lib/\ + CXXSTDLIB=stdc++ \ + TARGET_CXXSTDLIB=stdc++ \ + CXXSTDLIB_armv7_unknown_linux_musleabihf=stdc++ \ + LDFLAGS_armv7_unknown_linux_musleabihf=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$MUSL_TARGET/lib" \ + LDFLAGS=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$MUSL_TARGET/lib" \ + CFLAGS_armv7_unknown_linux_musleabihf=" -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CXXFLAGS_armv7_unknown_linux_musleabihf=" -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CFLAGS=" -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CXXFLAGS=" -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + LD_LIBRARY_PATH=/usr/local/lib:/usr/local/$MUSL_TARGET/lib:$LD_LIBRARY_PATH \ + PKG_CONFIG_ALLOW_CROSS=1 \ + PKG_CONFIG_ALL_STATIC=1 \ + OPENSSL_STATIC=1 \ + LIBZ_SYS_STATIC=1 \ + PATH=/usr/local/$MUSL_TARGET/bin:$PATH + +# ZLib & OpenSSL +RUN set -eux; \ + echo "Building zlib" && \ + VERS=1.2.11 && \ + curl -sLO https://zlib.net/zlib-$VERS.tar.gz && \ + tar xzf zlib-$VERS.tar.gz && cd zlib-$VERS && \ + $CC -v&&\ + CHOST=$TARGET CC=$TARGET_CC ./configure --static --prefix=/usr/local/$MUSL_TARGET && \ + make --silent && make --silent install && \ + cd .. && rm -rf zlib-$VERS.tar.gz zlib-$VERS checksums.txt +RUN set -eux; \ + echo "Building OpenSSL" && \ + VERS=1.1.1d && \ + curl -sLO https://www.openssl.org/source/openssl-$VERS.tar.gz && \ + tar xzf openssl-$VERS.tar.gz && cd openssl-$VERS && \ + ./Configure $OPENSSL_ARCH no-async no-afalgeng no-shared --static --prefix=/usr/local/$MUSL_TARGET && \ + make depend && \ + make --silent && make --silent install && \ + cd .. && rm -rf openssl-$VERS.tar.gz openssl-$VERS checksums.txt /usr/local/$MUSL_TARGET/share + +#Install QEMU +RUN curl -s https://api.github.com/repos/multiarch/qemu-user-static/releases/latest \ + | grep 'browser_download_url.*x86_64_qemu-armeb-static.tar.gz"' \ + | cut -d : -f 2,3 | xargs -n 1 curl -sSL | tar -xzC /usr/local/bin/ + +# Allows qemu run dynamic linked binaries +RUN ln -sf \ + /usr/local/$MUSL_TARGET/lib/libc.so \ + /usr/local/$MUSL_TARGET/lib/ld-musl-arm.so.1 +ENV QEMU_LD_PREFIX=/usr/local/$MUSL_TARGET + +# download rustup +ADD "https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init" rustup-init + +# rustup directory +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH + +RUN chmod +x rustup-init; \ + ./rustup-init -y --no-modify-path --default-toolchain stable; \ + rm rustup-init; \ + chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ + rustup install nightly; \ +# install x86_64_unknown_linux_musl toolchain + rustup target add $TARGET; \ + rustup target add $TARGET --toolchain nightly; \ + SCCACHE_LATEST_URL=`curl -sL https://api.github.com/repos/mozilla/sccache/releases/latest | jq -r '.assets[2].browser_download_url'`; \ + curl -L $SCCACHE_LATEST_URL | tar zxf - --overwrite --strip-components=1 -C /usr/local/cargo/bin ; \ + rm -rf /usr/local/rustup/toolchains/*/share; \ +# apt clean up + apt autoremove -y; \ + apt clean; \ + rm -rf /var/lib/apt/lists/*; + +COPY dockerfiles/config/$TARGET.config /root/.cargo/config +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/ + +#Prepare sccache ENV +RUN mkdir $HOME/sccache +ENV RUST_BACKTRACE=full \ + RUST_TEST_THREADS=1 \ + RUSTC_WRAPPER=sccache \ + SCCACHE_DIR=$HOME/sccache \ + SCCACHE_CACHE_SIZE=1G diff --git a/dockerfiles/Dockerfile.clang b/dockerfiles/Dockerfile.clang new file mode 100644 index 0000000..b699d45 --- /dev/null +++ b/dockerfiles/Dockerfile.clang @@ -0,0 +1,24 @@ +FROM alpine:edge + +RUN apk add --no-cache \ + clang-dev \ + clang-static \ + cmake \ + g++ \ + git \ + libexecinfo-dev \ + linux-headers \ + make \ + ninja \ + patch \ + python \ + curl \ + jq \ + mc + + +RUN SCCACHE_LATEST_URL=`curl -sL https://api.github.com/repos/mozilla/sccache/releases/latest | jq -r '.assets[2].browser_download_url'`; \ + curl -L $SCCACHE_LATEST_URL | tar zxf - --overwrite --strip-components=1 -C /usr/bin ;\ + sccache --version +ENV SCCACHE_REDIS=redis://172.17.0.1/0 \ + SCCACHE_IDLE_TIMEOUT=0 diff --git a/dockerfiles/Dockerfile.x86_64-unknown-linux-musl b/dockerfiles/Dockerfile.x86_64-unknown-linux-musl index 50dbbe3..d657933 100644 --- a/dockerfiles/Dockerfile.x86_64-unknown-linux-musl +++ b/dockerfiles/Dockerfile.x86_64-unknown-linux-musl @@ -1,121 +1,107 @@ FROM ubuntu:focal # metadata -ARG TARGET=x86_64-linux-musl +ARG TARGET=x86_64-unknown-linux-musl ARG OPENSSL_ARCH=linux-x86_64 +ARG MUSL_TARGET=x86_64-linux-musl -ENV RUST_MUSL_CROSS_TARGET=$TARGET - +ENV RUST_MUSL_CROSS_TARGET=$TARGET \ + TARGET_HOST=$TARGET +ENV DEBIAN_FRONTEND=noninteractive WORKDIR /builds -# rustup directory -ENV RUSTUP_HOME=/usr/local/rustup \ - CARGO_HOME=/usr/local/cargo \ - PATH=/usr/local/cargo/bin:$PATH - # install tools and dependencies RUN set -eux; \ - #sed 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch-=amd64,i386] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list > /etc/apt/sources.list.d/ports.list \ - #sed -i 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch=amd64,i386] http:\/\/\1.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list \ apt update; \ - apt install -y --no-install-recommends \ - autoconf automake binutils ca-certificates cmake file gcc g++ git jq libc-dev libc-dev zlib1g-dev \ - libtool m4 make pkg-config curl libssl-dev; + apt install -qq -y --no-install-recommends \ + autoconf automake binutils ca-certificates cmake file gcc g++ git jq \ + libc6-dev libtool m4 make pkg-config curl libssl-dev zlib1g-dev mc; # install musl -RUN curl -sLO https://musl.cc/x86_64-linux-musl-cross.tgz&& \ - tar xzf x86_64-linux-musl-cross.tgz&& \ - cd x86_64-linux-musl-cross&& \ +RUN curl -sLO https://musl.cc/$MUSL_TARGET-cross.tgz&& \ + tar xzf $MUSL_TARGET-cross.tgz&& \ + cd $MUSL_TARGET-cross&& \ cp -fR * ../../usr/local/&& \ - cd ..&& rm -rf x86_64-linux-musl-cross* + cd ..&& rm -rf $MUSL_TARGET-cross* + -ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=$TARGET-gcc \ - CC=$TARGET-gcc \ - CXX=$TARGET-g++ \ - CC_x86_64-unknown-linux-gnu=$TARGET-gcc \ - CXX_x86_64-unknown-linux-gnu=$TARGET-g++ \ - CC_x86_64_unknown_linux_musl=$TARGET-gcc \ - CXX_x86_64_unknown_linux_musl=$TARGET-g++\ - TARGET_CC=$TARGET-gcc\ - TARGET_CXX=$TARGET-g++\ - TARGET_AR=$TARGET-ar\ - TARGET_C_INCLUDE_PATH=/usr/local/$TARGET/include/\ - CXX_LIB_PATH_x86_64_unknown_linux_musl=/usr/local/$TARGET/lib/ \ - C_LIB_PATH_x86_64_unknown_linux_musl=/usr/local/$TARGET/lib/\ +ENV CC=$MUSL_TARGET-gcc \ + CXX=$MUSL_TARGET-g++ \ + CC_x86_64_unknown_linux_musl=$MUSL_TARGET-gcc \ + CXX_x86_64_unknown_linux_musl=$MUSL_TARGET-g++\ + CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=$MUSL_TARGET-gcc \ + TARGET_CC=$MUSL_TARGET-gcc\ + TARGET_CXX=$MUSL_TARGET-g++\ + TARGET_AR=$MUSL_TARGET-ar\ + TARGET_C_INCLUDE_PATH=/usr/local/$MUSL_TARGET/include/\ + CXX_LIB_PATH_x86_64_unknown_linux_musl=/usr/local/$MUSL_TARGET/lib/ \ + C_LIB_PATH_x86_64_unknown_linux_musl=/usr/local/$MUSL_TARGET/lib/\ CXXSTDLIB=stdc++ \ TARGET_CXXSTDLIB=stdc++ \ CXXSTDLIB_x86_64_unknown_linux_musl=stdc++ \ - PATH=/usr/local/x86_64-unknown-linux-musl/bin:$PATH \ - LDFLAGS_x86_64_unknown_linux_gnu=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$TARGET/lib" \ - LDFLAGS_x86_64_unknown_linux_musl=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$TARGET/lib" \ - LDFLAGS=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$TARGET/lib" \ - CFLAGS_x86_64_unknown_linux_gnu=" -fPIC -I/usr/local/include -I/usr/local/$TARGET/include" \ - CXXFLAGS_x86_64_unknown_linux_gnu=" -fPIC -I/usr/local/include -I/usr/local/$TARGET/include" \ - CFLAGS_x86_64_unknown_linux_musl=" -fPIC -I/usr/local/include -I/usr/local/$TARGET/include" \ - CXXFLAGS_x86_64_unknown_linux_musl=" -fPIC -I/usr/local/include -I/usr/local/$TARGET/include" \ - CFLAGS=" -fPIC -I/usr/local/include -I/usr/local/$TARGET/include" \ - CXXFLAGS=" -fPIC -I/usr/local/include -I/usr/local/$TARGET/include" \ - LIBZ_SYS_STATIC=1 \ - LD_LIBRARY_PATH=/usr/local/lib:/usr/local/$TARGET/lib:$LD_LIBRARY_PATH \ + LDFLAGS_x86_64_unknown_linux_musl=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$MUSL_TARGET/lib" \ + LDFLAGS=" -static -static-libstdc++ -static-libgcc -L/usr/local/lib -L/usr/local/$MUSL_TARGET/lib" \ + CFLAGS_x86_64_unknown_linux_musl=" -fPIC -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CXXFLAGS_x86_64_unknown_linux_musl=" -fPIC -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CFLAGS=" -fPIC -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + CXXFLAGS=" -fPIC -I/usr/local/include -I/usr/local/$MUSL_TARGET/include" \ + LD_LIBRARY_PATH=/usr/local/lib:/usr/local/$MUSL_TARGET/lib:$LD_LIBRARY_PATH \ PKG_CONFIG_ALLOW_CROSS=1 \ PKG_CONFIG_ALL_STATIC=1 \ - OPENSSL_STATIC=1 - -# Set up a prefix for musl build libraries, make the linker's job of finding them easier - -RUN echo "/usr/local/lib" >> /etc/ld-musl-x86_64.path && \ - echo "/usr/local/x86_64-linux-musl/lib" >> /etc/ld-musl-x86_64.path && \ - ln -s /usr/include/x86_64-linux-gnu/asm /usr/local/x86_64-linux-musl/include/asm && \ - ln -s /usr/include/asm-generic /usr/local/x86_64-linux-musl/include/asm-generic && \ - ln -s /usr/include/ /usr/local/x86_64-linux-musl/include + OPENSSL_STATIC=1 \ + LIBZ_SYS_STATIC=1 \ + PATH=/usr/local/$MUSL_TARGET/b78.46.21.213in:$PATH -RUN mkdir -p /root/.cargo&&echo "[build]\ntarget = \"$TARGET\"\n\n[target.$TARGET]\nlinker = \"$TARGET-gcc\"\n" > /root/.cargo/config -# OpenSSL -RUN export CC=$TARGET_CC && \ - export C_INCLUDE_PATH=$TARGET_C_INCLUDE_PATH && \ - echo "Building zlib" && \ +# ZLib & OpenSSL +RUN echo "Building zlib" && \ VERS=1.2.11 && \ curl -sLO https://zlib.net/zlib-$VERS.tar.gz && \ tar xzf zlib-$VERS.tar.gz && cd zlib-$VERS && \ - ./configure --static --archs="-fPIC" --prefix=/usr/local/$TARGET && \ - make && make install && \ - cd .. && rm -rf zlib-$VERS.tar.gz zlib-$VERS checksums.txt && \ - echo "Building OpenSSL" && \ + $CC -v&&\ + CHOST=$TARGET CC=$TARGET_CC ./configure --static --prefix=/usr/local/$MUSL_TARGET && \ + make --silent && make --silent install && \ + cd .. && rm -rf zlib-$VERS.tar.gz zlib-$VERS checksums.txt +RUN echo "Building OpenSSL" && \ VERS=1.1.1d && \ curl -sLO https://www.openssl.org/source/openssl-$VERS.tar.gz && \ tar xzf openssl-$VERS.tar.gz && cd openssl-$VERS && \ - ./Configure $OPENSSL_ARCH no-async no-afalgeng no-shared no-zlib --static -fPIC --prefix=/usr/local/$TARGET && \ + ./Configure $OPENSSL_ARCH no-async no-afalgeng no-shared --static --prefix=/usr/local/$MUSL_TARGET && \ make depend && \ - make && make install && \ - cd .. && rm -rf openssl-$VERS.tar.gz openssl-$VERS checksums.txt /usr/local/$TARGET/share + make --silent && make --silent install && \ + cd .. && rm -rf openssl-$VERS.tar.gz openssl-$VERS checksums.txt /usr/local/$MUSL_TARGET/share # download rustup ADD "https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init" rustup-init +# rustup directory +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH + RUN chmod +x rustup-init; \ ./rustup-init -y --no-modify-path --default-toolchain stable; \ rm rustup-init; \ chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ rustup install nightly; \ # install x86_64_unknown_linux_musl toolchain - rustup target add x86_64_unknown_linux_musl; \ - rustup target add x86_64_unknown_linux_musl --toolchain nightly; \ + rustup target add $TARGET; \ + rustup target add $TARGET --toolchain nightly; \ SCCACHE_LATEST_URL=`curl -sL https://api.github.com/repos/mozilla/sccache/releases/latest | jq -r '.assets[2].browser_download_url'`; \ curl -L $SCCACHE_LATEST_URL | tar zxf - --overwrite --strip-components=1 -C /usr/local/cargo/bin ; \ rm -rf /usr/local/rustup/toolchains/*/share; \ - rm -rf $CARGO_HOME/registry/*; \ # apt clean up apt autoremove -y; \ apt clean; \ rm -rf /var/lib/apt/lists/*; -#COPY config/config /root/.cargo/$TARGET-config -ENV OPENSSL_DIR=/usr/local/musl/$TARGET/ \ - OPENSSL_INCLUDE_DIR=/usr/local/$TARGET/include/ \ - DEP_OPENSSL_INCLUDE=/usr/local/$TARGET/include/ \ - OPENSSL_LIB_DIR=/usr/local/$TARGET/lib/ \ - PORTABLE=1 +COPY dockerfiles/config/$TARGET.config /root/.cargo/config +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/ + +#Prepare sccache ENV RUN mkdir $HOME/sccache ENV RUST_BACKTRACE=full\ RUSTC_WRAPPER=sccache \ diff --git a/dockerfiles/build.sh b/dockerfiles/build.sh new file mode 100755 index 0000000..929e5a1 --- /dev/null +++ b/dockerfiles/build.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +TOOLS='clang lld' +PROJECTS='libunwind compiler-rt libcxx libcxxabi' +ARCH="$(uname -m)" +TARGETS='X86;AArch64;ARM;WebAssembly' +ROOT=$(dirname $(readlink -f "$0")) + +PATH=/"$ARCH"-unknown-linux-musl/bin:"$PATH" +LD_LIBRARY_PATH=/"$ARCH"-unknown-linux-musl/lib + +if [ ! -d $ROOT/src ]; then + echo no sources found, run sync + exit 1 +fi + +if [ ! -d $ROOT/build ]; then + mkdir $ROOT/build || $(echo 'failed to create directory' && exit 1) +fi + +cd $ROOT/build || $(echo 'failed to change directory' && exit 1) + +for TOOL in $TOOLS; do + if [ ! -e $ROOT/src/llvm/tools/$TOOL ]; then + ln -s $ROOT/src/$TOOL $ROOT/src/llvm/tools/$TOOL + fi +done + +for PRJ in $PROJECTS; do + if [ ! -e $ROOT/src/llvm/projects/$PRJ ]; then + ln -s $ROOT/src/$PRJ $ROOT/src/llvm/projects/$PRJ + fi +done + +if [ ! -d $ROOT/build/llvm ]; then + mkdir $ROOT/build/llvm || $(echo 'failed to create directory' && exit 1) +fi + +cd $ROOT/build/llvm || $(echo 'failed to change directory' && exit 1) + +ninja || exit 41 diff --git a/dockerfiles/config/aarch64-unknown-linux-musl.config b/dockerfiles/config/aarch64-unknown-linux-musl.config new file mode 100644 index 0000000..1fd77e4 --- /dev/null +++ b/dockerfiles/config/aarch64-unknown-linux-musl.config @@ -0,0 +1,5 @@ +[target.aarch64-unknown-linux-musl] +rustflags = ["-C", "target-feature=+crt-static", "-C","link-arg=-lgcc"] +ar = "aarch64-linux-musl-ar" +linker = "aarch64-linux-musl-gcc" +runner = "qemu-aarch64_be-static" diff --git a/dockerfiles/config/armv7-unknown-linux-musleabihf.config b/dockerfiles/config/armv7-unknown-linux-musleabihf.config new file mode 100644 index 0000000..de8950f --- /dev/null +++ b/dockerfiles/config/armv7-unknown-linux-musleabihf.config @@ -0,0 +1,4 @@ +[target.armv7-unknown-linux-musleabihf] +ar = "arm-linux-musleabihf-ar" +linker = "arm-linux-musleabihf-gcc" +runner = "qemu-armeb-static" diff --git a/dockerfiles/config/x86_64-unknown-linux-musl.config b/dockerfiles/config/x86_64-unknown-linux-musl.config new file mode 100644 index 0000000..f67eade --- /dev/null +++ b/dockerfiles/config/x86_64-unknown-linux-musl.config @@ -0,0 +1,5 @@ +[target.x86_64-unknown-linux-musl] +# Enables the aes-ni instructions for RustCrypto dependency. +rustflags = ["-C","target-feature=+aes,+sse2,+ssse3"] +ar = "x86_64-linux-musl-ar" +linker = "x86_64-linux-musl-gcc" diff --git a/dockerfiles/configure.sh b/dockerfiles/configure.sh new file mode 100755 index 0000000..a10425f --- /dev/null +++ b/dockerfiles/configure.sh @@ -0,0 +1,65 @@ +#!/bin/sh + +TOOLS='clang lld' +PROJECTS='libunwind compiler-rt libcxx libcxxabi' +ARCH="$(uname -m)" +TARGETS='X86;AArch64;ARM;WebAssembly' +ROOT=$(dirname $(readlink -f "$0")) + +PATH=/"$ARCH"-unknown-linux-musl/bin:"$PATH" +LD_LIBRARY_PATH=/"$ARCH"-unknown-linux-musl/lib + +if [ ! -d $ROOT/src ]; then + echo no sources found, run sync + exit 1 +fi + +if [ ! -d $ROOT/build ]; then + mkdir $ROOT/build || $(echo 'failed to create directory' && exit 1) +fi + +cd $ROOT/build || $(echo 'failed to change directory' && exit 1) + +for TOOL in $TOOLS; do + if [ ! -e $ROOT/src/llvm/tools/$TOOL ]; then + ln -s $ROOT/src/$TOOL $ROOT/src/llvm/tools/$TOOL + fi +done + +for PRJ in $PROJECTS; do + if [ ! -e $ROOT/src/llvm/projects/$PRJ ]; then + ln -s $ROOT/src/$PRJ $ROOT/src/llvm/projects/$PRJ + fi +done + +if [ ! -d $ROOT/build/llvm ]; then + mkdir $ROOT/build/llvm || $(echo 'failed to create directory' && exit 1) +fi + +cd $ROOT/build/llvm || $(echo 'failed to change directory' && exit 1) + +cmake \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_C_COMPILER_LAUNCHER=sccache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \ + -DLIBCXXABI_LIBCXX_PATH=$ROOT/src/libcxx \ + -DLIBCXXABI_LIBCXX_INCLUDES=$ROOT/src/libcxx/include \ + -DLIBCXXABI_ENABLE_STATIC_UNWINDER=ON \ + -DLIBCXXABI_USE_LLVM_UNWINDER=ON \ + -DLIBCXX_LIBCXXABI_INCLUDES_INTERNAL=$ROOT/src/libcxxabi/include \ + -DLIBCXX_HAS_MUSL_LIBC=ON \ + -DLIBCXX_HAS_GCC_S_LIB=OFF \ + -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON \ + -DLIBUNWIND_ENABLE_SHARED=OFF \ + -DCLANG_DEFAULT_CXX_STDLIB=libc++ \ + -DCLANG_DEFAULT_LINKER=lld \ + -DCLANG_DEFAULT_RTLIB=compiler-rt \ + -DLLVM_DEFAULT_TARGET_TRIPLE="$ARCH"-unknown-linux-musl \ + -DDEFAULT_SYSROOT=/"$ARCH"-unknown-linux-musl \ + -DCMAKE_INSTALL_PREFIX=/"$ARCH"-unknown-linux-musl \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_TARGET_ARCH="$ARCH" \ + -DLLVM_TARGETS_TO_BUILD="$TARGETS" \ + -G Ninja \ + $ROOT/src/llvm || exit 40 diff --git a/dockerfiles/install.sh b/dockerfiles/install.sh new file mode 100755 index 0000000..c003cba --- /dev/null +++ b/dockerfiles/install.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +TOOLS='clang lld' +PROJECTS='libunwind compiler-rt libcxx libcxxabi' +ARCH="$(uname -m)" +TARGETS='X86;AArch64;ARM;WebAssembly' +ROOT=$(dirname $(readlink -f "$0")) + +PATH=/"$ARCH"-unknown-linux-musl/bin:"$PATH" +LD_LIBRARY_PATH=/"$ARCH"-unknown-linux-musl/lib + +if [ ! -d $ROOT/src ]; then + echo no sources found, run sync + exit 1 +fi + +if [ ! -d $ROOT/build ]; then + mkdir $ROOT/build || $(echo 'failed to create directory' && exit 1) +fi + +cd $ROOT/build || $(echo 'failed to change directory' && exit 1) + +for TOOL in $TOOLS; do + if [ ! -e $ROOT/src/llvm/tools/$TOOL ]; then + ln -s $ROOT/src/$TOOL $ROOT/src/llvm/tools/$TOOL + fi +done + +for PRJ in $PROJECTS; do + if [ ! -e $ROOT/src/llvm/projects/$PRJ ]; then + ln -s $ROOT/src/$PRJ $ROOT/src/llvm/projects/$PRJ + fi +done + +if [ ! -d $ROOT/build/llvm ]; then + mkdir $ROOT/build/llvm || $(echo 'failed to create directory' && exit 1) +fi + +cd $ROOT/build/llvm || $(echo 'failed to change directory' && exit 1) + +ninja install || exit 42 + +cd /"$ARCH"-unknown-linux-musl/bin || $(echo 'failed to change directory' && exit 1) +ln -s llvm-ar ar +ln -s llvm-ranlib ranlib +ln -s llvm-objcopy objcopy +ln -s llvm-objcopy strip +ln -s llvm-objdump objdump +ln -s llvm-nm nm +ln -s clang cc +ln -s clang++ c++ +ln -s ld.lld ld +ln -s ld.lld rust-lld +cd / || $(echo 'failed to change directory' && exit 1) +tar cvfz "$ARCH"-unknown-linux-musl.tar.gz "$ARCH"-unknown-linux-musl || exit 46 +mkdir -p $ROOT/artifact || $(echo 'failed to change directory' && exit 1) +mv -v "$ARCH"-unknown-linux-musl.tar.gz $ROOT/artifact/ diff --git a/dockerfiles/patch/compiler-rt-01-sanitizer-nongnu.patch b/dockerfiles/patch/compiler-rt-01-sanitizer-nongnu.patch new file mode 100644 index 0000000..4c97262 --- /dev/null +++ b/dockerfiles/patch/compiler-rt-01-sanitizer-nongnu.patch @@ -0,0 +1,399 @@ +diff --git a/lib/asan/asan_linux.cc b/lib/asan/asan_linux.cc +index f91823289..f8c9421da 100644 +--- a/lib/asan/asan_linux.cc ++++ b/lib/asan/asan_linux.cc +@@ -45,7 +45,7 @@ + #include + #endif + +-#if SANITIZER_ANDROID || SANITIZER_FREEBSD || SANITIZER_SOLARIS ++#if SANITIZER_ANDROID || SANITIZER_FREEBSD || SANITIZER_SOLARIS || SANITIZER_NONGNU + #include + extern "C" void* _DYNAMIC; + #elif SANITIZER_NETBSD +@@ -138,7 +138,7 @@ void AsanApplyToGlobals(globals_op_fptr op, const void *needle) { + UNIMPLEMENTED(); + } + +-#if SANITIZER_ANDROID ++#if SANITIZER_ANDROID || SANITIZER_NONGNU + // FIXME: should we do anything for Android? + void AsanCheckDynamicRTPrereqs() {} + void AsanCheckIncompatibleRT() {} +@@ -229,7 +229,7 @@ void AsanCheckIncompatibleRT() { + } + } + } +-#endif // SANITIZER_ANDROID ++#endif // SANITIZER_ANDROID || SANITIZER_NONGNU + + #if !SANITIZER_ANDROID + void ReadContextStack(void *context, uptr *stack, uptr *ssize) { +diff --git a/lib/interception/interception_linux.cc b/lib/interception/interception_linux.cc +index d07f060b5..dee283cbf 100644 +--- a/lib/interception/interception_linux.cc ++++ b/lib/interception/interception_linux.cc +@@ -58,8 +58,8 @@ bool InterceptFunction(const char *name, uptr *ptr_to_real, uptr func, + return addr && (func == wrapper); + } + +-// Android and Solaris do not have dlvsym +-#if !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD ++// Android, Solaris, OpenBSD and MUSL do not have dlvsym ++#if !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD && !SANITIZER_NONGNU + static void *GetFuncAddr(const char *name, const char *ver) { + return dlvsym(RTLD_NEXT, name, ver); + } +@@ -70,7 +70,7 @@ bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real, + *ptr_to_real = (uptr)addr; + return addr && (func == wrapper); + } +-#endif // !SANITIZER_ANDROID ++#endif // !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD && !SANITIZER_NONGNU + + } // namespace __interception + +diff --git a/lib/interception/interception_linux.h b/lib/interception/interception_linux.h +index e578da0cf..01f919aea 100644 +--- a/lib/interception/interception_linux.h ++++ b/lib/interception/interception_linux.h +@@ -35,8 +35,8 @@ bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real, + (::__interception::uptr) & (func), \ + (::__interception::uptr) & WRAP(func)) + +-// Android, Solaris and OpenBSD do not have dlvsym +-#if !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD ++// Android, Solaris, OpenBSD and MUSL do not have dlvsym ++#if !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD && !SANITIZER_NONGNU + #define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ + ::__interception::InterceptFunction( \ + #func, symver, \ +@@ -46,7 +46,7 @@ bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real, + #else + #define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ + INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) +-#endif // !SANITIZER_ANDROID && !SANITIZER_SOLARIS ++#endif // !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD && !SANITIZER_NONGNU + + #endif // INTERCEPTION_LINUX_H + #endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || +diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc +index b055bb749..0fc1f564e 100644 +--- a/lib/msan/msan_interceptors.cc ++++ b/lib/msan/msan_interceptors.cc +@@ -57,7 +57,9 @@ DECLARE_REAL(SIZE_T, strlen, const char *s) + DECLARE_REAL(SIZE_T, strnlen, const char *s, SIZE_T maxlen) + DECLARE_REAL(void *, memcpy, void *dest, const void *src, uptr n) + DECLARE_REAL(void *, memset, void *dest, int c, uptr n) +- ++#if SANITIZER_NONGNU ++DECLARE_REAL(int, shmctl, int shmid, int cmd, void *buf) ++#endif + // True if this is a nested interceptor. + static THREADLOCAL int in_interceptor_scope; + +diff --git a/lib/msan/msan_linux.cc b/lib/msan/msan_linux.cc +index 056783088..e06171803 100644 +--- a/lib/msan/msan_linux.cc ++++ b/lib/msan/msan_linux.cc +@@ -12,7 +12,7 @@ + //===----------------------------------------------------------------------===// + + #include "sanitizer_common/sanitizer_platform.h" +-#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD ++#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD && !SANITIZER_NONGNU + + #include "msan.h" + #include "msan_report.h" +@@ -26,7 +26,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -259,4 +258,4 @@ void MsanTSDDtor(void *tsd) { + + } // namespace __msan + +-#endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD ++#endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD && !SANITIZER_NONGNU +diff --git a/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc b/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +index 490a04b21..6e860b4ff 100644 +--- a/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc ++++ b/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +@@ -103,7 +103,7 @@ static void ioctl_table_fill() { + _(SIOCGETVIFCNT, WRITE, struct_sioc_vif_req_sz); + #endif + +-#if SANITIZER_LINUX ++#if SANITIZER_LINUX && !SANITIZER_NONGNU + // Conflicting request ids. + // _(CDROMAUDIOBUFSIZ, NONE, 0); + // _(SNDCTL_TMR_CONTINUE, NONE, 0); +@@ -364,7 +364,7 @@ static void ioctl_table_fill() { + _(VT_WAITACTIVE, NONE, 0); + #endif + +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + // _(SIOCDEVPLIP, WRITE, struct_ifreq_sz); // the same as EQL_ENSLAVE + _(CYGETDEFTHRESH, WRITE, sizeof(int)); + _(CYGETDEFTIMEOUT, WRITE, sizeof(int)); +diff --git a/lib/sanitizer_common/sanitizer_common_syscalls.inc b/lib/sanitizer_common/sanitizer_common_syscalls.inc +index 00bb2aeef..2c6aba5c6 100644 +--- a/lib/sanitizer_common/sanitizer_common_syscalls.inc ++++ b/lib/sanitizer_common/sanitizer_common_syscalls.inc +@@ -2037,7 +2037,7 @@ POST_SYSCALL(setrlimit)(long res, long resource, void *rlim) { + } + } + +-#if !SANITIZER_ANDROID ++#if !SANITIZER_ANDROID && !SANITIZER_NONGNU + PRE_SYSCALL(prlimit64)(long pid, long resource, const void *new_rlim, + void *old_rlim) { + if (new_rlim) PRE_READ(new_rlim, struct_rlimit64_sz); +diff --git a/lib/sanitizer_common/sanitizer_linux_libcdep.cc b/lib/sanitizer_common/sanitizer_linux_libcdep.cc +index 0608898a1..7eae4db62 100644 +--- a/lib/sanitizer_common/sanitizer_linux_libcdep.cc ++++ b/lib/sanitizer_common/sanitizer_linux_libcdep.cc +@@ -14,7 +14,7 @@ + #include "sanitizer_platform.h" + + #if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \ +- SANITIZER_OPENBSD || SANITIZER_SOLARIS ++ SANITIZER_OPENBSD || SANITIZER_SOLARIS || SANITIZER_NONGNU + + #include "sanitizer_allocator_internal.h" + #include "sanitizer_atomic.h" +@@ -184,7 +184,7 @@ __attribute__((unused)) static bool GetLibcVersion(int *major, int *minor, + } + + #if !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO && \ +- !SANITIZER_NETBSD && !SANITIZER_OPENBSD && !SANITIZER_SOLARIS ++ !SANITIZER_NETBSD && !SANITIZER_OPENBSD && !SANITIZER_SOLARIS && !SANITIZER_NONGNU + static uptr g_tls_size; + + #ifdef __i386__ +@@ -261,7 +261,7 @@ void InitTlsSize() { + #else + void InitTlsSize() { } + #endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO && +- // !SANITIZER_NETBSD && !SANITIZER_SOLARIS ++ // !SANITIZER_NETBSD && !SANITIZER_SOLARIS && !SANITIZER_NONGNU + + #if (defined(__x86_64__) || defined(__i386__) || defined(__mips__) || \ + defined(__aarch64__) || defined(__powerpc64__) || defined(__s390__) || \ +@@ -431,7 +431,7 @@ int GetSizeFromHdr(struct dl_phdr_info *info, size_t size, void *data) { + + #if !SANITIZER_GO + static void GetTls(uptr *addr, uptr *size) { +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + # if defined(__x86_64__) || defined(__i386__) || defined(__s390__) + *addr = ThreadSelf(); + *size = GetTlsSize(); +@@ -475,7 +475,7 @@ static void GetTls(uptr *addr, uptr *size) { + #elif SANITIZER_OPENBSD + *addr = 0; + *size = 0; +-#elif SANITIZER_ANDROID ++#elif SANITIZER_ANDROID || SANITIZER_NONGNU + *addr = 0; + *size = 0; + #elif SANITIZER_SOLARIS +@@ -491,7 +491,7 @@ static void GetTls(uptr *addr, uptr *size) { + #if !SANITIZER_GO + uptr GetTlsSize() { + #if SANITIZER_FREEBSD || SANITIZER_ANDROID || SANITIZER_NETBSD || \ +- SANITIZER_OPENBSD || SANITIZER_SOLARIS ++ SANITIZER_OPENBSD || SANITIZER_SOLARIS || SANITIZER_NONGNU + uptr addr, size; + GetTls(&addr, &size); + return size; +diff --git a/lib/sanitizer_common/sanitizer_platform.h b/lib/sanitizer_common/sanitizer_platform.h +index b45c97535..673b60d23 100644 +--- a/lib/sanitizer_common/sanitizer_platform.h ++++ b/lib/sanitizer_common/sanitizer_platform.h +@@ -213,6 +213,12 @@ + # define SANITIZER_MYRIAD2 0 + #endif + ++#if defined(__linux__) && !defined(__GLIBC__) ++# define SANITIZER_NONGNU 1 ++#else ++# define SANITIZER_NONGNU 0 ++#endif ++ + // By default we allow to use SizeClassAllocator64 on 64-bit platform. + // But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64 + // does not work well and we need to fallback to SizeClassAllocator32. +diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h +index 817d24b34..1320a8b1a 100644 +--- a/lib/sanitizer_common/sanitizer_platform_interceptors.h ++++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h +@@ -39,7 +39,7 @@ + # include "sanitizer_platform_limits_solaris.h" + #endif + +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + # define SI_LINUX_NOT_ANDROID 1 + #else + # define SI_LINUX_NOT_ANDROID 0 +diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +index b7fa6e8f7..d273d3736 100644 +--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -22,6 +22,9 @@ + #ifdef _FILE_OFFSET_BITS + #undef _FILE_OFFSET_BITS + #endif ++#ifdef SANITIZER_NONGNU ++#include ++#endif + #include + #include + #include +@@ -54,7 +57,9 @@ + #endif + + #if !SANITIZER_ANDROID ++#if !SANITIZER_NONGNU + #include ++#endif + #include + #include + #include +@@ -107,7 +112,9 @@ typedef struct user_fpregs elf_fpregset_t; + + #if SANITIZER_LINUX && !SANITIZER_ANDROID + #include +-#include ++# if !SANITIZER_NONGNU ++# include ++# endif + #include + #include + #include +@@ -196,7 +203,9 @@ namespace __sanitizer { + #endif // SANITIZER_MAC && !SANITIZER_IOS + + #if !SANITIZER_ANDROID ++#if !SANITIZER_NONGNU + unsigned struct_fstab_sz = sizeof(struct fstab); ++#endif + unsigned struct_statfs_sz = sizeof(struct statfs); + unsigned struct_sockaddr_sz = sizeof(struct sockaddr); + unsigned ucontext_t_sz = sizeof(ucontext_t); +@@ -291,7 +300,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(ElfW(Phdr)); + unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + #endif + +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + int glob_nomatch = GLOB_NOMATCH; + int glob_altdirfunc = GLOB_ALTDIRFUNC; + #endif +@@ -385,7 +394,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + unsigned struct_termios_sz = sizeof(struct termios); + unsigned struct_winsize_sz = sizeof(struct winsize); + +-#if SANITIZER_LINUX ++#if SANITIZER_LINUX && !SANITIZER_NONGNU + unsigned struct_arpreq_sz = sizeof(struct arpreq); + unsigned struct_cdrom_msf_sz = sizeof(struct cdrom_msf); + unsigned struct_cdrom_multisession_sz = sizeof(struct cdrom_multisession); +@@ -435,7 +444,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + unsigned struct_vt_mode_sz = sizeof(struct vt_mode); + #endif // SANITIZER_LINUX + +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + unsigned struct_ax25_parms_struct_sz = sizeof(struct ax25_parms_struct); + unsigned struct_cyclades_monitor_sz = sizeof(struct cyclades_monitor); + #if EV_VERSION > (0x010000) +@@ -802,7 +811,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + unsigned IOCTL_VT_WAITACTIVE = VT_WAITACTIVE; + #endif // SANITIZER_LINUX + +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + unsigned IOCTL_CYGETDEFTHRESH = CYGETDEFTHRESH; + unsigned IOCTL_CYGETDEFTIMEOUT = CYGETDEFTIMEOUT; + unsigned IOCTL_CYGETMON = CYGETMON; +@@ -957,7 +966,7 @@ CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_phdr); + CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_phnum); + #endif // SANITIZER_LINUX || SANITIZER_FREEBSD + +-#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID ++#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID && !SANITIZER_NONGNU + CHECK_TYPE_SIZE(glob_t); + CHECK_SIZE_AND_OFFSET(glob_t, gl_pathc); + CHECK_SIZE_AND_OFFSET(glob_t, gl_pathv); +@@ -991,6 +1000,7 @@ CHECK_TYPE_SIZE(iovec); + CHECK_SIZE_AND_OFFSET(iovec, iov_base); + CHECK_SIZE_AND_OFFSET(iovec, iov_len); + ++#if !SANITIZER_NONGNU + CHECK_TYPE_SIZE(msghdr); + CHECK_SIZE_AND_OFFSET(msghdr, msg_name); + CHECK_SIZE_AND_OFFSET(msghdr, msg_namelen); +@@ -1004,6 +1014,7 @@ CHECK_TYPE_SIZE(cmsghdr); + CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_len); + CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_level); + CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_type); ++#endif + + #ifndef __GLIBC_PREREQ + #define __GLIBC_PREREQ(x, y) 0 +@@ -1113,7 +1124,7 @@ CHECK_SIZE_AND_OFFSET(mntent, mnt_passno); + + CHECK_TYPE_SIZE(ether_addr); + +-#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID ++#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID && !SANITIZER_NONGNU + CHECK_TYPE_SIZE(ipc_perm); + # if SANITIZER_FREEBSD + CHECK_SIZE_AND_OFFSET(ipc_perm, key); +@@ -1174,7 +1185,7 @@ CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_dstaddr); + CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_data); + #endif + +-#if SANITIZER_LINUX ++#if SANITIZER_LINUX && !SANITIZER_NONGNU + COMPILER_CHECK(sizeof(__sanitizer_struct_mallinfo) == sizeof(struct mallinfo)); + #endif + +@@ -1224,7 +1235,7 @@ COMPILER_CHECK(__sanitizer_XDR_DECODE == XDR_DECODE); + COMPILER_CHECK(__sanitizer_XDR_FREE == XDR_FREE); + #endif + +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + COMPILER_CHECK(sizeof(__sanitizer_FILE) <= sizeof(FILE)); + CHECK_SIZE_AND_OFFSET(FILE, _flags); + CHECK_SIZE_AND_OFFSET(FILE, _IO_read_ptr); +@@ -1243,7 +1254,7 @@ CHECK_SIZE_AND_OFFSET(FILE, _chain); + CHECK_SIZE_AND_OFFSET(FILE, _fileno); + #endif + +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + COMPILER_CHECK(sizeof(__sanitizer__obstack_chunk) <= sizeof(_obstack_chunk)); + CHECK_SIZE_AND_OFFSET(_obstack_chunk, limit); + CHECK_SIZE_AND_OFFSET(_obstack_chunk, prev); +diff --git a/lib/tsan/rtl/tsan_platform_linux.cc b/lib/tsan/rtl/tsan_platform_linux.cc +index ec8606f65..e4e676e46 100644 +--- a/lib/tsan/rtl/tsan_platform_linux.cc ++++ b/lib/tsan/rtl/tsan_platform_linux.cc +@@ -314,7 +314,7 @@ void InitializePlatform() { + // This is required to properly "close" the fds, because we do not see internal + // closes within glibc. The code is a pure hack. + int ExtractResolvFDs(void *state, int *fds, int nfd) { +-#if SANITIZER_LINUX && !SANITIZER_ANDROID ++#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU + int cnt = 0; + struct __res_state *statp = (struct __res_state*)state; + for (int i = 0; i < MAXNS && cnt < nfd; i++) { diff --git a/dockerfiles/patch/compiler-rt-02-ngtc-specific.patch b/dockerfiles/patch/compiler-rt-02-ngtc-specific.patch new file mode 100644 index 0000000..2499529 --- /dev/null +++ b/dockerfiles/patch/compiler-rt-02-ngtc-specific.patch @@ -0,0 +1,13 @@ +diff --git a/cmake/Modules/AddCompilerRT.cmake b/cmake/Modules/AddCompilerRT.cmake +index f7ee932f2..de9159c49 100644 +--- a/cmake/Modules/AddCompilerRT.cmake ++++ b/cmake/Modules/AddCompilerRT.cmake +@@ -610,6 +610,8 @@ macro(add_custom_libcxx name prefix) + -DLLVM_LIBRARY_OUTPUT_INTDIR=${prefix}/lib + -DCOMPILER_RT_LIBCXX_PATH=${COMPILER_RT_LIBCXX_PATH} + -DCOMPILER_RT_LIBCXXABI_PATH=${COMPILER_RT_LIBCXXABI_PATH} ++ -DLIBCXX_HAS_MUSL_LIBC=ON ++ -DLIBCXX_HAS_GCC_S_LIB=OFF + ${LIBCXX_CMAKE_ARGS} + INSTALL_COMMAND "" + STEP_TARGETS configure build diff --git a/dockerfiles/patch/compiler-rt-03-link-against-libexecinfo.patch b/dockerfiles/patch/compiler-rt-03-link-against-libexecinfo.patch new file mode 100644 index 0000000..c6323a8 --- /dev/null +++ b/dockerfiles/patch/compiler-rt-03-link-against-libexecinfo.patch @@ -0,0 +1,12 @@ +diff --git a/lib/scudo/CMakeLists.txt b/lib/scudo/CMakeLists.txt +index 2a560b8fc..c657679bb 100644 +--- a/lib/scudo/CMakeLists.txt ++++ b/lib/scudo/CMakeLists.txt +@@ -8,6 +8,7 @@ list(APPEND SCUDO_CFLAGS -fbuiltin) + append_rtti_flag(OFF SCUDO_CFLAGS) + + set(SCUDO_MINIMAL_DYNAMIC_LIBS ${SANITIZER_COMMON_LINK_LIBS}) ++list(APPEND SCUDO_MINIMAL_DYNAMIC_LIBS -lexecinfo) + append_list_if(COMPILER_RT_HAS_LIBDL dl SCUDO_MINIMAL_DYNAMIC_LIBS) + append_list_if(COMPILER_RT_HAS_LIBRT rt SCUDO_MINIMAL_DYNAMIC_LIBS) + append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread SCUDO_MINIMAL_DYNAMIC_LIBS) diff --git a/dockerfiles/patch/compiler-rt-04-sanitizer-nongnu-linux.patch b/dockerfiles/patch/compiler-rt-04-sanitizer-nongnu-linux.patch new file mode 100644 index 0000000..04461ec --- /dev/null +++ b/dockerfiles/patch/compiler-rt-04-sanitizer-nongnu-linux.patch @@ -0,0 +1,19 @@ +diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +index d273d3736..f772e8754 100644 +--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -116,10 +116,10 @@ typedef struct user_fpregs elf_fpregset_t; + # include + # endif + #include +-#include +-#include +-#include +-#include ++#include ++#include ++#include ++#include + #if HAVE_RPC_XDR_H + # include + #endif diff --git a/dockerfiles/patch/libcxx-01-musl-hardfix.patch b/dockerfiles/patch/libcxx-01-musl-hardfix.patch new file mode 100644 index 0000000..ba3e23f --- /dev/null +++ b/dockerfiles/patch/libcxx-01-musl-hardfix.patch @@ -0,0 +1,22 @@ +diff --git a/include/locale b/include/locale +index 3fe443002..390fd898a 100644 +--- a/include/locale ++++ b/include/locale +@@ -736,7 +736,7 @@ __num_get_signed_integral(const char* __a, const char* __a_end, + typename remove_reference::type __save_errno = errno; + errno = 0; + char *__p2; +- long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); ++ long long __ll = strtoll(__a, &__p2, __base); + typename remove_reference::type __current_errno = errno; + if (__current_errno == 0) + errno = __save_errno; +@@ -776,7 +776,7 @@ __num_get_unsigned_integral(const char* __a, const char* __a_end, + typename remove_reference::type __save_errno = errno; + errno = 0; + char *__p2; +- unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); ++ unsigned long long __ll = strtoull(__a, &__p2, __base); + typename remove_reference::type __current_errno = errno; + if (__current_errno == 0) + errno = __save_errno; diff --git a/dockerfiles/patch/libcxx-02-enable-libgcc-link.patch b/dockerfiles/patch/libcxx-02-enable-libgcc-link.patch new file mode 100644 index 0000000..bc13348 --- /dev/null +++ b/dockerfiles/patch/libcxx-02-enable-libgcc-link.patch @@ -0,0 +1,13 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ec1869ddc..d64def6c2 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -449,7 +449,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR}) + # These libraries are exposed in the linker script. + set(LIBCXX_COMPILE_FLAGS "") + set(LIBCXX_LINK_FLAGS "") +-set(LIBCXX_LIBRARIES "") ++set(LIBCXX_LIBRARIES "-lgcc") + set(LIBCXX_INTERFACE_LIBRARIES "") + + # Include macros for adding and removing libc++ flags. diff --git a/dockerfiles/sync.sh b/dockerfiles/sync.sh new file mode 100755 index 0000000..6ea3eb0 --- /dev/null +++ b/dockerfiles/sync.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +LLVMREPO='https://github.com/llvm/llvm-project.git' +REPOS='llvm clang lld libunwind compiler-rt libcxx libcxxabi' +ROOT=$(dirname $(readlink -f "$0")) + +git clone --depth 1 --branch $1 https://github.com/llvm/llvm-project.git src + +cd src/ + + + + +if [ ! -d $ROOT/src ]; then + mkdir $ROOT/src || $(echo 'failed to create directory' && exit 1) +else + for REPO in $REPOS; do + PATCHES="$(ls -r -1 $ROOT/patch/$REPO-*.patch 2>/dev/null)" + NUMPATCHES="$(ls -r -1 $ROOT/patch/$REPO-*.patch 2>/dev/null | wc -l)" + NUMPATCH=0 + for PATCH in $PATCHES; do + NUMPATCH=$(($NUMPATCH+1)) + echo -n "unpatching $REPO ($NUMPATCH/$NUMPATCHES)... " + if ! patch -R -p1 --dry-run -s -f -d $ROOT/src/$REPO -i $PATCH >/dev/null; then + echo fail + else + patch -R -p1 -s -f -d $ROOT/src/$REPO -i $PATCH >/dev/null + echo success + fi + done + done +fi + +cd $ROOT/src || $(echo 'failed to change directory' && exit 1) + + +for REPO in $REPOS; do + PATCHES="$(ls -1 $ROOT/patch/$REPO-*.patch 2>/dev/null)" + NUMPATCHES="$(ls -1 $ROOT/patch/$REPO-*.patch 2>/dev/null | wc -l)" + NUMPATCH=0 + for PATCH in $PATCHES; do + NUMPATCH=$(($NUMPATCH+1)) + echo -n "patching $REPO ($NUMPATCH/$NUMPATCHES)... " + if ! patch -p1 --dry-run -s -f -d $ROOT/src/$REPO -i $PATCH >/dev/null; then + echo fail + else + patch -p1 -s -f -d $ROOT/src/$REPO -i $PATCH >/dev/null + echo success + fi + done +done