3
3
set -e
4
4
set -o pipefail
5
5
6
- while getopts " :dpa:snt:xbc:h " opt; do
6
+ while getopts " :dpa:snt:xbc:hu " opt; do
7
7
case " ${opt} " in
8
8
d )
9
9
export BUILD_TARGET=" deps"
@@ -37,6 +37,9 @@ while getopts ":dpa:snt:xbc:h" opt; do
37
37
1 )
38
38
export CMAKE_BUILD_PARALLEL_LEVEL=1
39
39
;;
40
+ u )
41
+ export BUILD_UNIVERSAL=" 1"
42
+ ;;
40
43
h ) echo " Usage: ./build_release_macos.sh [-d]"
41
44
echo " -d: Build deps only"
42
45
echo " -a: Set ARCHITECTURE (arm64 or x86_64)"
@@ -46,6 +49,7 @@ while getopts ":dpa:snt:xbc:h" opt; do
46
49
echo " -x: Use Ninja CMake generator, default is Xcode"
47
50
echo " -b: Build without reconfiguring CMake"
48
51
echo " -c: Set CMake build configuration, default is Release"
52
+ echo " -u: Build universal binary (both arm64 and x86_64)"
49
53
echo " -1: Use single job for building"
50
54
exit 0
51
55
;;
57
61
# Set defaults
58
62
59
63
if [ -z " $ARCH " ]; then
60
- ARCH=" $( uname -m) "
64
+ if [ " 1." == " $BUILD_UNIVERSAL " . ]; then
65
+ ARCH=" universal"
66
+ else
67
+ ARCH=" $( uname -m) "
68
+ fi
61
69
export ARCH
62
70
fi
63
71
72
+ if [ " 1." == " $BUILD_UNIVERSAL " . ]; then
73
+ echo " Universal build enabled - will create a combined arm64/x86_64 binary"
74
+ fi
75
+
64
76
if [ -z " $BUILD_CONFIG " ]; then
65
77
export BUILD_CONFIG=" Release"
66
78
fi
@@ -205,16 +217,71 @@ function build_slicer() {
205
217
# zip -FSr OrcaSlicer${ver}_Mac_${ARCH}.zip OrcaSlicer.app
206
218
}
207
219
220
+ function build_universal() {
221
+ echo " Building universal binary..."
222
+ # Save current ARCH
223
+ ORIGINAL_ARCH=" $ARCH "
224
+
225
+ # Build x86_64
226
+ ARCH=" x86_64"
227
+ PROJECT_BUILD_DIR=" $PROJECT_DIR /build_$ARCH "
228
+ DEPS_BUILD_DIR=" $DEPS_DIR /build_$ARCH "
229
+ DEPS=" $DEPS_BUILD_DIR /OrcaSlicer_dep_$ARCH "
230
+ build_deps
231
+ build_slicer
232
+
233
+ # Build arm64
234
+ ARCH=" arm64"
235
+ PROJECT_BUILD_DIR=" $PROJECT_DIR /build_$ARCH "
236
+ DEPS_BUILD_DIR=" $DEPS_DIR /build_$ARCH "
237
+ DEPS=" $DEPS_BUILD_DIR /OrcaSlicer_dep_$ARCH "
238
+ build_deps
239
+ build_slicer
240
+
241
+ # Restore original ARCH
242
+ ARCH=" $ORIGINAL_ARCH "
243
+ PROJECT_BUILD_DIR=" $PROJECT_DIR /build_$ARCH "
244
+ DEPS_BUILD_DIR=" $DEPS_DIR /build_$ARCH "
245
+ DEPS=" $DEPS_BUILD_DIR /OrcaSlicer_dep_$ARCH "
246
+
247
+ # Create universal binary
248
+ echo " Creating universal binary..."
249
+ PROJECT_BUILD_DIR=" $PROJECT_DIR /build_Universal"
250
+ mkdir -p " $PROJECT_BUILD_DIR /OrcaSlicer"
251
+ UNIVERSAL_APP=" $PROJECT_BUILD_DIR /OrcaSlicer/Universal_OrcaSlicer.app"
252
+ rm -rf " $UNIVERSAL_APP "
253
+ cp -R " $PROJECT_DIR /build_x86_64/OrcaSlicer/OrcaSlicer.app" " $UNIVERSAL_APP "
254
+
255
+ # Get the binary path inside the .app bundle
256
+ BINARY_PATH=" Contents/MacOS/OrcaSlicer"
257
+
258
+ # Create universal binary using lipo
259
+ lipo -create \
260
+ " $PROJECT_DIR /build_x86_64/OrcaSlicer/OrcaSlicer.app/$BINARY_PATH " \
261
+ " $PROJECT_DIR /build_arm64/OrcaSlicer/OrcaSlicer.app/$BINARY_PATH " \
262
+ -output " $UNIVERSAL_APP /$BINARY_PATH "
263
+
264
+ echo " Universal binary created at $UNIVERSAL_APP "
265
+ }
266
+
208
267
case " ${BUILD_TARGET} " in
209
268
all)
210
- build_deps
211
- build_slicer
269
+ if [ " 1." == " $BUILD_UNIVERSAL " . ]; then
270
+ build_universal
271
+ else
272
+ build_deps
273
+ build_slicer
274
+ fi
212
275
;;
213
276
deps)
214
277
build_deps
215
278
;;
216
279
slicer)
217
- build_slicer
280
+ if [ " 1." == " $BUILD_UNIVERSAL " . ]; then
281
+ build_universal
282
+ else
283
+ build_slicer
284
+ fi
218
285
;;
219
286
* )
220
287
echo " Unknown target: $BUILD_TARGET . Available targets: deps, slicer, all."
0 commit comments