1#! /bin/sh
2
3export PREFIX="$(pwd)/libsodium-apple"
4export MACOS_ARM64_PREFIX="${PREFIX}/tmp/macos-arm64"
5export MACOS_X86_64_PREFIX="${PREFIX}/tmp/macos-x86_64"
6export IOS32_PREFIX="${PREFIX}/tmp/ios32"
7export IOS32s_PREFIX="${PREFIX}/tmp/ios32s"
8export IOS64_PREFIX="${PREFIX}/tmp/ios64"
9export IOS_SIMULATOR_ARM64_PREFIX="${PREFIX}/tmp/ios-simulator-arm64"
10export IOS_SIMULATOR_I386_PREFIX="${PREFIX}/tmp/ios-simulator-i386"
11export IOS_SIMULATOR_X86_64_PREFIX="${PREFIX}/tmp/ios-simulator-x86_64"
12export WATCHOS32_PREFIX="${PREFIX}/tmp/watchos32"
13export WATCHOS64_32_PREFIX="${PREFIX}/tmp/watchos64_32"
14export WATCHOS_SIMULATOR_ARM64_PREFIX="${PREFIX}/tmp/watchos-simulator-arm64"
15export WATCHOS_SIMULATOR_I386_PREFIX="${PREFIX}/tmp/watchos-simulator-i386"
16export WATCHOS_SIMULATOR_X86_64_PREFIX="${PREFIX}/tmp/watchos-simulator-x86_64"
17export TVOS64_PREFIX="${PREFIX}/tmp/tvos64"
18export TVOS_SIMULATOR_ARM64_PREFIX="${PREFIX}/tmp/tvos-simulator-arm64"
19export TVOS_SIMULATOR_X86_64_PREFIX="${PREFIX}/tmp/tvos-simulator-x86_64"
20export CATALYST_ARM64_PREFIX="${PREFIX}/tmp/catalyst-arm64"
21export CATALYST_X86_64_PREFIX="${PREFIX}/tmp/catalyst-x86_64"
22export LOG_FILE="${PREFIX}/tmp/build_log"
23export XCODEDIR="$(xcode-select -p)"
24
25export MACOS_VERSION_MIN=${MACOS_VERSION_MIN-"10.10"}
26export IOS_SIMULATOR_VERSION_MIN=${IOS_SIMULATOR_VERSION_MIN-"9.0.0"}
27export IOS_VERSION_MIN=${IOS_VERSION_MIN-"9.0.0"}
28export WATCHOS_SIMULATOR_VERSION_MIN=${WATCHOS_SIMULATOR_VERSION_MIN-"4.0.0"}
29export WATCHOS_VERSION_MIN=${WATCHOS_VERSION_MIN-"4.0.0"}
30export TVOS_SIMULATOR_VERSION_MIN=${TVOS_SIMULATOR_VERSION_MIN-"9.0.0"}
31export TVOS_VERSION_MIN=${TVOS_VERSION_MIN-"9.0.0"}
32
33echo
34echo "Warnings related to headers being present but not usable are due to functions"
35echo "that didn't exist in the specified minimum iOS version level."
36echo "They can be safely ignored."
37echo
38
39if [ -z "$LIBSODIUM_FULL_BUILD" ]; then
40  export LIBSODIUM_ENABLE_MINIMAL_FLAG="--enable-minimal"
41else
42  export LIBSODIUM_ENABLE_MINIMAL_FLAG=""
43fi
44
45APPLE_SILICON_SUPPORTED=false
46echo 'int main(void){return 0;}' >comptest.c && cc --target=arm64-macos comptest.c 2>/dev/null && APPLE_SILICON_SUPPORTED=true
47rm -f comptest.c
48
49NPROCESSORS=$(getconf NPROCESSORS_ONLN 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null)
50PROCESSORS=${NPROCESSORS:-3}
51
52swift_module_map() {
53  echo 'module Clibsodium {'
54  echo '    header "sodium.h"'
55  echo '    export *'
56  echo '}'
57}
58
59build_macos() {
60  export BASEDIR="${XCODEDIR}/Platforms/MacOSX.platform/Developer"
61  export PATH="${BASEDIR}/usr/bin:$BASEDIR/usr/sbin:$PATH"
62
63  ## macOS arm64
64  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
65    export CFLAGS="-O2 -arch arm64 -mmacosx-version-min=${MACOS_VERSION_MIN}"
66    export LDFLAGS="-arch arm64 -mmacosx-version-min=${MACOS_VERSION_MIN}"
67
68    make distclean >/dev/null 2>&1
69    ./configure --host=arm-apple-darwin20 --prefix="$MACOS_ARM64_PREFIX" \
70      ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
71    make -j${PROCESSORS} install || exit 1
72  fi
73
74  ## macOS x86_64
75  export CFLAGS="-O2 -arch x86_64 -mmacosx-version-min=${MACOS_VERSION_MIN}"
76  export LDFLAGS="-arch x86_64 -mmacosx-version-min=${MACOS_VERSION_MIN}"
77
78  make distclean >/dev/null 2>&1
79  ./configure --host=x86_64-apple-darwin10 --prefix="$MACOS_X86_64_PREFIX" \
80    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
81  make -j${PROCESSORS} install || exit 1
82}
83
84build_ios() {
85  export BASEDIR="${XCODEDIR}/Platforms/iPhoneOS.platform/Developer"
86  export PATH="${BASEDIR}/usr/bin:$BASEDIR/usr/sbin:$PATH"
87  export SDK="${BASEDIR}/SDKs/iPhoneOS.sdk"
88
89  ## 32-bit iOS
90  export CFLAGS="-fembed-bitcode -O2 -mthumb -arch armv7 -isysroot ${SDK} -mios-version-min=${IOS_VERSION_MIN}"
91  export LDFLAGS="-fembed-bitcode -mthumb -arch armv7 -isysroot ${SDK} -mios-version-min=${IOS_VERSION_MIN}"
92
93  make distclean >/dev/null 2>&1
94  ./configure --host=arm-apple-darwin10 --prefix="$IOS32_PREFIX" \
95    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
96  make -j${PROCESSORS} install || exit 1
97
98  ## 32-bit armv7s iOS
99  export CFLAGS="-fembed-bitcode -O2 -mthumb -arch armv7s -isysroot ${SDK} -mios-version-min=${IOS_VERSION_MIN}"
100  export LDFLAGS="-fembed-bitcode -mthumb -arch armv7s -isysroot ${SDK} -mios-version-min=${IOS_VERSION_MIN}"
101
102  make distclean >/dev/null 2>&1
103  ./configure --host=arm-apple-darwin10 --prefix="$IOS32s_PREFIX" \
104    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
105  make -j${PROCESSORS} install || exit 1
106
107  ## 64-bit iOS
108  export CFLAGS="-fembed-bitcode -O2 -arch arm64 -isysroot ${SDK} -mios-version-min=${IOS_VERSION_MIN}"
109  export LDFLAGS="-fembed-bitcode -arch arm64 -isysroot ${SDK} -mios-version-min=${IOS_VERSION_MIN}"
110
111  make distclean >/dev/null 2>&1
112  ./configure --host=arm-apple-darwin10 --prefix="$IOS64_PREFIX" \
113    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
114  make -j${PROCESSORS} install || exit 1
115}
116
117build_ios_simulator() {
118  export BASEDIR="${XCODEDIR}/Platforms/iPhoneSimulator.platform/Developer"
119  export PATH="${BASEDIR}/usr/bin:$BASEDIR/usr/sbin:$PATH"
120  export SDK="${BASEDIR}/SDKs/iPhoneSimulator.sdk"
121
122  ## arm64 simulator
123  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
124    export CFLAGS="-fembed-bitcode -O2 -arch arm64 -isysroot ${SDK} -mios-simulator-version-min=${IOS_SIMULATOR_VERSION_MIN}"
125    export LDFLAGS="-fembed-bitcode -arch arm64 -isysroot ${SDK} -mios-simulator-version-min=${IOS_SIMULATOR_VERSION_MIN}"
126
127    make distclean >/dev/null 2>&1
128    ./configure --host=arm-apple-darwin20 --prefix="$IOS_SIMULATOR_ARM64_PREFIX" \
129      ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
130    make -j${PROCESSORS} install || exit 1
131  fi
132
133  ## i386 simulator
134  export CFLAGS="-fembed-bitcode -O2 -arch i386 -isysroot ${SDK} -mios-simulator-version-min=${IOS_SIMULATOR_VERSION_MIN}"
135  export LDFLAGS="-fembed-bitcode -arch i386 -isysroot ${SDK} -mios-simulator-version-min=${IOS_SIMULATOR_VERSION_MIN}"
136
137  make distclean >/dev/null 2>&1
138  ./configure --host=i686-apple-darwin10 --prefix="$IOS_SIMULATOR_I386_PREFIX" \
139    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
140  make -j${PROCESSORS} install || exit 1
141
142  ## x86_64 simulator
143  export CFLAGS="-fembed-bitcode -O2 -arch x86_64 -isysroot ${SDK} -mios-simulator-version-min=${IOS_SIMULATOR_VERSION_MIN}"
144  export LDFLAGS="-fembed-bitcode -arch x86_64 -isysroot ${SDK} -mios-simulator-version-min=${IOS_SIMULATOR_VERSION_MIN}"
145
146  make distclean >/dev/null 2>&1
147  ./configure --host=x86_64-apple-darwin10 --prefix="$IOS_SIMULATOR_X86_64_PREFIX" \
148    ${LIBSODIUM_ENABLE_MINIMAL_FLAG}
149  make -j${PROCESSORS} install || exit 1
150}
151
152build_watchos() {
153  export BASEDIR="${XCODEDIR}/Platforms/WatchOS.platform/Developer"
154  export PATH="${BASEDIR}/usr/bin:$BASEDIR/usr/sbin:$PATH"
155  export SDK="${BASEDIR}/SDKs/WatchOS.sdk"
156
157  # 32-bit watchOS
158  export CFLAGS="-fembed-bitcode -O2 -mthumb -arch armv7k -isysroot ${SDK} -mwatchos-version-min=${WATCHOS_VERSION_MIN}"
159  export LDFLAGS="-fembed-bitcode -mthumb -arch armv7k -isysroot ${SDK} -mwatchos-version-min=${WATCHOS_VERSION_MIN}"
160
161  make distclean >/dev/null 2>&1
162  ./configure --host=arm-apple-darwin10 --prefix="$WATCHOS32_PREFIX" \
163    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
164  make -j${PROCESSORS} install || exit 1
165
166  ## 64-bit arm64_32 watchOS
167  export CFLAGS="-fembed-bitcode -O2 -mthumb -arch arm64_32 -isysroot ${SDK} -mwatchos-version-min=${WATCHOS_VERSION_MIN}"
168  export LDFLAGS="-fembed-bitcode -mthumb -arch arm64_32 -isysroot ${SDK} -mwatchos-version-min=${WATCHOS_VERSION_MIN}"
169
170  make distclean >/dev/null 2>&1
171  ./configure --host=arm-apple-darwin10 --prefix="$WATCHOS64_32_PREFIX" \
172    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
173  make -j${PROCESSORS} install || exit 1
174}
175
176build_watchos_simulator() {
177  export BASEDIR="${XCODEDIR}/Platforms/WatchSimulator.platform/Developer"
178  export PATH="${BASEDIR}/usr/bin:$BASEDIR/usr/sbin:$PATH"
179  export SDK="${BASEDIR}/SDKs/WatchSimulator.sdk"
180
181  ## arm64 simulator
182  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
183    export CFLAGS="-fembed-bitcode -O2 -arch arm64 -isysroot ${SDK} -mwatchos-simulator-version-min=${WATCHOS_SIMULATOR_VERSION_MIN}"
184    export LDFLAGS="-fembed-bitcode -arch arm64 -isysroot ${SDK} -mwatchos-simulator-version-min=${WATCHOS_SIMULATOR_VERSION_MIN}"
185
186    make distclean >/dev/null 2>&1
187    ./configure --host=arm-apple-darwin20 --prefix="$WATCHOS_SIMULATOR_ARM64_PREFIX" \
188      ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
189    make -j${PROCESSORS} install || exit 1
190  fi
191
192  ## i386 simulator
193  export CFLAGS="-fembed-bitcode -O2 -arch i386 -isysroot ${SDK} -mwatchos-simulator-version-min=${WATCHOS_SIMULATOR_VERSION_MIN}"
194  export LDFLAGS="-fembed-bitcode -arch i386 -isysroot ${SDK} -mwatchos-simulator-version-min=${WATCHOS_SIMULATOR_VERSION_MIN}"
195
196  make distclean >/dev/null 2>&1
197  ./configure --host=i686-apple-darwin10 --prefix="$WATCHOS_SIMULATOR_I386_PREFIX" \
198    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
199  make -j${PROCESSORS} install || exit 1
200
201  ## x86_64 simulator
202  export CFLAGS="-fembed-bitcode -O2 -arch x86_64 -isysroot ${SDK} -mwatchos-simulator-version-min=${WATCHOS_SIMULATOR_VERSION_MIN}"
203  export LDFLAGS="-fembed-bitcode -arch x86_64 -isysroot ${SDK} -mwatchos-simulator-version-min=${WATCHOS_SIMULATOR_VERSION_MIN}"
204
205  make distclean >/dev/null 2>&1
206  ./configure --host=x86_64-apple-darwin10 --prefix="$WATCHOS_SIMULATOR_X86_64_PREFIX" \
207    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
208  make -j${PROCESSORS} install || exit 1
209}
210
211build_tvos() {
212  export BASEDIR="${XCODEDIR}/Platforms/AppleTVOS.platform/Developer"
213  export PATH="${BASEDIR}/usr/bin:$BASEDIR/usr/sbin:$PATH"
214  export SDK="${BASEDIR}/SDKs/AppleTVOS.sdk"
215
216  ## 64-bit tvOS
217  export CFLAGS="-fembed-bitcode -O2 -arch arm64 -isysroot ${SDK} -mtvos-version-min=${TVOS_VERSION_MIN}"
218  export LDFLAGS="-fembed-bitcode -arch arm64 -isysroot ${SDK} -mtvos-version-min=${TVOS_VERSION_MIN}"
219
220  make distclean >/dev/null 2>&1
221  ./configure --host=arm-apple-darwin10 --prefix="$TVOS64_PREFIX" \
222    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
223  make -j${PROCESSORS} install || exit 1
224}
225
226build_tvos_simulator() {
227  export BASEDIR="${XCODEDIR}/Platforms/AppleTVSimulator.platform/Developer"
228  export PATH="${BASEDIR}/usr/bin:$BASEDIR/usr/sbin:$PATH"
229  export SDK="${BASEDIR}/SDKs/AppleTVSimulator.sdk"
230
231  ## arm64 simulator
232  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
233    export CFLAGS="-fembed-bitcode -O2 -arch arm64 -isysroot ${SDK} -mtvos-simulator-version-min=${TVOS_SIMULATOR_VERSION_MIN}"
234    export LDFLAGS="-fembed-bitcode -arch arm64 -isysroot ${SDK} -mtvos-simulator-version-min=${TVOS_SIMULATOR_VERSION_MIN}"
235
236    make distclean >/dev/null 2>&1
237    ./configure --host=arm-apple-darwin20 --prefix="$TVOS_SIMULATOR_ARM64_PREFIX" \
238      ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
239    make -j${PROCESSORS} install || exit 1
240  fi
241
242  ## x86_64 simulator
243  export CFLAGS="-fembed-bitcode -O2 -arch x86_64 -isysroot ${SDK} -mtvos-simulator-version-min=${TVOS_SIMULATOR_VERSION_MIN}"
244  export LDFLAGS="-fembed-bitcode -arch x86_64 -isysroot ${SDK} -mtvos-simulator-version-min=${TVOS_SIMULATOR_VERSION_MIN}"
245
246  make distclean >/dev/null 2>&1
247  ./configure --host=x86_64-apple-darwin10 --prefix="$TVOS_SIMULATOR_X86_64_PREFIX" \
248    ${LIBSODIUM_ENABLE_MINIMAL_FLAG}
249  make -j${PROCESSORS} install || exit 1
250}
251
252build_catalyst() {
253  export BASEDIR="${XCODEDIR}/Platforms/MacOSX.platform/Developer"
254  export PATH="${BASEDIR}/usr/bin:$BASEDIR/usr/sbin:$PATH"
255  export SDK="${BASEDIR}/SDKs/MacOSX.sdk"
256
257  ## arm64 catalyst
258  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
259    export CFLAGS="-O2 -arch arm64 -target arm64-apple-ios13.0-macabi -isysroot ${SDK}"
260    export LDFLAGS="-arch arm64 -target arm64-apple-ios13.0-macabi -isysroot ${SDK}"
261
262    make distclean >/dev/null 2>&1
263    ./configure --host=arm-apple-ios --prefix="$CATALYST_ARM64_PREFIX" \
264      ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
265    make -j${PROCESSORS} install || exit 1
266  fi
267
268  ## x86_64 catalyst
269  export CFLAGS="-O2 -arch x86_64 -target x86_64-apple-ios13.0-macabi -isysroot ${SDK}"
270  export LDFLAGS="-arch x86_64 -target x86_64-apple-ios13.0-macabi -isysroot ${SDK}"
271
272  make distclean >/dev/null 2>&1
273  ./configure --host=x86_64-apple-ios --prefix="$CATALYST_X86_64_PREFIX" \
274    ${LIBSODIUM_ENABLE_MINIMAL_FLAG} || exit 1
275  make -j${PROCESSORS} install || exit 1
276}
277
278mkdir -p "${PREFIX}/tmp"
279echo "Building for macOS..."
280build_macos >"$LOG_FILE" 2>&1 || exit 1
281echo "Building for iOS..."
282build_ios >"$LOG_FILE" 2>&1 || exit 1
283echo "Building for the iOS simulator..."
284build_ios_simulator >"$LOG_FILE" 2>&1 || exit 1
285echo "Building for watchOS..."
286build_watchos >"$LOG_FILE" 2>&1 || exit 1
287echo "Building for the watchOS simulator..."
288build_watchos_simulator >"$LOG_FILE" 2>&1 || exit 1
289echo "Building for tvOS..."
290build_tvos >"$LOG_FILE" 2>&1 || exit 1
291echo "Building for the tvOS simulator..."
292build_tvos_simulator >"$LOG_FILE" 2>&1 || exit 1
293echo "Building for Catalyst..."
294build_catalyst >"$LOG_FILE" 2>&1 || exit 1
295
296echo "Adding the Clibsodium module map for Swift..."
297
298find "$PREFIX" -name "include" -type d -print | while read -r f; do
299  swift_module_map >"${f}/module.modulemap"
300done
301
302echo "Bundling macOS targets..."
303
304mkdir -p "${PREFIX}/macos/lib"
305cp -a "${MACOS_X86_64_PREFIX}/include" "${PREFIX}/macos/"
306for ext in a dylib; do
307  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
308    lipo -create \
309      "${MACOS_ARM64_PREFIX}/lib/libsodium.${ext}" \
310      "${MACOS_X86_64_PREFIX}/lib/libsodium.${ext}" \
311      -output "${PREFIX}/macos/lib/libsodium.${ext}"
312  else
313    lipo -create \
314      "${MACOS_X86_64_PREFIX}/lib/libsodium.${ext}" \
315      -output "${PREFIX}/macos/lib/libsodium.${ext}"
316  fi
317done
318
319echo "Bundling iOS targets..."
320
321mkdir -p "${PREFIX}/ios/lib"
322cp -a "${IOS64_PREFIX}/include" "${PREFIX}/ios/"
323for ext in a dylib; do
324  lipo -create \
325    "$IOS32_PREFIX/lib/libsodium.${ext}" \
326    "$IOS32s_PREFIX/lib/libsodium.${ext}" \
327    "$IOS64_PREFIX/lib/libsodium.${ext}" \
328    -output "$PREFIX/ios/lib/libsodium.${ext}"
329done
330
331echo "Bundling iOS simulators..."
332
333mkdir -p "${PREFIX}/ios-simulators/lib"
334cp -a "${IOS_SIMULATOR_X86_64_PREFIX}/include" "${PREFIX}/ios-simulators/"
335for ext in a dylib; do
336  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
337    lipo -create \
338      "${IOS_SIMULATOR_ARM64_PREFIX}/lib/libsodium.${ext}" \
339      "${IOS_SIMULATOR_I386_PREFIX}/lib/libsodium.${ext}" \
340      "${IOS_SIMULATOR_X86_64_PREFIX}/lib/libsodium.${ext}" \
341      -output "${PREFIX}/ios-simulators/lib/libsodium.${ext}" || exit 1
342  else
343    lipo -create \
344      "${IOS_SIMULATOR_I386_PREFIX}/lib/libsodium.${ext}" \
345      "${IOS_SIMULATOR_X86_64_PREFIX}/lib/libsodium.${ext}" \
346      -output "${PREFIX}/ios-simulators/lib/libsodium.${ext}" || exit 1
347  fi
348done
349
350echo "Bundling watchOS targets..."
351
352mkdir -p "${PREFIX}/watchos/lib"
353cp -a "${WATCHOS64_32_PREFIX}/include" "${PREFIX}/watchos/"
354for ext in a dylib; do
355  lipo -create \
356    "${WATCHOS32_PREFIX}/lib/libsodium.${ext}" \
357    "${WATCHOS64_32_PREFIX}/lib/libsodium.${ext}" \
358    -output "${PREFIX}/watchos/lib/libsodium.${ext}"
359done
360
361echo "Bundling watchOS simulators..."
362
363mkdir -p "${PREFIX}/watchos-simulators/lib"
364cp -a "${WATCHOS_SIMULATOR_X86_64_PREFIX}/include" "${PREFIX}/watchos-simulators/"
365for ext in a dylib; do
366  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
367    lipo -create \
368      "${WATCHOS_SIMULATOR_ARM64_PREFIX}/lib/libsodium.${ext}" \
369      "${WATCHOS_SIMULATOR_I386_PREFIX}/lib/libsodium.${ext}" \
370      "${WATCHOS_SIMULATOR_X86_64_PREFIX}/lib/libsodium.${ext}" \
371      -output "${PREFIX}/watchos-simulators/lib/libsodium.${ext}"
372  else
373    lipo -create \
374      "${WATCHOS_SIMULATOR_I386_PREFIX}/lib/libsodium.${ext}" \
375      "${WATCHOS_SIMULATOR_X86_64_PREFIX}/lib/libsodium.${ext}" \
376      -output "${PREFIX}/watchos-simulators/lib/libsodium.${ext}"
377  fi
378done
379
380echo "Bundling tvOS targets..."
381
382mkdir -p "${PREFIX}/tvos/lib"
383cp -a "${TVOS64_PREFIX}/include" "${PREFIX}/tvos/"
384for ext in a dylib; do
385  lipo -create \
386    "$TVOS64_PREFIX/lib/libsodium.${ext}" \
387    -output "$PREFIX/tvos/lib/libsodium.${ext}"
388done
389
390echo "Bundling tvOS simulators..."
391
392mkdir -p "${PREFIX}/tvos-simulators/lib"
393cp -a "${TVOS_SIMULATOR_X86_64_PREFIX}/include" "${PREFIX}/tvos-simulators/"
394for ext in a dylib; do
395  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
396    lipo -create \
397      "${TVOS_SIMULATOR_ARM64_PREFIX}/lib/libsodium.${ext}" \
398      "${TVOS_SIMULATOR_X86_64_PREFIX}/lib/libsodium.${ext}" \
399      -output "${PREFIX}/tvos-simulators/lib/libsodium.${ext}" || exit 1
400  else
401    lipo -create \
402      "${TVOS_SIMULATOR_X86_64_PREFIX}/lib/libsodium.${ext}" \
403      -output "${PREFIX}/tvos-simulators/lib/libsodium.${ext}" || exit 1
404  fi
405done
406
407echo "Bundling Catalyst targets..."
408
409mkdir -p "${PREFIX}/catalyst/lib"
410cp -a "${CATALYST_X86_64_PREFIX}/include" "${PREFIX}/catalyst/"
411for ext in a dylib; do
412  if [ ! -f "${CATALYST_X86_64_PREFIX}/lib/libsodium.${ext}" ]; then
413    continue
414  fi
415  if [ "$APPLE_SILICON_SUPPORTED" = "true" ]; then
416    lipo -create \
417      "${CATALYST_ARM64_PREFIX}/lib/libsodium.${ext}" \
418      "${CATALYST_X86_64_PREFIX}/lib/libsodium.${ext}" \
419      -output "${PREFIX}/catalyst/lib/libsodium.${ext}"
420  else
421    lipo -create \
422      "${CATALYST_X86_64_PREFIX}/lib/libsodium.${ext}" \
423      -output "${PREFIX}/catalyst/lib/libsodium.${ext}"
424  fi
425done
426
427echo "Creating Clibsodium.xcframework..."
428
429rm -rf "${PREFIX}/Clibsodium.xcframework"
430
431XCFRAMEWORK_ARGS=""
432for f in macos ios ios-simulators watchos watchos-simulators tvos tvos-simulators catalyst; do
433  XCFRAMEWORK_ARGS="${XCFRAMEWORK_ARGS} -library ${PREFIX}/${f}/lib/libsodium.a"
434  XCFRAMEWORK_ARGS="${XCFRAMEWORK_ARGS} -headers ${PREFIX}/${f}/include"
435done
436xcodebuild -create-xcframework \
437  ${XCFRAMEWORK_ARGS} \
438  -output "${PREFIX}/Clibsodium.xcframework" >/dev/null
439
440ls -ld -- "$PREFIX"
441ls -l -- "$PREFIX"
442ls -l -- "$PREFIX/Clibsodium.xcframework"
443
444echo "Done!"
445
446# Cleanup
447rm -rf -- "$PREFIX/tmp"
448make distclean >/dev/null
449