From 1f037d9d639752d4eb7a2df4791f70c73df70c12 Mon Sep 17 00:00:00 2001 From: John Byrd Date: Wed, 20 Sep 2017 23:52:45 -0700 Subject: Add precompiled header support to the Projucer for exports into Visual Studio. --- 3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h | 1 + 1 file changed, 1 insertion(+) diff --git a/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h b/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h index 12a8ece..f2c33ae 100644 --- a/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h +++ b/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h @@ -505,6 +505,7 @@ public: { precompiledHeaders->addTextElement("Use"); cl->createNewChildElement("PrecompiledHeaderFile")->addTextElement(getOwner().getPrecompiledHeaderFileNameString()); + cl->createNewChildElement("ForcedIncludeFiles")->addTextElement(getOwner().getPrecompiledHeaderFileNameString()); } cl->addChildElement(precompiledHeaders); cl->createNewChildElement ("AssemblerListingLocation")->addTextElement ("$(IntDir)\\"); -- 2.10.0.windows.1 From a605f3f77cb01c68665d2e61af4f0555d3df87c7 Mon Sep 17 00:00:00 2001 From: John Byrd Date: Wed, 20 Sep 2017 22:25:01 -0700 Subject: [PATCH] Precompiled header support for Windows builds using Juce. Added "Use precompiled headers" and "Precompiled Header File Name" options to Projucer. --- .../Project Saving/jucer_ProjectExport_MSVC.h | 21 ++++++++++++++++++++- .../Source/Project Saving/jucer_ProjectExporter.cpp | 12 +++++++++++- .../Source/Project Saving/jucer_ProjectExporter.h | 8 +++++++- .../Projucer/Source/Project/jucer_Project.cpp | 5 +++++ .../extras/Projucer/Source/Project/jucer_Project.h | 3 +++ .../Projucer/Source/Utility/jucer_PresetIDs.h | 2 ++ 6 files changed, 48 insertions(+), 3 deletions(-) diff --git a/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h b/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h index eff6772..12a8ece 100644 --- a/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h +++ b/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h @@ -499,7 +499,14 @@ public: cl->createNewChildElement ("RuntimeLibrary")->addTextElement (runtimeDLL ? (isDebug ? "MultiThreadedDebugDLL" : "MultiThreadedDLL") : (isDebug ? "MultiThreadedDebug" : "MultiThreaded")); cl->createNewChildElement ("RuntimeTypeInfo")->addTextElement ("true"); - cl->createNewChildElement ("PrecompiledHeader"); + + XmlElement* precompiledHeaders = new XmlElement("PrecompiledHeader"); + if (getOwner().getUsePrecompiledHeadersBool()) + { + precompiledHeaders->addTextElement("Use"); + cl->createNewChildElement("PrecompiledHeaderFile")->addTextElement(getOwner().getPrecompiledHeaderFileNameString()); + } + cl->addChildElement(precompiledHeaders); cl->createNewChildElement ("AssemblerListingLocation")->addTextElement ("$(IntDir)\\"); cl->createNewChildElement ("ObjectFileName")->addTextElement ("$(IntDir)\\"); cl->createNewChildElement ("ProgramDataBaseFileName")->addTextElement ("$(IntDir)\\"); @@ -705,6 +712,18 @@ public: if (! projectItem.shouldBeCompiled()) e->createNewChildElement ("ExcludedFromBuild")->addTextElement ("true"); + + if (getOwner().getUsePrecompiledHeadersBool()) + { + String precompiledHeaderFileName = getOwner().getPrecompiledHeaderFileNameString(); + String precompiledHeaderBaseName = + precompiledHeaderFileName.substring(0, precompiledHeaderFileName.lastIndexOfChar('.')); + if (precompiledHeaderBaseName == path.getFileNameWithoutExtension()) + { + e->createNewChildElement("PrecompiledHeader")->addTextElement("Create"); + } + + } } } else if (path.hasFileExtension (headerFileExtensions)) diff --git a/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExporter.cpp b/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExporter.cpp index e1627f1..c4285f5 100644 --- a/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExporter.cpp +++ b/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExporter.cpp @@ -269,7 +269,17 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) "Additional libraries to link (one per line). You should not add any platform specific decoration to these names. " "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); - if (! isVisualStudio()) + props.add (new BooleanPropertyComponent(getUsePrecompiledHeaders(), "Use Precompiled Headers", "Use Precompiled Headers"), + "Enable this to generate precompiled headers with the project. Make sure to set the precompiled header " + "file name as well."); + + props.add( new TextPropertyComponent(getPrecompiledHeaderFileName(), "Precompiled Header File Name", 1024, false), + "The name of the .hpp or .h precompiled header file to be used. Enter the name of a header file already in your project. " + "On Windows platforms, you should create a corresponding .cpp file with the same base name of this header file, and add it " + "to this project. That .cpp " + "file should contain exactly one line, and that is: #include \"your_precompiled_header_file_name\" ."); + + if (!isVisualStudio()) props.add (new BooleanPropertyComponent (getShouldUseGNUExtensionsValue(), "GNU Compiler Extensions", "Enabled"), "Enabling this will use the GNU C++ language standard variant for compilation."); diff --git a/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExporter.h b/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExporter.h index 1b058ee..4ae8d7e 100644 --- a/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExporter.h +++ b/3p/juce/extras/Projucer/Source/Project Saving/jucer_ProjectExporter.h @@ -149,7 +149,13 @@ public: Value getExternalLibraries() { return getSetting (Ids::externalLibraries); } String getExternalLibrariesString() const { return getSearchPathsFromString (getSettingString (Ids::externalLibraries)).joinIntoString (";"); } - Value getUserNotes() { return getSetting (Ids::userNotes); } + Value getUsePrecompiledHeaders() { return getSetting (Ids::usePrecompiledHeaders); } + bool getUsePrecompiledHeadersBool() const { return (getSettingString (Ids::usePrecompiledHeaders) == "1"); } + Value getPrecompiledHeaderFileName() { return getSetting (Ids::precompiledHeaderFileName); } + String getPrecompiledHeaderFileNameString() const + { return (getSettingString (Ids::precompiledHeaderFileName)); } + + Value getUserNotes() { return getSetting (Ids::userNotes); } Value getVST3PathValue() const { return vst3Path; } Value getRTASPathValue() const { return rtasPath; } diff --git a/3p/juce/extras/Projucer/Source/Project/jucer_Project.cpp b/3p/juce/extras/Projucer/Source/Project/jucer_Project.cpp index 31a2a80..3ff5e77 100644 --- a/3p/juce/extras/Projucer/Source/Project/jucer_Project.cpp +++ b/3p/juce/extras/Projucer/Source/Project/jucer_Project.cpp @@ -132,6 +132,11 @@ void Project::setMissingDefaultValues() if (! projectRoot.hasProperty (Ids::version)) getVersionValue() = "1.0.0"; + if (! projectRoot.hasProperty (Ids::usePrecompiledHeaders)) + getUsePrecompiledHeaders() = false; + if (!projectRoot.hasProperty(Ids::precompiledHeaderFileName)) + getPrecompiledHeaderFileName() = ""; + updateOldStyleConfigList(); moveOldPropertyFromProjectToAllExporters (Ids::bigIcon); moveOldPropertyFromProjectToAllExporters (Ids::smallIcon); diff --git a/3p/juce/extras/Projucer/Source/Project/jucer_Project.h b/3p/juce/extras/Projucer/Source/Project/jucer_Project.h index f1c2eb3..f217476 100644 --- a/3p/juce/extras/Projucer/Source/Project/jucer_Project.h +++ b/3p/juce/extras/Projucer/Source/Project/jucer_Project.h @@ -102,6 +102,9 @@ public: Value getCppStandardValue() { return getProjectValue (Ids::cppLanguageStandard); } + Value getUsePrecompiledHeaders() { return getProjectValue (Ids::usePrecompiledHeaders); } + Value getPrecompiledHeaderFileName() { return getProjectValue (Ids::precompiledHeaderFileName); } + //============================================================================== Value getProjectValue (const Identifier& name) { return projectRoot.getPropertyAsValue (name, getUndoManagerFor (projectRoot)); } var getProjectVar (const Identifier& name) const { return projectRoot.getProperty (name); } diff --git a/3p/juce/extras/Projucer/Source/Utility/jucer_PresetIDs.h b/3p/juce/extras/Projucer/Source/Utility/jucer_PresetIDs.h index 74fd523..3d01b43 100644 --- a/3p/juce/extras/Projucer/Source/Utility/jucer_PresetIDs.h +++ b/3p/juce/extras/Projucer/Source/Utility/jucer_PresetIDs.h @@ -49,6 +49,8 @@ namespace Ids DECLARE_ID (displaySplashScreen); DECLARE_ID (reportAppUsage); DECLARE_ID (splashScreenColour); + DECLARE_ID (usePrecompiledHeaders); + DECLARE_ID (precompiledHeaderFileName); DECLARE_ID (position); DECLARE_ID (source); DECLARE_ID (width); -- 2.10.0.windows.1