| @@ -14,21 +14,42 @@ | |||
| bigIcon="rVgowdy"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| juceFolder="../.." documentExtensions=".jucer" objCExtraSuffix="zNNCr"/> | |||
| juceFolder="../.." documentExtensions=".jucer" objCExtraSuffix="zNNCr"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Introjucer" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Introjucer" | |||
| osxSDK="default" osxCompatibility="10.5 SDK" osxArchitecture="32BitUniversal"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_MAC> | |||
| <VS2005 targetFolder="Builds/VisualStudio2005" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Introjucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Introjucer"/> | |||
| </CONFIGURATIONS> | |||
| </VS2005> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"/> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../.."/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Introjucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Introjucer"/> | |||
| </CONFIGURATIONS> | |||
| </VS2008> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../.."> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Introjucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Introjucer"/> | |||
| </CONFIGURATIONS> | |||
| </LINUX_MAKE> | |||
| <VS2010 targetFolder="Builds/VisualStudio2010" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" libraryType="1" juceFolder="../.."/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" libraryType="1" juceFolder="../.."> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Introjucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Introjucer"/> | |||
| </CONFIGURATIONS> | |||
| </VS2010> | |||
| </EXPORTFORMATS> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Introjucer" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Introjucer" | |||
| osxSDK="default" osxCompatibility="10.5 SDK" osxArchitecture="32BitUniversal"/> | |||
| </CONFIGURATIONS> | |||
| <MAINGROUP name="The Introjucer" id="NhrJq66R"> | |||
| <GROUP id="mslFIKZ" name="Application"> | |||
| <FILE id="PXX8Yi" name="jucer_Application.h" compile="0" resource="0" | |||
| @@ -141,6 +141,28 @@ public: | |||
| writeStringsFile (target.getChildFile ("res/values/strings.xml")); | |||
| } | |||
| protected: | |||
| //============================================================================== | |||
| class AndroidBuildConfiguration : public BuildConfiguration | |||
| { | |||
| public: | |||
| AndroidBuildConfiguration (Project& project, const ValueTree& settings) | |||
| : BuildConfiguration (project, settings) | |||
| { | |||
| } | |||
| void createPropertyEditors (PropertyListBuilder& props) | |||
| { | |||
| createBasicPropertyEditors (props); | |||
| } | |||
| }; | |||
| BuildConfiguration::Ptr createBuildConfig (const ValueTree& settings) const | |||
| { | |||
| return new AndroidBuildConfiguration (project, settings); | |||
| } | |||
| private: | |||
| //============================================================================== | |||
| XmlElement* createManifestXML() | |||
| @@ -261,7 +283,7 @@ private: | |||
| return flags + newLine; | |||
| } | |||
| String createIncludePathFlags (const Project::BuildConfiguration& config) | |||
| String createIncludePathFlags (const BuildConfiguration& config) | |||
| { | |||
| String flags; | |||
| StringArray searchPaths (extraSearchPaths); | |||
| @@ -281,11 +303,13 @@ private: | |||
| if (forDebug) | |||
| flags << " -g"; | |||
| for (int i = 0; i < configs.size(); ++i) | |||
| for (int i = 0; i < getNumConfigurations(); ++i) | |||
| { | |||
| if (configs.getReference(i).isDebug() == forDebug) | |||
| const BuildConfiguration::Ptr config (getConfiguration(i)); | |||
| if (config->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; | |||
| } | |||
| } | |||
| @@ -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<var> (archTypes))); | |||
| } | |||
| }; | |||
| BuildConfiguration::Ptr createBuildConfig (const ValueTree& settings) const | |||
| { | |||
| return new VC2010BuildConfiguration (project, settings); | |||
| } | |||
| static bool is64Bit (const BuildConfiguration& config) | |||
| { | |||
| return dynamic_cast <const VC2010BuildConfiguration&> (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)"); | |||
| } | |||
| @@ -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<RelativePath>& 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); | |||
| @@ -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<var> (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<var> (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<var> (osxArchValues)), | |||
| "The type of OSX binary that will be produced."); | |||
| } | |||
| }; | |||
| BuildConfiguration::Ptr createBuildConfig (const ValueTree& settings) const | |||
| { | |||
| return new XcodeBuildConfiguration (project, settings); | |||
| } | |||
| private: | |||
| OwnedArray<ValueTree> 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 <XcodeBuildConfiguration&> (*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); | |||
| @@ -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<var> (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; | |||
| } | |||
| @@ -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: <foo/bar.h> 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<BuildConfiguration> 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<Project::BuildConfiguration> configs; | |||
| ValueTree settings; | |||
| Project::Item* modulesGroup; | |||
| virtual BuildConfiguration::Ptr createBuildConfig (const ValueTree&) const = 0; | |||
| static String getDefaultBuildsRootFolder() { return "Builds/"; } | |||
| static String getLibbedFilename (String name) | |||
| @@ -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<ProjectExporter> 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)); | |||
| @@ -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<ProjectExporter> 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<ProjectExporter> 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<var> (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<var> (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<var> (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<var> (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() | |||
| { | |||
| @@ -186,65 +186,6 @@ public: | |||
| void findAllImageItems (OwnedArray<Item>& 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); | |||
| }; | |||
| @@ -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 <ProjectExporter> 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 <ProjectExporter> 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 <ProjectExporter> exp (project.createExporter (i)); | |||
| jassert (exp != nullptr); | |||
| if (exp != nullptr) | |||
| pp.setName (exp->getName()); | |||
| { | |||
| PropertyGroupList* configList = dynamic_cast <PropertyGroupList*> (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 <ProjectExporter> 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 <PropertyGroupList*> (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<ProjectExporter> 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<ProjectExporter> 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 <PropertyGroupList*> (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<PropertyComponent> 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<PropertyGroup> 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); | |||
| }; | |||
| @@ -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); | |||
| @@ -11,28 +11,73 @@ | |||
| bigIcon="f4hwldS"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| juceFolder="../../../juce" objCExtraSuffix="JSLvvV6j"/> | |||
| juceFolder="../../../juce" objCExtraSuffix="JSLvvV6j"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" | |||
| osxSDK="default" osxCompatibility="default" defines="JUCE_UNIT_TESTS=1" | |||
| osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" | |||
| osxSDK="default" osxCompatibility="10.4 SDK" defines="JUCE_UNIT_TESTS=1" | |||
| osxArchitecture="32BitUniversal"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_MAC> | |||
| <XCODE_IPHONE targetFolder="Builds/iOS" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| juceFolder="../../../juce" objCExtraSuffix="JSLvvV6j"/> | |||
| juceFolder="../../../juce" objCExtraSuffix="JSLvvV6j"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" | |||
| osxSDK="default" osxCompatibility="default" defines="JUCE_UNIT_TESTS=1" | |||
| osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" | |||
| osxSDK="default" osxCompatibility="10.4 SDK" defines="JUCE_UNIT_TESTS=1" | |||
| osxArchitecture="32BitUniversal"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_IPHONE> | |||
| <VS2005 targetFolder="Builds/VisualStudio2005" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1"/> | |||
| </CONFIGURATIONS> | |||
| </VS2005> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"/> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../../../juce"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1"/> | |||
| </CONFIGURATIONS> | |||
| </VS2008> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../../../juce"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1"/> | |||
| </CONFIGURATIONS> | |||
| </LINUX_MAKE> | |||
| <VS2010 targetFolder="Builds/VisualStudio2010" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" libraryType="1" juceFolder="../../../juce"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" libraryType="1" juceFolder="../../../juce"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1" winArchitecture="32-bit"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1" winArchitecture="32-bit"/> | |||
| </CONFIGURATIONS> | |||
| </VS2010> | |||
| <ANDROID targetFolder="Builds/Android" androidSDKPath="${user.home}/SDKs/android-sdk-macosx" | |||
| androidNDKPath="${user.home}/SDKs/android-ndk-r7" juceFolder="../../../juce" | |||
| androidInternetNeeded="1"/> | |||
| androidInternetNeeded="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" | |||
| defines="JUCE_UNIT_TESTS=1"/> | |||
| </CONFIGURATIONS> | |||
| </ANDROID> | |||
| </EXPORTFORMATS> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" | |||
| osxSDK="default" osxCompatibility="default" defines="JUCE_UNIT_TESTS=1" | |||
| osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" | |||
| osxSDK="default" osxCompatibility="10.4 SDK" defines="JUCE_UNIT_TESTS=1" | |||
| osxArchitecture="32BitUniversal"/> | |||
| </CONFIGURATIONS> | |||
| <MAINGROUP id="0bU7ypLe" name="Juce Demo"> | |||
| <FILE id="Bnqll1Mk0" name="ApplicationStartup.cpp" compile="1" resource="0" | |||
| file="Source/ApplicationStartup.cpp"/> | |||
| @@ -11,20 +11,36 @@ | |||
| bundleIdentifier="com.rawmaterialsoftware.JuceDemoPlugin" jucerVersion="3.0.0"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| juceFolder="../.." objCExtraSuffix="JuceDemo"/> | |||
| juceFolder="../.." objCExtraSuffix="JuceDemo"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemoPlugin" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemoPlugin" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_MAC> | |||
| <VS2005 targetFolder="Builds/VisualStudio2005" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemoPlugin"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemoPlugin"/> | |||
| </CONFIGURATIONS> | |||
| </VS2005> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemoPlugin"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemoPlugin"/> | |||
| </CONFIGURATIONS> | |||
| </VS2008> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../.." | |||
| rtasFolder="~/SDKs/PT_80_SDK"/> | |||
| rtasFolder="~/SDKs/PT_80_SDK"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemoPlugin"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemoPlugin"/> | |||
| </CONFIGURATIONS> | |||
| </LINUX_MAKE> | |||
| </EXPORTFORMATS> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemoPlugin" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemoPlugin" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| </CONFIGURATIONS> | |||
| <MAINGROUP id="dYAMo6Ykd" name="JuceDemoPlugin"> | |||
| <FILE id="gFFr0hbSp" name="PluginProcessor.cpp" compile="1" resource="0" | |||
| file="Source/PluginProcessor.cpp"/> | |||
| @@ -13,19 +13,35 @@ | |||
| jucerVersion="3.0.0"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| juceFolder="../.." objCExtraSuffix="M73TRi"/> | |||
| juceFolder="../.." objCExtraSuffix="M73TRi"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Plugin Host" | |||
| osxSDK="default" osxCompatibility="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Plugin Host" | |||
| osxSDK="default" osxCompatibility="10.5 SDK" osxArchitecture="32BitUniversal"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_MAC> | |||
| <VS2005 targetFolder="Builds/VisualStudio2005" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Plugin Host"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Plugin Host"/> | |||
| </CONFIGURATIONS> | |||
| </VS2005> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"/> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../.."/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Plugin Host"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Plugin Host"/> | |||
| </CONFIGURATIONS> | |||
| </VS2008> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../.."> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Plugin Host"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Plugin Host"/> | |||
| </CONFIGURATIONS> | |||
| </LINUX_MAKE> | |||
| </EXPORTFORMATS> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Plugin Host" | |||
| osxSDK="default" osxCompatibility="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Plugin Host" | |||
| osxSDK="default" osxCompatibility="10.5 SDK" osxArchitecture="32BitUniversal"/> | |||
| </CONFIGURATIONS> | |||
| <MAINGROUP id="YdWL7hi7p" name="Plugin Host"> | |||
| <FILE id="8tLeuntR4" name="FilterGraph.cpp" compile="1" resource="0" | |||
| file="Source/FilterGraph.cpp"/> | |||
| @@ -11,17 +11,28 @@ | |||
| bundleIdentifier="com.rawmaterialsoftware.binarybuilder"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| juceFolder="../../../juce" objCExtraSuffix="OeJtJb"/> | |||
| juceFolder="../../../juce" objCExtraSuffix="OeJtJb"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="BinaryBuilder" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="BinaryBuilder" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_MAC> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"/> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../../../juce"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../../../juce" libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="BinaryBuilder"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="BinaryBuilder"/> | |||
| </CONFIGURATIONS> | |||
| </VS2008> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../../../juce"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="BinaryBuilder"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="BinaryBuilder"/> | |||
| </CONFIGURATIONS> | |||
| </LINUX_MAKE> | |||
| </EXPORTFORMATS> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="BinaryBuilder" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="BinaryBuilder" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| </CONFIGURATIONS> | |||
| <MAINGROUP id="TTBP5JihO" name="BinaryBuilder"> | |||
| <GROUP id="noYkBuTg" name="Source"> | |||
| <FILE id="4QwydNA9f" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/> | |||
| @@ -12,21 +12,44 @@ | |||
| pluginAUViewClass="HelloWorldAU_V1" pluginRTASCategory="" bundleIdentifier="com.rawmaterialsoftware.jucehelloworld"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| juceFolder="../.." objCExtraSuffix="JtTAKTK1s"/> | |||
| juceFolder="../.." objCExtraSuffix="JtTAKTK1s"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="HelloWorld" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="HelloWorld" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_MAC> | |||
| <XCODE_IPHONE targetFolder="Builds/iOS" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| juceFolder="../.." objCExtraSuffix="JtTAKTK1s"/> | |||
| juceFolder="../.." objCExtraSuffix="JtTAKTK1s"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="HelloWorld" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="HelloWorld" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_IPHONE> | |||
| <VS2005 targetFolder="Builds/VisualStudio2005" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="HelloWorld"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="HelloWorld"/> | |||
| </CONFIGURATIONS> | |||
| </VS2005> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4" | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"/> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../.."/> | |||
| rtasFolder="c:\SDKs\PT_80_SDK" juceFolder="../.." libraryType="1"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="HelloWorld"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="HelloWorld"/> | |||
| </CONFIGURATIONS> | |||
| </VS2008> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../.."> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="HelloWorld"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="HelloWorld"/> | |||
| </CONFIGURATIONS> | |||
| </LINUX_MAKE> | |||
| </EXPORTFORMATS> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="HelloWorld" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="HelloWorld" | |||
| osxSDK="1" osxCompatibility="1"/> | |||
| </CONFIGURATIONS> | |||
| <MAINGROUP id="a0m6ZvX1F" name="HelloWorld"> | |||
| <GROUP id="GVpTv8yA5" name="Source"> | |||
| <FILE id="wm1yCLKYK" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/> | |||
| @@ -4,16 +4,31 @@ | |||
| juceLinkage="none" bundleIdentifier="com.rawmaterialsoftware.juce" | |||
| jucerVersion="3.0.0"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" objCExtraSuffix="cbgo2s" juceFolder="../../../juce"/> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" libraryType="1" juceFolder="../../../juce"/> | |||
| <VS2010 targetFolder="Builds/VisualStudio2010" libraryType="1" juceFolder="../../../juce"/> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" objCExtraSuffix="cbgo2s" juceFolder="../../../juce"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="jucedebug" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="juce" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_MAC> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" libraryType="1" juceFolder="../../../juce"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="jucedebug" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="juce" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| </CONFIGURATIONS> | |||
| </VS2008> | |||
| <VS2010 targetFolder="Builds/VisualStudio2010" libraryType="1" juceFolder="../../../juce"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="jucedebug" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="juce" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| </CONFIGURATIONS> | |||
| </VS2010> | |||
| </EXPORTFORMATS> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="jucedebug" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="juce" | |||
| osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> | |||
| </CONFIGURATIONS> | |||
| <MAINGROUP id="tNa6Wh" name="juce"> | |||
| <GROUP id="N2ZGxS" name="Source"/> | |||
| </MAINGROUP> | |||
| @@ -4,15 +4,31 @@ | |||
| bundleIdentifier="com.yourcompany.Jucer" jucerVersion="3.0.0" | |||
| bigIcon="HFdB13"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" objCExtraSuffix="wQBvzo" juceFolder="../.."/> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" libraryType="1" juceFolder="../.."/> | |||
| <VS2010 targetFolder="Builds/VisualStudio2010" libraryType="1" juceFolder="../.."/> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" juceFolder="../.."/> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" objCExtraSuffix="wQBvzo" juceFolder="../.."> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Jucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Jucer"/> | |||
| </CONFIGURATIONS> | |||
| </XCODE_MAC> | |||
| <VS2008 targetFolder="Builds/VisualStudio2008" libraryType="1" juceFolder="../.."> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Jucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Jucer"/> | |||
| </CONFIGURATIONS> | |||
| </VS2008> | |||
| <VS2010 targetFolder="Builds/VisualStudio2010" libraryType="1" juceFolder="../.."> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Jucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Jucer"/> | |||
| </CONFIGURATIONS> | |||
| </VS2010> | |||
| <LINUX_MAKE targetFolder="Builds/Linux" juceFolder="../.."> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Jucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Jucer"/> | |||
| </CONFIGURATIONS> | |||
| </LINUX_MAKE> | |||
| </EXPORTFORMATS> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Jucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="Jucer"/> | |||
| </CONFIGURATIONS> | |||
| <MAINGROUP id="ba5BEZ" name="Jucer"> | |||
| <GROUP id="{417804F2-13A6-72FD-F93D-5821DBB93EBE}" name="src"> | |||
| <GROUP id="{CBEEAC5A-1CD0-80DB-7D92-99E502259E6A}" name="model"> | |||
| @@ -2171,7 +2171,7 @@ public: | |||
| void fillRect (const Rectangle<int>& area, const FillType& fill, bool replaceContents) | |||
| { | |||
| jassert (! replaceContents); | |||
| (void) replaceContents; jassert (! replaceContents); | |||
| const Rectangle<int> r (clip.getIntersection (area)); | |||
| if (! r.isEmpty()) | |||
| @@ -2605,7 +2605,7 @@ public: | |||
| void fillRect (const Rectangle<int>& area, const FillType& fill, bool replaceContents) | |||
| { | |||
| jassert (! replaceContents); | |||
| (void) replaceContents; jassert (! replaceContents); | |||
| const Rectangle<int> r (clip.getIntersection (area)); | |||
| if (! r.isEmpty()) | |||