diff options
-rw-r--r-- | Source/cmCommands.cxx | 2 | ||||
-rw-r--r-- | Source/cmDSPMakefile.cxx | 49 | ||||
-rw-r--r-- | Source/cmDSPMakefile.h | 2 | ||||
-rw-r--r-- | Source/cmDSPWriter.cxx | 49 | ||||
-rw-r--r-- | Source/cmDSPWriter.h | 2 | ||||
-rw-r--r-- | Source/cmIncludeCommand.cxx | 38 | ||||
-rw-r--r-- | Source/cmIncludeCommand.h | 80 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 81 | ||||
-rw-r--r-- | Source/cmMakefile.h | 30 |
9 files changed, 235 insertions, 98 deletions
diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index 8c2224e..cc49f89 100644 --- a/Source/cmCommands.cxx +++ b/Source/cmCommands.cxx @@ -52,6 +52,7 @@ #include "cmEndIfCommand.cxx" #include "cmAddDefinitionsCommand.cxx" #include "cmOptionCommand.cxx" +#include "cmIncludeCommand.cxx" void GetPredefinedCommands(std::list<cmCommand*>& commands) { @@ -101,6 +102,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands) commands.push_back(new cmEndIfCommand); commands.push_back(new cmAddDefinitionsCommand); commands.push_back(new cmOptionCommand); + commands.push_back(new cmIncludeCommand); } diff --git a/Source/cmDSPMakefile.cxx b/Source/cmDSPMakefile.cxx index 104e621..6ff4a53 100644 --- a/Source/cmDSPMakefile.cxx +++ b/Source/cmDSPMakefile.cxx @@ -121,38 +121,6 @@ void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target) this->WriteDSPFile(fout,lname,target); } -void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout) -{ - std::string dspname = *(m_CreatedProjectNames.end()-1); - dspname += ".dsp"; - std::string makefileIn = "\""; - makefileIn += m_Makefile->GetStartDirectory(); - makefileIn += "/"; - makefileIn += "CMakeLists.txt\""; - std::string dsprule = "\""; - dsprule += m_Makefile->GetHomeDirectory(); - dsprule += "/CMake/Source/CMakeSetupCMD\" "; - dsprule += makefileIn; - dsprule += " -DSP -H\""; - dsprule += m_Makefile->GetHomeDirectory(); - dsprule += "\" -S\""; - dsprule += m_Makefile->GetStartDirectory(); - dsprule += "\" -O\""; - dsprule += m_Makefile->GetStartOutputDirectory(); - dsprule += "\" -B\""; - dsprule += m_Makefile->GetHomeOutputDirectory(); - dsprule += "\""; - - std::set<std::string> depends; - std::set<std::string> outputs; - outputs.insert(outputs.begin(), dspname); - fout << "# Begin Source File\n\n"; - fout << "SOURCE=" << makefileIn.c_str() << "\n\n"; - this->WriteCustomRule(fout, dsprule.c_str(), depends, outputs); - fout << "# End Source File\n"; -} - - void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup) { std::string dspname = *(m_CreatedProjectNames.end()-1); @@ -174,12 +142,12 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup) dsprule += "\" -B\""; dsprule += m_Makefile->GetHomeOutputDirectory(); dsprule += "\""; - - std::vector<std::string> depends; + std::vector<std::string> outputs; outputs.push_back(dspname); cmCustomCommand cc(makefileIn.c_str(), dsprule.c_str(), - depends, outputs); + m_Makefile->GetListFiles(), + outputs); sourceGroup.AddCustomCommand(cc); } @@ -306,6 +274,17 @@ void cmDSPMakefile::WriteCustomRule(std::ostream& fout, { fout << "!ELSEIF \"$(CFG)\" == " << i->c_str() << std::endl; } + + // Write out the dependencies (this seems to be the only way to + // get VC6 to actually take these dependencies into account. + fout << "USERDEP__HACK= "; + for(std::set<std::string>::const_iterator d = depends.begin(); + d != depends.end(); ++d) + { + fout << " \"" << d->c_str() << "\""; + } + fout << "\n"; + fout << "# Begin Custom Build\n\n"; // Write a rule for every output generated by this command. diff --git a/Source/cmDSPMakefile.h b/Source/cmDSPMakefile.h index 6082f1e..20f91a5 100644 --- a/Source/cmDSPMakefile.h +++ b/Source/cmDSPMakefile.h @@ -99,9 +99,11 @@ private: const char* group, const char* filter); void WriteDSPEndGroup(std::ostream& fout); + void WriteDSPHeader(std::ostream& fout, const char *libName, const cmTarget &tgt); void WriteDSPBuildRule(std::ostream& fout); + void WriteDSPFooter(std::ostream& fout); void AddDSPBuildRule(cmSourceGroup&); void WriteCustomRule(std::ostream& fout, diff --git a/Source/cmDSPWriter.cxx b/Source/cmDSPWriter.cxx index 104e621..6ff4a53 100644 --- a/Source/cmDSPWriter.cxx +++ b/Source/cmDSPWriter.cxx @@ -121,38 +121,6 @@ void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target) this->WriteDSPFile(fout,lname,target); } -void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout) -{ - std::string dspname = *(m_CreatedProjectNames.end()-1); - dspname += ".dsp"; - std::string makefileIn = "\""; - makefileIn += m_Makefile->GetStartDirectory(); - makefileIn += "/"; - makefileIn += "CMakeLists.txt\""; - std::string dsprule = "\""; - dsprule += m_Makefile->GetHomeDirectory(); - dsprule += "/CMake/Source/CMakeSetupCMD\" "; - dsprule += makefileIn; - dsprule += " -DSP -H\""; - dsprule += m_Makefile->GetHomeDirectory(); - dsprule += "\" -S\""; - dsprule += m_Makefile->GetStartDirectory(); - dsprule += "\" -O\""; - dsprule += m_Makefile->GetStartOutputDirectory(); - dsprule += "\" -B\""; - dsprule += m_Makefile->GetHomeOutputDirectory(); - dsprule += "\""; - - std::set<std::string> depends; - std::set<std::string> outputs; - outputs.insert(outputs.begin(), dspname); - fout << "# Begin Source File\n\n"; - fout << "SOURCE=" << makefileIn.c_str() << "\n\n"; - this->WriteCustomRule(fout, dsprule.c_str(), depends, outputs); - fout << "# End Source File\n"; -} - - void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup) { std::string dspname = *(m_CreatedProjectNames.end()-1); @@ -174,12 +142,12 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup) dsprule += "\" -B\""; dsprule += m_Makefile->GetHomeOutputDirectory(); dsprule += "\""; - - std::vector<std::string> depends; + std::vector<std::string> outputs; outputs.push_back(dspname); cmCustomCommand cc(makefileIn.c_str(), dsprule.c_str(), - depends, outputs); + m_Makefile->GetListFiles(), + outputs); sourceGroup.AddCustomCommand(cc); } @@ -306,6 +274,17 @@ void cmDSPMakefile::WriteCustomRule(std::ostream& fout, { fout << "!ELSEIF \"$(CFG)\" == " << i->c_str() << std::endl; } + + // Write out the dependencies (this seems to be the only way to + // get VC6 to actually take these dependencies into account. + fout << "USERDEP__HACK= "; + for(std::set<std::string>::const_iterator d = depends.begin(); + d != depends.end(); ++d) + { + fout << " \"" << d->c_str() << "\""; + } + fout << "\n"; + fout << "# Begin Custom Build\n\n"; // Write a rule for every output generated by this command. diff --git a/Source/cmDSPWriter.h b/Source/cmDSPWriter.h index 6082f1e..20f91a5 100644 --- a/Source/cmDSPWriter.h +++ b/Source/cmDSPWriter.h @@ -99,9 +99,11 @@ private: const char* group, const char* filter); void WriteDSPEndGroup(std::ostream& fout); + void WriteDSPHeader(std::ostream& fout, const char *libName, const cmTarget &tgt); void WriteDSPBuildRule(std::ostream& fout); + void WriteDSPFooter(std::ostream& fout); void AddDSPBuildRule(cmSourceGroup&); void WriteCustomRule(std::ostream& fout, diff --git a/Source/cmIncludeCommand.cxx b/Source/cmIncludeCommand.cxx new file mode 100644 index 0000000..d492400 --- /dev/null +++ b/Source/cmIncludeCommand.cxx @@ -0,0 +1,38 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#include "cmIncludeCommand.h" + +#include <iostream.h> + +// cmIncludeCommand +bool cmIncludeCommand::Invoke(std::vector<std::string>& args) +{ + if (args.size()< 1) + { + this->SetError("called with wrong number of arguments."); + } + + for( unsigned int i=0; i< args.size(); i++) + { + m_Makefile->ExpandVariablesInString( args[i]); + m_Makefile->ReadListFile( m_Makefile->GetCurrentListFile(), + args[i].c_str()); + } + + return true; +} + + diff --git a/Source/cmIncludeCommand.h b/Source/cmIncludeCommand.h new file mode 100644 index 0000000..38f3680 --- /dev/null +++ b/Source/cmIncludeCommand.h @@ -0,0 +1,80 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#ifndef cmIncludeCommand_h +#define cmIncludeCommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +/** \class cmIncludeCommand + * \brief + * + * cmIncludeCommand defines a list of distant + * files that can be "included" in the current list file. + * In almost every sense, this is identical to a C/C++ + * #include command. Arguments are first expended as usual. + */ +class cmIncludeCommand : public cmCommand +{ +public: + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + return new cmIncludeCommand; + } + + /** + * This is called when the command is first encountered in + * the CMakeLists.txt file. + */ + virtual bool Invoke(std::vector<std::string>& args); + + /** + * This determines if the command gets propagated down + * to makefiles located in subdirectories. + */ + virtual bool IsInherited() {return true;} + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() {return "INCLUDE";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Basically identical to a C #include \"somthing\" command."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "INCLUDE(file1 file2)\n"; + } + + cmTypeMacro(cmIncludeCommand, cmCommand); +}; + + + +#endif diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index fa26995..11d0a26 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -190,48 +190,75 @@ void cmMakefile::Print() const // Parse the given CMakeLists.txt file into a list of classes. // Reads in current CMakeLists file and all parent CMakeLists files // executing all inherited commands in the parents -bool cmMakefile::ReadListFile(const char* filename) -{ - // is there a parent CMakeLists file that does not go beyond the - // Home directory? if so recurse and read in that List file - std::string parentList = this->GetParentListFileName(filename); - if (parentList != "") - { - // save the current directory - std::string srcdir = m_cmCurrentDirectory; - std::string bindir = m_CurrentOutputDirectory; - // compute the new current directories - std::string::size_type pos = m_cmCurrentDirectory.rfind('/'); - if(pos != std::string::npos) - { - m_cmCurrentDirectory = m_cmCurrentDirectory.substr(0, pos); - } - pos = m_CurrentOutputDirectory.rfind('/'); - if(pos != std::string::npos) - { - m_CurrentOutputDirectory = m_CurrentOutputDirectory.substr(0, pos); - } - this->ReadListFile(parentList.c_str()); - // restore the current directory - m_cmCurrentDirectory = srcdir; - m_CurrentOutputDirectory = bindir; +// +// if external is non-zero, this means that we have branched to grab some +// commands from a remote list-file (that is, the equivalent of a +// #include has been called). We DO NOT look at the parents of this +// list-file, and for all other purposes, the name of this list-file +// is "filename" and not "external". +bool cmMakefile::ReadListFile(const char* filename, const char* external) +{ + + // keep track of the current file being read + m_cmCurrentListFile= filename; + + // if this is not a remote makefile + // (if it were, this would be called from the "filename" call, + // rather than the "external" call) + if (!external) + { + // is there a parent CMakeLists file that does not go beyond the + // Home directory? if so recurse and read in that List file + std::string parentList = this->GetParentListFileName(filename); + if (parentList != "") + { + // save the current directory + std::string srcdir = m_cmCurrentDirectory; + std::string bindir = m_CurrentOutputDirectory; + // compute the new current directories + std::string::size_type pos = m_cmCurrentDirectory.rfind('/'); + if(pos != std::string::npos) + { + m_cmCurrentDirectory = m_cmCurrentDirectory.substr(0, pos); + } + pos = m_CurrentOutputDirectory.rfind('/'); + if(pos != std::string::npos) + { + m_CurrentOutputDirectory = m_CurrentOutputDirectory.substr(0, pos); + } + this->ReadListFile(parentList.c_str()); + // restore the current directory + m_cmCurrentDirectory = srcdir; + m_CurrentOutputDirectory = bindir; + } } // are we at the start CMakeLists file or are we processing a parent // lists file + // + // this might, or might not be true, irrespective if we are + // off looking at an external makefile. bool inheriting = (m_cmCurrentDirectory != m_cmStartDirectory); // Now read the input file - std::ifstream fin(filename); + const char *filenametoread= filename; + + if( external) + filenametoread= external; + + std::ifstream fin(filenametoread); if(!fin) { - cmSystemTools::Error("error can not open file ", filename); + cmSystemTools::Error("error can not open file ", filenametoread); return false; } std::string name; std::vector<std::string> arguments; while ( fin ) { + // add this list file to the list of dependencies + m_ListFiles.push_back( filenametoread); + if(cmSystemTools::ParseFunction(fin, name, arguments) && !this->IsFunctionBlocked(name.c_str(),arguments)) { diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 500ae44..e4a7149 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -73,7 +73,7 @@ public: /** * Read and parse a CMakeLists.txt file. */ - bool ReadListFile(const char* listfile); + bool ReadListFile(const char* listfile, const char* external= 0); /** * Add a wrapper generator. @@ -241,7 +241,16 @@ public: { return m_cmHomeDirectory.c_str(); } +<<<<<<< cmMakefile.h + void SetHomeOutputDirectory(const char* lib) + { + m_HomeOutputDirectory = lib; + cmSystemTools::ConvertToUnixSlashes(m_HomeOutputDirectory); + this->AddDefinition("CMAKE_BINARY_DIR", this->GetHomeOutputDirectory()); + } +======= void SetHomeOutputDirectory(const char* lib); +>>>>>>> 1.31 const char* GetHomeOutputDirectory() const { return m_HomeOutputDirectory.c_str(); @@ -302,6 +311,15 @@ public: { return m_CurrentOutputDirectory.c_str(); } + + /* Get the current CMakeLists.txt file that is being processed. This + * is just used in order to be able to 'branch' from one file to a second + * transparently */ + const char* GetCurrentListFile() const + { + return m_cmCurrentListFile.c_str(); + } + //@} /** @@ -400,6 +418,12 @@ public: */ const std::vector<cmSourceGroup>& GetSourceGroups() const { return m_SourceGroups; } + + /** + * Get the vector of list files on which this makefile depends + */ + const std::vector<std::string>& GetListFiles() const + { return m_ListFiles; } /** * Dump documentation to a file. If 0 is returned, the @@ -462,6 +486,7 @@ protected: std::string m_StartOutputDirectory; std::string m_cmHomeDirectory; std::string m_HomeOutputDirectory; + std::string m_cmCurrentListFile; std::string m_ProjectName; // project name @@ -475,7 +500,10 @@ protected: std::vector<std::string> m_LinkDirectories; std::vector<std::string> m_Utilities; std::vector<std::string> m_UtilityDirectories; + std::vector<std::string> m_ListFiles; // list of command files loaded + cmTarget::LinkLibraries m_LinkLibraries; + std::string m_IncludeFileRegularExpression; std::string m_DefineFlags; std::vector<cmSourceGroup> m_SourceGroups; |