From 1fd9c2f2821edb3526da509ad66ef47f2b7bfdba Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Tue, 11 Jun 2019 16:44:29 +0100 Subject: [PATCH] Projucer: Added an "add recommended warning flags" checkbox to the exporters --- .../jucer_ProjectExport_Android.h | 19 ++++++--- .../jucer_ProjectExport_CodeBlocks.h | 4 ++ .../ProjectSaving/jucer_ProjectExport_Make.h | 4 ++ .../ProjectSaving/jucer_ProjectExport_Xcode.h | 8 ++-- .../ProjectSaving/jucer_ProjectExporter.cpp | 42 +++++++++++++++++++ .../ProjectSaving/jucer_ProjectExporter.h | 7 +++- .../Source/Utility/Helpers/jucer_PresetIDs.h | 1 + 7 files changed, 76 insertions(+), 9 deletions(-) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h index d51a176ec1..24659abf4e 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h @@ -288,6 +288,7 @@ protected: void createConfigProperties (PropertyListBuilder& props) override { + addRecommendedLLVMCompilerWarningsProperty (props); addGCCOptimisationProperty (props); props.add (new TextPropertyComponent (androidArchitectures, "Architectures", 256, false), @@ -634,11 +635,19 @@ private: if (getProject().getProjectType().isStaticLibrary()) mo << " targets \"" << getNativeModuleBinaryName (cfg) << "\"" << newLine; - mo << " arguments \"-DJUCE_BUILD_CONFIGURATION=" << cfg.getProductFlavourCMakeIdentifier() << "\"" - << ", \"-DCMAKE_CXX_FLAGS_" << (cfg.isDebug() ? "DEBUG" : "RELEASE") - << "=-O" << cfg.getGCCOptimisationFlag() << "\"" - << ", \"-DCMAKE_C_FLAGS_" << (cfg.isDebug() ? "DEBUG" : "RELEASE") - << "=-O" << cfg.getGCCOptimisationFlag() << "\"" << newLine; + mo << " arguments " + << "\"-DJUCE_BUILD_CONFIGURATION=" << cfg.getProductFlavourCMakeIdentifier() << "\""; + + mo << ", \"-DCMAKE_CXX_FLAGS_" << (cfg.isDebug() ? "DEBUG" : "RELEASE") + << "=-O" << cfg.getGCCOptimisationFlag(); + + for (auto& flag : cfg.getRecommendedCompilerWarningFlags()) + mo << " " << flag; + + mo << "\"" + << ", \"-DCMAKE_C_FLAGS_" << (cfg.isDebug() ? "DEBUG" : "RELEASE") + << "=-O" << cfg.getGCCOptimisationFlag() + << "\"" << newLine; mo << " }" << newLine; mo << " }" << newLine << newLine; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h index 39243df1aa..830848671e 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h @@ -209,6 +209,7 @@ private: void createConfigProperties (PropertyListBuilder& props) override { + addRecommendedLinuxCompilerWarningsProperty (props); addGCCOptimisationProperty (props); props.add (new ChoicePropertyComponent (architectureTypeValue, "Architecture", @@ -401,6 +402,9 @@ private: if (auto* codeBlocksConfig = dynamic_cast (&config)) flags.add (codeBlocksConfig->getArchitectureTypeString()); + for (auto& recommended : config.getRecommendedCompilerWarningFlags()) + flags.add (recommended); + flags.add ("-O" + config.getGCCOptimisationFlag()); if (config.isLinkTimeOptimisationEnabled()) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h index 0290281034..aea6b78e8e 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h @@ -45,6 +45,7 @@ protected: void createConfigProperties (PropertyListBuilder& props) override { + addRecommendedLinuxCompilerWarningsProperty (props); addGCCOptimisationProperty (props); props.add (new ChoicePropertyComponent (architectureTypeValue, "Architecture", @@ -521,6 +522,9 @@ private: if (extra.isNotEmpty()) result.add (extra); + for (auto& recommended : config.getRecommendedCompilerWarningFlags()) + result.add (recommended); + return result; } diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index a985a90e7b..f0dff5f9c6 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -631,6 +631,7 @@ protected: void createConfigProperties (PropertyListBuilder& props) override { addXcodePluginInstallPathProperties (props); + addRecommendedLLVMCompilerWarningsProperty (props); addGCCOptimisationProperty (props); if (iOS) @@ -1244,10 +1245,11 @@ public: if (config.isFastMathEnabled()) s.set ("GCC_FAST_MATH", "YES"); - auto extraFlags = owner.replacePreprocessorTokens (config, owner.getExtraCompilerFlagsString()).trim(); + auto flags = (owner.replacePreprocessorTokens (config, owner.getExtraCompilerFlagsString()) + + " " + config.getRecommendedCompilerWarningFlags().joinIntoString (" ")).trim(); - if (extraFlags.isNotEmpty()) - s.set ("OTHER_CPLUSPLUSFLAGS", extraFlags.quoted()); + if (flags.isNotEmpty()) + s.set ("OTHER_CPLUSPLUSFLAGS", flags.quoted()); auto installPath = getInstallPathForConfiguration (config); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp index fcb6ba9836..e57766c1cc 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp @@ -923,6 +923,7 @@ ProjectExporter::BuildConfiguration::BuildConfiguration (Project& p, const Value configNameValue (config, Ids::name, getUndoManager(), "Build Configuration"), targetNameValue (config, Ids::targetName, getUndoManager(), project.getProjectFilenameRootString()), targetBinaryPathValue (config, Ids::binaryPath, getUndoManager()), + recommendedWarningsValue (config, Ids::recommendedWarnings, getUndoManager()), optimisationLevelValue (config, Ids::optimisation, getUndoManager()), linkTimeOptimisationValue (config, Ids::linkTimeOptimisation, getUndoManager(), ! isDebug()), ppDefinesValue (config, Ids::defines, getUndoManager()), @@ -930,6 +931,18 @@ ProjectExporter::BuildConfiguration::BuildConfiguration (Project& p, const Value librarySearchPathValue (config, Ids::libraryPath, getUndoManager()), userNotesValue (config, Ids::userNotes, getUndoManager()) { + recommendedCompilerWarningFlags["LLVM"] = { "-Wall", "-Wshadow-all", "-Wshorten-64-to-32", "-Wstrict-aliasing", "-Wuninitialized", "-Wunused-parameter", + "-Wconversion", "-Wsign-compare", "-Wint-conversion", "-Wconditional-uninitialized", "-Woverloaded-virtual", + "-Wreorder", "-Wconstant-conversion", "-Wsign-conversion", "-Wunused-private-field", "-Wbool-conversion", + "-Wextra-semi", "-Wunreachable-code", "-Wzero-as-null-pointer-constant", "-Wcast-align", + "-Winconsistent-missing-destructor-override", "-Wshift-sign-overflow", "-Wnullable-to-nonnull-conversion", + "-Wno-missing-field-initializers", "-Wno-ignored-qualifiers" }; + recommendedCompilerWarningFlags["GCC"] = { "-Wall", "-Wextra", "-Wstrict-aliasing", "-Wuninitialized", "-Wunused-parameter", "-Wsign-compare", + "-Woverloaded-virtual", "-Wreorder", "-Wsign-conversion", "-Wunreachable-code", + "-Wzero-as-null-pointer-constant", "-Wcast-align", "-Wno-implicit-fallthrough", + "-Wno-maybe-uninitialized", "-Wno-missing-field-initializers", "-Wno-ignored-qualifiers" }; + recommendedCompilerWarningFlags["GCC-7"] = recommendedCompilerWarningFlags["GCC"]; + recommendedCompilerWarningFlags["GCC-7"].add ("-Wno-strict-overflow"); } ProjectExporter::BuildConfiguration::~BuildConfiguration() @@ -961,6 +974,35 @@ void ProjectExporter::BuildConfiguration::addGCCOptimisationProperty (PropertyLi "The optimisation level for this configuration"); } +void ProjectExporter::BuildConfiguration::addRecommendedLinuxCompilerWarningsProperty (PropertyListBuilder& props) +{ + props.add (new ChoicePropertyComponent (recommendedWarningsValue, "Add Recommended Compiler Warning Flags", + { "GCC", "GCC 7 and below", "LLVM", "Disabled" }, + { "GCC", "GCC-7", "LLVM", "" }), + "Enable this to add a set of recommended compiler warning flags."); + recommendedWarningsValue.setDefault (""); +} + +void ProjectExporter::BuildConfiguration::addRecommendedLLVMCompilerWarningsProperty (PropertyListBuilder& props) +{ + props.add (new ChoicePropertyComponent (recommendedWarningsValue, "Add Recommended Compiler Warning Flags", + { "Enabled", "Disabled" }, + { "LLVM", "" }), + "Enable this to add a set of recommended compiler warning flags."); + recommendedWarningsValue.setDefault (""); +} + +StringArray ProjectExporter::BuildConfiguration::getRecommendedCompilerWarningFlags() const +{ + auto label = recommendedWarningsValue.get().toString(); + auto it = recommendedCompilerWarningFlags.find (label); + + if (it != recommendedCompilerWarningFlags.end()) + return it->second; + + return {}; +} + void ProjectExporter::BuildConfiguration::createPropertyEditors (PropertyListBuilder& props) { if (exporter.supportsUserDefinedConfigurations()) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h index ea2bd81692..570ea17111 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h @@ -272,6 +272,9 @@ public: //============================================================================== void createPropertyEditors (PropertyListBuilder&); + void addRecommendedLinuxCompilerWarningsProperty (PropertyListBuilder&); + void addRecommendedLLVMCompilerWarningsProperty (PropertyListBuilder&); + StringArray getRecommendedCompilerWarningFlags() const; void addGCCOptimisationProperty (PropertyListBuilder&); void removeFromExporter(); @@ -281,10 +284,12 @@ public: const ProjectExporter& exporter; protected: - ValueWithDefault isDebugValue, configNameValue, targetNameValue, targetBinaryPathValue, optimisationLevelValue, + ValueWithDefault isDebugValue, configNameValue, targetNameValue, targetBinaryPathValue, recommendedWarningsValue, optimisationLevelValue, linkTimeOptimisationValue, ppDefinesValue, headerSearchPathValue, librarySearchPathValue, userNotesValue; private: + std::map recommendedCompilerWarningFlags; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BuildConfiguration) }; diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h index 07dee68eb0..7ef65d834c 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h @@ -90,6 +90,7 @@ namespace Ids DECLARE_ID (alwaysGenerateDebugSymbols); DECLARE_ID (targetName); DECLARE_ID (binaryPath); + DECLARE_ID (recommendedWarnings); DECLARE_ID (optimisation); DECLARE_ID (defines); DECLARE_ID (headerPath);