1- # syntax=docker/dockerfile:1.8
1+ # syntax=docker/dockerfile:1
22# check=error=true
33
44ARG ALPINE_VERSION=3.21
@@ -16,41 +16,54 @@ RUN apk add --no-cache git clang lld cmake make python3 bash
1616COPY --link --from=xx / /
1717ARG LIBTAPI_VERSION
1818WORKDIR /work
19- RUN git clone https://github.com/tpoechtrager/apple-libtapi --depth 1 -b ${LIBTAPI_VERSION}
19+ ADD " https://github.com/tpoechtrager/apple-libtapi.git# ${LIBTAPI_VERSION}" apple-libtapi
2020WORKDIR apple-libtapi
2121RUN --mount=target=/tmp/libtapi-cmake-args.patch,source=libtapi-cmake-args.patch \
2222 git apply /tmp/libtapi-cmake-args.patch
2323RUN apk add --no-cache gcc g++
24- RUN NOMAKE=1 CMAKE_EXTRA_ARGS="$(xx-clang --print-cmake-defines) -DCMAKE_CXX_FLAGS=-D_LARGEFILE64_SOURCE" ./build.sh && \
25- cd build && \
26- make -j $(nproc) clang-tblgen llvm-tblgen && \
27- cp -a bin/clang-tblgen bin/llvm-tblgen /usr/bin/ && \
28- cd .. && rm -rf build
24+ RUN <<EOT
25+ set -ex
26+ NOMAKE=1 CMAKE_EXTRA_ARGS="$(xx-clang --print-cmake-defines) -DCMAKE_CXX_FLAGS=-D_LARGEFILE64_SOURCE" ./build.sh
27+ cd build
28+ make -j $(nproc) clang-tblgen llvm-tblgen
29+ cp -a bin/clang-tblgen bin/llvm-tblgen /usr/bin/
30+ cd ..
31+ rm -rf build
32+ EOT
2933
3034FROM libtapi-base AS libtapi
3135ARG TARGETPLATFORM
3236RUN xx-apk add g++
33- RUN INSTALLPREFIX=/opt/libtapi/ \
34- 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)" \
35- ./build.sh && ./install.sh && \
36- xx-verify /opt/libtapi/lib/libtapi.so && \
37- rm -rf build
37+ RUN <<EOT
38+ set -ex
39+ export INSTALLPREFIX=/opt/libtapi/
40+ 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
41+ ./install.sh
42+ xx-verify /opt/libtapi/lib/libtapi.so
43+ rm -rf build
44+ EOT
3845
3946FROM libtapi-base AS libtapi-static
4047ARG TARGETPLATFORM
4148RUN xx-apk add g++
42- RUN export INSTALLPREFIX=/opt/libtapi/ \
43- 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)" \
44- && sed -i s/SHARED/STATIC/g src/tapi/tools/libtapi/CMakeLists.txt && \
45- ./build.sh && cd build && make -j $(nproc) LLVMObject tapiCore LLVMSupport LLVMDemangle LLVMMC LLVMBinaryFormat tapiObjCMetadata tapiNoInits LLVMTextAPI install-tapi-headers && \
46- mkdir /opt/libtapi/lib && cp -a ./lib/*.a /opt/libtapi/lib/ && \
47- cd .. && rm -rf build
49+ RUN <<EOT
50+ set -x
51+ export INSTALLPREFIX=/opt/libtapi/
52+ sed -i s/SHARED/STATIC/g src/tapi/tools/libtapi/CMakeLists.txt
53+ 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
54+ cd build
55+ make -j $(nproc) LLVMObject tapiCore LLVMSupport LLVMDemangle LLVMMC LLVMBinaryFormat tapiObjCMetadata tapiNoInits LLVMTextAPI install-tapi-headers
56+ mkdir /opt/libtapi/lib
57+ cp -a ./lib/*.a /opt/libtapi/lib/
58+ cd ..
59+ rm -rf build
60+ EOT
4861
4962FROM --platform=$BUILDPLATFORM alpine:${ALPINE_VERSION} AS aports
5063RUN apk add git
5164WORKDIR /work
5265ARG APORTS_VERSION
53- RUN git clone --depth 1 -b ${APORTS_VERSION} https://github.com/alpinelinux/aports.git
66+ ADD " https://github.com/alpinelinux/aports.git#${APORTS_VERSION}" aports
5467
5568FROM scratch AS patches-binutils
5669COPY --from=aports /work/aports/main/binutils/*.patch /
@@ -64,19 +77,20 @@ RUN apk add git clang lld cmake samurai patch
6477ARG LIBDISPATCH_VERSION
6578COPY --link --from=xx / /
6679WORKDIR /work
67- RUN --mount=target=/patches,from=patches-libdispatch \
68- git clone -b ${LIBDISPATCH_VERSION} --depth 1 https://github.com/apple/swift-corelibs-libdispatch.git && \
69- cd swift-corelibs-libdispatch && \
70- for f in /patches/*; do patch -p1 < $f; done
80+ ADD "https://github.com/apple/swift-corelibs-libdispatch.git#${LIBDISPATCH_VERSION}" swift-corelibs-libdispatch
7181WORKDIR swift-corelibs-libdispatch
82+ RUN --mount=target=/patches,from=patches-libdispatch \
83+ for f in /patches/*; do patch -p1 < $f; done
7284ARG TARGETPLATFORM
7385RUN xx-apk add --no-cache gcc g++ musl-dev linux-headers bsd-compat-headers
74- 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 && \
75- cmake --build build && \
76- cmake --install build && \
77- rm -rf build
78- RUN ls -l /out/libdispatch/lib && \
79- [ -f /out/libdispatch/lib/libdispatch.a ] && [ -f /out/libdispatch/lib/libBlocksRuntime.a ]
86+ RUN <<EOT
87+ set -ex
88+ 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
89+ cmake --build build
90+ cmake --install build
91+ rm -rf build
92+ EOT
93+ RUN ls -l /out/libdispatch/lib && [ -f /out/libdispatch/lib/libdispatch.a ] && [ -f /out/libdispatch/lib/libBlocksRuntime.a ]
8094
8195FROM scratch AS libdispatch
8296COPY --from=libdispatch-base /out/libdispatch/lib/*.a /lib/
@@ -85,9 +99,8 @@ FROM --platform=${BUILDPLATFORM} alpine:${ALPINE_VERSION} AS cctools-base
8599RUN apk add --no-cache git clang lld make llvm llvm-dev libdispatch-dev
86100COPY --link --from=xx / /
87101WORKDIR /work
88- ARG CCTOOLS_REPO=https://github.com/tpoechtrager/cctools-port
89102ARG CCTOOLS_VERSION
90- RUN git clone $CCTOOLS_REPO -b $ {CCTOOLS_VERSION}
103+ ADD "https://github.com/tpoechtrager/cctools-port. git#$ {CCTOOLS_VERSION}" cctools-port
91104WORKDIR cctools-port/cctools
92105ARG TARGETPLATFORM
93106RUN --mount=target=/libdispatch,from=libdispatch \
@@ -96,53 +109,65 @@ RUN --mount=target=/libdispatch,from=libdispatch \
96109
97110FROM cctools-base AS lipo-base
98111ARG LIPO_CFLAGS="-Wl,-s -Os"
99- RUN export CFLAGS=${LIPO_CFLAGS} && \
100- ./configure --host=$(xx-clang --print-target-triple) LDFLAGS=--static && \
101- make -C libmacho && make -C libstuff && make -C misc lipo && \
102- xx-verify --static misc/lipo
112+ RUN <<EOT
113+ set -ex
114+ export CFLAGS=${LIPO_CFLAGS}
115+ ./configure --host=$(xx-clang --print-target-triple) LDFLAGS=--static
116+ make -C libmacho
117+ make -C libstuff
118+ make -C misc lipo
119+ xx-verify --static misc/lipo
120+ EOT
103121
104122FROM scratch AS lipo-static
105123COPY --from=lipo-base /work/cctools-port/cctools/misc/lipo /
106124
107125FROM cctools-base AS codesign-allocate-base
108126ARG CODESIGN_CFLAGS="-Wl,-s -Os"
109- RUN export CFLAGS=${CODESIGN_CFLAGS} && \
110- ./configure --host=$(xx-clang --print-target-triple) LDFLAGS=--static && \
111- make -C libmacho && make -C libstuff && make -C misc codesign_allocate && \
112- xx-verify --static misc/codesign_allocate
113-
127+ RUN <<EOT
128+ export CFLAGS=${CODESIGN_CFLAGS}
129+ ./configure --host=$(xx-clang --print-target-triple) LDFLAGS=--static
130+ make -C libmacho
131+ make -C libstuff
132+ make -C misc codesign_allocate
133+ xx-verify --static misc/codesign_allocate
134+ EOT
114135FROM scratch AS codesign-allocate-static
115136COPY --from=codesign-allocate-base /work/cctools-port/cctools/misc/codesign_allocate /
116137
117138FROM cctools-base AS ld64-static-base
118139# for LTO
119140RUN apk add llvm-dev
120141ARG LD64_CXXFLAGS="-Wl,-s -Os"
121- RUN --mount=from=libtapi-static,source=/opt/libtapi,target=/opt/libtapi \
122- export CXXFLAGS=${LD64_CXXFLAGS} && ./configure --with-libtapi=/opt/libtapi --host=$(xx-clang --print-target-triple) &&\
123- sed -i 's/-ltapi/-ltapi -ltapiCore -ltapiObjCMetadata -lLLVMObject -lLLVMTextAPI -lLLVMSupport -lLLVMDemangle -lLLVMMC -lLLVMBinaryFormat --static/' ld64/src/ld/Makefile && \
124- make -j $(nproc) -C ld64 && \
125- xx-verify --static ld64/src/ld/ld
126-
142+ RUN --mount=from=libtapi-static,source=/opt/libtapi,target=/opt/libtapi <<EOT
143+ set -ex
144+ export CXXFLAGS=${LD64_CXXFLAGS}
145+ ./configure --with-libtapi=/opt/libtapi --host=$(xx-clang --print-target-triple)
146+ sed -i 's/-ltapi/-ltapi -ltapiCore -ltapiObjCMetadata -lLLVMObject -lLLVMTextAPI -lLLVMSupport -lLLVMDemangle -lLLVMMC -lLLVMBinaryFormat --static/' ld64/src/ld/Makefile
147+ make -j $(nproc) -C ld64
148+ xx-verify --static ld64/src/ld/ld
149+ EOT
127150FROM --platform=${BUILDPLATFORM} alpine:${ALPINE_VERSION} AS sigtool-base
128151RUN apk add --no-cache git clang lld cmake make pkgconf
129152COPY --from=xx / /
130153WORKDIR /work
131154ARG SIGTOOL_VERSION
132- RUN git clone https://github.com/thefloweringash/sigtool && \
133- cd sigtool && \
134- git checkout ${SIGTOOL_VERSION}
155+ ADD "https://github.com/thefloweringash/sigtool.git#${SIGTOOL_VERSION}" sigtool
135156WORKDIR sigtool
136157RUN --mount=target=/tmp/sigtool-static.patch,source=sigtool-static.patch \
137158 git apply /tmp/sigtool-static.patch
138159ARG TARGETPLATFORM
139160RUN xx-apk add --no-cache g++ openssl-dev openssl-libs-static
140161ARG SIGTOOL_CXXFLAGS="-Wl,-s -Os"
141- RUN export CXXFLAGS=${SIGTOOL_CXXFLAGS} && \
142- mkdir build && cd build && \
143- cmake -DBUILD_SHARED_LIBS=False $(xx-clang --print-cmake-defines) -DCMAKE_EXE_LINKER_FLAGS=-static .. && \
144- make -j $(nproc) && \
145- xx-verify --static ./sigtool ./codesign
162+ RUN <<EOT
163+ set -ex
164+ export CXXFLAGS=${SIGTOOL_CXXFLAGS}
165+ mkdir build
166+ cd build
167+ cmake -DBUILD_SHARED_LIBS=False $(xx-clang --print-cmake-defines) -DCMAKE_EXE_LINKER_FLAGS=-static ..
168+ make -j $(nproc)
169+ xx-verify --static ./sigtool ./codesign
170+ EOT
146171
147172FROM scratch AS sigtool-static
148173COPY --link --from=codesign-allocate-static / /
@@ -174,13 +199,15 @@ FROM cctools-base AS cctools-build
174199RUN apk add llvm-dev
175200ARG CCTOOLS_CXXFLAGS="-Wl,-s -Os"
176201ARG CCTOOLS_CFLAGS="-Wl,-s -Os"
177- RUN --mount=from=libtapi,source=/opt/libtapi,target=/opt/libtapi \
178- # copy to /usr/bin for clean rpath. TODO: try static build
179- cp -a /opt/libtapi/. /usr/ && \
180- export CFLAGS=${CCTOOLS_CFLAGS} CXXFLAGS=${CCTOOLS_CXXFLAGS} && \
181- ./configure --prefix=/opt/cctools --with-libtapi=/opt/libtapi --host=$(xx-clang --print-target-triple) && \
182- make -j $(nproc) install && \
183- xx-verify /opt/cctools/bin/ld
202+ RUN --mount=from=libtapi,source=/opt/libtapi,target=/opt/libtapi <<EOT
203+ set -ex
204+ # copy to /usr/bin for clean rpath. TODO: try static build
205+ cp -a /opt/libtapi/. /usr/
206+ export CFLAGS=${CCTOOLS_CFLAGS} CXXFLAGS=${CCTOOLS_CXXFLAGS}
207+ ./configure --prefix=/opt/cctools --with-libtapi=/opt/libtapi --host=$(xx-clang --print-target-triple)
208+ make -j $(nproc) install
209+ xx-verify /opt/cctools/bin/ld
210+ EOT
184211
185212FROM scratch AS cctools
186213COPY --link --from=libtapi /opt/libtapi/lib/*.so /usr/lib/
@@ -193,17 +220,22 @@ WORKDIR /work
193220COPY --link --from=xx / /
194221COPY --link --from=patches-binutils / patches/
195222ARG BINUTILS_VERSION
196- RUN wget https://ftp.gnu. org/gnu /binutils/binutils-${BINUTILS_VERSION}.tar.gz
223+ RUN wget https://sourceware. org/pub /binutils/releases /binutils-${BINUTILS_VERSION}.tar.gz
197224ARG TARGETPLATFORM
198225# first build version for current architecture that is used then cross compiling
199- RUN export CC=xx-clang CXX=xx-clang++ LD=lld BINUTILS_TARGET=${TARGETPLATFORM} && unset TARGETPLATFORM && \
200- tar xf binutils-${BINUTILS_VERSION}.tar.gz && \
201- cd binutils-${BINUTILS_VERSION} && \
202- for f in ../patches/*; do patch -p1 < $f; done && \
203- ./configure --disable-separate-code --libdir=/lib --prefix=/usr --disable-multilib --enable-deterministic-archives --target=$(TARGETPLATFORM=$BINUTILS_TARGET xx-info) --disable-nls --disable-gprofng && \
204- make -j $(nproc) && \
205- make install && \
206- cd .. && rm -rf binutils-${BINUTILS_VERSION}
226+ RUN <<EOT
227+ set -ex
228+ export CC=xx-clang CXX=xx-clang++ LD=lld BINUTILS_TARGET=${TARGETPLATFORM}
229+ unset TARGETPLATFORM
230+ tar xf binutils-${BINUTILS_VERSION}.tar.gz
231+ cd binutils-${BINUTILS_VERSION}
232+ for f in ../patches/*; do patch -p1 < $f; done
233+ ./configure --disable-separate-code --libdir=/lib --prefix=/usr --disable-multilib --enable-deterministic-archives --target=$(TARGETPLATFORM=$BINUTILS_TARGET xx-info) --disable-nls --disable-gprofng
234+ make -j $(nproc)
235+ make install
236+ cd ..
237+ rm -rf binutils-${BINUTILS_VERSION}
238+ EOT
207239RUN xx-apk add --no-cache musl-dev gcc g++ zlib-dev zstd-dev
208240
209241FROM binutils-base0 AS ld-base
@@ -215,18 +247,42 @@ ARG LD_TARGET=${TARGETOS}-${TARGETARCH}${TARGETVARIANT}
215247ARG LD_CFLAGS="-Wl,-s -Os"
216248# BINUTILS_CONFIG defines extra options passed to binutils configure script
217249ARG BINUTILS_CONFIG=
218- 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 && \
219- tar xf binutils-${BINUTILS_VERSION}.tar.gz && \
220- cd binutils-${BINUTILS_VERSION} && \
221- for f in ../patches/*; do patch -p1 < $f; done && \
222- ./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 && \
223- make -j $(nproc) && \
224- make install && \
225- cd .. && rm -rf binutils-${BINUTILS_VERSION} && \
226- xx-verify --static /$LD_TARGET_TRIPLE/bin/ld && \
227- mkdir -p /out && mv /$LD_TARGET_TRIPLE/bin/ld /out/$LD_TARGET-ld && \
228- mkdir -p /out/ldscripts && mv /$LD_TARGET_TRIPLE/lib/ldscripts/* /out/ldscripts/
229-
250+ RUN <<EOT
251+ set -ex
252+ 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
253+ tar xf binutils-${BINUTILS_VERSION}.tar.gz
254+ cd binutils-${BINUTILS_VERSION}
255+ for f in ../patches/*; do patch -p1 < $f; done
256+ ./configure \
257+ --disable-separate-code \
258+ --libdir=/lib \
259+ --prefix=/ \
260+ --disable-multilib \
261+ --enable-deterministic-archives \
262+ --target=$LD_TARGET_TRIPLE \
263+ --host=$(xx-clang --print-target-triple) \
264+ --disable-nls \
265+ --disable-gold \
266+ --enable-relro \
267+ --disable-plugins \
268+ --with-pic \
269+ --with-mmap \
270+ --with-system-zlib \
271+ --disable-gas \
272+ --disable-elfcpp \
273+ --disable-binutils \
274+ --disable-gprofng \
275+ $BINUTILS_CONFIG
276+ make -j $(nproc)
277+ make install
278+ cd ..
279+ rm -rf binutils-${BINUTILS_VERSION}
280+ xx-verify --static /$LD_TARGET_TRIPLE/bin/ld
281+ mkdir -p /out
282+ mv /$LD_TARGET_TRIPLE/bin/ld /out/$LD_TARGET-ld
283+ mkdir -p /out/ldscripts
284+ mv /$LD_TARGET_TRIPLE/lib/ldscripts/* /out/ldscripts/
285+ EOT
230286FROM ld-base AS ld-tgz-base
231287ARG TARGETOS TARGETARCH TARGETVARIANT
232288ARG LD_TARGET
@@ -247,15 +303,38 @@ ARG BINUTILS_TARGET=${TARGETOS}-${TARGETARCH}${TARGETVARIANT}
247303ARG BINUTILS_CFLAGS="-Wl,-s -Os"
248304# BINUTILS_CONFIG defines extra options passed to binutils configure script
249305ARG BINUTILS_CONFIG=
250- RUN export CC=xx-clang CXX=xx-clang++ CFLAGS="$BINUTILS_CFLAGS" CXXFLAGS="$BINUTILS_CFLAGS" && \
251- tar xf binutils-${BINUTILS_VERSION}.tar.gz && \
252- cd binutils-${BINUTILS_VERSION} && \
253- for f in ../patches/*; do patch -p1 < $f; done && \
254- ./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 && \
255- make -j $(nproc) && \
256- make install && \
257- cd .. && rm -rf binutils-${BINUTILS_VERSION} && \
258- for f in /out/bin/*; do xx-verify $f; done
259-
306+ RUN <<EOT
307+ set -ex
308+ export CC=xx-clang CXX=xx-clang++ CFLAGS="$BINUTILS_CFLAGS" CXXFLAGS="$BINUTILS_CFLAGS"
309+ tar xf binutils-${BINUTILS_VERSION}.tar.gz
310+ cd binutils-${BINUTILS_VERSION}
311+ for f in ../patches/*; do patch -p1 < $f; done
312+ ./configure \
313+ --disable-separate-code \
314+ --libdir=/lib \
315+ --prefix=/out \
316+ --disable-multilib \
317+ --enable-deterministic-archives \
318+ --target=$(TARGETPLATFORM= TARGETPAIR=$BINUTILS_TARGET xx-info) \
319+ --host=$(xx-clang --print-target-triple) \
320+ --disable-nls \
321+ --enable-gold \
322+ --enable-relro \
323+ --enable-plugins \
324+ --with-pic \
325+ --with-mmap \
326+ --with-system-zlib \
327+ --disable-gprofng \
328+ $BINUTILS_CONFIG
329+ make -j $(nproc)
330+ make install
331+ cd ..
332+ rm -rf binutils-${BINUTILS_VERSION}
333+ for f in /out/bin/*; do
334+ if ! file "$f" | grep -q 'ASCII text' ; then
335+ xx-verify $f
336+ fi
337+ done
338+ EOT
260339FROM scratch AS binutils
261340COPY --from=binutils-base /out /usr/
0 commit comments