diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 6182c63..7d1d993 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -16,7 +16,7 @@ jobs: BUILD_NUMBER: ${{ steps.build-vars.outputs.BUILD_NUMBER }} strategy: matrix: - target: [ "iOS", "tvOS", "watchOS" ] + target: [ "iOS", "tvOS", "watchOS", "MacCatalyst" ] steps: - name: Checkout uses: actions/checkout@v4.2.2 diff --git a/Makefile b/Makefile index 31365c8..29dc54e 100644 --- a/Makefile +++ b/Makefile @@ -4,32 +4,38 @@ # - iOS - build everything for iOS # - tvOS - build everything for tvOS # - watchOS - build everything for watchOS +# - MacCatalyst - build everything for MacCatalyst # - BZip2 - build BZip2 for all platforms # - BZip2-iOS - build BZip2 for iOS # - BZip2-tvOS - build BZip2 for tvOS # - BZip2-watchOS - build BZip2 for watchOS +# - BZip2-MacCatalyst - build BZip2 for MacCatalyst # - XZ - build XZ for all platforms # - XZ-iOS - build XZ for iOS # - XZ-tvOS - build XZ for tvOS # - XZ-watchOS - build XZ for watchOS +# - XZ-MacCatalyst - build XZ for MacCatalyst # - OpenSSL - build OpenSSL for all platforms # - OpenSSL-iOS - build OpenSSL for iOS # - OpenSSL-tvOS - build OpenSSL for tvOS # - OpenSSL-watchOS - build OpenSSL for watchOS +# - OpenSSL-MacCatalyst - build OpenSSL for MacCatalyst # - mpdecimal - build mpdecimal for all platforms # - mpdecimal-iOS - build mpdecimal for iOS # - mpdecimal-tvOS - build mpdecimal for tvOS # - mpdecimal-watchOS - build mpdecimal for watchOS +# - mpdecimal-MacCatalyst - build mpdecimal for MacCatalyst # - libFFI-iOS - build libFFI for iOS # - libFFI-tvOS - build libFFI for tvOS # - libFFI-watchOS - build libFFI for watchOS +# - libFFI-MacCatalyst - build libFFI for MacCatalyst # Current directory PROJECT_DIR=$(shell pwd) # Supported OS and products PRODUCTS=BZip2 XZ OpenSSL libFFI -OS_LIST=iOS tvOS watchOS +OS_LIST=iOS tvOS watchOS MacCatalyst # The versions to compile by default. # In practice, these should be @@ -61,6 +67,11 @@ TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.arm64 iphoneos.arm64 VERSION_MIN-iOS=13.0 CFLAGS-iOS=-mios-version-min=$(VERSION_MIN-iOS) +# MacCatalyst targets +TARGETS-MacCatalyst=maccatalyst.x86_64 maccatalyst.arm64 +VERSION_MIN-MacCatalyst=14.2 +CFLAGS-MacCatalyst=-mios-version-min=$(VERSION_MIN-MacCatalyst) + # tvOS targets TARGETS-tvOS=appletvsimulator.x86_64 appletvsimulator.arm64 appletvos.arm64 VERSION_MIN-tvOS=9.0 @@ -168,13 +179,15 @@ os=$2 OS_LOWER-$(target)=$(shell echo $(os) | tr '[:upper:]' '[:lower:]') # $(target) can be broken up into is composed of $(SDK).$(ARCH) -SDK-$(target)=$$(basename $(target)) +SDK-$(target)=$$(subst maccatalyst,macosx,$$(basename $(target))) ARCH-$(target)=$$(subst .,,$$(suffix $(target))) -ifeq ($$(findstring simulator,$$(SDK-$(target))),) -TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(OS_LOWER-$(target))$$(VERSION_MIN-$(os)) -else +ifneq ($$(findstring simulator,$$(SDK-$(target))),) TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(OS_LOWER-$(target))$$(VERSION_MIN-$(os))-simulator +else ifneq ($$(findstring maccatalyst,$$(target)),) +TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-ios$$(VERSION_MIN-$(os))-macabi +else +TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(OS_LOWER-$(target))$$(VERSION_MIN-$(os)) endif SDK_ROOT-$(target)=$$(shell xcrun --sdk $$(SDK-$(target)) --show-sdk-path) @@ -550,9 +563,11 @@ $$(LIBFFI_SRCDIR-$(os))/darwin_common/include/ffi.h: downloads/libffi-$(LIBFFI_V @echo ">>> Unpack and configure libFFI sources on $(os)" mkdir -p $$(LIBFFI_SRCDIR-$(os)) tar zxf $$< --strip-components 1 -C $$(LIBFFI_SRCDIR-$(os)) + # Patch the source to add support for maccatalyst/remove i386+armv7 + cd $$(LIBFFI_SRCDIR-$(os)) && patch -p1 < $(PROJECT_DIR)/patch/libffi.patch # Configure the build cd $$(LIBFFI_SRCDIR-$(os)) && \ - python3 generate-darwin-source-and-headers.py --only-$(shell echo $(os) | tr '[:upper:]' '[:lower:]') \ + python3 generate-darwin-source-and-headers.py --only-$(shell echo $(os) | tr '[:upper:]' '[:lower:]') --disable-i386 --disable-armv7 \ 2>&1 | tee -a ../libffi-$(LIBFFI_VERSION).config.log ########################################################################### diff --git a/patch/libffi.patch b/patch/libffi.patch new file mode 100644 index 0000000..42ce62c --- /dev/null +++ b/patch/libffi.patch @@ -0,0 +1,174 @@ +diff -Naur libffi-3.4.7-orig/config.sub libffi-3.4.7/config.sub +--- libffi-3.4.7-orig/config.sub 2024-12-13 10:38:19 ++++ libffi-3.4.7/config.sub 2025-03-11 19:17:04 +@@ -1768,7 +1768,7 @@ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ +- | fiwix* | mlibc* | cos* | mbr* | ironclad* ) ++ | fiwix* | mlibc* | cos* | mbr* | ironclad* | macabi) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) +@@ -1864,8 +1864,8 @@ + ;; + os2-emx-) + ;; +- ios*-simulator* | tvos*-simulator* | watchos*-simulator*) +- ;; ++ ios*-simulator* | tvos*-simulator* | watchos*-simulator* | ios*macabi*) ++ ;; + *-eabi*- | *-gnueabi*-) + ;; + none--*) +diff -Naur libffi-3.4.7-orig/generate-darwin-source-and-headers.py libffi-3.4.7/generate-darwin-source-and-headers.py +--- libffi-3.4.7-orig/generate-darwin-source-and-headers.py 2024-06-01 18:42:02 ++++ libffi-3.4.7/generate-darwin-source-and-headers.py 2025-03-09 14:29:38 +@@ -8,7 +8,7 @@ + + + class Platform(object): +- pass ++ abi = None + + + class i386_platform(Platform): +@@ -153,7 +153,22 @@ + arch = 'arm64_32' + version_min = '-mwatchos-version-min=4.0' + ++class macosx_x86_64_platform(x86_64_platform): ++ target = 'x86_64-apple-ios-macabi' ++ directory = 'darwin_maccatalyst' ++ sdk = 'macosx' ++ version_min = '-mios-version-min=14.2' ++ abi = 'macabi' + ++ ++class macosx_arm64_platform(arm64_platform): ++ target = 'arm64-apple-ios-macabi' ++ directory = 'darwin_maccatalyst' ++ sdk = 'macosx' ++ version_min = '-mios-version-min=14.2' ++ abi = 'macabi' ++ ++ + def mkdir_p(path): + try: + os.makedirs(path) +@@ -219,7 +234,7 @@ + "../configure", + f"--host={platform.target}", + ] + ( +- [] if platform.sdk == "macosx" else [f"--build={os.uname().machine}-apple-darwin"] ++ [] if platform.sdk == "macosx" and platform.abi != "macabi" else [f"--build={os.uname().machine}-apple-darwin"] + ), + env=env + ) +@@ -243,16 +258,24 @@ + generate_ios=True, + generate_tvos=True, + generate_watchos=True, ++ generate_maccatalyst=True, ++ enable_i386=True, ++ enable_armv7=True, + ): + copy_files('src', 'darwin_common/src', pattern='*.c') + copy_files('include', 'darwin_common/include', pattern='*.h') + + if generate_ios: +- copy_src_platform_files(ios_simulator_i386_platform) ++ if enable_i386: ++ copy_src_platform_files(ios_simulator_i386_platform) + copy_src_platform_files(ios_simulator_x86_64_platform) + copy_src_platform_files(ios_simulator_arm64_platform) +- copy_src_platform_files(ios_device_armv7_platform) ++ if enable_armv7: ++ copy_src_platform_files(ios_device_armv7_platform) + copy_src_platform_files(ios_device_arm64_platform) ++ if generate_maccatalyst: ++ copy_src_platform_files(macosx_x86_64_platform) ++ copy_src_platform_files(macosx_arm64_platform) + if generate_osx: + copy_src_platform_files(desktop_x86_64_platform) + copy_src_platform_files(desktop_arm64_platform) +@@ -261,20 +284,27 @@ + copy_src_platform_files(tvos_simulator_arm64_platform) + copy_src_platform_files(tvos_device_arm64_platform) + if generate_watchos: +- copy_src_platform_files(watchos_simulator_i386_platform) ++ if enable_i386: ++ copy_src_platform_files(watchos_simulator_i386_platform) + copy_src_platform_files(watchos_simulator_x86_64_platform) + copy_src_platform_files(watchos_simulator_arm64_platform) +- copy_src_platform_files(watchos_device_armv7k_platform) ++ if enable_armv7: ++ copy_src_platform_files(watchos_device_armv7k_platform) + copy_src_platform_files(watchos_device_arm64_32_platform) + + platform_headers = collections.defaultdict(set) + + if generate_ios: +- build_target(ios_simulator_i386_platform, platform_headers) ++ if enable_i386: ++ build_target(ios_simulator_i386_platform, platform_headers) + build_target(ios_simulator_x86_64_platform, platform_headers) + build_target(ios_simulator_arm64_platform, platform_headers) +- build_target(ios_device_armv7_platform, platform_headers) ++ if enable_armv7: ++ build_target(ios_device_armv7_platform, platform_headers) + build_target(ios_device_arm64_platform, platform_headers) ++ if generate_maccatalyst: ++ build_target(macosx_x86_64_platform, platform_headers) ++ build_target(macosx_arm64_platform, platform_headers) + if generate_osx: + build_target(desktop_x86_64_platform, platform_headers) + build_target(desktop_arm64_platform, platform_headers) +@@ -283,10 +313,12 @@ + build_target(tvos_simulator_arm64_platform, platform_headers) + build_target(tvos_device_arm64_platform, platform_headers) + if generate_watchos: +- build_target(watchos_simulator_i386_platform, platform_headers) ++ if enable_i386: ++ build_target(watchos_simulator_i386_platform, platform_headers) + build_target(watchos_simulator_x86_64_platform, platform_headers) + build_target(watchos_simulator_arm64_platform, platform_headers) +- build_target(watchos_device_armv7k_platform, platform_headers) ++ if enable_armv7: ++ build_target(watchos_device_armv7k_platform, platform_headers) + build_target(watchos_device_arm64_32_platform, platform_headers) + + mkdir_p('darwin_common/include') +@@ -298,15 +330,24 @@ + + if __name__ == '__main__': + parser = argparse.ArgumentParser() +- parser.add_argument('--only-ios', action='store_true', default=False) +- parser.add_argument('--only-osx', action='store_true', default=False) +- parser.add_argument('--only-tvos', action='store_true', default=False) +- parser.add_argument('--only-watchos', action='store_true', default=False) ++ only_group = parser.add_mutually_exclusive_group() ++ # Enforce only one of these options to be specified, default is all ++ only_group.add_argument('--only-ios', action='store_true', default=False) ++ only_group.add_argument('--only-osx', action='store_true', default=False) ++ only_group.add_argument('--only-tvos', action='store_true', default=False) ++ only_group.add_argument('--only-watchos', action='store_true', default=False) ++ only_group.add_argument('--only-maccatalyst', action='store_true', default=False) ++ parser.add_argument('--disable-i386', action='store_true', default=False) ++ parser.add_argument('--disable-armv7', action='store_true', default=False) + args = parser.parse_args() + ++ enable_all = not any((args.only_ios, args.only_osx, args.only_tvos, args.only_watchos, args.only_maccatalyst)) + generate_source_and_headers( +- generate_osx=not args.only_ios and not args.only_tvos and not args.only_watchos, +- generate_ios=not args.only_osx and not args.only_tvos and not args.only_watchos, +- generate_tvos=not args.only_ios and not args.only_osx and not args.only_watchos, +- generate_watchos=not args.only_ios and not args.only_osx and not args.only_tvos, ++ generate_osx=enable_all or args.only_osx, ++ generate_ios=enable_all or args.only_ios, ++ generate_tvos=enable_all or args.only_tvos, ++ generate_watchos=enable_all or args.only_watchos, ++ generate_maccatalyst=enable_all or args.only_maccatalyst, ++ enable_i386=not args.disable_i386, ++ enable_armv7=not args.disable_armv7, + ) diff --git a/patch/mpdecimal.patch b/patch/mpdecimal.patch index f0cf088..df27d9c 100644 --- a/patch/mpdecimal.patch +++ b/patch/mpdecimal.patch @@ -1,6 +1,6 @@ -diff -ur mpdecimal-4.0.0-orig/config.sub mpdecimal-4.0.0/config.sub ---- mpdecimal-4.0.0-orig/config.sub 2024-01-10 08:25:00 -+++ mpdecimal-4.0.0/config.sub 2024-07-24 13:16:35 +diff -Naur --mi mpdecimal-4.0.0-orig/config.sub mpdecimal-4.0.0/config.sub +--- mpdecimal-4.0.0-orig/config.sub 2024-01-10 00:25:00 ++++ mpdecimal-4.0.0/config.sub 2025-03-11 19:35:50 @@ -1127,7 +1127,7 @@ xscale-* | xscalee[bl]-*) cpu=`echo "$cpu" | sed 's/^xscale/arm/'` @@ -10,12 +10,21 @@ diff -ur mpdecimal-4.0.0-orig/config.sub mpdecimal-4.0.0/config.sub cpu=aarch64 ;; +@@ -1736,7 +1736,7 @@ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ +- | fiwix* | mlibc* | cos* | mbr* ) ++ | fiwix* | mlibc* | cos* | mbr* | macabi ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) @@ -1792,6 +1792,8 @@ os2-emx) ;; *-eabi* | *-gnueabi*) + ;; -+ ios*-simulator | tvos*-simulator | watchos*-simulator) ++ ios*-simulator | tvos*-simulator | watchos*-simulator | ios*-macabi) ;; none-coff* | none-elf*) # None (no kernel, i.e. freestanding / bare metal), diff --git a/patch/xz.patch b/patch/xz.patch index c9da484..af2523f 100644 --- a/patch/xz.patch +++ b/patch/xz.patch @@ -1,7 +1,6 @@ -diff -ru xz-5.4.7-orig/build-aux/config.sub xz-5.4.7/build-aux/config.sub ---- xz-5.4.7-orig/build-aux/config.sub 2024-05-29 23:13:51 -+++ xz-5.4.7/build-aux/config.sub 2024-07-24 14:20:00 -@@ -1127,7 +1127,7 @@ +--- xz-5.6.4-orig/build-aux/config.sub 2025-01-23 09:58:05 ++++ xz-5.6.4/build-aux/config.sub 2025-03-09 20:15:18 +@@ -1194,7 +1194,7 @@ xscale-* | xscalee[bl]-*) cpu=`echo "$cpu" | sed 's/^xscale/arm/'` ;; @@ -10,12 +9,22 @@ diff -ru xz-5.4.7-orig/build-aux/config.sub xz-5.4.7/build-aux/config.sub cpu=aarch64 ;; -@@ -1865,6 +1865,8 @@ - os2-emx-) +@@ -2149,7 +2149,8 @@ + | xenix* \ + | xray* \ + | zephyr* \ +- | zvmoe* ) ++ | zvmoe* \ ++ | macabi ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) +@@ -2248,6 +2249,8 @@ + rtmk-nova-) ;; *-eabi*- | *-gnueabi*-) + ;; -+ ios*-simulator- | tvos*-simulator- | watchos*-simulator- ) ++ ios*-simulator- | tvos*-simulator- | watchos*-simulator- | ios*-macabi-) ;; none--*) # None (no kernel, i.e. freestanding / bare metal),