Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@ jobs:
apt install -y sudo cmake curl tree

- uses: actions/checkout@v4
with:
submodules: true

- name: Setup Environment Variables
shell: bash
Expand All @@ -58,12 +56,11 @@ jobs:
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "APP_DIR=${{ env.BUILD_DIR }}/${{ env.BINARY_NAME }}_artefacts/${{ env.BUILD_TYPE }}" >> $GITHUB_ENV
echo "ZIP_FILE_NAME=${{ env.BINARY_NAME }}_${{ matrix.name }}.zip" >> $GITHUB_ENV
echo "JUCE_SHA1=$(git rev-parse HEAD:modules/juce)" >> $GITHUB_ENV
echo "PLUGIN_BUILD_DIR=modules/juce/Builds" >> $GITHUB_ENV


# This needs to be absolute to make action/cache happy
# JUCE examples are built from within the CPM-fetched JUCE source directory
WORKING_DIR=$(pwd)
echo "PLUGIN_CACHE_PATH=$WORKING_DIR/modules/juce/Builds/examples/Plugins" >> $GITHUB_ENV
echo "PLUGIN_CACHE_PATH=$WORKING_DIR/${{ env.BUILD_DIR }}/_deps/juce-src/Builds/examples/Plugins" >> $GITHUB_ENV

- name: Install dependencies (Linux)
if: ${{ matrix.name == 'Linux' }}
Expand All @@ -90,7 +87,7 @@ jobs:
- name: ccache
uses: hendrikmuhs/[email protected]
with:
key: v2-${{ matrix.name }}-${{ env.BUILD_TYPE }}
key: v3-${{ matrix.name }}-${{ env.BUILD_TYPE }}

- name: Configure
shell: bash
Expand All @@ -114,11 +111,11 @@ jobs:
with:
path: ${{ env.PLUGIN_CACHE_PATH }}
# Increment the version in the key below to manually break plugin cache
key: v7-${{ runner.os }}-${{ env.JUCE_SHA1 }}
key: v9-${{ runner.os }}

- name: Build JUCE example plugins
if: steps.cache-plugins.outputs.cache-hit != 'true'
working-directory: modules/juce
working-directory: ${{ env.BUILD_DIR }}/_deps/juce-src
shell: bash
run: |
cmake -B Builds -DJUCE_BUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache .
Expand Down
4 changes: 0 additions & 4 deletions .gitmodules

This file was deleted.

73 changes: 51 additions & 22 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,24 @@ cmake_minimum_required(VERSION 3.15)
file(STRINGS VERSION CURRENT_VERSION LIMIT_COUNT 1)
project(pluginval VERSION ${CURRENT_VERSION})

if (APPLE)
# Target OS versions down to 10.11
set (CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE INTERNAL "")

# Uncomment to produce a universal binary
# set(CMAKE_OSX_ARCHITECTURES arm64 x86_64)
set(PLUGINVAL_ENABLE_RTCHECK ON)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
# Disable rtcheck on Linux for now until further testing on real Linux systems has been done
# set(PLUGINVAL_ENABLE_RTCHECK ON)
# Just compliing pluginval
if (pluginval_IS_TOP_LEVEL)
if (APPLE)
# Target OS versions down to 10.11
set (CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE INTERNAL "")

# Uncomment to produce a universal binary
# set(CMAKE_OSX_ARCHITECTURES arm64 x86_64)
set(PLUGINVAL_ENABLE_RTCHECK ON)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
# Disable rtcheck on Linux for now until further testing on real Linux systems has been done
# set(PLUGINVAL_ENABLE_RTCHECK ON)
endif()
else()
# compiling as a "dependency" of another JUCE CMake project
if (NOT COMMAND juce_add_module)
message(FATAL_ERROR "JUCE must be added to your project before pluginval!")
endif ()
endif()

# sanitizer options, from https://github.com/sudara/cmake-includes/blob/main/Sanitizers.cmake
Expand Down Expand Up @@ -52,11 +60,9 @@ if(PLUGINVAL_ENABLE_RTCHECK)
CPMAddPackage("gh:Tracktion/rtcheck#main")
endif()


option(PLUGINVAL_FETCH_JUCE "Fetch JUCE along with pluginval" ON)

if(PLUGINVAL_FETCH_JUCE)
add_subdirectory(modules/juce)
# Only fetch JUCE when top-level (when used as dependency, JUCE is already available)
if (pluginval_IS_TOP_LEVEL)
CPMAddPackage("gh:juce-framework/juce#8.0.3")
endif()

if (DEFINED ENV{VST2_SDK_DIR})
Expand Down Expand Up @@ -151,11 +157,34 @@ if (PLUGINVAL_ENABLE_RTCHECK)
endif ()
endif()

set (cmdline_docs_out "${CMAKE_CURRENT_LIST_DIR}/docs/Command line options.md")

add_custom_command (OUTPUT "${cmdline_docs_out}"
COMMAND pluginval --help > "${cmdline_docs_out}"
COMMENT "Regenerating Command line options.md..."
USES_TERMINAL)
if (pluginval_IS_TOP_LEVEL)
set (cmdline_docs_out "${CMAKE_CURRENT_LIST_DIR}/docs/Command line options.md")

add_custom_target (PluginvalDocs DEPENDS "${cmdline_docs_out}")
add_custom_command (OUTPUT "${cmdline_docs_out}"
COMMAND pluginval --help > "${cmdline_docs_out}"
COMMENT "Regenerating Command line options.md..."
USES_TERMINAL)
add_custom_target (PluginvalDocs DEPENDS "${cmdline_docs_out}")
else()
# Custom pluginval CLI target
set(PLUGINVAL_STRICTNESS_LEVEL 10 CACHE STRING "Pluginval --strictness argument (1-10)")
set_property(CACHE PLUGINVAL_STRICTNESS_LEVEL PROPERTY STRINGS 1 2 3 4 5 6 7 8 9 10)

# Set the target based on the platform
# Makes the assumption both are being built
if(APPLE)
set(PLUGINVAL_TARGET "${CMAKE_PROJECT_NAME}_AU")
else()
set(PLUGINVAL_TARGET "${CMAKE_PROJECT_NAME}_VST3")
endif()

get_target_property(artefact ${PLUGINVAL_TARGET} JUCE_PLUGIN_ARTEFACT_FILE)

# TODO: This doesn't populate the executable in clion
add_custom_target(${CMAKE_PROJECT_NAME}_pluginval_cli
COMMAND $<TARGET_FILE:pluginval>
--validate ${artefact}
--strictness-level 10
DEPENDS pluginval ${PLUGINVAL_TARGET}
COMMENT "Run pluginval CLI with strict validation")
endif()
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,24 @@ cmake -B Builds/Debug -DCMAKE_BUILD_TYPE=Debug . # configure
cmake --build Builds/Debug --config Debug # build
```

### Including within an existing JUCE project

Instead of running as a separate app, you can add pluginval as a CMake target to your existing plugin project. This not only makes for a convenient debugging workflow, it gives you better stack traces.

For example, if you add pluginval as a git submodule like so:
```
git submodule add -b develop [email protected]:Tracktion/pluginval.git modules/pluginval
```

or added with CPM like so:

```
CPMAddPackage("gh:tracktion/pluginval#develop")
```

Then all you need to do is call `add_subdirectory ("modules/pluginval")` in your `CMakeLists.txt`. This should be done **after** your call to `juce_add_plugin`.


### Third-party Installation
###### _Chocolatey (Windows):_
```shell
Expand Down
4 changes: 4 additions & 0 deletions Source/CommandLine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,11 @@ namespace
bool isPluginArgument (juce::String arg)
{
juce::AudioPluginFormatManager formatManager;
#if JUCE_VERSION >= 0x08000B
juce::addDefaultFormatsToManager (formatManager);
#else
formatManager.addDefaultFormats();
#endif

for (auto format : formatManager.getFormats())
if (format->fileMightContainThisPluginType (arg))
Expand Down
4 changes: 4 additions & 0 deletions Source/MainComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,11 @@ namespace
MainComponent::MainComponent (Validator& v)
: validator (v)
{
#if JUCE_VERSION >= 0x08000B
juce::addDefaultFormatsToManager (formatManager);
#else
formatManager.addDefaultFormats();
#endif

menuBar.setModel (this);
addAndMakeVisible (menuBar);
Expand Down
4 changes: 4 additions & 0 deletions Source/PluginTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,11 @@ PluginTests::PluginTests (const juce::String& fileOrIdentifier, Options opts)
{
jassert (fileOrIdentifier.isNotEmpty());
jassert (juce::isPositiveAndNotGreaterThan (options.strictnessLevel, 10));
#if JUCE_VERSION >= 0x08000B
juce::addDefaultFormatsToManager (formatManager);
#else
formatManager.addDefaultFormats();
#endif
}

PluginTests::PluginTests (const juce::PluginDescription& desc, Options opts)
Expand Down
1 change: 0 additions & 1 deletion modules/juce
Submodule juce deleted from a2a9c5