mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Introjucer: Added an Xcode post-build script setting. Enlarged some of the settings page boxes, allowing multi-line text entry for some paths and preprocessor settings. Moved the modules list to its own tree-item.
This commit is contained in:
parent
3974e09c9f
commit
ead42bd39a
12 changed files with 109 additions and 70 deletions
|
|
@ -75,10 +75,13 @@ public:
|
|||
|
||||
//==============================================================================
|
||||
Value getPListToMergeValue() { return getSetting ("customPList"); }
|
||||
String getPListToMergeString() const { return settings ["customPList"]; }
|
||||
String getPListToMergeString() const { return settings ["customPList"]; }
|
||||
|
||||
Value getExtraFrameworksValue() { return getSetting (Ids::extraFrameworks); }
|
||||
String getExtraFrameworksString() const { return settings [Ids::extraFrameworks]; }
|
||||
String getExtraFrameworksString() const { return settings [Ids::extraFrameworks]; }
|
||||
|
||||
Value getPostBuildScriptValue() { return getSetting (Ids::postbuildCommand); }
|
||||
String getPostBuildScript() const { return settings [Ids::postbuildCommand]; }
|
||||
|
||||
int getLaunchPreferenceOrderForCurrentOS()
|
||||
{
|
||||
|
|
@ -138,6 +141,9 @@ public:
|
|||
props.add (new ChoicePropertyComponent (getLibraryType(), "Library Type",
|
||||
StringArray (libTypes), Array<var> (libTypeValues)));
|
||||
}
|
||||
|
||||
props.add (new TextPropertyComponent (getPostBuildScriptValue(), "Post-build shell script", 32768, true),
|
||||
"Some shell-script that will be run after a build completes.");
|
||||
}
|
||||
|
||||
void launchProject()
|
||||
|
|
@ -615,14 +621,6 @@ private:
|
|||
{
|
||||
StringArray s;
|
||||
|
||||
{
|
||||
String srcRoot = rebaseFromProjectFolderToBuildTarget (RelativePath (".", RelativePath::projectFolder)).toUnixStyle();
|
||||
if (srcRoot.endsWith ("/."))
|
||||
srcRoot = srcRoot.dropLastCharacters (2);
|
||||
|
||||
s.add ("SRCROOT = " + srcRoot.quoted());
|
||||
}
|
||||
|
||||
const String arch (config.getMacArchitecture());
|
||||
if (arch == osxArch_Native) s.add ("ARCHS = \"$(ARCHS_NATIVE)\"");
|
||||
else if (arch == osxArch_32BitUniversal) s.add ("ARCHS = \"$(ARCHS_STANDARD_32_BIT)\"");
|
||||
|
|
@ -1131,15 +1129,15 @@ private:
|
|||
|
||||
void addShellScriptPhase() const
|
||||
{
|
||||
if (xcodeShellScript.isNotEmpty())
|
||||
if (getPostBuildScript().isNotEmpty())
|
||||
{
|
||||
ValueTree* const v = addBuildPhase ("PBXShellScriptBuildPhase", StringArray());
|
||||
v->setProperty (Ids::name, xcodeShellScriptTitle, 0);
|
||||
v->setProperty (Ids::name, "Post-build script", 0);
|
||||
v->setProperty ("shellPath", "/bin/sh", 0);
|
||||
v->setProperty ("shellScript", xcodeShellScript.replace ("\\", "\\\\")
|
||||
.replace ("\"", "\\\"")
|
||||
.replace ("\r\n", "\\n")
|
||||
.replace ("\n", "\\n"), 0);
|
||||
v->setProperty ("shellScript", getPostBuildScript().replace ("\\", "\\\\")
|
||||
.replace ("\"", "\\\"")
|
||||
.replace ("\r\n", "\\n")
|
||||
.replace ("\n", "\\n"), 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -209,12 +209,13 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props)
|
|||
for (int i = 0; i < modules.size(); ++i)
|
||||
modules.getUnchecked(i)->createPropertyEditors (*this, props);
|
||||
|
||||
props.add (new TextPropertyComponent (getExporterPreprocessorDefs(), "Extra 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.add (new TextPropertyComponent (getExporterPreprocessorDefs(), "Extra Preprocessor Definitions", 32768, true),
|
||||
"Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, "
|
||||
"or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash.");
|
||||
|
||||
props.add (new TextPropertyComponent (getExtraCompilerFlags(), "Extra compiler flags", 2048, false),
|
||||
props.add (new TextPropertyComponent (getExtraCompilerFlags(), "Extra compiler flags", 2048, true),
|
||||
"Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the form ${NAME_OF_DEFINITION}, which will be replaced with their values.");
|
||||
props.add (new TextPropertyComponent (getExtraLinkerFlags(), "Extra linker flags", 2048, false),
|
||||
props.add (new TextPropertyComponent (getExtraLinkerFlags(), "Extra linker flags", 2048, true),
|
||||
"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.");
|
||||
|
||||
{
|
||||
|
|
@ -500,17 +501,12 @@ void ProjectExporter::BuildConfiguration::createBasicPropertyEditors (PropertyLi
|
|||
"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 (getHeaderSearchPathValue(), "Header search paths", 16384, false),
|
||||
"Extra header search paths. Use semi-colons to separate multiple paths.");
|
||||
props.addSearchPathProperty (getHeaderSearchPathValue(), "Header search paths", "Extra header search paths.");
|
||||
props.addSearchPathProperty (getLibrarySearchPathValue(), "Extra library search paths", "Extra library search paths.");
|
||||
|
||||
props.add (new TextPropertyComponent (getLibrarySearchPathValue(), "Extra library search paths", 16384, false),
|
||||
"Extra library 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);
|
||||
props.add (new TextPropertyComponent (getBuildConfigPreprocessorDefs(), "Preprocessor definitions", 32768, true),
|
||||
"Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, or "
|
||||
"new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash.");
|
||||
}
|
||||
|
||||
StringPairArray ProjectExporter::BuildConfiguration::getAllPreprocessorDefs() const
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ public:
|
|||
String getExtraCompilerFlagsString() const { return getSettingString (Ids::extraCompilerFlags); }
|
||||
|
||||
Value getExtraLinkerFlags() { return getSetting (Ids::extraLinkerFlags); }
|
||||
String getExtraLinkerFlagsString() const { return getSettingString (Ids::extraLinkerFlags); }
|
||||
String getExtraLinkerFlagsString() const { return getSettingString (Ids::extraLinkerFlags).replaceCharacters ("\r\n", " "); }
|
||||
|
||||
// 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;
|
||||
|
|
@ -130,8 +130,7 @@ public:
|
|||
//==============================================================================
|
||||
String xcodePackageType, xcodeBundleSignature, xcodeBundleExtension;
|
||||
String xcodeProductType, xcodeProductInstallPath, xcodeFileType;
|
||||
String xcodeShellScript, xcodeShellScriptTitle, xcodeOtherRezFlags;
|
||||
String xcodeExcludedFiles64Bit;
|
||||
String xcodeOtherRezFlags, xcodeExcludedFiles64Bit;
|
||||
bool xcodeIsBundle, xcodeCreatePList, xcodeCanUseDwarf;
|
||||
StringArray xcodeFrameworks;
|
||||
Array<RelativePath> xcodeExtraLibrariesDebug, xcodeExtraLibrariesRelease;
|
||||
|
|
|
|||
|
|
@ -240,6 +240,10 @@ namespace RTASHelpers
|
|||
else
|
||||
getRTASFolder (exporter) = "~/SDKs/PT_80_SDK";
|
||||
}
|
||||
|
||||
if (exporter.settings [Ids::postbuildCommand].toString().isEmpty())
|
||||
exporter.getSetting (Ids::postbuildCommand) = String::fromUTF8 (BinaryData::AudioPluginXCodeScript_txt,
|
||||
BinaryData::AudioPluginXCodeScript_txtSize);
|
||||
}
|
||||
|
||||
static void addExtraSearchPaths (ProjectExporter& exporter)
|
||||
|
|
@ -345,7 +349,7 @@ namespace RTASHelpers
|
|||
|
||||
exporter.msvcDelayLoadedDLLs = "DAE.dll; DigiExt.dll; DSI.dll; PluginLib.dll; DSPManager.dll";
|
||||
|
||||
if (! exporter.getExtraLinkerFlags().toString().contains ("/FORCE:multiple"))
|
||||
if (! exporter.getExtraLinkerFlagsString().contains ("/FORCE:multiple"))
|
||||
exporter.getExtraLinkerFlags() = exporter.getExtraLinkerFlags().toString() + " /FORCE:multiple";
|
||||
|
||||
for (ProjectExporter::ConfigIterator config (exporter); config.next();)
|
||||
|
|
|
|||
|
|
@ -373,8 +373,6 @@ void Project::createPropertyEditors (PropertyListBuilder& props)
|
|||
|
||||
props.add (new TextPropertyComponent (getProjectPreprocessorDefs(), "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);
|
||||
}
|
||||
|
||||
String Project::getVersionAsHex() const
|
||||
|
|
|
|||
|
|
@ -281,7 +281,6 @@ public:
|
|||
{
|
||||
ChoicePropertyComponent* c = new ChoicePropertyComponent (flags[i]->value, flags[i]->symbol, possibleValues, mappings);
|
||||
c->setTooltip (flags[i]->description);
|
||||
c->setPreferredHeight (22);
|
||||
props.add (c);
|
||||
}
|
||||
}
|
||||
|
|
@ -644,13 +643,12 @@ struct ProjectSettingsTreeClasses
|
|||
void valueTreeChildOrderChanged (ValueTree&) {}
|
||||
void valueTreeParentChanged (ValueTree&) {}
|
||||
|
||||
static void updateSizes (Component& comp, PropertyGroup* groups, int numGroups)
|
||||
static void updateSize (Component& comp, PropertyGroup& group)
|
||||
{
|
||||
const int width = jmax (550, comp.getParentWidth() - 20);
|
||||
|
||||
int y = 0;
|
||||
for (int i = 0; i < numGroups; ++i)
|
||||
y += groups[i].updateSize (12, y, width - 12);
|
||||
y += group.updateSize (12, y, width - 12);
|
||||
|
||||
comp.setSize (width, y);
|
||||
}
|
||||
|
|
@ -746,7 +744,7 @@ struct ProjectSettingsTreeClasses
|
|||
parentSizeChanged();
|
||||
}
|
||||
|
||||
void parentSizeChanged() { updateSizes (*this, &group, 1); }
|
||||
void parentSizeChanged() { updateSize (*this, group); }
|
||||
|
||||
private:
|
||||
PropertyGroup group;
|
||||
|
|
@ -875,7 +873,7 @@ struct ProjectSettingsTreeClasses
|
|||
parentSizeChanged();
|
||||
}
|
||||
|
||||
void parentSizeChanged() { updateSizes (*this, &group, 1); }
|
||||
void parentSizeChanged() { updateSize (*this, group); }
|
||||
|
||||
private:
|
||||
PropertyGroup group;
|
||||
|
|
@ -886,6 +884,58 @@ struct ProjectSettingsTreeClasses
|
|||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ExporterItem);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class ModulesItem : public SettingsItemBase
|
||||
{
|
||||
public:
|
||||
ModulesItem (Project& project_) : project (project_) {}
|
||||
|
||||
bool isRoot() const { return false; }
|
||||
bool canBeSelected() const { return true; }
|
||||
bool mightContainSubItems() { return false; }
|
||||
String getUniqueName() const { return project.getProjectUID() + "_modules"; }
|
||||
String getRenamingName() const { return getDisplayName(); }
|
||||
String getDisplayName() const { return "Modules"; }
|
||||
void setName (const String&) {}
|
||||
bool isMissing() { return false; }
|
||||
const Drawable* getIcon() const { return project.getMainGroup().getIcon(); }
|
||||
void showDocument() { showSettingsPage (new SettingsComp (project)); }
|
||||
|
||||
private:
|
||||
Project& project;
|
||||
|
||||
//==============================================================================
|
||||
class SettingsComp : public Component
|
||||
{
|
||||
public:
|
||||
SettingsComp (Project& project_) : project (project_)
|
||||
{
|
||||
addAndMakeVisible (&group);
|
||||
|
||||
PropertyListBuilder props;
|
||||
props.add (new ModulesPanel (project));
|
||||
group.setProperties (props);
|
||||
group.setName ("Modules");
|
||||
|
||||
parentSizeChanged();
|
||||
}
|
||||
|
||||
void parentSizeChanged()
|
||||
{
|
||||
updateSize (*this, group);
|
||||
}
|
||||
|
||||
private:
|
||||
Project& project;
|
||||
var lastProjectType;
|
||||
PropertyGroup group;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp);
|
||||
};
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModulesItem);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class RootItem : public SettingsItemBase
|
||||
{
|
||||
|
|
@ -909,6 +959,8 @@ struct ProjectSettingsTreeClasses
|
|||
|
||||
void addSubItems()
|
||||
{
|
||||
addSubItem (new ModulesItem (project));
|
||||
|
||||
int i = 0;
|
||||
for (Project::ExporterIterator exporter (project); exporter.next(); ++i)
|
||||
addSubItem (new ExporterItem (project, exporter.exporter.release(), i));
|
||||
|
|
@ -971,10 +1023,9 @@ struct ProjectSettingsTreeClasses
|
|||
SettingsComp (Project& project_)
|
||||
: project (project_)
|
||||
{
|
||||
addAndMakeVisible (&groups[0]);
|
||||
addAndMakeVisible (&groups[1]);
|
||||
addAndMakeVisible (&group);
|
||||
|
||||
createAllPanels();
|
||||
updatePropertyList();
|
||||
project.addChangeListener (this);
|
||||
}
|
||||
|
||||
|
|
@ -985,38 +1036,30 @@ struct ProjectSettingsTreeClasses
|
|||
|
||||
void parentSizeChanged()
|
||||
{
|
||||
updateSizes (*this, groups, 2);
|
||||
updateSize (*this, group);
|
||||
}
|
||||
|
||||
void createAllPanels()
|
||||
void updatePropertyList()
|
||||
{
|
||||
{
|
||||
PropertyListBuilder props;
|
||||
project.createPropertyEditors (props);
|
||||
groups[0].setProperties (props);
|
||||
groups[0].setName ("Project Settings");
|
||||
|
||||
lastProjectType = project.getProjectTypeValue().getValue();
|
||||
}
|
||||
|
||||
PropertyListBuilder props;
|
||||
props.add (new ModulesPanel (project));
|
||||
groups[1].setProperties (props);
|
||||
groups[1].setName ("Modules");
|
||||
project.createPropertyEditors (props);
|
||||
group.setProperties (props);
|
||||
group.setName ("Project Settings");
|
||||
|
||||
lastProjectType = project.getProjectTypeValue().getValue();
|
||||
parentSizeChanged();
|
||||
}
|
||||
|
||||
void changeListenerCallback (ChangeBroadcaster*)
|
||||
{
|
||||
if (lastProjectType != project.getProjectTypeValue().getValue())
|
||||
createAllPanels();
|
||||
updatePropertyList();
|
||||
}
|
||||
|
||||
private:
|
||||
Project& project;
|
||||
var lastProjectType;
|
||||
PropertyGroup groups[2];
|
||||
PropertyGroup group;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -275,9 +275,6 @@ public:
|
|||
exporter.xcodeProductType = "com.apple.product-type.bundle";
|
||||
exporter.xcodeProductInstallPath = "$(HOME)/Library/Audio/Plug-Ins/Components/";
|
||||
|
||||
exporter.xcodeShellScriptTitle = "Copy to the different plugin folders";
|
||||
exporter.xcodeShellScript = String::fromUTF8 (BinaryData::AudioPluginXCodeScript_txt, BinaryData::AudioPluginXCodeScript_txtSize);
|
||||
|
||||
exporter.xcodeOtherRezFlags = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64"
|
||||
" -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers"
|
||||
" -I \\\"$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase\\\"";
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ String replacePreprocessorDefs (const StringPairArray& definitions, String sourc
|
|||
StringArray getSearchPathsFromString (const String& searchPath)
|
||||
{
|
||||
StringArray s;
|
||||
s.addTokens (searchPath, ";", String::empty);
|
||||
s.addTokens (searchPath, ";\r\n", String::empty);
|
||||
s.trim();
|
||||
s.removeEmptyStrings();
|
||||
s.removeDuplicates (false);
|
||||
|
|
|
|||
|
|
@ -91,6 +91,12 @@ public:
|
|||
add (propertyComp);
|
||||
}
|
||||
|
||||
void addSearchPathProperty (const Value& value, const String& name, const String& mainHelpText)
|
||||
{
|
||||
add (new TextPropertyComponent (value, name, 16384, true),
|
||||
mainHelpText + " Use semi-colons or new-lines to separate multiple paths.");
|
||||
}
|
||||
|
||||
void setPreferredHeight (int height)
|
||||
{
|
||||
for (int j = components.size(); --j >= 0;)
|
||||
|
|
|
|||
|
|
@ -2539,8 +2539,8 @@ void LookAndFeel::drawPropertyComponentLabel (Graphics& g, int, int height,
|
|||
|
||||
const Rectangle<int> LookAndFeel::getPropertyComponentContentPosition (PropertyComponent& component)
|
||||
{
|
||||
return Rectangle<int> (component.getWidth() / 3, 1,
|
||||
component.getWidth() - component.getWidth() / 3 - 1, component.getHeight() - 3);
|
||||
const int textW = jmin (200, component.getWidth() / 3);
|
||||
return Rectangle<int> (textW, 1, component.getWidth() - textW - 1, component.getHeight() - 3);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -114,9 +114,7 @@ protected:
|
|||
*/
|
||||
int preferredHeight;
|
||||
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertyComponent);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ void TextPropertyComponent::createEditor (const int maxNumChars, const bool isMu
|
|||
if (isMultiLine)
|
||||
{
|
||||
textEditor->setJustificationType (Justification::topLeft);
|
||||
preferredHeight = 120;
|
||||
preferredHeight = 100;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue