diff --git a/.gitea/scripts/publish-release.sh b/.gitea/scripts/publish-release.sh index 0940b66..c476233 100755 --- a/.gitea/scripts/publish-release.sh +++ b/.gitea/scripts/publish-release.sh @@ -25,7 +25,7 @@ set -euo pipefail MACOS_BUNDLE_FOUND="${MACOS_BUNDLE_FOUND:-false}" if [ "${MACOS_BUNDLE_FOUND}" = "true" ]; then - MACOS_NOTE="This archive contains a \`.plugin\` bundle." + MACOS_NOTE="This archive contains a \`.plugin\` bundle (verified on v0.1.0: MH_BUNDLE + Info.plist, libobs via \`@rpath\` + \`@executable_path/../Frameworks\`, LiveKit dylibs bundled, all three binaries code-signed). **arm64 only -- no Intel slice**, macOS 13+. Never yet loaded in OBS.app by a human." else MACOS_NOTE="This archive is packaged as a bare \`streamer-tools-camera.so\` (the layout \`build/package/\` currently produces on macOS), **not** an OBS.app-loadable \`.plugin\` bundle. It will not load in the OBS GUI as-is -- see the \"macOS packaging gap\" section of \`README.md\`." fi @@ -36,18 +36,22 @@ cat > "${NOTES_FILE}" <.plugin` bundles (`Contents/MacOS/`, `Contents/Resources/`, - an `Info.plist`), which is what obs-plugintemplate's - `cmake/macos/helpers.cmake` builds and which this project deliberately did - not vendor. -2. `otool -L` shows the libobs dependency recorded as the relative path - `libobs/libobs.framework/Versions/A/libobs`, inherited from the - from-source libobs's own install name. A real plugin needs - `@rpath/libobs.framework/Versions/A/libobs` plus an `LC_RPATH` pointing at - `OBS.app/Contents/Frameworks`. +- It is a proper bundle: `streamer-tools-camera.plugin/Contents/MacOS/streamer-tools-camera` + (Mach-O **`MH_BUNDLE`**, which is what OBS loads), plus `Info.plist` + (`CFBundlePackageType BNDL`, `CFBundleExecutable streamer-tools-camera`), + `Contents/Resources/locale/en-US.ini`, and both LiveKit dylibs under + `Contents/Frameworks/`. +- The install names are right, which was the specific doubt. The module loads + `@rpath/libobs.framework/Versions/A/libobs` and carries + `LC_RPATH @executable_path/../Frameworks` — inside OBS.app that resolves to + `OBS.app/Contents/Frameworks`, where libobs lives. `@rpath/liblivekit.dylib` + resolves through `LC_RPATH @loader_path/../Frameworks` to the bundle's own + copy, and `liblivekit.dylib` finds `liblivekit_ffi.dylib` through its own + `LC_RPATH @loader_path`. Nothing points into a build tree. +- All three binaries carry an `LC_CODE_SIGNATURE` (superblob `0xfade0cc0`), + which is not optional: arm64 macOS refuses to load unsigned code at all. -Fixing this means either vendoring the template's macOS bundle helpers or -adding an `install_name_tool` pass and a bundle layout — bounded work, but -work that has to be done and checked on an actual Mac. It is deliberately not -attempted here rather than guessed at. +**The real macOS limitation is different: the bundle is arm64-only.** There is +no x86_64 slice, so Intel Macs cannot load it, and `LSMinimumSystemVersion` is +`13.0`. Shipping a universal binary would mean building both slices and +`lipo`-ing them, on a Mac. + +Everything above is static inspection of the artifact. **Nobody has yet opened +it in OBS.app** — well-formed and signed is a strong prior, not a load. ### Where the Windows bootstrap got to