From 9dc98fb1df82de513cea26c0c74d2d135e3759cd Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 9 Jun 2021 13:02:21 +0100 Subject: [PATCH] Projucer: Replaced macOS and iOS SDK selector drop-downs with text fields --- .../ProjectSaving/jucer_ProjectExport_CLion.h | 2 +- .../ProjectSaving/jucer_ProjectExport_Xcode.h | 226 +++++++----------- .../Source/Utility/Helpers/jucer_PresetIDs.h | 11 +- 3 files changed, 98 insertions(+), 141 deletions(-) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h index de24fcc0c1..72e2d95d76 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h @@ -985,7 +985,7 @@ private: auto resSourcesVar = targetVarName + "_REZ_SOURCES"; auto resOutputVar = targetVarName + "_REZ_OUTPUT"; - auto sdkVersion = config.getOSXSDKVersionString().upToFirstOccurrenceOf (" ", false, false); + auto sdkVersion = config.getMacOSBaseSDKString().upToFirstOccurrenceOf (" ", false, false); auto sysroot = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX" + sdkVersion + ".sdk"; build_tools::RelativePath rFile ("JuceLibraryCode/include_juce_audio_plugin_client_AU.r", build_tools::RelativePath::projectFolder); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index 26894b8613..b8e232859e 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -28,91 +28,11 @@ #include "jucer_XcodeProjectParser.h" //============================================================================== -namespace -{ - static const char* const iOSDefaultVersion = "9.3"; - static const StringArray iOSVersions { "9.0", "9.1", "9.2", "9.3", "10.0", "10.1", "10.2", "10.3", - "11.0", "12.0", "13.0", "14.0" }; - - enum class MacOSVersion - { - v10_7, - v10_8, - v10_9, - v10_10, - v10_11, - v10_12, - v10_13, - v10_14, - v10_15, - v10_16, - v11_0, - v11_1, - }; - - static const char* getName (MacOSVersion m) - { - switch (m) - { - case MacOSVersion::v10_7: return "10.7"; - case MacOSVersion::v10_8: return "10.8"; - case MacOSVersion::v10_9: return "10.9"; - case MacOSVersion::v10_10: return "10.10"; - case MacOSVersion::v10_11: return "10.11"; - case MacOSVersion::v10_12: return "10.12"; - case MacOSVersion::v10_13: return "10.13"; - case MacOSVersion::v10_14: return "10.14"; - case MacOSVersion::v10_15: return "10.15"; - case MacOSVersion::v10_16: return "10.16"; - case MacOSVersion::v11_0: return "11.0"; - case MacOSVersion::v11_1: return "11.1"; - default: break; - } - - jassertfalse; - return ""; - } - - static String getDisplayName (MacOSVersion m) { return getName (m) + String (" SDK"); } - static String getRootName (MacOSVersion m) { return String ("macosx") + getName (m); } - - constexpr auto nextMacOSVersion = (MacOSVersion) ((int) MacOSVersion::v11_1 + 1); - constexpr auto oldestDeploymentTarget = MacOSVersion::v10_7; - constexpr auto macOSDefaultVersion = MacOSVersion::v10_11; - constexpr auto oldestSDKVersion = MacOSVersion::v10_11; - constexpr auto minimumAUv3SDKVersion = MacOSVersion::v10_11; - - static MacOSVersion& operator++ (MacOSVersion& m) - { - return m = (MacOSVersion) ((int) m + 1); - } - - static String getOSXSDKVersion (const String& sdkVersion) - { - for (auto v = oldestSDKVersion; v != nextMacOSVersion; ++v) - if (sdkVersion == getDisplayName (v)) - return getRootName (v); - - return "macosx"; - } - - template - static ContainerType getSDKChoiceList (MacOSVersion oldestVersion, bool displayName) - { - ContainerType container; - - for (auto v = oldestVersion; v != nextMacOSVersion; ++v) - container.add (displayName ? getDisplayName (v) : getName (v)); - - return container; - } - - static const char* const osxArch_Default = "default"; - static const char* const osxArch_Native = "Native"; - static const char* const osxArch_32BitUniversal = "32BitUniversal"; - static const char* const osxArch_64BitUniversal = "64BitUniversal"; - static const char* const osxArch_64Bit = "64BitIntel"; -} +constexpr auto* macOSArch_Default = "default"; +constexpr auto* macOSArch_Native = "Native"; +constexpr auto* macOSArch_32BitUniversal = "32BitUniversal"; +constexpr auto* macOSArch_64BitUniversal = "64BitUniversal"; +constexpr auto* macOSArch_64Bit = "64BitIntel"; //============================================================================== class XcodeProjectExporter : public ProjectExporter @@ -831,16 +751,18 @@ public: protected: //============================================================================== - class XcodeBuildConfiguration : public BuildConfiguration + class XcodeBuildConfiguration : public BuildConfiguration, + private ValueTree::Listener { public: XcodeBuildConfiguration (Project& p, const ValueTree& t, const bool isIOS, const ProjectExporter& e) : BuildConfiguration (p, t, e), iOS (isIOS), - osxSDKVersion (config, Ids::osxSDK, getUndoManager()), - osxDeploymentTarget (config, Ids::osxCompatibility, getUndoManager(), getDisplayName (macOSDefaultVersion)), - iosDeploymentTarget (config, Ids::iosCompatibility, getUndoManager(), iOSDefaultVersion), - osxArchitecture (config, Ids::osxArchitecture, getUndoManager(), osxArch_Default), + macOSBaseSDK (config, Ids::macOSBaseSDK, getUndoManager()), + macOSDeploymentTarget (config, Ids::macOSDeploymentTarget, getUndoManager(), "10.11"), + macOSArchitecture (config, Ids::osxArchitecture, getUndoManager(), macOSArch_Default), + iosBaseSDK (config, Ids::iosBaseSDK, getUndoManager()), + iosDeploymentTarget (config, Ids::iosDeploymentTarget, getUndoManager(), "9.3"), customXcodeFlags (config, Ids::customXcodeFlags, getUndoManager()), plistPreprocessorDefinitions (config, Ids::plistPreprocessorDefinitions, getUndoManager()), codeSignIdentity (config, Ids::codeSigningIdentity, getUndoManager()), @@ -858,6 +780,8 @@ protected: updateOldSDKDefaults(); optimisationLevelValue.setDefault (isDebug() ? gccO0 : gccO3); + + config.addListener (this); } //============================================================================== @@ -869,29 +793,29 @@ protected: addRecommendedLLVMCompilerWarningsProperty (props); addGCCOptimisationProperty (props); + const String sdkInfoString ("\nThis must be in the format major.minor and contain only the numeric version number. " + "If this is left empty then the default will be used." + "\nThe minimum supported version is "); + if (iOS) { - Array iOSVersionVars; + props.add (new TextPropertyComponent (iosBaseSDK, "iOS Base SDK", 8, false), + "The version of the iOS SDK to link against." + sdkInfoString + "9.3."); - for (auto& s : iOSVersions) - iOSVersionVars.add (s); - - props.add (new ChoicePropertyComponent (iosDeploymentTarget, "iOS Deployment Target", iOSVersions, iOSVersionVars), - "The minimum version of iOS that the target binary will run on."); + props.add (new TextPropertyComponent (iosDeploymentTarget, "iOS Deployment Target", 8, false), + "The minimum version of iOS to target." + sdkInfoString + "9.0."); } else { - props.add (new ChoicePropertyComponent (osxSDKVersion, "macOS Base SDK Version", getSDKChoiceList (oldestSDKVersion, true), - getSDKChoiceList> (oldestSDKVersion, true)), - "The version of the macOS SDK to link against. If \"Default\" is selected then the Xcode default will be used."); + props.add (new TextPropertyComponent (macOSBaseSDK, "macOS Base SDK", 8, false), + "The version of the macOS SDK to link against." + sdkInfoString + "10.11."); - props.add (new ChoicePropertyComponent (osxDeploymentTarget, "macOS Deployment Target", getSDKChoiceList (oldestDeploymentTarget, false), - getSDKChoiceList> (oldestDeploymentTarget, true)), - "The minimum version of macOS that the target binary will be compatible with."); + props.add (new TextPropertyComponent (macOSDeploymentTarget, "macOS Deployment Target", 8, false), + "The minimum version of macOS to target." + sdkInfoString + "10.7."); - props.add (new ChoicePropertyComponent (osxArchitecture, "macOS Architecture", - { "Native architecture of build machine", "Standard 32-bit", "Standard 32/64-bit", "Standard 64-bit" }, - { osxArch_Native, osxArch_32BitUniversal, osxArch_64BitUniversal, osxArch_64Bit }), + props.add (new ChoicePropertyComponent (macOSArchitecture, "macOS Architecture", + { "Native architecture of build machine", "Standard 32-bit", "Standard 32/64-bit", "Standard 64-bit" }, + { macOSArch_Native, macOSArch_32BitUniversal, macOSArch_64BitUniversal, macOSArch_64Bit }), "The type of macOS binary that will be produced."); } @@ -922,7 +846,7 @@ protected: } //============================================================================== - String getOSXArchitectureString() const { return osxArchitecture.get(); } + String getMacOSArchitectureString() const { return macOSArchitecture.get(); } String getPListPreprocessorDefinitionsString() const { return plistPreprocessorDefinitions.get(); } bool isFastMathEnabled() const { return fastMathEnabled.get(); } @@ -931,11 +855,12 @@ protected: String getCustomXcodeFlagsString() const { return customXcodeFlags.get(); } - String getOSXSDKVersionString() const { return osxSDKVersion.get(); } - String getOSXDeploymentTargetString() const { return osxDeploymentTarget.get(); } + String getMacOSBaseSDKString() const { return macOSBaseSDK.get(); } + String getMacOSDeploymentTargetString() const { return macOSDeploymentTarget.get(); } String getCodeSignIdentityString() const { return codeSignIdentity.get(); } + String getiOSBaseSDKString() const { return iosBaseSDK.get(); } String getiOSDeploymentTargetString() const { return iosDeploymentTarget.get(); } bool isPluginBinaryCopyStepEnabled() const { return pluginBinaryCopyStepEnabled.get(); } @@ -950,13 +875,33 @@ protected: //============================================================================== bool iOS; - ValueWithDefault osxSDKVersion, osxDeploymentTarget, iosDeploymentTarget, osxArchitecture, + ValueWithDefault macOSBaseSDK, macOSDeploymentTarget, macOSArchitecture, iosBaseSDK, iosDeploymentTarget, customXcodeFlags, plistPreprocessorDefinitions, codeSignIdentity, fastMathEnabled, stripLocalSymbolsEnabled, pluginBinaryCopyStepEnabled, vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, rtasBinaryLocation, aaxBinaryLocation, unityPluginBinaryLocation; //============================================================================== + void valueTreePropertyChanged (ValueTree&, const Identifier& property) override + { + const auto updateOldSDKSetting = [this] (const Identifier& oldProperty, + const String& sdkString, + const String& sdkSuffix) + { + if (sdkString.isEmpty()) + config.removeProperty (oldProperty, nullptr); + else + config.setProperty (oldProperty, sdkString + sdkSuffix, nullptr); + }; + + if (property == Ids::macOSBaseSDK) + updateOldSDKSetting (Ids::osxSDK, macOSBaseSDK.get(), " SDK"); + else if (property == Ids::macOSDeploymentTarget) + updateOldSDKSetting (Ids::osxCompatibility, macOSDeploymentTarget.get(), " SDK"); + else if (property == Ids::iosDeploymentTarget) + updateOldSDKSetting (Ids::iosCompatibility, iosDeploymentTarget.get(), {}); + } + void addXcodePluginInstallPathProperties (PropertyListBuilder& props) { auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildAU() @@ -1008,10 +953,21 @@ protected: void updateOldSDKDefaults() { - if (iosDeploymentTarget.get() == "default") iosDeploymentTarget.resetToDefault(); - if (osxArchitecture.get() == "default") osxArchitecture.resetToDefault(); - if (osxSDKVersion.get() == "default") osxSDKVersion.resetToDefault(); - if (osxDeploymentTarget.get() == "default") osxDeploymentTarget.resetToDefault(); + if (config[Ids::iosCompatibility].toString() == "default") iosDeploymentTarget.resetToDefault(); + if (macOSArchitecture.get() == "default") macOSArchitecture.resetToDefault(); + + const auto updateSDKString = [this] (const Identifier& propertyName, ValueWithDefault& value) + { + auto sdkString = config[propertyName].toString(); + + if (sdkString == "default") + value.resetToDefault(); + else if (sdkString.isNotEmpty() && sdkString.contains (" SDK")) + value = sdkString.upToFirstOccurrenceOf (" SDK", false, false); + }; + + updateSDKString (Ids::osxSDK, macOSBaseSDK); + updateSDKString (Ids::osxCompatibility, macOSDeploymentTarget); } }; @@ -1452,8 +1408,8 @@ public: { // the aggregate target needs to have the deployment target set for // pre-/post-build scripts - s.set ("MACOSX_DEPLOYMENT_TARGET", getOSXDeploymentTarget (config.getOSXDeploymentTargetString())); - s.set ("SDKROOT", getOSXSDKVersion (config.getOSXSDKVersionString())); + s.set ("MACOSX_DEPLOYMENT_TARGET", config.getMacOSDeploymentTargetString()); + s.set ("SDKROOT", "macosx" + config.getMacOSBaseSDKString()); return s; } @@ -1461,13 +1417,21 @@ public: s.set ("PRODUCT_NAME", owner.replacePreprocessorTokens (config, config.getTargetBinaryNameString (type == UnityPlugIn)).quoted()); s.set ("PRODUCT_BUNDLE_IDENTIFIER", getBundleIdentifier()); - auto arch = (! owner.isiOS() && type == Target::AudioUnitv3PlugIn) ? osxArch_64Bit - : config.getOSXArchitectureString(); + auto arch = (! owner.isiOS() && type == Target::AudioUnitv3PlugIn) ? macOSArch_64Bit + : config.getMacOSArchitectureString(); - if (arch == osxArch_Native) s.set ("ARCHS", "\"$(NATIVE_ARCH_ACTUAL)\""); - else if (arch == osxArch_32BitUniversal) s.set ("ARCHS", "\"$(ARCHS_STANDARD_32_BIT)\""); - else if (arch == osxArch_64BitUniversal) s.set ("ARCHS", "\"$(ARCHS_STANDARD_32_64_BIT)\""); - else if (arch == osxArch_64Bit) s.set ("ARCHS", "\"$(ARCHS_STANDARD_64_BIT)\""); + const auto archString = [&]() -> const char* + { + if (arch == macOSArch_Native) return "\"$(NATIVE_ARCH_ACTUAL)\""; + if (arch == macOSArch_32BitUniversal) return "\"$(ARCHS_STANDARD_32_BIT)\""; + if (arch == macOSArch_64BitUniversal) return "\"$(ARCHS_STANDARD_32_64_BIT)\""; + if (arch == macOSArch_64Bit) return "\"$(ARCHS_STANDARD_64_BIT)\""; + + return nullptr; + }(); + + if (archString != nullptr) + s.set ("ARCHS", archString); if (! owner.isiOS()) { @@ -1639,7 +1603,7 @@ public: } else { - s.set ("MACOSX_DEPLOYMENT_TARGET", getOSXDeploymentTarget (config.getOSXDeploymentTargetString())); + s.set ("MACOSX_DEPLOYMENT_TARGET", config.getMacOSDeploymentTargetString()); } s.set ("GCC_VERSION", gccVersion); @@ -2028,18 +1992,6 @@ public: return targetExtraSearchPaths; } - String getOSXDeploymentTarget (const String& deploymentTarget) const - { - auto minVersion = (type == Target::AudioUnitv3PlugIn ? minimumAUv3SDKVersion - : oldestDeploymentTarget); - - for (auto v = minVersion; v != nextMacOSVersion; ++v) - if (deploymentTarget == getDisplayName (v)) - return ::getName (v); - - return ::getName (minVersion); - } - //============================================================================== const XcodeProjectExporter& owner; @@ -2534,7 +2486,7 @@ private: if (config.isDebug()) { - if (config.getOSXArchitectureString() == osxArch_Default) + if (config.getMacOSArchitectureString() == macOSArch_Default) s.set ("ONLY_ACTIVE_ARCH", "YES"); } @@ -2543,13 +2495,13 @@ private: if (iOS) { - s.set ("SDKROOT", "iphoneos"); + s.set ("SDKROOT", "iphoneos" + config.getiOSBaseSDKString()); s.set ("TARGETED_DEVICE_FAMILY", getDeviceFamilyString().quoted()); s.set ("IPHONEOS_DEPLOYMENT_TARGET", config.getiOSDeploymentTargetString()); } else { - s.set ("SDKROOT", getOSXSDKVersion (config.getOSXSDKVersionString())); + s.set ("SDKROOT", "macosx" + config.getMacOSBaseSDKString()); } s.set ("ZERO_LINK", "NO"); diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h index b8500dcff3..2a6bcf81a1 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h @@ -128,10 +128,11 @@ namespace Ids DECLARE_ID (unityPluginBinaryLocation); DECLARE_ID (enablePluginBinaryCopyStep); DECLARE_ID (stripLocalSymbols); - DECLARE_ID (osxSDK); - DECLARE_ID (osxCompatibility); + DECLARE_ID (macOSBaseSDK); + DECLARE_ID (macOSDeploymentTarget); DECLARE_ID (osxArchitecture); - DECLARE_ID (iosCompatibility); + DECLARE_ID (iosBaseSDK); + DECLARE_ID (iosDeploymentTarget); DECLARE_ID (xcodeSubprojects); DECLARE_ID (extraFrameworks); DECLARE_ID (frameworkSearchPaths); @@ -376,6 +377,10 @@ namespace Ids DECLARE_ID (jucerFormatVersion); DECLARE_ID (buildNumber); + DECLARE_ID (osxSDK); + DECLARE_ID (osxCompatibility); + DECLARE_ID (iosCompatibility); + const Identifier ID ("id"); const Identifier ID_uppercase ("ID"); const Identifier class_ ("class");