diff options
author | Ken Martin <ken.martin@kitware.com> | 2002-09-12 15:49:10 (GMT) |
---|---|---|
committer | Ken Martin <ken.martin@kitware.com> | 2002-09-12 15:49:10 (GMT) |
commit | c8c89b653fb49befaa8f0771523b5254ea1a7d7e (patch) | |
tree | 74850ae8fb020aa610dfa7fee0b5e10bd96d9d15 | |
parent | 271e6ec3741e58d319e1c08142802f19bcebb73c (diff) | |
download | CMake-c8c89b653fb49befaa8f0771523b5254ea1a7d7e.zip CMake-c8c89b653fb49befaa8f0771523b5254ea1a7d7e.tar.gz CMake-c8c89b653fb49befaa8f0771523b5254ea1a7d7e.tar.bz2 |
new arch
-rw-r--r-- | Source/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Source/cmBorlandMakefileGenerator.cxx | 462 | ||||
-rw-r--r-- | Source/cmBorlandMakefileGenerator.h | 69 | ||||
-rw-r--r-- | Source/cmDSPWriter.cxx | 835 | ||||
-rw-r--r-- | Source/cmDSPWriter.h | 97 | ||||
-rw-r--r-- | Source/cmDSWWriter.cxx | 335 | ||||
-rw-r--r-- | Source/cmDSWWriter.h | 57 | ||||
-rw-r--r-- | Source/cmMSDotNETGenerator.cxx | 1430 | ||||
-rw-r--r-- | Source/cmMSDotNETGenerator.h | 177 | ||||
-rw-r--r-- | Source/cmMSProjectGenerator.cxx | 125 | ||||
-rw-r--r-- | Source/cmMSProjectGenerator.h | 94 | ||||
-rw-r--r-- | Source/cmMakefileGenerator.cxx | 46 | ||||
-rw-r--r-- | Source/cmMakefileGenerator.h | 86 | ||||
-rw-r--r-- | Source/cmNMakeMakefileGenerator.cxx | 740 | ||||
-rw-r--r-- | Source/cmNMakeMakefileGenerator.h | 101 | ||||
-rw-r--r-- | Source/cmUnixMakefileGenerator.cxx | 2241 | ||||
-rw-r--r-- | Source/cmUnixMakefileGenerator.h | 197 |
17 files changed, 0 insertions, 7093 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 2638cbb..3c0f30a 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -24,7 +24,6 @@ cmake.h cmakewizard.h cmMakeDepend.h cmMakefile.h -cmMakefileGenerator.h cmRegularExpression.h cmSourceFile.h cmSystemTools.h diff --git a/Source/cmBorlandMakefileGenerator.cxx b/Source/cmBorlandMakefileGenerator.cxx deleted file mode 100644 index e467cdd..0000000 --- a/Source/cmBorlandMakefileGenerator.cxx +++ /dev/null @@ -1,462 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. - -=========================================================================*/ -#include "cmBorlandMakefileGenerator.h" -#include "cmMakefile.h" -#include "cmStandardIncludes.h" -#include "cmSystemTools.h" -#include "cmSourceFile.h" -#include "cmMakeDepend.h" -#include "cmCacheManager.h" -#include "cmGeneratedFileStream.h" -#include "windows.h" -#include <stdio.h> - -cmBorlandMakefileGenerator::cmBorlandMakefileGenerator() -{ - this->SetLibraryPathOption("-L"); - this->SetLibraryLinkOption(""); -} - -cmBorlandMakefileGenerator::~cmBorlandMakefileGenerator() -{ -} - - -void cmBorlandMakefileGenerator::EnableLanguage(const char*) -{ - // now load the settings - if(!m_Makefile->GetDefinition("CMAKE_ROOT")) - { - cmSystemTools::Error( - "CMAKE_ROOT has not been defined, bad GUI or driver program"); - return; - } - std::string outdir = m_Makefile->GetCurrentOutputDirectory(); - if(outdir.find('-') != std::string::npos) - { - std::string message = "The Borland command line tools do not support path names that have - in them. Please re-name your output directory and use _ instead of -."; - message += "\nYour path currently is: "; - message += outdir; - cmSystemTools::Error(message.c_str()); - } - if(!this->GetLanguageEnabled("CXX")) - { - std::string fpath = - m_Makefile->GetDefinition("CMAKE_ROOT"); - fpath += "/Templates/CMakeBorlandWindowsSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); - this->SetLanguageEnabled("CXX"); - } - -} - - - -void cmBorlandMakefileGenerator::OutputMakeVariables(std::ostream& fout) -{ - fout << "# NMake Makefile generated by cmake\n"; - const char* variables = - "# general varibles used in the makefile\n" - "\n" - "CMAKE_STANDARD_WINDOWS_LIBRARIES = @CMAKE_STANDARD_WINDOWS_LIBRARIES@\n" - "CMAKE_C_FLAGS = @CMAKE_C_FLAGS@ @BUILD_FLAGS@\n" - "CMAKE_OBJECT_FILE_SUFFIX = @CMAKE_OBJECT_FILE_SUFFIX@\n" - "CMAKE_EXECUTABLE_SUFFIX = @CMAKE_EXECUTABLE_SUFFIX@\n" - "CMAKE_STATICLIB_SUFFIX = @CMAKE_STATICLIB_SUFFIX@\n" - "CMAKE_SHLIB_SUFFIX = @CMAKE_SHLIB_SUFFIX@\n" - "CMAKE_SHLIB_CFLAGS = -tWR\n" - "CMAKE_LINKER_FLAGS = @CMAKE_LINKER_FLAGS@ @LINKER_BUILD_FLAGS@\n" - "CMAKE_CXX_FLAGS = -P @CMAKE_CXX_FLAGS@ @BUILD_FLAGS@\n" - "!IF \"$(OS)\" == \"Windows_NT\"\n" - "NULL=\n" - "!ELSE \n" - "NULL=nul\n" - "!ENDIF \n"; - std::string buildType = "CMAKE_CXX_FLAGS_"; - buildType += m_Makefile->GetDefinition("CMAKE_BUILD_TYPE"); - buildType = cmSystemTools::UpperCase(buildType); - m_Makefile->AddDefinition("BUILD_FLAGS", - m_Makefile->GetDefinition( - buildType.c_str())); - - buildType = "CMAKE_LINKER_FLAGS_"; - buildType += m_Makefile->GetDefinition("CMAKE_BUILD_TYPE"); - buildType = cmSystemTools::UpperCase(buildType); - m_Makefile->AddDefinition("LINKER_BUILD_FLAGS", - m_Makefile->GetDefinition( - buildType.c_str())); - - std::string replaceVars = variables; - m_Makefile->ExpandVariablesInString(replaceVars); - std::string ccompiler = m_Makefile->GetDefinition("CMAKE_C_COMPILER"); - fout << "CMAKE_C_COMPILER = " - << this->ConvertToOutputPath(ccompiler.c_str()) - << "\n"; - std::string cxxcompiler = m_Makefile->GetDefinition("CMAKE_CXX_COMPILER"); - fout << "CMAKE_CXX_COMPILER = " - << this->ConvertToOutputPath(cxxcompiler.c_str()) - << "\n"; - - if(m_Makefile->GetDefinition("CMAKE_EDIT_COMMAND")) - { - fout << "CMAKE_EDIT_COMMAND = " - << this->ShortPath(m_Makefile->GetDefinition("CMAKE_EDIT_COMMAND")) - << "\n"; - } - - std::string cmakecommand = m_Makefile->GetDefinition("CMAKE_COMMAND"); - fout << "CMAKE_COMMAND = " - << this->ShortPath(cmakecommand.c_str()) << "\n"; - fout << "RM = " << this->ShortPath(cmakecommand.c_str()) << " -E remove -f\n"; - - fout << replaceVars.c_str(); - fout << "CMAKE_CURRENT_SOURCE = " - << ShortPath(m_Makefile->GetStartDirectory() ) - << "\n"; - fout << "CMAKE_CURRENT_BINARY = " - << ShortPath(m_Makefile->GetStartOutputDirectory()) - << "\n"; - fout << "CMAKE_SOURCE_DIR = " - << ShortPath(m_Makefile->GetHomeDirectory()) << "\n"; - fout << "CMAKE_BINARY_DIR = " - << ShortPath(m_Makefile->GetHomeOutputDirectory() ) - << "\n"; - // Output Include paths - fout << "INCLUDE_FLAGS = "; - std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories(); - std::vector<std::string>::iterator i; - fout << "-I" << - this->ShortPath(m_Makefile->GetStartDirectory()) << " "; - for(i = includes.begin(); i != includes.end(); ++i) - { - std::string include = *i; - // Don't output a -I for the standard include path "/usr/include". - // This can cause problems with certain standard library - // implementations because the wrong headers may be found first. - fout << "-I" << this->ConvertToOutputPath(i->c_str()).c_str() << " "; - } - fout << m_Makefile->GetDefineFlags(); - fout << "\n\n"; -} - - - -void -cmBorlandMakefileGenerator:: -OutputBuildObjectFromSource(std::ostream& fout, - const char* shortName, - const cmSourceFile& source, - const char* extraCompileFlags, - bool shared) -{ - // force shared flag if building shared libraries - if(cmSystemTools::IsOn(m_Makefile->GetDefinition("BUILD_SHARED_LIBS"))) - { - shared = true; - } - // Header files shouldn't have build rules. - if(source.GetPropertyAsBool("HEADER_FILE_ONLY")) - { - return; - } - - - - std::string comment = "Build "; - std::string objectFile = std::string(shortName) + - this->GetOutputExtension(source.GetSourceExtension().c_str()); - objectFile = this->ConvertToOutputPath(objectFile.c_str()); - comment += objectFile + " From "; - comment += source.GetFullPath(); - std::string compileCommand; - std::string ext = source.GetSourceExtension(); - if(ext == "c" ) - { - compileCommand = "$(CMAKE_C_COMPILER) $(CMAKE_C_FLAGS) "; - compileCommand += extraCompileFlags; - if(shared) - { - compileCommand += "$(CMAKE_SHLIB_CFLAGS) "; - } - compileCommand += " -o"; - compileCommand += objectFile; - compileCommand += " $(INCLUDE_FLAGS) -c "; - compileCommand += - this->ConvertToOutputPath(source.GetFullPath().c_str()); - } - else if (ext == "rc") - { - compileCommand = "$(RC) $(INCLUDE_FLAGS) -o\""; - compileCommand += objectFile; - compileCommand += "\" "; - compileCommand += - this->ConvertToOutputPath(source.GetFullPath().c_str()); - } - else if (ext == "def") - { - // no rule to output for this one - return; - } - // assume c++ if not c rc or def - else - { - compileCommand = "$(CMAKE_CXX_COMPILER) $(CMAKE_CXX_FLAGS) "; - compileCommand += extraCompileFlags; - if(shared) - { - compileCommand += "$(CMAKE_SHLIB_CFLAGS) "; - } - compileCommand += " -o"; - compileCommand += objectFile; - compileCommand += " $(INCLUDE_FLAGS) -c "; - compileCommand += - this->ConvertToOutputPath(source.GetFullPath().c_str()); - } - this->OutputMakeRule(fout, - comment.c_str(), - objectFile.c_str(), - this->ConvertToOutputPath( - source.GetFullPath().c_str()).c_str(), - compileCommand.c_str()); -} - -void cmBorlandMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_LibraryOutputPath + name; - std::string libpath = target + ".lib"; - target += ".dll"; - target = this->ConvertToOutputPath(target.c_str()); - libpath = this->ConvertToOutputPath(libpath.c_str()); - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS"); - depend += ") $(" + this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; - std::string command = "$(CMAKE_CXX_COMPILER) -tWD $(CMAKE_SHLIB_CFLAGS) $(CMAKE_LINKER_FLAGS) @&&|\n"; - // must be executable name - command += "-e"; - command += target; - command += " "; - cmStringStream linklibs; - this->OutputLinkLibraries(linklibs, name, t); - // then the linker options -L and libraries (any other order will fail!) - command += linklibs.str(); - // then list of object files - command += " $(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; - std::string command2 = "implib -w "; - command2 += libpath + " " + target; - const std::vector<cmSourceFile*>& sources = t.GetSourceFiles(); - for(std::vector<cmSourceFile*>::const_iterator i = sources.begin(); - i != sources.end(); ++i) - { - if((*i)->GetSourceExtension() == "def") - { - command += ""; - command += (*i)->GetFullPath(); - } - } - command += "\n|\n"; - - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, "rules for a shared library", - target.c_str(), - depend.c_str(), - command.c_str(), - command2.c_str(), - cc); -} - -void cmBorlandMakefileGenerator::OutputModuleLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &target) -{ - this->OutputSharedLibraryRule(fout, name, target); -} - -void cmBorlandMakefileGenerator::OutputStaticLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_LibraryOutputPath + std::string(name) + ".lib"; - target = this->ConvertToOutputPath(target.c_str()); - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; - std::string command = "tlib @&&|\n\t /p512 /a "; - command += target; - command += " "; - std::string deleteCommand = "if exist "; - deleteCommand += target; - deleteCommand += " del "; - deleteCommand += target; - - command += " $("; - command += this->CreateMakeVariable(name, "_SRC_OBJS_QUOTED") + ")"; - command += "\n|\n"; - std::string comment = "rule to build static library: "; - comment += name; - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, - comment.c_str(), - target.c_str(), - depend.c_str(), - deleteCommand.c_str(), - command.c_str(), cc); -} - -void cmBorlandMakefileGenerator::OutputExecutableRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_ExecutableOutputPath + name + m_ExecutableExtension; - target = this->ConvertToOutputPath(target.c_str()); - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS") + ") $(" + - this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; - std::string command = - "$(CMAKE_CXX_COMPILER) "; - command += " $(CMAKE_LINKER_FLAGS) -e" + target; - if(cmSystemTools::IsOn(m_Makefile->GetDefinition("BUILD_SHARED_LIBS"))) - { - command += " $(CMAKE_SHLIB_CFLAGS) "; - } - if(t.GetType() == cmTarget::WIN32_EXECUTABLE) - { - command += " -tWM "; - } - else - { - command += " -tWC "; - } - cmStringStream linklibs; - this->OutputLinkLibraries(linklibs, 0, t); - command += linklibs.str(); - command += " $(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ")"; - - std::string comment = "rule to build executable: "; - comment += name; - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, - comment.c_str(), - target.c_str(), - depend.c_str(), - command.c_str(), cc); -} - - - - -std::string cmBorlandMakefileGenerator::GetOutputExtension(const char* s) -{ - std::string sourceExtension = s; - if(sourceExtension == "def") - { - return ""; - } - if(sourceExtension == "ico" || sourceExtension == "rc2") - { - return ""; - } - if(sourceExtension == "rc") - { - return ".res"; - } - return ".obj"; -} - - - -bool cmBorlandMakefileGenerator::SamePath(const char* path1, const char* path2) -{ - // first check to see if they are the same anyway - if (strcmp(path1, path2) == 0) - { - return true; - } - // next short path and lower case both of them for the compare - return - cmSystemTools::LowerCase(ShortPath(path1)) == - cmSystemTools::LowerCase(ShortPath(path2)); -} - - -// borland make does not support variables that are longer than 32 -// so use this function to rename any long ones -std::string cmBorlandMakefileGenerator::CreateMakeVariable(const char* s, const char* s2) -{ - std::string unmodified = s; - unmodified += s2; - // see if th - std::map<cmStdString, cmStdString>::iterator i = m_MakeVariableMap.find(unmodified); - if(i != m_MakeVariableMap.end()) - { - return i->second; - } - std::string ret = unmodified; - // if the string is greater the 32 chars it is an invalid vairable name - // for borland make - if(ret.size() > 32) - { - std::string str1 = s; - std::string str2 = s2; - // we must shorten the combined string by 4 charactors - // keep no more than 24 charactors from the second string - if(str2.size() > 24) - { - str2 = str2.substr(0, 24); - } - if(str1.size() + str2.size() > 27) - { - str1 = str1.substr(0, 27 - str2.size()); - } - char buffer[5]; - int i = 0; - sprintf(buffer, "%04d", i); - ret = str1 + str2 + buffer; - while(m_ShortMakeVariableMap.count(ret) && i < 1000) - { - ++i; - sprintf(buffer, "%04d", i); - ret = str1 + str2 + buffer; - } - if(i == 1000) - { - cmSystemTools::Error("Borland makefile varible length too long"); - return unmodified; - } - // once an unused variable is found - m_ShortMakeVariableMap[ret] = "1"; - } - // always make an entry into the unmodified to varible map - m_MakeVariableMap[unmodified] = ret; - return ret; -} - diff --git a/Source/cmBorlandMakefileGenerator.h b/Source/cmBorlandMakefileGenerator.h deleted file mode 100644 index f577a1f..0000000 --- a/Source/cmBorlandMakefileGenerator.h +++ /dev/null @@ -1,69 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmBorlandMakefileGenerator_h -#define cmBorlandMakefileGenerator_h - -#include "cmNMakeMakefileGenerator.h" - -/** \class cmBorlandMakefileGenerator - * \brief Write an NMake makefile. - * - * cmBorlandMakefileGenerator produces a Unix makefile from its - * member m_Makefile. - */ -class cmBorlandMakefileGenerator : public cmNMakeMakefileGenerator -{ -public: - ///! Set cache only and recurse to false by default. - cmBorlandMakefileGenerator(); - - virtual ~cmBorlandMakefileGenerator(); - - ///! Get the name for the generator. - virtual const char* GetName() {return "Borland Makefiles";} - - ///! virtual copy constructor - virtual cmMakefileGenerator* CreateObject() - { return new cmBorlandMakefileGenerator;} - - ///! figure out about the current system information - virtual void EnableLanguage(const char*); -protected: - virtual void OutputMakeVariables(std::ostream&); - - virtual void OutputBuildObjectFromSource(std::ostream& fout, - const char* shortName, - const cmSourceFile& source, - const char* extraCompileFlags, - bool sharedTarget); - virtual void OutputSharedLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputModuleLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputStaticLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputExecutableRule(std::ostream&, const char* name, - const cmTarget &); - virtual std::string GetOutputExtension(const char* sourceExtension); - ///! return true if the two paths are the same (checks short paths) - virtual bool SamePath(const char* path1, const char* path2); - virtual std::string CreateMakeVariable(const char* s, const char* s2); - std::map<cmStdString, cmStdString> m_MakeVariableMap; - std::map<cmStdString, cmStdString> m_ShortMakeVariableMap; -}; - -#endif diff --git a/Source/cmDSPWriter.cxx b/Source/cmDSPWriter.cxx deleted file mode 100644 index 1c75223..0000000 --- a/Source/cmDSPWriter.cxx +++ /dev/null @@ -1,835 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. - -=========================================================================*/ -#include "cmDSPWriter.h" -#include "cmStandardIncludes.h" -#include "cmSystemTools.h" -#include "cmRegularExpression.h" - -cmDSPWriter::~cmDSPWriter() -{ -} - - -cmDSPWriter::cmDSPWriter(cmMakefile*mf) -{ - m_Makefile = mf; -} - -void cmDSPWriter::OutputDSPFile() -{ - // If not an in source build, then create the output directory - if(strcmp(m_Makefile->GetStartOutputDirectory(), - m_Makefile->GetHomeDirectory()) != 0) - { - if(!cmSystemTools::MakeDirectory(m_Makefile->GetStartOutputDirectory())) - { - cmSystemTools::Error("Error creating directory ", - m_Makefile->GetStartOutputDirectory()); - } - } - - // Setup /I and /LIBPATH options for the resulting DSP file - std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories(); - std::vector<std::string>::iterator i; - for(i = includes.begin(); i != includes.end(); ++i) - { - m_IncludeOptions += " /I "; - std::string tmp = cmSystemTools::ConvertToOutputPath(i->c_str()); - - // quote if not already quoted - if (tmp[0] != '"') - { - m_IncludeOptions += "\""; - m_IncludeOptions += tmp; - m_IncludeOptions += "\""; - } - else - { - m_IncludeOptions += tmp; - } - } - - // Create the DSP or set of DSP's for libraries and executables - - // clear project names - m_CreatedProjectNames.clear(); - - // build any targets - cmTargets &tgts = m_Makefile->GetTargets(); - for(cmTargets::iterator l = tgts.begin(); - l != tgts.end(); l++) - { - switch(l->second.GetType()) - { - case cmTarget::STATIC_LIBRARY: - this->SetBuildType(STATIC_LIBRARY, l->first.c_str()); - break; - case cmTarget::SHARED_LIBRARY: - this->SetBuildType(DLL, l->first.c_str()); - break; - case cmTarget::EXECUTABLE: - this->SetBuildType(EXECUTABLE,l->first.c_str()); - break; - case cmTarget::WIN32_EXECUTABLE: - this->SetBuildType(WIN32_EXECUTABLE,l->first.c_str()); - break; - case cmTarget::UTILITY: - this->SetBuildType(UTILITY, l->first.c_str()); - break; - case cmTarget::INSTALL_FILES: - break; - case cmTarget::INSTALL_PROGRAMS: - break; - default: - cmSystemTools::Error("Bad target type", l->first.c_str()); - break; - } - // INCLUDE_EXTERNAL_MSPROJECT command only affects the workspace - // so don't build a projectfile for it - if ((l->second.GetType() != cmTarget::INSTALL_FILES) - && (l->second.GetType() != cmTarget::INSTALL_PROGRAMS) - && (strncmp(l->first.c_str(), "INCLUDE_EXTERNAL_MSPROJECT", 26) != 0)) - { - // check to see if the dsp is going into a sub-directory - std::string::size_type pos = l->first.rfind('/'); - if(pos != std::string::npos) - { - std::string dir = m_Makefile->GetStartOutputDirectory(); - dir += "/"; - dir += l->first.substr(0, pos); - if(!cmSystemTools::MakeDirectory(dir.c_str())) - { - cmSystemTools::Error("Error creating directory ", dir.c_str()); - } - } - this->CreateSingleDSP(l->first.c_str(),l->second); - } - } -} - -void cmDSPWriter::CreateSingleDSP(const char *lname, cmTarget &target) -{ - // add to the list of projects - std::string pname = lname; - m_CreatedProjectNames.push_back(pname); - // create the dsp.cmake file - std::string fname; - fname = m_Makefile->GetStartOutputDirectory(); - fname += "/"; - fname += lname; - fname += ".dsp"; - // save the name of the real dsp file - std::string realDSP = fname; - fname += ".cmake"; - std::ofstream fout(fname.c_str()); - if(!fout) - { - cmSystemTools::Error("Error Writing ", fname.c_str()); - } - this->WriteDSPFile(fout,lname,target); - fout.close(); - // if the dsp file has changed, then write it. - cmSystemTools::CopyFileIfDifferent(fname.c_str(), realDSP.c_str()); -} - - -void cmDSPWriter::AddDSPBuildRule(cmSourceGroup& sourceGroup) -{ - std::string dspname = *(m_CreatedProjectNames.end()-1); - if(dspname == "ALL_BUILD") - { - return; - } - dspname += ".dsp.cmake"; - std::string makefileIn = m_Makefile->GetStartDirectory(); - makefileIn += "/"; - makefileIn += "CMakeLists.txt"; - makefileIn = cmSystemTools::ConvertToOutputPath(makefileIn.c_str()); - std::string dsprule = "${CMAKE_COMMAND}"; - m_Makefile->ExpandVariablesInString(dsprule); - dsprule = cmSystemTools::ConvertToOutputPath(dsprule.c_str()); - std::string args = makefileIn; - args += " -H"; - args += - cmSystemTools::ConvertToOutputPath(m_Makefile->GetHomeDirectory()); - args += " -S"; - args += - cmSystemTools::ConvertToOutputPath(m_Makefile->GetStartDirectory()); - args += " -O"; - args += - cmSystemTools::ConvertToOutputPath(m_Makefile->GetStartOutputDirectory()); - args += " -B"; - args += - cmSystemTools::ConvertToOutputPath(m_Makefile->GetHomeOutputDirectory()); - m_Makefile->ExpandVariablesInString(args); - - std::string configFile = - m_Makefile->GetDefinition("CMAKE_ROOT"); - configFile += "/Templates/CMakeWindowsSystemConfig.cmake"; - std::vector<std::string> listFiles = m_Makefile->GetListFiles(); - bool found = false; - for(std::vector<std::string>::iterator i = listFiles.begin(); - i != listFiles.end(); ++i) - { - if(*i == configFile) - { - found = true; - } - } - if(!found) - { - listFiles.push_back(configFile); - } - - std::vector<std::string> outputs; - outputs.push_back(dspname); - cmCustomCommand cc(makefileIn.c_str(), dsprule.c_str(), - args.c_str(), - listFiles, - outputs); - sourceGroup.AddCustomCommand(cc); -} - - -void cmDSPWriter::WriteDSPFile(std::ostream& fout, - const char *libName, - cmTarget &target) -{ - // We may be modifying the source groups temporarily, so make a copy. - std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups(); - - // get the classes from the source lists then add them to the groups - std::vector<cmSourceFile*> classes = target.GetSourceFiles(); - for(std::vector<cmSourceFile*>::iterator i = classes.begin(); - i != classes.end(); i++) - { - // Add the file to the list of sources. - std::string source = (*i)->GetFullPath(); - cmSourceGroup& sourceGroup = m_Makefile->FindSourceGroup(source.c_str(), - sourceGroups); - sourceGroup.AddSource(source.c_str(), *i); - } - - // add any custom rules to the source groups - for (std::vector<cmCustomCommand>::const_iterator cr = - target.GetCustomCommands().begin(); - cr != target.GetCustomCommands().end(); ++cr) - { - cmSourceGroup& sourceGroup = - m_Makefile->FindSourceGroup(cr->GetSourceName().c_str(), - sourceGroups); - cmCustomCommand cc(*cr); - cc.ExpandVariables(*m_Makefile); - sourceGroup.AddCustomCommand(cc); - } - - // Write the DSP file's header. - this->WriteDSPHeader(fout, libName, target, sourceGroups); - - // Find the group in which the CMakeLists.txt source belongs, and add - // the rule to generate this DSP file. - for(std::vector<cmSourceGroup>::reverse_iterator sg = sourceGroups.rbegin(); - sg != sourceGroups.rend(); ++sg) - { - if(sg->Matches("CMakeLists.txt")) - { - this->AddDSPBuildRule(*sg); - break; - } - } - - // Loop through every source group. - for(std::vector<cmSourceGroup>::const_iterator sg = sourceGroups.begin(); - sg != sourceGroups.end(); ++sg) - { - const cmSourceGroup::BuildRules& buildRules = sg->GetBuildRules(); - // If the group is empty, don't write it at all. - if(buildRules.empty()) - { continue; } - - // If the group has a name, write the header. - std::string name = sg->GetName(); - if(name != "") - { - this->WriteDSPBeginGroup(fout, name.c_str(), ""); - } - - // Loop through each build rule in the source group. - for(cmSourceGroup::BuildRules::const_iterator cc = - buildRules.begin(); cc != buildRules.end(); ++ cc) - { - std::string source = cc->first; - const cmSourceGroup::Commands& commands = cc->second.m_Commands; - const char* compileFlags = 0; - if(cc->second.m_SourceFile) - { - compileFlags = cc->second.m_SourceFile->GetProperty("COMPILE_FLAGS"); - } - if (source != libName || target.GetType() == cmTarget::UTILITY) - { - fout << "# Begin Source File\n\n"; - - // Tell MS-Dev what the source is. If the compiler knows how to - // build it, then it will. - fout << "SOURCE=" << - cmSystemTools::ConvertToOutputPath(source.c_str()) << "\n\n"; - if (!commands.empty()) - { - cmSourceGroup::CommandFiles totalCommand; - std::string totalCommandStr; - totalCommandStr = this->CombineCommands(commands, totalCommand, - source.c_str()); - this->WriteCustomRule(fout, source.c_str(), totalCommandStr.c_str(), - totalCommand.m_Depends, - totalCommand.m_Outputs, compileFlags); - } - else if(compileFlags) - { - for(std::vector<std::string>::iterator i - = m_Configurations.begin(); i != m_Configurations.end(); ++i) - { - if (i == m_Configurations.begin()) - { - fout << "!IF \"$(CFG)\" == " << i->c_str() << std::endl; - } - else - { - fout << "!ELSEIF \"$(CFG)\" == " << i->c_str() << std::endl; - } - fout << "\n# ADD CPP " << compileFlags << "\n\n"; - } - fout << "!ENDIF\n\n"; - } - fout << "# End Source File\n"; - } - } - - // If the group has a name, write the footer. - if(name != "") - { - this->WriteDSPEndGroup(fout); - } - } - - // Write the DSP file's footer. - this->WriteDSPFooter(fout); -} - - -void cmDSPWriter::WriteCustomRule(std::ostream& fout, - const char* source, - const char* command, - const std::set<std::string>& depends, - const std::set<std::string>& outputs, - const char* flags - ) -{ - std::vector<std::string>::iterator i; - for(i = m_Configurations.begin(); i != m_Configurations.end(); ++i) - { - if (i == m_Configurations.begin()) - { - fout << "!IF \"$(CFG)\" == " << i->c_str() << std::endl; - } - else - { - fout << "!ELSEIF \"$(CFG)\" == " << i->c_str() << std::endl; - } - if(flags) - { - fout << "\n# ADD CPP " << flags << "\n\n"; - } - // Write out the dependencies for the rule. - fout << "USERDEP__HACK="; - for(std::set<std::string>::const_iterator d = depends.begin(); - d != depends.end(); ++d) - { - fout << "\\\n\t" << - cmSystemTools::ConvertToOutputPath(d->c_str()); - } - fout << "\n"; - - fout << "# PROP Ignore_Default_Tool 1\n"; - fout << "# Begin Custom Build\n\n"; - if(outputs.size() == 0) - { - fout << source << "_force : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\""; - fout << command << "\n\n"; - } - - // Write a rule for every output generated by this command. - for(std::set<std::string>::const_iterator output = outputs.begin(); - output != outputs.end(); ++output) - { - fout << "\"" << output->c_str() - << "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\""; - fout << command << "\n\n"; - } - - fout << "# End Custom Build\n\n"; - } - - fout << "!ENDIF\n\n"; -} - - -void cmDSPWriter::WriteDSPBeginGroup(std::ostream& fout, - const char* group, - const char* filter) -{ - fout << "# Begin Group \"" << group << "\"\n" - "# PROP Default_Filter \"" << filter << "\"\n"; -} - - -void cmDSPWriter::WriteDSPEndGroup(std::ostream& fout) -{ - fout << "# End Group\n"; -} - - - - -void cmDSPWriter::SetBuildType(BuildType b, const char *libName) -{ - std::string root= m_Makefile->GetDefinition("CMAKE_ROOT"); - const char *def= m_Makefile->GetDefinition( "MSPROJECT_TEMPLATE_DIRECTORY"); - - if( def) - { - root = def; - } - else - { - root += "/Templates"; - } - - switch(b) - { - case STATIC_LIBRARY: - m_DSPHeaderTemplate = root; - m_DSPHeaderTemplate += "/staticLibHeader.dsptemplate"; - m_DSPFooterTemplate = root; - m_DSPFooterTemplate += "/staticLibFooter.dsptemplate"; - break; - case DLL: - m_DSPHeaderTemplate = root; - m_DSPHeaderTemplate += "/DLLHeader.dsptemplate"; - m_DSPFooterTemplate = root; - m_DSPFooterTemplate += "/DLLFooter.dsptemplate"; - break; - case EXECUTABLE: - m_DSPHeaderTemplate = root; - m_DSPHeaderTemplate += "/EXEHeader.dsptemplate"; - m_DSPFooterTemplate = root; - m_DSPFooterTemplate += "/EXEFooter.dsptemplate"; - break; - case WIN32_EXECUTABLE: - m_DSPHeaderTemplate = root; - m_DSPHeaderTemplate += "/EXEWinHeader.dsptemplate"; - m_DSPFooterTemplate = root; - m_DSPFooterTemplate += "/EXEFooter.dsptemplate"; - break; - case UTILITY: - m_DSPHeaderTemplate = root; - m_DSPHeaderTemplate += "/UtilityHeader.dsptemplate"; - m_DSPFooterTemplate = root; - m_DSPFooterTemplate += "/UtilityFooter.dsptemplate"; - break; - } - - // once the build type is set, determine what configurations are - // possible - std::ifstream fin(m_DSPHeaderTemplate.c_str()); - - cmRegularExpression reg("# Name "); - if(!fin) - { - cmSystemTools::Error("Error Reading ", m_DSPHeaderTemplate.c_str()); - } - - // reset m_Configurations - m_Configurations.erase(m_Configurations.begin(), m_Configurations.end()); - // now add all the configurations possible - char buffer[2048]; - while(fin) - { - fin.getline(buffer, 2048); - std::string line = buffer; - cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName); - if (reg.find(line)) - { - m_Configurations.push_back(line.substr(reg.end())); - } - } -} - -std::string -cmDSPWriter::CombineCommands(const cmSourceGroup::Commands &commands, - cmSourceGroup::CommandFiles &totalCommand, - const char *source) - -{ - // Loop through every custom command generating code from the - // current source. - // build up the depends and outputs and commands - std::string totalCommandStr = ""; - std::string temp; - for(cmSourceGroup::Commands::const_iterator c = commands.begin(); - c != commands.end(); ++c) - { - totalCommandStr += "\n\t"; - temp= c->second.m_Command; - temp = cmSystemTools::ConvertToOutputPath(temp.c_str()); - totalCommandStr += temp; - totalCommandStr += " "; - totalCommandStr += c->second.m_Arguments; - totalCommand.Merge(c->second); - } - // Create a dummy file with the name of the source if it does - // not exist - if(totalCommand.m_Outputs.empty()) - { - std::string dummyFile = m_Makefile->GetStartOutputDirectory(); - dummyFile += "/"; - dummyFile += source; - if(!cmSystemTools::FileExists(dummyFile.c_str())) - { - std::ofstream fout(dummyFile.c_str()); - fout << "Dummy file created by cmake as unused source for utility command.\n"; - } - } - return totalCommandStr; -} - - -// look for custom rules on a target and collect them together -std::string -cmDSPWriter::CreateTargetRules(const cmTarget &target, - const char *libName) -{ - std::string customRuleCode = ""; - - if (target.GetType() >= cmTarget::UTILITY) - { - return customRuleCode; - } - - // Find the group in which the lix exe custom rules belong - bool init = false; - for (std::vector<cmCustomCommand>::const_iterator cr = - target.GetCustomCommands().begin(); - cr != target.GetCustomCommands().end(); ++cr) - { - cmCustomCommand cc(*cr); - cc.ExpandVariables(*m_Makefile); - if (cc.GetSourceName() == libName) - { - if (!init) - { - // header stuff - customRuleCode = "# Begin Special Build Tool\nPostBuild_Cmds="; - init = true; - } - else - { - customRuleCode += "\t"; - } - customRuleCode += cc.GetCommand() + " " + cc.GetArguments(); - } - } - - if (init) - { - customRuleCode += "\n# End Special Build Tool\n"; - } - return customRuleCode; -} - - -inline std::string removeQuotes(const std::string& s) -{ - if(s[0] == '\"' && s[s.size()-1] == '\"') - { - return s.substr(1, s.size()-2); - } - return s; -} - - -void cmDSPWriter::WriteDSPHeader(std::ostream& fout, const char *libName, - const cmTarget &target, - std::vector<cmSourceGroup> &) -{ - std::set<std::string> pathEmitted; - - // determine the link directories - std::string libOptions; - std::string libDebugOptions; - std::string libOptimizedOptions; - - std::string libMultiLineOptions; - std::string libMultiLineDebugOptions; - std::string libMultiLineOptimizedOptions; - - // suppoirt override in output directory - std::string libPath = ""; - if (m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH")) - { - libPath = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH"); - } - std::string exePath = ""; - if (m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH")) - { - exePath = m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH"); - } - - if(libPath.size()) - { - // make sure there is a trailing slash - if(libPath[libPath.size()-1] != '/') - { - libPath += "/"; - } - std::string lpath = - cmSystemTools::ConvertToOutputPath(libPath.c_str()); - std::string lpathIntDir = libPath + "$(INTDIR)"; - lpathIntDir = cmSystemTools::ConvertToOutputPath(lpathIntDir.c_str()); - if(pathEmitted.insert(lpath).second) - { - libOptions += " /LIBPATH:"; - libOptions += lpathIntDir; - libOptions += " "; - libOptions += " /LIBPATH:"; - libOptions += lpath; - libOptions += " "; - libMultiLineOptions += "# ADD LINK32 /LIBPATH:"; - libMultiLineOptions += lpathIntDir; - libMultiLineOptions += " "; - libMultiLineOptions += " /LIBPATH:"; - libMultiLineOptions += lpath; - libMultiLineOptions += " \n"; - } - } - if(exePath.size()) - { - // make sure there is a trailing slash - if(exePath[exePath.size()-1] != '/') - { - exePath += "/"; - } - std::string lpath = - cmSystemTools::ConvertToOutputPath(exePath.c_str()); - std::string lpathIntDir = exePath + "$(INTDIR)"; - lpathIntDir = cmSystemTools::ConvertToOutputPath(lpathIntDir.c_str()); - - if(pathEmitted.insert(lpath).second) - { - libOptions += " /LIBPATH:"; - libOptions += lpathIntDir; - libOptions += " "; - libOptions += " /LIBPATH:"; - libOptions += lpath; - libOptions += " "; - libMultiLineOptions += "# ADD LINK32 /LIBPATH:"; - libMultiLineOptions += lpathIntDir; - libMultiLineOptions += " "; - libMultiLineOptions += " /LIBPATH:"; - libMultiLineOptions += lpath; - libMultiLineOptions += " \n"; - } - } - std::vector<std::string>::const_iterator i; - const std::vector<std::string>& libdirs = target.GetLinkDirectories(); - for(i = libdirs.begin(); i != libdirs.end(); ++i) - { - std::string path = *i; - if(path[path.size()-1] != '/') - { - path += "/"; - } - std::string lpath = - cmSystemTools::ConvertToOutputPath(path.c_str()); - std::string lpathIntDir = path + "$(INTDIR)"; - lpathIntDir = cmSystemTools::ConvertToOutputPath(lpathIntDir.c_str()); - if(pathEmitted.insert(lpath).second) - { - libOptions += " /LIBPATH:"; - libOptions += lpathIntDir; - libOptions += " "; - libOptions += " /LIBPATH:"; - libOptions += lpath; - libOptions += " "; - - libMultiLineOptions += "# ADD LINK32 /LIBPATH:"; - libMultiLineOptions += lpathIntDir; - libMultiLineOptions += " "; - libMultiLineOptions += " /LIBPATH:"; - libMultiLineOptions += lpath; - libMultiLineOptions += " \n"; - } - } - - // find link libraries - const cmTarget::LinkLibraries& libs = target.GetLinkLibraries(); - cmTarget::LinkLibraries::const_iterator j; - for(j = libs.begin(); j != libs.end(); ++j) - { - // add libraries to executables and dlls (but never include - // a library in a library, bad recursion) - if ((target.GetType() != cmTarget::SHARED_LIBRARY - && target.GetType() != cmTarget::STATIC_LIBRARY) || - (target.GetType() == cmTarget::SHARED_LIBRARY && libName != j->first)) - { - std::string lib = j->first; - if(j->first.find(".lib") == std::string::npos) - { - lib += ".lib"; - } - lib = cmSystemTools::ConvertToOutputPath(lib.c_str()); - - if (j->second == cmTarget::GENERAL) - { - libOptions += " "; - libOptions += lib; - - libMultiLineOptions += "# ADD LINK32 "; - libMultiLineOptions += lib; - libMultiLineOptions += "\n"; - } - if (j->second == cmTarget::DEBUG) - { - libDebugOptions += " "; - libDebugOptions += lib; - - libMultiLineDebugOptions += "# ADD LINK32 "; - libMultiLineDebugOptions += lib; - libMultiLineDebugOptions += "\n"; - } - if (j->second == cmTarget::OPTIMIZED) - { - libOptimizedOptions += " "; - libOptimizedOptions += lib; - - libMultiLineOptimizedOptions += "# ADD LINK32 "; - libMultiLineOptimizedOptions += lib; - libMultiLineOptimizedOptions += "\n"; - } - } - } - std::string extraLinkOptions = - m_Makefile->GetDefinition("CMAKE_EXTRA_LINK_FLAGS"); - if(extraLinkOptions.size()) - { - libOptions += " "; - libOptions += extraLinkOptions; - libOptions += " "; - libMultiLineOptions += "# ADD LINK32 "; - libMultiLineOptions += extraLinkOptions; - libMultiLineOptions += " \n"; - } - - // are there any custom rules on the target itself - // only if the target is a lib or exe - std::string customRuleCode = this->CreateTargetRules(target, libName); - - std::ifstream fin(m_DSPHeaderTemplate.c_str()); - if(!fin) - { - cmSystemTools::Error("Error Reading ", m_DSPHeaderTemplate.c_str()); - } - char buffer[2048]; - - while(fin) - { - fin.getline(buffer, 2048); - std::string line = buffer; - const char* mfcFlag = m_Makefile->GetDefinition("CMAKE_MFC_FLAG"); - if(!mfcFlag) - { - mfcFlag = "0"; - } - cmSystemTools::ReplaceString(line, "CMAKE_CUSTOM_RULE_CODE", - customRuleCode.c_str()); - cmSystemTools::ReplaceString(line, "CMAKE_MFC_FLAG", - mfcFlag); - cmSystemTools::ReplaceString(line, "CM_LIBRARIES", - libOptions.c_str()); - cmSystemTools::ReplaceString(line, "CM_DEBUG_LIBRARIES", - libDebugOptions.c_str()); - cmSystemTools::ReplaceString(line, "CM_OPTIMIZED_LIBRARIES", - libOptimizedOptions.c_str()); - - cmSystemTools::ReplaceString(line, "CM_MULTILINE_LIBRARIES", - libMultiLineOptions.c_str()); - cmSystemTools::ReplaceString(line, "CM_MULTILINE_DEBUG_LIBRARIES", - libMultiLineDebugOptions.c_str()); - cmSystemTools::ReplaceString(line, "CM_MULTILINE_OPTIMIZED_LIBRARIES", - libMultiLineOptimizedOptions.c_str()); - - cmSystemTools::ReplaceString(line, "BUILD_INCLUDES", - m_IncludeOptions.c_str()); - cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName); - // because LIBRARY_OUTPUT_PATH and EXECUTABLE_OUTPUT_PATH - // are already quoted in the template file, - // we need to remove the quotes here, we still need - // to convert to output path for unix to win32 conversion - cmSystemTools::ReplaceString(line, "LIBRARY_OUTPUT_PATH", - removeQuotes( - cmSystemTools::ConvertToOutputPath(libPath.c_str())).c_str()); - cmSystemTools::ReplaceString(line, "EXECUTABLE_OUTPUT_PATH", - removeQuotes( - cmSystemTools::ConvertToOutputPath(exePath.c_str())).c_str()); - cmSystemTools::ReplaceString(line, - "EXTRA_DEFINES", - m_Makefile->GetDefineFlags()); - std::string flags = m_Makefile->GetDefinition("CMAKE_CXX_FLAGS_RELEASE"); - flags += " -DCMAKE_INTDIR=\\\"Release\\\""; - cmSystemTools::ReplaceString(line, "CMAKE_CXX_FLAGS_RELEASE", flags.c_str()); - flags = m_Makefile->GetDefinition("CMAKE_CXX_FLAGS_MINSIZEREL"); - flags += " -DCMAKE_INTDIR=\\\"MinSizeRel\\\""; - cmSystemTools::ReplaceString(line, "CMAKE_CXX_FLAGS_MINSIZEREL", flags.c_str()); - flags = m_Makefile->GetDefinition("CMAKE_CXX_FLAGS_DEBUG"); - flags += " -DCMAKE_INTDIR=\\\"Debug\\\""; - cmSystemTools::ReplaceString(line, "CMAKE_CXX_FLAGS_DEBUG", flags.c_str()); - flags = m_Makefile->GetDefinition("CMAKE_CXX_FLAGS_RELWITHDEBINFO"); - flags += " -DCMAKE_INTDIR=\\\"RelWithDebInfo\\\""; - cmSystemTools::ReplaceString(line,"CMAKE_CXX_FLAGS_RELWITHDEBINFO", flags.c_str()); - cmSystemTools::ReplaceString(line, "CMAKE_CXX_FLAGS", - m_Makefile-> - GetDefinition("CMAKE_CXX_FLAGS")); - - fout << line.c_str() << std::endl; - } -} - - -void cmDSPWriter::WriteDSPFooter(std::ostream& fout) -{ - std::ifstream fin(m_DSPFooterTemplate.c_str()); - if(!fin) - { - cmSystemTools::Error("Error Reading ", - m_DSPFooterTemplate.c_str()); - } - char buffer[2048]; - while(fin) - { - fin.getline(buffer, 2048); - fout << buffer << std::endl; - } -} diff --git a/Source/cmDSPWriter.h b/Source/cmDSPWriter.h deleted file mode 100644 index 3e7f535..0000000 --- a/Source/cmDSPWriter.h +++ /dev/null @@ -1,97 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmDSPWriter_h -#define cmDSPWriter_h - -#include "cmStandardIncludes.h" -#include "cmMakefile.h" - -/** \class cmDSPWriter - * \brief Generate a Microsoft DSP project file. - * - * cmDSPWriter generates a Microsoft DSP project file. - * See the *.dsptemplate files for information on the templates - * used for making the project files. - */ -class cmDSPWriter -{ -public: - cmDSPWriter(cmMakefile*); - ~cmDSPWriter(); - void OutputDSPFile(); - enum BuildType {STATIC_LIBRARY, DLL, EXECUTABLE, WIN32_EXECUTABLE, UTILITY}; - - /** - * Specify the type of the build: static, dll, or executable. - */ - void SetBuildType(BuildType,const char *name); - - /** - * Return array of created DSP names in a STL vector. - * Each executable must have its own dsp. - */ - std::vector<std::string> GetCreatedProjectNames() - { - return m_CreatedProjectNames; - } - - /** - * Return the makefile. - */ - cmMakefile* GetMakefile() - { - return m_Makefile; - } - -private: - std::string m_DSPHeaderTemplate; - std::string m_DSPFooterTemplate; - std::vector<std::string> m_CreatedProjectNames; - - void CreateSingleDSP(const char *lname, cmTarget &tgt); - void WriteDSPFile(std::ostream& fout, const char *libName, - cmTarget &tgt); - void WriteDSPBeginGroup(std::ostream& fout, - const char* group, - const char* filter); - void WriteDSPEndGroup(std::ostream& fout); - - void WriteDSPHeader(std::ostream& fout, const char *libName, - const cmTarget &tgt, std::vector<cmSourceGroup> &sgs); - - void WriteDSPFooter(std::ostream& fout); - void AddDSPBuildRule(cmSourceGroup&); - void WriteCustomRule(std::ostream& fout, - const char* source, - const char* command, - const std::set<std::string>& depends, - const std::set<std::string>& outputs, - const char* flags); - - std::string CreateTargetRules(const cmTarget &target, - const char *libName); - std::string CombineCommands(const cmSourceGroup::Commands &commands, - cmSourceGroup::CommandFiles &totalCommand, - const char *source); - - - std::string m_IncludeOptions; - cmMakefile* m_Makefile; - std::vector<std::string> m_Configurations; -}; - -#endif diff --git a/Source/cmDSWWriter.cxx b/Source/cmDSWWriter.cxx deleted file mode 100644 index 52a69c4..0000000 --- a/Source/cmDSWWriter.cxx +++ /dev/null @@ -1,335 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. - -=========================================================================*/ -#include "cmDSWWriter.h" -#include "cmStandardIncludes.h" -#include "cmSystemTools.h" -#include "cmDSPWriter.h" -#include "cmMSProjectGenerator.h" -#include "cmCacheManager.h" - - -cmDSWWriter::cmDSWWriter(cmMakefile* m) -{ - m_Makefile = m; -} - -// output the DSW file -void cmDSWWriter::OutputDSWFile() -{ - // if this is an out of source build, create the output directory - if(strcmp(m_Makefile->GetStartOutputDirectory(), - m_Makefile->GetHomeDirectory()) != 0) - { - if(!cmSystemTools::MakeDirectory(m_Makefile->GetStartOutputDirectory())) - { - cmSystemTools::Error("Error creating output directory for DSW file", - m_Makefile->GetStartOutputDirectory()); - } - } - // create the dsw file name - std::string fname; - fname = m_Makefile->GetStartOutputDirectory(); - fname += "/"; - if(strlen(m_Makefile->GetProjectName())) - { - fname += m_Makefile->GetProjectName(); - } - else - { - fname += "Project"; - } - fname += ".dsw"; - std::ofstream fout(fname.c_str()); - if(!fout) - { - cmSystemTools::Error("Error can not open DSW file for write: " - ,fname.c_str()); - return; - } - this->WriteDSWFile(fout); -} - - -inline std::string removeQuotes(const std::string& s) -{ - if(s[0] == '\"' && s[s.size()-1] == '\"') - { - return s.substr(1, s.size()-2); - } - return s; -} - - -// Write a DSW file to the stream -void cmDSWWriter::WriteDSWFile(std::ostream& fout) -{ - // Write out the header for a DSW file - this->WriteDSWHeader(fout); - - // Create a list of cmMakefile created from all the - // CMakeLists.txt files that are in sub directories of - // this one. - std::vector<cmMakefile*> allListFiles; - // add this makefile to the list - allListFiles.push_back(m_Makefile); - // add a special target that depends on ALL projects for easy build - // of Debug only - m_Makefile->AddUtilityCommand("ALL_BUILD", "echo", "\"Build all projects\"", - false); - std::string ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = removeQuotes(ctest); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - if(!cmSystemTools::FileExists(ctest.c_str())) - { - ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/Debug/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - } - if(!cmSystemTools::FileExists(ctest.c_str())) - { - ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/Release/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - } - // if we found ctest - if (cmSystemTools::FileExists(ctest.c_str())) - { - // Create a full path filename for output Testfile - std::string fname; - fname = m_Makefile->GetStartOutputDirectory(); - fname += "/"; - fname += "DartTestfile.txt"; - - // If the file doesn't exist, then ENABLE_TESTING hasn't been run - if (cmSystemTools::FileExists(fname.c_str())) - { - m_Makefile->AddUtilityCommand("RUN_TESTS", ctest.c_str(), "-D $(IntDir)", - false); - } - } - - m_Makefile->FindSubDirectoryCMakeListsFiles(allListFiles); - // For each cmMakefile, create a DSP for it, and - // add it to this DSW file - for(std::vector<cmMakefile*>::iterator k = allListFiles.begin(); - k != allListFiles.end(); ++k) - { - cmMakefile* mf = *k; - cmMSProjectGenerator* pg = (cmMSProjectGenerator*)mf->GetMakefileGenerator(); - // make sure the generator is building dsp files - pg->BuildDSWOff(); - mf->GenerateMakefile(); - // Get the source directory from the makefile - std::string dir = mf->GetStartDirectory(); - // Get the home directory with the trailing slash - std::string homedir = m_Makefile->GetHomeDirectory(); - homedir += "/"; - // remove the home directory and / from the source directory - // this gives a relative path - cmSystemTools::ReplaceString(dir, homedir.c_str(), ""); - - // Get the list of create dsp files names from the cmDSPWriter, more - // than one dsp could have been created per input CMakeLists.txt file - // for each target - std::vector<std::string> dspnames = - pg->GetDSPWriter()->GetCreatedProjectNames(); - cmTargets &tgts = pg->GetDSPWriter()->GetMakefile()->GetTargets(); - cmTargets::iterator l = tgts.begin(); - for(std::vector<std::string>::iterator si = dspnames.begin(); - l != tgts.end(); ++l) - { - // special handling for the current makefile - if(mf == m_Makefile) - { - dir = "."; // no subdirectory for project generated - // if this is the special ALL_BUILD utility, then - // make it depend on every other non UTILITY project. - // This is done by adding the names to the GetUtilities - // vector on the makefile - if(l->first == "ALL_BUILD") - { - for(std::vector<cmMakefile*>::iterator a = allListFiles.begin(); - a != allListFiles.end(); ++a) - { - const cmTargets &atgts = (*a)->GetTargets(); - for(cmTargets::const_iterator al = atgts.begin(); - al != atgts.end(); ++al) - { - if (al->second.IsInAll()) - { - if (al->second.GetType() == cmTarget::UTILITY) - { - l->second.AddUtility(al->first.c_str()); - } - else - { - l->second.AddLinkLibrary(al->first, cmTarget::GENERAL); - } - } - } - } - } - } - // Write the project into the DSW file - if (strncmp(l->first.c_str(), "INCLUDE_EXTERNAL_MSPROJECT", 26) == 0) - { - cmCustomCommand cc = l->second.GetCustomCommands()[0]; - - // dodgy use of the cmCustomCommand's members to store the - // arguments from the INCLUDE_EXTERNAL_MSPROJECT command - std::vector<std::string> stuff = cc.GetDepends(); - std::vector<std::string> depends = cc.GetOutputs(); - this->WriteExternalProject(fout, stuff[0].c_str(), stuff[1].c_str(), depends); - ++si; - } - else if ((l->second.GetType() != cmTarget::INSTALL_FILES) - && (l->second.GetType() != cmTarget::INSTALL_PROGRAMS)) - { - this->WriteProject(fout, si->c_str(), dir.c_str(), - pg->GetDSPWriter(),l->second); - ++si; - } - } - // delete the cmMakefile which also deletes the cmMSProjectGenerator - if(mf != m_Makefile) - { - delete mf; - } - } - - // Write the footer for the DSW file - this->WriteDSWFooter(fout); -} - - -// Write a dsp file into the DSW file, -// Note, that dependencies from executables to -// the libraries it uses are also done here -void cmDSWWriter::WriteProject(std::ostream& fout, - const char* dspname, - const char* dir, - cmDSPWriter*, - const cmTarget& target - ) -{ - fout << "#########################################################" - "######################\n\n"; - fout << "Project: \"" << dspname << "\"=" - << dir << "\\" << dspname << ".dsp - Package Owner=<4>\n\n"; - fout << "Package=<5>\n{{{\n}}}\n\n"; - fout << "Package=<4>\n"; - fout << "{{{\n"; - - // insert Begin Project Dependency Project_Dep_Name project stuff here - if (target.GetType() != cmTarget::STATIC_LIBRARY) - { - cmTarget::LinkLibraries::const_iterator j, jend; - j = target.GetLinkLibraries().begin(); - jend = target.GetLinkLibraries().end(); - for(;j!= jend; ++j) - { - if(j->first != dspname) - { - // is the library part of this DSW ? If so add dependency - std::string libPath = j->first + "_CMAKE_PATH"; - const char* cacheValue - = m_Makefile->GetDefinition(libPath.c_str()); - if(cacheValue) - { - fout << "Begin Project Dependency\n"; - fout << "Project_Dep_Name " << j->first << "\n"; - fout << "End Project Dependency\n"; - } - } - } - } - - std::set<cmStdString>::const_iterator i, end; - // write utility dependencies. - i = target.GetUtilities().begin(); - end = target.GetUtilities().end(); - for(;i!= end; ++i) - { - if(*i != dspname) - { - fout << "Begin Project Dependency\n"; - fout << "Project_Dep_Name " << *i << "\n"; - fout << "End Project Dependency\n"; - } - } - fout << "}}}\n\n"; -} - - -// Write a dsp file into the DSW file, -// Note, that dependencies from executables to -// the libraries it uses are also done here -void cmDSWWriter::WriteExternalProject(std::ostream& fout, - const char* name, - const char* location, - const std::vector<std::string>& dependencies) -{ - fout << "#########################################################" - "######################\n\n"; - fout << "Project: \"" << name << "\"=" - << location << " - Package Owner=<4>\n\n"; - fout << "Package=<5>\n{{{\n}}}\n\n"; - fout << "Package=<4>\n"; - fout << "{{{\n"; - - - std::vector<std::string>::const_iterator i, end; - // write dependencies. - i = dependencies.begin(); - end = dependencies.end(); - for(;i!= end; ++i) - { - fout << "Begin Project Dependency\n"; - fout << "Project_Dep_Name " << *i << "\n"; - fout << "End Project Dependency\n"; - } - fout << "}}}\n\n"; -} - - - -// Standard end of dsw file -void cmDSWWriter::WriteDSWFooter(std::ostream& fout) -{ - fout << "######################################################" - "#########################\n\n"; - fout << "Global:\n\n"; - fout << "Package=<5>\n{{{\n}}}\n\n"; - fout << "Package=<3>\n{{{\n}}}\n\n"; - fout << "#####################################################" - "##########################\n\n"; -} - - -// ouput standard header for dsw file -void cmDSWWriter::WriteDSWHeader(std::ostream& fout) -{ - fout << "Microsoft Developer Studio Workspace File, Format Version 6.00\n"; - fout << "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n\n"; -} diff --git a/Source/cmDSWWriter.h b/Source/cmDSWWriter.h deleted file mode 100644 index 339b0ce..0000000 --- a/Source/cmDSWWriter.h +++ /dev/null @@ -1,57 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmDSWWriter_h -#define cmDSWWriter_h - -#include "cmStandardIncludes.h" -#include "cmMakefile.h" - -class cmDSPWriter; -class cmMSProjectGenerator; - -/** \class cmDSWWriter - * \brief Write a Microsoft Visual C++ DSW (workspace) file. - * - * cmDSWWriter produces a Microsoft Visual C++ DSW (workspace) file. - */ -class cmDSWWriter -{ -public: - /** - * Constructor. - */ - cmDSWWriter(cmMakefile*); - - /** - * Generate the DSW workspace file. - */ - virtual void OutputDSWFile(); - -private: - void WriteDSWFile(std::ostream& fout); - void WriteDSWHeader(std::ostream& fout); - void WriteProject(std::ostream& fout, - const char* name, const char* path, - cmDSPWriter* project, const cmTarget &t); - void WriteExternalProject(std::ostream& fout, - const char* name, const char* path, - const std::vector<std::string>& dependencies); - void WriteDSWFooter(std::ostream& fout); - cmMakefile* m_Makefile; -}; - -#endif diff --git a/Source/cmMSDotNETGenerator.cxx b/Source/cmMSDotNETGenerator.cxx deleted file mode 100644 index e412139..0000000 --- a/Source/cmMSDotNETGenerator.cxx +++ /dev/null @@ -1,1430 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. - -=========================================================================*/ -#include "cmMSDotNETGenerator.h" -#include "cmStandardIncludes.h" -#include "cmMakefile.h" -#include "cmCacheManager.h" -#include "windows.h" -#include "cmSystemTools.h" -#include "cmRegularExpression.h" -#include "cmSourceGroup.h" - - - - -cmMSDotNETGenerator::cmMSDotNETGenerator() -{ - // default to building a sln project file - BuildProjOn(); -} - -void cmMSDotNETGenerator::GenerateMakefile() -{ - this->EnableLanguage("CXX"); - std::string configTypes = m_Makefile->GetDefinition("CMAKE_CONFIGURATION_TYPES"); - std::string::size_type start = 0; - std::string::size_type endpos = 0; - while(endpos != std::string::npos) - { - endpos = configTypes.find(' ', start); - std::string config; - std::string::size_type len; - if(endpos != std::string::npos) - { - len = endpos - start; - } - else - { - len = configTypes.size() - start; - } - config = configTypes.substr(start, len); - if(config == "Debug" || config == "Release" || - config == "MinSizeRel" || config == "RelWithDebInfo") - { - // only add unique configurations - if(std::find(m_Configurations.begin(), - m_Configurations.end(), config) == m_Configurations.end()) - { - m_Configurations.push_back(config); - } - } - else - { - cmSystemTools::Error("Invalid configuration type in CMAKE_CONFIGURATION_TYPES: ", - config.c_str(), - " (Valid types are Debug,Release,MinSizeRel,RelWithDebInfo)"); - } - start = endpos+1; - } - if(m_Configurations.size() == 0) - { - m_Configurations.push_back("Debug"); - m_Configurations.push_back("Release"); - } - if(m_BuildSLN) - { - this->OutputSLNFile(); - } - else - { - this->OutputVCProjFile(); - } -} - -cmMSDotNETGenerator::~cmMSDotNETGenerator() -{ -} - -void cmMSDotNETGenerator::SetLocal(bool local) -{ - m_BuildSLN = !local; -} - -void cmMSDotNETGenerator::EnableLanguage(const char*) -{ - // now load the settings - if(!m_Makefile->GetDefinition("CMAKE_ROOT")) - { - cmSystemTools::Error( - "CMAKE_ROOT has not been defined, bad GUI or driver program"); - return; - } - if(!this->GetLanguageEnabled("CXX")) - { - std::string fpath = - m_Makefile->GetDefinition("CMAKE_ROOT"); - fpath += "/Templates/CMakeDotNetSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); - this->SetLanguageEnabled("CXX"); - } -} - - - -// output the SLN file -void cmMSDotNETGenerator::OutputSLNFile() -{ - // if this is an out of source build, create the output directory - if(strcmp(m_Makefile->GetStartOutputDirectory(), - m_Makefile->GetHomeDirectory()) != 0) - { - if(!cmSystemTools::MakeDirectory(m_Makefile->GetStartOutputDirectory())) - { - cmSystemTools::Error("Error creating output directory for SLN file", - m_Makefile->GetStartOutputDirectory()); - } - } - // create the dsw file name - std::string fname; - fname = m_Makefile->GetStartOutputDirectory(); - fname += "/"; - if(strlen(m_Makefile->GetProjectName()) == 0) - { - m_Makefile->SetProjectName("Project"); - } - fname += m_Makefile->GetProjectName(); - fname += ".sln"; - std::ofstream fout(fname.c_str()); - if(!fout) - { - cmSystemTools::Error("Error can not open SLN file for write: " - ,fname.c_str()); - return; - } - this->WriteSLNFile(fout); -} - - -// Write a SLN file to the stream -void cmMSDotNETGenerator::WriteSLNFile(std::ostream& fout) -{ - // Write out the header for a SLN file - this->WriteSLNHeader(fout); - - // Create a list of cmMakefile created from all the - // CMakeLists.txt files that are in sub directories of - // this one. - std::vector<cmMakefile*> allListFiles; - // add this makefile to the list - allListFiles.push_back(m_Makefile); - // add a special target that depends on ALL projects for easy build - // of Debug only - m_Makefile->AddUtilityCommand("ALL_BUILD", "echo", "\"Build all projects\"", - false); - - std::string ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - if(!cmSystemTools::FileExists(ctest.c_str())) - { - ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/Debug/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - } - if(!cmSystemTools::FileExists(ctest.c_str())) - { - ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/Release/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - } - // if we found ctest - if (cmSystemTools::FileExists(ctest.c_str())) - { - // Create a full path filename for output Testfile - std::string fname; - fname = m_Makefile->GetStartOutputDirectory(); - fname += "/"; - fname += "DartTestfile.txt"; - - // If the file doesn't exist, then ENABLE_TESTING hasn't been run - if (cmSystemTools::FileExists(fname.c_str())) - { - m_Makefile->AddUtilityCommand("RUN_TESTS", ctest.c_str(), "-D $(IntDir)", - false); - } - } - - m_Makefile->FindSubDirectoryCMakeListsFiles(allListFiles); - // For each cmMakefile, create a VCProj for it, and - // add it to this SLN file - std::vector<cmMakefile*>::iterator k; - for(k = allListFiles.begin(); - k != allListFiles.end(); ++k) - { - cmMakefile* mf = *k; - cmMSDotNETGenerator* pg = - static_cast<cmMSDotNETGenerator*>(mf->GetMakefileGenerator()); - // make sure the generator is building dsp files - pg->BuildSLNOff(); - mf->GenerateMakefile(); - // Get the source directory from the makefile - std::string dir = mf->GetStartDirectory(); - // Get the home directory with the trailing slash - std::string homedir = m_Makefile->GetHomeDirectory(); - homedir += "/"; - // remove the home directory and / from the source directory - // this gives a relative path - cmSystemTools::ReplaceString(dir, homedir.c_str(), ""); - - // Get the list of create dsp files names from the cmVCProjWriter, more - // than one dsp could have been created per input CMakeLists.txt file - // for each target - std::vector<std::string> dspnames = - pg->GetCreatedProjectNames(); - cmTargets &tgts = pg->GetMakefile()->GetTargets(); - cmTargets::iterator l = tgts.begin(); - for(std::vector<std::string>::iterator si = dspnames.begin(); - l != tgts.end(); ++l) - { - // special handling for the current makefile - if(mf == m_Makefile) - { - dir = "."; // no subdirectory for project generated - // if this is the special ALL_BUILD utility, then - // make it depend on every other non UTILITY project. - // This is done by adding the names to the GetUtilities - // vector on the makefile - if(l->first == "ALL_BUILD") - { - for(std::vector<cmMakefile*>::iterator a = allListFiles.begin(); - a != allListFiles.end(); ++a) - { - const cmTargets &atgts = (*a)->GetTargets(); - for(cmTargets::const_iterator al = atgts.begin(); - al != atgts.end(); ++al) - { - if (al->second.IsInAll()) - { - if (al->second.GetType() == cmTarget::UTILITY) - { - l->second.AddUtility(al->first.c_str()); - } - else - { - l->second.AddLinkLibrary(al->first,cmTarget::GENERAL); - } - } - } - } - } - } - // Write the project into the SLN file - if (strncmp(l->first.c_str(), "INCLUDE_EXTERNAL_MSPROJECT", 26) == 0) - { - cmCustomCommand cc = l->second.GetCustomCommands()[0]; - - // dodgy use of the cmCustomCommand's members to store the - // arguments from the INCLUDE_EXTERNAL_MSPROJECT command - std::vector<std::string> stuff = cc.GetDepends(); - std::vector<std::string> depends = cc.GetOutputs(); - this->WriteExternalProject(fout, stuff[0].c_str(), stuff[1].c_str(), depends); - ++si; - } - else if ((l->second.GetType() != cmTarget::INSTALL_FILES) - && (l->second.GetType() != cmTarget::INSTALL_PROGRAMS)) - { - this->WriteProject(fout, si->c_str(), dir.c_str(), - pg,l->second); - ++si; - } - } - } - fout << "Global\n" - << "\tGlobalSection(SolutionConfiguration) = preSolution\n"; - - int c = 0; - for(std::vector<std::string>::iterator i = m_Configurations.begin(); - i != m_Configurations.end(); ++i) - { - fout << "\t\tConfigName." << c << " = " << *i << "\n"; - c++; - } - fout << "\tEndGlobalSection\n" - << "\tGlobalSection(ProjectDependencies) = postSolution\n"; - // loop over again and compute the depends - for(k = allListFiles.begin(); k != allListFiles.end(); ++k) - { - cmMakefile* mf = *k; - cmMSDotNETGenerator* pg = - static_cast<cmMSDotNETGenerator*>(mf->GetMakefileGenerator()); - // Get the list of create dsp files names from the cmVCProjWriter, more - // than one dsp could have been created per input CMakeLists.txt file - // for each target - std::vector<std::string> dspnames = - pg->GetCreatedProjectNames(); - cmTargets &tgts = pg->GetMakefile()->GetTargets(); - cmTargets::iterator l = tgts.begin(); - std::string dir = mf->GetStartDirectory(); - for(std::vector<std::string>::iterator si = dspnames.begin(); - l != tgts.end(); ++l) - { - if ((l->second.GetType() != cmTarget::INSTALL_FILES) - && (l->second.GetType() != cmTarget::INSTALL_PROGRAMS)) - { - this->WriteProjectDepends(fout, si->c_str(), dir.c_str(), - pg,l->second); - ++si; - } - } - } - fout << "\tEndGlobalSection\n"; - fout << "\tGlobalSection(ProjectConfiguration) = postSolution\n"; - // loop over again and compute the depends - for(k = allListFiles.begin(); k != allListFiles.end(); ++k) - { - cmMakefile* mf = *k; - cmMSDotNETGenerator* pg = - static_cast<cmMSDotNETGenerator*>(mf->GetMakefileGenerator()); - // Get the list of create dsp files names from the cmVCProjWriter, more - // than one dsp could have been created per input CMakeLists.txt file - // for each target - std::vector<std::string> dspnames = - pg->GetCreatedProjectNames(); - cmTargets &tgts = pg->GetMakefile()->GetTargets(); - cmTargets::iterator l = tgts.begin(); - std::string dir = mf->GetStartDirectory(); - for(std::vector<std::string>::iterator si = dspnames.begin(); - l != tgts.end(); ++l) - { - if ((l->second.GetType() != cmTarget::INSTALL_FILES) - && (l->second.GetType() != cmTarget::INSTALL_PROGRAMS)) - { - this->WriteProjectConfigurations(fout, si->c_str()); - ++si; - } - } - // delete the cmMakefile which also deletes the cmMSProjectGenerator - if(mf != m_Makefile) - { - delete mf; - } - } - fout << "\tEndGlobalSection\n"; - - // Write the footer for the SLN file - this->WriteSLNFooter(fout); -} - - -// Write a dsp file into the SLN file, -// Note, that dependencies from executables to -// the libraries it uses are also done here -void cmMSDotNETGenerator::WriteProject(std::ostream& fout, - const char* dspname, - const char* dir, - cmMSDotNETGenerator*, - const cmTarget& - ) -{ - std::string d = cmSystemTools::ConvertToOutputPath(dir); - fout << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\" = \"" - << dspname << "\", \"" - << d << "\\" << dspname << ".vcproj\", \"{" - << this->CreateGUID(dspname) << "}\"\nEndProject\n"; -} - - - -// Write a dsp file into the SLN file, -// Note, that dependencies from executables to -// the libraries it uses are also done here -void cmMSDotNETGenerator::WriteProjectDepends(std::ostream& fout, - const char* dspname, - const char* , - cmMSDotNETGenerator*, - const cmTarget& target - ) -{ - int depcount = 0; - // insert Begin Project Dependency Project_Dep_Name project stuff here - if (target.GetType() != cmTarget::STATIC_LIBRARY) - { - cmTarget::LinkLibraries::const_iterator j, jend; - j = target.GetLinkLibraries().begin(); - jend = target.GetLinkLibraries().end(); - for(;j!= jend; ++j) - { - if(j->first != dspname) - { - // is the library part of this SLN ? If so add dependency - std::string libPath = j->first + "_CMAKE_PATH"; - const char* cacheValue - = m_Makefile->GetDefinition(libPath.c_str()); - if(cacheValue) - { - fout << "\t\t{" << this->CreateGUID(dspname) << "}." << depcount << " = {" - << this->CreateGUID(j->first.c_str()) << "}\n"; - depcount++; - } - } - } - } - - std::set<cmStdString>::const_iterator i, end; - // write utility dependencies. - i = target.GetUtilities().begin(); - end = target.GetUtilities().end(); - for(;i!= end; ++i) - { - if(*i != dspname) - { - fout << "\t\t{" << this->CreateGUID(dspname) << "}." << depcount << " = {" - << this->CreateGUID(i->c_str()) << "}\n"; - depcount++; - } - } -} - - -// Write a dsp file into the SLN file, -// Note, that dependencies from executables to -// the libraries it uses are also done here -void cmMSDotNETGenerator::WriteProjectConfigurations(std::ostream& fout, const char* name) -{ - std::string guid = this->CreateGUID(name); - for(std::vector<std::string>::iterator i = m_Configurations.begin(); - i != m_Configurations.end(); ++i) - { - fout << "\t\t{" << guid << "}." << *i << ".ActiveCfg = " << *i << "|Win32\n" - << "\t\t{" << guid << "}." << *i << ".Build.0 = " << *i << "|Win32\n"; - } -} - - - -// Write a dsp file into the SLN file, -// Note, that dependencies from executables to -// the libraries it uses are also done here -void cmMSDotNETGenerator::WriteExternalProject(std::ostream& , - const char* , - const char* , - const std::vector<std::string>& ) -{ - cmSystemTools::Error("WriteExternalProject not implemented"); -// fout << "#########################################################" -// "######################\n\n"; -// fout << "Project: \"" << name << "\"=" -// << location << " - Package Owner=<4>\n\n"; -// fout << "Package=<5>\n{{{\n}}}\n\n"; -// fout << "Package=<4>\n"; -// fout << "{{{\n"; - - -// std::vector<std::string>::const_iterator i, end; -// // write dependencies. -// i = dependencies.begin(); -// end = dependencies.end(); -// for(;i!= end; ++i) -// { -// fout << "Begin Project Dependency\n"; -// fout << "Project_Dep_Name " << *i << "\n"; -// fout << "End Project Dependency\n"; -// } -// fout << "}}}\n\n"; -} - - - -// Standard end of dsw file -void cmMSDotNETGenerator::WriteSLNFooter(std::ostream& fout) -{ - fout << "\tGlobalSection(ExtensibilityGlobals) = postSolution\n" - << "\tEndGlobalSection\n" - << "\tGlobalSection(ExtensibilityAddIns) = postSolution\n" - << "\tEndGlobalSection\n" - << "EndGlobal\n"; -} - - -// ouput standard header for dsw file -void cmMSDotNETGenerator::WriteSLNHeader(std::ostream& fout) -{ - fout << "Microsoft Visual Studio Solution File, Format Version 7.00\n"; -} - - -std::string cmMSDotNETGenerator::CreateGUID(const char* name) -{ - std::map<cmStdString, cmStdString>::iterator i = m_GUIDMap.find(name); - if(i != m_GUIDMap.end()) - { - return i->second; - } - std::string ret; - UUID uid; - unsigned char *uidstr; - UuidCreate(&uid); - UuidToString(&uid,&uidstr); - ret = reinterpret_cast<char*>(uidstr); - RpcStringFree(&uidstr); - ret = cmSystemTools::UpperCase(ret); - m_GUIDMap[name] = ret; - return ret; -} - - - - -// TODO -// for CommandLine= need to repleace quotes with " -// write out configurations - - -void cmMSDotNETGenerator::OutputVCProjFile() -{ - // If not an in source build, then create the output directory - if(strcmp(m_Makefile->GetStartOutputDirectory(), - m_Makefile->GetHomeDirectory()) != 0) - { - if(!cmSystemTools::MakeDirectory(m_Makefile->GetStartOutputDirectory())) - { - cmSystemTools::Error("Error creating directory ", - m_Makefile->GetStartOutputDirectory()); - } - } - - m_LibraryOutputPath = ""; - if (m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH")) - { - m_LibraryOutputPath = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH"); - } - if(m_LibraryOutputPath.size()) - { - // make sure there is a trailing slash - if(m_LibraryOutputPath[m_LibraryOutputPath.size()-1] != '/') - { - m_LibraryOutputPath += "/"; - } - } - m_ExecutableOutputPath = ""; - if (m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH")) - { - m_ExecutableOutputPath = m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH"); - } - if(m_ExecutableOutputPath.size()) - { - // make sure there is a trailing slash - if(m_ExecutableOutputPath[m_ExecutableOutputPath.size()-1] != '/') - { - m_ExecutableOutputPath += "/"; - } - } - - // Create the VCProj or set of VCProj's for libraries and executables - - // clear project names - m_CreatedProjectNames.clear(); - - // build any targets - cmTargets &tgts = m_Makefile->GetTargets(); - for(cmTargets::iterator l = tgts.begin(); - l != tgts.end(); l++) - { - // INCLUDE_EXTERNAL_MSPROJECT command only affects the workspace - // so don't build a projectfile for it - if ((l->second.GetType() != cmTarget::INSTALL_FILES) - && (l->second.GetType() != cmTarget::INSTALL_PROGRAMS) - && (strncmp(l->first.c_str(), "INCLUDE_EXTERNAL_MSPROJECT", 26) != 0)) - { - this->CreateSingleVCProj(l->first.c_str(),l->second); - } - } -} - -void cmMSDotNETGenerator::CreateSingleVCProj(const char *lname, cmTarget &target) -{ - // add to the list of projects - std::string pname = lname; - m_CreatedProjectNames.push_back(pname); - // create the dsp.cmake file - std::string fname; - fname = m_Makefile->GetStartOutputDirectory(); - fname += "/"; - fname += lname; - fname += ".vcproj"; - // save the name of the real dsp file - std::string realVCProj = fname; - fname += ".cmake"; - std::ofstream fout(fname.c_str()); - if(!fout) - { - cmSystemTools::Error("Error Writing ", fname.c_str()); - } - this->WriteVCProjFile(fout,lname,target); - fout.close(); - // if the dsp file has changed, then write it. - cmSystemTools::CopyFileIfDifferent(fname.c_str(), realVCProj.c_str()); -} - - -void cmMSDotNETGenerator::AddVCProjBuildRule(cmSourceGroup& sourceGroup) -{ - std::string dspname = *(m_CreatedProjectNames.end()-1); - if(dspname == "ALL_BUILD") - { - return; - } - dspname += ".vcproj.cmake"; - std::string makefileIn = m_Makefile->GetStartDirectory(); - makefileIn += "/"; - makefileIn += "CMakeLists.txt"; - makefileIn = cmSystemTools::ConvertToOutputPath(makefileIn.c_str()); - std::string dsprule = "${CMAKE_COMMAND}"; - m_Makefile->ExpandVariablesInString(dsprule); - dsprule = cmSystemTools::ConvertToOutputPath(dsprule.c_str()); - std::string args = makefileIn; - args += " -H"; - args += - cmSystemTools::ConvertToOutputPath(m_Makefile->GetHomeDirectory()); - args += " -S"; - args += - cmSystemTools::ConvertToOutputPath(m_Makefile->GetStartDirectory()); - args += " -O"; - args += - cmSystemTools::ConvertToOutputPath(m_Makefile->GetStartOutputDirectory()); - args += " -B"; - args += - cmSystemTools::ConvertToOutputPath(m_Makefile->GetHomeOutputDirectory()); - args += ""; - m_Makefile->ExpandVariablesInString(args); - - std::string configFile = - m_Makefile->GetDefinition("CMAKE_ROOT"); - configFile += "/Templates/CMakeWindowsSystemConfig.cmake"; - std::vector<std::string> listFiles = m_Makefile->GetListFiles(); - bool found = false; - for(std::vector<std::string>::iterator i = listFiles.begin(); - i != listFiles.end(); ++i) - { - if(*i == configFile) - { - found = true; - } - } - if(!found) - { - listFiles.push_back(configFile); - } - - std::vector<std::string> outputs; - outputs.push_back(dspname); - cmCustomCommand cc(makefileIn.c_str(), dsprule.c_str(), - args.c_str(), - listFiles, - outputs); - sourceGroup.AddCustomCommand(cc); -} - - -void cmMSDotNETGenerator::WriteConfigurations(std::ostream& fout, - const char *libName, - const cmTarget &target) -{ - fout << "\t<Configurations>\n"; - for( std::vector<std::string>::iterator i = m_Configurations.begin(); - i != m_Configurations.end(); ++i) - { - this->WriteConfiguration(fout, i->c_str(), libName, target); - } - fout << "\t</Configurations>\n"; -} - -void cmMSDotNETGenerator::WriteConfiguration(std::ostream& fout, - const char* configName, - const char *libName, - const cmTarget &target) -{ - const char* mfcFlag = m_Makefile->GetDefinition("CMAKE_MFC_FLAG"); - if(!mfcFlag) - { - mfcFlag = "0"; - } - fout << "\t\t<Configuration\n" - << "\t\t\tName=\"" << configName << "|Win32\"\n" - << "\t\t\tOutputDirectory=\"" << configName << "\"\n"; - // This is an internal type to Visual Studio, it seems that: - // 4 == static library - // 2 == dll - // 1 == executable - // 10 == utility - const char* configType = "10"; - switch(target.GetType()) - { - case cmTarget::STATIC_LIBRARY: - configType = "4"; - break; - case cmTarget::SHARED_LIBRARY: - case cmTarget::MODULE_LIBRARY: - configType = "2"; - break; - case cmTarget::EXECUTABLE: - case cmTarget::WIN32_EXECUTABLE: - configType = "1"; - break; - case cmTarget::UTILITY: - configType = "10"; - default: - break; - } - - fout << "\t\t\tIntermediateDirectory=\".\\" << configName << "\"\n" - << "\t\t\tConfigurationType=\"" << configType << "\"\n" - << "\t\t\tUseOfMFC=\"" << mfcFlag << "\"\n" - << "\t\t\tATLMinimizesCRunTimeLibraryUsage=\"FALSE\"\n" - << "\t\t\tCharacterSet=\"2\">\n"; - fout << "\t\t\t<Tool\n" - << "\t\t\t\tName=\"VCCLCompilerTool\"\n" - << "\t\t\t\tAdditionalOptions=\"" - << m_Makefile->GetDefinition("CMAKE_CXX_FLAGS") - << " -DCMAKE_INTDIR=\\"" << configName << "\\"" - << "\"\n"; - - fout << "\t\t\t\tAdditionalIncludeDirectories=\""; - std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories(); - std::vector<std::string>::iterator i = includes.begin(); - for(;i != includes.end(); ++i) - { - std::string ipath = this->ConvertToXMLOutputPath(i->c_str()); - fout << ipath << ";"; - } - fout << "\"\n"; - -// Optimization = 0 None Debug /O0 -// Optimization = 1 MinSize /O1 -// Optimization = 2 MaxSpeed /O2 -// Optimization = 3 Max Optimization /O3 -// RuntimeLibrary = 0 /MT multithread -// RuntimeLibrary = 1 /MTd multithread debug -// RuntimeLibrary = 2 /MD multithread dll -// RuntimeLibrary = 3 /MDd multithread dll debug -// RuntimeLibrary = 4 /ML single thread -// RuntimeLibrary = 5 /MLd single thread debug -// InlineFunctionExpansion = 0 none -// InlineFunctionExpansion = 1 when inline keyword -// InlineFunctionExpansion = 2 any time you can - - - if(strcmp(configName, "Debug") == 0) - { - fout << "\t\t\t\tOptimization=\"0\"\n" - << "\t\t\t\tRuntimeLibrary=\"3\"\n" - << "\t\t\t\tInlineFunctionExpansion=\"0\"\n" - << "\t\t\t\tPreprocessorDefinitions=\"WIN32,_DEBUG,_WINDOWS"; - } - else if(strcmp(configName, "Release") == 0) - { - fout << "\t\t\t\tOptimization=\"2\"\n" - << "\t\t\t\tRuntimeLibrary=\"2\"\n" - << "\t\t\t\tInlineFunctionExpansion=\"1\"\n" - << "\t\t\t\tPreprocessorDefinitions=\"WIN32,NDEBUG,_WINDOWS"; - } - else if(strcmp(configName, "MinSizeRel") == 0) - { - fout << "\t\t\t\tOptimization=\"1\"\n" - << "\t\t\t\tRuntimeLibrary=\"2\"\n" - << "\t\t\t\tInlineFunctionExpansion=\"1\"\n" - << "\t\t\t\tPreprocessorDefinitions=\"WIN32,NDEBUG,_WINDOWS"; - } - else if(strcmp(configName, "RelWithDebInfo") == 0) - { - fout << "\t\t\t\tOptimization=\"2\"\n" - << "\t\t\t\tRuntimeLibrary=\"2\"\n" - << "\t\t\t\tInlineFunctionExpansion=\"1\"\n" - << "\t\t\t\tPreprocessorDefinitions=\"WIN32,NDEBUG,_WINDOWS"; - } - if(target.GetType() == cmTarget::SHARED_LIBRARY - || target.GetType() == cmTarget::MODULE_LIBRARY) - { - fout << "," << libName << "_EXPORTS"; - } - this->OutputDefineFlags(fout); - fout << "\"\n"; - if(m_Makefile->IsOn("CMAKE_CXX_USE_RTTI")) - { - fout << "\t\t\t\tRuntimeTypeInfo=\"TRUE\"\n"; - } - fout << "\t\t\t\tAssemblerListingLocation=\"" << configName << "\"\n"; - fout << "\t\t\t\tObjectFile=\"" << configName << "\\\"\n"; - fout << "\t\t\t\tWarningLevel=\"" << m_Makefile->GetDefinition("CMAKE_CXX_WARNING_LEVEL") << "\"\n"; - fout << "\t\t\t\tDetect64BitPortabilityProblems=\"TRUE\"\n" - << "\t\t\t\tDebugInformationFormat=\"3\""; - fout << "/>\n"; // end of <Tool Name=VCCLCompilerTool - - fout << "\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"/>\n"; - fout << "\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n" - << "AdditionalIncludeDirectories=\""; - for(i = includes.begin();i != includes.end(); ++i) - { - std::string ipath = this->ConvertToXMLOutputPath(i->c_str()); - fout << ipath << ";"; - } - fout << "\"\n/>\n"; - fout << "\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"/>\n"; - fout << "\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\""; - this->OutputTargetRules(fout, target, libName); - fout << "/>\n"; - fout << "\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\n"; - this->OutputBuildTool(fout, configName, libName, target); - fout << "\t\t</Configuration>\n"; -} - -void cmMSDotNETGenerator::OutputBuildTool(std::ostream& fout, - const char* configName, - const char *libName, - const cmTarget &target) -{ - std::string temp; - switch(target.GetType()) - { - case cmTarget::STATIC_LIBRARY: - { - std::string libpath = m_LibraryOutputPath + - "$(OutDir)/" + libName + ".lib"; - fout << "\t\t\t<Tool\n" - << "\t\t\t\tName=\"VCLibrarianTool\"\n" - << "\t\t\t\t\tOutputFile=\"" - << this->ConvertToXMLOutputPathSingle(libpath.c_str()) << ".\"/>\n"; - break; - } - case cmTarget::SHARED_LIBRARY: - case cmTarget::MODULE_LIBRARY: - fout << "\t\t\t<Tool\n" - << "\t\t\t\tName=\"VCLinkerTool\"\n" - << "\t\t\t\tAdditionalOptions=\"/MACHINE:I386\"\n" - << "\t\t\t\tAdditionalDependencies=\" odbc32.lib odbccp32.lib "; - this->OutputLibraries(fout, configName, libName, target); - fout << "\"\n"; - temp = m_LibraryOutputPath; - temp += configName; - temp += "/"; - temp += libName; - temp += ".dll"; - fout << "\t\t\t\tOutputFile=\"" - << this->ConvertToXMLOutputPathSingle(temp.c_str()) << "\"\n"; - fout << "\t\t\t\tLinkIncremental=\"1\"\n"; - fout << "\t\t\t\tSuppressStartupBanner=\"TRUE\"\n"; - fout << "\t\t\t\tAdditionalLibraryDirectories=\""; - this->OutputLibraryDirectories(fout, configName, libName, target); - fout << "\"\n"; - this->OutputModuleDefinitionFile(fout, target); - temp = m_LibraryOutputPath; - temp += "$(OutDir)"; - temp += "/"; - temp += libName; - temp += ".pdb"; - fout << "\t\t\t\tProgramDatabaseFile=\"" << - this->ConvertToXMLOutputPathSingle(temp.c_str()) << "\"\n"; - if(strcmp(configName, "Debug") == 0 - || strcmp(configName, "RelWithDebInfo") == 0) - { - fout << "\t\t\t\tGenerateDebugInformation=\"TRUE\"\n"; - } - fout << "\t\t\t\tStackReserveSize=\"" - << m_Makefile->GetDefinition("CMAKE_CXX_STACK_SIZE") << "\"\n"; - temp = m_ExecutableOutputPath; - temp += configName; - temp += "/"; - temp += libName; - temp += ".lib"; - fout << "\t\t\t\tImportLibrary=\"" << this->ConvertToXMLOutputPathSingle(temp.c_str()) << "\"/>\n"; - break; - case cmTarget::EXECUTABLE: - case cmTarget::WIN32_EXECUTABLE: - - fout << "\t\t\t<Tool\n" - << "\t\t\t\tName=\"VCLinkerTool\"\n" - << "\t\t\t\tAdditionalOptions=\"/MACHINE:I386\"\n" - << "\t\t\t\tAdditionalDependencies=\" odbc32.lib odbccp32.lib "; - this->OutputLibraries(fout, configName, libName, target); - fout << "\"\n"; - temp = m_ExecutableOutputPath; - temp += configName; - temp += "/"; - temp += libName; - temp += ".exe"; - fout << "\t\t\t\tOutputFile=\"" << this->ConvertToXMLOutputPathSingle(temp.c_str()) << "\"\n"; - fout << "\t\t\t\tLinkIncremental=\"1\"\n"; - fout << "\t\t\t\tSuppressStartupBanner=\"TRUE\"\n"; - fout << "\t\t\t\tAdditionalLibraryDirectories=\""; - this->OutputLibraryDirectories(fout, configName, libName, target); - fout << "\"\n"; - fout << "\t\t\t\tProgramDatabaseFile=\"" << m_LibraryOutputPath - << "$(OutDir)\\" << libName << ".pdb\"\n"; - if(strcmp(configName, "Debug") == 0 - || strcmp(configName, "RelWithDebInfo") == 0) - { - fout << "\t\t\t\tGenerateDebugInformation=\"TRUE\"\n"; - } - if( target.GetType() == cmTarget::EXECUTABLE) - { - fout << "\t\t\t\tSubSystem=\"1\"\n"; - } - else - { - fout << "\t\t\t\tSubSystem=\"2\"\n"; - } - fout << "\t\t\t\tStackReserveSize=\"" - << m_Makefile->GetDefinition("CMAKE_CXX_STACK_SIZE") << "\"/>\n"; - break; - case cmTarget::UTILITY: - break; - } -} - -void cmMSDotNETGenerator::OutputModuleDefinitionFile(std::ostream& fout, - const cmTarget &target) -{ - std::vector<cmSourceFile*> const& classes = target.GetSourceFiles(); - for(std::vector<cmSourceFile*>::const_iterator i = classes.begin(); - i != classes.end(); i++) - { - if(cmSystemTools::UpperCase((*i)->GetSourceExtension()) == "DEF") - { - fout << "\t\t\t\tModuleDefinitionFile=\"" - << this->ConvertToXMLOutputPath((*i)->GetFullPath().c_str()) - << "\"\n"; - return; - } - } - -} - -void cmMSDotNETGenerator::OutputLibraryDirectories(std::ostream& fout, - const char*, - const char*, - const cmTarget &tgt) -{ - bool hasone = false; - if(m_LibraryOutputPath.size()) - { - hasone = true; - std::string temp = m_LibraryOutputPath; - temp += "$(INTDIR)"; - - fout << this->ConvertToXMLOutputPath(temp.c_str()) << "," << - this->ConvertToXMLOutputPath(m_LibraryOutputPath.c_str()); - } - if(m_ExecutableOutputPath.size()) - { - hasone = true; - std::string temp = m_ExecutableOutputPath; - temp += "$(INTDIR)"; - fout << this->ConvertToXMLOutputPath(temp.c_str()) << "," << - this->ConvertToXMLOutputPath(m_ExecutableOutputPath.c_str()); - } - - std::set<std::string> pathEmitted; - std::vector<std::string>::const_iterator i; - const std::vector<std::string>& libdirs = tgt.GetLinkDirectories(); - for(i = libdirs.begin(); i != libdirs.end(); ++i) - { - std::string lpath = *i; - if(lpath[lpath.size()-1] != '/') - { - lpath += "/"; - } - if(pathEmitted.insert(lpath).second) - { - if(hasone) - { - fout << ","; - } - std::string lpathi = lpath + "$(INTDIR)"; - fout << this->ConvertToXMLOutputPath(lpathi.c_str()) << "," << lpath; - hasone = true; - } - } -} - -void cmMSDotNETGenerator::OutputLibraries(std::ostream& fout, - const char* configName, - const char* libName, - const cmTarget &target) -{ - const cmTarget::LinkLibraries& libs = target.GetLinkLibraries(); - cmTarget::LinkLibraries::const_iterator j; - for(j = libs.begin(); j != libs.end(); ++j) - { - if(j->first != libName) - { - std::string lib = j->first; - if(j->first.find(".lib") == std::string::npos) - { - lib += ".lib"; - } - lib = this->ConvertToXMLOutputPath(lib.c_str()); - if (j->second == cmTarget::GENERAL - || (j->second == cmTarget::DEBUG && strcmp(configName, "DEBUG") == 0) - || (j->second == cmTarget::OPTIMIZED && strcmp(configName, "DEBUG") != 0)) - { - fout << lib << " "; - } - } - } -} - -void cmMSDotNETGenerator::OutputDefineFlags(std::ostream& fout) -{ - std::string defs = m_Makefile->GetDefineFlags(); - std::string::size_type pos = defs.find("-D"); - bool done = pos == std::string::npos; - if(!done) - { - fout << ","; - } - while(!done) - { - std::string::size_type nextpos = defs.find("-D", pos+2); - std::string define; - if(nextpos != std::string::npos) - { - define = defs.substr(pos+2, nextpos - pos -3); - } - else - { - define = defs.substr(pos+2); - done = true; - } - fout << define << ","; - if(!done) - { - pos = defs.find("-D", nextpos); - } - } -} - -void cmMSDotNETGenerator::WriteVCProjFile(std::ostream& fout, - const char *libName, - cmTarget &target) -{ - // We may be modifying the source groups temporarily, so make a copy. - std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups(); - - // get the classes from the source lists then add them to the groups - std::vector<cmSourceFile*> const& classes = target.GetSourceFiles(); - for(std::vector<cmSourceFile*>::const_iterator i = classes.begin(); - i != classes.end(); i++) - { - // Add the file to the list of sources. - std::string source = (*i)->GetFullPath(); - if(cmSystemTools::UpperCase((*i)->GetSourceExtension()) == "DEF") - { - m_ModuleDefinitionFile = (*i)->GetFullPath(); - } - - cmSourceGroup& sourceGroup = m_Makefile->FindSourceGroup(source.c_str(), - sourceGroups); - sourceGroup.AddSource(source.c_str(), *i); - } - - // add any custom rules to the source groups - for (std::vector<cmCustomCommand>::const_iterator cr = - target.GetCustomCommands().begin(); - cr != target.GetCustomCommands().end(); ++cr) - { - cmSourceGroup& sourceGroup = - m_Makefile->FindSourceGroup(cr->GetSourceName().c_str(), - sourceGroups); - cmCustomCommand cc(*cr); - cc.ExpandVariables(*m_Makefile); - sourceGroup.AddCustomCommand(cc); - } - - // open the project - this->WriteProjectStart(fout, libName, target, sourceGroups); - // write the configuration information - this->WriteConfigurations(fout, libName, target); - - fout << "\t<Files>\n"; - // Find the group in which the CMakeLists.txt source belongs, and add - // the rule to generate this VCProj file. - for(std::vector<cmSourceGroup>::reverse_iterator sg = sourceGroups.rbegin(); - sg != sourceGroups.rend(); ++sg) - { - if(sg->Matches("CMakeLists.txt")) - { - this->AddVCProjBuildRule(*sg); - break; - } - } - - - // Loop through every source group. - for(std::vector<cmSourceGroup>::const_iterator sg = sourceGroups.begin(); - sg != sourceGroups.end(); ++sg) - { - const cmSourceGroup::BuildRules& buildRules = sg->GetBuildRules(); - // If the group is empty, don't write it at all. - if(buildRules.empty()) - { continue; } - - // If the group has a name, write the header. - std::string name = sg->GetName(); - if(name != "") - { - this->WriteVCProjBeginGroup(fout, name.c_str(), ""); - } - - // Loop through each build rule in the source group. - for(cmSourceGroup::BuildRules::const_iterator cc = - buildRules.begin(); cc != buildRules.end(); ++ cc) - { - std::string source = cc->first; - const cmSourceGroup::Commands& commands = cc->second.m_Commands; - const char* compileFlags = 0; - if(cc->second.m_SourceFile) - { - compileFlags = cc->second.m_SourceFile->GetProperty("COMPILE_FLAGS"); - } - if (source != libName || target.GetType() == cmTarget::UTILITY) - { - fout << "\t\t\t<File\n"; - std::string d = cmSystemTools::ConvertToOutputPath(source.c_str()); - // remove double quotes from the string - cmSystemTools::ReplaceString(d, "\"", ""); - // Tell MS-Dev what the source is. If the compiler knows how to - // build it, then it will. - fout << "\t\t\t\tRelativePath=\"" << d << "\">\n"; - if (!commands.empty()) - { - cmSourceGroup::CommandFiles totalCommand; - std::string totalCommandStr; - totalCommandStr = this->CombineCommands(commands, totalCommand, - source.c_str()); - this->WriteCustomRule(fout, source.c_str(), totalCommandStr.c_str(), - totalCommand.m_Depends, - totalCommand.m_Outputs, compileFlags); - } - else if(compileFlags) - { - for(std::vector<std::string>::iterator i - = m_Configurations.begin(); i != m_Configurations.end(); ++i) - { - fout << "\t\t\t\t<FileConfiguration\n" - << "\t\t\t\t\tName=\"" << *i << "|Win32\">\n" - << "\t\t\t\t\t<Tool\n" - << "\t\t\t\t\tName=\"VCCLCompilerTool\"\n" - << "\t\t\t\t\tAdditionalOptions=\"" - << compileFlags << "\"/>\n" - << "\t\t\t\t</FileConfiguration>\n"; - } - } - fout << "\t\t\t</File>\n"; - } - } - - // If the group has a name, write the footer. - if(name != "") - { - this->WriteVCProjEndGroup(fout); - } - } - fout << "\t</Files>\n"; - - // Write the VCProj file's footer. - this->WriteVCProjFooter(fout); -} - - -void cmMSDotNETGenerator::WriteCustomRule(std::ostream& fout, - const char* source, - const char* command, - const std::set<std::string>& depends, - const std::set<std::string>& outputs, - const char* compileFlags) -{ - std::string cmd = command; - cmSystemTools::ReplaceString(cmd, "\"", """); - std::vector<std::string>::iterator i; - for(i = m_Configurations.begin(); i != m_Configurations.end(); ++i) - { - fout << "\t\t\t\t<FileConfiguration\n"; - fout << "\t\t\t\t\tName=\"" << *i << "|Win32\">\n"; - if(compileFlags) - { - fout << "\t\t\t\t\t<Tool\n" - << "\t\t\t\t\tName=\"VCCLCompilerTool\"\n" - << "\t\t\t\t\tAdditionalOptions=\"" - << compileFlags << "\"/>\n"; - } - fout << "\t\t\t\t\t<Tool\n" - << "\t\t\t\t\tName=\"VCCustomBuildTool\"\n" - << "\t\t\t\t\tCommandLine=\"" << cmd << "\n\"\n" - << "\t\t\t\t\tAdditionalDependencies=\""; - // Write out the dependencies for the rule. - std::string temp; - for(std::set<std::string>::const_iterator d = depends.begin(); - d != depends.end(); ++d) - { - fout << this->ConvertToXMLOutputPath(d->c_str()) - << ";"; - } - fout << "\"\n"; - fout << "\t\t\t\t\tOutputs=\""; - if(outputs.size() == 0) - { - fout << source << "_force"; - } - - bool first = true; - // Write a rule for every output generated by this command. - for(std::set<std::string>::const_iterator output = outputs.begin(); - output != outputs.end(); ++output) - { - if(!first) - { - fout << ";"; - } - else - { - first = false; - } - fout << output->c_str(); - } - fout << "\"/>\n"; - fout << "\t\t\t\t</FileConfiguration>\n"; - } -} - - -void cmMSDotNETGenerator::WriteVCProjBeginGroup(std::ostream& fout, - const char* group, - const char* ) -{ - fout << "\t\t<Filter\n" - << "\t\t\tName=\"" << group << "\"\n" - << "\t\t\tFilter=\"\">\n"; -} - - -void cmMSDotNETGenerator::WriteVCProjEndGroup(std::ostream& fout) -{ - fout << "\t\t</Filter>\n"; -} - - - - - -std::string -cmMSDotNETGenerator::CombineCommands(const cmSourceGroup::Commands &commands, - cmSourceGroup::CommandFiles &totalCommand, - const char *source) - -{ - // Loop through every custom command generating code from the - // current source. - // build up the depends and outputs and commands - std::string totalCommandStr = ""; - std::string temp; - for(cmSourceGroup::Commands::const_iterator c = commands.begin(); - c != commands.end(); ++c) - { - temp= - cmSystemTools::ConvertToOutputPath(c->second.m_Command.c_str()); - totalCommandStr += temp; - totalCommandStr += " "; - totalCommandStr += c->second.m_Arguments; - totalCommandStr += "\n"; - totalCommand.Merge(c->second); - } - // Create a dummy file with the name of the source if it does - // not exist - if(totalCommand.m_Outputs.empty()) - { - std::string dummyFile = m_Makefile->GetStartOutputDirectory(); - dummyFile += "/"; - dummyFile += source; - if(!cmSystemTools::FileExists(dummyFile.c_str())) - { - std::ofstream fout(dummyFile.c_str()); - fout << "Dummy file created by cmake as unused source for utility command.\n"; - } - } - return totalCommandStr; -} - - -// look for custom rules on a target and collect them together - -void cmMSDotNETGenerator::OutputTargetRules(std::ostream& fout, - const cmTarget &target, - const char *libName) -{ - if (target.GetType() >= cmTarget::UTILITY) - { - return; - } - - // Find the group in which the lix exe custom rules belong - bool init = false; - for (std::vector<cmCustomCommand>::const_iterator cr = - target.GetCustomCommands().begin(); - cr != target.GetCustomCommands().end(); ++cr) - { - cmCustomCommand cc(*cr); - cc.ExpandVariables(*m_Makefile); - if (cc.GetSourceName() == libName) - { - if(!init) - { - fout << "\nCommandLine=\""; - init = true; - } - std::string args = cc.GetArguments(); - cmSystemTools::ReplaceString(args, "\"", """); - fout << this->ConvertToXMLOutputPath(cc.GetCommand().c_str()) << " " << args << "\n"; - } - } - if (init) - { - fout << "\""; - } -} - -void cmMSDotNETGenerator::WriteProjectStart(std::ostream& fout, const char *libName, - const cmTarget &, - std::vector<cmSourceGroup> &) -{ - fout << "<?xml version=\"1.0\" encoding = \"Windows-1252\"?>\n" - << "<VisualStudioProject\n" - << "\tProjectType=\"Visual C++\"\n" - << "\tVersion=\"7.00\"\n" - << "\tName=\"" << libName << "\"\n" - << "\tSccProjectName=\"\"\n" - << "\tSccLocalPath=\"\"\n" - << "\tKeyword=\"Win32Proj\">\n" - << "\t<Platforms>\n" - << "\t\t<Platform\n\t\t\tName=\"Win32\"/>\n" - << "\t</Platforms>\n"; -} - - -void cmMSDotNETGenerator::WriteVCProjFooter(std::ostream& fout) -{ - fout << "\t<Globals>\n" - << "\t</Globals>\n" - << "</VisualStudioProject>\n"; -} - - -std::string cmMSDotNETGenerator::ConvertToXMLOutputPath(const char* path) -{ - std::string ret = cmSystemTools::ConvertToOutputPath(path); - cmSystemTools::ReplaceString(ret, "\"", """); - return ret; -} - -std::string cmMSDotNETGenerator::ConvertToXMLOutputPathSingle(const char* path) -{ - std::string ret = cmSystemTools::ConvertToOutputPath(path); - cmSystemTools::ReplaceString(ret, "\"", ""); - return ret; -} - - -int cmMSDotNETGenerator::TryCompile(const char *srcdir, - const char *bindir, - const char *projectName) -{ - // now build the test - std::string makeCommand = m_Makefile->GetDefinition("CMAKE_MAKE_PROGRAM"); - if(makeCommand.size() == 0) - { - cmSystemTools::Error( - "Generator cannot find the appropriate make command."); - return 1; - } - makeCommand = cmSystemTools::ConvertToOutputPath(makeCommand.c_str()); - std::string lowerCaseCommand = makeCommand; - cmSystemTools::LowerCase(lowerCaseCommand); - - /** - * Run an executable command and put the stdout in output. - */ - std::string output; - - std::string cwd = cmSystemTools::GetCurrentWorkingDirectory(); - cmSystemTools::ChangeDirectory(bindir); - -#if defined(_WIN32) && !defined(__CYGWIN__) - if(makeCommand.find(' ') != std::string::npos) - { - cmSystemTools::GetShortPath(makeCommand.c_str(), makeCommand); - } -#endif - makeCommand += " "; - makeCommand += projectName; - makeCommand += ".sln /rebuild Debug /project ALL_BUILD"; - - if (!cmSystemTools::RunCommand(makeCommand.c_str(), output)) - { - cmSystemTools::Error("Generator: execution of devenv failed."); - // return to the original directory - cmSystemTools::ChangeDirectory(cwd.c_str()); - return 1; - } - cmSystemTools::ChangeDirectory(cwd.c_str()); - return 0; -} - diff --git a/Source/cmMSDotNETGenerator.h b/Source/cmMSDotNETGenerator.h deleted file mode 100644 index 7fb9ab8..0000000 --- a/Source/cmMSDotNETGenerator.h +++ /dev/null @@ -1,177 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmMSDotNETGenerator_h -#define cmMSDotNETGenerator_h - -#include "cmStandardIncludes.h" -#include "cmMakefileGenerator.h" -#include "cmTarget.h" -#include "cmSourceGroup.h" - -/** \class cmMSDotNETGenerator - * \brief Write a Microsoft Visual C++ DSP (project) file. - * - * cmMSDotNETGenerator produces a Microsoft Visual C++ DSP (project) file. - */ -class cmMSDotNETGenerator : public cmMakefileGenerator -{ -public: - ///! Constructor sets the generation of SLN files on. - cmMSDotNETGenerator(); - - ///! Destructor. - ~cmMSDotNETGenerator(); - - ///! Get the name for the generator. - virtual const char* GetName() {return "Visual Studio 7";} - - ///! virtual copy constructor - virtual cmMakefileGenerator* CreateObject() - { return new cmMSDotNETGenerator;} - - ///! Produce the makefile (in this case a Microsoft Visual C++ project). - virtual void GenerateMakefile(); - - ///! controls the SLN/DSP settings - virtual void SetLocal(bool); - - /** - * Turn off the generation of a Microsoft Visual C++ SLN file. - * This causes only the dsp file to be created. This - * is used to run as a command line program from inside visual - * studio. - */ - void BuildSLNOff() {m_BuildSLN = false;} - - ///! Turn on the generation of a Microsoft Visual C++ SLN file. - void BuildProjOn() {m_BuildSLN = true;} - - /** - * Try to determine system infomation such as shared library - * extension, pthreads, byte order etc. - */ - virtual void EnableLanguage(const char*); - - - /** - * Try running cmake and building a file. This is used for dynalically - * loaded commands, not as part of the usual build process. For the - * generator, it can assume that cmake has been run on the srcdir/bindir - * and it just needs to be compiled. - */ - virtual int TryCompile(const char *srcdir, const char *bindir, - const char *projectName); - -protected: - /** - * Return array of created VCProj names in a STL vector. - * Each executable must have its own dsp. - */ - std::vector<std::string> GetCreatedProjectNames() - { - return m_CreatedProjectNames; - } - - /** - * Return the makefile. - */ - cmMakefile* GetMakefile() - { - return m_Makefile; - } - -private: - void CreateSingleVCProj(const char *lname, cmTarget &tgt); - void WriteVCProjFile(std::ostream& fout, const char *libName, - cmTarget &tgt); - void WriteVCProjBeginGroup(std::ostream& fout, - const char* group, - const char* filter); - void WriteVCProjEndGroup(std::ostream& fout); - - void WriteProjectStart(std::ostream& fout, const char *libName, - const cmTarget &tgt, std::vector<cmSourceGroup> &sgs); - void WriteConfigurations(std::ostream& fout, - const char *libName, - const cmTarget &tgt); - void WriteConfiguration(std::ostream& fout, - const char* configName, - const char* libName, - const cmTarget &tgt); - - void OutputDefineFlags(std::ostream& fout); - void WriteVCProjFooter(std::ostream& fout); - void AddVCProjBuildRule(cmSourceGroup&); - void WriteCustomRule(std::ostream& fout, - const char* source, - const char* command, - const std::set<std::string>& depends, - const std::set<std::string>& outputs, - const char* extraFlags); - - void OutputTargetRules(std::ostream& fout, - const cmTarget &target, - const char *libName); - std::string CombineCommands(const cmSourceGroup::Commands &commands, - cmSourceGroup::CommandFiles &totalCommand, - const char *source); - - - virtual void OutputSLNFile(); - void OutputVCProjFile(); - std::string CreateGUID(const char* project); - void WriteSLNFile(std::ostream& fout); - void WriteSLNHeader(std::ostream& fout); - void WriteProject(std::ostream& fout, - const char* name, const char* path, - cmMSDotNETGenerator* project, const cmTarget &t); - void WriteProjectDepends(std::ostream& fout, - const char* name, const char* path, - cmMSDotNETGenerator* project, const cmTarget &t); - void WriteProjectConfigurations(std::ostream& fout, const char* name); - void WriteExternalProject(std::ostream& fout, - const char* name, const char* path, - const std::vector<std::string>& dependencies); - void WriteSLNFooter(std::ostream& fout); - void OutputBuildTool(std::ostream& fout, const char* configName, - const char* libname, const cmTarget& t); - void OutputLibraryDirectories(std::ostream& fout, - const char* configName, - const char* libName, - const cmTarget &target); - void OutputModuleDefinitionFile(std::ostream& fout, - const cmTarget &target); - void OutputLibraries(std::ostream& fout, - const char* configName, - const char* libName, - const cmTarget &target); - std::string ConvertToXMLOutputPath(const char* path); - std::string ConvertToXMLOutputPathSingle(const char* path); -private: - std::map<cmStdString, cmStdString> m_GUIDMap; - bool m_BuildSLN; - std::string m_LibraryOutputPath; - std::string m_ExecutableOutputPath; - std::string m_ModuleDefinitionFile; - std::vector<std::string> m_Configurations; - std::string m_VCProjHeaderTemplate; - std::string m_VCProjFooterTemplate; - std::vector<std::string> m_CreatedProjectNames; -}; - - -#endif diff --git a/Source/cmMSProjectGenerator.cxx b/Source/cmMSProjectGenerator.cxx deleted file mode 100644 index 9d0768e..0000000 --- a/Source/cmMSProjectGenerator.cxx +++ /dev/null @@ -1,125 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. - -=========================================================================*/ -#include "cmMSProjectGenerator.h" -#include "cmDSWWriter.h" -#include "cmDSPWriter.h" -#include "cmCacheManager.h" - -cmMSProjectGenerator::cmMSProjectGenerator() -{ - m_DSWWriter = 0; - m_DSPWriter = 0; - BuildDSWOn(); -} - -void cmMSProjectGenerator::GenerateMakefile() -{ - this->EnableLanguage("CXX"); - if(m_BuildDSW) - { - delete m_DSWWriter; - m_DSWWriter = 0; - m_DSWWriter = new cmDSWWriter(m_Makefile); - m_DSWWriter->OutputDSWFile(); - } - else - { - delete m_DSPWriter; - m_DSPWriter = 0; - m_DSPWriter = new cmDSPWriter(m_Makefile); - m_DSPWriter->OutputDSPFile(); - } -} - -cmMSProjectGenerator::~cmMSProjectGenerator() -{ - delete m_DSPWriter; - delete m_DSWWriter; -} - -void cmMSProjectGenerator::SetLocal(bool local) -{ - m_BuildDSW = !local; -} - -void cmMSProjectGenerator::EnableLanguage(const char*) -{ - // now load the settings - if(!m_Makefile->GetDefinition("CMAKE_ROOT")) - { - cmSystemTools::Error( - "CMAKE_ROOT has not been defined, bad GUI or driver program"); - return; - } - if(!this->GetLanguageEnabled("CXX")) - { - std::string fpath = - m_Makefile->GetDefinition("CMAKE_ROOT"); - fpath += "/Templates/CMakeWindowsSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); - this->SetLanguageEnabled("CXX"); - } -} - -int cmMSProjectGenerator::TryCompile(const char *srcdir, - const char *bindir, - const char *projectName) -{ - // now build the test - std::string makeCommand = m_Makefile->GetDefinition("CMAKE_MAKE_PROGRAM"); - if(makeCommand.size() == 0) - { - cmSystemTools::Error( - "Generator cannot find the appropriate make command."); - return 1; - } - makeCommand = cmSystemTools::ConvertToOutputPath(makeCommand.c_str()); - std::string lowerCaseCommand = makeCommand; - cmSystemTools::LowerCase(lowerCaseCommand); - - /** - * Run an executable command and put the stdout in output. - */ - std::string output; - - std::string cwd = cmSystemTools::GetCurrentWorkingDirectory(); - cmSystemTools::ChangeDirectory(bindir); - - // if there are spaces in the makeCommand, assume a full path - // and convert it to a path with no spaces in it as the - // RunCommand does not like spaces -#if defined(_WIN32) && !defined(__CYGWIN__) - if(makeCommand.find(' ') != std::string::npos) - { - cmSystemTools::GetShortPath(makeCommand.c_str(), makeCommand); - } -#endif - makeCommand += " "; - makeCommand += projectName; - makeCommand += ".dsw /MAKE \"ALL_BUILD - Debug\" /REBUILD"; - - if (!cmSystemTools::RunCommand(makeCommand.c_str(), output)) - { - cmSystemTools::Error("Generator: execution of msdev failed."); - // return to the original directory - cmSystemTools::ChangeDirectory(cwd.c_str()); - return 1; - } - cmSystemTools::ChangeDirectory(cwd.c_str()); - return 0; -} - diff --git a/Source/cmMSProjectGenerator.h b/Source/cmMSProjectGenerator.h deleted file mode 100644 index ff1762a..0000000 --- a/Source/cmMSProjectGenerator.h +++ /dev/null @@ -1,94 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmMSProjectGenerator_h -#define cmMSProjectGenerator_h - -#include "cmStandardIncludes.h" -#include "cmMakefileGenerator.h" - -class cmDSPWriter; -class cmDSWWriter; - -/** \class cmMSProjectGenerator - * \brief Write a Microsoft Visual C++ DSP (project) file. - * - * cmMSProjectGenerator produces a Microsoft Visual C++ DSP (project) file. - */ -class cmMSProjectGenerator : public cmMakefileGenerator -{ -public: - ///! Constructor sets the generation of DSW files on. - cmMSProjectGenerator(); - - ///! Destructor. - ~cmMSProjectGenerator(); - - ///! Get the name for the generator. - virtual const char* GetName() {return "Visual Studio 6";} - - ///! virtual copy constructor - virtual cmMakefileGenerator* CreateObject() - { return new cmMSProjectGenerator;} - - ///! Produce the makefile (in this case a Microsoft Visual C++ project). - virtual void GenerateMakefile(); - - ///! controls the DSW/DSP settings - virtual void SetLocal(bool); - - /** - * Turn off the generation of a Microsoft Visual C++ DSW file. - * This causes only the dsp file to be created. This - * is used to run as a command line program from inside visual - * studio. - */ - void BuildDSWOff() {m_BuildDSW = false;} - - ///! Turn on the generation of a Microsoft Visual C++ DSW file. - void BuildDSWOn() {m_BuildDSW = true;} - - ///! Retrieve a pointer to a cmDSWWriter instance. - cmDSWWriter* GetDSWWriter() - {return m_DSWWriter;} - - ///! Retrieve a pointer to a cmDSPWriter instance. - cmDSPWriter* GetDSPWriter() - {return m_DSPWriter;} - - /** - * Try to determine system infomation such as shared library - * extension, pthreads, byte order etc. - */ - virtual void EnableLanguage(const char*); - - /** - * Try running cmake and building a file. This is used for dynalically - * loaded commands, not as part of the usual build process. For the - * generator, it can assume that cmake has been run on the srcdir/bindir - * and it just needs to be compiled. - */ - virtual int TryCompile(const char *srcdir, const char *bindir, - const char *projectName); - -private: - cmDSWWriter* m_DSWWriter; - cmDSPWriter* m_DSPWriter; - bool m_BuildDSW; -}; - - -#endif diff --git a/Source/cmMakefileGenerator.cxx b/Source/cmMakefileGenerator.cxx deleted file mode 100644 index 5718e99..0000000 --- a/Source/cmMakefileGenerator.cxx +++ /dev/null @@ -1,46 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. - -=========================================================================*/ -#include "cmMakefileGenerator.h" - -// static list of registered generators -std::map<cmStdString, bool> cmMakefileGenerator::s_LanguageEnabled; - - -void cmMakefileGenerator::SetMakefile(cmMakefile* mf) -{ - m_Makefile = mf; -} - -void cmMakefileGenerator::SetLanguageEnabled(const char* l) -{ - s_LanguageEnabled[l] = true; -} - - - -bool cmMakefileGenerator::GetLanguageEnabled(const char* l) -{ - return (s_LanguageEnabled.count(l) > 0); -} - - - -void cmMakefileGenerator::ClearEnabledLanguages() -{ - s_LanguageEnabled.clear(); -} - diff --git a/Source/cmMakefileGenerator.h b/Source/cmMakefileGenerator.h deleted file mode 100644 index 84a806c..0000000 --- a/Source/cmMakefileGenerator.h +++ /dev/null @@ -1,86 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmMakefileGenerator_h -#define cmMakefileGenerator_h - -#include "cmStandardIncludes.h" - -class cmMakefile; -class cmClassFile; - -/** \class cmMakefileGenerator - * \brief Provide an abstract interface for classes generating makefiles. - * - * Subclasses of this abstract class generate makefiles for various - * platforms. - */ -class cmMakefileGenerator -{ -public: - /** - * Try running cmake and building a file. This is used for dynalically - * loaded commands, not as part of the usual build process. - */ - virtual int TryCompile(const char *srcdir, const char *bindir, - const char *projectName) = 0; - - ///! Get the name for the generator. - virtual const char* GetName() = 0; - - ///! virtual copy constructor - virtual cmMakefileGenerator* CreateObject() = 0; - - ///! Set the cmMakefile instance from which to generate the makefile. - void SetMakefile(cmMakefile*); - - /** - * Generate the makefile using the m_Makefile, m_CustomCommands, - * and m_ExtraSourceFiles. All subclasses of cmMakefileGenerator - * must implement this method. - */ - virtual void GenerateMakefile() = 0; - - /** - * The local setting indicates that the generator is producing a - * fully configured makefile in the current directory. In Microsoft - * terms it is producing a DSP file if local is true and a DSW file - * if local is false. On UNIX when local is false it skips the - * dependecy check and recurses the full tree building the structure - */ - virtual void SetLocal(bool ) {}; - - /** - * Try to determine system infomation such as shared library - * extension, pthreads, byte order etc. - */ - virtual void EnableLanguage(const char*) = 0; - - virtual ~cmMakefileGenerator(){}; - - /** - * Set/Get and Clear the enabled languages. - */ - static void SetLanguageEnabled(const char*); - static bool GetLanguageEnabled(const char*); - static void ClearEnabledLanguages(); -protected: - cmMakefile* m_Makefile; -private: - static std::map<cmStdString, bool> s_LanguageEnabled; -}; - -#endif diff --git a/Source/cmNMakeMakefileGenerator.cxx b/Source/cmNMakeMakefileGenerator.cxx deleted file mode 100644 index 09c044b..0000000 --- a/Source/cmNMakeMakefileGenerator.cxx +++ /dev/null @@ -1,740 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. - -=========================================================================*/ -#include "cmNMakeMakefileGenerator.h" -#include "cmMakefile.h" -#include "cmStandardIncludes.h" -#include "cmSystemTools.h" -#include "cmSourceFile.h" -#include "cmMakeDepend.h" -#include "cmCacheManager.h" -#include "cmGeneratedFileStream.h" -#include "windows.h" - - -cmNMakeMakefileGenerator::cmNMakeMakefileGenerator() -{ - this->SetLibraryPathOption("@CMAKE_C_LIBPATH_FLAG@"); // Use @ here - this->SetObjectFileExtension("$(CMAKE_OBJECT_FILE_SUFFIX)"); - this->SetExecutableExtension("$(CMAKE_EXECUTABLE_SUFFIX)"); - this->SetLibraryPrefix(""); - this->SetStaticLibraryExtension("$(CMAKE_STATICLIB_SUFFIX)"); - this->SetSharedLibraryExtension("$(CMAKE_SHLIB_SUFFIX)"); -} - -cmNMakeMakefileGenerator::~cmNMakeMakefileGenerator() -{ -} - -// convert to windows short paths if there are spaces -// in path -std::string cmNMakeMakefileGenerator::ShortPath(const char* path) -{ - std::string ret = path; - // if there are no spaces in path, then just - // call ConvertToOutputPath - if(ret.find(' ') == std::string::npos) - { - return this->ConvertToOutputPath(path); - } - - // if there are spaces then call GetShortPathName to get rid of them - if(!cmSystemTools::GetShortPath(path, ret)) - { - // if GetShortPathName failed for some reason use - // ConvertToOutputPath instead which will at least escape the spaces - ret = this->ConvertToOutputPath(path); - return ret; - } - ret = this->ConvertToOutputPath(ret.c_str()); - return ret; -} - - -// convert a command to a short path if it has spaces -// this separates the arguments from the command and puts -// them back together -std::string cmNMakeMakefileGenerator::ShortPathCommand(const char* command) -{ - if (!command) - { - return ""; - } - if(!strchr(command, ' ')) - { - return command; - } - cmRegularExpression reg("^\"([^\"]*)\"(.*)"); - if(reg.find(command)) - { - std::string c = reg.match(1); - cmRegularExpression removeIntDir("(.*)(/|\\\\)\\$\\(IntDir\\)(.*)"); - if(removeIntDir.find(c)) - { - c = removeIntDir.match(1) + removeIntDir.match(3); - } - std::string unixPath = c; - // since the command may already be a windows path, convert it - // to unix so we can use SplitProgramPath on it. - cmSystemTools::ConvertToUnixSlashes(unixPath); - std::string path, file; - cmSystemTools::SplitProgramPath(unixPath.c_str(), path, file); - // do a short path on the directory, because ShortPath will - // not work for files that do not exist - path = this->ShortPath(path.c_str()); - // now put the two back together - path += "\\"; - path += file; - std::string ret = path; - std::string args = reg.match(2); - ret += args; - return ret; - } - return command; -} - - -void cmNMakeMakefileGenerator::EnableLanguage(const char*) -{ - // now load the settings - if(!m_Makefile->GetDefinition("CMAKE_ROOT")) - { - cmSystemTools::Error( - "CMAKE_ROOT has not been defined, bad GUI or driver program"); - return; - } - if(!this->GetLanguageEnabled("CXX")) - { - std::string fpath = - m_Makefile->GetDefinition("CMAKE_ROOT"); - fpath += "/Templates/CMakeNMakeWindowsSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); - this->SetLanguageEnabled("CXX"); - } -} - - - -void cmNMakeMakefileGenerator::OutputMakeVariables(std::ostream& fout) -{ - fout << "# NMake Makefile generated by cmake\n"; - const char* variables = - "# general variables used in the makefile\n" - "\n" - "# Path to cmake\n" - "MAKESILENT = /nologo\n" - "CMAKE_STANDARD_WINDOWS_LIBRARIES = @CMAKE_STANDARD_WINDOWS_LIBRARIES@\n" - "CMAKE_C_FLAGS = @CMAKE_C_FLAGS@ @BUILD_FLAGS@ -DWIN32\n" - "CMAKE_C_LINK_EXECUTABLE_FLAG = @CMAKE_C_LINK_EXECUTABLE_FLAG@\n" - "CMAKE_CXX_FLAGS = @CMAKE_CXX_FLAGS@ -DWIN32 @BUILD_FLAGS@\n" - "CMAKE_LINKER_FLAGS = @CMAKE_LINKER_FLAGS@ @LINKER_BUILD_FLAGS@\n" - "CMAKE_LINKER_SHARED_LIBRARY_FLAG = @CMAKE_LINKER_SHARED_LIBRARY_FLAG@\n" - "CMAKE_LIBRARY_MANAGER_FLAGS = @CMAKE_LIBRARY_MANAGER_FLAGS@\n" - "CMAKE_OBJECT_FILE_SUFFIX = @CMAKE_OBJECT_FILE_SUFFIX@\n" - "CMAKE_EXECUTABLE_SUFFIX = @CMAKE_EXECUTABLE_SUFFIX@\n" - "CMAKE_STATICLIB_SUFFIX = @CMAKE_STATICLIB_SUFFIX@\n" - "CMAKE_SHLIB_SUFFIX = @CMAKE_SHLIB_SUFFIX@\n" - "!IF \"$(OS)\" == \"Windows_NT\"\n" - "NULL=\n" - "!ELSE \n" - "NULL=nul\n" - "!ENDIF \n"; - - std::string buildType = "CMAKE_CXX_FLAGS_"; - buildType += m_Makefile->GetDefinition("CMAKE_BUILD_TYPE"); - buildType = cmSystemTools::UpperCase(buildType); - m_Makefile->AddDefinition("BUILD_FLAGS", - m_Makefile->GetDefinition( - buildType.c_str())); - - buildType = "CMAKE_LINKER_FLAGS_"; - buildType += m_Makefile->GetDefinition("CMAKE_BUILD_TYPE"); - buildType = cmSystemTools::UpperCase(buildType); - m_Makefile->AddDefinition("LINKER_BUILD_FLAGS", - m_Makefile->GetDefinition( - buildType.c_str())); - - std::string replaceVars = variables; - m_Makefile->ExpandVariablesInString(replaceVars); - fout << replaceVars.c_str(); - std::string ccompiler = m_Makefile->GetDefinition("CMAKE_C_COMPILER"); - fout << "CMAKE_C_COMPILER = " - << this->ShortPath(ccompiler.c_str()) << "\n"; - - std::string cxxcompiler = m_Makefile->GetDefinition("CMAKE_CXX_COMPILER"); - fout << "CMAKE_CXX_COMPILER = " - << this->ShortPath(cxxcompiler.c_str()) << "\n"; - - std::string linker = m_Makefile->GetDefinition("CMAKE_LINKER"); - fout << "CMAKE_LINKER = " << - this->ShortPath(linker.c_str()) << "\n"; - - std::string lib_manager = m_Makefile->GetDefinition("CMAKE_LIBRARY_MANAGER"); - fout << "CMAKE_LIBRARY_MANAGER = " - << this->ShortPath(lib_manager.c_str()) << "\n"; - - std::string cmakecommand = m_Makefile->GetDefinition("CMAKE_COMMAND"); - fout << "CMAKE_COMMAND = " - << this->ShortPath(cmakecommand.c_str()) << "\n"; - fout << "RM = " << this->ShortPath(cmakecommand.c_str()) << " -E remove -f\n"; - - if(m_Makefile->GetDefinition("CMAKE_EDIT_COMMAND")) - { - fout << "CMAKE_EDIT_COMMAND = " - << this->ShortPath(m_Makefile->GetDefinition("CMAKE_EDIT_COMMAND")) - << "\n"; - } - - fout << "CMAKE_CURRENT_SOURCE = " - << this->ShortPath(m_Makefile->GetStartDirectory() ) - << "\n"; - fout << "CMAKE_CURRENT_BINARY = " - << this->ShortPath(m_Makefile->GetStartOutputDirectory()) - << "\n"; - fout << "CMAKE_SOURCE_DIR = " - << this->ShortPath(m_Makefile->GetHomeDirectory()) << "\n"; - fout << "CMAKE_BINARY_DIR = " - << this->ShortPath(m_Makefile->GetHomeOutputDirectory() ) - << "\n"; - - // Output Include paths - fout << "INCLUDE_FLAGS = "; - std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories(); - std::vector<std::string>::iterator i; - fout << "-I" << - this->ConvertToOutputPath(m_Makefile->GetStartDirectory()) << " "; - for(i = includes.begin(); i != includes.end(); ++i) - { - std::string include = *i; - // Don't output a -I for the standard include path "/usr/include". - // This can cause problems with certain standard library - // implementations because the wrong headers may be found first. - fout << "-I" << this->ConvertToOutputPath(i->c_str()).c_str() << " "; - } - - fout << m_Makefile->GetDefineFlags(); - fout << "\n\n"; -} - - -void cmNMakeMakefileGenerator::BuildInSubDirectory(std::ostream& fout, - const char* directory, - const char* target1, - const char* target2, - bool silent) -{ - if(target1) - { - std::string dir = this->ConvertToOutputPath(directory); - fout << "\tif not exist \"" << dir << "\\$(NULL)\"" - << " " - << "$(MAKE) $(MAKESILENT) rebuild_cache\n"; - if (!silent) - { - fout << "\techo " << directory << ": building " << target1 << "\n"; - } - fout << "\tcd " << dir << "\n" - << "\t$(MAKE) -$(MAKEFLAGS) $(MAKESILENT) " << target1 << "\n"; - } - if(target2) - { - if (!silent) - { - fout << "\techo " << directory << ": building " << target2 << "\n"; - } - fout << "\t$(MAKE) -$(MAKEFLAGS) $(MAKESILENT) " << target2 << "\n"; - } - std::string currentDir = m_Makefile->GetCurrentOutputDirectory(); - fout << "\tcd " << this->ConvertToOutputPath(currentDir.c_str()) << "\n\n"; -} - - - - -// This needs to be overriden because nmake requires commands to be quoted -// if the are full paths to the executable???? - -void cmNMakeMakefileGenerator::OutputMakeRule(std::ostream& fout, - const char* comment, - const char* target, - const char* depends, - const char* command, - const char* command2, - const char* command3, - const char* command4) -{ - std::string short_command; - if (command) - { - short_command = ShortPathCommand(command); - command = short_command.c_str(); - } - - std::string short_command2; - if (command2) - { - short_command2 = ShortPathCommand(command2); - command2 = short_command2.c_str(); - } - - std::string short_command3; - if (command3) - { - short_command3 = ShortPathCommand(command3); - command3 = short_command3.c_str(); - } - - std::string short_command4; - if (command4) - { - short_command4 = ShortPathCommand(command4); - command4 = short_command4.c_str(); - } - - cmUnixMakefileGenerator::OutputMakeRule(fout, - comment, - target, - depends, - command, - command2, - command3, - command4); - return; -} - -void -cmNMakeMakefileGenerator:: -OutputBuildObjectFromSource(std::ostream& fout, - const char* shortName, - const cmSourceFile& source, - const char* extraCompileFlags, - bool shared) -{ - // Header files shouldn't have build rules. - if(source.GetPropertyAsBool("HEADER_FILE_ONLY")) - { - return; - } - - std::string comment = "Build "; - std::string objectFile = std::string(shortName) + - this->GetOutputExtension(source.GetSourceExtension().c_str()); - - comment += objectFile + " From "; - comment += source.GetFullPath(); - std::string compileCommand; - std::string ext = source.GetSourceExtension(); - if(ext == "c" ) - { - compileCommand = "$(CMAKE_C_COMPILER) $(CMAKE_C_FLAGS) "; - compileCommand += extraCompileFlags; - if(shared) - { - compileCommand += "$(CMAKE_SHLIB_CFLAGS) "; - } - compileCommand += "$(INCLUDE_FLAGS) -c "; - compileCommand += - this->ConvertToOutputPath(source.GetFullPath().c_str()); - - // Need to get the definition here because this value might have - // trailing space (since it is directly prepended to the filename) - std::string output_object_file_flag = - m_Makefile->GetDefinition("CMAKE_C_OUTPUT_OBJECT_FILE_FLAG"); - m_Makefile->ExpandVariablesInString(output_object_file_flag); - - compileCommand += " " + output_object_file_flag; - compileCommand += objectFile; - } - else if (ext == "rc") - { - compileCommand = "$(RC) $(INCLUDE_FLAGS) /fo\""; - compileCommand += objectFile; - compileCommand += "\" "; - compileCommand += - this->ConvertToOutputPath(source.GetFullPath().c_str()); - } - else if (ext == "def") - { - // no rule to output for this one - return; - } - // assume c++ if not c rc or def - else - { - - compileCommand = "$(CMAKE_CXX_COMPILER) $(CMAKE_CXX_FLAGS) "; - compileCommand += extraCompileFlags; - if(shared) - { - compileCommand += "$(CMAKE_SHLIB_CFLAGS) "; - } - compileCommand += "$(INCLUDE_FLAGS) -c "; - compileCommand += - this->ConvertToOutputPath(source.GetFullPath().c_str()); - - // Need to get the definition here because this value might have - // trailing space (since it is directly prepended to the filename) - std::string output_object_file_flag = - m_Makefile->GetDefinition("CMAKE_C_OUTPUT_OBJECT_FILE_FLAG"); - m_Makefile->ExpandVariablesInString(output_object_file_flag); - - compileCommand += " " + output_object_file_flag; - compileCommand += objectFile; - } - - this->OutputMakeRule(fout, - comment.c_str(), - objectFile.c_str(), - this->ConvertToOutputPath( - source.GetFullPath().c_str()).c_str(), - compileCommand.c_str()); -} - -void cmNMakeMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_LibraryOutputPath + name + m_SharedLibraryExtension; - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS"); - depend += ") $(" + this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; - - // Need to get the definition here because this value might have - // trailing space (since it is directly prepended to the filename) - std::string linker_output_file_flag = - m_Makefile->GetDefinition("CMAKE_LINKER_OUTPUT_FILE_FLAG"); - m_Makefile->ExpandVariablesInString(linker_output_file_flag); - - std::string command = "$(CMAKE_LINKER) $(CMAKE_LINKER_SHARED_LIBRARY_FLAG)"; - - bool hide_param = m_Makefile->IsOn("CMAKE_LINKER_HIDE_PARAMETERS"); - if (hide_param) - { - command += " @<<\n\t"; - } - - command += " $(CMAKE_LINKER_FLAGS) " + linker_output_file_flag; - - std::string dllpath = m_LibraryOutputPath + std::string(name) + m_SharedLibraryExtension; - command += this->ConvertToOutputPath(dllpath.c_str()); - - command += " $(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; - - cmStringStream linklibs; - this->OutputLinkLibraries(linklibs, name, t); - command += linklibs.str(); - - const std::vector<cmSourceFile*>& sources = t.GetSourceFiles(); - for(std::vector<cmSourceFile*>::const_iterator i = sources.begin(); - i != sources.end(); ++i) - { - if((*i)->GetSourceExtension() == "def") - { - command += "/DEF:"; - command += (*i)->GetFullPath(); - } - } - - command += "\n"; - if (hide_param) - { - command += "<<\n"; - } - - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, "rules for a shared library", - target.c_str(), - depend.c_str(), - command.c_str(), cc); -} - -void cmNMakeMakefileGenerator::OutputModuleLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &target) -{ - this->OutputSharedLibraryRule(fout, name, target); -} - -void cmNMakeMakefileGenerator::OutputStaticLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_LibraryOutputPath + std::string(name) + m_StaticLibraryExtension; - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; - - // Need to get the definition here because this value might have - // trailing space (since it is directly prepended to the filename) - std::string library_manager_output_file_flag = - m_Makefile->GetDefinition("CMAKE_LIBRARY_MANAGER_OUTPUT_FILE_FLAG"); - m_Makefile->ExpandVariablesInString(library_manager_output_file_flag); - - std::string command = "$(CMAKE_LIBRARY_MANAGER) $(CMAKE_LIBRARY_MANAGER_FLAGS) @<<\n\t " + library_manager_output_file_flag; - - std::string libpath = m_LibraryOutputPath + std::string(name) + m_StaticLibraryExtension; - command += this->ConvertToOutputPath(libpath.c_str()); - - command += " $("; - command += this->CreateMakeVariable(name, "_SRC_OBJS") + ")"; - command += "\n<<\n"; - - std::string comment = "rule to build static library: "; - comment += name; - - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, - comment.c_str(), - target.c_str(), - depend.c_str(), - command.c_str(), cc); -} - -void cmNMakeMakefileGenerator::OutputExecutableRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_ExecutableOutputPath + name; - target += m_ExecutableExtension; - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS") + ") $(" + - this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; - std::string command; - if(t.HasCxx()) - { - command = "$(CMAKE_CXX_COMPILER) $(CMAKE_CXX_FLAGS) "; - } - else - { - command = "${CMAKE_C_COMPILER} $(CMAKE_C_FLAGS) "; - } - bool hide_param = m_Makefile->IsOn("CMAKE_LINKER_HIDE_PARAMETERS"); - if (hide_param) - { - command += " @<<\n\t"; - } - - command += "$(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; - std::string path = m_ExecutableOutputPath + name + m_ExecutableExtension; - - // Need to get the definition here because this value might have - // trailing space (since it is directly prepended to the filename) - std::string output_executable_file_flag = - m_Makefile->GetDefinition("CMAKE_C_OUTPUT_EXECUTABLE_FILE_FLAG"); - m_Makefile->ExpandVariablesInString(output_executable_file_flag); - - command += " " + output_executable_file_flag + - this->ConvertToOutputPath(path.c_str()); - - command += " $(CMAKE_C_LINK_EXECUTABLE_FLAG) $(CMAKE_LINKER_FLAGS) "; - if(t.GetType() == cmTarget::WIN32_EXECUTABLE) - { - command += " /subsystem:windows "; - } - - cmStringStream linklibs; - this->OutputLinkLibraries(linklibs, 0, t); - command += linklibs.str(); - - std::string comment = "rule to build executable: "; - comment += name; - - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - if (hide_param) - { - command += "\n"; - command += "<<\n"; - } - this->OutputMakeRule(fout, - comment.c_str(), - target.c_str(), - depend.c_str(), - command.c_str(), cc); -} - - -void cmNMakeMakefileGenerator::OutputLinkLibraries(std::ostream& fout, - const char* targetLibrary, - const cmTarget &tgt) -{ - // Try to emit each search path once - std::set<std::string> emitted; - - // Embed runtime search paths if possible and if required. - // collect all the flags needed for linking libraries - // Do not try if there is no library path option (it is set to -L or - // -LIBPATH for some linker, but some others do not even support link - // search path). - std::string linkLibs; - - // Expand content because this value might have - // trailing space (since it is directly prepended to the filename) - std::string lib_path_opt = m_LibraryPathOption; - m_Makefile->ExpandVariablesInString(lib_path_opt); - - if (lib_path_opt.size()) - { - const std::vector<std::string>& libdirs = tgt.GetLinkDirectories(); - for(std::vector<std::string>::const_iterator libDir = libdirs.begin(); - libDir != libdirs.end(); ++libDir) - { - std::string libpath = ShortPath(libDir->c_str()); - if(emitted.insert(libpath).second) - { - linkLibs += lib_path_opt; - this->ConvertToOutputPath(libpath.c_str()); - linkLibs += libpath; - linkLibs += " "; - } - } - } - - std::string librariesLinked; - const cmTarget::LinkLibraries& libs = tgt.GetLinkLibraries(); - for(cmTarget::LinkLibraries::const_iterator lib = libs.begin(); - lib != libs.end(); ++lib) - { - // Don't link the library against itself! - if(targetLibrary && (lib->first == targetLibrary)) continue; - -// ** should fix this later, it should check to see if this is -// a debug build and add the library -// don't look at debug libraries -// if (lib->second == cmTarget::DEBUG) continue; - // skip zero size library entries, this may happen - // if a variable expands to nothing. - if (lib->first.size() == 0) continue; - if(emitted.insert(lib->first).second) - { - std::string regexp = ".*\\"; - regexp += m_Makefile->GetDefinition("CMAKE_STATICLIB_SUFFIX"); - regexp += "$"; - cmRegularExpression reg(regexp.c_str()); - // if it ends in .lib, then it is a full path and should - // be escaped, and does not need .lib added - if(reg.find(lib->first)) - { - librariesLinked += ShortPath(lib->first.c_str()); - librariesLinked += " "; - } - else - { - librariesLinked += m_LibraryLinkOption; - librariesLinked += lib->first; - librariesLinked += m_StaticLibraryExtension + " "; - } - } - } - linkLibs += librariesLinked; - fout << linkLibs; - fout << "$(CMAKE_STANDARD_WINDOWS_LIBRARIES) "; -} - - -std::string cmNMakeMakefileGenerator::GetOutputExtension(const char* s) -{ - std::string sourceExtension = s; - if(sourceExtension == "def") - { - return ""; - } - if(sourceExtension == "ico" || sourceExtension == "rc2") - { - return ""; - } - if(sourceExtension == "rc") - { - return ".res"; - } - return m_ObjectFileExtension; -} - - -void cmNMakeMakefileGenerator::OutputIncludeMakefile(std::ostream& fout, - const char* file) -{ - fout << "!include " << file << "\n"; -} - -bool cmNMakeMakefileGenerator::SamePath(const char* path1, const char* path2) -{ - // first check to see if they are the same anyway - if (strcmp(path1, path2) == 0) - { - return true; - } - // next short path and lower case both of them for the compare - return - cmSystemTools::LowerCase(ShortPath(path1)) == - cmSystemTools::LowerCase(ShortPath(path2)); -} - -void cmNMakeMakefileGenerator::OutputBuildTargetInDir(std::ostream& fout, - const char* path, - const char* library, - const char* fullpath, - const char* libOutPath) -{ - const char* makeTarget = library; - std::string currentDir = - this->ConvertToOutputPath(m_Makefile->GetCurrentOutputDirectory()); - std::string wpath = this->ConvertToOutputPath(path); - std::string wfullpath = this->ConvertToOutputPath(fullpath); - if(libOutPath && strcmp( libOutPath, "" ) != 0) - { - makeTarget = wfullpath.c_str(); - } - fout << wfullpath - << ":\n\tcd " << wpath << "\n" - << "\t$(MAKE) -$(MAKEFLAGS) $(MAKESILENT) cmake.depends\n" - << "\t$(MAKE) -$(MAKEFLAGS) $(MAKESILENT) cmake.check_depends\n" - << "\t$(MAKE) -$(MAKEFLAGS) $(MAKESILENT) -f cmake.check_depends\n" - << "\t$(MAKE) $(MAKESILENT) " << makeTarget - << "\n\tcd " << currentDir << "\n"; -} - - -std::string cmNMakeMakefileGenerator::ConvertToOutputPath(const char* s) -{ - return cmSystemTools::ConvertToOutputPath(s); -} - - -std::string cmNMakeMakefileGenerator::CreateMakeVariable(const char* s, const char* s2) -{ - std::string ret= std::string(s) + std::string(s2); - cmSystemTools::ReplaceString(ret, "-", "_"); - return ret; -} - -std::string cmNMakeMakefileGenerator::LowerCasePath(const char* path) -{ - return cmSystemTools::LowerCase(path); -} diff --git a/Source/cmNMakeMakefileGenerator.h b/Source/cmNMakeMakefileGenerator.h deleted file mode 100644 index 633d86d..0000000 --- a/Source/cmNMakeMakefileGenerator.h +++ /dev/null @@ -1,101 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmNMakeMakefileGenerator_h -#define cmNMakeMakefileGenerator_h - -#include "cmUnixMakefileGenerator.h" - -/** \class cmNMakeMakefileGenerator - * \brief Write an NMake makefile. - * - * cmNMakeMakefileGenerator produces a Unix makefile from its - * member m_Makefile. - */ -class cmNMakeMakefileGenerator : public cmUnixMakefileGenerator -{ -public: - ///! Set cache only and recurse to false by default. - cmNMakeMakefileGenerator(); - - virtual ~cmNMakeMakefileGenerator(); - - ///! Get the name for the generator. - virtual const char* GetName() {return "NMake Makefiles";} - - ///! virtual copy constructor - virtual cmMakefileGenerator* CreateObject() - { return new cmNMakeMakefileGenerator;} - - ///! figure out about the current system information - virtual void EnableLanguage(const char*); - -protected: - std::string ShortPath(const char* path); - std::string ShortPathCommand(const char* command); - virtual void OutputMakeVariables(std::ostream&); - virtual void BuildInSubDirectory(std::ostream& fout, - const char* directory, - const char* target1, - const char* target2, - bool silent = false); - void OutputMakeRule(std::ostream& fout, - const char* comment, - const char* target, - const char* depends, - const char* command, - const char* command2=0, - const char* command3=0, - const char* command4=0); - - - virtual void OutputBuildObjectFromSource(std::ostream& fout, - const char* shortName, - const cmSourceFile& source, - const char* extraCompileFlags, - bool sharedTarget); - virtual void OutputSharedLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputModuleLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputStaticLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputExecutableRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputLinkLibraries(std::ostream& fout, - const char* targetLibrary, - const cmTarget &tgt); - virtual std::string GetOutputExtension(const char* sourceExtension); - virtual void OutputIncludeMakefile(std::ostream&, const char* file); - virtual void OutputBuildTargetInDir(std::ostream& fout, - const char* path, - const char* library, - const char* fullpath, - const char* outputPath); - ///! return true if the two paths are the same (checks short paths) - virtual bool SamePath(const char* path1, const char* path2); - void SetLibraryPathOption(const char* lib){ m_LibraryPathOption = lib;} - void SetLibraryLinkOption(const char* lib){ m_LibraryLinkOption = lib;} - virtual std::string ConvertToOutputPath(const char* s); - - virtual std::string CreateMakeVariable(const char* s, const char* s2); - virtual std::string LowerCasePath(const char* path); -private: - std::string m_LibraryPathOption;// option to specifiy a link path -LIBPATH - std::string m_LibraryLinkOption; // option to specify a library (like -l, empty for nmake) -}; - -#endif diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx deleted file mode 100644 index 33a4508..0000000 --- a/Source/cmUnixMakefileGenerator.cxx +++ /dev/null @@ -1,2241 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. - -=========================================================================*/ -#include "cmUnixMakefileGenerator.h" -#include "cmMakefile.h" -#include "cmStandardIncludes.h" -#include "cmSystemTools.h" -#include "cmSourceFile.h" -#include "cmMakeDepend.h" -#include "cmCacheManager.h" -#include "cmGeneratedFileStream.h" - -cmUnixMakefileGenerator::cmUnixMakefileGenerator() - :m_SharedLibraryExtension("$(SHLIB_SUFFIX)"), - m_ObjectFileExtension(".o"), - m_ExecutableExtension(cmSystemTools::GetExecutableExtension()), - m_StaticLibraryExtension(".a"), - m_LibraryPrefix("lib") -{ - m_CacheOnly = false; - m_Recurse = false; -} - -cmUnixMakefileGenerator::~cmUnixMakefileGenerator() -{ -} - - -void cmUnixMakefileGenerator::GenerateMakefile() -{ - // for backwards compatibility if niether c or cxx is - // enabled, the enable cxx - if(! (this->GetLanguageEnabled("C") || - this->GetLanguageEnabled("CXX"))) - { - this->EnableLanguage("CXX"); - } - - - // suppoirt override in output directories - if (m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH")) - { - m_LibraryOutputPath = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH"); - if(m_LibraryOutputPath.size()) - { - if(m_LibraryOutputPath[m_LibraryOutputPath.size() -1] != '/') - { - m_LibraryOutputPath += "/"; - } - if(!cmSystemTools::MakeDirectory(m_LibraryOutputPath.c_str())) - { - cmSystemTools::Error("Error failed create " - "LIBRARY_OUTPUT_PATH directory:", - m_LibraryOutputPath.c_str()); - } - m_Makefile->AddLinkDirectory(m_LibraryOutputPath.c_str()); - } - } - if (m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH")) - { - m_ExecutableOutputPath = - m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH"); - if(m_ExecutableOutputPath.size()) - { - if(m_ExecutableOutputPath[m_ExecutableOutputPath.size() -1] != '/') - { - m_ExecutableOutputPath += "/"; - } - if(!cmSystemTools::MakeDirectory(m_ExecutableOutputPath.c_str())) - { - cmSystemTools::Error("Error failed to create " - "EXECUTABLE_OUTPUT_PATH directory:", - m_ExecutableOutputPath.c_str()); - } - m_Makefile->AddLinkDirectory(m_ExecutableOutputPath.c_str()); - } - } - - - if(m_CacheOnly) - { - // Generate the cache only stuff - this->GenerateCacheOnly(); - // if recurse then generate for all sub- makefiles - if(m_Recurse) - { - this->RecursiveGenerateCacheOnly(); - } - } - // normal makefile output - else - { - // Generate depends - cmMakeDepend md; - md.SetMakefile(m_Makefile); - md.GenerateMakefileDependencies(); - this->ProcessDepends(md); - // output the makefile fragment - this->OutputMakefile("Makefile"); - } -} - -void cmUnixMakefileGenerator::ProcessDepends(const cmMakeDepend &md) -{ - // Now create cmDependInformation objects for files in the directory - cmTargets &tgts = m_Makefile->GetTargets(); - for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); l++) - { - std::vector<cmSourceFile*> &classes = l->second.GetSourceFiles(); - for(std::vector<cmSourceFile*>::iterator i = classes.begin(); - i != classes.end(); ++i) - { - if(!(*i)->GetPropertyAsBool("HEADER_FILE_ONLY")) - { - // get the depends - const cmDependInformation *info = - md.GetDependInformationForSourceFile(*(*i)); - - // Delete any hints from the source file's dependencies. - (*i)->GetDepends().erase((*i)->GetDepends().begin(), (*i)->GetDepends().end()); - - // Now add the real dependencies for the file. - if (info) - { - for(cmDependInformation::DependencySet::const_iterator d = - info->m_DependencySet.begin(); - d != info->m_DependencySet.end(); ++d) - { - // Make sure the full path is given. If not, the dependency was - // not found. - if((*d)->m_FullPath != "") - { - (*i)->GetDepends().push_back((*d)->m_FullPath); - } - } - } - } - } - } -} - - -// This is where CMakeTargets.make is generated -void cmUnixMakefileGenerator::OutputMakefile(const char* file) -{ - // Create sub directories fro aux source directories - std::vector<std::string>& auxSourceDirs = - m_Makefile->GetAuxSourceDirectories(); - if( auxSourceDirs.size() ) - { - // For the case when this is running as a remote build - // on unix, make the directory - for(std::vector<std::string>::iterator i = auxSourceDirs.begin(); - i != auxSourceDirs.end(); ++i) - { - if(i->c_str()[0] != '/') - { - std::string dir = m_Makefile->GetCurrentOutputDirectory(); - if(dir.size() && dir[dir.size()-1] != '/') - { - dir += "/"; - } - dir += *i; - cmSystemTools::MakeDirectory(dir.c_str()); - } - else - { - cmSystemTools::MakeDirectory(i->c_str()); - } - } - } - // Create a stream that writes to a temporary file - // then does a copy at the end. This is to allow users - // to hit control-c during the make of the makefile - cmGeneratedFileStream tempFile(file); - tempFile.SetAlwaysCopy(true); - std::ostream& fout = tempFile.GetStream(); - if(!fout) - { - cmSystemTools::Error("Error can not open for write: ", file); - return; - } - fout << "# CMAKE generated Makefile, DO NOT EDIT!\n" - << "# Generated by \"" << this->GetName() << "\"" - << " Generator, CMake Version " - << cmMakefile::GetMajorVersion() << "." - << cmMakefile::GetMinorVersion() << "\n" - << "# Generated from the following files:\n# " - << m_Makefile->GetHomeOutputDirectory() << "/CMakeCache.txt\n"; - std::vector<std::string> lfiles = m_Makefile->GetListFiles(); - // sort the array - std::sort(lfiles.begin(), lfiles.end(), std::less<std::string>()); - // remove duplicates - std::vector<std::string>::iterator new_end = - std::unique(lfiles.begin(), lfiles.end()); - lfiles.erase(new_end, lfiles.end()); - - for(std::vector<std::string>::const_iterator i = lfiles.begin(); - i != lfiles.end(); ++i) - { - fout << "# " << i->c_str() << "\n"; - } - fout << "\n\n"; - fout << "# Suppresses display of executed commands\n"; - fout << ".SILENT:\n"; - fout << "# disable some common implicit rules to speed things up\n"; - fout << ".SUFFIXES:\n"; - fout << ".SUFFIXES:.hpuxmakemusthaverule\n"; - // create a make variable with all of the sources for this Makefile - // for depend purposes. - fout << "CMAKE_MAKEFILE_SOURCES = "; - for(std::vector<std::string>::const_iterator i = lfiles.begin(); - i != lfiles.end(); ++i) - { - fout << " " << this->ConvertToOutputPath(i->c_str()); - } - // Add the cache to the list - std::string cacheFile = m_Makefile->GetHomeOutputDirectory(); - cacheFile += "/CMakeCache.txt"; - fout << " " << this->ConvertToOutputPath(cacheFile.c_str()); - fout << "\n\n\n"; - this->OutputMakeVariables(fout); - // Set up the default target as the VERY first target, so that make with no arguments will run it - this-> - OutputMakeRule(fout, - "Default target executed when no arguments are given to make, first make sure cmake.depends exists, cmake.check_depends is up-to-date, check the sources, then build the all target", - "default_target", - 0, - "$(MAKE) $(MAKESILENT) cmake.depends", - "$(MAKE) $(MAKESILENT) cmake.check_depends", - "$(MAKE) $(MAKESILENT) -f cmake.check_depends", - "$(MAKE) $(MAKESILENT) all"); - - this->OutputTargetRules(fout); - this->OutputDependLibs(fout); - this->OutputTargets(fout); - this->OutputSubDirectoryRules(fout); - std::string dependName = m_Makefile->GetStartOutputDirectory(); - dependName += "/cmake.depends"; - if(!this->m_CacheOnly) - { - std::ofstream dependout(dependName.c_str()); - if(!dependout) - { - cmSystemTools::Error("Error can not open for write: ", dependName.c_str()); - return; - } - dependout << "# .o dependencies in this directory." << std::endl; - - std::string checkDepend = m_Makefile->GetStartOutputDirectory(); - checkDepend += "/cmake.check_depends"; - std::ofstream checkdependout(checkDepend.c_str()); - if(!checkdependout) - { - cmSystemTools::Error("Error can not open for write: ", checkDepend.c_str()); - return; - } - checkdependout << "# This file is used as a tag file, that all sources depend on. If a source changes, then the rule to rebuild this file will cause cmake.depends to be rebuilt." << std::endl; - // if there were any depends output, then output the check depends - // information inot checkdependout - if(this->OutputObjectDepends(dependout)) - { - this->OutputCheckDepends(checkdependout); - } - else - { - checkdependout << "all:\n\t@echo cmake.depends is up-to-date\n"; - } - } - this->OutputCustomRules(fout); - this->OutputMakeRules(fout); - this->OutputInstallRules(fout); - // only add the depend include if the depend file exists - if(cmSystemTools::FileExists(dependName.c_str())) - { - this->OutputIncludeMakefile(fout, "cmake.depends"); - } -} - -void cmUnixMakefileGenerator::OutputIncludeMakefile(std::ostream& fout, - const char* file) -{ - fout << "include " << file << "\n"; -} - - -std::string -cmUnixMakefileGenerator::GetOutputExtension(const char*) -{ - return m_ObjectFileExtension; -} - - - -// Output the rules for any targets -void cmUnixMakefileGenerator::OutputTargetRules(std::ostream& fout) -{ - // for each target add to the list of targets - fout << "TARGETS = "; - const cmTargets &tgts = m_Makefile->GetTargets(); - // list libraries first - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - if (l->second.IsInAll()) - { - std::string path = m_LibraryOutputPath + m_LibraryPrefix; - if(l->second.GetType() == cmTarget::STATIC_LIBRARY) - { - path = path + l->first + m_StaticLibraryExtension; - fout << " \\\n" - << this->ConvertToOutputPath(path.c_str()); - } - else if(l->second.GetType() == cmTarget::SHARED_LIBRARY) - { - path = path + l->first + - m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX"); - fout << " \\\n" - << this->ConvertToOutputPath(path.c_str()); - } - else if(l->second.GetType() == cmTarget::MODULE_LIBRARY) - { - path = path + l->first + - m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX"); - fout << " \\\n" - << this->ConvertToOutputPath(path.c_str()); - } - } - } - // executables - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - if ((l->second.GetType() == cmTarget::EXECUTABLE || - l->second.GetType() == cmTarget::WIN32_EXECUTABLE) && - l->second.IsInAll()) - { - std::string path = m_ExecutableOutputPath + l->first + - m_ExecutableExtension; - fout << " \\\n" << this->ConvertToOutputPath(path.c_str()); - } - } - // list utilities last - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - if (l->second.GetType() == cmTarget::UTILITY && - l->second.IsInAll()) - { - fout << " \\\n" << l->first.c_str(); - } - } - fout << "\n\n"; - // get the classes from the source lists then add them to the groups - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - std::vector<cmSourceFile*> classes = l->second.GetSourceFiles(); - if (classes.begin() != classes.end()) - { - fout << this->CreateMakeVariable(l->first.c_str(), "_SRC_OBJS") << " = "; - for(std::vector<cmSourceFile*>::iterator i = classes.begin(); - i != classes.end(); i++) - { - if(!(*i)->GetPropertyAsBool("HEADER_FILE_ONLY")) - { - std::string outExt(this->GetOutputExtension((*i)->GetSourceExtension().c_str())); - if(outExt.size()) - { - fout << "\\\n" << this->ConvertToOutputPath((*i)->GetSourceName().c_str()) - << outExt.c_str() << " "; - } - } - } - fout << "\n\n"; - fout << this->CreateMakeVariable(l->first.c_str(), "_SRC_OBJS_QUOTED") << " = "; - for(std::vector<cmSourceFile*>::iterator i = classes.begin(); - i != classes.end(); i++) - { - if(!(*i)->GetPropertyAsBool("HEADER_FILE_ONLY")) - { - std::string outExt(this->GetOutputExtension((*i)->GetSourceExtension().c_str())); - if(outExt.size()) - { - fout << "\\\n\"" << this->ConvertToOutputPath((*i)->GetSourceName().c_str()) - << outExt.c_str() << "\" "; - } - } - } - fout << "\n\n"; - } - } - fout << "CLEAN_OBJECT_FILES = "; - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - std::vector<cmSourceFile*> classes = l->second.GetSourceFiles(); - if (classes.begin() != classes.end()) - { - fout << "$(" << this->CreateMakeVariable(l->first.c_str(), "_SRC_OBJS") - << ") "; - } - } - fout << "\n\n"; -} - - -/** - * Output the linking rules on a command line. For executables, - * targetLibrary should be a NULL pointer. For libraries, it should point - * to the name of the library. This will not link a library against itself. - */ -void cmUnixMakefileGenerator::OutputLinkLibraries(std::ostream& fout, - const char* targetLibrary, - const cmTarget &tgt) -{ - // Try to emit each search path once - std::set<std::string> emitted; - - // Embed runtime search paths if possible and if required. - bool outputRuntime = true; - std::string runtimeFlag; - std::string runtimeSep; - std::vector<std::string> runtimeDirs; - - bool cxx = tgt.HasCxx(); - if(!cxx ) - { - // if linking a c executable use the C runtime flag as cc - // may not be the same program that creates shared libaries - // and may have different flags - if( tgt.GetType() == cmTarget::EXECUTABLE) - { - if(m_Makefile->GetDefinition("CMAKE_C_SHLIB_RUNTIME_FLAG")) - { - runtimeFlag = m_Makefile->GetDefinition("CMAKE_C_SHLIB_RUNTIME_FLAG"); - } - } - else - { - if(m_Makefile->GetDefinition("CMAKE_SHLIB_RUNTIME_FLAG")) - { - runtimeFlag = m_Makefile->GetDefinition("CMAKE_SHLIB_RUNTIME_FLAG"); - } - } - if(m_Makefile->GetDefinition("CMAKE_SHLIB_RUNTIME_SEP")) - { - runtimeSep = m_Makefile->GetDefinition("CMAKE_SHLIB_RUNTIME_SEP"); - } - } - else - { - if(m_Makefile->GetDefinition("CMAKE_CXX_SHLIB_RUNTIME_FLAG")) - { - runtimeFlag = m_Makefile->GetDefinition("CMAKE_CXX_SHLIB_RUNTIME_FLAG"); - } - - if(m_Makefile->GetDefinition("CMAKE_CXX_SHLIB_RUNTIME_SEP")) - { - runtimeSep = m_Makefile->GetDefinition("CMAKE_CXX_SHLIB_RUNTIME_SEP"); - } - } - - - - // concatenate all paths or no? - bool runtimeConcatenate = ( runtimeSep!="" ); - if(runtimeFlag == "" || m_Makefile->IsOn("CMAKE_SKIP_RPATH") ) - { - outputRuntime = false; - } - - // Some search paths should never be emitted - emitted.insert(""); - emitted.insert("/usr/lib"); - - // collect all the flags needed for linking libraries - std::string linkLibs; - const std::vector<std::string>& libdirs = tgt.GetLinkDirectories(); - for(std::vector<std::string>::const_iterator libDir = libdirs.begin(); - libDir != libdirs.end(); ++libDir) - { - std::string libpath = this->ConvertToOutputPath(libDir->c_str()); - if(emitted.insert(libpath).second) - { - std::string::size_type pos = libDir->find("-L"); - if((pos == std::string::npos || pos > 0) - && libDir->find("${") == std::string::npos) - { - linkLibs += "-L"; - if(outputRuntime) - { - runtimeDirs.push_back( libpath ); - } - } - linkLibs += libpath; - linkLibs += " "; - } - } - - std::string librariesLinked; - const cmTarget::LinkLibraries& libs = tgt.GetLinkLibraries(); - for(cmTarget::LinkLibraries::const_iterator lib = libs.begin(); - lib != libs.end(); ++lib) - { - // Don't link the library against itself! - if(targetLibrary && (lib->first == targetLibrary)) continue; - // don't look at debug libraries - if (lib->second == cmTarget::DEBUG) continue; - // skip zero size library entries, this may happen - // if a variable expands to nothing. - if (lib->first.size() == 0) continue; - // if it is a full path break it into -L and -l - cmRegularExpression reg("([ \t]*\\-l)|([ \t]*\\-framework)|(\\${)"); - if(lib->first.find('/') != std::string::npos - && !reg.find(lib->first)) - { - std::string dir, file; - cmSystemTools::SplitProgramPath(lib->first.c_str(), - dir, file); - std::string libpath = this->ConvertToOutputPath(dir.c_str()); - if(emitted.insert(libpath).second) - { - linkLibs += "-L"; - linkLibs += libpath; - linkLibs += " "; - if(outputRuntime) - { - runtimeDirs.push_back( libpath ); - } - } - cmRegularExpression libname("lib(.*)(\\.so|\\.sl|\\.a|\\.dylib).*"); - cmRegularExpression libname_noprefix("(.*)(\\.so|\\.sl|\\.a|\\.dylib).*"); - if(libname.find(file)) - { - librariesLinked += "-l"; - file = libname.match(1); - librariesLinked += file; - librariesLinked += " "; - } - else if(libname_noprefix.find(file)) - { - librariesLinked += "-l"; - file = libname_noprefix.match(1); - librariesLinked += file; - librariesLinked += " "; - } - } - // not a full path, so add -l name - else - { - if(!reg.find(lib->first)) - { - librariesLinked += "-l"; - } - librariesLinked += lib->first; - librariesLinked += " "; - } - } - - linkLibs += librariesLinked; - - fout << linkLibs; - - if(outputRuntime && runtimeDirs.size()>0) - { - // For the runtime search directories, do a "-Wl,-rpath,a:b:c" or - // a "-R a -R b -R c" type link line - fout << runtimeFlag; - std::vector<std::string>::iterator itr = runtimeDirs.begin(); - fout << *itr; - ++itr; - for( ; itr != runtimeDirs.end(); ++itr ) - { - if(runtimeConcatenate) - { - fout << runtimeSep << *itr; - } - else - { - fout << " " << runtimeFlag << *itr; - } - } - fout << " "; - } -} - - -std::string cmUnixMakefileGenerator::CreateTargetRules(const cmTarget &target, - const char* targetName) -{ - std::string customRuleCode = ""; - bool initNext = false; - for (std::vector<cmCustomCommand>::const_iterator cr = - target.GetCustomCommands().begin(); - cr != target.GetCustomCommands().end(); ++cr) - { - cmCustomCommand cc(*cr); - cc.ExpandVariables(*m_Makefile); - if (cc.GetSourceName() == targetName) - { - if(initNext) - { - customRuleCode += "\n\t"; - } - else - { - initNext = true; - } - std::string command = this->ConvertToOutputPath(cc.GetCommand().c_str()); - customRuleCode += command + " " + cc.GetArguments(); - } - } - return customRuleCode; -} - - -void cmUnixMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_LibraryOutputPath + "lib" + name + "$(SHLIB_SUFFIX)"; - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS"); - depend += ") $(" + this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; - std::string command = "$(RM) lib"; - command += name; - command += "$(SHLIB_SUFFIX)"; - std::string command2; - if(t.HasCxx()) - { - command2 = "$(CMAKE_CXX_LINK_SHARED) $(CMAKE_CXX_SHLIB_LINK_FLAGS) " - "$(CMAKE_CXX_SHLIB_BUILD_FLAGS) $(CMAKE_CXX_FLAGS) -o \\\n"; - } - else - { - command2 = "$(CMAKE_C_LINK_SHARED) $(CMAKE_SHLIB_LINK_FLAGS) " - "$(CMAKE_SHLIB_BUILD_FLAGS) -o \\\n"; - } - command2 += "\t "; - std::string libName = m_LibraryOutputPath + "lib" + std::string(name) + "$(SHLIB_SUFFIX)"; - libName = this->ConvertToOutputPath(libName.c_str()); - command2 += libName + " \\\n"; - command2 += "\t $(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; - cmStringStream linklibs; - this->OutputLinkLibraries(linklibs, name, t); - command2 += linklibs.str(); - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, "rules for a shared library", - target.c_str(), - depend.c_str(), - command.c_str(), - command2.c_str(), - cc); -} - -void cmUnixMakefileGenerator::OutputModuleLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_LibraryOutputPath + "lib" + std::string(name) + "$(MODULE_SUFFIX)"; - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS") - + ") $(" + this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; - std::string command = "$(RM) lib" + std::string(name) + "$(MODULE_SUFFIX)"; - std::string command2; - if(t.HasCxx()) - { - command2 = "$(CMAKE_CXX_LINK_SHARED) $(CMAKE_CXX_MODULE_LINK_FLAGS) " - "$(CMAKE_CXX_MODULE_BUILD_FLAGS) $(CMAKE_CXX_FLAGS) -o \\\n"; - } - else - { - command2 = "$(CMAKE_C_LINK_SHARED) $(CMAKE_SHLIB_LINK_FLAGS) " - "$(CMAKE_SHLIB_BUILD_FLAGS) -o \\\n"; - } - command2 += "\t "; - std::string libName = m_LibraryOutputPath + "lib" + std::string(name) + "$(MODULE_SUFFIX)"; - libName = this->ConvertToOutputPath(libName.c_str()); - command2 += libName + " \\\n"; - command2 += "\t $(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; - cmStringStream linklibs; - this->OutputLinkLibraries(linklibs, std::string(name).c_str(), t); - command2 += linklibs.str(); - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, "rules for a shared module library", - target.c_str(), - depend.c_str(), - command.c_str(), - command2.c_str(), - cc); -} - - -void cmUnixMakefileGenerator::OutputStaticLibraryRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_LibraryOutputPath + "lib" + std::string(name) + ".a"; - target = this->ConvertToOutputPath(target.c_str()); - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS") + ")"; - std::string command; - if(t.HasCxx()) - { - command = "$(CMAKE_CXX_AR) $(CMAKE_CXX_AR_ARGS) "; - } - else - { - command = "$(CMAKE_AR) $(CMAKE_AR_ARGS) "; - } - command += target; - command += " $("; - command += this->CreateMakeVariable(name, "_SRC_OBJS") + ")"; - std::string command2 = "$(CMAKE_RANLIB) "; - command2 += target; - std::string comment = "rule to build static library: "; - comment += name; - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, - comment.c_str(), - target.c_str(), - depend.c_str(), - command.c_str(), - command2.c_str(), - cc); -} - -void cmUnixMakefileGenerator::OutputExecutableRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string target = m_ExecutableOutputPath + name + m_ExecutableExtension; - std::string depend = "$("; - depend += this->CreateMakeVariable(name, "_SRC_OBJS") - + ") $(" + this->CreateMakeVariable(name, "_DEPEND_LIBS") + ")"; - std::string command; - if(t.HasCxx()) - { - command = - "$(CMAKE_CXX_COMPILER) $(CMAKE_CXX_SHLIB_LINK_FLAGS) $(CMAKE_CXX_FLAGS) "; - } - else - { - command = - "$(CMAKE_C_COMPILER) $(CMAKE_C_SHLIB_LINK_FLAGS) $(CMAKE_C_FLAGS) "; - } - command += "$(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ") "; - cmStringStream linklibs; - this->OutputLinkLibraries(linklibs, 0, t); - command += linklibs.str(); - std::string outputFile = m_ExecutableOutputPath + name; - command += " -o " + this->ConvertToOutputPath(outputFile.c_str()); - std::string comment = "rule to build executable: "; - comment += name; - - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - this->OutputMakeRule(fout, - comment.c_str(), - target.c_str(), - depend.c_str(), - command.c_str(), - cc); -} - - - -void cmUnixMakefileGenerator::OutputUtilityRule(std::ostream& fout, - const char* name, - const cmTarget &t) -{ - std::string customCommands = this->CreateTargetRules(t, name); - const char* cc = 0; - if(customCommands.size() > 0) - { - cc = customCommands.c_str(); - } - std::string comment = "Rule to build Utility "; - comment += name; - std::string depends; - std::string replaceVars; - const std::vector<cmCustomCommand> &ccs = t.GetCustomCommands(); - for(std::vector<cmCustomCommand>::const_iterator i = ccs.begin(); - i != ccs.end(); ++i) - { - const std::vector<std::string> & dep = i->GetDepends(); - for(std::vector<std::string>::const_iterator d = dep.begin(); - d != dep.end(); ++d) - { - depends += " \\\n"; - replaceVars = *d; - m_Makefile->ExpandVariablesInString(replaceVars); - depends += this->ConvertToOutputPath(replaceVars.c_str()); - } - } - this->OutputMakeRule(fout, - comment.c_str(), - name, - depends.c_str(), - cc); -} - - - -void cmUnixMakefileGenerator::OutputTargets(std::ostream& fout) -{ - // for each target - const cmTargets &tgts = m_Makefile->GetTargets(); - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - switch(l->second.GetType()) - { - case cmTarget::STATIC_LIBRARY: - this->OutputStaticLibraryRule(fout, l->first.c_str(), l->second); - break; - case cmTarget::SHARED_LIBRARY: - this->OutputSharedLibraryRule(fout, l->first.c_str(), l->second); - break; - case cmTarget::MODULE_LIBRARY: - this->OutputModuleLibraryRule(fout, l->first.c_str(), l->second); - break; - case cmTarget::EXECUTABLE: - case cmTarget::WIN32_EXECUTABLE: - this->OutputExecutableRule(fout, l->first.c_str(), l->second); - break; - case cmTarget::UTILITY: - this->OutputUtilityRule(fout, l->first.c_str(), l->second); - break; - // This is handled by the OutputCustomRules method - case cmTarget::INSTALL_FILES: - // This is handled by the OutputInstallRules method - case cmTarget::INSTALL_PROGRAMS: - // This is handled by the OutputInstallRules method - break; - } - } -} - - - -// For each target that is an executable or shared library, generate -// the "<name>_DEPEND_LIBS" variable listing its library dependencies. -void cmUnixMakefileGenerator::OutputDependLibs(std::ostream& fout) -{ - // Build a set of libraries that will be linked into any target in - // this directory. - std::set<std::string> used; - - // for each target - const cmTargets &tgts = m_Makefile->GetTargets(); - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - // Each dependency should only be emitted once per target. - std::set<std::string> emitted; - if ((l->second.GetType() == cmTarget::SHARED_LIBRARY) - || (l->second.GetType() == cmTarget::MODULE_LIBRARY) - || (l->second.GetType() == cmTarget::EXECUTABLE) - || (l->second.GetType() == cmTarget::WIN32_EXECUTABLE)) - { - fout << this->CreateMakeVariable(l->first.c_str(), "_DEPEND_LIBS") << " = "; - - // A library should not depend on itself! - emitted.insert(l->first); - - // Now, look at all link libraries specific to this target. - const cmTarget::LinkLibraries& tlibs = l->second.GetLinkLibraries(); - for(cmTarget::LinkLibraries::const_iterator lib = tlibs.begin(); - lib != tlibs.end(); ++lib) - { - // Record that this library was used. - used.insert(lib->first); - - // Don't emit the same library twice for this target. - if(emitted.insert(lib->first).second) - { - // Output this dependency. - this->OutputLibDepend(fout, lib->first.c_str()); - } - } - - // Now, look at all utilities specific to this target. - const std::set<cmStdString>& tutils = l->second.GetUtilities(); - for(std::set<cmStdString>::const_iterator util = tutils.begin(); - util != tutils.end(); ++util) - { - // Record that this utility was used. - used.insert(*util); - - // Don't emit the same utility twice for this target. - if(emitted.insert(*util).second) - { - // Output this dependency. - this->OutputExeDepend(fout, util->c_str()); - } - } - - fout << "\n"; - } - } - - fout << "\n"; - - // Loop over the libraries used and make sure there is a rule to - // build them in this makefile. If the library is in another - // directory, add a rule to jump to that directory and make sure it - // exists. - for(std::set<std::string>::const_iterator lib = used.begin(); - lib != used.end(); ++lib) - { - // loop over the list of directories that the libraries might - // be in, looking for an ADD_LIBRARY(lib...) line. This would - // be stored in the cache - std::string libPath = *lib + "_CMAKE_PATH"; - const char* cacheValue = m_Makefile->GetDefinition(libPath.c_str()); - // if cache and not the current directory add a rule, to - // jump into the directory and build for the first time - if(cacheValue && - (!this->SamePath(m_Makefile->GetCurrentOutputDirectory(), cacheValue))) - { - // add the correct extension - std::string ltname = *lib+"_LIBRARY_TYPE"; - const char* libType - = m_Makefile->GetDefinition(ltname.c_str()); - // if it was a library.. - if (libType) - { - std::string library = m_LibraryPrefix; - library += *lib; - std::string libpath = cacheValue; - if(libType && std::string(libType) == "SHARED") - { - library += m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX"); - } - else if(libType && std::string(libType) == "MODULE") - { - library += m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX"); - } - else if(libType && std::string(libType) == "STATIC") - { - library += m_StaticLibraryExtension; - } - else - { - cmSystemTools::Error("Unknown library type!"); - return; - } - if(m_LibraryOutputPath.size()) - { - libpath = m_LibraryOutputPath; - } - else - { - libpath += "/"; - } - libpath += library; - // put out a rule to build the library if it does not exist - this->OutputBuildTargetInDir(fout, - cacheValue, - library.c_str(), - libpath.c_str(), - m_Makefile-> - GetDefinition("LIBRARY_OUTPUT_PATH") - ); - } - // something other than a library... - else - { - std::string exepath = cacheValue; - if(m_ExecutableOutputPath.size()) - { - exepath = m_ExecutableOutputPath; - } - else - { - exepath += "/"; - } - exepath += *lib; - this->OutputBuildTargetInDir(fout, - cacheValue, - lib->c_str(), - exepath.c_str(), - m_Makefile-> - GetDefinition("EXECUTABLE_OUTPUT_PATH") - ); - } - } - } -} - -void cmUnixMakefileGenerator::OutputBuildTargetInDir(std::ostream& fout, - const char* path, - const char* library, - const char* fullpath, - const char* outputPath) -{ - const char* makeTarget = library; - if(outputPath && strcmp( outputPath, "" ) != 0) - { - makeTarget = fullpath; - } - fout << this->ConvertToOutputPath(fullpath) - << ":\n\tcd " << this->ConvertToOutputPath(path) - << "; $(MAKE) $(MAKESILENT) cmake.depends" - << "; $(MAKE) $(MAKESILENT) cmake.check_depends" - << "; $(MAKE) $(MAKESILENT) -f cmake.check_depends" - << "; $(MAKE) $(MAKESILENT) " - << this->ConvertToOutputPath(makeTarget) << "\n\n"; -} - - -bool cmUnixMakefileGenerator::SamePath(const char* path1, const char* path2) -{ - return strcmp(path1, path2) == 0; -} - -void cmUnixMakefileGenerator::OutputLibDepend(std::ostream& fout, - const char* name) -{ - std::string libPath = name; - libPath += "_CMAKE_PATH"; - const char* cacheValue = m_Makefile->GetDefinition(libPath.c_str()); - if(cacheValue ) - { - // if there is a cache value, then this is a library that cmake - // knows how to build, so we can depend on it - std::string libpath; - if (!this->SamePath(m_Makefile->GetCurrentOutputDirectory(), cacheValue)) - { - // if the library is not in the current directory, then get the full - // path to it - if(m_LibraryOutputPath.size()) - { - libpath = m_LibraryOutputPath; - libpath += m_LibraryPrefix; - } - else - { - libpath = cacheValue; - libpath += "/"; - libpath += m_LibraryPrefix; - } - } - else - { - // library is in current Makefile so use lib as a prefix - libpath = m_LibraryOutputPath; - libpath += m_LibraryPrefix; - } - // add the library name - libpath += name; - // add the correct extension - std::string ltname = name; - ltname += "_LIBRARY_TYPE"; - const char* libType = m_Makefile->GetDefinition(ltname.c_str()); - if(libType && std::string(libType) == "SHARED") - { - libpath += m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX"); - } - else if (libType && std::string(libType) == "MODULE") - { - libpath += m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX"); - } - else if (libType && std::string(libType) == "STATIC") - { - libpath += m_StaticLibraryExtension; - } - fout << this->ConvertToOutputPath(libpath.c_str()) << " "; - } -} - - -void cmUnixMakefileGenerator::OutputExeDepend(std::ostream& fout, - const char* name) -{ - std::string exePath = name; - exePath += "_CMAKE_PATH"; - const char* cacheValue = m_Makefile->GetDefinition(exePath.c_str()); - if(cacheValue ) - { - // if there is a cache value, then this is a executable/utility that cmake - // knows how to build, so we can depend on it - std::string exepath; - if (!this->SamePath(m_Makefile->GetCurrentOutputDirectory(), cacheValue)) - { - // if the exe/utility is not in the current directory, then get the full - // path to it - if(m_ExecutableOutputPath.size()) - { - exepath = m_ExecutableOutputPath; - } - else - { - exepath = cacheValue; - exepath += "/"; - } - } - else - { - // library is in current Makefile - exepath = m_ExecutableOutputPath; - } - // add the library name - exepath += name; - // add the correct extension - exepath += m_ExecutableExtension; - fout << this->ConvertToOutputPath(exepath.c_str()) << " "; - } -} - - - -// fix up names of directories so they can be used -// as targets in makefiles. -inline std::string FixDirectoryName(const char* dir) -{ - std::string s = dir; - // replace ../ with 3 under bars - size_t pos = s.find("../"); - if(pos != std::string::npos) - { - s.replace(pos, 3, "___"); - } - // replace / directory separators with a single under bar - pos = s.find("/"); - while(pos != std::string::npos) - { - s.replace(pos, 1, "_"); - pos = s.find("/"); - } - return s; -} - - -void cmUnixMakefileGenerator::BuildInSubDirectory(std::ostream& fout, - const char* dir, - const char* target1, - const char* target2, - bool silent) -{ - std::string directory = this->ConvertToOutputPath(dir); - if(target1) - { - fout << "\t@if test ! -d " << directory - << "; then $(MAKE) rebuild_cache; fi\n"; - if (!silent) - { - fout << "\techo " << directory << ": building " << target1 << "\n"; - } - fout << "\t@cd " << directory - << "; $(MAKE) " << target1 << "\n"; - } - if(target2) - { - if (!silent) - { - fout << "\techo " << directory << ": building " << target2 << "\n"; - } - fout << "\t@cd " << directory - << "; $(MAKE) " << target2 << "\n"; - } - fout << "\n"; -} - - -void -cmUnixMakefileGenerator:: -OutputSubDirectoryVars(std::ostream& fout, - const char* var, - const char* target, - const char* target1, - const char* target2, - const char* depend, - const std::vector<std::string>& SubDirectories, - bool silent) -{ - if(!depend) - { - depend = ""; - } - if( SubDirectories.size() == 0) - { - return; - } - fout << "# Variable for making " << target << " in subdirectories.\n"; - fout << var << " = \\\n"; - unsigned int i; - for(i =0; i < SubDirectories.size(); i++) - { - std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); - fout << target << "_" << subdir.c_str(); - if(i == SubDirectories.size()-1) - { - fout << " \n\n"; - } - else - { - fout << " \\\n"; - } - } - fout << "# Targets for making " << target << " in subdirectories.\n"; - std::string last = ""; - for(unsigned int i =0; i < SubDirectories.size(); i++) - { - std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); - fout << target << "_" << subdir.c_str() << ": " << depend; - - // Make each subdirectory depend on previous one. This forces - // parallel builds (make -j 2) to build in same order as a single - // threaded build to avoid dependency problems. - if(i > 0) - { - fout << " " << target << "_" << last.c_str(); - } - - fout << "\n"; - last = subdir; - std::string dir = m_Makefile->GetCurrentOutputDirectory(); - dir += "/"; - dir += SubDirectories[i]; - this->BuildInSubDirectory(fout, dir.c_str(), - target1, target2, silent); - } - fout << "\n\n"; -} - - -// output rules for decending into sub directories -void cmUnixMakefileGenerator::OutputSubDirectoryRules(std::ostream& fout) -{ - // Output Sub directory build rules - const std::vector<std::string>& SubDirectories - = m_Makefile->GetSubDirectories(); - - if( SubDirectories.size() == 0) - { - return; - } - this->OutputSubDirectoryVars(fout, - "SUBDIR_BUILD", - "default_target", - "default_target", - 0, "$(TARGETS)", - SubDirectories, - false); - this->OutputSubDirectoryVars(fout, "SUBDIR_CLEAN", "clean", - "clean", - 0, 0, - SubDirectories); - this->OutputSubDirectoryVars(fout, "SUBDIR_DEPEND", "depend", - "depend", - 0, 0, - SubDirectories); - this->OutputSubDirectoryVars(fout, "SUBDIR_INSTALL", "install", - "install", - 0, 0, - SubDirectories); -} - - - - -// Output the depend information for all the classes -// in the makefile. These would have been generated -// by the class cmMakeDepend GenerateMakefile -bool cmUnixMakefileGenerator::OutputObjectDepends(std::ostream& fout) -{ - bool ret = false; - // Iterate over every target. - std::map<cmStdString, cmTarget>& targets = m_Makefile->GetTargets(); - for(std::map<cmStdString, cmTarget>::const_iterator target = targets.begin(); - target != targets.end(); ++target) - { - // Iterate over every source for this target. - const std::vector<cmSourceFile*>& sources = target->second.GetSourceFiles(); - for(std::vector<cmSourceFile*>::const_iterator source = sources.begin(); - source != sources.end(); ++source) - { - if(!(*source)->GetPropertyAsBool("HEADER_FILE_ONLY")) - { - if(!(*source)->GetDepends().empty()) - { - fout << (*source)->GetSourceName() << m_ObjectFileExtension << " :"; - // Iterate through all the dependencies for this source. - for(std::vector<std::string>::const_iterator dep = - (*source)->GetDepends().begin(); - dep != (*source)->GetDepends().end(); ++dep) - { - fout << " \\\n" - << this->ConvertToOutputPath(dep->c_str()); - ret = true; - } - fout << "\n\n"; - } - } - } - } - return ret; -} - - - -// Output the depend information for all the classes -// in the makefile. These would have been generated -// by the class cmMakeDepend GenerateMakefile -void cmUnixMakefileGenerator::OutputCheckDepends(std::ostream& fout) -{ - std::set<std::string> emittedLowerPath; - std::set<std::string> emitted; - // Iterate over every target. - std::map<cmStdString, cmTarget>& targets = m_Makefile->GetTargets(); - fout << "# Suppresses display of executed commands\n"; - fout << ".SILENT:\n"; - fout << "# disable some common implicit rules to speed things up\n"; - fout << ".SUFFIXES:\n"; - fout << ".SUFFIXES:.hpuxmakemusthaverule\n"; - this->OutputMakeVariables(fout); - fout << "default:\n"; - fout << "\t$(MAKE) $(MAKESILENT) -f cmake.check_depends all\n" - << "\t$(MAKE) $(MAKESILENT) -f cmake.check_depends cmake.depends\n\n"; - for(std::map<cmStdString, cmTarget>::const_iterator target = targets.begin(); - target != targets.end(); ++target) - { - // Iterate over every source for this target. - const std::vector<cmSourceFile*>& sources = target->second.GetSourceFiles(); - for(std::vector<cmSourceFile*>::const_iterator source = sources.begin(); - source != sources.end(); ++source) - { - if(!(*source)->GetPropertyAsBool("HEADER_FILE_ONLY")) - { - if(!(*source)->GetDepends().empty()) - { - for(std::vector<std::string>::const_iterator dep = - (*source)->GetDepends().begin(); - dep != (*source)->GetDepends().end(); ++dep) - { - std::string dependfile = - this->ConvertToOutputPath(cmSystemTools::CollapseFullPath(dep->c_str()).c_str()); - // use the lower path function to create uniqe names - std::string lowerpath = this->LowerCasePath(dependfile.c_str()); - if(emittedLowerPath.insert(lowerpath).second) - { - emitted.insert(dependfile); - fout << "all:: " << dependfile << "\n"; - } - } - } - } - } - } - fout << "\n\n# if any of these files changes run make dependlocal\n"; - std::set<std::string>::iterator i; - for(i = emitted.begin(); i != emitted.end(); ++i) - { - fout << "cmake.depends:: " << *i << "\n\t$(MAKE) $(MAKESILENT) dependlocal\n\n"; - } - fout << "\n\n"; - fout << "# if a .h file is removed then run make dependlocal\n\n"; - for(std::set<std::string>::iterator i = emitted.begin(); - i != emitted.end(); ++i) - { - fout << *i << ":\n" - << "\t$(MAKE) $(MAKESILENT) dependlocal\n\n"; - } -} - -// Output each custom rule in the following format: -// output: source depends... -// (tab) command... -void cmUnixMakefileGenerator::OutputCustomRules(std::ostream& fout) -{ - // We may be modifying the source groups temporarily, so make a copy. - std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups(); - - const cmTargets &tgts = m_Makefile->GetTargets(); - for(cmTargets::const_iterator tgt = tgts.begin(); - tgt != tgts.end(); ++tgt) - { - // add any custom rules to the source groups - for (std::vector<cmCustomCommand>::const_iterator cr = - tgt->second.GetCustomCommands().begin(); - cr != tgt->second.GetCustomCommands().end(); ++cr) - { - // if the source for the custom command is the same name - // as the target, then to not create a rule in the makefile for - // the custom command, as the command will be fired when the other target - // is built. - if ( cr->GetSourceName().compare(tgt->first) !=0) - { - cmSourceGroup& sourceGroup = - m_Makefile->FindSourceGroup(cr->GetSourceName().c_str(), - sourceGroups); - cmCustomCommand cc(*cr); - cc.ExpandVariables(*m_Makefile); - sourceGroup.AddCustomCommand(cc); - } - } - } - - // Loop through every source group. - for(std::vector<cmSourceGroup>::const_iterator sg = - sourceGroups.begin(); sg != sourceGroups.end(); ++sg) - { - const cmSourceGroup::BuildRules& buildRules = sg->GetBuildRules(); - if(buildRules.empty()) - { continue; } - - std::string name = sg->GetName(); - if(name != "") - { - fout << "# Start of source group \"" << name.c_str() << "\"\n"; - } - - // Loop through each source in the source group. - for(cmSourceGroup::BuildRules::const_iterator cc = - buildRules.begin(); cc != buildRules.end(); ++ cc) - { - std::string source = cc->first; - const cmSourceGroup::Commands& commands = cc->second.m_Commands; - // Loop through every command generating code from the current source. - for(cmSourceGroup::Commands::const_iterator c = commands.begin(); - c != commands.end(); ++c) - { - // escape spaces and convert to native slashes path for - // the command - std::string command = - this->ConvertToOutputPath(c->second.m_Command.c_str()); - command += " "; - // now add the arguments - command += c->second.m_Arguments; - const cmSourceGroup::CommandFiles& commandFiles = c->second; - // if the command has no outputs, then it is a utility command - // with no outputs - if(commandFiles.m_Outputs.size() == 0) - { - std::string depends; - // collect out all the dependencies for this rule. - for(std::set<std::string>::const_iterator d = - commandFiles.m_Depends.begin(); - d != commandFiles.m_Depends.end(); ++d) - { - std::string dep = this->ConvertToOutputPath(d->c_str()); - depends += " "; - depends += dep; - } - // output rule - this->OutputMakeRule(fout, - "Custom command", - source.c_str(), - depends.c_str(), - command.c_str()); - } - // Write a rule for every output generated by this command. - for(std::set<std::string>::const_iterator output = - commandFiles.m_Outputs.begin(); - output != commandFiles.m_Outputs.end(); ++output) - { - std::string src = this->ConvertToOutputPath(source.c_str()); - std::string depends; - depends += src; - // Collect out all the dependencies for this rule. - for(std::set<std::string>::const_iterator d = - commandFiles.m_Depends.begin(); - d != commandFiles.m_Depends.end(); ++d) - { - std::string dep = this->ConvertToOutputPath(d->c_str()); - depends += " "; - depends += dep; - } - // output rule - this->OutputMakeRule(fout, - "Custom command", - output->c_str(), - depends.c_str(), - command.c_str()); - } - } - } - if(name != "") - { - fout << "# End of source group \"" << name.c_str() << "\"\n\n"; - } - } -} - - -void cmUnixMakefileGenerator::GenerateCacheOnly() -{ - cmSystemTools::MakeDirectory(m_Makefile->GetStartOutputDirectory()); - std::string dest = m_Makefile->GetStartOutputDirectory(); - dest += "/Makefile"; - std::cout << "cmake: creating : " << dest.c_str() << std::endl; - this->OutputMakefile(dest.c_str()); - return; -} - -void cmUnixMakefileGenerator::RecursiveGenerateCacheOnly() -{ - std::vector<cmMakefile*> makefiles; - m_Makefile->FindSubDirectoryCMakeListsFiles(makefiles); - for(std::vector<cmMakefile*>::iterator i = makefiles.begin(); - i != makefiles.end(); ++i) - { - cmMakefile* mf = *i; - if(m_Makefile->GetDefinition("RUN_CONFIGURE")) - { - mf->AddDefinition("RUN_CONFIGURE", true); - } - cmUnixMakefileGenerator* gen = - static_cast<cmUnixMakefileGenerator*>(mf->GetMakefileGenerator()); - gen->SetCacheOnlyOn(); - gen->SetRecurseOff(); - mf->GenerateMakefile(); - } - // CLEAN up the makefiles created - for(unsigned int i =0; i < makefiles.size(); ++i) - { - delete makefiles[i]; - } -} - -void cmUnixMakefileGenerator::OutputMakeVariables(std::ostream& fout) -{ - const char* variables = - "# the standard shell for make\n" - "SHELL = /bin/sh\n" - "\n" - "CMAKE_RANLIB = @CMAKE_RANLIB@\n" - "CMAKE_AR = @CMAKE_AR@\n" - "CMAKE_AR_ARGS = @CMAKE_AR_ARGS@\n" - "CMAKE_CXX_AR = @CMAKE_CXX_AR@\n" - "CMAKE_CXX_AR_ARGS = @CMAKE_CXX_AR_ARGS@\n" - "CMAKE_C_FLAGS = @CMAKE_C_FLAGS@\n" - "CMAKE_C_COMPILER = @CMAKE_C_COMPILER@\n" - "CMAKE_C_LINK_SHARED = @CMAKE_C_LINK_SHARED@\n" - "CMAKE_CXX_LINK_SHARED = @CMAKE_CXX_LINK_SHARED@\n" - "CMAKE_SHLIB_CFLAGS = @CMAKE_SHLIB_CFLAGS@\n" - - "CMAKE_CXX_SHLIB_CFLAGS = @CMAKE_CXX_SHLIB_CFLAGS@\n" - "CMAKE_CXX_SHLIB_BUILD_FLAGS = @CMAKE_CXX_SHLIB_BUILD_FLAGS@\n" - "CMAKE_CXX_SHLIB_LINK_FLAGS = @CMAKE_CXX_SHLIB_LINK_FLAGS@\n" - "CMAKE_CXX_MODULE_BUILD_FLAGS = @CMAKE_CXX_MODULE_BUILD_FLAGS@\n" - "CMAKE_CXX_MODULE_LINK_FLAGS = @CMAKE_CXX_MODULE_LINK_FLAGS@\n" - "CMAKE_CXX_SHLIB_RUNTIME_FLAG = @CMAKE_CXX_SHLIB_RUNTIME_FLAG@\n" - "CMAKE_CXX_SHLIB_RUNTIME_SEP = @CMAKE_CXX_SHLIB_RUNTIME_SEP@\n" - - "\n" - "CMAKE_CXX_COMPILER = @CMAKE_CXX_COMPILER@\n" - "CMAKE_CXX_FLAGS = @CMAKE_CXX_FLAGS@\n" - "\n" - "CMAKE_SHLIB_BUILD_FLAGS = @CMAKE_SHLIB_BUILD_FLAGS@\n" - "CMAKE_SHLIB_LINK_FLAGS = @CMAKE_SHLIB_LINK_FLAGS@\n" - "CMAKE_C_SHLIB_LINK_FLAGS = @CMAKE_C_SHLIB_LINK_FLAGS@\n" - "CMAKE_MODULE_BUILD_FLAGS = @CMAKE_MODULE_BUILD_FLAGS@\n" - "CMAKE_MODULE_LINK_FLAGS = @CMAKE_MODULE_LINK_FLAGS@\n" - "CMAKE_C_SHLIB_RUNTIME_FLAG = @CMAKE_C_SHLIB_RUNTIME_FLAG@\n" - "CMAKE_SHLIB_RUNTIME_FLAG = @CMAKE_SHLIB_RUNTIME_FLAG@\n" - "CMAKE_SHLIB_RUNTIME_SEP = @CMAKE_SHLIB_RUNTIME_SEP@\n" - "DL_LIBS = @CMAKE_DL_LIBS@\n" - "SHLIB_LD_LIBS = @CMAKE_SHLIB_LD_LIBS@\n" - "SHLIB_SUFFIX = @CMAKE_SHLIB_SUFFIX@\n" - "MODULE_SUFFIX = @CMAKE_MODULE_SUFFIX@\n" - "THREAD_LIBS = @CMAKE_THREAD_LIBS@\n" - "RM = rm -f\n" - "\n"; - std::string replaceVars = variables; - m_Makefile->ExpandVariablesInString(replaceVars); - fout << replaceVars.c_str(); - fout << "CMAKE_COMMAND = " - << this->ConvertToOutputPath(m_Makefile->GetDefinition("CMAKE_COMMAND")) - << "\n"; - if(m_Makefile->GetDefinition("CMAKE_EDIT_COMMAND")) - { - fout << "CMAKE_EDIT_COMMAND = " - << this->ConvertToOutputPath(m_Makefile->GetDefinition("CMAKE_EDIT_COMMAND")) - << "\n"; - } - - fout << "CMAKE_CURRENT_SOURCE = " << - this->ConvertToOutputPath(m_Makefile->GetStartDirectory()) << "\n"; - fout << "CMAKE_CURRENT_BINARY = " << - this->ConvertToOutputPath(m_Makefile->GetStartOutputDirectory()) << "\n"; - fout << "CMAKE_SOURCE_DIR = " << - this->ConvertToOutputPath(m_Makefile->GetHomeDirectory()) << "\n"; - fout << "CMAKE_BINARY_DIR = " << - this->ConvertToOutputPath(m_Makefile->GetHomeOutputDirectory()) << "\n"; - // Output Include paths - fout << "INCLUDE_FLAGS = "; - std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories(); - std::vector<std::string>::iterator i; - fout << "-I" << - this->ConvertToOutputPath(m_Makefile->GetStartDirectory()) << " "; - for(i = includes.begin(); i != includes.end(); ++i) - { - std::string include = *i; - // Don't output a -I for the standard include path "/usr/include". - // This can cause problems with certain standard library - // implementations because the wrong headers may be found first. - if(include != "/usr/include") - { - fout << "-I" << this->ConvertToOutputPath(i->c_str()) << " "; - } - } - fout << m_Makefile->GetDefineFlags(); - fout << "\n\n"; -} - - -void cmUnixMakefileGenerator::OutputInstallRules(std::ostream& fout) -{ - const char* root - = m_Makefile->GetDefinition("CMAKE_ROOT"); - fout << "INSTALL = " << root << "/Templates/install-sh -c\n"; - fout << "INSTALL_PROGRAM = $(INSTALL)\n"; - fout << "INSTALL_DATA = $(INSTALL) -m 644\n"; - - const cmTargets &tgts = m_Makefile->GetTargets(); - fout << "install: $(SUBDIR_INSTALL)\n"; - fout << "\t@echo \"Installing ...\"\n"; - - const char* prefix - = m_Makefile->GetDefinition("CMAKE_INSTALL_PREFIX"); - if (!prefix) - { - prefix = "/usr/local"; - } - - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - if (l->second.GetInstallPath() != "") - { - // first make the directories for each target - fout << "\t@if [ ! -d $(DESTDIR)" << prefix << l->second.GetInstallPath() << - " ] ; then \\\n"; - fout << "\t echo \"Making directory $(DESTDIR)" << prefix - << l->second.GetInstallPath() << " \"; \\\n"; - fout << "\t mkdir -p $(DESTDIR)" << prefix << l->second.GetInstallPath() - << "; \\\n"; - fout << "\t chmod 755 $(DESTDIR)" << prefix << l->second.GetInstallPath() - << "; \\\n"; - fout << "\t else true; \\\n"; - fout << "\t fi\n"; - // now install the target - switch (l->second.GetType()) - { - case cmTarget::STATIC_LIBRARY: - fout << "\t$(INSTALL_DATA) " << m_LibraryOutputPath << "lib" - << l->first; - fout << ".a"; - fout << " $(DESTDIR)" << prefix << l->second.GetInstallPath() << "\n"; - break; - case cmTarget::SHARED_LIBRARY: - fout << "\t$(INSTALL_DATA) " << m_LibraryOutputPath << "lib" - << l->first; - fout << m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX"); - fout << " $(DESTDIR)" << prefix << l->second.GetInstallPath() << "\n"; - break; - case cmTarget::MODULE_LIBRARY: - fout << "\t$(INSTALL_DATA) " << m_LibraryOutputPath << "lib" - << l->first; - fout << m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX"); - fout << " $(DESTDIR)" << prefix << l->second.GetInstallPath() << "\n"; - break; - case cmTarget::WIN32_EXECUTABLE: - case cmTarget::EXECUTABLE: - fout << "\t$(INSTALL_PROGRAM) " << m_ExecutableOutputPath - << l->first - << cmSystemTools::GetExecutableExtension() - << " $(DESTDIR)" << prefix << l->second.GetInstallPath() << "\n"; - break; - case cmTarget::INSTALL_FILES: - { - const std::vector<std::string> &sf = l->second.GetSourceLists(); - std::vector<std::string>::const_iterator i; - for (i = sf.begin(); i != sf.end(); ++i) - { - fout << "\t@ echo \"Installing " << *i << " \"\n"; - fout << "\t@if [ -f " << *i << " ] ; then \\\n"; - // avoid using install-sh to install install-sh - // does not work on windows.... - if(*i == "install-sh") - { - fout << "\t cp "; - } - else - { - fout << "\t $(INSTALL_DATA) "; - } - fout << *i - << " $(DESTDIR)" << prefix << l->second.GetInstallPath() << "; \\\n"; - fout << "\t elif [ -f $(CMAKE_CURRENT_SOURCE)/" << *i << " ] ; then \\\n"; - // avoid using install-sh to install install-sh - // does not work on windows.... - if(*i == "install-sh") - { - fout << "\t cp "; - } - else - { - fout << "\t $(INSTALL_DATA) "; - } - fout << "$(CMAKE_CURRENT_SOURCE)/" << *i - << " $(DESTDIR)" << prefix << l->second.GetInstallPath() << "; \\\n"; - fout << "\telse \\\n"; - fout << "\t echo \" ERROR!!! Unable to find: " << *i - << " \"; \\\n"; - fout << "\t fi\n"; - } - } - break; - case cmTarget::INSTALL_PROGRAMS: - { - const std::vector<std::string> &sf = l->second.GetSourceLists(); - std::vector<std::string>::const_iterator i; - for (i = sf.begin(); i != sf.end(); ++i) - { - fout << "\t@ echo \"Installing " << *i << " \"\n"; - fout << "\t@if [ -f " << *i << " ] ; then \\\n"; - // avoid using install-sh to install install-sh - // does not work on windows.... - if(*i == "install-sh") - { - fout << "\t cp "; - } - else - { - fout << "\t $(INSTALL_PROGRAM) "; - } - fout << *i - << " $(DESTDIR)" << prefix << l->second.GetInstallPath() << "; \\\n"; - fout << "\t elif [ -f $(CMAKE_CURRENT_SOURCE)/" << *i << " ] ; then \\\n"; - // avoid using install-sh to install install-sh - // does not work on windows.... - if(*i == "install-sh") - { - fout << "\t cp "; - } - else - { - fout << "\t $(INSTALL_PROGRAM) "; - } - fout << "$(CMAKE_CURRENT_SOURCE)/" << *i - << " $(DESTDIR)" << prefix << l->second.GetInstallPath() << "; \\\n"; - fout << "\telse \\\n"; - fout << "\t echo \" ERROR!!! Unable to find: " << *i - << " \"; \\\n"; - fout << "\t fi\n"; - } - } - break; - case cmTarget::UTILITY: - default: - break; - } - } - } -} - -void cmUnixMakefileGenerator::OutputMakeRules(std::ostream& fout) -{ - this->OutputMakeRule(fout, - "Default build rule", - "all", - "cmake.depends $(TARGETS) $(SUBDIR_BUILD)", - 0); - this->OutputMakeRule(fout, - "remove generated files", - "clean", - "$(SUBDIR_CLEAN)", - "-@ $(RM) $(CLEAN_OBJECT_FILES) " - " $(TARGETS) $(GENERATED_QT_FILES) $(GENERATED_FLTK_FILES)"); - - // collect up all the sources - std::string allsources; - std::map<cmStdString, cmTarget>& targets = m_Makefile->GetTargets(); - for(std::map<cmStdString, cmTarget>::const_iterator target = targets.begin(); - target != targets.end(); ++target) - { - // Iterate over every source for this target. - const std::vector<cmSourceFile*>& sources = target->second.GetSourceFiles(); - for(std::vector<cmSourceFile*>::const_iterator source = sources.begin(); - source != sources.end(); ++source) - { - if(!(*source)->GetPropertyAsBool("HEADER_FILE_ONLY")) - { - allsources += " \\\n"; - allsources += this->ConvertToOutputPath((*source)->GetFullPath().c_str()); - } - } - } - - this->OutputMakeRule(fout, - "Rule to build the cmake.depends and Makefile as side effect, if a source cmakelist file is out of date.", - "cmake.depends", - "$(CMAKE_MAKEFILE_SOURCES)", - "$(CMAKE_COMMAND) " - "-S$(CMAKE_CURRENT_SOURCE) -O$(CMAKE_CURRENT_BINARY) " - "-H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)" - ); - this->OutputMakeRule(fout, - "Rule to build the cmake.check_depends and Makefile as side effect, if any source file has changed.", - "cmake.check_depends", - allsources.c_str(), - "$(CMAKE_COMMAND) " - "-S$(CMAKE_CURRENT_SOURCE) -O$(CMAKE_CURRENT_BINARY) " - "-H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)" - ); - - this->OutputMakeRule(fout, - "Rule to force the build of cmake.depends", - "depend", - "$(SUBDIR_DEPEND)", - "$(CMAKE_COMMAND) " - "-S$(CMAKE_CURRENT_SOURCE) -O$(CMAKE_CURRENT_BINARY) " - "-H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)"); - this->OutputMakeRule(fout, - "Rule to force the build of cmake.depends " - "in the current directory only.", - "dependlocal", - 0, - "$(CMAKE_COMMAND) " - "-S$(CMAKE_CURRENT_SOURCE) -O$(CMAKE_CURRENT_BINARY) " - "-H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)"); - - this->OutputMakeRule(fout, - "Rebuild CMakeCache.txt file", - "rebuild_cache", - "$(CMAKE_BINARY_DIR)/CMakeCache.txt", - "$(CMAKE_COMMAND) " - "-H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)"); - // if CMAKE_EDIT_COMMAND is defined then add a rule to run it - // called edit_cache - if(m_Makefile->GetDefinition("CMAKE_EDIT_COMMAND")) - { - this->OutputMakeRule(fout, - "Edit the CMakeCache.txt file with ccmake or CMakeSetup", - "edit_cache", - 0, - "$(CMAKE_EDIT_COMMAND) " - "-H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)"); - } - - this->OutputMakeRule(fout, - "Create CMakeCache.txt file", - "$(CMAKE_BINARY_DIR)/CMakeCache.txt", - 0, - "$(CMAKE_COMMAND) " - "-H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)"); - - this->OutputMakeRule(fout, - "Rule to keep make from removing Makefiles " - "if control-C is hit during a run of cmake.", - ".PRECIOUS", - "Makefile cmake.depends", - 0); - - this->OutputSourceObjectBuildRules(fout); - // find ctest - std::string ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - if(!cmSystemTools::FileExists(ctest.c_str())) - { - ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/Debug/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - } - if(!cmSystemTools::FileExists(ctest.c_str())) - { - ctest = m_Makefile->GetDefinition("CMAKE_COMMAND"); - ctest = cmSystemTools::GetFilenamePath(ctest.c_str()); - ctest += "/Release/"; - ctest += "ctest"; - ctest += cmSystemTools::GetExecutableExtension(); - } - if (cmSystemTools::FileExists(ctest.c_str())) - { - this->OutputMakeRule(fout, - "run any tests", - "test", - "", - this->ConvertToOutputPath(ctest.c_str()).c_str()); - } -} - -void -cmUnixMakefileGenerator:: -OutputBuildObjectFromSource(std::ostream& fout, - const char* shortName, - const cmSourceFile& source, - const char* extraCompileFlags, - bool shared) -{ - // Header files shouldn't have build rules. - if(source.GetPropertyAsBool("HEADER_FILE_ONLY")) - { - return; - } - - std::string comment = "Build "; - std::string objectFile = std::string(shortName) + m_ObjectFileExtension; - objectFile = this->ConvertToOutputPath(objectFile.c_str()); - comment += objectFile + " From "; - comment += source.GetFullPath(); - std::string compileCommand; - std::string ext = source.GetSourceExtension(); - if(ext == "c" ) - { - compileCommand = "$(CMAKE_C_COMPILER) $(CMAKE_C_FLAGS) "; - compileCommand += extraCompileFlags; - if(shared) - { - compileCommand += "$(CMAKE_SHLIB_CFLAGS) "; - } - compileCommand += "$(INCLUDE_FLAGS) -c "; - compileCommand += - this->ConvertToOutputPath(source.GetFullPath().c_str()); - compileCommand += " -o "; - compileCommand += objectFile; - } - else - { - compileCommand = "$(CMAKE_CXX_COMPILER) $(CMAKE_CXX_FLAGS) "; - compileCommand += extraCompileFlags; - if(shared) - { - compileCommand += "$(CMAKE_SHLIB_CFLAGS) "; - } - compileCommand += "$(INCLUDE_FLAGS) -c "; - compileCommand += - this->ConvertToOutputPath(source.GetFullPath().c_str()); - compileCommand += " -o "; - compileCommand += objectFile; - } - this->OutputMakeRule(fout, - comment.c_str(), - objectFile.c_str(), - this->ConvertToOutputPath(source.GetFullPath(). - c_str()).c_str(), - compileCommand.c_str()); -} - - - -void cmUnixMakefileGenerator::OutputSourceObjectBuildRules(std::ostream& fout) -{ - fout << "# Rules to build " << m_ObjectFileExtension - << " files from their sources:\n"; - - std::set<std::string> rules; - - // Iterate over every target. - std::map<cmStdString, cmTarget>& targets = m_Makefile->GetTargets(); - for(std::map<cmStdString, cmTarget>::const_iterator target = targets.begin(); - target != targets.end(); ++target) - { - bool shared = ((target->second.GetType() == cmTarget::SHARED_LIBRARY) || - (target->second.GetType() == cmTarget::MODULE_LIBRARY)); - std::string exportsDef = ""; - if(shared) - { - exportsDef = "-D"+target->first+"_EXPORTS "; - } - // Iterate over every source for this target. - const std::vector<cmSourceFile*>& sources = target->second.GetSourceFiles(); - for(std::vector<cmSourceFile*>::const_iterator source = sources.begin(); - source != sources.end(); ++source) - { - if(!(*source)->GetPropertyAsBool("HEADER_FILE_ONLY")) - { - std::string shortName; - std::string sourceName; - // If the full path to the source file includes this - // directory, we want to use the relative path for the - // filename of the object file. Otherwise, we will use just - // the filename portion. - if((cmSystemTools::GetFilenamePath((*source)->GetFullPath()).find(m_Makefile->GetCurrentDirectory()) == 0) - || (cmSystemTools::GetFilenamePath((*source)->GetFullPath()).find(m_Makefile-> - GetCurrentOutputDirectory()) == 0)) - { - sourceName = (*source)->GetSourceName()+"."+(*source)->GetSourceExtension(); - shortName = (*source)->GetSourceName(); - - // The path may be relative. See if a directory needs to be - // created for the output file. This is a ugly, and perhaps - // should be moved elsewhere. - std::string relPath = - cmSystemTools::GetFilenamePath((*source)->GetSourceName()); - if(relPath != "") - { - std::string outPath = m_Makefile->GetCurrentOutputDirectory(); - outPath += "/"+relPath; - cmSystemTools::MakeDirectory(outPath.c_str()); - } - } - else - { - sourceName = (*source)->GetFullPath(); - shortName = cmSystemTools::GetFilenameName((*source)->GetSourceName()); - } - std::string shortNameWithExt = shortName + - (*source)->GetSourceExtension(); - // Only output a rule for each .o once. - if(rules.find(shortNameWithExt) == rules.end()) - { - if((*source)->GetProperty("COMPILE_FLAGS")) - { - exportsDef += (*source)->GetProperty("COMPILE_FLAGS"); - exportsDef += " "; - } - this->OutputBuildObjectFromSource(fout, - shortName.c_str(), - *(*source), - exportsDef.c_str(), - shared); - rules.insert(shortNameWithExt); - } - } - } - } -} - -void cmUnixMakefileGenerator::OutputMakeRule(std::ostream& fout, - const char* comment, - const char* target, - const char* depends, - const char* command, - const char* command2, - const char* command3, - const char* command4) -{ - if(!target) - { - cmSystemTools::Error("no target for OutputMakeRule"); - return; - } - - std::string replace; - if(comment) - { - replace = comment; - m_Makefile->ExpandVariablesInString(replace); - fout << "#---------------------------------------------------------\n"; - fout << "# " << replace; - fout << "\n#\n"; - } - fout << "\n"; - - replace = target; - m_Makefile->ExpandVariablesInString(replace); - fout << this->ConvertToOutputPath(replace.c_str()) << ": "; - - if(depends) - { - replace = depends; - m_Makefile->ExpandVariablesInString(replace); - fout << replace.c_str(); - } - fout << "\n"; - - const char* commands[] = { command, command2, command3, command4 }; - - for (unsigned int i = 0; i < sizeof(commands) / sizeof(commands[0]); ++i) - { - if(commands[i]) - { - replace = commands[i]; - m_Makefile->ExpandVariablesInString(replace); - if(replace[0] != '-' && replace.find("echo") != 0 - && replace.find("$(MAKE)") != 0) - { - std::string echostring = replace; - // for unix we want to quote the output of echo - // for nmake and borland, the echo should not be quoted - if(strcmp(this->GetName(), "Unix Makefiles") == 0) - { - cmSystemTools::ReplaceString(echostring, "\\\n", " "); - cmSystemTools::ReplaceString(echostring, " \t", " "); - cmSystemTools::ReplaceString(echostring, "\n\t", "\"\n\techo \""); - fout << "\techo \"" << echostring.c_str() << "\"\n"; - } - else - { - cmSystemTools::ReplaceString(echostring, "\n\t", "\n\techo "); - fout << "\techo " << echostring.c_str() << "\n"; - } - } - fout << "\t" << replace.c_str() << "\n"; - } - } - fout << "\n"; -} - -void cmUnixMakefileGenerator::SetLocal (bool local) -{ - if (local) - { - m_CacheOnly = false; - m_Recurse = false; - } - else - { - m_CacheOnly = true; - m_Recurse = true; - } -} - -void cmUnixMakefileGenerator::EnableLanguage(const char* lang) -{ - if (m_CacheOnly) - { - // see man putenv for explaination of this stupid code.... - static char envCXX[5000]; - static char envCC[5000]; - if(m_Makefile->GetDefinition("CMAKE_CXX_COMPILER")) - { - std::string env = "CXX=${CMAKE_CXX_COMPILER}"; - m_Makefile->ExpandVariablesInString(env); - strncpy(envCXX, env.c_str(), 4999); - envCXX[4999] = 0; - putenv(envCXX); - } - if(m_Makefile->GetDefinition("CMAKE_C_COMPILER")) - { - std::string env = "CC=${CMAKE_C_COMPILER}"; - m_Makefile->ExpandVariablesInString(env); - strncpy(envCC, env.c_str(), 4999); - envCC[4999] = 0; - putenv(envCC); - } - std::string output; - std::string root - = this->ConvertToOutputPath(m_Makefile->GetDefinition("CMAKE_ROOT")); - // if no lang specified use CXX - if(!lang ) - { - lang = "CXX"; - } - // if CXX or C, then enable C - if((!this->GetLanguageEnabled(lang) && lang[0] == 'C')) - { - std::string cmd = root; - cmd += "/Templates/cconfigure"; - cmSystemTools::RunCommand(cmd.c_str(), output, - this->ConvertToOutputPath(m_Makefile->GetHomeOutputDirectory()).c_str()); - std::string fpath = m_Makefile->GetHomeOutputDirectory(); - fpath += "/CCMakeSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); - this->SetLanguageEnabled("C"); - } - // if CXX - if(!this->GetLanguageEnabled(lang) || strcmp(lang, "CXX") == 0) - { - std::string cmd = root; - cmd += "/Templates/cxxconfigure"; - cmSystemTools::RunCommand(cmd.c_str(), output, - this->ConvertToOutputPath(m_Makefile->GetHomeOutputDirectory()).c_str()); - std::string fpath = m_Makefile->GetHomeOutputDirectory(); - fpath += "/CXXCMakeSystemConfig.cmake"; - m_Makefile->ReadListFile(NULL,fpath.c_str()); - this->SetLanguageEnabled("CXX"); - } - m_Makefile->AddDefinition("RUN_CONFIGURE", true); - } -} - -int cmUnixMakefileGenerator::TryCompile(const char *srcdir, - const char *bindir, - const char *) -{ - // now build the test - std::string makeCommand = m_Makefile->GetDefinition("CMAKE_MAKE_PROGRAM"); - if(makeCommand.size() == 0) - { - cmSystemTools::Error( - "Generator cannot find the appropriate make command."); - return 1; - } - makeCommand = cmSystemTools::ConvertToOutputPath(makeCommand.c_str()); - - /** - * Run an executable command and put the stdout in output. - */ - std::string output; - - std::string cwd = cmSystemTools::GetCurrentWorkingDirectory(); - cmSystemTools::ChangeDirectory(bindir); - - // now build - makeCommand += " all"; - - if (!cmSystemTools::RunCommand(makeCommand.c_str(), output)) - { - cmSystemTools::Error("Generator: execution of make failed."); - // return to the original directory - cmSystemTools::ChangeDirectory(cwd.c_str()); - return 1; - } - cmSystemTools::ChangeDirectory(cwd.c_str()); - return 0; -} - diff --git a/Source/cmUnixMakefileGenerator.h b/Source/cmUnixMakefileGenerator.h deleted file mode 100644 index c93b363..0000000 --- a/Source/cmUnixMakefileGenerator.h +++ /dev/null @@ -1,197 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmUnixMakefileGenerator_h -#define cmUnixMakefileGenerator_h - -#include "cmMakefile.h" -#include "cmMakefileGenerator.h" - -/** \class cmUnixMakefileGenerator - * \brief Write a Unix makefiles. - * - * cmUnixMakefileGenerator produces a Unix makefile from its - * member m_Makefile. - */ -class cmUnixMakefileGenerator : public cmMakefileGenerator -{ -public: - ///! Set cache only and recurse to false by default. - cmUnixMakefileGenerator(); - - virtual ~cmUnixMakefileGenerator(); - - ///! Get the name for the generator. - virtual const char* GetName() {return "Unix Makefiles";} - - ///! virtual copy constructor - virtual cmMakefileGenerator* CreateObject() - { return new cmUnixMakefileGenerator;} - - //! just sets the Cache Only and Recurse flags - virtual void SetLocal(bool local); - - /** - * If cache only is on. - * and only stub makefiles are generated, and no depends, for speed. - * The default is OFF. - **/ - void SetCacheOnlyOn() {m_CacheOnly = true;} - void SetCacheOnlyOff() {m_CacheOnly = false;} - /** - * If recurse is on, then all the makefiles below this one are parsed as well. - */ - void SetRecurseOn() {m_Recurse = true;} - void SetRecurseOff() {m_Recurse = false;} - - /** - * Produce the makefile (in this case a Unix makefile). - */ - virtual void GenerateMakefile(); - - /** - * Output the depend information for all the classes - * in the makefile. These would have been generated - * by the class cmMakeDepend. - */ - virtual bool OutputObjectDepends(std::ostream&); - - /** - * Output the check depend information for all the classes - * in the makefile. These would have been generated - * by the class cmMakeDepend. - */ - virtual void OutputCheckDepends(std::ostream&); - - /** - * Try to determine system infomation such as shared library - * extension, pthreads, byte order etc. - */ - virtual void EnableLanguage(const char*); - -protected: - virtual void RecursiveGenerateCacheOnly(); - virtual void ProcessDepends(const cmMakeDepend &md); - virtual void GenerateCacheOnly(); - virtual void OutputMakefile(const char* file); - virtual void OutputTargetRules(std::ostream& fout); - virtual void OutputLinkLibraries(std::ostream&, const char* name, const cmTarget &); - - virtual void OutputSharedLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputModuleLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputStaticLibraryRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputExecutableRule(std::ostream&, const char* name, - const cmTarget &); - virtual void OutputUtilityRule(std::ostream&, const char* name, - const cmTarget &); - - virtual void OutputTargets(std::ostream&); - virtual void OutputSubDirectoryRules(std::ostream&); - virtual void OutputDependLibs(std::ostream&); - virtual void OutputLibDepend(std::ostream&, const char*); - virtual void OutputExeDepend(std::ostream&, const char*); - virtual void OutputCustomRules(std::ostream&); - virtual void OutputMakeVariables(std::ostream&); - virtual void OutputMakeRules(std::ostream&); - virtual void OutputInstallRules(std::ostream&); - virtual void OutputSourceObjectBuildRules(std::ostream& fout); - virtual void OutputBuildObjectFromSource(std::ostream& fout, - const char* shortName, - const cmSourceFile& source, - const char* extraCompileFlags, - bool sharedTarget); - - virtual void BuildInSubDirectory(std::ostream& fout, - const char* directory, - const char* target1, - const char* target2, - bool silent = false); - - virtual void OutputSubDirectoryVars(std::ostream& fout, - const char* var, - const char* target, - const char* target1, - const char* target2, - const char* depend, - const std::vector<std::string>& - SubDirectories, - bool silent = false); - - virtual void OutputMakeRule(std::ostream&, - const char* comment, - const char* target, - const char* depends, - const char* command, - const char* command2 = 0, - const char* command3 = 0, - const char* command4 = 0); - virtual void OutputBuildTargetInDir(std::ostream& fout, - const char* path, - const char* library, - const char* fullpath, - const char* outputPath); - ///! return true if the two paths are the same - virtual bool SamePath(const char* path1, const char* path2); - virtual std::string GetOutputExtension(const char* sourceExtension); - virtual void OutputIncludeMakefile(std::ostream&, const char* file); - void SetObjectFileExtension(const char* e) { m_ObjectFileExtension = e;} - void SetExecutableExtension(const char* e) { m_ExecutableExtension = e;} - void SetStaticLibraryExtension(const char* e) {m_StaticLibraryExtension = e;} - void SetSharedLibraryExtension(const char* e) {m_SharedLibraryExtension = e;} - void SetLibraryPrefix(const char* e) { m_LibraryPrefix = e;} - // convert a path to an output path for unix this will call - // ConvertToUnixOutputPath - virtual std::string ConvertToOutputPath(const char* s) - { return cmSystemTools::ConvertToOutputPath(s); } - std::string CreateTargetRules(const cmTarget &target, - const char* targetName); - virtual std::string CreateMakeVariable(const char* s, const char* s2) - { - return std::string(s) + std::string(s2); - } - - ///! if the OS is case insensitive then return a lower case of the path. - virtual std::string LowerCasePath(const char* path) - { - return std::string(path); - } - - /** - * Try running cmake and building a file. This is used for dynalically - * loaded commands, not as part of the usual build process. For the - * generator, it can assume that cmake has been run on the srcdir/bindir - * and it just needs to be compiled. - */ - virtual int TryCompile(const char *srcdir, const char *bindir, - const char *projectName); - -protected: - std::string m_ExecutableOutputPath; - std::string m_LibraryOutputPath; - std::string m_SharedLibraryExtension; - std::string m_ObjectFileExtension; - std::string m_ExecutableExtension; - std::string m_StaticLibraryExtension; - std::string m_LibraryPrefix; -private: - bool m_CacheOnly; - bool m_Recurse; -}; - -#endif |