From 31c2c5ba37e0371777581a031505feaba67e145e Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Sat, 8 Nov 2025 21:19:34 -0500 Subject: [PATCH 1/9] Fix search paths to use SRCROOT --- .../project.pbxproj | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/packaging_assets/ios/carveracontroller-ios/CarveraController.xcodeproj/project.pbxproj b/packaging_assets/ios/carveracontroller-ios/CarveraController.xcodeproj/project.pbxproj index 08b0370c..39c923ce 100755 --- a/packaging_assets/ios/carveracontroller-ios/CarveraController.xcodeproj/project.pbxproj +++ b/packaging_assets/ios/carveracontroller-ios/CarveraController.xcodeproj/project.pbxproj @@ -73,11 +73,11 @@ 4DEA4A81A8F3A569B130BCAA /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OpenGLES.framework; sourceTree = DEVELOPER_DIR; }; 4F7140229CC1D236491CB9CA /* CoreHaptics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CoreHaptics.framework; sourceTree = DEVELOPER_DIR; }; 537F42158DFB71F9E32277D8 /* libSDL2_mixer.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libSDL2_mixer.xcframework; path = ../dist/xcframework/libSDL2_mixer.xcframework; sourceTree = SOURCE_ROOT; }; - 59738AB41A8BB5D8001B2C0C /* lib */ = {isa = PBXFileReference; lastKnownFileType = folder; name = lib; path = /Users/mamonney/Carvera_Controller/dist/root/python3/lib; sourceTree = ""; }; + 59738AB41A8BB5D8001B2C0C /* lib */ = {isa = PBXFileReference; lastKnownFileType = folder; name = lib; path = ../../../dist/root/python3/lib; sourceTree = ""; }; 59738ABA1A8E19AA001B2C0C /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 59864361B31751B48655D9D2 /* libffi.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libffi.xcframework; path = ../dist/xcframework/libffi.xcframework; sourceTree = SOURCE_ROOT; }; 59994E3A148E85C800863906 /* carveracontrollerpkg */ = {isa = PBXFileReference; lastKnownFileType = folder; path = carveracontrollerpkg; sourceTree = ""; }; - 59FDEA8A21E7D34E004E6ECE /* include */ = {isa = PBXFileReference; lastKnownFileType = folder; name = include; path = /Users/mamonney/Carvera_Controller/dist/root/python3/include; sourceTree = ""; }; + 59FDEA8A21E7D34E004E6ECE /* include */ = {isa = PBXFileReference; lastKnownFileType = folder; name = include; path = ../../../dist/root/python3/include; sourceTree = ""; }; 5A7641749B9D44C54E1BBDFE /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Photos.framework; sourceTree = DEVELOPER_DIR; }; 64F7416AB075A0994023F21B /* libkivy.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libkivy.xcframework; path = ../dist/xcframework/libkivy.xcframework; sourceTree = SOURCE_ROOT; }; 650D4733935B336C699C93ED /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Accelerate.framework; sourceTree = DEVELOPER_DIR; }; @@ -408,10 +408,9 @@ DEVELOPMENT_TEAM = QMMYJPQXNE; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ( - /Users/mamonney/Carvera_Controller/dist/frameworks, - "$(SRCROOT)/../dist/xcframework", - "$(inherited)", + "$(SRCROOT)/../../../dist/frameworks", "$(SRCROOT)/../../../dist/xcframework", + "$(inherited)", ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -420,8 +419,8 @@ GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( - "/Users/mamonney/Carvera_Controller/dist/root/python3/include/python3.11/**", - /Users/mamonney/Carvera_Controller/dist/include/common/sdl2, + "$(SRCROOT)/../../../dist/root/python3/include/python3.11/**", + "$(SRCROOT)/../../../dist/include/common/sdl2", ); INFOPLIST_FILE = "carveracontroller-Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = CarveraController; @@ -429,7 +428,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 17.6; LIBRARY_SEARCH_PATHS = ( "$(inherited)", - /Users/mamonney/Carvera_Controller/dist/lib, + "$(SRCROOT)/../../../dist/lib", ); MARKETING_VERSION = 0.8.2; ONLY_ACTIVE_ARCH = YES; @@ -460,18 +459,17 @@ DEVELOPMENT_TEAM = QMMYJPQXNE; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ( - /Users/mamonney/Carvera_Controller/dist/frameworks, - "$(SRCROOT)/../dist/xcframework", - "$(inherited)", + "$(SRCROOT)/../../../dist/frameworks", "$(SRCROOT)/../../../dist/xcframework", + "$(inherited)", ); GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ""; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( - "/Users/mamonney/Carvera_Controller/dist/root/python3/include/python3.11/**", - /Users/mamonney/Carvera_Controller/dist/include/common/sdl2, + "$(SRCROOT)/../../../dist/root/python3/include/python3.11/**", + "$(SRCROOT)/../../../dist/include/common/sdl2", ); INFOPLIST_FILE = "carveracontroller-Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = CarveraController; @@ -479,7 +477,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 17.6; LIBRARY_SEARCH_PATHS = ( "$(inherited)", - /Users/mamonney/Carvera_Controller/dist/lib, + "$(SRCROOT)/../../../dist/lib", ); MARKETING_VERSION = 0.8.2; OTHER_LDFLAGS = "-all_load"; @@ -533,7 +531,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; - USER_HEADER_SEARCH_PATHS = /Users/mamonney/Carvera_Controller/dist/root/include/; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../dist/root/include/"; }; name = Debug; }; @@ -571,7 +569,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - USER_HEADER_SEARCH_PATHS = /Users/mamonney/Carvera_Controller/dist/root/include/; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../dist/root/include/"; }; name = Release; }; From 84f859a82f1d3885d5acbd82aea38e6d803aa49f Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Sat, 8 Nov 2025 21:20:21 -0500 Subject: [PATCH 2/9] Upgrade kivy-ios to fix libffi build --- poetry.lock | 15 ++++++++------- pyproject.toml | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8555751d..e39cb2d1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. [[package]] name = "altgraph" @@ -720,7 +720,7 @@ reference = "pypi-public" [[package]] name = "kivy-ios" -version = "2024.3.17" +version = "2025.5.17" description = "A toolchain to compile the necessary libraries for iOS to run Kivy applications." optional = false python-versions = "*" @@ -730,15 +730,16 @@ develop = false [package.dependencies] cookiecutter = "*" +packaging = "*" pbxproj = "*" Pillow = "*" sh = "*" [package.source] type = "git" -url = "https://github.com/zittix/kivy-ios.git" -reference = "fix_custom_recipes" -resolved_reference = "38e6eee2b0765d2b82aec0f3a69cb0cf147c3f19" +url = "https://github.com/acj/kivy-ios.git" +reference = "pr-643-fix-custom-recipes" +resolved_reference = "ee45cdbc1f34c3a3d6fc232e80e17c3ae4d12399" [[package]] name = "macholib" @@ -907,7 +908,7 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["dev", "ios-dev"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -1827,4 +1828,4 @@ reference = "pypi-public" [metadata] lock-version = "2.1" python-versions = "<3.14,>=3.9" -content-hash = "7e1b035c02583fe10308de5976521ea8df7673c2e790e231da9e93f110f4a787" +content-hash = "9121f942204592aad59f32e983455d443a9b0948851f511c80bd80c6a4969cb0" diff --git a/pyproject.toml b/pyproject.toml index b3946367..f260c16c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,5 +35,5 @@ virtualenv = "^20.31.2" buildozer = "^1.5.0" [tool.poetry.group.ios-dev.dependencies.kivy-ios] -git = "https://github.com/zittix/kivy-ios.git" -branch = "fix_custom_recipes" +git = "https://github.com/acj/kivy-ios.git" +branch = "pr-643-fix-custom-recipes" From 7d637e9d15a2277d5940224f75d3e4ce6def3c2e Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Sat, 8 Nov 2025 21:21:57 -0500 Subject: [PATCH 3/9] In CI, build the app without opening Xcode --- scripts/build_ios.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/build_ios.sh b/scripts/build_ios.sh index cd485a71..7bd7480c 100755 --- a/scripts/build_ios.sh +++ b/scripts/build_ios.sh @@ -56,5 +56,8 @@ else plutil -replace CFBundleVersion -string "$1" packaging_assets/ios/carveracontroller-ios/carveracontroller-Info.plist fi -# For now we open the project in XCode and build it from there -open packaging_assets/ios/carveracontroller-ios/carveracontroller.xcodeproj +if [ -n "$CI" ]; then + xcodebuild -project packaging_assets/ios/carveracontroller-ios/carveracontroller.xcodeproj -scheme CarveraController -configuration Release -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPad mini (A17 Pro)' +else + open packaging_assets/ios/carveracontroller-ios/carveracontroller.xcodeproj +fi From 597c90c636f8fbdc0abdcb585e370e94619d6634 Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Sat, 8 Nov 2025 21:24:50 -0500 Subject: [PATCH 4/9] Add CI workflow for building (but not yet packaging) iOS app --- .github/workflows/release.yaml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b6a5dfeb..062526c3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -113,6 +113,34 @@ jobs: path: ${{ github.workspace }}/dist/carveracontroller-community-*.dmg retention-days: 2 + build-ios-app: + name: build-ios + runs-on: macos-15 + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v4 + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: 3.12 + + - name: Install poetry and dependencies + uses: ./.github/actions/bootstrap-poetry + with: + os: ios + + - name: Build release + run: | + if [[ $GITHUB_REF == refs/tags/* ]]; then + VERSION=$GITHUB_REF_NAME + else + VERSION=$(date +'%Y.%m.%d') + fi + poetry run python scripts/build.py --os ios --version "$VERSION" + build-linux-artifacts: name: build-linux-${{ matrix.platform }} runs-on: ${{ matrix.image }} From 6a9d24009ba157a151e7f97ab1fde5a6b53e3638 Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Sat, 8 Nov 2025 21:38:26 -0500 Subject: [PATCH 5/9] readme: Clarify how to build and run the iOS app --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 83fd3f0c..df2ec3c2 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,8 @@ You can run the Controller software using Poetry's run command without installat poetry run python -m carveracontroller ``` +To run the iOS app, you first need to build its dependencies using the Local Packaging instructions below. The build script will open Xcode for you, or you can open the project manually by finding it in `packaging_assets/ios/carveracontroller-ios`. + ### Local Packaging The application is packaged using PyInstaller (except for iOS). This tool converts Python applications into a standalone executable, so it can be run on systems without requiring management of a installed Python interpreter or dependent libraries. An build helper script is configured with Poetry and can be run with: From 36585a4efb8365b122d6b7b90f75ffc907cb5173 Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Sat, 8 Nov 2025 21:30:36 -0500 Subject: [PATCH 6/9] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43e4de9f..a17cc7b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,10 @@ - Enhancement: Support connecting to hidden wifi networks - Enhancement: Upload and select a file when it's double clicked in the local file browser - Enhancement: Select a file when it's double clicked in the remote file browser +- Enhancement: CI workflow for building iOS app - Fixed: Closing the Controller after auto-reconnection canceled causes the app to freeze - Fixed: Probing popup shouldn't be accessible when playback is suspended +- Fixed: Hard-coded search paths in Xcode project for iOS app [2.0.0-RC2] - Enhancement: Controller option "Allow Jogging When Machine is Running". This allows advanced users to jog the spindle manually while it is spinning enabling manual milling operations. From eaee171887093317112c2d4a1570138e64abf1f6 Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Sun, 9 Nov 2025 11:33:15 -0500 Subject: [PATCH 7/9] Default to English as a workaround for "RuntimeError: Translation not initialized" error on startup Co-authored-by: Mathieu Monney --- carveracontroller/translation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/carveracontroller/translation.py b/carveracontroller/translation.py index beea3c6c..1ef84f96 100644 --- a/carveracontroller/translation.py +++ b/carveracontroller/translation.py @@ -67,7 +67,7 @@ def __getattr__(self, name): raise RuntimeError("Translation not initialized") return getattr(_translator, name) -_translator: Optional[Lang] = None +_translator: Optional[Lang] = Lang('en') tr = TrProxy() def init(langname: Optional[str] = None): From 2090ac638f422be4bcc01c4601dcd65a512d4a3d Mon Sep 17 00:00:00 2001 From: Serge Bakharev Date: Mon, 1 Dec 2025 06:05:04 +1100 Subject: [PATCH 8/9] update to use community fork of kivy-ios fix recipes --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f260c16c..8d86b0ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,5 +35,5 @@ virtualenv = "^20.31.2" buildozer = "^1.5.0" [tool.poetry.group.ios-dev.dependencies.kivy-ios] -git = "https://github.com/acj/kivy-ios.git" +git = "https://github.com/Carvera-Community/kivy-ios.git" branch = "pr-643-fix-custom-recipes" From 965353737bfb38d74ab2c27388d120d3b95d0d97 Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Sun, 30 Nov 2025 16:28:48 -0500 Subject: [PATCH 9/9] Only run iOS CI job for the develop branch --- .github/workflows/release.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 36ad3815..81570a68 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -116,6 +116,7 @@ jobs: build-ios-app: name: build-ios runs-on: macos-15 + if: startsWith(github.ref, 'refs/heads/develop') defaults: run: shell: bash