@@ -4,6 +4,28 @@ JUCE breaking changes | |||
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 | |||
------ | |||
SystemStats::getDeviceDescription() will now return the device code on iOS e.g. | |||
@@ -36,7 +36,6 @@ public: | |||
: project (p), exporter (e), configListTree (exporter->getConfigurations()), | |||
exporterIndex (index) | |||
{ | |||
exporter->initialiseDependencyPathValues(); | |||
configListTree.addListener (this); | |||
targetLocationValue.referTo (exporter->getTargetLocationValue()); | |||
targetLocationValue.addListener (this); | |||
@@ -92,13 +92,6 @@ public: | |||
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, | |||
androidActivitySubClassName, androidActivityBaseClassName, androidManifestCustomXmlElements, androidVersionCode, | |||
@@ -823,8 +816,8 @@ private: | |||
{ | |||
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; | |||
} | |||
@@ -876,12 +869,6 @@ private: | |||
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."); | |||
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), | |||
"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; | |||
JUCE_DECLARE_NON_COPYABLE (AndroidProjectExporter) | |||
@@ -101,7 +101,6 @@ public: | |||
bool supportsTargetType (ProjectType::Target::Type) const override { return true; } | |||
void addPlatformSpecificSettingsForProjectType (const ProjectType&) override {} | |||
void initialiseDependencyPathValues() override {} | |||
//============================================================================== | |||
bool canLaunchProject() override | |||
@@ -180,9 +180,6 @@ public: | |||
jassert (targets.size() > 0); | |||
} | |||
//============================================================================== | |||
void initialiseDependencyPathValues() override {} | |||
private: | |||
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, | |||
private Value::Listener | |||
@@ -1061,7 +1045,7 @@ public: | |||
//============================================================================== | |||
RelativePath getAAXIconFile() const | |||
{ | |||
RelativePath aaxSDK (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder); | |||
RelativePath aaxSDK (owner.getGlobalAAXPathString(), RelativePath::projectFolder); | |||
RelativePath projectIcon ("icon.ico", RelativePath::buildTargetFolder); | |||
if (getOwner().getTargetFolder().getChildFile ("icon.ico").existsAsFile()) | |||
@@ -1076,7 +1060,7 @@ public: | |||
{ | |||
if (type == AAXPlugIn) | |||
{ | |||
RelativePath aaxSDK (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder); | |||
RelativePath aaxSDK (owner.getGlobalAAXPathString(), RelativePath::projectFolder); | |||
RelativePath aaxLibsFolder = aaxSDK.getChildFile ("Libs"); | |||
RelativePath bundleScript = aaxSDK.getChildFile ("Utilities").getChildFile ("CreatePackage.bat"); | |||
RelativePath iconFilePath = getAAXIconFile(); | |||
@@ -1167,13 +1151,13 @@ public: | |||
{ | |||
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)); | |||
} | |||
break; | |||
case RTASPlugIn: | |||
{ | |||
RelativePath rtasFolder (getOwner().getRTASPathValue().toString(), RelativePath::projectFolder); | |||
RelativePath rtasFolder (owner.getGlobalRTASPathString(), RelativePath::projectFolder); | |||
defines.set ("JucePlugin_WinBag_path", createRebasedPath (rtasFolder.getChildFile ("WinBag"))); | |||
} | |||
break; | |||
@@ -1195,7 +1179,7 @@ public: | |||
StringArray searchPaths; | |||
if (type == RTASPlugIn) | |||
{ | |||
RelativePath rtasFolder (getOwner().getRTASPathValue().toString(), RelativePath::projectFolder); | |||
RelativePath rtasFolder (owner.getGlobalRTASPathString(), RelativePath::projectFolder); | |||
static const char* p[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses", | |||
"AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses", | |||
@@ -421,14 +421,6 @@ public: | |||
jassert (targets.size() > 0); | |||
} | |||
//============================================================================== | |||
void initialiseDependencyPathValues() override | |||
{ | |||
vst3Path.referTo (Value (new DependencyPathValueSource (getSetting (Ids::vst3Folder), | |||
Ids::vst3Path, | |||
TargetOS::linux))); | |||
} | |||
private: | |||
ValueWithDefault extraPkgConfigValue; | |||
@@ -424,14 +424,6 @@ public: | |||
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: | |||
//============================================================================== | |||
class XcodeBuildConfiguration : public BuildConfiguration | |||
@@ -1630,9 +1622,7 @@ public: | |||
{ | |||
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"); | |||
libraryPath += "/libAAXLibrary_libcpp.a"; | |||
@@ -1641,7 +1631,7 @@ public: | |||
} | |||
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/Release/libPluginLibrary.a")); | |||
@@ -1654,7 +1644,7 @@ public: | |||
if (type == RTASPlugIn) | |||
{ | |||
RelativePath rtasFolder (owner.getRTASPathValue().toString(), RelativePath::projectFolder); | |||
RelativePath rtasFolder (owner.getGlobalRTASPathString(), RelativePath::projectFolder); | |||
targetExtraSearchPaths.add ("$(DEVELOPER_DIR)/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. " | |||
"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), | |||
"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."); | |||
@@ -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."); | |||
} | |||
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) | |||
{ | |||
OwnedArray<Project::Item> images; | |||
@@ -403,7 +384,7 @@ RelativePath ProjectExporter::getInternalVST3SDKPath() | |||
void ProjectExporter::addVST3FolderToPath() | |||
{ | |||
auto vst3Folder = getVST3PathValue().toString(); | |||
auto vst3Folder = getGlobalVST3PathString(); | |||
if (vst3Folder.isNotEmpty()) | |||
addToExtraSearchPaths (RelativePath (vst3Folder, RelativePath::projectFolder), 0); | |||
@@ -413,11 +394,11 @@ void ProjectExporter::addVST3FolderToPath() | |||
void ProjectExporter::addAAXFoldersToPath() | |||
{ | |||
auto aaxFolder = getAAXPathValue().toString(); | |||
auto aaxFolder = getGlobalAAXPathString(); | |||
if (aaxFolder.isNotEmpty()) | |||
{ | |||
RelativePath aaxFolderPath (getAAXPathValue().toString(), RelativePath::projectFolder); | |||
RelativePath aaxFolderPath (aaxFolder, RelativePath::projectFolder); | |||
addToExtraSearchPaths (aaxFolderPath); | |||
addToExtraSearchPaths (aaxFolderPath.getChildFile ("Interfaces")); | |||
@@ -83,7 +83,6 @@ public: | |||
virtual bool canCopeWithDuplicateFiles() = 0; | |||
virtual bool supportsUserDefinedConfigurations() const = 0; // false if exporter only supports two configs Debug and Release | |||
virtual void updateDeprecatedProjectSettingsInteractively(); | |||
virtual void initialiseDependencyPathValues() {} | |||
// IDE targeted by exporter | |||
virtual bool isXcode() const = 0; | |||
@@ -154,9 +153,9 @@ public: | |||
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 | |||
// module folder itself. | |||
@@ -369,7 +368,6 @@ protected: | |||
const ProjectType& projectType; | |||
const String projectName; | |||
const File projectFolder; | |||
Value vst3Path, rtasPath, aaxPath; // these must be initialised in the specific exporter c'tors! | |||
ValueWithDefault targetLocationValue, extraCompilerFlagsValue, extraLinkerFlagsValue, externalLibrariesValue, | |||
userNotesValue, gnuExtensionsValue, bigIconValue, smallIconValue, extraPPDefsValue; | |||
@@ -441,7 +439,6 @@ private: | |||
: name + suffix; | |||
} | |||
void createDependencyPathProperties (PropertyListBuilder&); | |||
void createIconProperties (PropertyListBuilder&); | |||
void addVSTPathsIfPluginOrHost(); | |||
void addCommonAudioPluginSettings(); | |||
@@ -171,8 +171,6 @@ void ProjectSaver::writeProjects (const OwnedArray<LibraryModule>& modules, cons | |||
auto* exporter = exporters.add (exp.exporter.release()); | |||
exporter->initialiseDependencyPathValues(); | |||
if (exporter->getTargetFolder().createDirectory()) | |||
{ | |||
if (exporter->isCLion()) | |||