| @@ -288,6 +288,7 @@ protected: | |||||
| void createConfigProperties (PropertyListBuilder& props) override | void createConfigProperties (PropertyListBuilder& props) override | ||||
| { | { | ||||
| addRecommendedLLVMCompilerWarningsProperty (props); | |||||
| addGCCOptimisationProperty (props); | addGCCOptimisationProperty (props); | ||||
| props.add (new TextPropertyComponent (androidArchitectures, "Architectures", 256, false), | props.add (new TextPropertyComponent (androidArchitectures, "Architectures", 256, false), | ||||
| @@ -634,11 +635,19 @@ private: | |||||
| if (getProject().getProjectType().isStaticLibrary()) | if (getProject().getProjectType().isStaticLibrary()) | ||||
| mo << " targets \"" << getNativeModuleBinaryName (cfg) << "\"" << newLine; | 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; | ||||
| mo << " }" << newLine << newLine; | mo << " }" << newLine << newLine; | ||||
| @@ -209,6 +209,7 @@ private: | |||||
| void createConfigProperties (PropertyListBuilder& props) override | void createConfigProperties (PropertyListBuilder& props) override | ||||
| { | { | ||||
| addRecommendedLinuxCompilerWarningsProperty (props); | |||||
| addGCCOptimisationProperty (props); | addGCCOptimisationProperty (props); | ||||
| props.add (new ChoicePropertyComponent (architectureTypeValue, "Architecture", | props.add (new ChoicePropertyComponent (architectureTypeValue, "Architecture", | ||||
| @@ -401,6 +402,9 @@ private: | |||||
| if (auto* codeBlocksConfig = dynamic_cast<const CodeBlocksBuildConfiguration*> (&config)) | if (auto* codeBlocksConfig = dynamic_cast<const CodeBlocksBuildConfiguration*> (&config)) | ||||
| flags.add (codeBlocksConfig->getArchitectureTypeString()); | flags.add (codeBlocksConfig->getArchitectureTypeString()); | ||||
| for (auto& recommended : config.getRecommendedCompilerWarningFlags()) | |||||
| flags.add (recommended); | |||||
| flags.add ("-O" + config.getGCCOptimisationFlag()); | flags.add ("-O" + config.getGCCOptimisationFlag()); | ||||
| if (config.isLinkTimeOptimisationEnabled()) | if (config.isLinkTimeOptimisationEnabled()) | ||||
| @@ -45,6 +45,7 @@ protected: | |||||
| void createConfigProperties (PropertyListBuilder& props) override | void createConfigProperties (PropertyListBuilder& props) override | ||||
| { | { | ||||
| addRecommendedLinuxCompilerWarningsProperty (props); | |||||
| addGCCOptimisationProperty (props); | addGCCOptimisationProperty (props); | ||||
| props.add (new ChoicePropertyComponent (architectureTypeValue, "Architecture", | props.add (new ChoicePropertyComponent (architectureTypeValue, "Architecture", | ||||
| @@ -521,6 +522,9 @@ private: | |||||
| if (extra.isNotEmpty()) | if (extra.isNotEmpty()) | ||||
| result.add (extra); | result.add (extra); | ||||
| for (auto& recommended : config.getRecommendedCompilerWarningFlags()) | |||||
| result.add (recommended); | |||||
| return result; | return result; | ||||
| } | } | ||||
| @@ -631,6 +631,7 @@ protected: | |||||
| void createConfigProperties (PropertyListBuilder& props) override | void createConfigProperties (PropertyListBuilder& props) override | ||||
| { | { | ||||
| addXcodePluginInstallPathProperties (props); | addXcodePluginInstallPathProperties (props); | ||||
| addRecommendedLLVMCompilerWarningsProperty (props); | |||||
| addGCCOptimisationProperty (props); | addGCCOptimisationProperty (props); | ||||
| if (iOS) | if (iOS) | ||||
| @@ -1244,10 +1245,11 @@ public: | |||||
| if (config.isFastMathEnabled()) | if (config.isFastMathEnabled()) | ||||
| s.set ("GCC_FAST_MATH", "YES"); | 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); | auto installPath = getInstallPathForConfiguration (config); | ||||
| @@ -923,6 +923,7 @@ ProjectExporter::BuildConfiguration::BuildConfiguration (Project& p, const Value | |||||
| configNameValue (config, Ids::name, getUndoManager(), "Build Configuration"), | configNameValue (config, Ids::name, getUndoManager(), "Build Configuration"), | ||||
| targetNameValue (config, Ids::targetName, getUndoManager(), project.getProjectFilenameRootString()), | targetNameValue (config, Ids::targetName, getUndoManager(), project.getProjectFilenameRootString()), | ||||
| targetBinaryPathValue (config, Ids::binaryPath, getUndoManager()), | targetBinaryPathValue (config, Ids::binaryPath, getUndoManager()), | ||||
| recommendedWarningsValue (config, Ids::recommendedWarnings, getUndoManager()), | |||||
| optimisationLevelValue (config, Ids::optimisation, getUndoManager()), | optimisationLevelValue (config, Ids::optimisation, getUndoManager()), | ||||
| linkTimeOptimisationValue (config, Ids::linkTimeOptimisation, getUndoManager(), ! isDebug()), | linkTimeOptimisationValue (config, Ids::linkTimeOptimisation, getUndoManager(), ! isDebug()), | ||||
| ppDefinesValue (config, Ids::defines, getUndoManager()), | ppDefinesValue (config, Ids::defines, getUndoManager()), | ||||
| @@ -930,6 +931,18 @@ ProjectExporter::BuildConfiguration::BuildConfiguration (Project& p, const Value | |||||
| librarySearchPathValue (config, Ids::libraryPath, getUndoManager()), | librarySearchPathValue (config, Ids::libraryPath, getUndoManager()), | ||||
| userNotesValue (config, Ids::userNotes, 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() | ProjectExporter::BuildConfiguration::~BuildConfiguration() | ||||
| @@ -961,6 +974,35 @@ void ProjectExporter::BuildConfiguration::addGCCOptimisationProperty (PropertyLi | |||||
| "The optimisation level for this configuration"); | "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) | void ProjectExporter::BuildConfiguration::createPropertyEditors (PropertyListBuilder& props) | ||||
| { | { | ||||
| if (exporter.supportsUserDefinedConfigurations()) | if (exporter.supportsUserDefinedConfigurations()) | ||||
| @@ -272,6 +272,9 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| void createPropertyEditors (PropertyListBuilder&); | void createPropertyEditors (PropertyListBuilder&); | ||||
| void addRecommendedLinuxCompilerWarningsProperty (PropertyListBuilder&); | |||||
| void addRecommendedLLVMCompilerWarningsProperty (PropertyListBuilder&); | |||||
| StringArray getRecommendedCompilerWarningFlags() const; | |||||
| void addGCCOptimisationProperty (PropertyListBuilder&); | void addGCCOptimisationProperty (PropertyListBuilder&); | ||||
| void removeFromExporter(); | void removeFromExporter(); | ||||
| @@ -281,10 +284,12 @@ public: | |||||
| const ProjectExporter& exporter; | const ProjectExporter& exporter; | ||||
| protected: | protected: | ||||
| ValueWithDefault isDebugValue, configNameValue, targetNameValue, targetBinaryPathValue, optimisationLevelValue, | |||||
| ValueWithDefault isDebugValue, configNameValue, targetNameValue, targetBinaryPathValue, recommendedWarningsValue, optimisationLevelValue, | |||||
| linkTimeOptimisationValue, ppDefinesValue, headerSearchPathValue, librarySearchPathValue, userNotesValue; | linkTimeOptimisationValue, ppDefinesValue, headerSearchPathValue, librarySearchPathValue, userNotesValue; | ||||
| private: | private: | ||||
| std::map<String, StringArray> recommendedCompilerWarningFlags; | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BuildConfiguration) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BuildConfiguration) | ||||
| }; | }; | ||||
| @@ -90,6 +90,7 @@ namespace Ids | |||||
| DECLARE_ID (alwaysGenerateDebugSymbols); | DECLARE_ID (alwaysGenerateDebugSymbols); | ||||
| DECLARE_ID (targetName); | DECLARE_ID (targetName); | ||||
| DECLARE_ID (binaryPath); | DECLARE_ID (binaryPath); | ||||
| DECLARE_ID (recommendedWarnings); | |||||
| DECLARE_ID (optimisation); | DECLARE_ID (optimisation); | ||||
| DECLARE_ID (defines); | DECLARE_ID (defines); | ||||
| DECLARE_ID (headerPath); | DECLARE_ID (headerPath); | ||||