/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include <iosfwd> #include <memory> #include <set> #include <string> #include <utility> #include <vector> #include "cmBuildOptions.h" #include "cmGlobalGenerator.h" #include "cmGlobalGeneratorFactory.h" #include "cmTargetDepend.h" class cmGeneratorTarget; class cmLocalGenerator; class cmMakefile; class cmake; struct cmDocumentationEntry; class cmGlobalGhsMultiGenerator : public cmGlobalGenerator { public: // The default filename extension of GHS MULTI's build files. static const char* FILE_EXTENSION; cmGlobalGhsMultiGenerator(cmake* cm); ~cmGlobalGhsMultiGenerator() override; static std::unique_ptr<cmGlobalGeneratorFactory> NewFactory() { return std::unique_ptr<cmGlobalGeneratorFactory>( new cmGlobalGeneratorSimpleFactory<cmGlobalGhsMultiGenerator>()); } //! create the correct local generator std::unique_ptr<cmLocalGenerator> CreateLocalGenerator( cmMakefile* mf) override; /// @return the name of this generator. static std::string GetActualName() { return "Green Hills MULTI"; } //! Get the name for this generator std::string GetName() const override { return GetActualName(); } /// Overloaded methods. @see cmGlobalGenerator::GetDocumentation() static void GetDocumentation(cmDocumentationEntry& entry); /** * Utilized by the generator factory to determine if this generator * supports toolsets. */ static bool SupportsToolset() { return true; } /** * Utilized by the generator factory to determine if this generator * supports platforms. */ static bool SupportsPlatform() { return true; } // Toolset / Platform Support bool SetGeneratorToolset(std::string const& ts, bool build, cmMakefile* mf) override; bool SetGeneratorPlatform(std::string const& p, cmMakefile* mf) override; /** * Try to determine system information such as shared library * extension, pthreads, byte order etc. */ void EnableLanguage(std::vector<std::string> const& languages, cmMakefile*, bool optional) override; /* * Determine what program to use for building the project. */ bool FindMakeProgram(cmMakefile* mf) override; void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const override; // Write the common disclaimer text at the top of each build file. void WriteFileHeader(std::ostream& fout); protected: void Generate() override; std::vector<GeneratedMakeCommand> GenerateBuildCommand( const std::string& makeProgram, const std::string& projectName, const std::string& projectDir, std::vector<std::string> const& targetNames, const std::string& config, int jobs, bool verbose, const cmBuildOptions& buildOptions = cmBuildOptions(), std::vector<std::string> const& makeOptions = std::vector<std::string>()) override; void AddExtraIDETargets() override; private: void GetToolset(cmMakefile* mf, std::string& tsd, const std::string& ts); /* top-level project */ void OutputTopLevelProject(cmLocalGenerator* root, std::vector<cmLocalGenerator*>& generators); void WriteTopLevelProject(std::ostream& fout, cmLocalGenerator* root); void WriteMacros(std::ostream& fout, cmLocalGenerator* root); void WriteHighLevelDirectives(std::ostream& fout, cmLocalGenerator* root); void WriteSubProjects(std::ostream& fout, bool filterPredefined); void WriteTargets(cmLocalGenerator* root); void WriteProjectLine(std::ostream& fout, cmGeneratorTarget const* target, std::string& rootBinaryDir); void WriteCustomRuleBOD(std::ostream& fout); void WriteCustomTargetBOD(std::ostream& fout); bool AddCheckTarget(); void AddAllTarget(); std::string StampFile; static std::string TrimQuotes(std::string str); static const char* DEFAULT_BUILD_PROGRAM; static const char* CHECK_BUILD_SYSTEM_TARGET; bool ComputeTargetBuildOrder(cmGeneratorTarget const* tgt, std::vector<cmGeneratorTarget const*>& build); bool ComputeTargetBuildOrder(std::vector<cmGeneratorTarget const*>& tgt, std::vector<cmGeneratorTarget const*>& build); bool VisitTarget(std::set<cmGeneratorTarget const*>& temp, std::set<cmGeneratorTarget const*>& perm, std::vector<cmGeneratorTarget const*>& order, cmGeneratorTarget const* ti); std::vector<cmGeneratorTarget const*> ProjectTargets; // Target sorting class TargetSet : public std::set<cmGeneratorTarget const*> { }; class TargetCompare { std::string First; public: TargetCompare(std::string first) : First(std::move(first)) { } bool operator()(cmGeneratorTarget const* l, cmGeneratorTarget const* r) const; }; class OrderedTargetDependSet; }; class cmGlobalGhsMultiGenerator::OrderedTargetDependSet : public std::multiset<cmTargetDepend, cmGlobalGhsMultiGenerator::TargetCompare> { using derived = std::multiset<cmTargetDepend, cmGlobalGhsMultiGenerator::TargetCompare>; public: using TargetDependSet = cmGlobalGenerator::TargetDependSet; OrderedTargetDependSet(TargetDependSet const&, std::string const& first); };