| @@ -4,6 +4,28 @@ JUCE breaking changes | |||||
| Develop | Develop | ||||
| ======= | ======= | ||||
| Change | |||||
| ------ | |||||
| The per-exporter AAX/RTAS/VST3 SDK and Android SDK/NDK path options have been | |||||
| removed. | |||||
| Possible Issues | |||||
| --------------- | |||||
| Projects that previously used these fields to set the paths to the above SDKs | |||||
| may no longer build. | |||||
| Workaround | |||||
| ---------- | |||||
| Use the Projucer's global paths settings to point to the location of these | |||||
| SDKs, either by opening the "Projucer/File->Global Paths..." menu item or using | |||||
| the "--set-global-search-path" command-line option. | |||||
| Rationale | |||||
| --------- | |||||
| Having multiple places where SDK paths could be set was confusing and | |||||
| could interfere with the embedded VST3 SDK path in some cases. | |||||
| Change | Change | ||||
| ------ | ------ | ||||
| SystemStats::getDeviceDescription() will now return the device code on iOS e.g. | SystemStats::getDeviceDescription() will now return the device code on iOS e.g. | ||||
| @@ -36,7 +36,6 @@ public: | |||||
| : project (p), exporter (e), configListTree (exporter->getConfigurations()), | : project (p), exporter (e), configListTree (exporter->getConfigurations()), | ||||
| exporterIndex (index) | exporterIndex (index) | ||||
| { | { | ||||
| exporter->initialiseDependencyPathValues(); | |||||
| configListTree.addListener (this); | configListTree.addListener (this); | ||||
| targetLocationValue.referTo (exporter->getTargetLocationValue()); | targetLocationValue.referTo (exporter->getTargetLocationValue()); | ||||
| targetLocationValue.addListener (this); | targetLocationValue.addListener (this); | ||||
| @@ -92,13 +92,6 @@ public: | |||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| //============================================================================== | |||||
| void initialiseDependencyPathValues() override | |||||
| { | |||||
| sdkPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::androidSDKPath), Ids::androidSDKPath, TargetOS::getThisOS()))); | |||||
| ndkPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::androidNDKPath), Ids::androidNDKPath, TargetOS::getThisOS()))); | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| ValueWithDefault androidJavaLibs, androidRepositories, androidDependencies, androidScreenOrientation, androidActivityClass, | ValueWithDefault androidJavaLibs, androidRepositories, androidDependencies, androidScreenOrientation, androidActivityClass, | ||||
| androidActivitySubClassName, androidActivityBaseClassName, androidManifestCustomXmlElements, androidVersionCode, | androidActivitySubClassName, androidActivityBaseClassName, androidManifestCustomXmlElements, androidVersionCode, | ||||
| @@ -823,8 +816,8 @@ private: | |||||
| { | { | ||||
| String props; | String props; | ||||
| props << "ndk.dir=" << sanitisePath (ndkPath.toString()) << newLine | |||||
| << "sdk.dir=" << sanitisePath (sdkPath.toString()) << newLine; | |||||
| props << "ndk.dir=" << sanitisePath (getAppSettings().getStoredPath (Ids::androidNDKPath).toString()) << newLine | |||||
| << "sdk.dir=" << sanitisePath (getAppSettings().getStoredPath (Ids::androidSDKPath).toString()) << newLine; | |||||
| return props; | return props; | ||||
| } | } | ||||
| @@ -876,12 +869,6 @@ private: | |||||
| props.add (new TextPropertyComponent (androidVersionCode, "Android Version Code", 32, false), | props.add (new TextPropertyComponent (androidVersionCode, "Android Version Code", 32, false), | ||||
| "An integer value that represents the version of the application code, relative to other versions."); | "An integer value that represents the version of the application code, relative to other versions."); | ||||
| props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), sdkPath, "Android SDK Path"), | |||||
| "The path to the Android SDK folder on the target build machine"); | |||||
| props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), ndkPath, "Android NDK Path"), | |||||
| "The path to the Android NDK folder on the target build machine"); | |||||
| props.add (new TextPropertyComponent (androidMinimumSDK, "Minimum SDK version", 32, false), | props.add (new TextPropertyComponent (androidMinimumSDK, "Minimum SDK version", 32, false), | ||||
| "The number of the minimum version of the Android SDK that the app requires"); | "The number of the minimum version of the Android SDK that the app requires"); | ||||
| @@ -2015,7 +2002,6 @@ private: | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| Value sdkPath, ndkPath; | |||||
| const File AndroidExecutable; | const File AndroidExecutable; | ||||
| JUCE_DECLARE_NON_COPYABLE (AndroidProjectExporter) | JUCE_DECLARE_NON_COPYABLE (AndroidProjectExporter) | ||||
| @@ -101,7 +101,6 @@ public: | |||||
| bool supportsTargetType (ProjectType::Target::Type) const override { return true; } | bool supportsTargetType (ProjectType::Target::Type) const override { return true; } | ||||
| void addPlatformSpecificSettingsForProjectType (const ProjectType&) override {} | void addPlatformSpecificSettingsForProjectType (const ProjectType&) override {} | ||||
| void initialiseDependencyPathValues() override {} | |||||
| //============================================================================== | //============================================================================== | ||||
| bool canLaunchProject() override | bool canLaunchProject() override | ||||
| @@ -180,9 +180,6 @@ public: | |||||
| jassert (targets.size() > 0); | jassert (targets.size() > 0); | ||||
| } | } | ||||
| //============================================================================== | |||||
| void initialiseDependencyPathValues() override {} | |||||
| private: | private: | ||||
| ValueWithDefault targetPlatformValue; | ValueWithDefault targetPlatformValue; | ||||
| @@ -118,22 +118,6 @@ public: | |||||
| } | } | ||||
| } | } | ||||
| //============================================================================== | |||||
| void initialiseDependencyPathValues() override | |||||
| { | |||||
| vst3Path.referTo (Value (new DependencyPathValueSource (getSetting (Ids::vst3Folder), | |||||
| Ids::vst3Path, | |||||
| TargetOS::windows))); | |||||
| aaxPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::aaxFolder), | |||||
| Ids::aaxPath, | |||||
| TargetOS::windows))); | |||||
| rtasPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::rtasFolder), | |||||
| Ids::rtasPath, | |||||
| TargetOS::windows))); | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| class MSVCBuildConfiguration : public BuildConfiguration, | class MSVCBuildConfiguration : public BuildConfiguration, | ||||
| private Value::Listener | private Value::Listener | ||||
| @@ -1061,7 +1045,7 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| RelativePath getAAXIconFile() const | RelativePath getAAXIconFile() const | ||||
| { | { | ||||
| RelativePath aaxSDK (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder); | |||||
| RelativePath aaxSDK (owner.getGlobalAAXPathString(), RelativePath::projectFolder); | |||||
| RelativePath projectIcon ("icon.ico", RelativePath::buildTargetFolder); | RelativePath projectIcon ("icon.ico", RelativePath::buildTargetFolder); | ||||
| if (getOwner().getTargetFolder().getChildFile ("icon.ico").existsAsFile()) | if (getOwner().getTargetFolder().getChildFile ("icon.ico").existsAsFile()) | ||||
| @@ -1076,7 +1060,7 @@ public: | |||||
| { | { | ||||
| if (type == AAXPlugIn) | if (type == AAXPlugIn) | ||||
| { | { | ||||
| RelativePath aaxSDK (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder); | |||||
| RelativePath aaxSDK (owner.getGlobalAAXPathString(), RelativePath::projectFolder); | |||||
| RelativePath aaxLibsFolder = aaxSDK.getChildFile ("Libs"); | RelativePath aaxLibsFolder = aaxSDK.getChildFile ("Libs"); | ||||
| RelativePath bundleScript = aaxSDK.getChildFile ("Utilities").getChildFile ("CreatePackage.bat"); | RelativePath bundleScript = aaxSDK.getChildFile ("Utilities").getChildFile ("CreatePackage.bat"); | ||||
| RelativePath iconFilePath = getAAXIconFile(); | RelativePath iconFilePath = getAAXIconFile(); | ||||
| @@ -1167,13 +1151,13 @@ public: | |||||
| { | { | ||||
| case AAXPlugIn: | case AAXPlugIn: | ||||
| { | { | ||||
| auto aaxLibsFolder = RelativePath (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder).getChildFile ("Libs"); | |||||
| auto aaxLibsFolder = RelativePath (owner.getGlobalAAXPathString(), RelativePath::projectFolder).getChildFile ("Libs"); | |||||
| defines.set ("JucePlugin_AAXLibs_path", createRebasedPath (aaxLibsFolder)); | defines.set ("JucePlugin_AAXLibs_path", createRebasedPath (aaxLibsFolder)); | ||||
| } | } | ||||
| break; | break; | ||||
| case RTASPlugIn: | case RTASPlugIn: | ||||
| { | { | ||||
| RelativePath rtasFolder (getOwner().getRTASPathValue().toString(), RelativePath::projectFolder); | |||||
| RelativePath rtasFolder (owner.getGlobalRTASPathString(), RelativePath::projectFolder); | |||||
| defines.set ("JucePlugin_WinBag_path", createRebasedPath (rtasFolder.getChildFile ("WinBag"))); | defines.set ("JucePlugin_WinBag_path", createRebasedPath (rtasFolder.getChildFile ("WinBag"))); | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -1195,7 +1179,7 @@ public: | |||||
| StringArray searchPaths; | StringArray searchPaths; | ||||
| if (type == RTASPlugIn) | if (type == RTASPlugIn) | ||||
| { | { | ||||
| RelativePath rtasFolder (getOwner().getRTASPathValue().toString(), RelativePath::projectFolder); | |||||
| RelativePath rtasFolder (owner.getGlobalRTASPathString(), RelativePath::projectFolder); | |||||
| static const char* p[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses", | static const char* p[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses", | ||||
| "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses", | "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses", | ||||
| @@ -421,14 +421,6 @@ public: | |||||
| jassert (targets.size() > 0); | jassert (targets.size() > 0); | ||||
| } | } | ||||
| //============================================================================== | |||||
| void initialiseDependencyPathValues() override | |||||
| { | |||||
| vst3Path.referTo (Value (new DependencyPathValueSource (getSetting (Ids::vst3Folder), | |||||
| Ids::vst3Path, | |||||
| TargetOS::linux))); | |||||
| } | |||||
| private: | private: | ||||
| ValueWithDefault extraPkgConfigValue; | ValueWithDefault extraPkgConfigValue; | ||||
| @@ -424,14 +424,6 @@ public: | |||||
| return (MD5 (getPostBuildScript().toUTF8()).toHexString() == "265ac212a7e734c5bbd6150e1eae18a1"); | return (MD5 (getPostBuildScript().toUTF8()).toHexString() == "265ac212a7e734c5bbd6150e1eae18a1"); | ||||
| } | } | ||||
| //============================================================================== | |||||
| void initialiseDependencyPathValues() override | |||||
| { | |||||
| vst3Path.referTo (Value (new DependencyPathValueSource (getSetting (Ids::vst3Folder), Ids::vst3Path, TargetOS::osx))); | |||||
| aaxPath. referTo (Value (new DependencyPathValueSource (getSetting (Ids::aaxFolder), Ids::aaxPath, TargetOS::osx))); | |||||
| rtasPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::rtasFolder), Ids::rtasPath, TargetOS::osx))); | |||||
| } | |||||
| protected: | protected: | ||||
| //============================================================================== | //============================================================================== | ||||
| class XcodeBuildConfiguration : public BuildConfiguration | class XcodeBuildConfiguration : public BuildConfiguration | ||||
| @@ -1630,9 +1622,7 @@ public: | |||||
| { | { | ||||
| if (type == AAXPlugIn) | if (type == AAXPlugIn) | ||||
| { | { | ||||
| auto aaxLibsFolder | |||||
| = RelativePath (owner.getAAXPathValue().toString(), RelativePath::projectFolder) | |||||
| .getChildFile ("Libs"); | |||||
| auto aaxLibsFolder = RelativePath (owner.getGlobalAAXPathString(), RelativePath::projectFolder).getChildFile ("Libs"); | |||||
| String libraryPath (config.isDebug() ? "Debug" : "Release"); | String libraryPath (config.isDebug() ? "Debug" : "Release"); | ||||
| libraryPath += "/libAAXLibrary_libcpp.a"; | libraryPath += "/libAAXLibrary_libcpp.a"; | ||||
| @@ -1641,7 +1631,7 @@ public: | |||||
| } | } | ||||
| else if (type == RTASPlugIn) | else if (type == RTASPlugIn) | ||||
| { | { | ||||
| RelativePath rtasFolder (owner.getRTASPathValue().toString(), RelativePath::projectFolder); | |||||
| RelativePath rtasFolder (owner.getGlobalRTASPathString(), RelativePath::projectFolder); | |||||
| extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Debug/libPluginLibrary.a")); | extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Debug/libPluginLibrary.a")); | ||||
| extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Release/libPluginLibrary.a")); | extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Release/libPluginLibrary.a")); | ||||
| @@ -1654,7 +1644,7 @@ public: | |||||
| if (type == RTASPlugIn) | if (type == RTASPlugIn) | ||||
| { | { | ||||
| RelativePath rtasFolder (owner.getRTASPathValue().toString(), RelativePath::projectFolder); | |||||
| RelativePath rtasFolder (owner.getGlobalRTASPathString(), RelativePath::projectFolder); | |||||
| targetExtraSearchPaths.add ("$(DEVELOPER_DIR)/Headers/FlatCarbon"); | targetExtraSearchPaths.add ("$(DEVELOPER_DIR)/Headers/FlatCarbon"); | ||||
| targetExtraSearchPaths.add ("$(SDKROOT)/Developer/Headers/FlatCarbon"); | targetExtraSearchPaths.add ("$(SDKROOT)/Developer/Headers/FlatCarbon"); | ||||
| @@ -296,8 +296,6 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) | |||||
| "The location of the folder in which the " + name + " project will be created. " | "The location of the folder in which the " + name + " project will be created. " | ||||
| "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); | "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); | ||||
| createDependencyPathProperties (props); | |||||
| props.add (new TextPropertyComponent (extraPPDefsValue, "Extra Preprocessor Definitions", 32768, true), | props.add (new TextPropertyComponent (extraPPDefsValue, "Extra Preprocessor Definitions", 32768, true), | ||||
| "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " | "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " | ||||
| "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); | "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); | ||||
| @@ -327,23 +325,6 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) | |||||
| "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); | "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); | ||||
| } | } | ||||
| void ProjectExporter::createDependencyPathProperties (PropertyListBuilder& props) | |||||
| { | |||||
| if (shouldBuildTargetType (ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX()) | |||||
| { | |||||
| if (dynamic_cast<DependencyPathValueSource*> (&getAAXPathValue().getValueSource()) != nullptr) | |||||
| props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getAAXPathValue(), "AAX SDK Folder"), | |||||
| "If you're building an AAX plugin, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file."); | |||||
| } | |||||
| if (shouldBuildTargetType (ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS()) | |||||
| { | |||||
| if (dynamic_cast<DependencyPathValueSource*> (&getRTASPathValue().getValueSource()) != nullptr) | |||||
| props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getRTASPathValue(), "RTAS SDK Folder"), | |||||
| "If you're building an RTAS, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file."); | |||||
| } | |||||
| } | |||||
| void ProjectExporter::createIconProperties (PropertyListBuilder& props) | void ProjectExporter::createIconProperties (PropertyListBuilder& props) | ||||
| { | { | ||||
| OwnedArray<Project::Item> images; | OwnedArray<Project::Item> images; | ||||
| @@ -403,7 +384,7 @@ RelativePath ProjectExporter::getInternalVST3SDKPath() | |||||
| void ProjectExporter::addVST3FolderToPath() | void ProjectExporter::addVST3FolderToPath() | ||||
| { | { | ||||
| auto vst3Folder = getVST3PathValue().toString(); | |||||
| auto vst3Folder = getGlobalVST3PathString(); | |||||
| if (vst3Folder.isNotEmpty()) | if (vst3Folder.isNotEmpty()) | ||||
| addToExtraSearchPaths (RelativePath (vst3Folder, RelativePath::projectFolder), 0); | addToExtraSearchPaths (RelativePath (vst3Folder, RelativePath::projectFolder), 0); | ||||
| @@ -413,11 +394,11 @@ void ProjectExporter::addVST3FolderToPath() | |||||
| void ProjectExporter::addAAXFoldersToPath() | void ProjectExporter::addAAXFoldersToPath() | ||||
| { | { | ||||
| auto aaxFolder = getAAXPathValue().toString(); | |||||
| auto aaxFolder = getGlobalAAXPathString(); | |||||
| if (aaxFolder.isNotEmpty()) | if (aaxFolder.isNotEmpty()) | ||||
| { | { | ||||
| RelativePath aaxFolderPath (getAAXPathValue().toString(), RelativePath::projectFolder); | |||||
| RelativePath aaxFolderPath (aaxFolder, RelativePath::projectFolder); | |||||
| addToExtraSearchPaths (aaxFolderPath); | addToExtraSearchPaths (aaxFolderPath); | ||||
| addToExtraSearchPaths (aaxFolderPath.getChildFile ("Interfaces")); | addToExtraSearchPaths (aaxFolderPath.getChildFile ("Interfaces")); | ||||
| @@ -83,7 +83,6 @@ public: | |||||
| virtual bool canCopeWithDuplicateFiles() = 0; | virtual bool canCopeWithDuplicateFiles() = 0; | ||||
| virtual bool supportsUserDefinedConfigurations() const = 0; // false if exporter only supports two configs Debug and Release | virtual bool supportsUserDefinedConfigurations() const = 0; // false if exporter only supports two configs Debug and Release | ||||
| virtual void updateDeprecatedProjectSettingsInteractively(); | virtual void updateDeprecatedProjectSettingsInteractively(); | ||||
| virtual void initialiseDependencyPathValues() {} | |||||
| // IDE targeted by exporter | // IDE targeted by exporter | ||||
| virtual bool isXcode() const = 0; | virtual bool isXcode() const = 0; | ||||
| @@ -154,9 +153,9 @@ public: | |||||
| bool shouldUseGNUExtensions() const { return gnuExtensionsValue.get();} | bool shouldUseGNUExtensions() const { return gnuExtensionsValue.get();} | ||||
| Value getVST3PathValue() const { return vst3Path; } | |||||
| Value getRTASPathValue() const { return rtasPath; } | |||||
| Value getAAXPathValue() const { return aaxPath; } | |||||
| String getGlobalVST3PathString() const { return getAppSettings().getStoredPath (Ids::vst3Path).toString(); } | |||||
| String getGlobalRTASPathString() const { return getAppSettings().getStoredPath (Ids::rtasPath).toString(); } | |||||
| String getGlobalAAXPathString() const { return getAppSettings().getStoredPath (Ids::aaxPath).toString(); } | |||||
| // NB: this is the path to the parent "modules" folder that contains the named module, not the | // NB: this is the path to the parent "modules" folder that contains the named module, not the | ||||
| // module folder itself. | // module folder itself. | ||||
| @@ -369,7 +368,6 @@ protected: | |||||
| const ProjectType& projectType; | const ProjectType& projectType; | ||||
| const String projectName; | const String projectName; | ||||
| const File projectFolder; | const File projectFolder; | ||||
| Value vst3Path, rtasPath, aaxPath; // these must be initialised in the specific exporter c'tors! | |||||
| ValueWithDefault targetLocationValue, extraCompilerFlagsValue, extraLinkerFlagsValue, externalLibrariesValue, | ValueWithDefault targetLocationValue, extraCompilerFlagsValue, extraLinkerFlagsValue, externalLibrariesValue, | ||||
| userNotesValue, gnuExtensionsValue, bigIconValue, smallIconValue, extraPPDefsValue; | userNotesValue, gnuExtensionsValue, bigIconValue, smallIconValue, extraPPDefsValue; | ||||
| @@ -441,7 +439,6 @@ private: | |||||
| : name + suffix; | : name + suffix; | ||||
| } | } | ||||
| void createDependencyPathProperties (PropertyListBuilder&); | |||||
| void createIconProperties (PropertyListBuilder&); | void createIconProperties (PropertyListBuilder&); | ||||
| void addVSTPathsIfPluginOrHost(); | void addVSTPathsIfPluginOrHost(); | ||||
| void addCommonAudioPluginSettings(); | void addCommonAudioPluginSettings(); | ||||
| @@ -171,8 +171,6 @@ void ProjectSaver::writeProjects (const OwnedArray<LibraryModule>& modules, cons | |||||
| auto* exporter = exporters.add (exp.exporter.release()); | auto* exporter = exporters.add (exp.exporter.release()); | ||||
| exporter->initialiseDependencyPathValues(); | |||||
| if (exporter->getTargetFolder().createDirectory()) | if (exporter->getTargetFolder().createDirectory()) | ||||
| { | { | ||||
| if (exporter->isCLion()) | if (exporter->isCLion()) | ||||