From a2845d8895ed557363e40b3c4301b67ed98261ca Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 9 May 2012 12:06:47 +0100 Subject: [PATCH] Introjucer: some preliminary AAX work. --- .../Project Saving/jucer_ProjectExport_MSVC.h | 3 +- .../Project Saving/jucer_ProjectExport_Make.h | 3 +- .../jucer_ProjectExport_XCode.h | 4 +- .../Source/Project/jucer_AudioPluginModule.h | 64 ++++++++++++++++++- .../Source/Project/jucer_Module.cpp | 4 +- .../Source/Project/jucer_NewProjectWizard.cpp | 1 - .../Source/Project/jucer_Project.cpp | 5 +- .../Introjucer/Source/Project/jucer_Project.h | 5 +- .../Source/Project/jucer_ProjectType.cpp | 47 +++++++------- .../Source/Utility/jucer_MiscUtilities.cpp | 6 ++ .../Source/Utility/jucer_MiscUtilities.h | 2 + .../Source/Utility/jucer_PresetIDs.h | 2 + .../utility/juce_CheckSettingMacros.h | 7 +- 13 files changed, 113 insertions(+), 40 deletions(-) diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h index 08f4d722ac..c6c3a0d23b 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h @@ -117,8 +117,7 @@ protected: if (getWarningLevel() == 0) getWarningLevelValue() = 4; - if (shouldGenerateManifestValue().getValue().isVoid()) - shouldGenerateManifestValue() = var (true); + setValueIfVoid (shouldGenerateManifestValue(), true); } Value getWarningLevelValue() { return getValue (Ids::winWarningLevel); } diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h index c6d9c8a53d..026547b2a3 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h @@ -102,8 +102,7 @@ protected: MakeBuildConfiguration (Project& project, const ValueTree& settings) : BuildConfiguration (project, settings) { - if (getLibrarySearchPathValue().getValue().isVoid()) - getLibrarySearchPathValue() = "/usr/X11R6/lib/"; + setValueIfVoid (getLibrarySearchPathValue(), "/usr/X11R6/lib/"); } void createPropertyEditors (PropertyListBuilder& props) diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h index 9f7b963493..8979703cc4 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h @@ -62,8 +62,7 @@ public: if (getTargetLocationString().isEmpty()) getTargetLocationValue() = getDefaultBuildsRootFolder() + (iOS ? "iOS" : "MacOSX"); - if (settings ["objCExtraSuffix"].isVoid()) - getObjCSuffixValue() = createAlphaNumericUID(); + setValueIfVoid (getObjCSuffixValue(), createAlphaNumericUID()); } static XCodeProjectExporter* createForSettings (Project& project, const ValueTree& settings) @@ -665,6 +664,7 @@ private: s.add ("GCC_VERSION = " + gccVersion); s.add ("CLANG_CXX_LANGUAGE_STANDARD = \"c++0x\""); + //s.add ("CLANG_CXX_LIBRARY = \"libc++\""); { StringArray linkerFlags, librarySearchPaths; diff --git a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h index 5689faecd3..b09967a67d 100644 --- a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h +++ b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h @@ -31,8 +31,9 @@ namespace { Value shouldBuildVST (Project& project) { return project.getProjectValue ("buildVST"); } - Value shouldBuildRTAS (Project& project) { return project.getProjectValue ("buildRTAS"); } Value shouldBuildAU (Project& project) { return project.getProjectValue ("buildAU"); } + Value shouldBuildRTAS (Project& project) { return project.getProjectValue ("buildRTAS"); } + Value shouldBuildAAX (Project& project) { return project.getProjectValue ("buildAAX"); } Value getPluginName (Project& project) { return project.getProjectValue ("pluginName"); } Value getPluginDesc (Project& project) { return project.getProjectValue ("pluginDesc"); } @@ -101,6 +102,7 @@ namespace flags.set ("JucePlugin_Build_VST", valueToBool (shouldBuildVST (project))); flags.set ("JucePlugin_Build_AU", valueToBool (shouldBuildAU (project))); flags.set ("JucePlugin_Build_RTAS", valueToBool (shouldBuildRTAS (project))); + flags.set ("JucePlugin_Build_AAX", valueToBool (shouldBuildAAX (project))); flags.set ("JucePlugin_Name", getPluginName (project).toString().quoted()); flags.set ("JucePlugin_Desc", getPluginDesc (project).toString().quoted()); flags.set ("JucePlugin_Manufacturer", getPluginManufacturer (project).toString().quoted()); @@ -129,6 +131,7 @@ namespace flags.set ("JucePlugin_RTASCategory", getPluginRTASCategoryCode (project)); flags.set ("JucePlugin_RTASManufacturerCode", "JucePlugin_ManufacturerCode"); flags.set ("JucePlugin_RTASProductId", "JucePlugin_PluginCode"); + flags.set ("JucePlugin_AAXIdentifier", project.getAAXIdentifier().toString()); MemoryOutputStream mem; @@ -452,4 +455,63 @@ namespace AUHelpers } } +//============================================================================== +namespace AAXHelpers +{ + static Value getAAXFolder (ProjectExporter& exporter) { return exporter.getSetting (Ids::aaxFolder); } + + static RelativePath getAAXFolderRelativePath (ProjectExporter& exporter) + { + return exporter.rebaseFromProjectFolderToBuildTarget (RelativePath (getAAXFolder (exporter).toString(), + RelativePath::projectFolder)); + } + + static void fixMissingAAXValues (ProjectExporter& exporter) + { + if (getAAXFolder (exporter).toString().isEmpty()) + { + if (exporter.isVisualStudio()) + getAAXFolder (exporter) = "c:\\SDKs\\AAX"; + else + getAAXFolder (exporter) = "~/SDKs/AAX"; + } + } + + static void addExtraSearchPaths (ProjectExporter& exporter) + { + RelativePath aaxFolder (getAAXFolder (exporter).toString(), RelativePath::projectFolder); + + exporter.addToExtraSearchPaths (aaxFolder.getChildFile ("Interfaces")); + } + + static inline void prepareExporter (ProjectExporter& exporter, ProjectSaver& projectSaver, const File& moduleFolder) + { + fixMissingAAXValues (exporter); + + if (exporter.isVisualStudio()) + { + // XXX todo + } + else + { + // XXX todo + } + + writePluginCharacteristicsFile (projectSaver); + + addExtraSearchPaths (exporter); + } + + static inline void createPropertyEditors (ProjectExporter& exporter, PropertyListBuilder& props) + { + if (exporter.isXcode() || exporter.isVisualStudio()) + { + fixMissingAAXValues (exporter); + + props.add (new TextPropertyComponent (getAAXFolder (exporter), "AAX SDK Folder", 1024, false), + "If you're building an AAX, this must be the folder containing the AAX SDK. This should be an absolute path."); + } + } +} + #endif // __JUCER_AUDIOPLUGINMODULE_JUCEHEADER__ diff --git a/extras/Introjucer/Source/Project/jucer_Module.cpp b/extras/Introjucer/Source/Project/jucer_Module.cpp index 1e0c3c21ed..b7ae226cde 100644 --- a/extras/Introjucer/Source/Project/jucer_Module.cpp +++ b/extras/Introjucer/Source/Project/jucer_Module.cpp @@ -526,8 +526,9 @@ void LibraryModule::prepareExporter (ProjectExporter& exporter, ProjectSaver& pr if (isPluginClient()) { if (shouldBuildVST (project).getValue()) VSTHelpers::prepareExporter (exporter, projectSaver); - if (shouldBuildRTAS (project).getValue()) RTASHelpers::prepareExporter (exporter, projectSaver, localFolder); if (shouldBuildAU (project).getValue()) AUHelpers::prepareExporter (exporter, projectSaver); + if (shouldBuildRTAS (project).getValue()) RTASHelpers::prepareExporter (exporter, projectSaver, localFolder); + if (shouldBuildAAX (project).getValue()) AAXHelpers::prepareExporter (exporter, projectSaver, localFolder); } } @@ -540,6 +541,7 @@ void LibraryModule::createPropertyEditors (ProjectExporter& exporter, PropertyLi { if (shouldBuildVST (exporter.getProject()).getValue()) VSTHelpers::createPropertyEditors (exporter, props); if (shouldBuildRTAS (exporter.getProject()).getValue()) RTASHelpers::createPropertyEditors (exporter, props); + if (shouldBuildAAX (exporter.getProject()).getValue()) AAXHelpers::createPropertyEditors (exporter, props); } } diff --git a/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp b/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp index 1e3551df63..b3f5c3d0a5 100644 --- a/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp +++ b/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp @@ -399,7 +399,6 @@ Project* NewProjectWizard::runWizard (Component* ownerWindow_, { project->setFile (projectFile); project->setTitle (appTitle); - project->setBundleIdentifierToDefault(); if (! initialiseProject (*project)) return nullptr; diff --git a/extras/Introjucer/Source/Project/jucer_Project.cpp b/extras/Introjucer/Source/Project/jucer_Project.cpp index 69c4d6ad56..3c6517a41d 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.cpp +++ b/extras/Introjucer/Source/Project/jucer_Project.cpp @@ -103,7 +103,7 @@ void Project::setMissingDefaultValues() getMainGroup().initialiseMissingProperties(); if (getDocumentTitle().isEmpty()) - setTitle ("Juce Project"); + setTitle ("JUCE Project"); if (! projectRoot.hasProperty (Ids::projectType)) getProjectTypeValue() = ProjectType::getGUIAppTypeName(); @@ -117,9 +117,6 @@ void Project::setMissingDefaultValues() getProjectType().setMissingProjectProperties (*this); - if (! projectRoot.hasProperty (Ids::bundleIdentifier)) - setBundleIdentifierToDefault(); - if (! projectRoot.getChildWithName (Tags::modulesGroup).isValid()) addDefaultModules (false); } diff --git a/extras/Introjucer/Source/Project/jucer_Project.h b/extras/Introjucer/Source/Project/jucer_Project.h index 03091df1ef..16b70a9436 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.h +++ b/extras/Introjucer/Source/Project/jucer_Project.h @@ -84,7 +84,10 @@ public: String getVersionAsHex() const; Value getBundleIdentifier() { return getProjectValue (Ids::bundleIdentifier); } - void setBundleIdentifierToDefault() { getBundleIdentifier() = "com.yourcompany." + CodeHelpers::makeValidIdentifier (getProjectName().toString(), false, true, false); } + String getDefaultBundleIdentifier() { return "com.yourcompany." + CodeHelpers::makeValidIdentifier (getProjectName().toString(), false, true, false); } + + Value getAAXIdentifier() { return getProjectValue (Ids::aaxIdentifier); } + String getDefaultAAXIdentifier() { return getDefaultBundleIdentifier(); } Value getCompanyName() { return getProjectValue (Ids::companyName); } diff --git a/extras/Introjucer/Source/Project/jucer_ProjectType.cpp b/extras/Introjucer/Source/Project/jucer_ProjectType.cpp index 50299752ff..74fdd5c973 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectType.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectType.cpp @@ -156,11 +156,8 @@ public: } exporter.xcodeProductInstallPath = String::empty; - exporter.makefileTargetSuffix = ".so"; - exporter.msvcTargetSuffix = exporter.getSetting (Ids::libraryType) == 2 ? ".dll" : ".lib"; - exporter.msvcExtraPreprocessorDefs.set ("_LIB", ""); } }; @@ -176,30 +173,28 @@ public: void setMissingProjectProperties (Project& project) const { - if (! project.getProjectRoot().hasProperty (Ids::buildVST)) - { - const String sanitisedProjectName (CodeHelpers::makeValidIdentifier (project.getProjectName().toString(), false, true, false)); + const String sanitisedProjectName (CodeHelpers::makeValidIdentifier (project.getProjectName().toString(), false, true, false)); - shouldBuildVST (project) = true; - shouldBuildRTAS (project) = false; - shouldBuildAU (project) = true; + setValueIfVoid (shouldBuildVST (project), true); + setValueIfVoid (shouldBuildAU (project), true); - getPluginName (project) = project.getProjectName().toString(); - getPluginDesc (project) = project.getProjectName().toString(); - getPluginManufacturer (project) = "yourcompany"; - getPluginManufacturerCode (project) = "Manu"; - getPluginCode (project) = "Plug"; - getPluginChannelConfigs (project) = "{1, 1}, {2, 2}"; - getPluginIsSynth (project) = false; - getPluginWantsMidiInput (project) = false; - getPluginProducesMidiOut (project) = false; - getPluginSilenceInProducesSilenceOut (project) = false; - getPluginTailLengthSeconds (project) = 0; - getPluginEditorNeedsKeyFocus (project) = false; - getPluginAUExportPrefix (project) = sanitisedProjectName + "AU"; - getPluginAUCocoaViewClassName (project) = sanitisedProjectName + "AU_V1"; - getPluginRTASCategory (project) = String::empty; - } + setValueIfVoid (getPluginName (project), project.getProjectName().toString()); + setValueIfVoid (getPluginDesc (project), project.getProjectName().toString()); + setValueIfVoid (getPluginManufacturer (project), "yourcompany"); + setValueIfVoid (getPluginManufacturerCode (project), "Manu"); + setValueIfVoid (getPluginCode (project), "Plug"); + setValueIfVoid (getPluginChannelConfigs (project), "{1, 1}, {2, 2}"); + setValueIfVoid (getPluginIsSynth (project), false); + setValueIfVoid (getPluginWantsMidiInput (project), false); + setValueIfVoid (getPluginProducesMidiOut (project), false); + setValueIfVoid (getPluginSilenceInProducesSilenceOut (project), false); + setValueIfVoid (getPluginTailLengthSeconds (project), 0); + setValueIfVoid (getPluginEditorNeedsKeyFocus (project), false); + setValueIfVoid (getPluginAUExportPrefix (project), sanitisedProjectName + "AU"); + setValueIfVoid (getPluginAUCocoaViewClassName (project), sanitisedProjectName + "AU_V1"); + setValueIfVoid (getPluginRTASCategory (project), String::empty); + setValueIfVoid (project.getBundleIdentifier(), project.getDefaultBundleIdentifier()); + setValueIfVoid (project.getAAXIdentifier(), project.getDefaultAAXIdentifier()); } void createPropertyEditors (Project& project, PropertyListBuilder& props) const @@ -210,6 +205,8 @@ public: "Whether the project should produce an AudioUnit plugin."); props.add (new BooleanPropertyComponent (shouldBuildRTAS (project), "Build RTAS", "Enabled"), "Whether the project should produce an RTAS plugin."); +// props.add (new BooleanPropertyComponent (shouldBuildAAX (project), "Build AAX", "Enabled"), +// "Whether the project should produce an AAX plugin."); props.add (new TextPropertyComponent (getPluginName (project), "Plugin Name", 128, false), "The name of your plugin (keep it short!)"); diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp index 92e712a2b5..e95e45ff20 100644 --- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp +++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp @@ -71,6 +71,12 @@ String addQuotesIfContainsSpaces (const String& text) return (text.containsChar (' ') && ! text.isQuotedString()) ? text.quoted() : text; } +void setValueIfVoid (Value value, const var& defaultValue) +{ + if (value.getValue().isVoid()) + value = defaultValue; +} + //============================================================================== StringPairArray parsePreprocessorDefs (const String& text) { diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h index 49238ee226..0f73adf127 100644 --- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h +++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h @@ -37,6 +37,8 @@ StringPairArray mergePreprocessorDefs (StringPairArray inheritedDefs, const Stri String createGCCPreprocessorFlags (const StringPairArray& defs); String replacePreprocessorDefs (const StringPairArray& definitions, String sourceString); +void setValueIfVoid (Value value, const var& defaultValue); + //============================================================================== int indexOfLineStartingWith (const StringArray& lines, const String& text, int startIndex); diff --git a/extras/Introjucer/Source/Utility/jucer_PresetIDs.h b/extras/Introjucer/Source/Utility/jucer_PresetIDs.h index 843257f7c0..e40c03a9a3 100644 --- a/extras/Introjucer/Source/Utility/jucer_PresetIDs.h +++ b/extras/Introjucer/Source/Utility/jucer_PresetIDs.h @@ -76,6 +76,8 @@ namespace Ids DECLARE_ID (juceLinkage); DECLARE_ID (buildVST); DECLARE_ID (bundleIdentifier); + DECLARE_ID (aaxIdentifier); + DECLARE_ID (aaxFolder); DECLARE_ID (compile); DECLARE_ID (noWarnings); DECLARE_ID (resource); diff --git a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h index 3c32aff0c1..0f73543589 100644 --- a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +++ b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h @@ -26,7 +26,8 @@ // The following checks should cause a compile error if you've forgotten to // define all your plugin settings properly.. -#if ! (JucePlugin_Build_VST || JucePlugin_Build_AU || JucePlugin_Build_RTAS || JucePlugin_Build_Standalone || JucePlugin_Build_LV2) +#if ! (JucePlugin_Build_VST || JucePlugin_Build_AU || JucePlugin_Build_RTAS || JucePlugin_Build_AAX \ + || JucePlugin_Build_Standalone || JucePlugin_Build_LV2) #error "You need to enable at least one plugin format!" #endif @@ -103,3 +104,7 @@ #if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI) #error "You need to define the JucePlugin_LV2URI value!" #endif + +#if JucePlugin_Build_AAX && ! defined (JucePlugin_AAXIdentifier) + #error "You need to define the JucePlugin_AAXIdentifier value!" +#endif