FWIW I’ve got something like this working (staticlibs depending on JUCE) with the following sort of setup:
# Set up JUCE library
add_library(juce_plugin_modules OBJECT)
target_link_libraries(juce_plugin_modules
PRIVATE
juce::juce_audio_utils
juce::juce_dsp
PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_warning_flags)
target_compile_definitions(juce_plugin_modules
PUBLIC
JucePlugin_Build_Standalone=1
JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone
INTERFACE
$<TARGET_PROPERTY:juce_plugin_modules,COMPILE_DEFINITIONS>)
target_include_directories(juce_plugin_modules
INTERFACE
$<TARGET_PROPERTY:juce_plugin_modules,INCLUDE_DIRECTORIES>)
set_default_properties(juce_plugin_modules) # function defined elsewhere. enables PIC, hidden symbols
# Add dependent library
# Library includes JUCE module headers directly, rather than using a JuceHeader.h
add_library(foo STATIC)
target_sources(foo PRIVATE ${sources}) # sources set previously
target_include_directories(foo PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(foo PUBLIC juce_plugin_modules)
set_default_properties(foo) # function defined elsewhere. enables PIC, hidden symbols
# Do something similar for library 'bar'...
# Add plugin target
juce_add_plugin(plug
# etc.
)
target_sources(plug PRIVATE ${plug_sources})
target_include_directories(plug PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(plug PRIVATE foo bar)
target_compile_definitions(plug PUBLIC JUCE_VST3_CAN_REPLACE_VST2=0)