@@ -34,33 +34,45 @@ OPENSSL_VERSION=3.0.16-2
3434XZ_VERSION =5.6.4-2
3535
3636# Supported OS
37- OS_LIST =macOS iOS tvOS watchOS visionOS
37+ OS_LIST =macOS iOS tvOS watchOS visionOS MacCatalyst
3838
3939CURL_FLAGS =--disable --fail --location --create-dirs --progress-bar
4040
4141# macOS targets
4242TARGETS-macOS =macosx.x86_64 macosx.arm64
4343TRIPLE_OS-macOS =macos
4444VERSION_MIN-macOS =11.0
45+ CONFIGFLAGS-macOS =
4546
4647# iOS targets
4748TARGETS-iOS =iphonesimulator.x86_64 iphonesimulator.arm64 iphoneos.arm64
4849TRIPLE_OS-iOS =ios
4950VERSION_MIN-iOS =13.0
51+ CONFIGFLAGS-iOS =
5052
5153# tvOS targets
5254TARGETS-tvOS =appletvsimulator.x86_64 appletvsimulator.arm64 appletvos.arm64
5355TRIPLE_OS-tvOS =tvos
5456VERSION_MIN-tvOS =12.0
57+ CONFIGFLAGS-tvOS =
5558
5659# watchOS targets
5760TARGETS-watchOS =watchsimulator.x86_64 watchsimulator.arm64 watchos.arm64_32
5861TRIPLE_OS-watchOS =watchos
5962VERSION_MIN-watchOS =4.0
63+ CONFIGFLAGS-watchOS =
6064
65+ # visionOS targets
6166TARGETS-visionOS =xrsimulator.arm64 xros.arm64
6267TRIPLE_OS-visionOS =xros
6368VERSION_MIN-visionOS =2.0
69+ CONFIGFLAGS-visionOS =
70+
71+ # Mac Catalyst Targets
72+ TARGETS-MacCatalyst =macabi.x86_64 macabi.arm64
73+ TRIPLE_OS-MacCatalyst =ios
74+ VERSION_MIN-MacCatalyst =14.2
75+ CONFIGFLAGS-MacCatalyst=--with-catalyst-macos-version =11.2
6476
6577# The architecture of the machine doing the build
6678HOST_ARCH =$(shell uname -m)
@@ -132,13 +144,19 @@ os=$2
132144OS_LOWER-$(target ) =$(shell echo $(os ) | tr '[:upper:]' '[:lower:]')
133145
134146# $(target) can be broken up into is composed of $(SDK).$(ARCH)
135- SDK-$(target ) =$$(basename $(target ) )
147+ BASE-$(target ) =$$(basename $(target ) )
148+ SDK-$(target ) =$$(subst macabi,macosx,$$(BASE-$(target ) ) )
136149ARCH-$(target ) =$$(subst .,,$$(suffix $(target ) ) )
137150
138151ifneq ($(os ) ,macOS)
139- ifeq ($$(findstring simulator,$$(SDK-$(target))),)
152+ ifeq ($$(findstring simulator,$$(BASE-$(target))),)
153+ ifeq ($$(findstring macabi,$$(BASE-$(target))),)
140154TARGET_TRIPLE-$(target) =$$(ARCH-$(target ) ) -apple-$$(TRIPLE_OS-$(os ) )$$(VERSION_MIN-$(os ) )
141155IS_SIMULATOR-$(target) =False
156+ else
157+ TARGET_TRIPLE-$(target) =$$(ARCH-$(target ) ) -apple-$$(TRIPLE_OS-$(os ) )$$(VERSION_MIN-$(os ) ) -macabi
158+ IS_SIMULATOR-$(target) =False
159+ endif
142160 else
143161TARGET_TRIPLE-$(target) =$$(ARCH-$(target ) ) -apple-$$(TRIPLE_OS-$(os ) )$$(VERSION_MIN-$(os ) ) -simulator
144162IS_SIMULATOR-$(target) =True
@@ -266,10 +284,17 @@ ifneq ($(os),macOS)
266284PYTHON_SRCDIR-$(target) =build/$(os ) /$(target ) /python-$(PYTHON_VERSION )
267285PYTHON_INSTALL-$(target) =$(PROJECT_DIR ) /install/$(os ) /$(target ) /python-$(PYTHON_VERSION )
268286PYTHON_FRAMEWORK-$(target) =$$(PYTHON_INSTALL-$(target ) ) /Python.framework
287+ ifneq ($$(BASE-$(target ) ) ,macabi)
269288PYTHON_LIB-$(target) =$$(PYTHON_FRAMEWORK-$(target ) ) /Python
270289PYTHON_BIN-$(target) =$$(PYTHON_INSTALL-$(target ) ) /bin
271290PYTHON_INCLUDE-$(target) =$$(PYTHON_FRAMEWORK-$(target ) ) /Headers
272291PYTHON_STDLIB-$(target) =$$(PYTHON_INSTALL-$(target ) ) /lib/python$(PYTHON_VER )
292+ else
293+ PYTHON_LIB-$(target) =$$(PYTHON_FRAMEWORK-$(target ) ) /Versions/$(PYTHON_VER ) /Python
294+ PYTHON_BIN-$(target) =$$(PYTHON_FRAMEWORK-$(target ) ) /Versions/$(PYTHON_VER ) /bin
295+ PYTHON_INCLUDE-$(target) =$$(PYTHON_FRAMEWORK-$(target ) ) /Versions/$(PYTHON_VER ) /Headers
296+ PYTHON_STDLIB-$(target) =$$(PYTHON_FRAMEWORK-$(target ) ) /Versions/$(PYTHON_VER ) /lib/python$(PYTHON_VER )
297+ endif
273298PYTHON_PLATFORM_CONFIG-$(target) =$$(PYTHON_INSTALL-$(target ) ) /platform-config/$$(ARCH-$(target ) ) -$$(SDK-$(target ) )
274299PYTHON_PLATFORM_SITECUSTOMIZE-$(target) =$$(PYTHON_PLATFORM_CONFIG-$(target ) ) /sitecustomize.py
275300
@@ -312,10 +337,12 @@ $$(PYTHON_SRCDIR-$(target))/Makefile: \
312337 --with-openssl=" $$ (OPENSSL_INSTALL-$( target) )" \
313338 --enable-framework=" $$ (PYTHON_INSTALL-$( target) )" \
314339 --with-system-libmpdec \
340+ $$(CONFIGFLAGS-$(os ) ) \
315341 2>&1 | tee -a ../python-$(PYTHON_VERSION ) .config.log
316342
317343$$(PYTHON_SRCDIR-$(target ) ) /python.exe : $$(PYTHON_SRCDIR-$(target ) ) /Makefile
318344 @echo " >>> Build Python for $( target) "
345+
319346 cd $$(PYTHON_SRCDIR-$(target ) ) && \
320347 PATH=" $( PROJECT_DIR) /$$ (PYTHON_SRCDIR-$( target) )/$( os) /Resources/bin:$( PATH) " \
321348 make -j8 all \
@@ -367,6 +394,7 @@ $(target): $$(PYTHON_PLATFORM_SITECUSTOMIZE-$(target)) $$(PYTHON_LIB-$(target))
367394
368395vars-$(target ) :
369396 @echo ">>> Environment variables for $(target ) "
397+ @echo "BASE-$(target ) : $$(BASE-$(target ) ) "
370398 @echo "SDK-$(target ) : $$(SDK-$(target ) ) "
371399 @echo "ARCH-$(target ) : $$(ARCH-$(target ) ) "
372400 @echo "TARGET_TRIPLE-$(target ) : $$(TARGET_TRIPLE-$(target ) ) "
@@ -411,8 +439,12 @@ SDK_TARGETS-$(sdk)=$$(filter $(sdk).%,$$(TARGETS-$(os)))
411439SDK_ARCHES-$(sdk ) =$$(sort $$(subst .,,$$(suffix $$(SDK_TARGETS-$(sdk ) ) ) ) )
412440
413441ifeq ($$(findstring simulator,$(sdk ) ) ,)
442+ ifeq ($$(findstring macabi,$(sdk ) ) ,)
414443SDK_SLICE-$(sdk) =$$(TRIPLE_OS-$(os ) ) -$$(shell echo $$(SDK_ARCHES-$(sdk ) ) | sed "s/ /_/g")
415444else
445+ SDK_SLICE-$(sdk) =$$(TRIPLE_OS-$(os ) ) -$$(shell echo $$(SDK_ARCHES-$(sdk ) ) | sed "s/ /_/g") -maccatalyst
446+ endif
447+ else
416448SDK_SLICE-$(sdk) =$$(TRIPLE_OS-$(os ) ) -$$(shell echo $$(SDK_ARCHES-$(sdk ) ) | sed "s/ /_/g") -simulator
417449endif
418450
@@ -446,24 +478,45 @@ else
446478PYTHON_INSTALL-$(sdk) =$(PROJECT_DIR ) /install/$(os ) /$(sdk ) /python-$(PYTHON_VERSION )
447479PYTHON_MODULEMAP-$(sdk) =$$(PYTHON_INCLUDE-$(sdk ) ) /module.modulemap
448480PYTHON_FRAMEWORK-$(sdk) =$$(PYTHON_INSTALL-$(sdk ) ) /Python.framework
481+ ifneq ($(sdk ) ,macabi)
449482PYTHON_LIB-$(sdk) =$$(PYTHON_FRAMEWORK-$(sdk ) ) /Python
450483PYTHON_BIN-$(sdk) =$$(PYTHON_INSTALL-$(sdk ) ) /bin
451484PYTHON_INCLUDE-$(sdk) =$$(PYTHON_FRAMEWORK-$(sdk ) ) /Headers
452485PYTHON_STDLIB-$(sdk) =$$(PYTHON_INSTALL-$(sdk ) ) /lib/python$(PYTHON_VER )
486+ else
487+ PYTHON_LIB-$(sdk) =$$(PYTHON_FRAMEWORK-$(sdk ) ) /Versions/$(PYTHON_VER ) /Python
488+ PYTHON_BIN-$(sdk) =$$(PYTHON_FRAMEWORK-$(sdk ) ) /Versions/$(PYTHON_VER ) /bin
489+ PYTHON_INCLUDE-$(sdk) =$$(PYTHON_FRAMEWORK-$(sdk ) ) /Versions/$(PYTHON_VER ) /Headers
490+ PYTHON_STDLIB-$(sdk) =$$(PYTHON_FRAMEWORK-$(sdk ) ) /Versions/$(PYTHON_VER ) /lib/python$(PYTHON_VER )
491+ endif
453492PYTHON_PLATFORM_CONFIG-$(sdk) =$$(PYTHON_INSTALL-$(sdk ) ) /platform-config
454493
455494$$(PYTHON_LIB-$(sdk ) ) : $$(foreach target,$$(SDK_TARGETS-$(sdk ) ) ,$$(PYTHON_LIB-$$(target ) ) )
456495 @echo " >>> Build Python fat library for the $( sdk) SDK"
457496 mkdir -p $$(dir $$(PYTHON_LIB-$(sdk ) ) )
497+ ifeq ($(sdk ) ,macabi)
498+ ln -si $(PYTHON_VER) $$(PYTHON_FRAMEWORK-$(sdk))/Versions/Current
499+ ln -si Versions/Current/Headers $$(PYTHON_FRAMEWORK-$(sdk))/Headers
500+ ln -si Versions/Current/Resources $$(PYTHON_FRAMEWORK-$(sdk))/Resources
501+ ln -si Versions/Current/Python $$(PYTHON_FRAMEWORK-$(sdk))/Python
502+ endif
458503 lipo -create -output $$@ $$^ \
459504 2>&1 | tee -a install/$(os)/$(sdk)/python-$(PYTHON_VERSION).lipo.log
460505 # Disable dSYM production (for now)
461506 # dsymutil $$@ -o $$(PYTHON_INSTALL-$(sdk))/Python.dSYM
462507
508+ ifneq ($(sdk ) ,macabi)
463509$$(PYTHON_FRAMEWORK-$(sdk ) ) /Info.plist : $$(PYTHON_LIB-$(sdk ) )
464510 @echo " >>> Install Info.plist for the $( sdk) SDK"
465511 # Copy Info.plist as-is from the first target in the $(sdk) SDK
466512 cp -r $$(PYTHON_FRAMEWORK-$$(firstword $$(SDK_TARGETS-$(sdk ) ) ) ) /Info.plist $$(PYTHON_FRAMEWORK-$(sdk ) )
513+ else
514+ $$(PYTHON_FRAMEWORK-$(sdk ) ) /Versions/$(PYTHON_VER ) /Resources :
515+ echo " >>> Copying Resources Folder for Versioned Framework from the first target in the SDK"
516+ mkdir -p $$(PYTHON_FRAMEWORK-$(sdk ) ) /Versions/$(PYTHON_VER )
517+ # Copy Resources as-is from the first target in the $(sdk) SDK
518+ cp -r $$(PYTHON_FRAMEWORK-$$(firstword $$(SDK_TARGETS-$(sdk ) ) ) ) /Versions/$(PYTHON_VER ) /Resources $$(PYTHON_FRAMEWORK-$(sdk ) ) /Versions/$(PYTHON_VER )
519+ endif
467520
468521$$(PYTHON_INCLUDE-$(sdk ) ) /pyconfig.h : $$(PYTHON_LIB-$(sdk ) )
469522 @echo " >>> Build Python fat headers for the $( sdk) SDK"
@@ -487,11 +540,20 @@ $$(PYTHON_INCLUDE-$(sdk))/pyconfig.h: $$(PYTHON_LIB-$(sdk))
487540 echo "\n}" >> $$(PYTHON_MODULEMAP-$(sdk))
488541
489542 # Link the PYTHONHOME version of the headers
543+ ifneq ($(sdk ) ,macabi)
490544 mkdir -p $$(PYTHON_INSTALL-$(sdk))/include
491545 ln -si ../Python.framework/Headers $$(PYTHON_INSTALL-$(sdk))/include/python$(PYTHON_VER)
546+ else
547+ mkdir -p $$(PYTHON_FRAMEWORK-$(sdk))/Versions/$(PYTHON_VER)/include
548+ rm -rf $(PYTHON_FRAMEWORK-$(sdk))/Versions/$(PYTHON_VER)/include/*
549+ ln -si ../Headers $$(PYTHON_FRAMEWORK-$(sdk))/Versions/$(PYTHON_VER)/include/python$(PYTHON_VER)
550+ endif
492551
493552ifeq ($(os ) , visionOS)
494553 echo "Skipping arch-specific header copying for visionOS"
554+
555+ # Add the headers from each target -- there's should only be one target, so we copy it to the same name.
556+ $$(foreach target,$$(SDK_TARGETS-$(sdk)),cp $$(PYTHON_INCLUDE-$$(target))/pyconfig.h $$(PYTHON_INCLUDE-$(sdk))/pyconfig.h; )
495557else
496558 # Add the individual headers from each target in an arch-specific name
497559 $$(foreach target,$$(SDK_TARGETS-$(sdk)),cp $$(PYTHON_INCLUDE-$$(target))/pyconfig.h $$(PYTHON_INCLUDE-$(sdk))/pyconfig-$$(ARCH-$$(target)).h; )
@@ -500,8 +562,11 @@ else
500562 cp $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$(sdk))))/$(os)/Resources/pyconfig.h $$(PYTHON_INCLUDE-$(sdk))/pyconfig.h
501563endif
502564
503-
565+ ifneq ( $( sdk ) ,macabi)
504566$$(PYTHON_STDLIB-$(sdk ) ) /LICENSE.TXT : $$(PYTHON_LIB-$(sdk ) ) $$(PYTHON_FRAMEWORK-$(sdk ) ) /Info.plist $$(PYTHON_INCLUDE-$(sdk ) ) /pyconfig.h $$(foreach target,$$(SDK_TARGETS-$(sdk ) ) ,$$(PYTHON_PLATFORM_SITECUSTOMIZE-$$(target ) ) )
567+ else
568+ $$(PYTHON_STDLIB-$(sdk ) ) /LICENSE.TXT : $$(PYTHON_LIB-$(sdk ) ) $$(PYTHON_FRAMEWORK-$(sdk ) ) /Versions/$(PYTHON_VER ) /Resources $$(PYTHON_INCLUDE-$(sdk ) ) /pyconfig.h $$(foreach target,$$(SDK_TARGETS-$(sdk ) ) ,$$(PYTHON_PLATFORM_SITECUSTOMIZE-$$(target ) ) )
569+ endif
505570 @echo ">>> Build Python stdlib for the $(sdk) SDK"
506571 mkdir -p $$(PYTHON_STDLIB-$(sdk))/lib-dynload
507572 # Copy stdlib from the first target associated with the $(sdk) SDK
@@ -667,16 +732,19 @@ $$(PYTHON_XCFRAMEWORK-$(os))/Info.plist: \
667732 2>&1 | tee -a support/$(PYTHON_VER ) /python-$(os ) .xcframework.log
668733
669734 @echo ">>> Install PYTHONHOME for $(os)"
735+ # Do not install stuff for macabi becuase it's already built into the framework.
736+ ifneq ($(os ) ,MacCatalyst)
670737 $$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/include $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
671738 $$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/bin $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
672739 $$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/lib $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
740+ endif
673741 $$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/platform-config $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
674742 # Disable dSYM production (for now)
675743 # $$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/Python.dSYM $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
676744
677- ifeq ($(filter $(os ) ,iOS visionOS) ,$(os ) )
745+ ifeq ($(filter $(os ) ,iOS visionOS MacCatalyst ) ,$(os ) )
678746 @echo ">>> Clone testbed project for $(os)"
679- $(HOST_PYTHON) $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$$(firstword $$(SDKS-$(os))))))/$(os )/testbed clone --framework $$(PYTHON_XCFRAMEWORK-$(os)) support/$(PYTHON_VER)/$(os)/testbed
747+ $(HOST_PYTHON) $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$$(firstword $$(SDKS-$(os))))))/$$(subst MacCatalyst,iOS,$(os) )/testbed clone --framework $$(PYTHON_XCFRAMEWORK-$(os)) support/$(PYTHON_VER)/$(os)/testbed
680748endif
681749
682750 @echo ">>> Create VERSIONS file for $(os)"
0 commit comments