| @@ -445,7 +445,8 @@ function(juce_add_module module_path) | |||
| if(${module_name} STREQUAL "juce_audio_plugin_client") | |||
| list(REMOVE_ITEM headers | |||
| "${module_path}/LV2/juce_LV2ManifestHelper.cpp") | |||
| "${module_path}/LV2/juce_LV2ManifestHelper.cpp" | |||
| "${module_path}/VST3/juce_VST3ManifestHelper.cpp") | |||
| _juce_get_platform_plugin_kinds(plugin_kinds) | |||
| @@ -947,57 +947,28 @@ function(_juce_add_vst3_manifest_helper_target) | |||
| get_target_property(module_path juce::juce_audio_processors INTERFACE_JUCE_MODULE_PATH) | |||
| set(vst3_dir "${module_path}/juce_audio_processors/format_types/VST3_SDK") | |||
| set(public_dir "${vst3_dir}/public.sdk") | |||
| set(public_source_dir "${public_dir}/source") | |||
| set(public_common_dir "${public_source_dir}/common") | |||
| set(public_vst_dir "${public_source_dir}/vst") | |||
| set(hosting_dir "${public_vst_dir}/hosting") | |||
| set(extension "cpp") | |||
| if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") | |||
| set(extra_source "${hosting_dir}/module_mac.mm") | |||
| set_source_files_properties("${extra_source}" PROPERTIES COMPILE_FLAGS "-fobjc-arc") | |||
| elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") | |||
| set(extra_source "${hosting_dir}/module_linux.cpp") | |||
| elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") | |||
| set(extra_source | |||
| "${vst3_dir}/helper.manifest" | |||
| "${hosting_dir}/module_win32.cpp") | |||
| endif() | |||
| add_executable(juce_vst3_helper | |||
| "${extra_source}" | |||
| "${hosting_dir}/module.cpp" | |||
| "${public_common_dir}/memorystream.cpp" | |||
| "${public_common_dir}/readfile.cpp" | |||
| "${public_dir}/samples/vst-utilities/moduleinfotool/source/main.cpp" | |||
| "${public_vst_dir}/moduleinfo/moduleinfocreator.cpp" | |||
| "${public_vst_dir}/moduleinfo/moduleinfoparser.cpp" | |||
| "${public_vst_dir}/utility/stringconvert.cpp" | |||
| "${public_vst_dir}/vstinitiids.cpp" | |||
| "${vst3_dir}/pluginterfaces/base/coreiids.cpp" | |||
| "${vst3_dir}/pluginterfaces/base/funknown.cpp") | |||
| set(extension "mm") | |||
| endif() | |||
| set(source "${module_path}/juce_audio_plugin_client/VST3/juce_VST3ManifestHelper.${extension}") | |||
| add_executable(juce_vst3_helper "${source}") | |||
| add_executable(juce::juce_vst3_helper ALIAS juce_vst3_helper) | |||
| target_compile_features(juce_vst3_helper PRIVATE cxx_std_17) | |||
| target_include_directories(juce_vst3_helper PRIVATE "${vst3_dir}") | |||
| target_include_directories(juce_vst3_helper PRIVATE "${vst3_dir}" "${module_path}") | |||
| if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") | |||
| OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") | |||
| OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")) | |||
| target_compile_options(juce_vst3_helper PRIVATE | |||
| "-Wno-deprecated-declarations" | |||
| "-Wno-expansion-to-defined" | |||
| "-Wno-format" | |||
| "-Wno-pragma-pack") | |||
| endif() | |||
| if((CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") OR (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")) | |||
| target_compile_options(juce_vst3_helper PRIVATE /EHsc /wd6387 /wd6031) | |||
| endif() | |||
| add_library(juce_interface_definitions INTERFACE) | |||
| _juce_add_standard_defs(juce_interface_definitions) | |||
| target_link_libraries(juce_vst3_helper PRIVATE juce_interface_definitions) | |||
| target_compile_features(juce_vst3_helper PRIVATE cxx_std_17) | |||
| if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") | |||
| _juce_link_frameworks(juce_vst3_helper PRIVATE Cocoa) | |||
| target_compile_options(juce_vst3_helper PRIVATE -fobjc-arc) | |||
| endif() | |||
| set_target_properties(juce_vst3_helper PROPERTIES BUILD_WITH_INSTALL_RPATH ON) | |||
| @@ -1048,22 +1019,6 @@ function(_juce_set_plugin_target_properties shared_code_target kind) | |||
| LIBRARY_OUTPUT_DIRECTORY "${output_path}/Contents/${JUCE_TARGET_ARCHITECTURE}-linux") | |||
| endif() | |||
| set(remove_command remove) | |||
| if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.17") | |||
| set(remove_command rm) | |||
| endif() | |||
| # Delete moduleinfo.json if it exists, and repair signing so we can still load the bundle | |||
| add_custom_command(TARGET ${target_name} POST_BUILD | |||
| COMMAND "${CMAKE_COMMAND}" -E ${remove_command} -f "${output_path}/Contents/moduleinfo.json" | |||
| COMMAND "${CMAKE_COMMAND}" | |||
| "-Dsrc=${output_path}" | |||
| "-P" "${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake" | |||
| VERBATIM) | |||
| get_target_property(manifest_enabled ${shared_code_target} JUCE_VST3_MANIFEST_ENABLED) | |||
| if("${manifest_enabled}") | |||
| # Add a target for the helper tool | |||
| _juce_add_vst3_manifest_helper_target() | |||
| @@ -1072,22 +1027,14 @@ function(_juce_set_plugin_target_properties shared_code_target kind) | |||
| # Use the helper tool to write out the moduleinfo.json | |||
| add_custom_command(TARGET ${target_name} POST_BUILD | |||
| COMMAND ${CMAKE_COMMAND} -E remove -f "${output_path}/Contents/moduleinfo.json" | |||
| COMMAND ${CMAKE_COMMAND} -E make_directory "${output_path}/Contents/Resources" | |||
| COMMAND juce_vst3_helper | |||
| -create | |||
| -version "${target_version_string}" | |||
| -path "${output_path}" | |||
| -output "${output_path}/Contents/moduleinfo.json" | |||
| -output "${output_path}/Contents/Resources/moduleinfo.json" | |||
| VERBATIM) | |||
| # Sign the moduleinfo.json then the full bundle from the inside out | |||
| if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") | |||
| add_custom_command(TARGET ${target_name} POST_BUILD | |||
| COMMAND xcrun codesign -f -s "-" "${output_path}/Contents/moduleinfo.json" | |||
| COMMAND "${CMAKE_COMMAND}" | |||
| "-Dsrc=${output_path}" | |||
| "-P" "${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake" | |||
| VERBATIM) | |||
| endif() | |||
| endif() | |||
| _juce_set_copy_properties(${shared_code_target} ${target_name} "${output_path}" JUCE_VST3_COPY_DIR) | |||
| @@ -21,4 +21,16 @@ | |||
| # | |||
| # ============================================================================== | |||
| if(NOT EXISTS "${src}") | |||
| message(STATUS "Unable to copy ${src} as it does not exist") | |||
| return() | |||
| endif() | |||
| get_filename_component(name "${src}" NAME) | |||
| if(EXISTS "${dest}/${name}") | |||
| message(STATUS "Destination ${dest}/${name} exists, overwriting") | |||
| file(REMOVE_RECURSE "${dest}/${name}") | |||
| endif() | |||
| file(INSTALL ${src} DESTINATION ${dest} USE_SOURCE_PERMISSIONS) | |||
| @@ -798,12 +798,9 @@ public: | |||
| } | |||
| else if (type == VST3Helper) | |||
| { | |||
| for (const auto& source : owner.getVST3HelperProgramSources (owner)) | |||
| { | |||
| const auto location = owner.rebaseFromProjectFolderToBuildTarget (source) | |||
| .toWindowsStyle(); | |||
| cppFiles->createNewChildElement ("ClCompile")->setAttribute ("Include", location); | |||
| } | |||
| const auto location = owner.rebaseFromProjectFolderToBuildTarget (owner.getVST3HelperProgramSource()) | |||
| .toWindowsStyle(); | |||
| cppFiles->createNewChildElement ("ClCompile")->setAttribute ("Include", location); | |||
| } | |||
| } | |||
| @@ -1344,15 +1341,18 @@ public: | |||
| // moduleinfotool doesn't handle Windows-style path separators properly when computing the bundle name | |||
| const auto normalisedBundlePath = getOwner().getOutDirFile (config, segments[0]).replace ("\\", "/"); | |||
| return "\r\n" | |||
| + writer.quoted() | |||
| + " -create -version " | |||
| + getOwner().project.getVersionString().quoted() | |||
| + " -path " | |||
| + normalisedBundlePath.quoted() | |||
| + " -output " | |||
| + (getOwner().getOutDirFile (config, segments[0]) + "\\Contents\\moduleinfo.json").quoted(); | |||
| const auto contentsDir = normalisedBundlePath + "\\Contents"; | |||
| const auto resourceDir = contentsDir + "\\Resources"; | |||
| return "\r\ndel /s /q " + (contentsDir + "\\moduleinfo.json").quoted() + "\r\n" | |||
| "if not exist " + resourceDir.quoted() + " mkdir " + resourceDir.quoted() + "\r\n" | |||
| + writer.quoted() | |||
| + " -create -version " | |||
| + getOwner().project.getVersionString().quoted() | |||
| + " -path " | |||
| + normalisedBundlePath.quoted() | |||
| + " -output " | |||
| + (resourceDir + "\\moduleinfo.json").quoted(); | |||
| }(); | |||
| const auto pkgScript = copyBuildOutputIntoBundle (segments); | |||
| @@ -410,11 +410,13 @@ public: | |||
| { | |||
| if (owner.project.isVst3ManifestEnabled()) | |||
| { | |||
| out << "\t$(V_AT) $(JUCE_OUTDIR)/$(JUCE_TARGET_VST3_MANIFEST_HELPER) " | |||
| out << "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)/$(JUCE_VST3DIR)/Contents/Resources" << newLine | |||
| << "\t-$(V_AT)rm -f $(JUCE_OUTDIR)/$(JUCE_VST3DIR)/Contents/moduleinfo.json" << newLine | |||
| << "\t$(V_AT) $(JUCE_OUTDIR)/$(JUCE_TARGET_VST3_MANIFEST_HELPER) " | |||
| "-create " | |||
| "-version " << owner.project.getVersionString().quoted() << " " | |||
| "-path \"$(JUCE_OUTDIR)/$(JUCE_VST3DIR)\" " | |||
| "-output \"$(JUCE_OUTDIR)/$(JUCE_VST3DIR)/Contents/moduleinfo.json\" " << newLine; | |||
| "-output \"$(JUCE_OUTDIR)/$(JUCE_VST3DIR)/Contents/Resources/moduleinfo.json\"" << newLine; | |||
| } | |||
| out << "\t-$(V_AT)[ ! \"$(JUCE_VST3DESTDIR)\" ] || (mkdir -p $(JUCE_VST3DESTDIR) && cp -R $(JUCE_COPYCMD_VST3))" << newLine; | |||
| @@ -1200,13 +1202,10 @@ private: | |||
| } | |||
| else if (targetType == MakefileTarget::VST3Helper) | |||
| { | |||
| for (const auto& source : getVST3HelperProgramSources (*this)) | |||
| { | |||
| targetFiles.emplace_back (source.rebased (projectFolder, | |||
| getTargetFolder(), | |||
| build_tools::RelativePath::buildTargetFolder), | |||
| String{}); | |||
| } | |||
| targetFiles.emplace_back (getVST3HelperProgramSource().rebased (projectFolder, | |||
| getTargetFolder(), | |||
| build_tools::RelativePath::buildTargetFolder), | |||
| String{}); | |||
| } | |||
| return targetFiles; | |||
| @@ -2135,18 +2135,15 @@ private: | |||
| } | |||
| if (target->type == XcodeTarget::VST3Helper | |||
| && project.getEnabledModules().isModuleEnabled ("juce_audio_processors")) | |||
| && project.getEnabledModules().isModuleEnabled ("juce_audio_plugin_client")) | |||
| { | |||
| for (const auto& source : getVST3HelperProgramSources (*this)) | |||
| { | |||
| const auto path = rebaseFromProjectFolderToBuildTarget (source); | |||
| addFile (FileOptions().withRelativePath ({ expandPath (path.toUnixStyle()), path.getRoot() }) | |||
| .withSkipPCHEnabled (true) | |||
| .withCompilationEnabled (true) | |||
| .withInhibitWarningsEnabled (true) | |||
| .withCompilerFlags ("-std=c++17 -fobjc-arc") | |||
| .withXcodeTarget (target)); | |||
| } | |||
| const auto path = rebaseFromProjectFolderToBuildTarget (getVST3HelperProgramSource()); | |||
| addFile (FileOptions().withRelativePath ({ expandPath (path.toUnixStyle()), path.getRoot() }) | |||
| .withSkipPCHEnabled (true) | |||
| .withCompilationEnabled (true) | |||
| .withInhibitWarningsEnabled (true) | |||
| .withCompilerFlags ("-std=c++17 -fobjc-arc") | |||
| .withXcodeTarget (target)); | |||
| } | |||
| auto targetName = String (target->getName()); | |||
| @@ -2369,16 +2366,11 @@ private: | |||
| } | |||
| else if (target->type == XcodeTarget::VST3PlugIn && project.isVst3ManifestEnabled()) | |||
| { | |||
| // Generate the manifest | |||
| script << "\"$CONFIGURATION_BUILD_DIR/" << Project::getVST3FileWriterName() << "\" " | |||
| "-create " | |||
| "-version " << project.getVersionString().quoted() << " " | |||
| "-path \"$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME\" " | |||
| "-output \"$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME/Contents/moduleinfo.json\"\n"; | |||
| // Sign the manifest (a prerequisite of signing the containing bundle) | |||
| script << "xcrun codesign -f -s - \"$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME/Contents/moduleinfo.json\"\n"; | |||
| // Sign the full bundle | |||
| script << "xcrun codesign -f -s - \"$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME\"\n"; | |||
| "-output \"$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME/Contents/Resources/moduleinfo.json\"\n"; | |||
| } | |||
| target->addShellScriptBuildPhase ("Update manifest", script); | |||
| @@ -2986,7 +2978,7 @@ private: | |||
| output << "\t};\n\trootObject = " << createID ("__root") << " /* Project object */;\n}\n"; | |||
| } | |||
| String addFileReference (String pathString, String fileType = {}) const | |||
| String addFileReference (String pathString, const String& fileType = {}) const | |||
| { | |||
| String sourceTree ("SOURCE_ROOT"); | |||
| build_tools::RelativePath path (pathString, build_tools::RelativePath::unknown); | |||
| @@ -3004,7 +2996,7 @@ private: | |||
| return addFileOrFolderReference (pathString, sourceTree, fileType.isEmpty() ? getFileType (pathString) : fileType); | |||
| } | |||
| String addFileOrFolderReference (const String& pathString, String sourceTree, String fileType) const | |||
| String addFileOrFolderReference (const String& pathString, const String& sourceTree, const String& fileType) const | |||
| { | |||
| auto fileRefID = createFileRefID (pathString); | |||
| auto filename = build_tools::RelativePath (pathString, build_tools::RelativePath::unknown).getFileName(); | |||
| @@ -223,49 +223,12 @@ public: | |||
| .getChildFile ("juce_LV2ManifestHelper.cpp"); | |||
| } | |||
| std::vector<build_tools::RelativePath> getVST3HelperProgramSources (const ProjectExporter& exporter) const | |||
| build_tools::RelativePath getVST3HelperProgramSource() const | |||
| { | |||
| const auto base = getModuleFolderRelativeToProject ("juce_audio_processors").getChildFile ("format_types") | |||
| .getChildFile ("VST3_SDK"); | |||
| const auto publicSdk = base.getChildFile ("public.sdk"); | |||
| const auto source = publicSdk.getChildFile ("source"); | |||
| const auto vst = source.getChildFile ("vst"); | |||
| const auto hosting = vst.getChildFile ("hosting"); | |||
| const auto plugBase = base.getChildFile ("pluginterfaces") | |||
| .getChildFile ("base"); | |||
| std::vector<build_tools::RelativePath> result | |||
| { | |||
| hosting.getChildFile ("module.cpp"), | |||
| base.getChildFile ("public.sdk") | |||
| .getChildFile ("samples") | |||
| .getChildFile ("vst-utilities") | |||
| .getChildFile ("moduleinfotool") | |||
| .getChildFile ("source") | |||
| .getChildFile ("main.cpp"), | |||
| source.getChildFile ("common") | |||
| .getChildFile ("memorystream.cpp"), | |||
| source.getChildFile ("common") | |||
| .getChildFile ("readfile.cpp"), | |||
| vst.getChildFile ("moduleinfo") | |||
| .getChildFile ("moduleinfocreator.cpp"), | |||
| vst.getChildFile ("moduleinfo") | |||
| .getChildFile ("moduleinfoparser.cpp"), | |||
| vst.getChildFile ("utility") | |||
| .getChildFile ("stringconvert.cpp"), | |||
| vst.getChildFile ("vstinitiids.cpp"), | |||
| plugBase.getChildFile ("coreiids.cpp"), | |||
| plugBase.getChildFile ("funknown.cpp"), | |||
| }; | |||
| if (exporter.isOSX()) | |||
| result.push_back (hosting.getChildFile ("module_mac.mm")); | |||
| else if (exporter.isLinux()) | |||
| result.push_back (hosting.getChildFile ("module_linux.cpp")); | |||
| else if (exporter.isWindows()) | |||
| result.push_back (hosting.getChildFile ("module_win32.cpp")); | |||
| return result; | |||
| const auto suffix = isOSX() ? "mm" : "cpp"; | |||
| return getModuleFolderRelativeToProject ("juce_audio_plugin_client") | |||
| .getChildFile ("VST3") | |||
| .getChildFile (String ("juce_VST3ManifestHelper.") + suffix); | |||
| } | |||
| //============================================================================== | |||
| @@ -0,0 +1,68 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2022 - Raw Material Software Limited | |||
| JUCE is an open source library subject to commercial or open-source | |||
| licensing. | |||
| By using JUCE, you agree to the terms of both the JUCE 7 End-User License | |||
| Agreement and JUCE Privacy Policy. | |||
| End User License Agreement: www.juce.com/juce-7-licence | |||
| Privacy Policy: www.juce.com/juce-privacy-policy | |||
| Or: You may also use this code under the terms of the GPL v3 (see | |||
| www.gnu.org/licenses). | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| #include <juce_core/system/juce_CompilerWarnings.h> | |||
| JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wc++98-compat-extra-semi", | |||
| "-Wdeprecated-declarations", | |||
| "-Wexpansion-to-defined", | |||
| "-Wfloat-equal", | |||
| "-Wformat", | |||
| "-Wmissing-prototypes", | |||
| "-Wpragma-pack", | |||
| "-Wredundant-decls", | |||
| "-Wshadow", | |||
| "-Wshadow-field", | |||
| "-Wshorten-64-to-32", | |||
| "-Wsign-conversion", | |||
| "-Wzero-as-null-pointer-constant") | |||
| JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6387 6031) | |||
| #ifndef NOMINMAX | |||
| #define NOMINMAX 1 | |||
| #endif | |||
| #if JUCE_MAC | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm> | |||
| #elif JUCE_WINDOWS | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp> | |||
| #elif JUCE_LINUX | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp> | |||
| #endif | |||
| #include <juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp> | |||
| #include <juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp> | |||
| JUCE_END_IGNORE_WARNINGS_MSVC | |||
| JUCE_END_IGNORE_WARNINGS_GCC_LIKE | |||
| @@ -0,0 +1,26 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2022 - Raw Material Software Limited | |||
| JUCE is an open source library subject to commercial or open-source | |||
| licensing. | |||
| By using JUCE, you agree to the terms of both the JUCE 7 End-User License | |||
| Agreement and JUCE Privacy Policy. | |||
| End User License Agreement: www.juce.com/juce-7-licence | |||
| Privacy Policy: www.juce.com/juce-privacy-policy | |||
| Or: You may also use this code under the terms of the GPL v3 (see | |||
| www.gnu.org/licenses). | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| #include "juce_VST3ManifestHelper.cpp" | |||
| @@ -3954,6 +3954,8 @@ public: | |||
| tresult PLUGIN_API getCompatibilityJSON (IBStream* stream) override | |||
| { | |||
| const ScopedJuceInitialiser_GUI libraryInitialiser; | |||
| auto filter = createPluginFilterOfType (AudioProcessor::WrapperType::wrapperType_VST3); | |||
| auto* extensions = dynamic_cast<const VST3ClientExtensions*> (filter.get()); | |||