diff --git a/.github/workflows/bump_tag.yml b/.github/workflows/bump_tag.yml deleted file mode 100644 index 739a05b..0000000 --- a/.github/workflows/bump_tag.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Bump tag -on: - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-22.04 - permissions: - contents: write - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: '0' - - - name: Bump version and push tag - uses: anothrNick/github-tag-action@1.70.0 # Don't use @master or @v1 unless you're happy to test the latest version - env: - DEFAULT_BUMP: patch - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # if you don't want to set write permissions use a PAT token - WITH_V: false diff --git a/.github/workflows/cmake_standalone.yml b/.github/workflows/cmake_standalone.yml new file mode 100644 index 0000000..5bd70b2 --- /dev/null +++ b/.github/workflows/cmake_standalone.yml @@ -0,0 +1,235 @@ +name: Standalone + +on: + workflow_dispatch: + +concurrency: + group: ${{ github.ref }} + cancel-in-progress: true + +env: + BUILD_TYPE: Release + BUILD_DIR: Builds + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DISPLAY: :0 # linux pluginval needs this + CMAKE_BUILD_PARALLEL_LEVEL: 3 # Use up to 3 cpus to build juceaide, etc + HOMEBREW_NO_INSTALL_CLEANUP: 1 + IPP_DIR: C:\Program Files (x86)\Intel\oneAPI\ipp\latest\lib\cmake\ipp + +# jobs are run in paralell on different machines +# all steps run in series +jobs: + build_and_test: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false # show all errors for each platform (vs. cancel jobs on error) + matrix: + include: + - name: Linux + os: ubuntu-22.04 + boost_platform_version: "22.04" + boost_toolset: "gcc" + plugin_os_format: "Standalone" + app_suffix: "" + - name: macOS + os: macos-14 + boost_platform_version: "11" + boost_toolset: "clang" + plugin_os_format: "Standalone" + app_suffix: "app" + - name: Windows + os: windows-latest + boost_platform_version: "2022" + boost_toolset: "msvc" + plugin_os_format: "Standalone" + app_suffix: "exe" + + steps: + - name: Set up MSVC Developer Command Prompt (Windows) + if: runner.os == 'Windows' + uses: ilammy/msvc-dev-cmd@v1 + + - name: Set up Clang (Linux) + if: runner.os == 'Linux' + uses: egor-tensin/setup-clang@v1 + + # This also starts up our "fake" display Xvfb, needed for pluginval + - name: Install JUCE's Linux Deps + if: runner.os == 'Linux' + # Thanks to McMartin & co https://forum.juce.com/t/list-of-juce-dependencies-under-linux/15121/44 + run: | + sudo apt-get update && sudo apt install libasound2-dev libx11-dev libxinerama-dev libxext-dev libfreetype-dev libfontconfig1-dev libwebkit2gtk-4.1-dev libglu1-mesa-dev xvfb ninja-build + sudo /usr/bin/Xvfb $DISPLAY & + + - name: Cache IPP (Windows) + if: runner.os == 'Windows' + id: cache-ipp + uses: actions/cache@v4 + with: + key: ipp-v5 + path: C:\Program Files (x86)\Intel + + - name: Install IPP (Windows) + if: (runner.os == 'Windows') && (steps.cache-ipp.outputs.cache-hit != 'true') + shell: bash + run: | + curl --output oneapi.exe https://registrationcenter-download.intel.com/akdlm/IRC_NAS/b4adec02-353b-4144-aa21-f2087040f316/w_ipp_oneapi_p_2021.11.0.533_offline.exe + ./oneapi.exe -s -x -f oneapi + ./oneapi/bootstrapper.exe -s -c --action install --components=intel.oneapi.win.ipp.devel --eula=accept -p=NEED_VS2022_INTEGRATION=1 --log-dir=. + + - name: Save IPP cache (even on CI fail) + if: runner.os == 'Windows' && (steps.cache-ipp.outputs.cache-hit != 'true') + uses: actions/cache/save@v4 + with: + path: C:\Program Files (x86)\Intel + key: ipp-v5 + + - name: Install Ninja (Windows) + if: runner.os == 'Windows' + shell: bash + run: choco install ninja + + - name: Install macOS Deps + if: ${{ matrix.name == 'macOS' }} + run: brew install ninja osxutils + + # This block can be removed once 15.1 is default (JUCE requires it when building on macOS 14) + - name: Use latest Xcode on system (macOS) + if: ${{ matrix.name == 'macOS' }} + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest-stable + + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: true + + - name: Install boost + uses: MarkusJx/install-boost@v2.4.5 + id: install-boost + with: + boost_version: 1.80.0 + platform_version: ${{ matrix.boost_platform_version }} + toolset: ${{ matrix.boost_toolset }} + link: "static" + + - name: Cache the build + uses: mozilla-actions/sccache-action@v0.0.5 + + - name: Import Certificates (macOS) + uses: apple-actions/import-codesign-certs@v3 # only exists as a tag right now + if: ${{ (matrix.name == 'macOS') && (env.p12-file-base64 != '')}} + with: + p12-file-base64: ${{ secrets.DEV_ID_APP_CERT }} + p12-password: ${{ secrets.DEV_ID_APP_PASSWORD }} + env: + p12-file-base64: ${{ secrets.DEV_ID_APP_CERT }} + + - name: Configure + shell: bash + run: cmake -B ${{ env.BUILD_DIR }} -G Ninja -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE}} -DCMAKE_C_COMPILER_LAUNCHER=${{ matrix.ccache }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ matrix.ccache }} -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" . + env: + BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }} + PLUGIN_OS_FORMAT: ${{ matrix.plugin_os_format }} + + - name: Build + shell: bash + run: cmake --build ${{ env.BUILD_DIR }} --config ${{ env.BUILD_TYPE }} --parallel 4 + + - name: Test + working-directory: ${{ env.BUILD_DIR }} + run: ctest --output-on-failure -j4 -VV + + - name: Read in .env from CMake # see GitHubENV.cmake + shell: bash + run: | + cat .env # show us the config + cat .env >> $GITHUB_ENV # pull in our PRODUCT_NAME, etc + + - name: Set additional env vars for next steps + shell: bash + run: | + ARTIFACTS_PATH=${{ env.BUILD_DIR }}/${{ env.PROJECT_NAME }}_artefacts/${{ env.BUILD_TYPE }} + echo "ARTIFACTS_PATH=$ARTIFACTS_PATH" >> $GITHUB_ENV + echo "VST3_PATH=$ARTIFACTS_PATH/VST3/${{ env.PRODUCT_NAME }}.vst3" >> $GITHUB_ENV + echo "AU_PATH=$ARTIFACTS_PATH/AU/${{ env.PRODUCT_NAME }}.component" >> $GITHUB_ENV + echo "LV2_PATH=$ARTIFACTS_PATH/LV2/${{ env.PRODUCT_NAME }}.lv2" >> $GITHUB_ENV + echo "Standalone_PATH=$ARTIFACTS_PATH/Standalone/${{ env.PRODUCT_NAME }}.${{ matrix.app_suffix }}" >> $GITHUB_ENV + echo "ARTIFACT_NAME=${{ env.PRODUCT_NAME }}-${{ env.VERSION }}-${{ matrix.name }}" >> $GITHUB_ENV + + - name: Codesign and Create Individual Packages (macOS) + if: ${{ matrix.name == 'macOS' }} + run: | + python3 -u packaging/packager_macOS.py + env: + DEVELOPER_ID_APPLICATION: ${{ secrets.DEVELOPER_ID_APPLICATION }} + + - name: Sign Final Package (macOS) + if: ${{ (matrix.name == 'macOS') && (env.APPLE_INSTALLER_DEV != '') }} + run: productsign --sign "${{ secrets.APPLE_INSTALLER_DEV }}" "${{ env.ARTIFACT_NAME }}_unsigned.pkg" "${{ env.ARTIFACT_NAME }}.pkg" + env: + APPLE_INSTALLER_DEV: ${{ secrets.APPLE_INSTALLER_DEV }} + + - name: Rename Final Package (macOS) + if: ${{ (matrix.name == 'macOS') && (env.APPLE_INSTALLER_DEV == '') }} + run: mv "${{ env.ARTIFACT_NAME }}_unsigned.pkg" "${{ env.ARTIFACT_NAME }}.pkg" + env: + APPLE_INSTALLER_DEV: ${{ secrets.APPLE_INSTALLER_DEV }} + + - name: Notarize and Staple PKG (macOS) + if: ${{ (matrix.name == 'macOS') && (env.NOTARIZATION_USERNAME != '')}} + run: | + xcrun notarytool submit "${{ env.ARTIFACT_NAME }}.pkg" --apple-id ${{ secrets.NOTARIZATION_USERNAME }} --password ${{ secrets.NOTARIZATION_PASSWORD }} --team-id ${{ secrets.TEAM_ID }} --wait + xcrun stapler staple "${{ env.ARTIFACT_NAME }}.pkg" + env: + NOTARIZATION_USERNAME: ${{ secrets.NOTARIZATION_USERNAME }} + + - name: Create DMG (macOS) + if: ${{ matrix.name == 'macOS' }} + run: | + mkdir "${{ env.ARTIFACTS_PATH }}/dmgtmp" + mv "${{ env.ARTIFACT_NAME }}.pkg" "${{ env.ARTIFACTS_PATH }}/dmgtmp" + hdiutil create "${{ env.ARTIFACTS_PATH }}/tmp.dmg" -ov -volname "${{ env.ARTIFACT_NAME }}" -fs HFS+ -srcfolder "${{ env.ARTIFACTS_PATH }}/dmgtmp" + hdiutil convert "${{ env.ARTIFACTS_PATH }}/tmp.dmg" -format UDZO -o "${{ env.ARTIFACT_NAME }}.dmg" + + - name: Upload DMG (macOS) + if: ${{ matrix.name == 'macOS' }} + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_NAME }}.dmg + path: "${{ env.ARTIFACT_NAME }}.dmg" + + - name: Generate InnoScript (Windows) + if: ${{ matrix.name == 'Windows' }} + shell: bash + run: | + python3 -u packaging/packager_Windows.py + cat "packaging\installer.iss" + + - name: Generate Installer (Windows) + if: ${{ matrix.name == 'Windows' }} + shell: bash + run: | + iscc "packaging\installer.iss" + mv "packaging/Output/${{ env.ARTIFACT_NAME }}.exe" "${{ env.ARTIFACTS_PATH }}/" + + - name: Upload Exe (Windows) + if: ${{ matrix.name == 'Windows' }} + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_NAME }}.exe + path: "${{ env.ARTIFACTS_PATH }}/${{ env.ARTIFACT_NAME }}.exe" + + - name: Generate Zip (Linux) + if: ${{ matrix.name == 'Linux' }} + working-directory: ${{ env.ARTIFACTS_PATH }} + run: 7z a -tzip "${{ env.ARTIFACT_NAME }}.zip" "-xr!lib${{ env.PRODUCT_NAME }}_SharedCode.a" . + + - name: Upload Zip (Linux) + if: ${{ matrix.name == 'Linux' }} + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_NAME }}.zip + path: "${{ env.ARTIFACTS_PATH }}/${{ env.ARTIFACT_NAME }}.zip" \ No newline at end of file diff --git a/.github/workflows/sync_release.yml b/.github/workflows/sync_release.yml index 18ed34e..bf81ec7 100644 --- a/.github/workflows/sync_release.yml +++ b/.github/workflows/sync_release.yml @@ -1,9 +1,6 @@ name: Release Sync on: workflow_dispatch: - # workflow_run: - # workflows: [Release] - # types: [completed] jobs: build: diff --git a/packaging/packager_Windows.py b/packaging/packager_Windows.py index 3940d15..2f2b5d9 100644 --- a/packaging/packager_Windows.py +++ b/packaging/packager_Windows.py @@ -54,12 +54,13 @@ def main(): all_install_paths = [ r'{commoncf64}\VST3', r'{commoncf64}\LV2', - r'{commoncf64}\Avid\Audio\Plug-Ins', ] + r'{commoncf64}\Avid\Audio\Plug-Ins', + r'{commonpf64}\ZLAudio'] plugin_formats, extensions, install_paths = [], [], [] for plugin_format, extension, install_path in zip( - ["VST3", "LV2", "AAX"], - ["vst3", "lv2", "aaxplugin"], + ["VST3", "LV2", "AAX", "Standalone"], + ["vst3", "lv2", "aaxplugin", "standalone"], all_install_paths): if plugin_format + "_PATH" in os.environ: plugin_path = os.environ[plugin_format + "_PATH"] @@ -86,12 +87,20 @@ def main(): outfile.write("[Files]\n") for plugin_format, extension, install_path in zip(plugin_formats, extensions, install_paths): - outfile.write( - 'Source: "..\\{}\\*"; DestDir: "{}"; Excludes: *.ilk; Flags: ignoreversion recursesubdirs; Components: {}'.format( - str(PureWindowsPath(os.environ[plugin_format + "_PATH"])), - install_path + '\\' + product_name + "." + extension + "\\", - extension) - ) + if plugin_format == "Standalone": + outfile.write( + 'Source: "..\\{}"; DestDir: "{}"; Excludes: *.ilk; Flags: ignoreversion; Components: {}'.format( + str(PureWindowsPath(os.environ[plugin_format + "_PATH"])), + install_path + '\\' + product_name, + extension) + ) + else: + outfile.write( + 'Source: "..\\{}\\*"; DestDir: "{}"; Excludes: *.ilk; Flags: ignoreversion recursesubdirs; Components: {}'.format( + str(PureWindowsPath(os.environ[plugin_format + "_PATH"])), + install_path + '\\' + product_name + "." + extension + "\\", + extension) + ) outfile.write("\n") outfile.write("[Run]\n") @@ -106,8 +115,6 @@ def main(): outfile.write("\n") outfile.close() - return 0 - if __name__ == '__main__': sys.exit(main()) diff --git a/packaging/packager_macOS.py b/packaging/packager_macOS.py index b0d630b..394b159 100644 --- a/packaging/packager_macOS.py +++ b/packaging/packager_macOS.py @@ -47,13 +47,14 @@ def main(): "/Library/Audio/Plug-Ins/Components", "/Library/Audio/Plug-Ins/LV2", "/Library/Audio/Plug-Ins/CLAP", - "/Library/Application Support/Avid/Audio/Plug-Ins" + "/Library/Application Support/Avid/Audio/Plug-Ins", + "/Applications" ] print("Create packages") for plugin_format, extension, install_path in zip( - ["VST3", "AU", "LV2", "CLAP", "AAX"], - ["vst3", "au", "lv2", "clap", "aax"], + ["VST3", "AU", "LV2", "CLAP", "AAX", "Standalone"], + ["vst3", "au", "lv2", "clap", "aax", "standalone"], install_paths): if plugin_format + "_PATH" in os.environ: plugin_path = os.environ[plugin_format + "_PATH"]