Skip to content

Commit 7176d32

Browse files
committed
add support for mc
1 parent 8019835 commit 7176d32

File tree

5 files changed

+1520
-187
lines changed

5 files changed

+1520
-187
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ jobs:
8989
strategy:
9090
fail-fast: false
9191
matrix:
92-
target: ['macOS', 'iOS', 'tvOS', 'watchOS', 'visionOS']
92+
target: ['macOS', 'iOS', 'tvOS', 'watchOS', 'visionOS', 'MacCatalyst']
9393
include:
9494
- briefcase-run-args:
9595
- run-tests: false

.github/workflows/publish.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,6 @@ jobs:
5151
# visionOS build
5252
curl -o visionOS-artefact.tar.gz -L https://github.com/beeware/Python-Apple-support/releases/download/${{ steps.build-vars.outputs.TAG }}/Python-${{ steps.build-vars.outputs.PYTHON_VER }}-visionOS-support.${{ steps.build-vars.outputs.BUILD_NUMBER }}.tar.gz
5353
aws s3 cp visionOS-artefact.tar.gz s3://briefcase-support/python/${{ steps.build-vars.outputs.PYTHON_VER }}/visionOS/Python-${{ steps.build-vars.outputs.PYTHON_VER }}-visionOS-support.${{ steps.build-vars.outputs.BUILD_NUMBER }}.tar.gz
54+
# MacCatalyst build
55+
curl -o MacCatalyst-artefact.tar.gz -L https://github.com/beeware/Python-Apple-support/releases/download/${{ steps.build-vars.outputs.TAG }}/Python-${{ steps.build-vars.outputs.PYTHON_VER }}-MacCatalyst-support.${{ steps.build-vars.outputs.BUILD_NUMBER }}.tar.gz
56+
aws s3 cp MacCatalyst-artefact.tar.gz s3://briefcase-support/python/${{ steps.build-vars.outputs.PYTHON_VER }}/MacCatalyst/Python-${{ steps.build-vars.outputs.PYTHON_VER }}-MacCatalyst-support.${{ steps.build-vars.outputs.BUILD_NUMBER }}.tar.gz

Makefile

Lines changed: 74 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,33 +34,45 @@ OPENSSL_VERSION=3.0.16-2
3434
XZ_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

3939
CURL_FLAGS=--disable --fail --location --create-dirs --progress-bar
4040

4141
# macOS targets
4242
TARGETS-macOS=macosx.x86_64 macosx.arm64
4343
TRIPLE_OS-macOS=macos
4444
VERSION_MIN-macOS=11.0
45+
CONFIGFLAGS-macOS=
4546

4647
# iOS targets
4748
TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.arm64 iphoneos.arm64
4849
TRIPLE_OS-iOS=ios
4950
VERSION_MIN-iOS=13.0
51+
CONFIGFLAGS-iOS=
5052

5153
# tvOS targets
5254
TARGETS-tvOS=appletvsimulator.x86_64 appletvsimulator.arm64 appletvos.arm64
5355
TRIPLE_OS-tvOS=tvos
5456
VERSION_MIN-tvOS=12.0
57+
CONFIGFLAGS-tvOS=
5558

5659
# watchOS targets
5760
TARGETS-watchOS=watchsimulator.x86_64 watchsimulator.arm64 watchos.arm64_32
5861
TRIPLE_OS-watchOS=watchos
5962
VERSION_MIN-watchOS=4.0
63+
CONFIGFLAGS-watchOS=
6064

65+
# visionOS targets
6166
TARGETS-visionOS=xrsimulator.arm64 xros.arm64
6267
TRIPLE_OS-visionOS=xros
6368
VERSION_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
6678
HOST_ARCH=$(shell uname -m)
@@ -132,13 +144,19 @@ os=$2
132144
OS_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)))
136149
ARCH-$(target)=$$(subst .,,$$(suffix $(target)))
137150

138151
ifneq ($(os),macOS)
139-
ifeq ($$(findstring simulator,$$(SDK-$(target))),)
152+
ifeq ($$(findstring simulator,$$(BASE-$(target))),)
153+
ifeq ($$(findstring macabi,$$(BASE-$(target))),)
140154
TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(TRIPLE_OS-$(os))$$(VERSION_MIN-$(os))
141155
IS_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
143161
TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(TRIPLE_OS-$(os))$$(VERSION_MIN-$(os))-simulator
144162
IS_SIMULATOR-$(target)=True
@@ -266,10 +284,17 @@ ifneq ($(os),macOS)
266284
PYTHON_SRCDIR-$(target)=build/$(os)/$(target)/python-$(PYTHON_VERSION)
267285
PYTHON_INSTALL-$(target)=$(PROJECT_DIR)/install/$(os)/$(target)/python-$(PYTHON_VERSION)
268286
PYTHON_FRAMEWORK-$(target)=$$(PYTHON_INSTALL-$(target))/Python.framework
287+
ifneq ($$(BASE-$(target)),macabi)
269288
PYTHON_LIB-$(target)=$$(PYTHON_FRAMEWORK-$(target))/Python
270289
PYTHON_BIN-$(target)=$$(PYTHON_INSTALL-$(target))/bin
271290
PYTHON_INCLUDE-$(target)=$$(PYTHON_FRAMEWORK-$(target))/Headers
272291
PYTHON_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
273298
PYTHON_PLATFORM_CONFIG-$(target)=$$(PYTHON_INSTALL-$(target))/platform-config/$$(ARCH-$(target))-$$(SDK-$(target))
274299
PYTHON_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

368395
vars-$(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)))
411439
SDK_ARCHES-$(sdk)=$$(sort $$(subst .,,$$(suffix $$(SDK_TARGETS-$(sdk)))))
412440

413441
ifeq ($$(findstring simulator,$(sdk)),)
442+
ifeq ($$(findstring macabi,$(sdk)),)
414443
SDK_SLICE-$(sdk)=$$(TRIPLE_OS-$(os))-$$(shell echo $$(SDK_ARCHES-$(sdk)) | sed "s/ /_/g")
415444
else
445+
SDK_SLICE-$(sdk)=$$(TRIPLE_OS-$(os))-$$(shell echo $$(SDK_ARCHES-$(sdk)) | sed "s/ /_/g")-maccatalyst
446+
endif
447+
else
416448
SDK_SLICE-$(sdk)=$$(TRIPLE_OS-$(os))-$$(shell echo $$(SDK_ARCHES-$(sdk)) | sed "s/ /_/g")-simulator
417449
endif
418450

@@ -446,24 +478,45 @@ else
446478
PYTHON_INSTALL-$(sdk)=$(PROJECT_DIR)/install/$(os)/$(sdk)/python-$(PYTHON_VERSION)
447479
PYTHON_MODULEMAP-$(sdk)=$$(PYTHON_INCLUDE-$(sdk))/module.modulemap
448480
PYTHON_FRAMEWORK-$(sdk)=$$(PYTHON_INSTALL-$(sdk))/Python.framework
481+
ifneq ($(sdk),macabi)
449482
PYTHON_LIB-$(sdk)=$$(PYTHON_FRAMEWORK-$(sdk))/Python
450483
PYTHON_BIN-$(sdk)=$$(PYTHON_INSTALL-$(sdk))/bin
451484
PYTHON_INCLUDE-$(sdk)=$$(PYTHON_FRAMEWORK-$(sdk))/Headers
452485
PYTHON_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
453492
PYTHON_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

493552
ifeq ($(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; )
495557
else
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
501563
endif
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
680748
endif
681749

682750
@echo ">>> Create VERSIONS file for $(os)"

0 commit comments

Comments
 (0)