summaryrefslogtreecommitdiffstats
path: root/Source/cmLocalNMakeMakefileGenerator.cxx
diff options
context:
space:
mode:
authorKen Martin <ken.martin@kitware.com>2002-08-30 20:01:48 (GMT)
committerKen Martin <ken.martin@kitware.com>2002-08-30 20:01:48 (GMT)
commita888ba53faad5027a5f7941971a56a959035505f (patch)
tree5cd39c49f6a5708b55d19a32a7cc01d023cac9c9 /Source/cmLocalNMakeMakefileGenerator.cxx
parent3ffc4b2ee1cabf1815c6b615f43d92aefa9c2597 (diff)
downloadCMake-a888ba53faad5027a5f7941971a56a959035505f.zip
CMake-a888ba53faad5027a5f7941971a56a959035505f.tar.gz
CMake-a888ba53faad5027a5f7941971a56a959035505f.tar.bz2
in progress
Diffstat (limited to 'Source/cmLocalNMakeMakefileGenerator.cxx')
-rw-r--r--Source/cmLocalNMakeMakefileGenerator.cxx707
1 files changed, 707 insertions, 0 deletions
diff --git a/Source/cmLocalNMakeMakefileGenerator.cxx b/Source/cmLocalNMakeMakefileGenerator.cxx
new file mode 100644
index 0000000..4f3cee6
--- /dev/null
+++ b/Source/cmLocalNMakeMakefileGenerator.cxx
@@ -0,0 +1,707 @@
+/*=========================================================================
+
+ 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 "cmLocalNMakeMakefileGenerator.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"
+
+
+cmLocalNMakeMakefileGenerator::cmLocalNMakeMakefileGenerator()
+{
+ 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)");
+}
+
+cmLocalNMakeMakefileGenerator::~cmLocalNMakeMakefileGenerator()
+{
+}
+
+// convert to windows short paths if there are spaces
+// in path
+std::string cmLocalNMakeMakefileGenerator::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 cmSystemTools::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 = cmSystemTools::ConvertToOutputPath(path);
+ return ret;
+ }
+ ret = cmSystemTools::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 cmLocalNMakeMakefileGenerator::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 cmLocalNMakeMakefileGenerator::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" <<
+ cmSystemTools::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" << cmSystemTools::ConvertToOutputPath(i->c_str()).c_str() << " ";
+ }
+
+ fout << m_Makefile->GetDefineFlags();
+ fout << "\n\n";
+}
+
+
+void cmLocalNMakeMakefileGenerator::BuildInSubDirectory(std::ostream& fout,
+ const char* directory,
+ const char* target1,
+ const char* target2,
+ bool silent)
+{
+ if(target1)
+ {
+ std::string dir = cmSystemTools::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 " << cmSystemTools::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 cmLocalNMakeMakefileGenerator::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();
+ }
+
+ cmLocalUnixMakefileGenerator::OutputMakeRule(fout, comment,
+ target, depends,
+ command, command2,
+ command3, command4);
+ return;
+}
+
+void
+cmLocalNMakeMakefileGenerator::
+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 +=
+ cmSystemTools::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 +=
+ cmSystemTools::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 +=
+ cmSystemTools::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(),
+ cmSystemTools::ConvertToOutputPath(
+ source.GetFullPath().c_str()).c_str(),
+ compileCommand.c_str());
+}
+
+void cmLocalNMakeMakefileGenerator::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 += cmSystemTools::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 cmLocalNMakeMakefileGenerator::OutputModuleLibraryRule(std::ostream& fout,
+ const char* name,
+ const cmTarget &target)
+{
+ this->OutputSharedLibraryRule(fout, name, target);
+}
+
+void cmLocalNMakeMakefileGenerator::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 += cmSystemTools::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 cmLocalNMakeMakefileGenerator::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 +
+ cmSystemTools::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 cmLocalNMakeMakefileGenerator::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;
+ cmSystemTools::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 cmLocalNMakeMakefileGenerator::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 cmLocalNMakeMakefileGenerator::OutputIncludeMakefile(std::ostream& fout,
+ const char* file)
+{
+ fout << "!include " << file << "\n";
+}
+
+bool cmLocalNMakeMakefileGenerator::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 cmLocalNMakeMakefileGenerator::OutputBuildTargetInDir(std::ostream& fout,
+ const char* path,
+ const char* library,
+ const char* fullpath,
+ const char* libOutPath)
+{
+ const char* makeTarget = library;
+ std::string currentDir =
+ cmSystemTools::ConvertToOutputPath(m_Makefile->GetCurrentOutputDirectory());
+ std::string wpath = cmSystemTools::ConvertToOutputPath(path);
+ std::string wfullpath = cmSystemTools::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 cmLocalNMakeMakefileGenerator::CreateMakeVariable(const char* s, const char* s2)
+{
+ std::string ret= std::string(s) + std::string(s2);
+ cmSystemTools::ReplaceString(ret, "-", "_");
+ return ret;
+}
+
+std::string cmLocalNMakeMakefileGenerator::LowerCasePath(const char* path)
+{
+ return cmSystemTools::LowerCase(path);
+}