diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 78cafa9..b25183e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: runs-on: macOS-latest strategy: matrix: - target: [ "iOS", "tvOS", "watchOS" ] + target: [ "iOS", "tvOS", "watchOS", "visionOS" ] steps: - name: Checkout uses: actions/checkout@v4.2.2 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 4a70e68..fc315bb 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", "visionOS" ] steps: - name: Checkout uses: actions/checkout@v4.2.2 diff --git a/Makefile b/Makefile index 31365c8..ab3b3ea 100644 --- a/Makefile +++ b/Makefile @@ -1,35 +1,41 @@ # # Useful targets: -# - all - build everything -# - iOS - build everything for iOS -# - tvOS - build everything for tvOS -# - watchOS - build everything for watchOS -# - BZip2 - build BZip2 for all platforms -# - BZip2-iOS - build BZip2 for iOS -# - BZip2-tvOS - build BZip2 for tvOS -# - BZip2-watchOS - build BZip2 for watchOS -# - XZ - build XZ for all platforms -# - XZ-iOS - build XZ for iOS -# - XZ-tvOS - build XZ for tvOS -# - XZ-watchOS - build XZ for watchOS -# - OpenSSL - build OpenSSL for all platforms -# - OpenSSL-iOS - build OpenSSL for iOS -# - OpenSSL-tvOS - build OpenSSL for tvOS -# - OpenSSL-watchOS - build OpenSSL for watchOS -# - mpdecimal - build mpdecimal for all platforms -# - mpdecimal-iOS - build mpdecimal for iOS -# - mpdecimal-tvOS - build mpdecimal for tvOS -# - mpdecimal-watchOS - build mpdecimal for watchOS -# - libFFI-iOS - build libFFI for iOS -# - libFFI-tvOS - build libFFI for tvOS -# - libFFI-watchOS - build libFFI for watchOS +# - all - build everything +# - iOS - build everything for iOS +# - tvOS - build everything for tvOS +# - watchOS - build everything for watchOS +# - visionOS - build everything for visionOS +# - 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-visionOS - build BZip2 for visionOS +# - 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-visionOS - build XZ for xrOS +# - 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-visionOS - build OpenSSL for visionOS +# - 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-visionOS - build mpdecimal for visionOS +# - libFFI-iOS - build libFFI for iOS +# - libFFI-tvOS - build libFFI for tvOS +# - libFFI-watchOS - build libFFI for watchOS +# - libFFI-visionOS - build libFFI for visionOS # 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 visionOS # The versions to compile by default. # In practice, these should be @@ -58,21 +64,34 @@ CURL_FLAGS=--disable --fail --location --create-dirs --progress-bar # iOS targets TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.arm64 iphoneos.arm64 +TRIPLE_OS-iOS=ios VERSION_MIN-iOS=13.0 CFLAGS-iOS=-mios-version-min=$(VERSION_MIN-iOS) # tvOS targets TARGETS-tvOS=appletvsimulator.x86_64 appletvsimulator.arm64 appletvos.arm64 +TRIPLE_OS-tvOS=tvos VERSION_MIN-tvOS=9.0 CFLAGS-tvOS=-mtvos-version-min=$(VERSION_MIN-tvOS) PYTHON_CONFIGURE-tvOS=ac_cv_func_sigaltstack=no # watchOS targets TARGETS-watchOS=watchsimulator.x86_64 watchsimulator.arm64 watchos.arm64_32 +TRIPLE_OS-watchOS=watchos VERSION_MIN-watchOS=4.0 CFLAGS-watchOS=-mwatchos-version-min=$(VERSION_MIN-watchOS) PYTHON_CONFIGURE-watchOS=ac_cv_func_sigaltstack=no +# visionOS targets +TARGETS-visionOS=xrsimulator.arm64 xros.arm64 +TRIPLE_OS-visionOS=xros +VERSION_MIN-visionOS=2.0 +# visionOS doesn't expose -mxros-version-min or similar; it uses the version +# number in the -target triple, or a definition like: +# CFLAGS-visionOS=-arch arm64 -mtargetos=xros$(VERSION_MIN-visionOS) +# For consistency with existing tooling, we use the -target form. +PYTHON_CONFIGURE-visionOS=ac_cv_func_sigaltstack=no + # The architecture of the machine doing the build HOST_ARCH=$(shell uname -m) @@ -165,16 +184,14 @@ define build-target target=$1 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)) ARCH-$(target)=$$(subst .,,$$(suffix $(target))) ifeq ($$(findstring simulator,$$(SDK-$(target))),) -TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(OS_LOWER-$(target))$$(VERSION_MIN-$(os)) +TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(TRIPLE_OS-$(os))$$(VERSION_MIN-$(os)) else -TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(OS_LOWER-$(target))$$(VERSION_MIN-$(os))-simulator +TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(TRIPLE_OS-$(os))$$(VERSION_MIN-$(os))-simulator endif SDK_ROOT-$(target)=$$(shell xcrun --sdk $$(SDK-$(target)) --show-sdk-path) @@ -428,7 +445,7 @@ $$(LIBFFI_LIB-$(target)): $$(LIBFFI_BUILD_LIB-$(target)) # Copy the set of platform headers cp -f -r $$(LIBFFI_SRCDIR-$(os))/darwin_common/include \ $$(LIBFFI_INSTALL-$(target)) - cp -f -r $$(LIBFFI_SRCDIR-$(os))/darwin_$$(OS_LOWER-$(sdk))/include/* \ + cp -f -r $$(LIBFFI_SRCDIR-$(os))/darwin_$$(TRIPLE_OS-$(os))/include/* \ $$(LIBFFI_INSTALL-$(target))/include $$(LIBFFI_DIST-$(target)): $$(LIBFFI_LIB-$(target)) @@ -492,10 +509,6 @@ define build-sdk sdk=$1 os=$2 -OS_LOWER-$(sdk)=$(shell echo $(os) | tr '[:upper:]' '[:lower:]') - -WHEEL_TAG-$(sdk)=py3-none-$$(shell echo $$(OS_LOWER-$(sdk))_$$(VERSION_MIN-$(os))_$(sdk) | sed "s/\./_/g") - SDK_TARGETS-$(sdk)=$$(filter $(sdk).%,$$(TARGETS-$(os))) SDK_ARCHES-$(sdk)=$$(sort $$(subst .,,$$(suffix $$(SDK_TARGETS-$(sdk))))) @@ -550,6 +563,7 @@ $$(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)) + 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:]') \ diff --git a/patch/libffi.patch b/patch/libffi.patch new file mode 100644 index 0000000..c7cb41a --- /dev/null +++ b/patch/libffi.patch @@ -0,0 +1,94 @@ +diff -ur libffi-3.4.7 2/config.sub libffi-3.4.7/config.sub +--- libffi-3.4.7 2/config.sub 2024-12-13 04:38:19 ++++ libffi-3.4.7/config.sub 2025-04-12 17:44:40 +@@ -1742,7 +1742,7 @@ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ +- | os9* | macos* | osx* | ios* | tvos* | watchos* \ ++ | os9* | macos* | osx* | ios* | tvos* | watchos* | xros* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ +@@ -1864,7 +1864,7 @@ + ;; + os2-emx-) + ;; +- ios*-simulator* | tvos*-simulator* | watchos*-simulator*) ++ ios*-simulator* | tvos*-simulator* | watchos*-simulator* | xros*-simulator*) + ;; + *-eabi*- | *-gnueabi*-) + ;; +diff -ur libffi-3.4.7 2/generate-darwin-source-and-headers.py libffi-3.4.7/generate-darwin-source-and-headers.py +--- libffi-3.4.7 2/generate-darwin-source-and-headers.py 2024-06-01 12:42:02 ++++ libffi-3.4.7/generate-darwin-source-and-headers.py 2025-04-12 18:02:51 +@@ -152,8 +152,22 @@ + sdk = 'watchos' + arch = 'arm64_32' + version_min = '-mwatchos-version-min=4.0' ++ ++class visionos_simulator_arm64_platform(arm64_platform): ++ target = 'arm64-apple-xros2.0-simulator' ++ directory = 'darwin_xros' ++ sdk = 'xrsimulator' ++ version_min = '' + + ++class visionos_device_arm64_platform(arm64_platform): ++ target = 'arm64-apple-xros2.0' ++ directory = 'darwin_xros' ++ sdk = 'xros' ++ arch = 'arm64' ++ version_min = '' ++ ++ + def mkdir_p(path): + try: + os.makedirs(path) +@@ -243,6 +257,7 @@ + generate_ios=True, + generate_tvos=True, + generate_watchos=True, ++ generate_visionos=True + ): + copy_files('src', 'darwin_common/src', pattern='*.c') + copy_files('include', 'darwin_common/include', pattern='*.h') +@@ -266,6 +281,9 @@ + copy_src_platform_files(watchos_simulator_arm64_platform) + copy_src_platform_files(watchos_device_armv7k_platform) + copy_src_platform_files(watchos_device_arm64_32_platform) ++ if generate_visionos: ++ copy_src_platform_files(visionos_simulator_arm64_platform) ++ copy_src_platform_files(visionos_device_arm64_platform) + + platform_headers = collections.defaultdict(set) + +@@ -288,6 +306,9 @@ + build_target(watchos_simulator_arm64_platform, platform_headers) + build_target(watchos_device_armv7k_platform, platform_headers) + build_target(watchos_device_arm64_32_platform, platform_headers) ++ if generate_visionos: ++ build_target(visionos_simulator_arm64_platform, platform_headers) ++ build_target(visionos_device_arm64_platform, platform_headers) + + mkdir_p('darwin_common/include') + for header_name, tag_tuples in platform_headers.items(): +@@ -302,11 +323,13 @@ + 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) ++ parser.add_argument('--only-visionos', action='store_true', default=False) + args = parser.parse_args() + + 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=not args.only_ios and not args.only_tvos and not args.only_watchos and not args.only_visionos, ++ generate_ios=not args.only_osx and not args.only_tvos and not args.only_watchos and not args.only_visionos, ++ generate_tvos=not args.only_ios and not args.only_osx and not args.only_watchos and not args.only_visionos, ++ generate_watchos=not args.only_ios and not args.only_osx and not args.only_tvos and not args.only_visionos, ++ generate_visionos=not args.only_ios and not args.only_osx and not args.only_tvos and not args.only_watchos, + ) + diff --git a/patch/mpdecimal.patch b/patch/mpdecimal.patch index f0cf088..0a8a187 100644 --- a/patch/mpdecimal.patch +++ b/patch/mpdecimal.patch @@ -10,12 +10,17 @@ diff -ur mpdecimal-4.0.0-orig/config.sub mpdecimal-4.0.0/config.sub cpu=aarch64 ;; +@@ -1713,3 +1713,3 @@ + | hiux* | abug | nacl* | netware* | windows* \ +- | os9* | macos* | osx* | ios* | tvos* | watchos* \ ++ | os9* | macos* | osx* | ios* | tvos* | watchos* | xros* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ @@ -1792,6 +1792,8 @@ os2-emx) ;; *-eabi* | *-gnueabi*) + ;; -+ ios*-simulator | tvos*-simulator | watchos*-simulator) ++ ios*-simulator | tvos*-simulator | watchos*-simulator | xros*-simulator) ;; none-coff* | none-elf*) # None (no kernel, i.e. freestanding / bare metal), diff --git a/patch/xz.patch b/patch/xz.patch index c9da484..f57b16b 100644 --- a/patch/xz.patch +++ b/patch/xz.patch @@ -10,12 +10,16 @@ diff -ru xz-5.4.7-orig/build-aux/config.sub xz-5.4.7/build-aux/config.sub cpu=aarch64 ;; +@@ -2150,2 +2150,3 @@ + | xray* \ ++ | xros* \ + | zephyr* \ @@ -1865,6 +1865,8 @@ os2-emx-) ;; *-eabi*- | *-gnueabi*-) + ;; -+ ios*-simulator- | tvos*-simulator- | watchos*-simulator- ) ++ ios*-simulator- | tvos*-simulator- | watchos*-simulator- | xros*-simulator-) ;; none--*) # None (no kernel, i.e. freestanding / bare metal),