Skip to content

Commit d9b3b11

Browse files
authored
Adopt the use of the upstream CPython XCframework utils script (#67)
1 parent fc2432a commit d9b3b11

3 files changed

Lines changed: 9 additions & 59 deletions

File tree

{{ cookiecutter.format }}/briefcase.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ app_packages_path = "{{ cookiecutter.class_name }}/app_packages"
99
info_plist_path = "{{ cookiecutter.class_name }}/{{ cookiecutter.class_name }}-Info.plist"
1010
support_path = "Support"
1111
{{ {
12-
"3.10": "support_revision = 12",
13-
"3.11": "support_revision = 7",
14-
"3.12": "support_revision = 7",
15-
"3.13": "support_revision = 12",
16-
"3.14": "support_revision = 8",
12+
"3.10": "support_revision = 13",
13+
"3.11": "support_revision = 8",
14+
"3.12": "support_revision = 8",
15+
"3.13": "support_revision = 13",
16+
"3.14": "support_revision = 9",
1717
}.get(cookiecutter.python_version|py_tag, "") }}
1818

1919
icon.20 = "{{ cookiecutter.class_name }}/Images.xcassets/AppIcon.appiconset/icon-20.png"

{{ cookiecutter.format }}/{{ cookiecutter.class_name }}/dylib-Info-template.plist

Lines changed: 0 additions & 26 deletions
This file was deleted.

{{ cookiecutter.format }}/{{ cookiecutter.formal_name }}.xcodeproj/project.pbxproj

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
600000000000000000100100 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 610000000000000000100300 /* main.m */; };
1515
600000000000000000100200 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 610000000000000000100800 /* Images.xcassets */; };
1616
600000000000000000100300 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 610000000000000000100900 /* Launch Screen.storyboard */; };
17-
60754F822AA5926A0013A4FB /* dylib-Info-template.plist in Resources */ = {isa = PBXBuildFile; fileRef = 60754F802AA57C440013A4FB /* dylib-Info-template.plist */; };
1817
60813D372B02EED200EFB492 /* Python.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60813D352B02EBFC00EFB492 /* Python.xcframework */; };
1918
60813D382B02EED200EFB492 /* Python.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 60813D352B02EBFC00EFB492 /* Python.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
2019
60A04BC728B35FD000DAA9E5 /* app in Resources */ = {isa = PBXBuildFile; fileRef = 610000000000000000100100 /* app */; };
@@ -36,7 +35,6 @@
3635
/* End PBXCopyFilesBuildPhase section */
3736

3837
/* Begin PBXFileReference section */
39-
60754F802AA57C440013A4FB /* dylib-Info-template.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "dylib-Info-template.plist"; sourceTree = "<group>"; };
4038
60813D352B02EBFC00EFB492 /* Python.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Python.xcframework; sourceTree = "<group>"; };
4139
60A421FC2AB4256300E46BC3 /* app_packages.iphonesimulator */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app_packages.iphonesimulator; sourceTree = "<group>"; };
4240
60A421FD2AB4256300E46BC3 /* app_packages.iphoneos */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app_packages.iphoneos; sourceTree = "<group>"; };
@@ -119,7 +117,6 @@
119117
610000000000000000100700 /* {{ cookiecutter.class_name }}-Prefix.pch */,
120118
60796EEE19190F4100A9926B /* InfoPlist.strings */,
121119
610000000000000000100900 /* Launch Screen.storyboard */,
122-
60754F802AA57C440013A4FB /* dylib-Info-template.plist */,
123120
);
124121
name = "Supporting Files";
125122
sourceTree = "<group>";
@@ -142,8 +139,7 @@
142139
60796EDE19190F4100A9926B /* Sources */,
143140
60796EDF19190F4100A9926B /* Frameworks */,
144141
60796EE019190F4100A9926B /* Resources */,
145-
609384A628B5B958005B2A5D /* Install target specific Python modules */,
146-
609384A528B45C86005B2A5D /* Sign Python Binary Modules */,
142+
609384A628B5B958005B2A5D /* Process Python libraries */,
147143
6060E7A12AF8BF4400C04AE0 /* Embed Frameworks */,
148144
);
149145
buildRules = (
@@ -192,14 +188,13 @@
192188
600000000000000000100200 /* Images.xcassets in Resources */,
193189
600000000000000000100300 /* Launch Screen.storyboard in Resources */,
194190
60A04BC728B35FD000DAA9E5 /* app in Resources */,
195-
60754F822AA5926A0013A4FB /* dylib-Info-template.plist in Resources */,
196191
);
197192
runOnlyForDeploymentPostprocessing = 0;
198193
};
199194
/* End PBXResourcesBuildPhase section */
200195

201196
/* Begin PBXShellScriptBuildPhase section */
202-
609384A528B45C86005B2A5D /* Sign Python Binary Modules */ = {
197+
609384A628B5B958005B2A5D /* Process Python libraries */ = {
203198
isa = PBXShellScriptBuildPhase;
204199
alwaysOutOfDate = 1;
205200
buildActionMask = 2147483647;
@@ -209,33 +204,14 @@
209204
);
210205
inputPaths = (
211206
);
212-
name = "Sign Python Binary Modules";
207+
name = "Process Python libraries";
213208
outputFileListPaths = (
214209
);
215210
outputPaths = (
216211
);
217212
runOnlyForDeploymentPostprocessing = 0;
218213
shellPath = /bin/sh;
219-
shellScript = "set -e\n\ninstall_dylib () {\n INSTALL_BASE=$1\n FULL_EXT=$2\n\n # The name of the extension file\n EXT=$(basename \"$FULL_EXT\")\n # The name and location of the module\n MODULE_PATH=$(dirname \"$FULL_EXT\") \n MODULE_NAME=$(echo $EXT | cut -d \".\" -f 1) \n # The location of the extension file, relative to the bundle\n RELATIVE_EXT=${FULL_EXT#$CODESIGNING_FOLDER_PATH/} \n # The path to the extension file, relative to the install base\n PYTHON_EXT=${RELATIVE_EXT/$INSTALL_BASE/}\n # The full dotted name of the extension module, constructed from the file path.\n FULL_MODULE_NAME=$(echo $PYTHON_EXT | cut -d \".\" -f 1 | tr \"/\" \".\"); \n # A bundle identifier; not actually used, but required by Xcode framework packaging\n FRAMEWORK_BUNDLE_ID=$(echo $PRODUCT_BUNDLE_IDENTIFIER.$FULL_MODULE_NAME | tr \"_\" \"-\")\n # The name of the framework folder.\n FRAMEWORK_FOLDER=\"Frameworks/$FULL_MODULE_NAME.framework\"\n\n # If the framework folder doesn't exist, create it.\n if [ ! -d \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER\" ]; then\n echo \"Creating framework for $RELATIVE_EXT\" \n mkdir -p \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER\"\n\n cp \"$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n plutil -replace CFBundleExecutable -string \"$FULL_MODULE_NAME\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n plutil -replace CFBundleIdentifier -string \"$FRAMEWORK_BUNDLE_ID\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n fi\n \n echo \"Installing binary for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME\" \n mv \"$FULL_EXT\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME\"\n if [ -e \"$MODULE_PATH/$MODULE_NAME.xcprivacy\" ];then \n echo \"Installing XCPrivacy file for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME\"\n XCPRIVACY_FILE=\"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/PrivacyInfo.xcprivacy\"\n if [ -e \"$XCPRIVACY_FILE\" ]; then\n rm -rf \"$XCPRIVACY_FILE\"\n fi\n mv \"$MODULE_PATH/$MODULE_NAME.xcprivacy\" \"$XCPRIVACY_FILE\"\n fi\n if [ -e \"$FULL_EXT.dSYM\" ];then \n echo \"Installing dSYM file for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME\"\n DSYM_FILE=\"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM\"\n if [ -e \"$DSYM_FILE\" ]; then\n rm -rf \"$DSYM_FILE\"\n fi\n mv \"$FULL_EXT.dSYM\" \"$DSYM_FILE\"\n plutil -replace CFBundleIdentifier -string \"$FRAMEWORK_BUNDLE_ID\" \"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM/Contents/Info.plist\"\n mv \"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM/Contents/Resources/DWARF/$EXT\" \"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM/Contents/Resources/DWARF/$FULL_MODULE_NAME\"\n find \"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM/Contents/Resources\" -name \"$EXT.*\" | while read YML; do\n mv \"$YML\" \"$(dirname \"$YML\")/$FULL_MODULE_NAME.yml\"\n done\n fi\n # Create a placeholder .fwork file where the .so was\n echo \"$FRAMEWORK_FOLDER/$FULL_MODULE_NAME\" > ${FULL_EXT%.so}.fwork\n # Create a back reference to the .so file location in the framework\n echo \"${RELATIVE_EXT%.so}.fwork\" > \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME.origin\" \n}\n\necho \"Install standard library extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/python/lib/python{{ cookiecutter.python_version|py_tag }}/lib-dynload\" -name \"*.so\" -not -path \"*/*.so.dSYM/*\" | while read FULL_EXT; do\n install_dylib python/lib/python{{ cookiecutter.python_version|py_tag }}/lib-dynload/ \"$FULL_EXT\"\ndone\necho \"Install app package extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/app_packages\" -name \"*.so\" -not -path \"*/*.so.dSYM/*\" | while read FULL_EXT; do\n install_dylib app_packages/ \"$FULL_EXT\"\ndone\necho \"Install app extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/app\" -name \"*.so\" -not -path \"*/*.so.dSYM/*\" | while read FULL_EXT; do\n install_dylib app/ \"$FULL_EXT\"\ndone\n\n# Clean up dylib template \nrm -f \"$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist\"\n\necho \"Signing frameworks as $EXPANDED_CODE_SIGN_IDENTITY_NAME ($EXPANDED_CODE_SIGN_IDENTITY)...\"\nfind \"$CODESIGNING_FOLDER_PATH/Frameworks\" -name \"*.framework\" -exec /usr/bin/codesign --force --sign \"$EXPANDED_CODE_SIGN_IDENTITY\" ${OTHER_CODE_SIGN_FLAGS:-} -o runtime --timestamp=none --preserve-metadata=identifier,entitlements,flags --generate-entitlement-der \"{}\" \\; \n";
220-
};
221-
609384A628B5B958005B2A5D /* Install target specific Python modules */ = {
222-
isa = PBXShellScriptBuildPhase;
223-
alwaysOutOfDate = 1;
224-
buildActionMask = 2147483647;
225-
files = (
226-
);
227-
inputFileListPaths = (
228-
);
229-
inputPaths = (
230-
);
231-
name = "Install target specific Python modules";
232-
outputFileListPaths = (
233-
);
234-
outputPaths = (
235-
);
236-
runOnlyForDeploymentPostprocessing = 0;
237-
shellPath = /bin/sh;
238-
shellScript = "set -e\n\nmkdir -p \"$CODESIGNING_FOLDER_PATH/python/lib\"\nPYTHON_XCFRAMEWORK_PATH=\"Support/Python.xcframework\"\nif [ \"$EFFECTIVE_PLATFORM_NAME\" = \"-iphonesimulator\" ]; then\n echo \"Installing Python modules for iOS Simulator\"\n SLICE_FOLDER=\"ios-arm64_x86_64-simulator\"\n PACKAGES_PATH=\"{{ cookiecutter.class_name }}/app_packages.iphonesimulator\"\nelse\n echo \"Installing Python modules for iOS Device\"\n SLICE_FOLDER=\"ios-arm64\"\n PACKAGES_PATH=\"{{ cookiecutter.class_name }}/app_packages.iphoneos\"\nfi\n\n# Python3.14+ arch-specific lib folder\necho \"CHECK $PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/lib\" \nif [ -d \"$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/lib\" ]; then\n rsync -au --delete \"$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/lib/\" \"$CODESIGNING_FOLDER_PATH/python/lib/\"\n rsync -au \"$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib-$ARCHS/\" \"$CODESIGNING_FOLDER_PATH/python/lib/\"\nelse\n # A single-arch framework will have a libpython symlink; that can't be included at runtime\n rsync -au --delete \"$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib/\" \"$CODESIGNING_FOLDER_PATH/python/lib/\" --exclude 'libpython*.dylib'\nfi\n\nif [ -e \"$PYTHON_SLICE/Python.dSYM\" ]; then \n rsync -au --delete \"$PYTHON_SLICE/Python.dSYM\" \"$BUILT_PRODUCTS_DIR\"\nfi\nrsync -au --delete \"$PROJECT_DIR/$PACKAGES_PATH/\" \"$CODESIGNING_FOLDER_PATH/app_packages\"\n";
214+
shellScript = "set -e\nsource $PROJECT_DIR/Support/Python.xcframework/build/utils.sh\n\nif [ \"$EFFECTIVE_PLATFORM_NAME\" = \"-iphonesimulator\" ]; then\n echo \"Installing app packages for iOS Simulator\"\n PACKAGES_PATH=\"app_packages.iphonesimulator\"\nelse\n echo \"Installing app packages for iOS Device\"\n PACKAGES_PATH=\"app_packages.iphoneos\"\nfi\nrsync -au --delete \"$PROJECT_DIR/{{ cookiecutter.class_name }}/$PACKAGES_PATH/\" \"$CODESIGNING_FOLDER_PATH/app_packages\"\n\ninstall_python Support/Python.xcframework app app_packages\n";
239215
showEnvVarsInLog = 0;
240216
};
241217
/* End PBXShellScriptBuildPhase section */

0 commit comments

Comments
 (0)