Prerequisites
Install Xcode
Download from the Mac App StoreMinimum version: Xcode 13+ (Xcode 15+ for visionOS)
Project Structure
Each plugin has an Xcode project containing multiple targets:Building with Xcode
Opening the Project
- Xcode GUI
- Command Line
- Double-click
MyPlugin-macOS.xcodeproj - Or open workspace:
MyPlugin.xcworkspace
Building in Xcode
Select scheme
Choose target from the scheme menu:
- VST3 - VST3 plugin
- AU - Audio Unit v2
- AUv3 - Audio Unit v3 (modern)
- CLAP - CLAP plugin
- AAX - AAX plugin (requires SDK)
- APP - Standalone application
Select configuration
Product > Scheme > Edit SchemeChoose build configuration:
- Debug - Development with debug symbols
- Release - Optimized for distribution
- Tracer - Performance profiling
Building from Command Line
Universal Binaries
iPlug2 supports building Universal binaries that run natively on both Intel and Apple Silicon Macs.Intel (x86_64)
Runs on Intel-based MacsCompatible with all macOS versions
Apple Silicon (arm64)
Runs natively on M1/M2/M3 MacsSignificantly better performance
Building Universal Binaries
- Xcode
- xcconfig
- Command Line
- Product > Scheme > Edit Scheme
- Run > Info > Build Configuration > Release
- Product > Destination > Any Mac
- Build Settings > Architectures
- Set to:
arm64 x86_64 - Or:
$(ARCHS_STANDARD)(default)
- Set to:
- Product > Build
Verifying Universal Binaries
Build Output
Built plugins are placed inbuild-mac/:
AUv3 is embedded inside the standalone app and also built as a standalone framework/appex for use in other hosts.
Deployment Paths
Plugins are automatically symlinked to standard locations:| Format | Default Path |
|---|---|
| VST3 | ~/Library/Audio/Plug-Ins/VST3/ |
| VST2 | ~/Library/Audio/Plug-Ins/VST/ |
| CLAP | ~/Library/Audio/Plug-Ins/CLAP/ |
| AUv2 | ~/Library/Audio/Plug-Ins/Components/ |
| AAX | /Library/Application Support/Avid/Audio/Plug-Ins/ |
| APP | ~/Applications/ |
MacOS uses symlinks by default for faster development. Symlinks update automatically when you rebuild.
Customizing Deployment
Editcommon-mac.xcconfig:
Code Signing
Code signing is required for AUv3 plugins and distribution.Development Signing (Ad-hoc)
For local development only:Distribution Signing
For public distribution, sign with a Developer ID certificate:Get Developer ID certificate
- Enroll in Apple Developer Program
- Certificates, Identifiers & Profiles > Certificates
- Create Developer ID Application certificate
- Download and install in Keychain
Sign with hardened runtime
--options runtime flag enables hardened runtime, required for notarization.Notarization
Notarization is required for macOS 10.15+ to avoid Gatekeeper warnings.Create app-specific password
- Go to appleid.apple.com
- Sign In > App-Specific Passwords
- Generate a new password
- Save it securely
iPlug2 includes a helper script:
Scripts/notarise.sh for automated notarization.Using notarise.sh
- Root directory
- Path to app/plugin
- Bundle ID
- Apple ID email
- App-specific password
Debugging
Setting Up Debugger
Edit scheme
Product > Scheme > Edit Scheme > Run > Info
- Executable: Choose your DAW (e.g.,
/Applications/REAPER.app) - Or select Ask on Launch to choose at runtime
Run debugger
Press
⌘R or Product > RunXcode will:- Build the plugin
- Deploy to plugin folder
- Launch your DAW
- Attach the debugger
LLDB Debugging
For advanced debugging:Audio Unit Validation
Validate AUv2 plugins withauval:
<subtype> and <manufacturer> are 4-character codes defined in config.h.Common auval Errors
ERROR: Failed validation
ERROR: Failed validation
Cause: Plugin not properly registered or has errorsSolution:
- Ensure plugin is code-signed
- Run the standalone app once to register AUv3
- Clear Audio Unit cache:
killall -9 AudioComponentRegistrar - Check Console.app for crash logs
WARNING: View has zero size
WARNING: View has zero size
Cause: UI not initialized properlySolution:
- Usually benign, but verify UI appears correctly in DAW
- Check
IGraphicsinitialization in plugin constructor
Build Settings
Common Settings (from common-mac.xcconfig)
Preprocessor Defines
Troubleshooting
Plugin not loading in DAW
Plugin not loading in DAW
Cause: Architecture mismatch, code signing, or registrationSolution:
- Check DAW architecture matches plugin (Intel vs Apple Silicon)
- Verify plugin is code-signed:
codesign -vv MyPlugin.component - Clear Audio Unit cache:
killall -9 AudioComponentRegistrar - For AUv3: Run standalone app once to register
Build fails with SDK errors
Build fails with SDK errors
Cause: Missing SDKs or incorrect pathsSolution:
- Run
Dependencies/download-iplug-sdks.sh - Check paths in
common-mac.xcconfig:
Notarization fails
Notarization fails
Cause: Hardened runtime not enabled or unsigned binariesSolution:
- Sign with
--options runtimeflag - Ensure all frameworks and executables are signed
- Check notarization log for details:
AUv3 not appearing in GarageBand/Logic
AUv3 not appearing in GarageBand/Logic
Cause: AUv3 not registered or code signing issueSolution:
- Run standalone app at least once
- Ensure app is properly code-signed (ad-hoc or Developer ID)
- Check Console.app for errors
- Verify entitlements are correct
Next Steps
iOS Build
Build AUv3 plugins for iOS
Code Signing
Deep dive into signing and notarization
CMake Build
Alternative build system
Installers
Create DMG installers