diff --git a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj index 11d1c65690..f1564b75ce 100644 --- a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj +++ b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj @@ -294,6 +294,7 @@ 9F01BA9942D038EA8B5289A8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; 9F2D3E5FC10F7C3270908E97 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ButtonDocument.h"; path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.h"; sourceTree = "SOURCE_ROOT"; }; 9F959ECF8CD9B7314AE604A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LabelHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_LabelHandler.h"; sourceTree = "SOURCE_ROOT"; }; + A081306A9E95CA114B81910F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineSettings.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineSettings.h"; sourceTree = "SOURCE_ROOT"; }; A085174413736ACC8D7D42A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_openGL.h"; path = "../../Source/Wizards/jucer_ProjectWizard_openGL.h"; sourceTree = "SOURCE_ROOT"; }; A0BBBFBA13A1308B3CD725D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentLayoutPanel.h"; path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h"; sourceTree = "SOURCE_ROOT"; }; A160AEF56553A658E6EA6A8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_Window.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -629,6 +630,7 @@ A978DFE87D9BB5EFE5B3DAAC, D2FE76E4CF003856278343CC, BA186B51EE4884CD8E3F2741, + A081306A9E95CA114B81910F, ADD6A3CF5D7DE55E57E8E38B, A9954DC7F876A7006743ACB6, ADA538034910F52FDD2DC88D, diff --git a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj index 4b89de711e..41f6e454d8 100644 --- a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj @@ -1561,6 +1561,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters index 7eaf44b8bf..695f3e93aa 100644 --- a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters @@ -2160,6 +2160,9 @@ Projucer\LiveBuildEngine + + Projucer\LiveBuildEngine + Projucer\LiveBuildEngine diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj index 493948875d..612348f4da 100644 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj @@ -1561,6 +1561,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters index 45f5c8cd7d..22073c7afb 100644 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters @@ -2160,6 +2160,9 @@ Projucer\LiveBuildEngine + + Projucer\LiveBuildEngine + Projucer\LiveBuildEngine diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj index 0246ce0cc9..0bfef28875 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj @@ -1561,6 +1561,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters index 06812923d2..ecaaaa4f75 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters @@ -2160,6 +2160,9 @@ Projucer\LiveBuildEngine + + Projucer\LiveBuildEngine + Projucer\LiveBuildEngine diff --git a/extras/Projucer/Projucer.jucer b/extras/Projucer/Projucer.jucer index 41e48d9147..db9bc2c9c3 100644 --- a/extras/Projucer/Projucer.jucer +++ b/extras/Projucer/Projucer.jucer @@ -516,6 +516,8 @@ resource="0" file="Source/LiveBuildEngine/jucer_CompileEngineServer.cpp"/> + canLaunchProject()) defs.add (exporter->getExporterIdentifierMacro() + "=1"); @@ -422,7 +349,7 @@ private: if (projectItem.shouldBeCompiled()) { - const File f (projectItem.getFile()); + auto f = projectItem.getFile(); if (f.exists()) compileUnits.add (f); @@ -430,7 +357,7 @@ private: if (projectItem.shouldBeAddedToTargetProject() && ! projectItem.shouldBeAddedToBinaryResources()) { - const File f (projectItem.getFile()); + auto f = projectItem.getFile(); if (f.exists()) userFiles.add (f); @@ -455,11 +382,11 @@ private: { if (exporter->canLaunchProject()) { - for (const LibraryModule* m : modules) + for (auto* m : modules) { - const File localModuleFolder = proj.getModules().shouldCopyModuleFilesLocally (m->moduleInfo.getID()).getValue() - ? proj.getLocalModuleFolder (m->moduleInfo.getID()) - : m->moduleInfo.getFolder(); + auto localModuleFolder = proj.getModules().shouldCopyModuleFilesLocally (m->moduleInfo.getID()).getValue() + ? proj.getLocalModuleFolder (m->moduleInfo.getID()) + : m->moduleInfo.getFolder(); m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits, @@ -477,14 +404,14 @@ private: for (int i = 0; ; ++i) { - const File binaryDataCpp (proj.getBinaryDataCppFile (i)); + auto binaryDataCpp = proj.getBinaryDataCppFile (i); if (! binaryDataCpp.exists()) break; compileUnits.add (binaryDataCpp); } - for (int i = compileUnits.size(); --i >= 0;) + for (auto i = compileUnits.size(); --i >= 0;) if (compileUnits.getReference(i).hasFileExtension (".r")) compileUnits.remove (i); @@ -493,14 +420,14 @@ private: static bool doesProjectMatchSavedHeaderState (Project& project) { - ValueTree liveModules (project.getProjectRoot().getChildWithName (Ids::MODULES)); + auto liveModules = project.getProjectRoot().getChildWithName (Ids::MODULES); ScopedPointer xml (XmlDocument::parse (project.getFile())); if (xml == nullptr || ! xml->hasTagName (Ids::JUCERPROJECT.toString())) return false; - ValueTree diskModules (ValueTree::fromXml (*xml).getChildWithName (Ids::MODULES)); + auto diskModules = ValueTree::fromXml (*xml).getChildWithName (Ids::MODULES); return liveModules.isEquivalentTo (diskModules); } @@ -521,14 +448,15 @@ private: { StringArray paths; paths.add (project.getGeneratedCodeFolder().getFullPathName()); - paths.addArray (getSearchPathsFromString (ProjectProperties::getUserHeaderPathValue (project).get().toString())); + paths.addArray (getSearchPathsFromString (project.getCompileEngineSettings().getUserHeaderPathString())); + return convertSearchPathsToAbsolute (paths); } StringArray getSystemIncludePaths() { StringArray paths; - paths.addArray (getSearchPathsFromString (ProjectProperties::getSystemHeaderPathValue (project).get().toString())); + paths.addArray (getSearchPathsFromString (project.getCompileEngineSettings().getSystemHeaderPathString())); auto isVST3Host = project.getModules().isModuleEnabled ("juce_audio_processors") && project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3"); @@ -558,10 +486,10 @@ private: StringArray getExtraDLLs() { - StringArray dlls; - dlls.addTokens (ProjectProperties::getExtraDLLsValue (project).get().toString(), "\n\r,", StringRef()); + auto dlls = StringArray::fromTokens (project.getCompileEngineSettings().getExtraDLLsString(), "\n\r,", {}); dlls.trim(); dlls.removeEmptyStrings(); + return dlls; } @@ -570,14 +498,11 @@ private: //============================================================================== CompileEngineChildProcess::CompileEngineChildProcess (Project& p) - : project (p), - continuousRebuild (false) + : project (p) { ProjucerApplication::getApp().openDocumentManager.addListener (this); - createProcess(); - - errorList.setWarningsEnabled (! LiveBuildProjectSettings::areWarningsDisabled (project)); + errorList.setWarningsEnabled (project.getCompileEngineSettings().areWarningsEnabled()); } CompileEngineChildProcess::~CompileEngineChildProcess() @@ -773,7 +698,7 @@ private: void timerCallback() override { - if (owner.continuousRebuild) + if (owner.project.getCompileEngineSettings().isContinuousRebuildEnabled()) flushEditorChanges(); else stopTimer(); @@ -911,11 +836,6 @@ void CompileEngineChildProcess::handlePing() } //============================================================================== -void CompileEngineChildProcess::setContinuousRebuild (bool b) -{ - continuousRebuild = b; -} - void CompileEngineChildProcess::flushEditorChanges() { for (Editor* ed : editors) @@ -967,7 +887,7 @@ void CompileEngineChildProcess::handleHighlightCode (const SourceCodeRange& loca void CompileEngineChildProcess::cleanAllCachedFilesForProject (Project& p) { - File cacheFolder (ProjectProperties::getCacheLocation (p)); + File cacheFolder (getCacheLocationForProject (p)); if (cacheFolder.isDirectory()) cacheFolder.deleteRecursively(); diff --git a/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h b/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h index 4e59717001..0ca0a35897 100644 --- a/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h +++ b/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h @@ -38,33 +38,38 @@ public: CompileEngineChildProcess (Project&); ~CompileEngineChildProcess(); + //============================================================================== bool openedOk() const { return process != nullptr; } void editorOpened (const File& file, CodeDocument& document); bool documentAboutToClose (OpenDocumentManager::Document*) override; + //============================================================================== void cleanAll(); void openPreview (const ClassDatabase::Class&); void reinstantiatePreviews(); void processActivationChanged (bool isForeground); + //============================================================================== bool canLaunchApp() const; void launchApp(); bool canKillApp() const; void killApp(); bool isAppRunning() const noexcept; + //============================================================================== const ClassDatabase::ClassList& getComponentList() const { return lastComponentList; } - void setContinuousRebuild (bool continuousBuild); + //============================================================================== void flushEditorChanges(); - static void cleanAllCachedFilesForProject (Project&); + //============================================================================== Project& project; ActivityList activityList; ErrorList errorList; + //============================================================================== std::function crashHandler; //============================================================================== @@ -93,7 +98,6 @@ private: class ChildProcess; ScopedPointer process, runningAppProcess; ClassDatabase::ClassList lastComponentList; - bool continuousRebuild; struct Editor; OwnedArray editors; @@ -153,16 +157,3 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessCache) }; - -//============================================================================== -struct LiveBuildProjectSettings -{ - static void getLiveSettings (Project&, PropertyListBuilder&); - static void updateNewlyOpenedProject (Project& p); - - static bool isBuildDisabled (Project&); - static void setBuildDisabled (Project&, bool); - - static bool areWarningsDisabled (Project&); - static void setWarningsDisabled (Project&, bool); -}; diff --git a/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineSettings.h b/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineSettings.h new file mode 100644 index 0000000000..1374bee87d --- /dev/null +++ b/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineSettings.h @@ -0,0 +1,110 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2017 - ROLI Ltd. + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 5 End-User License + Agreement and JUCE 5 Privacy Policy (both updated and effective as of the + 27th April 2017). + + End User License Agreement: www.juce.com/juce-5-licence + Privacy Policy: www.juce.com/juce-5-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + + +//============================================================================== +class CompileEngineSettings +{ +public: + CompileEngineSettings (ValueTree& projectRoot) + : tree (projectRoot.getOrCreateChildWithName ("LIVE_SETTINGS", nullptr) + .getOrCreateChildWithName (getLiveSettingsSubType(), nullptr)), + buildEnabledValue (tree, Ids::buildEnabled, nullptr, false), + continuousRebuildEnabledValue (tree, Ids::continuousRebuildEnabled, nullptr, false), + warningsEnabledValue (tree, Ids::warningsEnabled, nullptr, true), + userHeaderPathValue (tree, Ids::headerPath, nullptr), + systemHeaderPathValue (tree, Ids::systemHeaderPath, nullptr), + extraDLLsValue (tree, Ids::extraDLLs, nullptr), + extraCompilerFlagsValue (tree, Ids::extraCompilerFlags, nullptr), + extraPreprocessorDefsValue (tree, Ids::defines, nullptr), + windowsTargetPlatformValue (tree, Ids::windowsTargetPlatformVersion, nullptr, "10.0.16299.0") + { + } + + //============================================================================== + void setBuildEnabled (bool enabled) noexcept { buildEnabledValue = enabled; } + void setContinuousRebuildEnabled (bool enabled) noexcept { continuousRebuildEnabledValue = enabled; } + void setWarningsEnabled (bool enabled) { warningsEnabledValue = enabled; } + + bool isBuildEnabled() const noexcept { return buildEnabledValue.get(); } + bool isContinuousRebuildEnabled() const noexcept { return continuousRebuildEnabledValue.get(); } + bool areWarningsEnabled() const noexcept { return warningsEnabledValue.get(); } + + String getUserHeaderPathString() const noexcept { return userHeaderPathValue.get(); } + String getSystemHeaderPathString() const noexcept { return systemHeaderPathValue.get(); } + String getExtraDLLsString() const noexcept { return extraDLLsValue.get(); } + String getExtraCompilerFlagsString() const noexcept { return extraCompilerFlagsValue.get(); } + String getExtraPreprocessorDefsString() const noexcept { return extraPreprocessorDefsValue.get(); } + String getWindowsTargetPlatformVersionString() const noexcept { return windowsTargetPlatformValue.get(); } + + //============================================================================== + void getLiveSettings (PropertyListBuilder& props) + { + props.addSearchPathProperty (userHeaderPathValue, "User Header Paths", "User header search paths."); + props.addSearchPathProperty (systemHeaderPathValue, "System Header Paths", "System header search paths."); + + props.add (new TextPropertyComponent (extraPreprocessorDefsValue, "Preprocessor Definitions", 32768, true), + "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 (extraCompilerFlagsValue, "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 (extraDLLsValue, "Extra Dynamic Libraries", 2048, true), + "Extra dynamic libs that the running code may require. Use new-lines or commas to separate the items."); + + props.add (new TextPropertyComponent (windowsTargetPlatformValue, "Windows Target Platform", 256, false), + "The Windows target platform to use."); + } + +private: + ValueTree tree; + + ValueWithDefault buildEnabledValue, continuousRebuildEnabledValue, warningsEnabledValue, userHeaderPathValue, systemHeaderPathValue, + extraDLLsValue, extraCompilerFlagsValue, extraPreprocessorDefsValue, windowsTargetPlatformValue; + + //============================================================================== + String getLiveSettingsSubType() const noexcept + { + #if JUCE_MAC + return "OSX"; + #elif JUCE_WINDOWS + return "WINDOWS"; + #elif JUCE_LINUX + return "LINUX"; + #endif + + // unknown platform?! + jassertfalse; + + return {}; + } + + //============================================================================== +}; diff --git a/extras/Projucer/Source/Project/UI/Sidebar/jucer_LiveBuildTab.h b/extras/Projucer/Source/Project/UI/Sidebar/jucer_LiveBuildTab.h index 4e8d0c54a3..c4e6064fe2 100644 --- a/extras/Projucer/Source/Project/UI/Sidebar/jucer_LiveBuildTab.h +++ b/extras/Projucer/Source/Project/UI/Sidebar/jucer_LiveBuildTab.h @@ -35,7 +35,7 @@ struct LiveBuildSettingsComponent : public Component addAndMakeVisible (&group); PropertyListBuilder props; - LiveBuildProjectSettings::getLiveSettings (p, props); + p.getCompileEngineSettings().getLiveSettings (props); group.setProperties (props); group.setName ("Live Build Settings"); diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp index 1f0ce9363e..1179e1c373 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp @@ -1168,7 +1168,7 @@ void ProjectContentComponent::setBuildEnabled (bool isEnabled, bool displayError if (! displayError) lastCrashMessage = {}; - LiveBuildProjectSettings::setBuildDisabled (*project, ! isEnabled); + project->getCompileEngineSettings().setBuildEnabled (isEnabled); killChildProcess(); refreshTabsIfBuildStatusChanged(); @@ -1208,7 +1208,7 @@ void ProjectContentComponent::handleCrash (const String& message) bool ProjectContentComponent::isBuildEnabled() const { - return project != nullptr && ! LiveBuildProjectSettings::isBuildDisabled (*project) + return project != nullptr && project->getCompileEngineSettings().isBuildEnabled() && CompileEngineDLL::getInstance()->isLoaded(); } @@ -1222,7 +1222,7 @@ void ProjectContentComponent::refreshTabsIfBuildStatusChanged() bool ProjectContentComponent::areWarningsEnabled() const { - return project != nullptr && ! LiveBuildProjectSettings::areWarningsDisabled (*project); + return project != nullptr && project->getCompileEngineSettings().areWarningsEnabled(); } void ProjectContentComponent::updateWarningState() @@ -1235,7 +1235,7 @@ void ProjectContentComponent::toggleWarnings() { if (project != nullptr) { - LiveBuildProjectSettings::setWarningsDisabled (*project, areWarningsEnabled()); + project->getCompileEngineSettings().setWarningsEnabled (! areWarningsEnabled()); updateWarningState(); } } @@ -1314,16 +1314,14 @@ void ProjectContentComponent::timerCallback() bool ProjectContentComponent::isContinuousRebuildEnabled() { - return getAppSettings().getGlobalProperties().getBoolValue ("continuousRebuild", true); + return project != nullptr && project->getCompileEngineSettings().isContinuousRebuildEnabled(); } void ProjectContentComponent::setContinuousRebuildEnabled (bool b) { - if (childProcess != nullptr) + if (project != nullptr && childProcess != nullptr) { - childProcess->setContinuousRebuild (b); - - getAppSettings().getGlobalProperties().setValue ("continuousRebuild", b); + project->getCompileEngineSettings().setContinuousRebuildEnabled (b); ProjucerApplication::getCommandManager().commandStatusChanged(); } } @@ -1331,13 +1329,8 @@ void ProjectContentComponent::setContinuousRebuildEnabled (bool b) ReferenceCountedObjectPtr ProjectContentComponent::getChildProcess() { if (childProcess == nullptr && isBuildEnabled()) - { childProcess = ProjucerApplication::getApp().childProcessCache->getOrCreate (*project); - if (childProcess != nullptr) - childProcess->setContinuousRebuild (isContinuousRebuildEnabled()); - } - return childProcess; } diff --git a/extras/Projucer/Source/Project/jucer_Project.h b/extras/Projucer/Source/Project/jucer_Project.h index c94be38d1d..445235a764 100644 --- a/extras/Projucer/Source/Project/jucer_Project.h +++ b/extras/Projucer/Source/Project/jucer_Project.h @@ -27,6 +27,7 @@ #pragma once #include "jucer_ProjectType.h" +#include "../LiveBuildEngine/jucer_CompileEngineSettings.h" class ProjectExporter; class LibraryModule; @@ -347,6 +348,9 @@ public: //============================================================================== bool shouldSendGUIBuilderAnalyticsEvent() noexcept; + //============================================================================== + CompileEngineSettings& getCompileEngineSettings() { return compileEngineSettings; } + private: ValueTree projectRoot { Ids::JUCERPROJECT }; @@ -361,6 +365,9 @@ private: pluginAUMainTypeValue, pluginRTASCategoryValue, pluginRTASBypassDisabledValue, pluginRTASMultiMonoDisabledValue, pluginAAXIdentifierValue, pluginAAXCategoryValue, pluginAAXBypassDisabledValue, pluginAAXMultiMonoDisabledValue; + //============================================================================== + CompileEngineSettings compileEngineSettings { projectRoot }; + //============================================================================== File tempDirectory = {}; bool openInIDEAfterSaving = false; diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h index deeb2012e1..045e9cf92d 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h @@ -321,6 +321,9 @@ namespace Ids DECLARE_ID (website); DECLARE_ID (mainClass); DECLARE_ID (moduleFlags); + DECLARE_ID (buildEnabled); + DECLARE_ID (continuousRebuildEnabled); + DECLARE_ID (warningsEnabled); const Identifier ID ("id"); const Identifier ID_uppercase ("ID");