Bin To Pkg ●
#!/bin/bash # Ensure /usr/local/bin is in PATH if ! grep -q "/usr/local/bin" /etc/paths; then echo "/usr/local/bin" >> /etc/paths fi exit 0 Make executable: chmod 755 scripts/postinstall
pkgbuild --root ./root \ --identifier com.ffmpeg.cli \ --version 5.1.2 \ --install-location / \ --scripts ./scripts \ ffmpeg-5.1.2.pkg bin to pkg
pkgutil --payload-files ffmpeg-5.1.2.pkg # Should list ./usr/local/bin/ffmpeg and ./usr/share/man/man1/ffmpeg.1 Solution: recompile with -rpath @executable_path/
ffmpeg_pkg/ ├── root/ │ └── usr │ ├── local │ │ └── bin │ │ └── ffmpeg (from ffmpeg.bin, chmod 755) │ └── share │ └── man │ └── man1 │ └── ffmpeg.1 (man page) ├── scripts/ │ └── postinstall └── Distribution (if using productbuild) Package those libraries into the
# Sign productsign --sign "Developer ID Installer" ffmpeg-5.1.2.pkg signed-ffmpeg.pkg xcrun notarytool submit signed-ffmpeg.pkg --apple-id "user@me.com" --team-id "ABCDE" --wait Part 5: Common Pitfalls and How to Avoid Them 1. Hardcoded Paths in the Binary If your binary is compiled with hardcoded rpaths (e.g., looking for config in ./config ), it may break when installed to /usr/local/bin . Solution: recompile with -rpath @executable_path/../lib or use install-name tool. 2. Missing Dynamic Libraries Use otool -L mybinary to check linked .dylib files. Package those libraries into the .pkg (e.g., in /usr/local/lib ) or bundle them inside a .framework . 3. Permissions Are Lost When you copy a binary into root/ , it retains its Unix permissions. But if you rebuild from a source that doesn't preserve the executable bit, the installed file will be non-executable. Always chmod 755 on binaries and chmod 644 on conf files before building. 4. Overwriting System Files Never install over Apple-provided binaries (like /usr/bin/rsync ). Use /usr/local/bin or /opt/local/bin . 5. Receipt Mismatch If you re-install an older version over a newer one, pkgutil may block it. Use: