Files
gh-yebot-rad-cc-plugins-plu…/commands/build-all-formats.md
2025-11-30 09:08:03 +08:00

11 KiB
Raw Blame History

argument-hint, description, allowed-tools
argument-hint description allowed-tools
[build-type: debug|release|relwithdebinfo] Build JUCE plugin for all configured formats (VST3, AU, AAX, Standalone) with CMake, tests, and build report Bash, Read, AskUserQuestion

Build All Plugin Formats

This command builds your JUCE plugin for all configured formats (VST3, AU, AAX, Standalone) in one operation. It configures CMake, compiles the code, runs tests, and generates a comprehensive build report.

Instructions

You are tasked with building a JUCE plugin project for all target formats. Execute the following steps systematically:

1. Verify Project Structure

Check that we're in a JUCE plugin project:

# Look for key files
if [ ! -f "CMakeLists.txt" ]; then
    echo "❌ No CMakeLists.txt found. Are you in a JUCE plugin project?"
    echo "Run /new-juce-plugin to create a new project first."
    exit 1
fi

# Confirm JUCE is available
if [ ! -d "JUCE" ] && [ ! -d "submodules/JUCE" ]; then
    echo "⚠️  JUCE framework not found"
    echo "Options:"
    echo "  1. Add as submodule: git submodule add https://github.com/juce-framework/JUCE.git"
    echo "  2. Install system-wide: brew install juce (macOS)"
    echo "  3. Specify JUCE path in CMake: cmake -DJUCE_PATH=/path/to/JUCE"
    # Don't exit - let CMake fail with helpful error
fi

2. Determine Build Type

Use the argument provided, or ask the user:

Build Types:

  • Debug - Development build with symbols, no optimization
  • Release - Optimized build for distribution
  • RelWithDebInfo - Optimized with debug symbols (recommended for profiling)

If no argument provided:

Which build type? (Default: Release)
1. Debug - Development with symbols
2. Release - Optimized for distribution ⭐
3. RelWithDebInfo - Optimized + symbols for profiling

Default to Release if no response.

3. Clean Previous Build (Optional)

Ask if user wants to clean previous build:

echo "Clean previous build? (y/N)"
read -r response
if [[ "$response" =~ ^[Yy]$ ]]; then
    rm -rf build
    echo "✓ Cleaned build directory"
fi

4. Configure CMake

Run CMake configuration:

echo "🔧 Configuring CMake..."

cmake -B build \
    -DCMAKE_BUILD_TYPE=[BuildType] \
    -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \
    -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

if [ $? -ne 0 ]; then
    echo "❌ CMake configuration failed"
    echo ""
    echo "Common issues:"
    echo "  - JUCE not found: Set JUCE_PATH or add as submodule"
    echo "  - Missing dependencies: Check CMakeLists.txt requirements"
    echo "  - CMake version: Requires CMake 3.22+"
    echo ""
    echo "Run cmake -B build for detailed error messages"
    exit 1
fi

echo "✓ CMake configuration successful"

5. Detect Available Formats

Determine which formats were configured:

echo ""
echo "📦 Detecting configured plugin formats..."

formats=()
if grep -q "VST3" build/CMakeCache.txt 2>/dev/null; then
    formats+=("VST3")
fi
if grep -q "AU" build/CMakeCache.txt 2>/dev/null; then
    formats+=("AU")
fi
if grep -q "AAX" build/CMakeCache.txt 2>/dev/null; then
    formats+=("AAX")
fi
if grep -q "Standalone" build/CMakeCache.txt 2>/dev/null; then
    formats+=("Standalone")
fi

if [ ${#formats[@]} -eq 0 ]; then
    echo "⚠️  No plugin formats detected - building all targets"
else
    echo "Configured formats: ${formats[*]}"
fi

6. Build All Targets

Execute the build with progress indication:

echo ""
echo "🏗️  Building all targets..."
echo "Build type: [BuildType]"
echo "This may take several minutes..."
echo ""

# Use parallel builds for speed
num_cores=$(sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4)

cmake --build build \
    --config [BuildType] \
    --parallel $num_cores

build_exit_code=$?

if [ $build_exit_code -ne 0 ]; then
    echo ""
    echo "❌ Build failed with exit code $build_exit_code"
    echo ""
    echo "Troubleshooting:"
    echo "  - Check compiler errors above"
    echo "  - Ensure all JUCE modules are available"
    echo "  - Verify C++17 or C++20 compiler support"
    echo "  - Try: cmake --build build --verbose for details"
    echo ""
    echo "Need help? Invoke @build-engineer to debug build issues"
    exit 1
fi

echo ""
echo "✓ Build completed successfully"

7. Run Tests (if available)

If tests are configured, run them:

echo ""
echo "🧪 Running tests..."

if [ -f "build/Tests/RunUnitTests" ] || [ -d "build/Tests" ]; then
    ctest --test-dir build -C [BuildType] --output-on-failure
    test_exit_code=$?

    if [ $test_exit_code -eq 0 ]; then
        echo "✓ All tests passed"
    else
        echo "⚠️  Some tests failed - review output above"
        echo "Continue anyway? (Y/n)"
        read -r response
        if [[ "$response" =~ ^[Nn]$ ]]; then
            exit 1
        fi
    fi
else
    echo "  No tests configured - skipping test phase"
    echo "Tip: Run @test-automation-engineer to add tests"
fi

8. Locate Built Plugins

Find and report built plugin binaries:

echo ""
echo "📍 Locating built plugins..."
echo ""

plugin_name=$(grep "project(" CMakeLists.txt | head -1 | sed 's/.*(\(.*\)).*/\1/' | tr -d ' ')

# VST3
vst3_path=$(find build -name "*.vst3" -type d | head -1)
if [ -n "$vst3_path" ]; then
    vst3_size=$(du -sh "$vst3_path" | cut -f1)
    echo "✓ VST3:       $vst3_path ($vst3_size)"
fi

# AU (macOS only)
au_path=$(find build -name "*.component" -type d | head -1)
if [ -n "$au_path" ]; then
    au_size=$(du -sh "$au_path" | cut -f1)
    echo "✓ AU:         $au_path ($au_size)"
fi

# AAX
aax_path=$(find build -name "*.aaxplugin" -type d | head -1)
if [ -n "$aax_path" ]; then
    aax_size=$(du -sh "$aax_path" | cut -f1)
    echo "✓ AAX:        $aax_path ($aax_size)"
fi

# Standalone
standalone_path=$(find build -name "${plugin_name}" -type f -o -name "${plugin_name}.app" -type d | head -1)
if [ -n "$standalone_path" ]; then
    standalone_size=$(du -sh "$standalone_path" | cut -f1)
    echo "✓ Standalone: $standalone_path ($standalone_size)"
fi

9. Generate Build Report

Create a comprehensive build report:

cat > build/BUILD_REPORT.md << EOF
# Build Report

**Date**: $(date '+%Y-%m-%d %H:%M:%S')
**Build Type**: [BuildType]
**Platform**: $(uname -s) $(uname -m)
**CMake Version**: $(cmake --version | head -1)
**Compiler**: $(cmake -LA -N build | grep CMAKE_CXX_COMPILER: | cut -d= -f2)

## Build Summary

- ✓ Configuration successful
- ✓ Compilation successful
- $([ -f build/Tests/RunUnitTests ] && echo "✓ Tests passed" || echo "  Tests not configured")

## Built Artifacts

$(find build -name "*.vst3" -o -name "*.component" -o -name "*.aaxplugin" | while read file; do
    echo "- $file ($(du -sh "$file" | cut -f1))"
done)

## Plugin Formats

$([ -n "$vst3_path" ] && echo "- [x] VST3" || echo "- [ ] VST3")
$([ -n "$au_path" ] && echo "- [x] AU" || echo "- [ ] AU")
$([ -n "$aax_path" ] && echo "- [x] AAX" || echo "- [ ] AAX")
$([ -n "$standalone_path" ] && echo "- [x] Standalone" || echo "- [ ] Standalone")

## Build Configuration

\`\`\`
$(cmake -LA -N build | grep -E "CMAKE_BUILD_TYPE|CMAKE_CXX_STANDARD|JUCE_VERSION")
\`\`\`

## Next Steps

1. Test plugins in DAW
2. Run pluginval: \`/run-pluginval\`
3. Profile performance: \`/analyze-performance\`
4. Prepare for release: \`/release-build\`

---
Generated by JUCE Dev Team - Build All Formats
EOF

echo ""
echo "✓ Build report saved to build/BUILD_REPORT.md"

10. Display Summary

Present final build summary:

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ BUILD COMPLETE - All Formats"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "📦 Plugin Name: $plugin_name"
echo "🏗️  Build Type: [BuildType]"
echo "⏱️  Build Time: $(cat build/.build_time 2>/dev/null || echo "N/A")"
echo ""
echo "Built Formats:"
$([ -n "$vst3_path" ] && echo "  ✓ VST3")
$([ -n "$au_path" ] && echo "  ✓ AU")
$([ -n "$aax_path" ] && echo "  ✓ AAX")
$([ -n "$standalone_path" ] && echo "  ✓ Standalone")
echo ""
echo "📂 Build Output: build/"
echo "📄 Build Report: build/BUILD_REPORT.md"
echo ""
echo "🚀 Next Steps:"
echo "  1. Test in DAW: Load built plugins in your DAW"
echo "  2. Validate: /run-pluginval"
echo "  3. Debug issues: @build-engineer or @daw-compatibility-engineer"
echo "  4. Package for release: /release-build"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

Platform-Specific Notes

macOS

  • Builds universal binaries (arm64 + x86_64) by default
  • AU format requires macOS
  • Code signing not performed (use /release-build for signed builds)

Windows

  • Builds for x64 architecture
  • AAX requires AAX SDK from Avid
  • Use Visual Studio 2019+ or Ninja generator

Linux

  • VST3 only (AU and AAX not available)
  • Ensure required libraries installed (ALSA, X11, etc.)

Error Handling

CMake Configuration Fails

@build-engineer CMake configuration failed with the following error:
[paste error output]

Please help diagnose and fix this issue.

Compilation Errors

@technical-lead The build failed with compilation errors:
[paste error output]

Please review and suggest fixes.

Linker Errors

@build-engineer Linking failed with the following errors:
[paste error output]

Please help resolve these linker issues.

Definition of Done

  • Project structure verified
  • CMake configured successfully
  • All targets built without errors
  • Tests run (if configured)
  • Built plugins located and verified
  • Build report generated
  • User provided with plugin locations and next steps

Optimization Tips

Speed Up Builds

# Use Ninja generator (faster than Make)
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release

# Use ccache to cache compilation
cmake -B build -DCMAKE_CXX_COMPILER_LAUNCHER=ccache

# Build specific target only
cmake --build build --target MyPlugin_VST3

Clean Rebuilds

# Clean and rebuild
rm -rf build && /build-all-formats release

# Or just clean build artifacts (keeps CMake cache)
cmake --build build --target clean

Integration with Other Commands

This command works well with:

  • /new-juce-plugin - Create project first
  • /run-pluginval - Validate after building
  • /analyze-performance - Profile the build
  • /release-build - Create signed release builds
  • @build-engineer - Debug build issues
  • @test-automation-engineer - Add/fix tests

Advanced Usage

Build Specific Format Only

cmake --build build --target MyPlugin_VST3 --config Release

Build with Warnings as Errors

cmake -B build -DCMAKE_CXX_FLAGS="-Werror"
cmake --build build

Generate Xcode/Visual Studio Project

# Xcode (macOS)
cmake -B build -G Xcode
open build/MyPlugin.xcodeproj

# Visual Studio (Windows)
cmake -B build -G "Visual Studio 17 2022"
start build/MyPlugin.sln