Summary
When installing to a destination path that contains the string SpliceKit (e.g. the default ~/Applications/SpliceKit or a custom --dest /Volumes/4T_IJC_th4/SpliceKit), the patcher falsely reports "Already injected (skipping)" at Step 4 and never actually runs insert_dylib, leading to a non-functional install that crashes on launch.
Reproduction
./patcher/patch_fcp.sh --dest /Volumes/4T_IJC_th4/SpliceKit
Or any dest path containing SpliceKit as a directory component.
Root cause
patcher/patch_fcp.sh line 332 checks whether the dylib is already injected with:
if otool -L "$BINARY" 2>/dev/null | grep -q SpliceKit; then
log "Already injected (skipping)"
However, otool -L prints the binary path as its first header line:
/Volumes/4T_IJC_th4/SpliceKit/Final Cut Pro.app/Contents/MacOS/Final Cut Pro (architecture x86_64):
This line contains the substring SpliceKit because of the destination directory name, so grep -q SpliceKit matches and the injection step is silently skipped. The framework is built and deployed, but LC_LOAD_DYLIB is never added to the binary.
Expected
The check should match only when SpliceKit.framework is actually referenced in an LC_LOAD_DYLIB load command.
Suggested fix
Match the framework path instead of the bare string:
if otool -L "$BINARY" 2>/dev/null | grep -q "SpliceKit.framework/Versions/A/SpliceKit"; then
log "Already injected (skipping)"
Or inspect the load commands directly:
if otool -l "$BINARY" 2>/dev/null | grep -A2 LC_LOAD_DYLIB | grep -q "SpliceKit.framework"; then
log "Already injected (skipping)"
Verification
After hitting this on my install and manually running insert_dylib + re-sign, the binary correctly shows the injected dylib:
@rpath/SpliceKit.framework/Versions/A/SpliceKit (compatibility version 0.0.0, current version 0.0.0)
Environment
- macOS 26.3.0
- FCP 12.0 build 445223
- SpliceKit git HEAD = v3.1.13
- Xcode 16+, CLI tools installed
Summary
When installing to a destination path that contains the string
SpliceKit(e.g. the default~/Applications/SpliceKitor a custom--dest /Volumes/4T_IJC_th4/SpliceKit), the patcher falsely reports "Already injected (skipping)" at Step 4 and never actually runsinsert_dylib, leading to a non-functional install that crashes on launch.Reproduction
Or any dest path containing
SpliceKitas a directory component.Root cause
patcher/patch_fcp.shline 332 checks whether the dylib is already injected with:However,
otool -Lprints the binary path as its first header line:This line contains the substring
SpliceKitbecause of the destination directory name, sogrep -q SpliceKitmatches and the injection step is silently skipped. The framework is built and deployed, butLC_LOAD_DYLIBis never added to the binary.Expected
The check should match only when
SpliceKit.frameworkis actually referenced in anLC_LOAD_DYLIBload command.Suggested fix
Match the framework path instead of the bare string:
Or inspect the load commands directly:
Verification
After hitting this on my install and manually running
insert_dylib+ re-sign, the binary correctly shows the injected dylib:Environment