/*========================================================================= Program: CMake - Cross-Platform Makefile Generator Module: $RCSfile$ Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef cmLocalUnixMakefileGenerator3_h #define cmLocalUnixMakefileGenerator3_h #include "cmLocalGenerator.h" class cmCustomCommand; class cmDependInformation; class cmDepends; class cmMakeDepend; class cmTarget; class cmSourceFile; /** \class cmLocalUnixMakefileGenerator3 * \brief Write a LocalUnix makefiles. * * cmLocalUnixMakefileGenerator3 produces a LocalUnix makefile from its * member m_Makefile. */ class cmLocalUnixMakefileGenerator3 : public cmLocalGenerator { public: cmLocalUnixMakefileGenerator3(); virtual ~cmLocalUnixMakefileGenerator3(); /** * Generate the makefile for this directory. */ virtual void Generate(); /** creates the common disclainer text at the top of each makefile */ void WriteDisclaimer(std::ostream& os); // this returns the relative path between the HomeOutputDirectory and this // local generators StartOutputDirectory std::string GetHomeRelativeOutputPath(); // Write out a make rule void WriteMakeRule(std::ostream& os, const char* comment, const char* target, const std::vector& depends, const std::vector& commands); // write the main variables used by the makefiles void WriteMakeVariables(std::ostream& makefileStream); // write a comment line #====... in the stream void WriteDivider(std::ostream& os); /** * If true, then explicitly pass MAKEFLAGS on the make all target for makes * that do not use environment variables. * */ void SetPassMakeflags(bool s){m_PassMakeflags = s;} bool GetPassMakeflags() { return m_PassMakeflags; } /** * Set the flag used to keep the make program silent. */ void SetMakeSilentFlag(const char* s) { m_MakeSilentFlag = s; } std::string &GetMakeSilentFlag() { return m_MakeSilentFlag; } /** used to create a recursive make call */ std::string GetRecursiveMakeCall(const char *makefile, const char* tgt); /** Set whether the echo command needs its argument quoted. */ void SetEchoNeedsQuote(bool b) { m_EchoNeedsQuote = b; } /** * Set to true if the shell being used is the windows shell. * This controls if statements in the makefile and the SHELL variable. * The default is false. */ void SetWindowsShell(bool v) {m_WindowsShell = v;} /** * Set the string used to include one makefile into another default * is include. */ void SetIncludeDirective(const char* s) { m_IncludeDirective = s; } const char *GetIncludeDirective() { return m_IncludeDirective.c_str(); } /** * Set max makefile variable size, default is 0 which means unlimited. */ void SetMakefileVariableSize(int s) { m_MakefileVariableSize = s; } /** * If ignore lib prefix is true, then do not strip lib from the name * of a library. */ void SetIgnoreLibPrefix(bool s) { m_IgnoreLibPrefix = s; } /** Called from command-line hook to scan dependencies. */ virtual bool ScanDependencies(std::vector const& args); /** Called from command-line hook to check dependencies. */ virtual void CheckDependencies(cmMakefile* mf, bool verbose); /** write some extra rules suahc as make test etc */ void WriteSpecialTargetsTop(std::ostream& makefileStream); void WriteSpecialTargetsBottom(std::ostream& makefileStream); std::string GetRelativeTargetDirectory(const cmTarget& target); // List the files for which to check dependency integrity. Each // language has its own list because integrity may be checked // differently. struct IntegrityCheckSet: public std::set {}; std::map &GetIntegrityCheckSet() { return m_CheckDependFiles;} void AppendTargetDepends(std::vector& depends, const cmTarget& target); void AppendGlobalTargetDepends(std::vector& depends, const cmTarget& target); void AppendEcho(std::vector& commands, const char* text); protected: // write the target rules for the local Makefile into the stream void WriteLocalMakefileTargets(std::ostream& ruleFileStream); // create the cd to home commands void CreateJumpCommand(std::vector& commands, std::string & localName); // these two methods just compute reasonable values for m_LibraryOutputPath and // m_ExecutableOutputPath void ConfigureOutputPaths(); void FormatOutputPath(std::string& path, const char* name); // this converts a file name that is relative to the StartOuputDirectory // into a full path std::string ConvertToFullPath(const std::string& localPath); // this is responsible for writing all of the rules for all this // directories custom commands (but not utility targets) void WriteCustomCommands(const cmTarget &target,std::ostream& os, std::vector& cleanFiles); // this method Writes the Directory informaiton files void WriteDirectoryInformationFile(); // cleanup the name of a potential target std::string ConvertToMakeTarget(const char* tgt); // used in writing out Cmake files such as WriteDirectoryInformation void WriteCMakeArgument(std::ostream& os, const char* s); // write out all the rules for this target void WriteTargetRuleFiles(const cmTarget& target); void WriteUtilityRuleFiles(const cmTarget& target); // create the rule files for an object void WriteObjectRuleFiles(const cmTarget& target, const cmSourceFile& source, std::vector& objects); // write the build rule for an object void WriteObjectBuildFile(std::string &obj, const char *lang, const cmTarget& target, const cmSourceFile& source, std::vector& depends, std::string &depMakeFile); // write the depend.make file for an object void WriteObjectDependRules(std::ostream& ruleFileStream, std::string& obj, const char *lang, const cmSourceFile& source, std::vector& depends, std::string& depMarkFile); // this is used only by WriteObjectDependFile bool GenerateDependsMakeFile(const std::string& lang, const char* objFile, std::string& depMakeFile, std::string& depMarkFile); // return the appropriate depends checker cmDepends* GetDependsChecker(const std::string& lang, const char* dir, const char* objFile, bool verbose); std::string GenerateCustomRuleFile(const cmCustomCommand& cc, const char *dir); // these three make some simple changes and then call WriteLibraryRule void WriteStaticLibraryRule(std::ostream& ruleFileStream, const char* ruleFileName, const cmTarget& target, const std::vector& objects, const std::vector& external_objects, std::vector& cleanFiles); void WriteSharedLibraryRule(std::ostream& ruleFileStream, const char* ruleFileName, const cmTarget& target, const std::vector& objects, const std::vector& external_objects, std::vector& cleanFiles); void WriteModuleLibraryRule(std::ostream& ruleFileStream, const char* ruleFileName, const cmTarget& target, const std::vector& objects, const std::vector& external_objects, std::vector& cleanFiles); // the main code for writing the Executable target rules void WriteExecutableRule(std::ostream& ruleFileStream, const char* ruleFileName, const cmTarget& target, const std::vector& objects, const std::vector& external_objects, std::vector& cleanFiles); // the main method for writing library rules void WriteLibraryRule(std::ostream& ruleFileStream, const char* ruleFileName, const cmTarget& target, const std::vector& objects, const std::vector& external_objects, const char* linkRuleVar, const char* extraLinkFlags, std::vector& cleanFiles); void WriteLocalMakefile(); void WriteLocalRule(std::ostream& ruleFileStream, const char* pass, const char* dependency); void WriteConvenienceRule(std::ostream& ruleFileStream, const char* realTarget, const char* helpTarget); void WriteObjectsVariable(std::ostream& ruleFileStream, const cmTarget& target, const std::vector& objects, const std::vector& external_objects, std::string& variableName, std::string& variableNameExternal); void WriteTargetDependRule(std::ostream& ruleFileStream, const cmTarget& target, const std::vector& objects); void WriteTargetCleanRule(std::ostream& ruleFileStream, const cmTarget& target, const std::vector& files); void WriteTargetRequiresRule(std::ostream& ruleFileStream, const cmTarget& target, const std::vector& objects); std::string GetTargetDirectory(const cmTarget& target); std::string GetSubdirTargetName(const char* pass, const char* subdir); std::string GetObjectFileName(const cmTarget& target, const cmSourceFile& source); const char* GetSourceFileLanguage(const cmSourceFile& source); std::string ConvertToQuotedOutputPath(const char* p); void AppendAnyDepend(std::vector& depends, const char* name, bool assume_unknown_is_file=false); void AppendRuleDepend(std::vector& depends, const char* ruleFileName); void AppendCustomDepends(std::vector& depends, const std::vector& ccs); void AppendCustomDepend(std::vector& depends, const cmCustomCommand& cc); void AppendCustomCommands(std::vector& commands, const std::vector& ccs); void AppendCustomCommand(std::vector& commands, const cmCustomCommand& cc); void AppendCleanCommand(std::vector& commands, const std::vector& files); //========================================================================== bool SamePath(const char* path1, const char* path2); std::string& CreateSafeUniqueObjectFileName(const char* sin); std::string CreateMakeVariable(const char* sin, const char* s2in); //========================================================================== private: std::map m_CheckDependFiles; //========================================================================== // Configuration settings. int m_MakefileVariableSize; std::map m_MakeVariableMap; std::map m_ShortMakeVariableMap; std::map m_UniqueObjectNamesMap; std::string m_IncludeDirective; std::string m_MakeSilentFlag; std::string m_ExecutableOutputPath; std::string m_LibraryOutputPath; bool m_PassMakeflags; //========================================================================== // Flag for whether echo command needs quotes. bool m_EchoNeedsQuote; // Set of object file names that will be built in this directory. std::set m_ObjectFiles; }; #endif