Fix the macOS release plugin failing to load - #16
Merged
Conversation
The v0.4.0 AsyncioDAT.plugin was reported by TouchDesigner as corrupted. The release runner is macOS 26 on Apple silicon, and nothing in the build pinned a deployment target or an architecture, so the bundle inherited the runner's macOS 26 as its minimum OS and arm64 as its only architecture, while TouchDesigner itself runs on macOS 13 and later, universal. The bundle also carried only the linker's partial ad-hoc signature, which covers the Mach-O but not the bundle, so codesign rejected it. The plugin already linked no Python library (Python3::Module resolves the symbols from the host process), so that part of the AnimationCHOP fix did not apply here. Deployment target is now 13.3 (std::format needs libc++ from 13.3), architectures are arm64 and x86_64, and the bundle is ad-hoc signed as a whole post-build, before the copy to tests/td/Plugins so the copy carries the signature. CI and the release gate now verify all four properties: no Python link, universal, minos 13.3, valid bundle signature. Gatekeeper still refuses a quarantined copy without notarization; the README's install steps already cover clearing the flag. Verified locally from a fresh build directory: the checklist passes on the bundle and on its copy, ctest 16/16, and the TouchDesigner integration suite 25/25 in TouchDesigner 2025.33230. Bumps the version to 0.4.1 and adds the CHANGELOG entry. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The v0.4.0
AsyncioDAT-macos.zipfails in TouchDesigner with "plugin is corrupted". Two build-configuration defects and one distribution limitation, the same class of problem fixed in AnimationCHOP#18:macos-26-arm64runner's. TouchDesigner 2025 itself runs on macOS 13 and later and ships universal.codesign --verify --deep --strictrejects the bundle ("code has no resources but signature indicates they must be present").xattr -dr com.apple.quarantine.Unlike AnimationCHOP, this plugin already linked no Python library: it uses
Python3::ModulefromDevelopment.Module, which on macOS is-undefined dynamic_lookup. The new verify step still guards that property so it cannot regress.Changes
CMakeLists.txt:CMAKE_OSX_DEPLOYMENT_TARGET13.3 (the status messages usestd::format, which libc++ only provides from 13.3; TouchDesigner's own minimum is 13.0) andCMAKE_OSX_ARCHITECTURESarm64;x86_64, both set beforeproject(). A POST_BUILD ad-hoccodesignof the whole bundle, placed before the copy totests/td/Pluginsso the copy carries the signature. Version bumped to 0.4.1.ci.yml/release.yml: a "Verify macOS plugin" step after Build fails the job if the plugin links any Python library, is not universal, has a minimum OS other than 13.3, or failscodesign --verify --deep --strict.README.md: requirements now say macOS 13.3 or newer, universal (the previous "arm64 only, matching TouchDesigner" was wrong; TouchDesigner is universal). Build notes explain the no-libpython link and the two cache variables.CHANGELOG.md: 0.4.1 entry.Verification
Fresh build directory,
-DASYNCIODAT_BUILD_TESTS=ON, macOS 26.6 / Xcode 26.6 / CMake 4.0.1:lipo -archs:x86_64 arm64;minos13.3;otool -Lshows only libc++ and libSystem;codesign --verify --deep --strictpasses onbuild/bin/AsyncioDAT.pluginand on the copy intests/td/Plugins.ctest: 16/16 (Catch2 + pytest bindings)../run_td_tests.sh --no-buildin TouchDesigner 2025.33230: 25 passed, 0 failed.package-macOSandpackage-Windowspresent, release job skipped as designed. Thepackage-macOSbundle downloaded from that run:x86_64 arm64, minos 13.3, no Python link,codesign --verify --deep --strictpasses,CFBundleShortVersionString0.4.1.tests/td/Pluginswith the quarantine attribute cleared, loads in TouchDesigner 2025.33230 and passes the integration suite 25/25.Reviewer notes
CMAKE_OSX_ARCHITECTUREStoarm64and change the verify step's arch check.🤖 Generated with Claude Code