diff --git a/{{ cookiecutter.format }}/briefcase.toml b/{{ cookiecutter.format }}/briefcase.toml index b7557aa..8c56034 100644 --- a/{{ cookiecutter.format }}/briefcase.toml +++ b/{{ cookiecutter.format }}/briefcase.toml @@ -9,11 +9,11 @@ app_packages_path = "{{ cookiecutter.class_name }}/app_packages" info_plist_path = "{{ cookiecutter.class_name }}/{{ cookiecutter.class_name }}-Info.plist" support_path = "Support" {{ { - "3.10": "support_revision = 12", - "3.11": "support_revision = 7", - "3.12": "support_revision = 7", - "3.13": "support_revision = 12", - "3.14": "support_revision = 8", + "3.10": "support_revision = 13", + "3.11": "support_revision = 8", + "3.12": "support_revision = 8", + "3.13": "support_revision = 13", + "3.14": "support_revision = 9", }.get(cookiecutter.python_version|py_tag, "") }} icon.20 = "{{ cookiecutter.class_name }}/Images.xcassets/AppIcon.appiconset/icon-20.png" diff --git a/{{ cookiecutter.format }}/{{ cookiecutter.class_name }}/dylib-Info-template.plist b/{{ cookiecutter.format }}/{{ cookiecutter.class_name }}/dylib-Info-template.plist deleted file mode 100644 index 4cd9504..0000000 --- a/{{ cookiecutter.format }}/{{ cookiecutter.class_name }}/dylib-Info-template.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - - CFBundleIdentifier - - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSupportedPlatforms - - iPhoneOS - - MinimumOSVersion - {{ cookiecutter.min_os_version }} - CFBundleVersion - 1 - - diff --git a/{{ cookiecutter.format }}/{{ cookiecutter.formal_name }}.xcodeproj/project.pbxproj b/{{ cookiecutter.format }}/{{ cookiecutter.formal_name }}.xcodeproj/project.pbxproj index 6177305..7286074 100644 --- a/{{ cookiecutter.format }}/{{ cookiecutter.formal_name }}.xcodeproj/project.pbxproj +++ b/{{ cookiecutter.format }}/{{ cookiecutter.formal_name }}.xcodeproj/project.pbxproj @@ -14,7 +14,6 @@ 600000000000000000100100 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 610000000000000000100300 /* main.m */; }; 600000000000000000100200 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 610000000000000000100800 /* Images.xcassets */; }; 600000000000000000100300 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 610000000000000000100900 /* Launch Screen.storyboard */; }; - 60754F822AA5926A0013A4FB /* dylib-Info-template.plist in Resources */ = {isa = PBXBuildFile; fileRef = 60754F802AA57C440013A4FB /* dylib-Info-template.plist */; }; 60813D372B02EED200EFB492 /* Python.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60813D352B02EBFC00EFB492 /* Python.xcframework */; }; 60813D382B02EED200EFB492 /* Python.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 60813D352B02EBFC00EFB492 /* Python.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 60A04BC728B35FD000DAA9E5 /* app in Resources */ = {isa = PBXBuildFile; fileRef = 610000000000000000100100 /* app */; }; @@ -36,7 +35,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 60754F802AA57C440013A4FB /* dylib-Info-template.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "dylib-Info-template.plist"; sourceTree = ""; }; 60813D352B02EBFC00EFB492 /* Python.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Python.xcframework; sourceTree = ""; }; 60A421FC2AB4256300E46BC3 /* app_packages.iphonesimulator */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app_packages.iphonesimulator; sourceTree = ""; }; 60A421FD2AB4256300E46BC3 /* app_packages.iphoneos */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app_packages.iphoneos; sourceTree = ""; }; @@ -119,7 +117,6 @@ 610000000000000000100700 /* {{ cookiecutter.class_name }}-Prefix.pch */, 60796EEE19190F4100A9926B /* InfoPlist.strings */, 610000000000000000100900 /* Launch Screen.storyboard */, - 60754F802AA57C440013A4FB /* dylib-Info-template.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -142,8 +139,7 @@ 60796EDE19190F4100A9926B /* Sources */, 60796EDF19190F4100A9926B /* Frameworks */, 60796EE019190F4100A9926B /* Resources */, - 609384A628B5B958005B2A5D /* Install target specific Python modules */, - 609384A528B45C86005B2A5D /* Sign Python Binary Modules */, + 609384A628B5B958005B2A5D /* Process Python libraries */, 6060E7A12AF8BF4400C04AE0 /* Embed Frameworks */, ); buildRules = ( @@ -192,14 +188,13 @@ 600000000000000000100200 /* Images.xcassets in Resources */, 600000000000000000100300 /* Launch Screen.storyboard in Resources */, 60A04BC728B35FD000DAA9E5 /* app in Resources */, - 60754F822AA5926A0013A4FB /* dylib-Info-template.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 609384A528B45C86005B2A5D /* Sign Python Binary Modules */ = { + 609384A628B5B958005B2A5D /* Process Python libraries */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -209,33 +204,14 @@ ); inputPaths = ( ); - name = "Sign Python Binary Modules"; + name = "Process Python libraries"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - 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"; - }; - 609384A628B5B958005B2A5D /* Install target specific Python modules */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Install target specific Python modules"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - 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"; + 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"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */