closer to nmake build
This commit is contained in:
parent
669f7e7f07
commit
a8d47b7221
@ -51,6 +51,9 @@ cmNMakeMakefileGenerator::cmNMakeMakefileGenerator()
|
|||||||
{
|
{
|
||||||
this->SetObjectFileExtension(".obj");
|
this->SetObjectFileExtension(".obj");
|
||||||
this->SetExecutableExtension(".exe");
|
this->SetExecutableExtension(".exe");
|
||||||
|
this->SetLibraryPrefix("");
|
||||||
|
this->SetSharedLibraryExtension(".dll");
|
||||||
|
this->SetStaticLibraryExtension(".lib");
|
||||||
}
|
}
|
||||||
|
|
||||||
cmNMakeMakefileGenerator::~cmNMakeMakefileGenerator()
|
cmNMakeMakefileGenerator::~cmNMakeMakefileGenerator()
|
||||||
@ -80,10 +83,17 @@ void cmNMakeMakefileGenerator::OutputMakeVariables(std::ostream& fout)
|
|||||||
"\n"
|
"\n"
|
||||||
"# Path to cmake\n"
|
"# Path to cmake\n"
|
||||||
"CMAKE_COMMAND = ${CMAKE_COMMAND}\n"
|
"CMAKE_COMMAND = ${CMAKE_COMMAND}\n"
|
||||||
"CMAKE_C_COMPILER = @CMAKE_C_COMPILER@\n"
|
"CMAKE_STANDARD_WINDOWS_LIBRARIES = @CMAKE_STANDARD_WINDOWS_LIBRARIES@\n"
|
||||||
"CMAKE_CFLAGS = @CMAKE_C_FLAGS@\n"
|
"CMAKE_C_COMPILER = @CMAKE_C_COMPILER@ \n"
|
||||||
|
"CMAKE_CFLAGS = @CMAKE_CFLAGS@ @BUILD_FLAGS@\n"
|
||||||
"CMAKE_CXX_COMPILER = @CMAKE_CXX_COMPILER@\n"
|
"CMAKE_CXX_COMPILER = @CMAKE_CXX_COMPILER@\n"
|
||||||
"CMAKE_CXXFLAGS = @CMAKE_CXX_FLAGS@\n";
|
"CMAKE_CXXFLAGS = @CMAKE_CXX_FLAGS@ @BUILD_FLAGS@\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()));
|
||||||
std::string replaceVars = variables;
|
std::string replaceVars = variables;
|
||||||
m_Makefile->ExpandVariablesInString(replaceVars);
|
m_Makefile->ExpandVariablesInString(replaceVars);
|
||||||
fout << replaceVars.c_str();
|
fout << replaceVars.c_str();
|
||||||
@ -122,7 +132,9 @@ void cmNMakeMakefileGenerator::BuildInSubDirectory(std::ostream& fout,
|
|||||||
{
|
{
|
||||||
if(target1)
|
if(target1)
|
||||||
{
|
{
|
||||||
fout << "\tif not exist " << directory << " "
|
std::string dir = directory;
|
||||||
|
cmSystemTools::ConvertToWindowsSlashes(dir);
|
||||||
|
fout << "\tif not exist " << dir.c_str() << " "
|
||||||
<< "$(MAKE) rebuild_cache\n"
|
<< "$(MAKE) rebuild_cache\n"
|
||||||
<< "\tcd \".\\" << directory << "\"\n"
|
<< "\tcd \".\\" << directory << "\"\n"
|
||||||
<< "\t$(MAKE) -$(MAKEFLAGS) " << target1 << "\n";
|
<< "\t$(MAKE) -$(MAKEFLAGS) " << target1 << "\n";
|
||||||
@ -131,6 +143,9 @@ void cmNMakeMakefileGenerator::BuildInSubDirectory(std::ostream& fout,
|
|||||||
{
|
{
|
||||||
fout << "\t$(MAKE) -$(MAKEFLAGS) " << target2 << "\n";
|
fout << "\t$(MAKE) -$(MAKEFLAGS) " << target2 << "\n";
|
||||||
}
|
}
|
||||||
|
std::string currentDir = m_Makefile->GetCurrentOutputDirectory();
|
||||||
|
cmSystemTools::ConvertToWindowsSlashes(currentDir);
|
||||||
|
fout << "\tcd \"" << currentDir.c_str() << "\"\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// This needs to be overriden because nmake requires commands to be quoted
|
// This needs to be overriden because nmake requires commands to be quoted
|
||||||
@ -225,6 +240,15 @@ OutputBuildObjectFromSource(std::ostream& fout,
|
|||||||
compileCommand += " /Fo";
|
compileCommand += " /Fo";
|
||||||
compileCommand += objectFile;
|
compileCommand += objectFile;
|
||||||
}
|
}
|
||||||
|
else if (ext == "rc")
|
||||||
|
{
|
||||||
|
std::cerr << "rc file " << source.GetFullPath() << "\n";
|
||||||
|
}
|
||||||
|
else if (ext == "def")
|
||||||
|
{
|
||||||
|
std::cerr << "def file " << source.GetFullPath() << "\n";
|
||||||
|
}
|
||||||
|
// assume c++ if not c rc or def
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
compileCommand = "$(CMAKE_CXX_COMPILER) $(CMAKE_CXXFLAGS) ";
|
compileCommand = "$(CMAKE_CXX_COMPILER) $(CMAKE_CXXFLAGS) ";
|
||||||
@ -247,30 +271,127 @@ OutputBuildObjectFromSource(std::ostream& fout,
|
|||||||
|
|
||||||
void cmNMakeMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout,
|
void cmNMakeMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout,
|
||||||
const char* name,
|
const char* name,
|
||||||
const cmTarget &target)
|
const cmTarget &t)
|
||||||
{
|
{
|
||||||
cmUnixMakefileGenerator::OutputSharedLibraryRule(fout, name, target);
|
std::string target = m_LibraryOutputPath + name + ".dll";
|
||||||
|
std::string depend = "$(";
|
||||||
|
depend += name;
|
||||||
|
depend += "_SRC_OBJS) $(" + std::string(name) + "_DEPEND_LIBS)";
|
||||||
|
std::string command = "link /dll ";
|
||||||
|
command += "$(" + std::string(name) + "_SRC_OBJS) /out:";
|
||||||
|
command += m_LibraryOutputPath + std::string(name) + ".dll \\\n";
|
||||||
|
std::strstream linklibs;
|
||||||
|
this->OutputLinkLibraries(linklibs, name, t);
|
||||||
|
linklibs << std::ends;
|
||||||
|
command += linklibs.str();
|
||||||
|
delete [] linklibs.str();
|
||||||
|
this->OutputMakeRule(fout, "rules for a shared library",
|
||||||
|
target.c_str(),
|
||||||
|
depend.c_str(),
|
||||||
|
command.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmNMakeMakefileGenerator::OutputModuleLibraryRule(std::ostream& fout,
|
void cmNMakeMakefileGenerator::OutputModuleLibraryRule(std::ostream& fout,
|
||||||
const char* name,
|
const char* name,
|
||||||
const cmTarget &target)
|
const cmTarget &target)
|
||||||
{
|
{
|
||||||
cmUnixMakefileGenerator::OutputModuleLibraryRule(fout, name, target);
|
this->OutputSharedLibraryRule(fout, name, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmNMakeMakefileGenerator::OutputStaticLibraryRule(std::ostream& fout,
|
void cmNMakeMakefileGenerator::OutputStaticLibraryRule(std::ostream& fout,
|
||||||
const char* name,
|
const char* name,
|
||||||
const cmTarget &target)
|
const cmTarget &)
|
||||||
{
|
{
|
||||||
cmUnixMakefileGenerator::OutputStaticLibraryRule(fout, name, target);
|
std::string target = m_LibraryOutputPath + std::string(name) + ".lib";
|
||||||
|
std::string depend = "$(";
|
||||||
|
depend += std::string(name) + "_SRC_OBJS)";
|
||||||
|
std::string command = "link -lib /nologo /out:";
|
||||||
|
command += m_LibraryOutputPath;
|
||||||
|
command += name;
|
||||||
|
command += ".lib $(";
|
||||||
|
command += std::string(name) + "_SRC_OBJS)";
|
||||||
|
std::string comment = "rule to build static library: ";
|
||||||
|
comment += name;
|
||||||
|
this->OutputMakeRule(fout,
|
||||||
|
comment.c_str(),
|
||||||
|
target.c_str(),
|
||||||
|
depend.c_str(),
|
||||||
|
command.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmNMakeMakefileGenerator::OutputExecutableRule(std::ostream& fout,
|
void cmNMakeMakefileGenerator::OutputExecutableRule(std::ostream& fout,
|
||||||
const char* name,
|
const char* name,
|
||||||
const cmTarget &target)
|
const cmTarget &t)
|
||||||
{
|
{
|
||||||
cmUnixMakefileGenerator::OutputExecutableRule(fout, name, target);
|
std::string target = m_ExecutableOutputPath + name;
|
||||||
|
target += ".exe";
|
||||||
|
std::string depend = "$(";
|
||||||
|
depend += std::string(name) + "_SRC_OBJS) $(" + std::string(name) + "_DEPEND_LIBS)";
|
||||||
|
std::string command =
|
||||||
|
"$(CMAKE_CXX_COMPILER) $(CMAKE_CXXFLAGS) ";
|
||||||
|
command += "$(" + std::string(name) + "_SRC_OBJS) ";
|
||||||
|
command += " /Fe" + m_ExecutableOutputPath + name;
|
||||||
|
command += ".exe /link ";
|
||||||
|
std::strstream linklibs;
|
||||||
|
this->OutputLinkLibraries(linklibs, 0, t);
|
||||||
|
linklibs << std::ends;
|
||||||
|
command += linklibs.str();
|
||||||
|
std::string comment = "rule to build executable: ";
|
||||||
|
comment += name;
|
||||||
|
this->OutputMakeRule(fout,
|
||||||
|
comment.c_str(),
|
||||||
|
target.c_str(),
|
||||||
|
depend.c_str(),
|
||||||
|
command.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
std::string linkLibs;
|
||||||
|
std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
|
||||||
|
for(std::vector<std::string>::iterator libDir = libdirs.begin();
|
||||||
|
libDir != libdirs.end(); ++libDir)
|
||||||
|
{
|
||||||
|
std::string libpath = cmSystemTools::EscapeSpaces(libDir->c_str());
|
||||||
|
if(emitted.insert(libpath).second)
|
||||||
|
{
|
||||||
|
linkLibs += "-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;
|
||||||
|
|
||||||
|
// ** 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 it is a full path break it into -L and -l
|
||||||
|
if(emitted.insert(lib->first).second)
|
||||||
|
{
|
||||||
|
linkLibs += lib->first;
|
||||||
|
linkLibs += ".lib ";
|
||||||
|
}
|
||||||
|
linkLibs += librariesLinked;
|
||||||
|
|
||||||
|
fout << linkLibs << "$(CMAKE_STANDARD_WINDOWS_LIBRARIES) ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -95,7 +95,9 @@ protected:
|
|||||||
const cmTarget &);
|
const cmTarget &);
|
||||||
virtual void OutputExecutableRule(std::ostream&, const char* name,
|
virtual void OutputExecutableRule(std::ostream&, const char* name,
|
||||||
const cmTarget &);
|
const cmTarget &);
|
||||||
|
virtual void OutputLinkLibraries(std::ostream& fout,
|
||||||
|
const char* targetLibrary,
|
||||||
|
const cmTarget &tgt);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user