/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #ifndef cmGhsMultiGenerator_h #define cmGhsMultiGenerator_h #include "cmGlobalGenerator.h" #include "cmGhsMultiGpj.h" #include "cmGlobalGeneratorFactory.h" class cmGeneratedFileStream; class cmGlobalGhsMultiGenerator : public cmGlobalGenerator { public: // The default filename extension of GHS MULTI's build files. static const char* FILE_EXTENSION; cmGlobalGhsMultiGenerator(cmake* cm); ~cmGlobalGhsMultiGenerator(); static cmGlobalGeneratorFactory* NewFactory() { return new cmGlobalGeneratorSimpleFactory(); } ///! create the correct local generator 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 this->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, 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 const& languages, cmMakefile*, bool optional) override; /* * Determine what program to use for building the project. */ bool FindMakeProgram(cmMakefile* mf) override; cmGeneratedFileStream* GetBuildFileStream() { return this->TargetFolderBuildStreams[""]; } static void OpenBuildFileStream(std::string const& filepath, cmGeneratedFileStream** filestream); static void OpenBuildFileStream(cmGeneratedFileStream* filestream); static void CloseBuildFileStream(cmGeneratedFileStream** filestream); /// Write the common disclaimer text at the top of each build file. static void WriteDisclaimer(std::ostream* os); std::vector GetLibDirs() { return this->LibDirs; } static void AddFilesUpToPath( cmGeneratedFileStream* mainBuildFile, std::map* targetFolderBuildStreams, char const* homeOutputDirectory, std::string const& path, GhsMultiGpj::Types projType, std::string const& relPath = ""); static void Open(std::string const& mapKeyName, std::string const& fileName, std::map* fileMap); static std::string trimQuotes(std::string const& str); protected: void Generate() override; void GenerateBuildCommand(std::vector& makeCommand, const std::string& makeProgram, const std::string& projectName, const std::string& projectDir, const std::string& targetName, const std::string& config, bool fast, int jobs, bool verbose, std::vector const& makeOptions = std::vector()) override; private: void GetToolset(cmMakefile* mf, std::string& tsd, std::string& ts); void OpenBuildFileStream(); void WriteMacros(); void WriteHighLevelDirectives(); static void AddFilesUpToPathNewBuildFile( cmGeneratedFileStream* mainBuildFile, std::map* targetFolderBuildStreams, char const* homeOutputDirectory, std::string const& pathUpTo, bool isFirst, std::string const& relPath, GhsMultiGpj::Types projType); static void AddFilesUpToPathAppendNextFile( std::map* targetFolderBuildStreams, std::string const& pathUpTo, std::vector::const_iterator splitPathI, std::vector::const_iterator end, GhsMultiGpj::Types projType); static std::string GetFileNameFromPath(std::string const& path); void UpdateBuildFiles(const std::vector& tgts); bool IsTgtForBuild(const cmGeneratorTarget* tgt); std::vector TargetSubProjects; std::map TargetFolderBuildStreams; std::vector LibDirs; static const char* DEFAULT_BUILD_PROGRAM; static const char* DEFAULT_TOOLSET_ROOT; }; #endif