From b0bd31b3c26d097504784178caf4bc5261e70cb3 Mon Sep 17 00:00:00 2001 From: hogliux Date: Wed, 26 Oct 2022 09:56:45 +0200 Subject: [PATCH] Projucer: Fix an issue with per-file compiler flags not being respected --- .../Projucer/Source/Project/jucer_Project.cpp | 3 +- .../jucer_ProjectExport_Android.h | 2 +- .../jucer_ProjectExport_CodeBlocks.h | 2 +- .../ProjectSaving/jucer_ProjectExport_MSVC.h | 2 +- .../ProjectSaving/jucer_ProjectExport_Make.h | 2 +- .../ProjectSaving/jucer_ProjectExport_Xcode.h | 2 +- .../ProjectSaving/jucer_ProjectExporter.cpp | 30 +++++++++++++++---- .../ProjectSaving/jucer_ProjectExporter.h | 5 +++- 8 files changed, 36 insertions(+), 12 deletions(-) diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp index afce453d89..6f350c4be4 100644 --- a/extras/Projucer/Source/Project/jucer_Project.cpp +++ b/extras/Projucer/Source/Project/jucer_Project.cpp @@ -1723,7 +1723,8 @@ Value Project::Item::getShouldSkipPCHValue() { return state.getPr bool Project::Item::shouldSkipPCH() const { return isModuleCode() || state [Ids::skipPCH]; } Value Project::Item::getCompilerFlagSchemeValue() { return state.getPropertyAsValue (Ids::compilerFlagScheme, getUndoManager()); } -String Project::Item::getCompilerFlagSchemeString() const { return state [Ids::compilerFlagScheme]; } + +String Project::Item::getCompilerFlagSchemeString() const { return state[Ids::compilerFlagScheme]; } void Project::Item::setCompilerFlagScheme (const String& scheme) { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h index 0881b76f53..d585bfe6fe 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h @@ -1402,7 +1402,7 @@ private: } else { - auto extraFlags = compilerFlagSchemesMap[projectItem.getCompilerFlagSchemeString()].get().toString(); + auto extraFlags = getCompilerFlagsForProjectItem (projectItem); if (extraFlags.isNotEmpty()) extraCompilerFlags.add ({ file, extraFlags }); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h index 08e698ea34..8d1c04b31f 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h @@ -761,7 +761,7 @@ private: if (projectItem.shouldBeCompiled()) { - auto extraCompilerFlags = compilerFlagSchemesMap[projectItem.getCompilerFlagSchemeString()].get().toString(); + auto extraCompilerFlags = getCompilerFlagsForProjectItem (projectItem); if (extraCompilerFlags.isNotEmpty()) { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h index 86f6310d53..c7b85ea209 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h @@ -912,7 +912,7 @@ public: if (projectItem.shouldBeCompiled()) { - auto extraCompilerFlags = owner.compilerFlagSchemesMap[projectItem.getCompilerFlagSchemeString()].get().toString(); + auto extraCompilerFlags = getOwner().getCompilerFlagsForProjectItem (projectItem); if (shouldAddBigobjFlag (path)) { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h index a685f872ee..a84cdc9372 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h @@ -933,7 +933,7 @@ private: if (shouldFileBeCompiledByDefault (f)) { auto scheme = projectItem.getCompilerFlagSchemeString(); - auto flags = compilerFlagSchemesMap[scheme].get().toString(); + auto flags = getCompilerFlagsForProjectItem (projectItem); if (scheme.isNotEmpty() && flags.isNotEmpty()) results.emplace_back (f, scheme); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index c12a24d683..89709052ea 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -3213,7 +3213,7 @@ private: xcodeTarget = getTargetOfType (project.getTargetTypeFromFilePath (projectItem.getFile(), false)); return addFile (FileOptions().withRelativePath (path) - .withCompilerFlags (compilerFlagSchemesMap[projectItem.getCompilerFlagSchemeString()].get()) + .withCompilerFlags (getCompilerFlagsForProjectItem (projectItem)) .withCompilationEnabled (projectItem.shouldBeCompiled()) .withAddToBinaryResourcesEnabled (projectItem.shouldBeAddedToBinaryResources()) .withAddToXcodeResourcesEnabled (projectItem.shouldBeAddedToXcodeResources()) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp index 423072ce20..c21e817c85 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp @@ -507,6 +507,14 @@ String ProjectExporter::replacePreprocessorTokens (const ProjectExporter::BuildC sourceString); } +String ProjectExporter::getCompilerFlagsForProjectItem (const Project::Item& projectItem) const +{ + if (auto buildConfigurationForFile = getBuildConfigurationWithName (projectItem.getCompilerFlagSchemeString())) + return buildConfigurationForFile->getAllCompilerFlagsString(); + + return {}; +} + void ProjectExporter::copyMainGroupFromProject() { jassert (itemGroups.size() == 0); @@ -761,14 +769,26 @@ ProjectExporter::BuildConfiguration::Ptr ProjectExporter::getConfiguration (int return createBuildConfig (getConfigurations().getChild (index)); } -bool ProjectExporter::hasConfigurationNamed (const String& nameToFind) const +std::optional ProjectExporter::getConfigurationWithName (const String& nameToFind) const { auto configs = getConfigurations(); for (int i = configs.getNumChildren(); --i >= 0;) - if (configs.getChild(i) [Ids::name].toString() == nameToFind) - return true; + { + auto config = configs.getChild (i); - return false; + if (config[Ids::name].toString() == nameToFind) + return config; + } + + return {}; +} + +ProjectExporter::BuildConfiguration::Ptr ProjectExporter::getBuildConfigurationWithName (const String& nameToFind) const +{ + if (auto config = getConfigurationWithName (nameToFind)) + return createBuildConfig (*config); + + return nullptr; } String ProjectExporter::getUniqueConfigName (String nm) const @@ -780,7 +800,7 @@ String ProjectExporter::getUniqueConfigName (String nm) const nameRoot = nameRoot.trim(); int suffix = 2; - while (hasConfigurationNamed (name)) + while (getConfigurationWithName (name).has_value()) nm = nameRoot + " " + String (suffix++); return nm; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h index 0a2084f046..34d7c9a3a2 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h @@ -319,7 +319,6 @@ public: void addNewConfigurationFromExisting (const BuildConfiguration& configToCopy); void addNewConfiguration (bool isDebugConfig); - bool hasConfigurationNamed (const String& name) const; String getUniqueConfigName (String name) const; String getExternalLibraryFlags (const BuildConfiguration& config) const; @@ -361,6 +360,8 @@ public: int getNumConfigurations() const; BuildConfiguration::Ptr getConfiguration (int index) const; + std::optional getConfigurationWithName (const String& nameToFind) const; + BuildConfiguration::Ptr getBuildConfigurationWithName (const String& nameToFind) const; ValueTree getConfigurations() const; virtual void createDefaultConfigs(); @@ -401,6 +402,8 @@ public: return false; } + String getCompilerFlagsForProjectItem (const Project::Item& projectItem) const; + protected: //============================================================================== String name;