From 55756b3bb2eaa1f02baa6dfd28c203378daff337 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 11 Dec 2024 12:15:18 +0100 Subject: [PATCH] ld: use heredocs and ADD to clone in dockerfile Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- src/ld/Dockerfile | 257 ++++++++++++++++++++++++++++++---------------- 1 file changed, 166 insertions(+), 91 deletions(-) diff --git a/src/ld/Dockerfile b/src/ld/Dockerfile index 0c8a7b2..d1e2118 100644 --- a/src/ld/Dockerfile +++ b/src/ld/Dockerfile @@ -1,4 +1,4 @@ -#syntax=docker/dockerfile:1.8 +#syntax=docker/dockerfile:1 #check=error=true ARG ALPINE_VERSION=3.21 @@ -16,41 +16,54 @@ RUN apk add --no-cache git clang lld cmake make python3 bash COPY --link --from=xx / / ARG LIBTAPI_VERSION WORKDIR /work -RUN git clone https://github.com/tpoechtrager/apple-libtapi --depth 1 -b ${LIBTAPI_VERSION} +ADD "https://github.com/tpoechtrager/apple-libtapi.git#${LIBTAPI_VERSION}" apple-libtapi WORKDIR apple-libtapi RUN --mount=target=/tmp/libtapi-cmake-args.patch,source=libtapi-cmake-args.patch \ git apply /tmp/libtapi-cmake-args.patch RUN apk add --no-cache gcc g++ -RUN NOMAKE=1 CMAKE_EXTRA_ARGS="$(xx-clang --print-cmake-defines) -DCMAKE_CXX_FLAGS=-D_LARGEFILE64_SOURCE" ./build.sh && \ - cd build && \ - make -j $(nproc) clang-tblgen llvm-tblgen && \ - cp -a bin/clang-tblgen bin/llvm-tblgen /usr/bin/ && \ - cd .. && rm -rf build +RUN <<EOT + set -ex + NOMAKE=1 CMAKE_EXTRA_ARGS="$(xx-clang --print-cmake-defines) -DCMAKE_CXX_FLAGS=-D_LARGEFILE64_SOURCE" ./build.sh + cd build + make -j $(nproc) clang-tblgen llvm-tblgen + cp -a bin/clang-tblgen bin/llvm-tblgen /usr/bin/ + cd .. + rm -rf build +EOT FROM libtapi-base AS libtapi ARG TARGETPLATFORM RUN xx-apk add g++ -RUN INSTALLPREFIX=/opt/libtapi/ \ - CMAKE_EXTRA_ARGS="-DCLANG_TABLEGEN_EXE=/usr/bin/clang-tblgen -DLLVM_TABLEGEN=/usr/bin/llvm-tblgen -DCLANG_TABLEGEN=/usr/bin/clang-tblgen -DCMAKE_CXX_FLAGS=-D_LARGEFILE64_SOURCE $(xx-clang --print-cmake-defines)" \ - ./build.sh && ./install.sh && \ - xx-verify /opt/libtapi/lib/libtapi.so && \ - rm -rf build +RUN <<EOT + set -ex + export INSTALLPREFIX=/opt/libtapi/ + CMAKE_EXTRA_ARGS="-DCLANG_TABLEGEN_EXE=/usr/bin/clang-tblgen -DLLVM_TABLEGEN=/usr/bin/llvm-tblgen -DCLANG_TABLEGEN=/usr/bin/clang-tblgen -DCMAKE_CXX_FLAGS=-D_LARGEFILE64_SOURCE $(xx-clang --print-cmake-defines)" ./build.sh + ./install.sh + xx-verify /opt/libtapi/lib/libtapi.so + rm -rf build +EOT FROM libtapi-base AS libtapi-static ARG TARGETPLATFORM RUN xx-apk add g++ -RUN export INSTALLPREFIX=/opt/libtapi/ \ - CMAKE_EXTRA_ARGS="-DCLANG_TABLEGEN_EXE=/usr/bin/clang-tblgen -DLLVM_TABLEGEN=/usr/bin/llvm-tblgen -DCLANG_TABLEGEN=/usr/bin/clang-tblgen -DCMAKE_CXX_FLAGS=-D_LARGEFILE64_SOURCE $(xx-clang --print-cmake-defines)" \ - && sed -i s/SHARED/STATIC/g src/tapi/tools/libtapi/CMakeLists.txt && \ - ./build.sh && cd build && make -j $(nproc) LLVMObject tapiCore LLVMSupport LLVMDemangle LLVMMC LLVMBinaryFormat tapiObjCMetadata tapiNoInits LLVMTextAPI install-tapi-headers && \ - mkdir /opt/libtapi/lib && cp -a ./lib/*.a /opt/libtapi/lib/ && \ - cd .. && rm -rf build +RUN <<EOT + set -x + export INSTALLPREFIX=/opt/libtapi/ + sed -i s/SHARED/STATIC/g src/tapi/tools/libtapi/CMakeLists.txt + CMAKE_EXTRA_ARGS="-DCLANG_TABLEGEN_EXE=/usr/bin/clang-tblgen -DLLVM_TABLEGEN=/usr/bin/llvm-tblgen -DCLANG_TABLEGEN=/usr/bin/clang-tblgen -DCMAKE_CXX_FLAGS=-D_LARGEFILE64_SOURCE $(xx-clang --print-cmake-defines)" ./build.sh + cd build + make -j $(nproc) LLVMObject tapiCore LLVMSupport LLVMDemangle LLVMMC LLVMBinaryFormat tapiObjCMetadata tapiNoInits LLVMTextAPI install-tapi-headers + mkdir /opt/libtapi/lib + cp -a ./lib/*.a /opt/libtapi/lib/ + cd .. + rm -rf build +EOT FROM --platform=$BUILDPLATFORM alpine:${ALPINE_VERSION} AS aports RUN apk add git WORKDIR /work ARG APORTS_VERSION -RUN git clone --depth 1 -b ${APORTS_VERSION} https://github.com/alpinelinux/aports.git +ADD "https://github.com/alpinelinux/aports.git#${APORTS_VERSION}" aports FROM scratch AS patches-binutils COPY --from=aports /work/aports/main/binutils/*.patch / @@ -64,19 +77,20 @@ RUN apk add git clang lld cmake samurai patch ARG LIBDISPATCH_VERSION COPY --link --from=xx / / WORKDIR /work -RUN --mount=target=/patches,from=patches-libdispatch \ - git clone -b ${LIBDISPATCH_VERSION} --depth 1 https://github.com/apple/swift-corelibs-libdispatch.git && \ - cd swift-corelibs-libdispatch && \ - for f in /patches/*; do patch -p1 < $f; done +ADD "https://github.com/apple/swift-corelibs-libdispatch.git#${LIBDISPATCH_VERSION}" swift-corelibs-libdispatch WORKDIR swift-corelibs-libdispatch +RUN --mount=target=/patches,from=patches-libdispatch \ + for f in /patches/*; do patch -p1 < $f; done ARG TARGETPLATFORM RUN xx-apk add --no-cache gcc g++ musl-dev linux-headers bsd-compat-headers -RUN cmake $(xx-clang --print-cmake-defines) -G Ninja -B build -DCMAKE_INSTALL_PREFIX=/out/libdispatch -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_SHARED_LIBS=False -DCMAKE_BUILD_TYPE=MinSizeRel && \ - cmake --build build && \ - cmake --install build && \ - rm -rf build -RUN ls -l /out/libdispatch/lib && \ - [ -f /out/libdispatch/lib/libdispatch.a ] && [ -f /out/libdispatch/lib/libBlocksRuntime.a ] +RUN <<EOT + set -ex + cmake $(xx-clang --print-cmake-defines) -G Ninja -B build -DCMAKE_INSTALL_PREFIX=/out/libdispatch -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_SHARED_LIBS=False -DCMAKE_BUILD_TYPE=MinSizeRel + cmake --build build + cmake --install build + rm -rf build +EOT +RUN ls -l /out/libdispatch/lib && [ -f /out/libdispatch/lib/libdispatch.a ] && [ -f /out/libdispatch/lib/libBlocksRuntime.a ] FROM scratch AS libdispatch COPY --from=libdispatch-base /out/libdispatch/lib/*.a /lib/ @@ -85,9 +99,8 @@ FROM --platform=${BUILDPLATFORM} alpine:${ALPINE_VERSION} AS cctools-base RUN apk add --no-cache git clang lld make llvm llvm-dev libdispatch-dev COPY --link --from=xx / / WORKDIR /work -ARG CCTOOLS_REPO=https://github.com/tpoechtrager/cctools-port ARG CCTOOLS_VERSION -RUN git clone $CCTOOLS_REPO -b ${CCTOOLS_VERSION} +ADD "https://github.com/tpoechtrager/cctools-port.git#${CCTOOLS_VERSION}" cctools-port WORKDIR cctools-port/cctools ARG TARGETPLATFORM RUN --mount=target=/libdispatch,from=libdispatch \ @@ -96,21 +109,29 @@ RUN --mount=target=/libdispatch,from=libdispatch \ FROM cctools-base AS lipo-base ARG LIPO_CFLAGS="-Wl,-s -Os" -RUN export CFLAGS=${LIPO_CFLAGS} && \ - ./configure --host=$(xx-clang --print-target-triple) LDFLAGS=--static && \ - make -C libmacho && make -C libstuff && make -C misc lipo && \ - xx-verify --static misc/lipo +RUN <<EOT + set -ex + export CFLAGS=${LIPO_CFLAGS} + ./configure --host=$(xx-clang --print-target-triple) LDFLAGS=--static + make -C libmacho + make -C libstuff + make -C misc lipo + xx-verify --static misc/lipo +EOT FROM scratch AS lipo-static COPY --from=lipo-base /work/cctools-port/cctools/misc/lipo / FROM cctools-base AS codesign-allocate-base ARG CODESIGN_CFLAGS="-Wl,-s -Os" -RUN export CFLAGS=${CODESIGN_CFLAGS} && \ - ./configure --host=$(xx-clang --print-target-triple) LDFLAGS=--static && \ - make -C libmacho && make -C libstuff && make -C misc codesign_allocate && \ - xx-verify --static misc/codesign_allocate - +RUN <<EOT + export CFLAGS=${CODESIGN_CFLAGS} + ./configure --host=$(xx-clang --print-target-triple) LDFLAGS=--static + make -C libmacho + make -C libstuff + make -C misc codesign_allocate + xx-verify --static misc/codesign_allocate +EOT FROM scratch AS codesign-allocate-static COPY --from=codesign-allocate-base /work/cctools-port/cctools/misc/codesign_allocate / @@ -118,31 +139,35 @@ FROM cctools-base AS ld64-static-base # for LTO RUN apk add llvm-dev ARG LD64_CXXFLAGS="-Wl,-s -Os" -RUN --mount=from=libtapi-static,source=/opt/libtapi,target=/opt/libtapi \ - export CXXFLAGS=${LD64_CXXFLAGS} && ./configure --with-libtapi=/opt/libtapi --host=$(xx-clang --print-target-triple) &&\ - sed -i 's/-ltapi/-ltapi -ltapiCore -ltapiObjCMetadata -lLLVMObject -lLLVMTextAPI -lLLVMSupport -lLLVMDemangle -lLLVMMC -lLLVMBinaryFormat --static/' ld64/src/ld/Makefile && \ - make -j $(nproc) -C ld64 && \ - xx-verify --static ld64/src/ld/ld - +RUN --mount=from=libtapi-static,source=/opt/libtapi,target=/opt/libtapi <<EOT + set -ex + export CXXFLAGS=${LD64_CXXFLAGS} + ./configure --with-libtapi=/opt/libtapi --host=$(xx-clang --print-target-triple) + sed -i 's/-ltapi/-ltapi -ltapiCore -ltapiObjCMetadata -lLLVMObject -lLLVMTextAPI -lLLVMSupport -lLLVMDemangle -lLLVMMC -lLLVMBinaryFormat --static/' ld64/src/ld/Makefile + make -j $(nproc) -C ld64 + xx-verify --static ld64/src/ld/ld +EOT FROM --platform=${BUILDPLATFORM} alpine:${ALPINE_VERSION} AS sigtool-base RUN apk add --no-cache git clang lld cmake make pkgconf COPY --from=xx / / WORKDIR /work ARG SIGTOOL_VERSION -RUN git clone https://github.com/thefloweringash/sigtool && \ - cd sigtool && \ - git checkout ${SIGTOOL_VERSION} +ADD "https://github.com/thefloweringash/sigtool.git#${SIGTOOL_VERSION}" sigtool WORKDIR sigtool RUN --mount=target=/tmp/sigtool-static.patch,source=sigtool-static.patch \ git apply /tmp/sigtool-static.patch ARG TARGETPLATFORM RUN xx-apk add --no-cache g++ openssl-dev openssl-libs-static ARG SIGTOOL_CXXFLAGS="-Wl,-s -Os" -RUN export CXXFLAGS=${SIGTOOL_CXXFLAGS} && \ - mkdir build && cd build && \ - cmake -DBUILD_SHARED_LIBS=False $(xx-clang --print-cmake-defines) -DCMAKE_EXE_LINKER_FLAGS=-static .. && \ - make -j $(nproc) && \ - xx-verify --static ./sigtool ./codesign +RUN <<EOT + set -ex + export CXXFLAGS=${SIGTOOL_CXXFLAGS} + mkdir build + cd build + cmake -DBUILD_SHARED_LIBS=False $(xx-clang --print-cmake-defines) -DCMAKE_EXE_LINKER_FLAGS=-static .. + make -j $(nproc) + xx-verify --static ./sigtool ./codesign +EOT FROM scratch AS sigtool-static COPY --link --from=codesign-allocate-static / / @@ -174,13 +199,15 @@ FROM cctools-base AS cctools-build RUN apk add llvm-dev ARG CCTOOLS_CXXFLAGS="-Wl,-s -Os" ARG CCTOOLS_CFLAGS="-Wl,-s -Os" -RUN --mount=from=libtapi,source=/opt/libtapi,target=/opt/libtapi \ - # copy to /usr/bin for clean rpath. TODO: try static build - cp -a /opt/libtapi/. /usr/ && \ - export CFLAGS=${CCTOOLS_CFLAGS} CXXFLAGS=${CCTOOLS_CXXFLAGS} && \ - ./configure --prefix=/opt/cctools --with-libtapi=/opt/libtapi --host=$(xx-clang --print-target-triple) && \ - make -j $(nproc) install && \ - xx-verify /opt/cctools/bin/ld +RUN --mount=from=libtapi,source=/opt/libtapi,target=/opt/libtapi <<EOT + set -ex + # copy to /usr/bin for clean rpath. TODO: try static build + cp -a /opt/libtapi/. /usr/ + export CFLAGS=${CCTOOLS_CFLAGS} CXXFLAGS=${CCTOOLS_CXXFLAGS} + ./configure --prefix=/opt/cctools --with-libtapi=/opt/libtapi --host=$(xx-clang --print-target-triple) + make -j $(nproc) install + xx-verify /opt/cctools/bin/ld +EOT FROM scratch AS cctools COPY --link --from=libtapi /opt/libtapi/lib/*.so /usr/lib/ @@ -196,14 +223,19 @@ ARG BINUTILS_VERSION RUN wget https://sourceware.org/pub/binutils/releases/binutils-${BINUTILS_VERSION}.tar.gz ARG TARGETPLATFORM # first build version for current architecture that is used then cross compiling -RUN export CC=xx-clang CXX=xx-clang++ LD=lld BINUTILS_TARGET=${TARGETPLATFORM} && unset TARGETPLATFORM && \ - tar xf binutils-${BINUTILS_VERSION}.tar.gz && \ - cd binutils-${BINUTILS_VERSION} && \ - for f in ../patches/*; do patch -p1 < $f; done && \ - ./configure --disable-separate-code --libdir=/lib --prefix=/usr --disable-multilib --enable-deterministic-archives --target=$(TARGETPLATFORM=$BINUTILS_TARGET xx-info) --disable-nls --disable-gprofng && \ - make -j $(nproc) && \ - make install && \ - cd .. && rm -rf binutils-${BINUTILS_VERSION} +RUN <<EOT + set -ex + export CC=xx-clang CXX=xx-clang++ LD=lld BINUTILS_TARGET=${TARGETPLATFORM} + unset TARGETPLATFORM + tar xf binutils-${BINUTILS_VERSION}.tar.gz + cd binutils-${BINUTILS_VERSION} + for f in ../patches/*; do patch -p1 < $f; done + ./configure --disable-separate-code --libdir=/lib --prefix=/usr --disable-multilib --enable-deterministic-archives --target=$(TARGETPLATFORM=$BINUTILS_TARGET xx-info) --disable-nls --disable-gprofng + make -j $(nproc) + make install + cd .. + rm -rf binutils-${BINUTILS_VERSION} +EOT RUN xx-apk add --no-cache musl-dev gcc g++ zlib-dev zstd-dev FROM binutils-base0 AS ld-base @@ -215,18 +247,42 @@ ARG LD_TARGET=${TARGETOS}-${TARGETARCH}${TARGETVARIANT} ARG LD_CFLAGS="-Wl,-s -Os" # BINUTILS_CONFIG defines extra options passed to binutils configure script ARG BINUTILS_CONFIG= -RUN export CC=xx-clang CXX=xx-clang++ CFLAGS="$LD_CFLAGS --static" CXXFLAGS="$LD_CFLAGS" LD_TARGET_TRIPLE=$(TARGETPLATFORM= TARGETPAIR=$LD_TARGET xx-info) XX_CC_PREFER_LINKER=ld && \ - tar xf binutils-${BINUTILS_VERSION}.tar.gz && \ - cd binutils-${BINUTILS_VERSION} && \ - for f in ../patches/*; do patch -p1 < $f; done && \ - ./configure --disable-separate-code --libdir=/lib --prefix=/ --disable-multilib --enable-deterministic-archives --target=$LD_TARGET_TRIPLE --host $(xx-clang --print-target-triple) --disable-nls --disable-gold --enable-relro --disable-plugins --with-pic --with-mmap --with-system-zlib --disable-gas --disable-elfcpp --disable-binutils --disable-gprofng $BINUTILS_CONFIG && \ - make -j $(nproc) && \ - make install && \ - cd .. && rm -rf binutils-${BINUTILS_VERSION} && \ - xx-verify --static /$LD_TARGET_TRIPLE/bin/ld && \ - mkdir -p /out && mv /$LD_TARGET_TRIPLE/bin/ld /out/$LD_TARGET-ld && \ - mkdir -p /out/ldscripts && mv /$LD_TARGET_TRIPLE/lib/ldscripts/* /out/ldscripts/ - +RUN <<EOT + set -ex + export CC=xx-clang CXX=xx-clang++ CFLAGS="$LD_CFLAGS --static" CXXFLAGS="$LD_CFLAGS" LD_TARGET_TRIPLE=$(TARGETPLATFORM= TARGETPAIR=$LD_TARGET xx-info) XX_CC_PREFER_LINKER=ld + tar xf binutils-${BINUTILS_VERSION}.tar.gz + cd binutils-${BINUTILS_VERSION} + for f in ../patches/*; do patch -p1 < $f; done + ./configure \ + --disable-separate-code \ + --libdir=/lib \ + --prefix=/ \ + --disable-multilib \ + --enable-deterministic-archives \ + --target=$LD_TARGET_TRIPLE \ + --host=$(xx-clang --print-target-triple) \ + --disable-nls \ + --disable-gold \ + --enable-relro \ + --disable-plugins \ + --with-pic \ + --with-mmap \ + --with-system-zlib \ + --disable-gas \ + --disable-elfcpp \ + --disable-binutils \ + --disable-gprofng \ + $BINUTILS_CONFIG + make -j $(nproc) + make install + cd .. + rm -rf binutils-${BINUTILS_VERSION} + xx-verify --static /$LD_TARGET_TRIPLE/bin/ld + mkdir -p /out + mv /$LD_TARGET_TRIPLE/bin/ld /out/$LD_TARGET-ld + mkdir -p /out/ldscripts + mv /$LD_TARGET_TRIPLE/lib/ldscripts/* /out/ldscripts/ +EOT FROM ld-base AS ld-tgz-base ARG TARGETOS TARGETARCH TARGETVARIANT ARG LD_TARGET @@ -247,15 +303,34 @@ ARG BINUTILS_TARGET=${TARGETOS}-${TARGETARCH}${TARGETVARIANT} ARG BINUTILS_CFLAGS="-Wl,-s -Os" # BINUTILS_CONFIG defines extra options passed to binutils configure script ARG BINUTILS_CONFIG= -RUN export CC=xx-clang CXX=xx-clang++ CFLAGS="$BINUTILS_CFLAGS" CXXFLAGS="$BINUTILS_CFLAGS" && \ - tar xf binutils-${BINUTILS_VERSION}.tar.gz && \ - cd binutils-${BINUTILS_VERSION} && \ - for f in ../patches/*; do patch -p1 < $f; done && \ - ./configure --disable-separate-code --libdir=/lib --prefix=/out --disable-multilib --enable-deterministic-archives --target=$(TARGETPLATFORM= TARGETPAIR=$BINUTILS_TARGET xx-info) --host $(xx-clang --print-target-triple) --disable-nls --enable-gold --enable-relro --enable-plugins --with-pic --with-mmap --with-system-zlib --disable-gprofng $BINUTILS_CONFIG && \ - make -j $(nproc) && \ - make install && \ - cd .. && rm -rf binutils-${BINUTILS_VERSION} && \ - for f in /out/bin/*; do xx-verify $f; done - +RUN <<EOT + set -ex + export CC=xx-clang CXX=xx-clang++ CFLAGS="$BINUTILS_CFLAGS" CXXFLAGS="$BINUTILS_CFLAGS" + tar xf binutils-${BINUTILS_VERSION}.tar.gz + cd binutils-${BINUTILS_VERSION} + for f in ../patches/*; do patch -p1 < $f; done + ./configure \ + --disable-separate-code \ + --libdir=/lib \ + --prefix=/out \ + --disable-multilib \ + --enable-deterministic-archives \ + --target=$(TARGETPLATFORM= TARGETPAIR=$BINUTILS_TARGET xx-info) \ + --host=$(xx-clang --print-target-triple) \ + --disable-nls \ + --enable-gold \ + --enable-relro \ + --enable-plugins \ + --with-pic \ + --with-mmap \ + --with-system-zlib \ + --disable-gprofng \ + $BINUTILS_CONFIG + make -j $(nproc) + make install + cd .. + rm -rf binutils-${BINUTILS_VERSION} + for f in /out/bin/*; do xx-verify $f; done +EOT FROM scratch AS binutils COPY --from=binutils-base /out /usr/