/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file LICENSE.rst or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include #include "cmValue.h" class cmGeneratorTarget; class cmGlobalCommonGenerator; class cmLocalCommonGenerator; class cmMakefile; class cmSourceFile; /** \class cmCommonTargetGenerator * \brief Common infrastructure for Makefile and Ninja per-target generators */ class cmCommonTargetGenerator { public: cmCommonTargetGenerator(cmGeneratorTarget* gt); virtual ~cmCommonTargetGenerator(); std::vector const& GetConfigNames() const; protected: // Feature query methods. cmValue GetFeature(std::string const& feature, std::string const& config); cmGeneratorTarget* GeneratorTarget; cmMakefile* Makefile; cmLocalCommonGenerator* LocalCommonGenerator; cmGlobalCommonGenerator* GlobalCommonGenerator; std::vector ConfigNames; bool UseLWYU = false; void AppendFortranFormatFlags(std::string& flags, cmSourceFile const& source); enum class PreprocessFlagsRequired { YES, NO }; void AppendFortranPreprocessFlags( std::string& flags, cmSourceFile const& source, PreprocessFlagsRequired requires_pp = PreprocessFlagsRequired::YES); virtual void AddIncludeFlags(std::string& flags, std::string const& lang, std::string const& config) = 0; virtual std::string GetClangTidyReplacementsFilePath( std::string const& directory, cmSourceFile const& source, std::string const& config) const = 0; void AppendOSXVerFlag(std::string& flags, std::string const& lang, char const* name, bool so); std::string GetFlags(std::string const& l, std::string const& config, std::string const& arch = std::string()); std::string GetDefines(std::string const& l, std::string const& config); std::string GetIncludes(std::string const& l, std::string const& config); std::string GetManifests(std::string const& config); std::string GetAIXExports(std::string const& config); std::string GenerateCodeCheckRules( cmSourceFile const& source, std::string& compilerLauncher, std::string const& cmakeCmd, std::string const& config, std::function const& pathConverter); std::string GetCompilerLauncher(std::string const& lang, std::string const& config); struct LinkedTargetDirs { std::vector Direct; std::vector Forward; }; LinkedTargetDirs GetLinkedTargetDirectories(std::string const& lang, std::string const& config) const; std::string ComputeTargetCompilePDB(std::string const& config) const; std::string GetLinkerLauncher(std::string const& config); bool HaveRequiredLanguages(std::vector const& sources, std::set& languagesNeeded) const; private: using ByLanguageMap = std::map; struct ByConfig { ByLanguageMap FlagsByLanguage; ByLanguageMap DefinesByLanguage; ByLanguageMap IncludesByLanguage; }; std::map Configs; };