macOS
Native arm64 and x86_64 binaries, with notes on shipping AOT-compiled programs through Gatekeeper. The installer picks the right architecture for your machine; for distribution you ship both and let users pick.
Install
curl -fsSL https://wrenlift.com/install.sh | bash
The installer detects your architecture and pulls the
matching binary. ~/.local/bin ships on the
default PATH on recent macOS shells; older
bash users may need to add it manually.
Apple Silicon vs Intel
Both architectures are first-class. The release page ships separate binaries:
| Asset | Use on |
|---|---|
wlift-aarch64-apple-darwin.tar.gz | M1, M2, M3, M4 (all Apple Silicon). |
wlift-x86_64-apple-darwin.tar.gz | Pre-2020 Intel Macs. |
Verify which one you're running:
$ file $(which wlift)
wlift: Mach-O 64-bit executable arm64
Build an AOT binary
wlift my_app.wren --aot ./my_app
./my_app
Output is a regular Mach-O. Inspect with file
/ otool -L. AOT binaries link the WrenLift
runtime statically; they don't depend on
libwren_lift being installed on the target
machine.
Code-sign & notarize
Distributing an AOT binary outside the App Store? Gatekeeper will quarantine it unless it's signed and notarized.
- Sign with hardened runtime:
codesign --force --options runtime \ --sign "Developer ID Application: Your Name (TEAMID)" \ ./my_app - Zip + submit for notarization:
ditto -ckV --rsrc --keepParent ./my_app ./my_app.zip xcrun notarytool submit ./my_app.zip \ --apple-id you@example.com \ --team-id TEAMID \ --password "@keychain:notary-pw" \ --wait - Staple the ticket back onto the binary:
xcrun stapler staple ./my_app
Build a universal binary
Ship one fat binary that runs on both architectures by
building each variant separately and gluing them together
with lipo:
wlift my_app.wren --aot ./my_app-arm64 # on Apple Silicon
wlift my_app.wren --aot ./my_app-x86_64 # on Intel (or cross-compile)
lipo -create -output ./my_app ./my_app-arm64 ./my_app-x86_64
lipo -info ./my_app
// Architectures in the fat file: ./my_app are: arm64 x86_64