diff --git a/extras/Introjucer/Introjucer.jucer b/extras/Introjucer/Introjucer.jucer index 281b832f97..df3fd08898 100644 --- a/extras/Introjucer/Introjucer.jucer +++ b/extras/Introjucer/Introjucer.jucer @@ -14,21 +14,42 @@ bigIcon="rVgowdy"> + juceFolder="../.." documentExtensions=".jucer" objCExtraSuffix="zNNCr"> + + + + + + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> + + + + + - + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> + + + + + + + + + + + + rtasFolder="c:\SDKs\PT_80_SDK" libraryType="1" juceFolder="../.."> + + + + + - - - - isDebug() == forDebug) { - flags << createIncludePathFlags (configs.getReference(i)); + flags << createIncludePathFlags (*config); break; } } @@ -303,15 +327,15 @@ private: defines.set ("NDEBUG", "1"); } - for (int i = 0; i < configs.size(); ++i) + for (int i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); + const BuildConfiguration::Ptr config (getConfiguration(i)); - if (config.isDebug() == forDebug) + if (config->isDebug() == forDebug) { - flags << " -O" << config.getGCCOptimisationFlag(); + flags << " -O" << config->getGCCOptimisationFlag(); - defines = mergePreprocessorDefs (defines, getAllPreprocessorDefs (config)); + defines = mergePreprocessorDefs (defines, getAllPreprocessorDefs (*config)); break; } } diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h index 5871541890..bce5a0523c 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h @@ -85,12 +85,32 @@ protected: bool isLibraryDLL() const { return msvcIsDLL || (projectType.isLibrary() && getLibraryType() == 2); } //============================================================================== - String getIntermediatesPath (const Project::BuildConfiguration& config) const + class MSVCBuildConfiguration : public BuildConfiguration + { + public: + MSVCBuildConfiguration (Project& project, const ValueTree& settings) + : BuildConfiguration (project, settings) + { + } + + void createPropertyEditors (PropertyListBuilder& props) + { + createBasicPropertyEditors (props); + } + }; + + BuildConfiguration::Ptr createBuildConfig (const ValueTree& settings) const + { + return new MSVCBuildConfiguration (project, settings); + } + + //============================================================================== + String getIntermediatesPath (const BuildConfiguration& config) const { return ".\\" + File::createLegalFileName (config.getName().toString().trim()); } - String getConfigTargetPath (const Project::BuildConfiguration& config) const + String getConfigTargetPath (const BuildConfiguration& config) const { const String binaryPath (config.getTargetBinaryRelativePath().toString().trim()); if (binaryPath.isEmpty()) @@ -105,7 +125,7 @@ protected: .toWindowsStyle(); } - String getPreprocessorDefs (const Project::BuildConfiguration& config, const String& joinString) const + String getPreprocessorDefs (const BuildConfiguration& config, const String& joinString) const { StringPairArray defines (msvcExtraPreprocessorDefs); defines.set ("WIN32", ""); @@ -138,7 +158,7 @@ protected: return result.joinIntoString (joinString); } - StringArray getHeaderSearchPaths (const Project::BuildConfiguration& config) const + StringArray getHeaderSearchPaths (const BuildConfiguration& config) const { StringArray searchPaths (extraSearchPaths); searchPaths.addArray (config.getHeaderSearchPaths()); @@ -146,7 +166,7 @@ protected: return searchPaths; } - String getBinaryFileForConfig (const Project::BuildConfiguration& config) const + String getBinaryFileForConfig (const BuildConfiguration& config) const { const String targetBinary (getSetting (config.isDebug().getValue() ? Ids::libraryName_Debug : Ids::libraryName_Release).toString().trim()); if (targetBinary.isNotEmpty()) @@ -155,7 +175,7 @@ protected: return config.getTargetBinaryName().toString() + msvcTargetSuffix; } - static String createConfigName (const Project::BuildConfiguration& config) + virtual String createConfigName (const BuildConfiguration& config) const { return config.getName().toString() + "|Win32"; } @@ -175,20 +195,20 @@ protected: << "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution" << newLine; int i; - for (i = 0; i < configs.size(); ++i) + for (i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); - out << "\t\t" << createConfigName (config) << " = " << createConfigName (config) << newLine; + const String configName (createConfigName (*getConfiguration(i))); + out << "\t\t" << configName << " = " << configName << newLine; } out << "\tEndGlobalSection" << newLine << "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution" << newLine; - for (i = 0; i < configs.size(); ++i) + for (i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); - out << "\t\t" << projectGUID << "." << createConfigName (config) << ".ActiveCfg = " << createConfigName (config) << newLine; - out << "\t\t" << projectGUID << "." << createConfigName (config) << ".Build.0 = " << createConfigName (config) << newLine; + const String configName (createConfigName (*getConfiguration(i))); + out << "\t\t" << projectGUID << "." << configName << ".ActiveCfg = " << configName << newLine; + out << "\t\t" << projectGUID << "." << configName << ".Build.0 = " << configName << newLine; } out << "\tEndGlobalSection" << newLine @@ -449,12 +469,10 @@ protected: if (excludeFromBuild || useStdcall) { - for (int i = 0; i < configs.size(); ++i) + for (int i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); - XmlElement* fileConfig = fileXml->createNewChildElement ("FileConfiguration"); - fileConfig->setAttribute ("Name", createConfigName (config)); + fileConfig->setAttribute ("Name", createConfigName (*getConfiguration (i))); if (excludeFromBuild) fileConfig->setAttribute ("ExcludedFromBuild", "true"); @@ -508,7 +526,7 @@ protected: return e; } - void createConfig (XmlElement& xml, const Project::BuildConfiguration& config) const + void createConfig (XmlElement& xml, const BuildConfiguration& config) const { String binariesPath (getConfigTargetPath (config)); String intermediatesPath (getIntermediatesPath (config)); @@ -679,8 +697,8 @@ protected: void createConfigs (XmlElement& xml) { - for (int i = 0; i < configs.size(); ++i) - createConfig (*xml.createNewChildElement ("Configuration"), configs.getReference(i)); + for (int i = 0; i < getNumConfigurations(); ++i) + createConfig (*xml.createNewChildElement ("Configuration"), *getConfiguration(i)); } //============================================================================== @@ -780,14 +798,14 @@ private: File getDSWFile() const { return getProjectFile (".dsw"); } //============================================================================== - String createConfigName (const Project::BuildConfiguration& config) const + String createConfigName (const BuildConfiguration& config) const { return projectName + " - Win32 " + config.getName().toString(); } void writeProject (OutputStream& out) { - const String defaultConfigName (createConfigName (configs.getReference(0))); + const String defaultConfigName (createConfigName (*getConfiguration(0))); String targetType, targetCode; @@ -816,8 +834,8 @@ private: << "!MESSAGE " << newLine; int i; - for (i = 0; i < configs.size(); ++i) - out << "!MESSAGE \"" << createConfigName (configs.getReference (i)) << "\" (based on " << targetType << ")" << newLine; + for (i = 0; i < getNumConfigurations(); ++i) + out << "!MESSAGE \"" << createConfigName (*getConfiguration (i)) << "\" (based on " << targetType << ")" << newLine; out << "!MESSAGE " << newLine << "# Begin Project" << newLine @@ -830,37 +848,37 @@ private: String targetList; - for (i = 0; i < configs.size(); ++i) + for (i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); - const String configName (createConfigName (config)); + const BuildConfiguration::Ptr config (getConfiguration(i)); + const String configName (createConfigName (*config)); targetList << "# Name \"" << configName << '"' << newLine; - const String binariesPath (getConfigTargetPath (config)); - const String targetBinary (FileHelpers::windowsStylePath (binariesPath + "/" + getBinaryFileForConfig (config))); - const String optimisationFlag (((int) config.getOptimisationLevel().getValue() <= 1) ? "Od" : (config.getOptimisationLevel() == 2 ? "O2" : "O3")); - const String defines (getPreprocessorDefs (config, " /D ")); - const bool isDebug = (bool) config.isDebug().getValue(); + const String binariesPath (getConfigTargetPath (*config)); + const String targetBinary (FileHelpers::windowsStylePath (binariesPath + "/" + getBinaryFileForConfig (*config))); + const String optimisationFlag (((int) config->getOptimisationLevel().getValue() <= 1) ? "Od" : (config->getOptimisationLevel() == 2 ? "O2" : "O3")); + const String defines (getPreprocessorDefs (*config, " /D ")); + const bool isDebug = (bool) config->isDebug().getValue(); const String extraDebugFlags (isDebug ? "/Gm /ZI /GZ" : ""); out << (i == 0 ? "!IF" : "!ELSEIF") << " \"$(CFG)\" == \"" << configName << '"' << newLine << "# PROP BASE Use_MFC 0" << newLine << "# PROP BASE Use_Debug_Libraries " << (isDebug ? "1" : "0") << newLine << "# PROP BASE Output_Dir \"" << binariesPath << '"' << newLine - << "# PROP BASE Intermediate_Dir \"" << getIntermediatesPath (config) << '"' << newLine + << "# PROP BASE Intermediate_Dir \"" << getIntermediatesPath (*config) << '"' << newLine << "# PROP BASE Target_Dir \"\"" << newLine << "# PROP Use_MFC 0" << newLine << "# PROP Use_Debug_Libraries " << (isDebug ? "1" : "0") << newLine << "# PROP Output_Dir \"" << binariesPath << '"' << newLine - << "# PROP Intermediate_Dir \"" << getIntermediatesPath (config) << '"' << newLine + << "# PROP Intermediate_Dir \"" << getIntermediatesPath (*config) << '"' << newLine << "# PROP Ignore_Export_Lib 0" << newLine << "# PROP Target_Dir \"\"" << newLine << "# ADD BASE CPP /nologo /W3 /GX /" << optimisationFlag << " /D " << defines << " /YX /FD /c " << extraDebugFlags << " /Zm1024" << newLine << "# ADD CPP /nologo " << (isDebug ? "/MTd" : "/MT") << " /W3 /GR /GX /" << optimisationFlag - << " /I " << replacePreprocessorTokens (config, getHeaderSearchPaths (config).joinIntoString (" /I ")) + << " /I " << replacePreprocessorTokens (*config, getHeaderSearchPaths (*config).joinIntoString (" /I ")) << " /D " << defines << " /D \"_UNICODE\" /D \"UNICODE\" /FD /c /Zm1024 " << extraDebugFlags - << " " << replacePreprocessorTokens (config, getExtraCompilerFlags().toString()).trim() << newLine; + << " " << replacePreprocessorTokens (*config, getExtraCompilerFlags().toString()).trim() << newLine; if (! isDebug) out << "# SUBTRACT CPP /YX" << newLine; @@ -891,7 +909,7 @@ private: << " /nologo /machine:I386 /out:\"" << targetBinary << "\" " << (isLibraryDLL() ? "/dll" : (msvcIsWindowsSubsystem ? "/subsystem:windows " : "/subsystem:console ")) - << replacePreprocessorTokens (config, getExtraLinkerFlags().toString()).trim() << newLine; + << replacePreprocessorTokens (*config, getExtraLinkerFlags().toString()).trim() << newLine; } } @@ -1053,16 +1071,57 @@ public: } protected: + //============================================================================== + class VC2010BuildConfiguration : public MSVCBuildConfiguration + { + public: + VC2010BuildConfiguration (Project& project, const ValueTree& settings) + : MSVCBuildConfiguration (project, settings) + { + if (getArchitectureType().toString().isEmpty()) + getArchitectureType() = get32BitArchName(); + } + + //============================================================================== + static const char* get32BitArchName() { return "32-bit"; } + static const char* get64BitArchName() { return "x64"; } + + Value getArchitectureType() const { return getValue (Ids::winArchitecture); } + bool is64Bit() const { return getArchitectureType().toString() == get64BitArchName(); } + + //============================================================================== + void createPropertyEditors (PropertyListBuilder& props) + { + MSVCBuildConfiguration::createPropertyEditors (props); + + const char* const archTypes[] = { get32BitArchName(), get64BitArchName(), nullptr }; + props.add (new ChoicePropertyComponent (getArchitectureType(), "Architecture", + StringArray (archTypes), Array (archTypes))); + } + }; + + BuildConfiguration::Ptr createBuildConfig (const ValueTree& settings) const + { + return new VC2010BuildConfiguration (project, settings); + } + + static bool is64Bit (const BuildConfiguration& config) + { + return dynamic_cast (config).is64Bit(); + } + + //============================================================================== File getVCProjFile() const { return getProjectFile (".vcxproj"); } File getVCProjFiltersFile() const { return getProjectFile (".vcxproj.filters"); } File getSLNFile() const { return getProjectFile (".sln"); } - static String createConfigName (const Project::BuildConfiguration& config) + String createConfigName (const BuildConfiguration& config) const { - return config.getName().toString() + "|Win32"; + return config.getName().toString() + (is64Bit (config) ? "|x64" + : "|Win32"); } - static void setConditionAttribute (XmlElement& xml, const Project::BuildConfiguration& config) + void setConditionAttribute (XmlElement& xml, const BuildConfiguration& config) { xml.setAttribute ("Condition", "'$(Configuration)|$(Platform)'=='" + createConfigName (config) + "'"); } @@ -1078,14 +1137,14 @@ protected: XmlElement* configsGroup = projectXml.createNewChildElement ("ItemGroup"); configsGroup->setAttribute ("Label", "ProjectConfigurations"); - for (int i = 0; i < configs.size(); ++i) + for (int i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); + const BuildConfiguration::Ptr config (getConfiguration(i)); XmlElement* e = configsGroup->createNewChildElement ("ProjectConfiguration"); - e->setAttribute ("Include", createConfigName (config)); - e->createNewChildElement ("Configuration")->addTextElement (config.getName().toString()); - e->createNewChildElement ("Platform")->addTextElement ("Win32"); + e->setAttribute ("Include", createConfigName (*config)); + e->createNewChildElement ("Configuration")->addTextElement (config->getName().toString()); + e->createNewChildElement ("Platform")->addTextElement (is64Bit (*config) ? "x64" : "Win32"); } } @@ -1100,19 +1159,22 @@ protected: imports->setAttribute ("Project", "$(VCTargetsPath)\\Microsoft.Cpp.Default.props"); } - for (int i = 0; i < configs.size(); ++i) + for (int i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); + const BuildConfiguration::Ptr config (getConfiguration(i)); XmlElement* e = projectXml.createNewChildElement ("PropertyGroup"); - setConditionAttribute (*e, config); + setConditionAttribute (*e, *config); e->setAttribute ("Label", "Configuration"); e->createNewChildElement ("ConfigurationType")->addTextElement (getProjectType()); e->createNewChildElement ("UseOfMfc")->addTextElement ("false"); e->createNewChildElement ("CharacterSet")->addTextElement ("MultiByte"); - if (! config.isDebug().getValue()) + if (! config->isDebug().getValue()) e->createNewChildElement ("WholeProgramOptimization")->addTextElement ("true"); + + if (is64Bit (*config)) + e->createNewChildElement ("PlatformToolset")->addTextElement ("Windows7.1SDK"); } { @@ -1143,35 +1205,35 @@ protected: XmlElement* props = projectXml.createNewChildElement ("PropertyGroup"); props->createNewChildElement ("_ProjectFileVersion")->addTextElement ("10.0.30319.1"); - for (int i = 0; i < configs.size(); ++i) + for (int i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); + const BuildConfiguration::Ptr config (getConfiguration(i)); XmlElement* outdir = props->createNewChildElement ("OutDir"); - setConditionAttribute (*outdir, config); - outdir->addTextElement (getConfigTargetPath (config) + "\\"); + setConditionAttribute (*outdir, *config); + outdir->addTextElement (getConfigTargetPath (*config) + "\\"); XmlElement* intdir = props->createNewChildElement ("IntDir"); - setConditionAttribute (*intdir, config); - intdir->addTextElement (getConfigTargetPath (config) + "\\"); + setConditionAttribute (*intdir, *config); + intdir->addTextElement (getConfigTargetPath (*config) + "\\"); XmlElement* name = props->createNewChildElement ("TargetName"); - setConditionAttribute (*name, config); - name->addTextElement (getBinaryFileForConfig (config).upToLastOccurrenceOf (".", false, false)); + setConditionAttribute (*name, *config); + name->addTextElement (getBinaryFileForConfig (*config).upToLastOccurrenceOf (".", false, false)); } } - for (int i = 0; i < configs.size(); ++i) + for (int i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); - String binariesPath (getConfigTargetPath (config)); - String intermediatesPath (getIntermediatesPath (config)); - const bool isDebug = (bool) config.isDebug().getValue(); - const String binaryName (File::createLegalFileName (config.getTargetBinaryName().toString())); - const String outputFileName (getBinaryFileForConfig (config)); + const BuildConfiguration::Ptr config (getConfiguration(i)); + String binariesPath (getConfigTargetPath (*config)); + String intermediatesPath (getIntermediatesPath (*config)); + const bool isDebug = (bool) config->isDebug().getValue(); + const String binaryName (File::createLegalFileName (config->getTargetBinaryName().toString())); + const String outputFileName (getBinaryFileForConfig (*config)); XmlElement* group = projectXml.createNewChildElement ("ItemDefinitionGroup"); - setConditionAttribute (*group, config); + setConditionAttribute (*group, *config); { XmlElement* midl = group->createNewChildElement ("Midl"); @@ -1180,7 +1242,6 @@ protected: midl->createNewChildElement ("MkTypLibCompatible")->addTextElement ("true"); midl->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); midl->createNewChildElement ("TargetEnvironment")->addTextElement ("Win32"); - //midl->createNewChildElement ("TypeLibraryName")->addTextElement (""); midl->createNewChildElement ("HeaderFileName"); } @@ -1189,12 +1250,13 @@ protected: cl->createNewChildElement ("Optimization")->addTextElement (isDebug ? "Disabled" : "MaxSpeed"); if (isDebug) - cl->createNewChildElement ("DebugInformationFormat")->addTextElement ("EditAndContinue"); + cl->createNewChildElement ("DebugInformationFormat")->addTextElement (is64Bit (*config) ? "ProgramDatabase" + : "EditAndContinue"); - StringArray includePaths (getHeaderSearchPaths (config)); + StringArray includePaths (getHeaderSearchPaths (*config)); includePaths.add ("%(AdditionalIncludeDirectories)"); cl->createNewChildElement ("AdditionalIncludeDirectories")->addTextElement (includePaths.joinIntoString (";")); - cl->createNewChildElement ("PreprocessorDefinitions")->addTextElement (getPreprocessorDefs (config, ";") + ";%(PreprocessorDefinitions)"); + cl->createNewChildElement ("PreprocessorDefinitions")->addTextElement (getPreprocessorDefs (*config, ";") + ";%(PreprocessorDefinitions)"); cl->createNewChildElement ("RuntimeLibrary")->addTextElement (msvcNeedsDLLRuntimeLib ? (isDebug ? "MultiThreadedDLLDebug" : "MultiThreadedDLL") : (isDebug ? "MultiThreadedDebug" : "MultiThreaded")); cl->createNewChildElement ("RuntimeTypeInfo")->addTextElement ("true"); @@ -1206,7 +1268,7 @@ protected: cl->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); cl->createNewChildElement ("MultiProcessorCompilation")->addTextElement ("true"); - const String extraFlags (replacePreprocessorTokens (config, getExtraCompilerFlags().toString()).trim()); + const String extraFlags (replacePreprocessorTokens (*config, getExtraCompilerFlags().toString()).trim()); if (extraFlags.isNotEmpty()) cl->createNewChildElement ("AdditionalOptions")->addTextElement (extraFlags + " %(AdditionalOptions)"); } @@ -1226,7 +1288,9 @@ protected: link->createNewChildElement ("GenerateDebugInformation")->addTextElement (isDebug ? "true" : "false"); link->createNewChildElement ("ProgramDatabaseFile")->addTextElement (FileHelpers::windowsStylePath (intermediatesPath + "/" + binaryName + ".pdb")); link->createNewChildElement ("SubSystem")->addTextElement (msvcIsWindowsSubsystem ? "Windows" : "Console"); - link->createNewChildElement ("TargetMachine")->addTextElement ("MachineX86"); + + if (! is64Bit (*config)) + link->createNewChildElement ("TargetMachine")->addTextElement ("MachineX86"); if (! isDebug) { @@ -1236,7 +1300,7 @@ protected: String extraLinkerOptions (getExtraLinkerFlags().toString()); if (extraLinkerOptions.isNotEmpty()) - link->createNewChildElement ("AdditionalOptions")->addTextElement (replacePreprocessorTokens (config, extraLinkerOptions).trim() + link->createNewChildElement ("AdditionalOptions")->addTextElement (replacePreprocessorTokens (*config, extraLinkerOptions).trim() + " %(AdditionalOptions)"); } diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h index 25278a328a..dd2410367a 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h @@ -94,6 +94,27 @@ public: overwriteFileIfDifferentOrThrow (getTargetFolder().getChildFile ("Makefile"), mo); } +protected: + //============================================================================== + class MakeBuildConfiguration : public BuildConfiguration + { + public: + MakeBuildConfiguration (Project& project, const ValueTree& settings) + : BuildConfiguration (project, settings) + { + } + + void createPropertyEditors (PropertyListBuilder& props) + { + createBasicPropertyEditors (props); + } + }; + + BuildConfiguration::Ptr createBuildConfig (const ValueTree& settings) const + { + return new MakeBuildConfiguration (project, settings); + } + private: //============================================================================== void findAllFilesToCompile (const Project::Item& projectItem, Array& results) @@ -110,7 +131,7 @@ private: } } - void writeDefineFlags (OutputStream& out, const Project::BuildConfiguration& config) + void writeDefineFlags (OutputStream& out, const BuildConfiguration& config) { StringPairArray defines; defines.set ("LINUX", "1"); @@ -128,7 +149,7 @@ private: out << createGCCPreprocessorFlags (mergePreprocessorDefs (defines, getAllPreprocessorDefs (config))); } - void writeHeaderPathFlags (OutputStream& out, const Project::BuildConfiguration& config) + void writeHeaderPathFlags (OutputStream& out, const BuildConfiguration& config) { StringArray searchPaths (extraSearchPaths); searchPaths.addArray (config.getHeaderSearchPaths()); @@ -142,7 +163,7 @@ private: out << " -I " << FileHelpers::unixStylePath (replacePreprocessorTokens (config, searchPaths[i])).quoted(); } - void writeCppFlags (OutputStream& out, const Project::BuildConfiguration& config) + void writeCppFlags (OutputStream& out, const BuildConfiguration& config) { out << " CPPFLAGS := $(DEPFLAGS)"; writeDefineFlags (out, config); @@ -150,7 +171,7 @@ private: out << newLine; } - void writeLinkerFlags (OutputStream& out, const Project::BuildConfiguration& config) + void writeLinkerFlags (OutputStream& out, const BuildConfiguration& config) { out << " LDFLAGS += -L$(BINDIR) -L$(LIBDIR)"; @@ -176,7 +197,7 @@ private: << newLine; } - void writeConfig (OutputStream& out, const Project::BuildConfiguration& config) + void writeConfig (OutputStream& out, const BuildConfiguration& config) { const String buildDirName ("build"); const String intermediatesDirName (buildDirName + "/intermediate/" + config.getName().toString()); @@ -251,7 +272,7 @@ private: << newLine; out << "ifndef CONFIG" << newLine - << " CONFIG=" << escapeSpaces (configs.getReference(0).getName().toString()) << newLine + << " CONFIG=" << escapeSpaces (getConfiguration(0)->getName().toString()) << newLine << "endif" << newLine << newLine; @@ -265,8 +286,8 @@ private: << newLine; int i; - for (i = 0; i < configs.size(); ++i) - writeConfig (out, configs.getReference(i)); + for (i = 0; i < getNumConfigurations(); ++i) + writeConfig (out, *getConfiguration(i)); writeObjects (out, files); diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h index 0259315906..96183a5f2b 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h @@ -28,6 +28,19 @@ #include "jucer_ProjectExporter.h" +namespace +{ + const char* const osxVersionDefault = "default"; + const char* const osxVersion10_4 = "10.4 SDK"; + const char* const osxVersion10_5 = "10.5 SDK"; + const char* const osxVersion10_6 = "10.6 SDK"; + + const char* const osxArch_Default = "default"; + const char* const osxArch_Native = "Native"; + const char* const osxArch_32BitUniversal = "32BitUniversal"; + const char* const osxArch_64BitUniversal = "64BitUniversal"; + const char* const osxArch_64Bit = "64BitIntel"; +} //============================================================================== class XCodeProjectExporter : public ProjectExporter @@ -147,6 +160,55 @@ public: writeInfoPlistFile(); } +protected: + //============================================================================== + class XcodeBuildConfiguration : public BuildConfiguration + { + public: + XcodeBuildConfiguration (Project& project, const ValueTree& settings) + : BuildConfiguration (project, settings) + { + } + + Value getMacSDKVersion() const { return getValue (Ids::osxSDK); } + Value getMacCompatibilityVersion() const { return getValue (Ids::osxCompatibility); } + Value getMacArchitecture() const { return getValue (Ids::osxArchitecture); } + + void createPropertyEditors (PropertyListBuilder& props) + { + createBasicPropertyEditors (props); + + if (getMacSDKVersion().toString().isEmpty()) + getMacSDKVersion() = osxVersionDefault; + + const char* osxVersions[] = { "Use Default", osxVersion10_4, osxVersion10_5, osxVersion10_6, 0 }; + const char* osxVersionValues[] = { osxVersionDefault, osxVersion10_4, osxVersion10_5, osxVersion10_6, 0 }; + + props.add (new ChoicePropertyComponent (getMacSDKVersion(), "OSX Base SDK Version", StringArray (osxVersions), Array (osxVersionValues)), + "The version of OSX to link against in the XCode build."); + + if (getMacCompatibilityVersion().toString().isEmpty()) + getMacCompatibilityVersion() = osxVersionDefault; + + props.add (new ChoicePropertyComponent (getMacCompatibilityVersion(), "OSX Compatibility Version", StringArray (osxVersions), Array (osxVersionValues)), + "The minimum version of OSX that the target binary will be compatible with."); + + const char* osxArch[] = { "Use Default", "Native architecture of build machine", "Universal Binary (32-bit)", "Universal Binary (64-bit)", "64-bit Intel", 0 }; + const char* osxArchValues[] = { osxArch_Default, osxArch_Native, osxArch_32BitUniversal, osxArch_64BitUniversal, osxArch_64Bit, 0 }; + + if (getMacArchitecture().toString().isEmpty()) + getMacArchitecture() = osxArch_Default; + + props.add (new ChoicePropertyComponent (getMacArchitecture(), "OSX Architecture", StringArray (osxArch), Array (osxArchValues)), + "The type of OSX binary that will be produced."); + } + }; + + BuildConfiguration::Ptr createBuildConfig (const ValueTree& settings) const + { + return new XcodeBuildConfiguration (project, settings); + } + private: OwnedArray pbxBuildFiles, pbxFileReferences, pbxGroups, misc, projectConfigs, targetConfigs; StringArray buildPhaseIDs, resourceIDs, sourceIDs, frameworkIDs; @@ -215,12 +277,12 @@ private: addGroup (createID ("__mainsourcegroup"), "Source", topLevelGroupIDs); } - for (int i = 0; i < configs.size(); ++i) + for (int i = 0; i < getNumConfigurations(); ++i) { - const Project::BuildConfiguration& config = configs.getReference(i); + const BuildConfiguration::Ptr config (getConfiguration (i)); - addProjectConfig (config.getName().getValue(), getProjectSettings (config)); - addTargetConfig (config.getName().getValue(), getTargetSettings (config)); + addProjectConfig (config->getName().getValue(), getProjectSettings (*config)); + addTargetConfig (config->getName().getValue(), getTargetSettings (dynamic_cast (*config))); } addConfigList (projectConfigs, createID ("__projList")); @@ -413,7 +475,7 @@ private: overwriteFileIfDifferentOrThrow (infoPlistFile, mo); } - StringArray getHeaderSearchPaths (const Project::BuildConfiguration& config) + StringArray getHeaderSearchPaths (const BuildConfiguration& config) { StringArray searchPaths (extraSearchPaths); searchPaths.addArray (config.getHeaderSearchPaths()); @@ -434,7 +496,7 @@ private: librarySearchPaths.add (sanitisePath (searchPath)); } - void getLinkerFlags (const Project::BuildConfiguration& config, StringArray& flags, StringArray& librarySearchPaths) + void getLinkerFlags (const BuildConfiguration& config, StringArray& flags, StringArray& librarySearchPaths) { if (xcodeIsBundle) flags.add ("-bundle"); @@ -449,7 +511,7 @@ private: flags.removeEmptyStrings (true); } - StringArray getProjectSettings (const Project::BuildConfiguration& config) + StringArray getProjectSettings (const BuildConfiguration& config) { StringArray s; s.add ("ALWAYS_SEARCH_USER_PATHS = NO"); @@ -489,15 +551,15 @@ private: return s; } - StringArray getTargetSettings (const Project::BuildConfiguration& config) + StringArray getTargetSettings (const XcodeBuildConfiguration& config) { StringArray s; const String arch (config.getMacArchitecture().toString()); - if (arch == Project::BuildConfiguration::osxArch_Native) s.add ("ARCHS = \"$(ARCHS_NATIVE)\""); - else if (arch == Project::BuildConfiguration::osxArch_32BitUniversal) s.add ("ARCHS = \"$(ARCHS_STANDARD_32_BIT)\""); - else if (arch == Project::BuildConfiguration::osxArch_64BitUniversal) s.add ("ARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\""); - else if (arch == Project::BuildConfiguration::osxArch_64Bit) s.add ("ARCHS = \"$(ARCHS_STANDARD_64_BIT)\""); + if (arch == osxArch_Native) s.add ("ARCHS = \"$(ARCHS_NATIVE)\""); + else if (arch == osxArch_32BitUniversal) s.add ("ARCHS = \"$(ARCHS_STANDARD_32_BIT)\""); + else if (arch == osxArch_64BitUniversal) s.add ("ARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\""); + else if (arch == osxArch_64Bit) s.add ("ARCHS = \"$(ARCHS_STANDARD_64_BIT)\""); s.add ("HEADER_SEARCH_PATHS = \"" + replacePreprocessorTokens (config, getHeaderSearchPaths (config).joinIntoString (" ")) + " $(inherited)\""); s.add ("GCC_OPTIMIZATION_LEVEL = " + config.getGCCOptimisationFlag()); @@ -542,23 +604,23 @@ private: const String sdk (config.getMacSDKVersion().toString()); const String sdkCompat (config.getMacCompatibilityVersion().toString()); - if (sdk == Project::BuildConfiguration::osxVersion10_4) + if (sdk == osxVersion10_4) { s.add ("SDKROOT = macosx10.4"); gccVersion = "4.0"; } - else if (sdk == Project::BuildConfiguration::osxVersion10_5) + else if (sdk == osxVersion10_5) { s.add ("SDKROOT = macosx10.5"); } - else if (sdk == Project::BuildConfiguration::osxVersion10_6) + else if (sdk == osxVersion10_6) { s.add ("SDKROOT = macosx10.6"); } - if (sdkCompat == Project::BuildConfiguration::osxVersion10_4) s.add ("MACOSX_DEPLOYMENT_TARGET = 10.4"); - else if (sdkCompat == Project::BuildConfiguration::osxVersion10_5) s.add ("MACOSX_DEPLOYMENT_TARGET = 10.5"); - else if (sdkCompat == Project::BuildConfiguration::osxVersion10_6) s.add ("MACOSX_DEPLOYMENT_TARGET = 10.6"); + if (sdkCompat == osxVersion10_4) s.add ("MACOSX_DEPLOYMENT_TARGET = 10.4"); + else if (sdkCompat == osxVersion10_5) s.add ("MACOSX_DEPLOYMENT_TARGET = 10.5"); + else if (sdkCompat == osxVersion10_6) s.add ("MACOSX_DEPLOYMENT_TARGET = 10.6"); s.add ("MACOSX_DEPLOYMENT_TARGET_ppc = 10.4"); } @@ -888,7 +950,7 @@ private: { jassert (xcodeFileType.isNotEmpty()); jassert (xcodeBundleExtension.isEmpty() || xcodeBundleExtension.startsWithChar('.')); - String productName (configs.getReference(0).getTargetBinaryName().toString()); + String productName (getConfiguration(0)->getTargetBinaryName().toString()); if (xcodeFileType == "archive.ar") productName = getLibbedFilename (productName); diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp index a93a90b17f..e7fa334bcc 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp @@ -85,6 +85,8 @@ ProjectExporter* ProjectExporter::createNewExporter (Project& project, const int else exp->getJuceFolder() = juceFolder.getFullPathName(); + exp->createDefaultConfigs(); + return exp; } @@ -136,16 +138,13 @@ ProjectExporter::ProjectExporter (Project& project_, const ValueTree& settings_) msvcIsDLL (false), msvcIsWindowsSubsystem (true), msvcNeedsDLLRuntimeLib (false), + settings (settings_), project (project_), projectType (project_.getProjectType()), projectName (project_.getProjectName().toString()), projectFolder (project_.getFile().getParentDirectory()), - settings (settings_), modulesGroup (nullptr) { - for (int i = 0; i < jmax (1, project.getNumConfigurations()); ++i) - configs.add (project.getConfiguration (i)); - groups.add (project.getMainGroup().createCopy()); } @@ -224,7 +223,7 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) "Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); } -StringPairArray ProjectExporter::getAllPreprocessorDefs (const Project::BuildConfiguration& config) const +StringPairArray ProjectExporter::getAllPreprocessorDefs (const ProjectExporter::BuildConfiguration& config) const { StringPairArray defs (mergePreprocessorDefs (config.getAllPreprocessorDefs(), parsePreprocessorDefs (getExporterPreprocessorDefs().toString()))); @@ -240,7 +239,7 @@ StringPairArray ProjectExporter::getAllPreprocessorDefs() const return defs; } -String ProjectExporter::replacePreprocessorTokens (const Project::BuildConfiguration& config, const String& sourceString) const +String ProjectExporter::replacePreprocessorTokens (const ProjectExporter::BuildConfiguration& config, const String& sourceString) const { return replacePreprocessorDefs (getAllPreprocessorDefs (config), sourceString); } @@ -299,3 +298,151 @@ void ProjectExporter::addToExtraSearchPaths (const RelativePath& pathFromProject const String path (isVisualStudio() ? localPath.toWindowsStyle() : localPath.toUnixStyle()); extraSearchPaths.addIfNotAlreadyThere (path, false); } + + +//============================================================================== +const Identifier ProjectExporter::configurations ("CONFIGURATIONS"); +const Identifier ProjectExporter::configuration ("CONFIGURATION"); + +ValueTree ProjectExporter::getConfigurations() const +{ + return settings.getChildWithName (configurations); +} + +int ProjectExporter::getNumConfigurations() const +{ + return getConfigurations().getNumChildren(); +} + +ProjectExporter::BuildConfiguration::Ptr ProjectExporter::getConfiguration (int index) const +{ + return createBuildConfig (getConfigurations().getChild (index)); +} + +bool ProjectExporter::hasConfigurationNamed (const String& name) const +{ + const ValueTree configs (getConfigurations()); + for (int i = configs.getNumChildren(); --i >= 0;) + if (configs.getChild(i) [Ids::name].toString() == name) + return true; + + return false; +} + +String ProjectExporter::getUniqueConfigName (String name) const +{ + String nameRoot (name); + while (CharacterFunctions::isDigit (nameRoot.getLastCharacter())) + nameRoot = nameRoot.dropLastCharacters (1); + + nameRoot = nameRoot.trim(); + + int suffix = 2; + while (hasConfigurationNamed (name)) + name = nameRoot + " " + String (suffix++); + + return name; +} + +void ProjectExporter::addNewConfiguration (const BuildConfiguration* configToCopy) +{ + const String configName (getUniqueConfigName (configToCopy != nullptr ? configToCopy->config [Ids::name].toString() + : "New Build Configuration")); + + ValueTree configs (getConfigurations()); + + if (! configs.isValid()) + { + settings.addChild (ValueTree (configurations), 0, project.getUndoManagerFor (settings)); + configs = getConfigurations(); + } + + ValueTree newConfig (configuration); + if (configToCopy != nullptr) + newConfig = configToCopy->config.createCopy(); + + newConfig.setProperty (Ids::name, configName, 0); + + configs.addChild (newConfig, -1, project.getUndoManagerFor (configs)); +} + +void ProjectExporter::deleteConfiguration (int index) +{ + ValueTree configs (getConfigurations()); + configs.removeChild (index, project.getUndoManagerFor (configs)); +} + +void ProjectExporter::createDefaultConfigs() +{ + settings.getOrCreateChildWithName (configurations, nullptr); + + for (int i = 0; i < 2; ++i) + { + addNewConfiguration (nullptr); + BuildConfiguration::Ptr config (getConfiguration (i)); + + const bool debugConfig = i == 0; + + config->getName() = debugConfig ? "Debug" : "Release"; + config->isDebug() = debugConfig; + config->getOptimisationLevel() = debugConfig ? 1 : 2; + config->getTargetBinaryName() = project.getProjectFilenameRoot(); + } +} + +//============================================================================== +ProjectExporter::BuildConfiguration::BuildConfiguration (Project& project_, const ValueTree& configNode) + : config (configNode), project (project_) +{ +} + +ProjectExporter::BuildConfiguration::~BuildConfiguration() +{ +} + +String ProjectExporter::BuildConfiguration::getGCCOptimisationFlag() const +{ + const int level = (int) getOptimisationLevel().getValue(); + return String (level <= 1 ? "0" : (level == 2 ? "s" : "3")); +} + +void ProjectExporter::BuildConfiguration::createBasicPropertyEditors (PropertyListBuilder& props) +{ + props.add (new TextPropertyComponent (getName(), "Name", 96, false), + "The name of this configuration."); + + props.add (new BooleanPropertyComponent (isDebug(), "Debug mode", "Debugging enabled"), + "If enabled, this means that the configuration should be built with debug synbols."); + + const char* optimisationLevels[] = { "No optimisation", "Optimise for size and speed", "Optimise for maximum speed", 0 }; + const int optimisationLevelValues[] = { 1, 2, 3, 0 }; + props.add (new ChoicePropertyComponent (getOptimisationLevel(), "Optimisation", StringArray (optimisationLevels), Array (optimisationLevelValues)), + "The optimisation level for this configuration"); + + props.add (new TextPropertyComponent (getTargetBinaryName(), "Binary name", 256, false), + "The filename to use for the destination binary executable file. Don't add a suffix to this, because platform-specific suffixes will be added for each target platform."); + + props.add (new TextPropertyComponent (getTargetBinaryRelativePath(), "Binary location", 1024, false), + "The folder in which the finished binary should be placed. Leave this blank to cause the binary to be placed in its default location in the build folder."); + + props.add (new TextPropertyComponent (getHeaderSearchPath(), "Header search path", 16384, false), + "Extra header search paths. Use semi-colons to separate multiple paths."); + + props.add (new TextPropertyComponent (getBuildConfigPreprocessorDefs(), "Preprocessor definitions", 32768, false), + "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash."); + + props.setPreferredHeight (22); +} + +StringPairArray ProjectExporter::BuildConfiguration::getAllPreprocessorDefs() const +{ + return mergePreprocessorDefs (project.getPreprocessorDefs(), + parsePreprocessorDefs (getBuildConfigPreprocessorDefs().toString())); +} + +StringArray ProjectExporter::BuildConfiguration::getHeaderSearchPaths() const +{ + StringArray s; + s.addTokens (getHeaderSearchPath().toString(), ";", String::empty); + return s; +} diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h index cb52dffa31..f90d4864b2 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h @@ -80,15 +80,6 @@ public: Value getExtraCompilerFlags() const { return getSetting (Ids::extraCompilerFlags); } Value getExtraLinkerFlags() const { return getSetting (Ids::extraLinkerFlags); } - Value getExporterPreprocessorDefs() const { return getSetting (Ids::extraDefs); } - - // includes exporter, project + config defs - StringPairArray getAllPreprocessorDefs (const Project::BuildConfiguration& config) const; - // includes exporter + project defs.. - StringPairArray getAllPreprocessorDefs() const; - - String replacePreprocessorTokens (const Project::BuildConfiguration&, const String& sourceString) const; - // This adds the quotes, and may return angle-brackets, eg: or normal quotes. String getIncludePathForFileInJuceFolder (const String& pathFromJuceFolder, const File& targetIncludeFile) const; @@ -149,6 +140,70 @@ public: //============================================================================== StringArray extraSearchPaths; + //============================================================================== + class BuildConfiguration : public ReferenceCountedObject + { + public: + BuildConfiguration (Project& project, const ValueTree& configNode); + ~BuildConfiguration(); + + typedef ReferenceCountedObjectPtr Ptr; + + //============================================================================== + virtual void createPropertyEditors (PropertyListBuilder&) = 0; + + //============================================================================== + Value getName() const { return getValue (Ids::name); } + Value isDebug() const { return getValue (Ids::isDebug); } + Value getTargetBinaryName() const { return getValue (Ids::targetName); } + // the path relative to the build folder in which the binary should go + Value getTargetBinaryRelativePath() const { return getValue (Ids::binaryPath); } + Value getOptimisationLevel() const { return getValue (Ids::optimisation); } + String getGCCOptimisationFlag() const; + Value getBuildConfigPreprocessorDefs() const { return getValue (Ids::defines); } + StringPairArray getAllPreprocessorDefs() const; // includes inherited definitions + Value getHeaderSearchPath() const { return getValue (Ids::headerPath); } + StringArray getHeaderSearchPaths() const; + + //============================================================================== + ValueTree config; + + protected: + Project& project; + + Value getValue (const Identifier& name) const { return config.getPropertyAsValue (name, getUndoManager()); } + UndoManager* getUndoManager() const { return project.getUndoManagerFor (config); } + + void createBasicPropertyEditors (PropertyListBuilder&); + + private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BuildConfiguration); + }; + + int getNumConfigurations() const; + BuildConfiguration::Ptr getConfiguration (int index) const; + void addNewConfiguration (const BuildConfiguration* configToCopy); + void deleteConfiguration (int index); + bool hasConfigurationNamed (const String& name) const; + String getUniqueConfigName (String name) const; + + ValueTree getConfigurations() const; + void createDefaultConfigs(); + + static const Identifier configurations, configuration; + + //============================================================================== + Value getExporterPreprocessorDefs() const { return getSetting (Ids::extraDefs); } + + // includes exporter, project + config defs + StringPairArray getAllPreprocessorDefs (const BuildConfiguration& config) const; + // includes exporter + project defs.. + StringPairArray getAllPreprocessorDefs() const; + + String replacePreprocessorTokens (const BuildConfiguration&, const String& sourceString) const; + + ValueTree settings; + protected: //============================================================================== String name; @@ -156,10 +211,10 @@ protected: const ProjectType& projectType; const String projectName; const File projectFolder; - Array configs; - ValueTree settings; Project::Item* modulesGroup; + virtual BuildConfiguration::Ptr createBuildConfig (const ValueTree&) const = 0; + static String getDefaultBuildsRootFolder() { return "Builds/"; } static String getLibbedFilename (String name) diff --git a/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp b/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp index a26982f605..0f267533c3 100644 --- a/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp +++ b/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp @@ -26,6 +26,7 @@ #include "jucer_NewProjectWizard.h" #include "jucer_ProjectType.h" #include "jucer_Module.h" +#include "../Project Saving/jucer_ProjectExporter.h" #include "../Application/jucer_Application.h" #include "../Application/jucer_MainWindow.h" @@ -51,6 +52,20 @@ static void createFileCreationOptionComboBox (Component& setupComp, c->setBounds ("parent.width / 2 + 160, 10, parent.width - 10, top + 22"); } +static void setExecutableNameForAllTargets (Project& project, const String& exeName) +{ + for (int j = project.getNumExporters(); --j >= 0;) + { + ScopedPointer exporter (project.createExporter(j)); + + if (exporter != nullptr) + { + for (int i = exporter->getNumConfigurations(); --i >= 0;) + exporter->getConfiguration(i)->getTargetBinaryName() = exeName; + } + } +} + //============================================================================== class GUIAppWizard : public NewProjectWizard { @@ -100,8 +115,7 @@ public: Project::Item sourceGroup (project.getMainGroup().addNewSubGroup ("Source", 0)); - for (int i = project.getNumConfigurations(); --i >= 0;) - project.getConfiguration(i).getTargetBinaryName() = File::createLegalFileName (appTitle); + setExecutableNameForAllTargets (project, File::createLegalFileName (appTitle)); String appHeaders (CodeHelpers::createIncludeStatement (project.getAppIncludeFile(), mainCppFile)); String initCode, shutdownCode, anotherInstanceStartedCode, privateMembers, memberInitialisers; @@ -204,8 +218,7 @@ public: Project::Item sourceGroup (project.getMainGroup().addNewSubGroup ("Source", 0)); - for (int i = project.getNumConfigurations(); --i >= 0;) - project.getConfiguration(i).getTargetBinaryName() = File::createLegalFileName (appTitle); + setExecutableNameForAllTargets (project, File::createLegalFileName (appTitle)); if (createMainCpp) { @@ -265,8 +278,7 @@ public: Project::Item sourceGroup (project.getMainGroup().addNewSubGroup ("Source", 0)); project.getConfigFlag ("JUCE_QUICKTIME") = Project::configFlagDisabled; // disabled because it interferes with RTAS build on PC - for (int i = project.getNumConfigurations(); --i >= 0;) - project.getConfiguration(i).getTargetBinaryName() = File::createLegalFileName (appTitle); + setExecutableNameForAllTargets (project, File::createLegalFileName (appTitle)); String appHeaders (CodeHelpers::createIncludeStatement (project.getAppIncludeFile(), filterCppFile)); diff --git a/extras/Introjucer/Source/Project/jucer_Project.cpp b/extras/Introjucer/Source/Project/jucer_Project.cpp index d1d211eecd..329a82d1f2 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.cpp +++ b/extras/Introjucer/Source/Project/jucer_Project.cpp @@ -37,8 +37,6 @@ namespace Tags const Identifier projectMainGroup ("MAINGROUP"); const Identifier group ("GROUP"); const Identifier file ("FILE"); - const Identifier configurations ("CONFIGURATIONS"); - const Identifier configuration ("CONFIGURATION"); const Identifier exporters ("EXPORTFORMATS"); const Identifier configGroup ("JUCEOPTIONS"); const Identifier modulesGroup ("MODULES"); @@ -112,11 +110,14 @@ void Project::setMissingDefaultValues() if (! projectRoot.hasProperty (Ids::version)) getVersion() = "1.0.0"; - // Create configs group - if (! projectRoot.getChildWithName (Tags::configurations).isValid()) + updateOldStyleConfigList(); + + for (int i = 0; i < getNumExporters(); ++i) { - projectRoot.addChild (ValueTree (Tags::configurations), 0, 0); - createDefaultConfigs(); + ScopedPointer exporter (createExporter(i)); + + if (exporter != nullptr && exporter->getNumConfigurations() == 0) + exporter->createDefaultConfigs(); } if (! projectRoot.getChildWithName (Tags::exporters).isValid()) @@ -131,6 +132,40 @@ void Project::setMissingDefaultValues() addDefaultModules (false); } +void Project::updateOldStyleConfigList() +{ + ValueTree deprecatedConfigsList (projectRoot.getChildWithName (ProjectExporter::configurations)); + + if (deprecatedConfigsList.isValid()) + { + projectRoot.removeChild (deprecatedConfigsList, nullptr); + + for (int i = 0; i < getNumExporters(); ++i) + { + ScopedPointer exporter (createExporter(i)); + + if (exporter != nullptr && exporter->getNumConfigurations() == 0) + { + ValueTree newConfigs (deprecatedConfigsList.createCopy()); + + if (! exporter->isXcode()) + { + for (int j = newConfigs.getNumChildren(); --j >= 0;) + { + ValueTree config (newConfigs.getChild(j)); + + config.removeProperty (Ids::osxSDK, nullptr); + config.removeProperty (Ids::osxCompatibility, nullptr); + config.removeProperty (Ids::osxArchitecture, nullptr); + } + } + + exporter->settings.addChild (newConfigs, 0, nullptr); + } + } + } +} + void Project::addDefaultModules (bool shouldCopyFilesLocally) { addModule ("juce_core", shouldCopyFilesLocally); @@ -862,198 +897,6 @@ String Project::getModuleID (int index) const return projectRoot.getChildWithName (Tags::modulesGroup).getChild (index) [ComponentBuilder::idProperty].toString(); } -//============================================================================== -ValueTree Project::getConfigurations() const -{ - return projectRoot.getChildWithName (Tags::configurations); -} - -int Project::getNumConfigurations() const -{ - return getConfigurations().getNumChildren(); -} - -Project::BuildConfiguration Project::getConfiguration (int index) -{ - jassert (index < getConfigurations().getNumChildren()); - return BuildConfiguration (this, getConfigurations().getChild (index)); -} - -bool Project::hasConfigurationNamed (const String& name) const -{ - const ValueTree configs (getConfigurations()); - for (int i = configs.getNumChildren(); --i >= 0;) - if (configs.getChild(i) [Ids::name].toString() == name) - return true; - - return false; -} - -String Project::getUniqueConfigName (String name) const -{ - String nameRoot (name); - while (CharacterFunctions::isDigit (nameRoot.getLastCharacter())) - nameRoot = nameRoot.dropLastCharacters (1); - - nameRoot = nameRoot.trim(); - - int suffix = 2; - while (hasConfigurationNamed (name)) - name = nameRoot + " " + String (suffix++); - - return name; -} - -void Project::addNewConfiguration (BuildConfiguration* configToCopy) -{ - const String configName (getUniqueConfigName (configToCopy != nullptr ? configToCopy->config [Ids::name].toString() - : "New Build Configuration")); - - ValueTree configs (getConfigurations()); - - if (! configs.isValid()) - { - projectRoot.addChild (ValueTree (Tags::configurations), 0, getUndoManagerFor (projectRoot)); - configs = getConfigurations(); - } - - ValueTree newConfig (Tags::configuration); - if (configToCopy != nullptr) - newConfig = configToCopy->config.createCopy(); - - newConfig.setProperty (Ids::name, configName, 0); - - configs.addChild (newConfig, -1, getUndoManagerFor (configs)); -} - -void Project::deleteConfiguration (int index) -{ - ValueTree configs (getConfigurations()); - configs.removeChild (index, getUndoManagerFor (getConfigurations())); -} - -void Project::createDefaultConfigs() -{ - for (int i = 0; i < 2; ++i) - { - addNewConfiguration (nullptr); - BuildConfiguration config = getConfiguration (i); - - const bool debugConfig = i == 0; - - config.getName() = debugConfig ? "Debug" : "Release"; - config.isDebug() = debugConfig; - config.getOptimisationLevel() = debugConfig ? 1 : 2; - config.getTargetBinaryName() = getProjectFilenameRoot(); - } -} - -//============================================================================== -Project::BuildConfiguration::BuildConfiguration (Project* project_, const ValueTree& configNode) - : project (project_), - config (configNode) -{ -} - -Project::BuildConfiguration::BuildConfiguration (const BuildConfiguration& other) - : project (other.project), - config (other.config) -{ -} - -const Project::BuildConfiguration& Project::BuildConfiguration::operator= (const BuildConfiguration& other) -{ - project = other.project; - config = other.config; - return *this; -} - -Project::BuildConfiguration::~BuildConfiguration() -{ -} - -String Project::BuildConfiguration::getGCCOptimisationFlag() const -{ - const int level = (int) getOptimisationLevel().getValue(); - return String (level <= 1 ? "0" : (level == 2 ? "s" : "3")); -} - -const char* const Project::BuildConfiguration::osxVersionDefault = "default"; -const char* const Project::BuildConfiguration::osxVersion10_4 = "10.4 SDK"; -const char* const Project::BuildConfiguration::osxVersion10_5 = "10.5 SDK"; -const char* const Project::BuildConfiguration::osxVersion10_6 = "10.6 SDK"; - -const char* const Project::BuildConfiguration::osxArch_Default = "default"; -const char* const Project::BuildConfiguration::osxArch_Native = "Native"; -const char* const Project::BuildConfiguration::osxArch_32BitUniversal = "32BitUniversal"; -const char* const Project::BuildConfiguration::osxArch_64BitUniversal = "64BitUniversal"; -const char* const Project::BuildConfiguration::osxArch_64Bit = "64BitIntel"; - -void Project::BuildConfiguration::createPropertyEditors (PropertyListBuilder& props) -{ - props.add (new TextPropertyComponent (getName(), "Name", 96, false), - "The name of this configuration."); - - props.add (new BooleanPropertyComponent (isDebug(), "Debug mode", "Debugging enabled"), - "If enabled, this means that the configuration should be built with debug synbols."); - - const char* optimisationLevels[] = { "No optimisation", "Optimise for size and speed", "Optimise for maximum speed", 0 }; - const int optimisationLevelValues[] = { 1, 2, 3, 0 }; - props.add (new ChoicePropertyComponent (getOptimisationLevel(), "Optimisation", StringArray (optimisationLevels), Array (optimisationLevelValues)), - "The optimisation level for this configuration"); - - props.add (new TextPropertyComponent (getTargetBinaryName(), "Binary name", 256, false), - "The filename to use for the destination binary executable file. Don't add a suffix to this, because platform-specific suffixes will be added for each target platform."); - - props.add (new TextPropertyComponent (getTargetBinaryRelativePath(), "Binary location", 1024, false), - "The folder in which the finished binary should be placed. Leave this blank to cause the binary to be placed in its default location in the build folder."); - - props.add (new TextPropertyComponent (getHeaderSearchPath(), "Header search path", 16384, false), - "Extra header search paths. Use semi-colons to separate multiple paths."); - - props.add (new TextPropertyComponent (getBuildConfigPreprocessorDefs(), "Preprocessor definitions", 32768, false), - "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash."); - - if (getMacSDKVersion().toString().isEmpty()) - getMacSDKVersion() = osxVersionDefault; - - const char* osxVersions[] = { "Use Default", osxVersion10_4, osxVersion10_5, osxVersion10_6, 0 }; - const char* osxVersionValues[] = { osxVersionDefault, osxVersion10_4, osxVersion10_5, osxVersion10_6, 0 }; - - props.add (new ChoicePropertyComponent (getMacSDKVersion(), "OSX Base SDK Version", StringArray (osxVersions), Array (osxVersionValues)), - "The version of OSX to link against in the XCode build."); - - if (getMacCompatibilityVersion().toString().isEmpty()) - getMacCompatibilityVersion() = osxVersionDefault; - - props.add (new ChoicePropertyComponent (getMacCompatibilityVersion(), "OSX Compatibility Version", StringArray (osxVersions), Array (osxVersionValues)), - "The minimum version of OSX that the target binary will be compatible with."); - - const char* osxArch[] = { "Use Default", "Native architecture of build machine", "Universal Binary (32-bit)", "Universal Binary (64-bit)", "64-bit Intel", 0 }; - const char* osxArchValues[] = { osxArch_Default, osxArch_Native, osxArch_32BitUniversal, osxArch_64BitUniversal, osxArch_64Bit, 0 }; - - if (getMacArchitecture().toString().isEmpty()) - getMacArchitecture() = osxArch_Default; - - props.add (new ChoicePropertyComponent (getMacArchitecture(), "OSX Architecture", StringArray (osxArch), Array (osxArchValues)), - "The type of OSX binary that will be produced."); - - props.setPreferredHeight (22); -} - -StringPairArray Project::BuildConfiguration::getAllPreprocessorDefs() const -{ - return mergePreprocessorDefs (project->getPreprocessorDefs(), - parsePreprocessorDefs (getBuildConfigPreprocessorDefs().toString())); -} - -StringArray Project::BuildConfiguration::getHeaderSearchPaths() const -{ - StringArray s; - s.addTokens (getHeaderSearchPath().toString(), ";", String::empty); - return s; -} - //============================================================================== ValueTree Project::getExporters() { diff --git a/extras/Introjucer/Source/Project/jucer_Project.h b/extras/Introjucer/Source/Project/jucer_Project.h index 99ef6da33c..e8da3b176d 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.h +++ b/extras/Introjucer/Source/Project/jucer_Project.h @@ -186,65 +186,6 @@ public: void findAllImageItems (OwnedArray& items); - //============================================================================== - class BuildConfiguration - { - public: - BuildConfiguration (const BuildConfiguration&); - const BuildConfiguration& operator= (const BuildConfiguration&); - ~BuildConfiguration(); - - //============================================================================== - Project& getProject() const { return *project; } - - void createPropertyEditors (PropertyListBuilder&); - - //============================================================================== - Value getName() const { return getValue (Ids::name); } - Value isDebug() const { return getValue (Ids::isDebug); } - Value getTargetBinaryName() const { return getValue (Ids::targetName); } - // the path relative to the build folder in which the binary should go - Value getTargetBinaryRelativePath() const { return getValue (Ids::binaryPath); } - Value getOptimisationLevel() const { return getValue (Ids::optimisation); } - String getGCCOptimisationFlag() const; - Value getBuildConfigPreprocessorDefs() const { return getValue (Ids::defines); } - StringPairArray getAllPreprocessorDefs() const; // includes inherited definitions - Value getHeaderSearchPath() const { return getValue (Ids::headerPath); } - StringArray getHeaderSearchPaths() const; - - static const char* const osxVersionDefault; - static const char* const osxVersion10_4; - static const char* const osxVersion10_5; - static const char* const osxVersion10_6; - Value getMacSDKVersion() const { return getValue (Ids::osxSDK); } - Value getMacCompatibilityVersion() const { return getValue (Ids::osxCompatibility); } - - static const char* const osxArch_Default; - static const char* const osxArch_Native; - static const char* const osxArch_32BitUniversal; - static const char* const osxArch_64BitUniversal; - static const char* const osxArch_64Bit; - Value getMacArchitecture() const { return getValue (Ids::osxArchitecture); } - - //============================================================================== - private: - friend class Project; - Project* project; - ValueTree config; - - Value getValue (const Identifier& name) const { return config.getPropertyAsValue (name, getUndoManager()); } - UndoManager* getUndoManager() const { return project->getUndoManagerFor (config); } - - BuildConfiguration (Project* project, const ValueTree& configNode); - }; - - int getNumConfigurations() const; - BuildConfiguration getConfiguration (int index); - void addNewConfiguration (BuildConfiguration* configToCopy); - void deleteConfiguration (int index); - bool hasConfigurationNamed (const String& name) const; - String getUniqueConfigName (String name) const; - //============================================================================== ValueTree getExporters(); int getNumExporters(); @@ -305,10 +246,11 @@ private: void sanitiseConfigFlags(); void setMissingDefaultValues(); ValueTree getConfigurations() const; - void createDefaultConfigs(); ValueTree getConfigNode(); ValueTree getModulesNode(); + void updateOldStyleConfigList(); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Project); }; diff --git a/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp index dbd3fbd527..560863e5bb 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp @@ -398,20 +398,14 @@ class ProjectSettingsComponent : public Component public: ProjectSettingsComponent (Project& project_) : project (project_), - configs ("Configurations", "Add a New Configuration", false), - exporters ("Export Targets", "Add a New Exporter...", true) + exporters ("Export Targets", "Add a New Exporter...", true, false) { addAndMakeVisible (&mainProjectInfoPanel); addAndMakeVisible (&modulesPanelGroup); - addAndMakeVisible (&configs); addAndMakeVisible (&exporters); - PropertyListBuilder props; - props.add (new ModulesPanel (project)); - modulesPanelGroup.setProperties (props); - modulesPanelGroup.setName ("Modules"); - - createItems(); + mainProjectInfoPanel.backgroundColour = Colours::white.withAlpha (0.3f); + modulesPanelGroup.backgroundColour = Colours::white.withAlpha (0.3f); } void updateSize (int width) @@ -421,7 +415,6 @@ public: int y = 0; y += mainProjectInfoPanel.updateSize (y, width); y += modulesPanelGroup.updateSize (y, width); - y += configs.updateSize (y, width); y += exporters.updateSize (y, width); setSize (width, y); @@ -435,112 +428,152 @@ public: void visibilityChanged() { if (isVisible()) - refreshAll(); + createAllPanels(); } - void refreshAll() + void createModulesPanel() { - { - PropertyListBuilder props; - project.createPropertyEditors (props); - mainProjectInfoPanel.setProperties (props); - mainProjectInfoPanel.setName ("Project Settings"); - } + PropertyListBuilder props; + props.add (new ModulesPanel (project)); + modulesPanelGroup.setProperties (props); + modulesPanelGroup.setName ("Modules"); + } - int i; - for (i = configs.groups.size(); --i >= 0;) - { - PropertyGroup& pp = *configs.groups.getUnchecked(i); + void createProjectPanel() + { + PropertyListBuilder props; + project.createPropertyEditors (props); + mainProjectInfoPanel.setProperties (props); + mainProjectInfoPanel.setName ("Project Settings"); - PropertyListBuilder props; - project.getConfiguration (i).createPropertyEditors (props); - pp.setProperties (props); - } + lastProjectType = project.getProjectTypeValue().getValue(); + } - for (i = exporters.groups.size(); --i >= 0;) + void createExportersPanel() + { + exporters.clear(); + + for (int i = 0; i < project.getNumExporters(); ++i) { - PropertyGroup& pp = *exporters.groups.getUnchecked(i); - PropertyListBuilder props; - ScopedPointer exp (project.createExporter (i)); + PropertyGroup* exporterGroup = exporters.createGroup(); + exporterGroup->backgroundColour = Colours::white.withAlpha (0.3f); + exporterGroup->addDeleteButton ("exporter " + String (i), "Deletes this export target."); + ScopedPointer exp (project.createExporter (i)); jassert (exp != nullptr); + if (exp != nullptr) { + PropertyListBuilder props; exp->createPropertyEditors (props); - pp.setProperties (props); + + PropertyGroupList* configList = new PropertyGroupList ("Configurations", "Add a New Configuration", false, true); + props.add (configList); + exporterGroup->setProperties (props); + + configList->createNewButton.setName ("newconfig " + String (i)); + + for (int j = 0; j < exp->getNumConfigurations(); ++j) + { + PropertyGroup* configGroup = configList->createGroup(); + + if (exp->getNumConfigurations() > 1) + configGroup->addDeleteButton ("config " + String (i) + "/" + String (j), "Deletes this configuration."); + + PropertyListBuilder configProps; + exp->getConfiguration(j)->createPropertyEditors (configProps); + configGroup->setProperties (configProps); + } } } + } - refreshSectionNames(); + void createAllPanels() + { + createProjectPanel(); + createModulesPanel(); + createExportersPanel(); + updateNames(); updateSize (getWidth()); } - void refreshSectionNames() + bool needsFullUpdate() const { - int i; - for (i = configs.groups.size(); --i >= 0;) - { - PropertyGroup& pp = *configs.groups.getUnchecked(i); - pp.setName (project.getConfiguration (i).getName().toString().quoted()); - pp.repaint(); - } + if (exporters.groups.size() != project.getNumExporters() + || lastProjectType != project.getProjectTypeValue().getValue()) + return true; - for (i = exporters.groups.size(); --i >= 0;) + for (int i = exporters.groups.size(); --i >= 0;) { - PropertyGroup& pp = *exporters.groups.getUnchecked(i); ScopedPointer exp (project.createExporter (i)); jassert (exp != nullptr); if (exp != nullptr) - pp.setName (exp->getName()); + { + PropertyGroupList* configList = dynamic_cast (exporters.groups.getUnchecked(i)->properties.getLast()); - pp.repaint(); + if (configList != nullptr && configList->groups.size() != exp->getNumConfigurations()) + return true; + } } + + return false; } - void createItems() + void updateNames() { - configs.clear(); - exporters.clear(); - - int i; - for (i = 0; i < project.getNumConfigurations(); ++i) + for (int i = exporters.groups.size(); --i >= 0;) { - PropertyGroup* p = configs.createGroup(); + PropertyGroup& exporterGroup = *exporters.groups.getUnchecked(i); + ScopedPointer exp (project.createExporter (i)); + jassert (exp != nullptr); - if (project.getNumConfigurations() > 1) - p->addDeleteButton ("config " + String (i), "Deletes this configuration."); - } + if (exp != nullptr) + { + exporterGroup.setName (exp->getName()); + exporterGroup.repaint(); - for (i = 0; i < project.getNumExporters(); ++i) - { - PropertyGroup* p = exporters.createGroup(); - p->addDeleteButton ("exporter " + String (i), "Deletes this export target."); - } + PropertyGroupList* configList = dynamic_cast (exporterGroup.properties.getLast()); - lastProjectType = project.getProjectTypeValue().getValue(); - refreshAll(); + if (configList != nullptr) + { + for (int j = configList->groups.size(); --j >= 0;) + { + PropertyGroup& configGroup = *configList->groups.getUnchecked(j); + configGroup.setName ("Configuration: " + exp->getConfiguration (j)->getName().toString().quoted()); + configGroup.repaint(); + } + } + } + } } void update() { - if (configs.groups.size() != project.getNumConfigurations() - || exporters.groups.size() != project.getNumExporters() - || lastProjectType != project.getProjectTypeValue().getValue()) - { - createItems(); - } - - refreshSectionNames(); + if (needsFullUpdate()) + createAllPanels(); + else + updateNames(); } void deleteButtonClicked (const String& name) { if (name.startsWith ("config")) - project.deleteConfiguration (name.getTrailingIntValue()); + { + int exporterIndex = name.upToLastOccurrenceOf ("/", false, false).getTrailingIntValue(); + int configIndex = name.getTrailingIntValue(); + + ScopedPointer exporter (project.createExporter (exporterIndex)); + jassert (exporter != nullptr); + + if (exporter != nullptr) + exporter->deleteConfiguration (configIndex); + } else + { project.deleteExporter (name.getTrailingIntValue()); + } } static void newExporterMenuItemChosen (int resultCode, ProjectSettingsComponent* settingsComp) @@ -562,17 +595,21 @@ public: ModalCallbackFunction::forComponent (newExporterMenuItemChosen, this)); } - void createNewConfig() + void createNewConfig (int exporterIndex) { - project.addNewConfiguration (nullptr); + ScopedPointer exp (project.createExporter (exporterIndex)); + jassert (exp != nullptr); + + if (exp != nullptr) + exp->addNewConfiguration (nullptr); } void newItemButtonClicked (TextButton& button) { if (button.getName().containsIgnoreCase ("export")) createNewExporter (button); - else - createNewConfig(); + else if (button.getName().containsIgnoreCase ("newconfig")) + createNewConfig (button.getName().getTrailingIntValue()); } private: @@ -614,16 +651,32 @@ private: for (int i = 0; i < properties.size(); ++i) { PropertyComponent* pp = properties.getUnchecked(i); + + PropertyGroupList* pgl = dynamic_cast (pp); + + if (pgl != nullptr) + pgl->updateSize (height, width - 20); + pp->setBounds (10, height, width - 20, pp->getPreferredHeight()); height += pp->getHeight(); } + height += 16; setBounds (0, y, width, height); return height; } void paint (Graphics& g) { + if (! backgroundColour.isTransparent()) + { + g.setColour (backgroundColour); + g.fillRect (0, 0, getWidth(), getHeight() - 10); + + g.setColour (Colours::black.withAlpha (0.4f)); + g.drawRect (0, 0, getWidth(), getHeight() - 10); + } + g.setFont (14.0f, Font::bold); g.setColour (Colours::black); g.drawFittedText (getName(), 12, 0, getWidth() - 16, 28, Justification::bottomLeft, 1); @@ -636,22 +689,25 @@ private: psc->deleteButtonClicked (deleteButton.getName()); } - private: OwnedArray properties; TextButton deleteButton; + Colour backgroundColour; }; //============================================================================== - class PropertyGroupList : public Component, + class PropertyGroupList : public PropertyComponent, public ButtonListener { public: - PropertyGroupList (const String& title, const String& newButtonText, bool triggerOnMouseDown) - : Component (title), createNewButton (newButtonText) + PropertyGroupList (const String& title, const String& newButtonText, + bool triggerOnMouseDown, bool hideNameAndPutButtonAtBottom) + : PropertyComponent (title), createNewButton (newButtonText), + dontDisplayName (hideNameAndPutButtonAtBottom) { addAndMakeVisible (&createNewButton); createNewButton.setColour (TextButton::buttonColourId, Colours::lightgreen.withAlpha (0.5f)); - createNewButton.setBounds ("right - 140, 30, parent.width - 10, top + 20"); + createNewButton.setBounds (hideNameAndPutButtonAtBottom ? "right - 140, parent.height - 25, parent.width - 10, top + 20" + : "right - 140, 30, parent.width - 10, top + 20"); createNewButton.setConnectedEdges (Button::ConnectedOnLeft | Button::ConnectedOnRight); createNewButton.addListener (this); createNewButton.setTriggeredOnMouseDown (triggerOnMouseDown); @@ -659,21 +715,29 @@ private: int updateSize (int ourY, int width) { - int y = 55; + int y = dontDisplayName ? 10 : 55; for (int i = 0; i < groups.size(); ++i) y += groups.getUnchecked(i)->updateSize (y, width); y = jmax (y, 100); setBounds (0, ourY, width, y); + + if (dontDisplayName) + y += 25; + + setPreferredHeight (y); return y; } void paint (Graphics& g) { - g.setFont (17.0f, Font::bold); - g.setColour (Colours::black); - g.drawFittedText (getName(), 0, 30, getWidth(), 20, Justification::centred, 1); + if (! dontDisplayName) + { + g.setFont (17.0f, Font::bold); + g.setColour (Colours::black); + g.drawFittedText (getName(), 0, 30, getWidth(), 20, Justification::centred, 1); + } } void clear() @@ -681,6 +745,8 @@ private: groups.clear(); } + void refresh() {} + PropertyGroup* createGroup() { PropertyGroup* p = new PropertyGroup(); @@ -698,12 +764,13 @@ private: OwnedArray groups; TextButton createNewButton; + bool dontDisplayName; }; Project& project; var lastProjectType; PropertyGroup mainProjectInfoPanel, modulesPanelGroup; - PropertyGroupList configs, exporters; + PropertyGroupList exporters; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectSettingsComponent); }; diff --git a/extras/Introjucer/Source/Utility/jucer_PresetIDs.h b/extras/Introjucer/Source/Utility/jucer_PresetIDs.h index abbe788874..29a0c6e8d1 100644 --- a/extras/Introjucer/Source/Utility/jucer_PresetIDs.h +++ b/extras/Introjucer/Source/Utility/jucer_PresetIDs.h @@ -61,6 +61,7 @@ namespace Ids DECLARE_ID (osxSDK); DECLARE_ID (osxCompatibility); DECLARE_ID (osxArchitecture); + DECLARE_ID (winArchitecture); DECLARE_ID (jucerVersion); DECLARE_ID (projectType); DECLARE_ID (prebuildCommand); diff --git a/extras/JuceDemo/Juce Demo.jucer b/extras/JuceDemo/Juce Demo.jucer index d0e5e0599d..5e8db01b81 100644 --- a/extras/JuceDemo/Juce Demo.jucer +++ b/extras/JuceDemo/Juce Demo.jucer @@ -11,28 +11,73 @@ bigIcon="f4hwldS"> + juceFolder="../../../juce" objCExtraSuffix="JSLvvV6j"> + + + + + + juceFolder="../../../juce" objCExtraSuffix="JSLvvV6j"> + + + + + + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"> + + + + + - + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"> + + + + + + + + + + + + rtasFolder="c:\SDKs\PT_80_SDK" libraryType="1" juceFolder="../../../juce"> + + + + + + androidInternetNeeded="1"> + + + + + - - - - diff --git a/extras/audio plugin demo/JuceDemoPlugin.jucer b/extras/audio plugin demo/JuceDemoPlugin.jucer index 6aa50f38a8..a1f8a681af 100644 --- a/extras/audio plugin demo/JuceDemoPlugin.jucer +++ b/extras/audio plugin demo/JuceDemoPlugin.jucer @@ -11,20 +11,36 @@ bundleIdentifier="com.rawmaterialsoftware.JuceDemoPlugin" jucerVersion="3.0.0"> + juceFolder="../.." objCExtraSuffix="JuceDemo"> + + + + + + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> + + + + + + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> + + + + + + rtasFolder="~/SDKs/PT_80_SDK"> + + + + + - - - - diff --git a/extras/audio plugin host/Plugin Host.jucer b/extras/audio plugin host/Plugin Host.jucer index 8e7e2c77e8..4e7e456bff 100644 --- a/extras/audio plugin host/Plugin Host.jucer +++ b/extras/audio plugin host/Plugin Host.jucer @@ -13,19 +13,35 @@ jucerVersion="3.0.0"> + juceFolder="../.." objCExtraSuffix="M73TRi"> + + + + + + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> + + + + + - + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> + + + + + + + + + + + - - - - diff --git a/extras/binarybuilder/BinaryBuilder.jucer b/extras/binarybuilder/BinaryBuilder.jucer index cc6cef6645..754e32d21e 100644 --- a/extras/binarybuilder/BinaryBuilder.jucer +++ b/extras/binarybuilder/BinaryBuilder.jucer @@ -11,17 +11,28 @@ bundleIdentifier="com.rawmaterialsoftware.binarybuilder"> + juceFolder="../../../juce" objCExtraSuffix="OeJtJb"> + + + + + - + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"> + + + + + + + + + + + - - - - diff --git a/extras/example projects/HelloWorld.jucer b/extras/example projects/HelloWorld.jucer index a830c69203..dd5c3672a8 100644 --- a/extras/example projects/HelloWorld.jucer +++ b/extras/example projects/HelloWorld.jucer @@ -12,21 +12,44 @@ pluginAUViewClass="HelloWorldAU_V1" pluginRTASCategory="" bundleIdentifier="com.rawmaterialsoftware.jucehelloworld"> + juceFolder="../.." objCExtraSuffix="JtTAKTK1s"> + + + + + + juceFolder="../.." objCExtraSuffix="JtTAKTK1s"> + + + + + + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> + + + + + - + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> + + + + + + + + + + + - - - - diff --git a/extras/static library/juce.jucer b/extras/static library/juce.jucer index 02a4e53cdd..c9e8ae3eb1 100644 --- a/extras/static library/juce.jucer +++ b/extras/static library/juce.jucer @@ -4,16 +4,31 @@ juceLinkage="none" bundleIdentifier="com.rawmaterialsoftware.juce" jucerVersion="3.0.0"> - - - + + + + + + + + + + + + + + + + + + - - - - diff --git a/extras/the jucer/Jucer.jucer b/extras/the jucer/Jucer.jucer index 4431b08fea..fde249e760 100644 --- a/extras/the jucer/Jucer.jucer +++ b/extras/the jucer/Jucer.jucer @@ -4,15 +4,31 @@ bundleIdentifier="com.yourcompany.Jucer" jucerVersion="3.0.0" bigIcon="HFdB13"> - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - diff --git a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp index 9365e44a16..247e7cca1c 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp @@ -2171,7 +2171,7 @@ public: void fillRect (const Rectangle& area, const FillType& fill, bool replaceContents) { - jassert (! replaceContents); + (void) replaceContents; jassert (! replaceContents); const Rectangle r (clip.getIntersection (area)); if (! r.isEmpty()) @@ -2605,7 +2605,7 @@ public: void fillRect (const Rectangle& area, const FillType& fill, bool replaceContents) { - jassert (! replaceContents); + (void) replaceContents; jassert (! replaceContents); const Rectangle r (clip.getIntersection (area)); if (! r.isEmpty())