-
Notifications
You must be signed in to change notification settings - Fork 1
/
Earthfile
274 lines (250 loc) · 10.4 KB
/
Earthfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
VERSION 0.8
FROM ubuntu:jammy
WORKDIR /workspace
ci:
BUILD +test --download_sdk=true
BUILD +image --download_sdk=true
deps:
RUN apt update -y
RUN apt install -y build-essential cmake clang git
xar:
FROM +deps
ARG --required target_sdk_version
RUN apt install -y libxml2-dev libssl-dev zlib1g-dev
GIT CLONE https://github.com/tpoechtrager/xar .
WORKDIR xar
ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version
RUN ./configure --prefix=/xar
RUN make -j
RUN make install
SAVE ARTIFACT /xar/*
libtapi:
FROM +deps
RUN apt install -y python3
ARG --required target_sdk_version
ARG version=1100.0.11
GIT CLONE --branch $version https://github.com/tpoechtrager/apple-libtapi .
ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version
ENV INSTALLPREFIX=/libtapi
RUN ./build.sh
RUN ./install.sh
SAVE ARTIFACT /libtapi/*
cctools:
ARG --required architecture
ARG --required kernel_version
ARG --required target_sdk_version
# autoconf does not recognize aarch64 -- use arm instead
# https://github.com/tpoechtrager/cctools-port/issues/6
IF [ $architecture = "aarch64" ]
ARG triple=arm-apple-darwin$kernel_version
ELSE
ARG triple=$architecture-apple-darwin$kernel_version
END
FROM +deps
RUN apt install -y llvm-dev uuid-dev rename
ARG cctools_version=973.0.1
ARG linker_verison=609
GIT CLONE --branch $cctools_version-ld64-$linker_verison https://github.com/tpoechtrager/cctools-port .
COPY (+xar/ --target_sdk_version=$target_sdk_version) /xar
COPY (+libtapi/ --target_sdk_version=$target_sdk_version) /libtapi
WORKDIR cctools
ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version
RUN ./configure \
--prefix=/cctools \
--with-libtapi=/libtapi \
--with-libxar=/libxar \
--target=$triple
# now that we've tricked autoconf by pretending to build for arm, let's _actually_ build for arm64
# https://github.com/tpoechtrager/cctools-port/issues/6
RUN find . -name Makefile -print0 | xargs -0 sed -i "s/arm-apple-darwin$kernel_version/arm64-apple-darwin$kernel_version/g"
RUN make -j
RUN make install
# link aarch64 artifacts so that the target triple is consistent with what clang/gcc will expect
IF [ $architecture = "aarch64" ]
FOR file IN $(ls /cctools/bin/*)
RUN /bin/bash -c "ln -s $file \${file/arm64/"aarch64"} "
END
END
ENV PATH=$PATH:/cctools/bin
SAVE ARTIFACT /cctools/*
wrapper:
ARG --required sdk_version
ARG --required kernel_version
ARG --required target_sdk_version
FROM +deps
RUN apt install -y
GIT CLONE https://github.com/tpoechtrager/osxcross .
WORKDIR wrapper
ENV VERSION=1.4
ENV SDK_VERSION=$sdk_version
ENV TARGET=darwin$kernel_version
ENV LINKER_VERSION=609
ENV X86_64H_SUPPORTED=0
ENV I386_SUPPORTED=0
ENV ARM_SUPPORTED=1
ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version
RUN make wrapper -j
wrapper.clang:
ARG --required sdk_version
ARG --required kernel_version
ARG --required target_sdk_version
FROM +wrapper --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version
ARG compilers=clang clang++
FOR compiler IN $compilers
ENV TARGETCOMPILER=$compiler
ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version
RUN ./build_wrapper.sh
END
SAVE ARTIFACT /workspace/target/*
wrapper.gcc:
ARG --required sdk_version
ARG --required kernel_version
ARG --required target_sdk_version
FROM +wrapper --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version
ARG compilers=gcc g++ gfortran
FOR compiler IN $compilers
ENV TARGETCOMPILER=$compiler
ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version
RUN ./build_wrapper.sh
END
SAVE ARTIFACT /workspace/target/*
sdk.download:
RUN apt update
RUN apt install -y wget
ARG --required version
RUN wget https://github.com/joseluisq/macosx-sdks/releases/download/$version/MacOSX$version.sdk.tar.xz
SAVE ARTIFACT MacOSX$version.sdk.tar.xz
sdk:
ARG --required version
ARG --required download_sdk
FROM +deps
IF [ $download_sdk = "true" ]
COPY (+sdk.download/MacOSX$version.sdk.tar.xz --version=$version) .
RUN tar -xf MacOSX$version.sdk.tar.xz
RUN mv MacOSX*.sdk MacOSX$version.sdk
ELSE
COPY sdks/MacOSX$version.sdk.tar.xz .
RUN tar -xf MacOSX$version.sdk.tar.xz
END
SAVE ARTIFACT MacOSX$version.sdk/*
gcc:
ARG --required download_sdk
ARG --required architecture
ARG --required sdk_version
ARG --required kernel_version
ARG --required target_sdk_version
ARG triple=$architecture-apple-darwin$kernel_version
FROM +deps
RUN apt install -y gcc g++ zlib1g-dev libmpc-dev libmpfr-dev libgmp-dev flex file
# TODO: this shouldn't be needed
RUN apt-get install -y --force-yes llvm-dev libxml2-dev uuid-dev libssl-dev bash patch make tar xz-utils bzip2 gzip sed cpio libbz2-dev zlib1g-dev
IF [ $architecture = "aarch64" ]
GIT CLONE https://github.com/iains/gcc-13-branch gcc
ELSE IF [ $architecture = "x86_64" ]
GIT CLONE --branch releases/gcc-12.3.0 https://github.com/gcc-mirror/gcc gcc
ELSE
RUN false
END
COPY (+wrapper.clang/ --kernel_version=$kernel_version --sdk_version=$sdk_version --target_sdk_version=$target_sdk_version) /osxcross
ENV PATH=$PATH:/osxcross/bin
COPY (+cctools/ --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version) /cctools
ENV PATH=$PATH:/cctools/bin
COPY (+sdk/ --version=$sdk_version --download_sdk=$download_sdk) /sdk
RUN mkdir -p /osxcross/SDK
RUN ln -s /sdk /osxcross/SDK/MacOSX$sdk_version.sdk
# TODO: I think we can remove these
COPY (+xar/ --target_sdk_version=$target_sdk_version) /sdk/usr
COPY (+libtapi/ --target_sdk_version=$target_sdk_version) /sdk/usr
COPY (+xar/lib --target_sdk_version=$target_sdk_version) /usr/local/lib
COPY (+libtapi/lib --target_sdk_version=$target_sdk_version) /usr/local/lib
RUN ldconfig
# GCC requires that you build in a directory that is not a subdirectory of the source code
# https://gcc.gnu.org/install/configure.html
WORKDIR build
# this being set is very important! we'll be building iphone binaries otherwise.
ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version
RUN ../gcc/configure \
--target=$triple \
--with-sysroot=/sdk \
--disable-nls \
--enable-languages=c,c++,fortran,objc,obj-c++ \
--without-headers \
--enable-lto \
--enable-checking=release \
--disable-libstdcxx-pch \ # TODO: maybe enable this
--prefix=/gcc \
--with-system-zlib \
--disable-multilib \
--with-ld=/cctools/bin/$triple-ld \
--with-as=/cctools/bin/$triple-as
RUN make -j
RUN make install
SAVE ARTIFACT /gcc/*
image:
ARG architectures=aarch64 x86_64
ARG sdk_version=13.0
ARG kernel_version=22
ARG target_sdk_version=11
ARG download_sdk=false
FROM ubuntu:jammy
COPY (+sdk/ --version=$sdk_version --download_sdk=$download_sdk) /osxcross/SDK/MacOSX$sdk_version.sdk/
RUN ln -s /osxcross/SDK/MacOSX$sdk_version.sdk/ /sdk
RUN apt update
# this is the clang we'll actually be using to compile stuff with!
RUN apt install -y clang
# for gcc
RUN apt install -y libmpc-dev libmpfr-dev
FOR architecture IN $architectures
ENV triple=$architecture-apple-darwin$kernel_version
COPY (+cctools/ --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version) /cctools
COPY (+gcc/ --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /gcc
COPY (+wrapper.clang/ --kernel_version=$kernel_version --sdk_version=$sdk_version --target_sdk_version=$target_sdk_version) /osxcross
COPY (+wrapper.gcc/ --kernel_version=$kernel_version --sdk_version=$sdk_version --target_sdk_version=$target_sdk_version) /osxcross
COPY (+gcc/lib --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /usr/local/lib
COPY (+gcc/include --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /usr/local/include
COPY (+gcc/$triple/lib --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /usr/local/lib
COPY (+gcc/$triple/include --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /usr/local/include
END
COPY (+xar/lib --target_sdk_version=$target_sdk_version) /usr/local/lib
COPY (+libtapi/lib --target_sdk_version=$target_sdk_version) /usr/local/lib
RUN ldconfig
ENV PATH=$PATH:/gcc/bin
ENV PATH=$PATH:/cctools/bin
ENV PATH=$PATH:/osxcross/bin
ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version
WORKDIR /workspace
SAVE IMAGE --push ghcr.io/shepherdjerred/macos-cross-compiler:latest
test:
ARG architectures=aarch64 x86_64
ARG sdk_version=13.0
ARG kernel_version=22
ARG target_sdk_version=11
ARG download_sdk=false
FROM +image --architectures=$architectures --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk
RUN apt install -y file
COPY +samples/ samples/
FOR architecture IN $architectures
ENV triple=$architecture-apple-darwin$kernel_version
RUN $triple-clang --target=$triple samples/hello.c -o hello-clang
RUN $triple-clang++ --target=$triple samples/hello.cpp -o hello-clang++
RUN $triple-gcc samples/hello.c -o hello-gcc
RUN $triple-g++ samples/hello.cpp -o hello-g++
RUN $triple-gfortran samples/hello.f90 -o hello-gfortran
IF [ "$architecture" = "aarch64" ]
RUN file hello-clang | grep -q "arm64 executable"
RUN file hello-clang++ | grep -q "arm64 executable"
RUN file hello-gcc | grep -q "arm64 executable"
RUN file hello-g++ | grep -q "arm64 executable"
RUN file hello-gfortran | grep -q "arm64 executable"
ELSE
RUN file hello-clang | grep -q "$architecture executable"
RUN file hello-clang++ | grep -q "$architecture executable"
RUN file hello-gcc | grep -q "$architecture executable"
RUN file hello-g++ | grep -q "$architecture executable"
RUN file hello-gfortran | grep -q "$architecture executable"
END
END
samples:
FROM ubuntu:jammy
COPY samples/ samples
SAVE ARTIFACT samples/*