Browse Source

Changed the introjucer's config list system: each exporter now contains its own list of configs. If you load an old project, its global config list will be copied into each of its exporters. Added x64 support for VC2010 projects, as an option in its configs.

tags/2021-05-28
jules 13 years ago
parent
commit
2e664976ec
20 changed files with 959 additions and 558 deletions
  1. +32
    -11
      extras/Introjucer/Introjucer.jucer
  2. +33
    -9
      extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h
  3. +136
    -72
      extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h
  4. +29
    -8
      extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h
  5. +81
    -19
      extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h
  6. +153
    -6
      extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp
  7. +66
    -11
      extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h
  8. +18
    -6
      extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp
  9. +41
    -198
      extras/Introjucer/Source/Project/jucer_Project.cpp
  10. +2
    -60
      extras/Introjucer/Source/Project/jucer_Project.h
  11. +151
    -84
      extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp
  12. +1
    -0
      extras/Introjucer/Source/Utility/jucer_PresetIDs.h
  13. +60
    -15
      extras/JuceDemo/Juce Demo.jucer
  14. +26
    -10
      extras/audio plugin demo/JuceDemoPlugin.jucer
  15. +26
    -10
      extras/audio plugin host/Plugin Host.jucer
  16. +20
    -9
      extras/binarybuilder/BinaryBuilder.jucer
  17. +34
    -11
      extras/example projects/HelloWorld.jucer
  18. +24
    -9
      extras/static library/juce.jucer
  19. +24
    -8
      extras/the jucer/Jucer.jucer
  20. +2
    -2
      modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp

+ 32
- 11
extras/Introjucer/Introjucer.jucer View File

@@ -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"


+ 33
- 9
extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h View File

@@ -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;
}
}


+ 136
- 72
extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h View File

@@ -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)");
}


+ 29
- 8
extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h View File

@@ -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);


+ 81
- 19
extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h View File

@@ -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);


+ 153
- 6
extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp View File

@@ -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;
}

+ 66
- 11
extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h View File

@@ -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)


+ 18
- 6
extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp View File

@@ -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));


+ 41
- 198
extras/Introjucer/Source/Project/jucer_Project.cpp View File

@@ -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()
{


+ 2
- 60
extras/Introjucer/Source/Project/jucer_Project.h View File

@@ -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);
};


+ 151
- 84
extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp View File

@@ -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);
};


+ 1
- 0
extras/Introjucer/Source/Utility/jucer_PresetIDs.h View File

@@ -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);


+ 60
- 15
extras/JuceDemo/Juce Demo.jucer View File

@@ -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"/>


+ 26
- 10
extras/audio plugin demo/JuceDemoPlugin.jucer View File

@@ -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"/>


+ 26
- 10
extras/audio plugin host/Plugin Host.jucer View File

@@ -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"/>


+ 20
- 9
extras/binarybuilder/BinaryBuilder.jucer View File

@@ -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"/>


+ 34
- 11
extras/example projects/HelloWorld.jucer View File

@@ -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"/>


+ 24
- 9
extras/static library/juce.jucer View File

@@ -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>


+ 24
- 8
extras/the jucer/Jucer.jucer View File

@@ -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">


+ 2
- 2
modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp View File

@@ -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())


Loading…
Cancel
Save