BUG: Fixes for NMake.
This commit is contained in:
parent
6b3ca003d7
commit
17b1cc26e0
|
@ -370,6 +370,9 @@ cmLocalUnixMakefileGenerator2
|
||||||
depEcho += " dependencies of ";
|
depEcho += " dependencies of ";
|
||||||
depEcho += obj;
|
depEcho += obj;
|
||||||
depEcho += "...";
|
depEcho += "...";
|
||||||
|
|
||||||
|
// Add a command to call CMake to scan dependencies. CMake will
|
||||||
|
// touch the corresponding depends file after scanning dependencies.
|
||||||
cmOStringStream depCmd;
|
cmOStringStream depCmd;
|
||||||
// TODO: Account for source file properties and directory-level
|
// TODO: Account for source file properties and directory-level
|
||||||
// definitions when scanning for dependencies.
|
// definitions when scanning for dependencies.
|
||||||
|
@ -385,9 +388,8 @@ cmLocalUnixMakefileGenerator2
|
||||||
}
|
}
|
||||||
std::vector<std::string> commands;
|
std::vector<std::string> commands;
|
||||||
commands.push_back(depCmd.str());
|
commands.push_back(depCmd.str());
|
||||||
std::string touchCmd = "@touch ";
|
|
||||||
touchCmd += this->ConvertToRelativeOutputPath(depTarget.c_str());
|
// Write the rule.
|
||||||
commands.push_back(touchCmd);
|
|
||||||
this->WriteMakeRule(ruleFileStream, 0, depEcho.c_str(),
|
this->WriteMakeRule(ruleFileStream, 0, depEcho.c_str(),
|
||||||
depTarget.c_str(), depends, commands);
|
depTarget.c_str(), depends, commands);
|
||||||
}
|
}
|
||||||
|
@ -589,9 +591,9 @@ cmLocalUnixMakefileGenerator2
|
||||||
makefileStream
|
makefileStream
|
||||||
<< "!IF \"$(OS)\" == \"Windows_NT\"\n"
|
<< "!IF \"$(OS)\" == \"Windows_NT\"\n"
|
||||||
<< "NULL=\n"
|
<< "NULL=\n"
|
||||||
<< "!ELSE \n"
|
<< "!ELSE\n"
|
||||||
<< "NULL=nul\n"
|
<< "NULL=nul\n"
|
||||||
<< "!ENDIF \n";
|
<< "!ENDIF\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -980,7 +982,8 @@ cmLocalUnixMakefileGenerator2
|
||||||
const char* linkLanguage =
|
const char* linkLanguage =
|
||||||
target.GetLinkerLanguage(this->GetGlobalGenerator());
|
target.GetLinkerLanguage(this->GetGlobalGenerator());
|
||||||
|
|
||||||
// Build a list of linker flags.
|
// Build a list of compiler flags and linker flags.
|
||||||
|
std::string flags;
|
||||||
std::string linkFlags;
|
std::string linkFlags;
|
||||||
|
|
||||||
// Add flags to create an executable.
|
// Add flags to create an executable.
|
||||||
|
@ -997,14 +1000,14 @@ cmLocalUnixMakefileGenerator2
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add language-specific flags.
|
// Add language-specific flags.
|
||||||
this->AddLanguageFlags(linkFlags, linkLanguage);
|
this->AddLanguageFlags(flags, linkLanguage);
|
||||||
|
|
||||||
// Add flags to deal with shared libraries. Any library being
|
// Add flags to deal with shared libraries. Any library being
|
||||||
// linked in might be shared, so always use shared flags for an
|
// linked in might be shared, so always use shared flags for an
|
||||||
// executable.
|
// executable.
|
||||||
this->AddSharedFlags(linkFlags, linkLanguage, true);
|
this->AddSharedFlags(flags, linkLanguage, true);
|
||||||
|
|
||||||
// Add target-specific flags.
|
// Add target-specific linker flags.
|
||||||
this->AppendFlags(linkFlags, target.GetProperty("LINK_FLAGS"));
|
this->AppendFlags(linkFlags, target.GetProperty("LINK_FLAGS"));
|
||||||
|
|
||||||
// TODO: Pre-build and pre-link rules.
|
// TODO: Pre-build and pre-link rules.
|
||||||
|
@ -1051,7 +1054,7 @@ cmLocalUnixMakefileGenerator2
|
||||||
linklibs.str().c_str(),
|
linklibs.str().c_str(),
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
/*flags.c_str() why?*/ "",
|
flags.c_str(),
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -1603,29 +1606,34 @@ cmLocalUnixMakefileGenerator2
|
||||||
jump = m_JumpAndBuild.begin(); jump != m_JumpAndBuild.end(); ++jump)
|
jump = m_JumpAndBuild.begin(); jump != m_JumpAndBuild.end(); ++jump)
|
||||||
{
|
{
|
||||||
const cmLocalUnixMakefileGenerator2::RemoteTarget& rt = jump->second;
|
const cmLocalUnixMakefileGenerator2::RemoteTarget& rt = jump->second;
|
||||||
const char* dest = rt.m_BuildDirectory.c_str();
|
const char* destination = rt.m_BuildDirectory.c_str();
|
||||||
commands.clear();
|
|
||||||
|
|
||||||
|
// Construct the dependency and build target names.
|
||||||
|
std::string dep = jump->first;
|
||||||
|
dep += ".dir/";
|
||||||
|
dep += jump->first;
|
||||||
|
dep += ".depends";
|
||||||
|
std::string tgt = jump->first;
|
||||||
|
tgt += ".requires";
|
||||||
|
|
||||||
|
// Build the jump-and-build command list.
|
||||||
|
commands.clear();
|
||||||
if(m_WindowsShell)
|
if(m_WindowsShell)
|
||||||
{
|
{
|
||||||
// On Windows we must perform each step separately and then jump
|
// On Windows we must perform each step separately and then jump
|
||||||
// back because the shell keeps the working directory between
|
// back because the shell keeps the working directory between
|
||||||
// commands.
|
// commands.
|
||||||
std::string cmd = "cd ";
|
std::string cmd = "cd ";
|
||||||
cmd += this->ConvertToOutputForExisting(dest);
|
cmd += this->ConvertToOutputForExisting(destination);
|
||||||
commands.push_back(cmd);
|
commands.push_back(cmd);
|
||||||
|
|
||||||
// Check the build system in destination directory.
|
// Check the build system in destination directory.
|
||||||
commands.push_back(this->GetRecursiveMakeCall("cmake_check_rerun"));
|
commands.push_back(this->GetRecursiveMakeCall("cmake_check_rerun"));
|
||||||
|
|
||||||
// Build the targets's dependencies.
|
// Build the targets's dependencies.
|
||||||
std::string dep = jump->first;
|
|
||||||
dep += ".depends";
|
|
||||||
commands.push_back(this->GetRecursiveMakeCall(dep.c_str()));
|
commands.push_back(this->GetRecursiveMakeCall(dep.c_str()));
|
||||||
|
|
||||||
// Build the target.
|
// Build the target.
|
||||||
std::string tgt = jump->first;
|
|
||||||
tgt += ".requires";
|
|
||||||
commands.push_back(this->GetRecursiveMakeCall(tgt.c_str()));
|
commands.push_back(this->GetRecursiveMakeCall(tgt.c_str()));
|
||||||
|
|
||||||
// Jump back to the starting directory.
|
// Jump back to the starting directory.
|
||||||
|
@ -1638,23 +1646,17 @@ cmLocalUnixMakefileGenerator2
|
||||||
// On UNIX we must construct a single shell command to jump and
|
// On UNIX we must construct a single shell command to jump and
|
||||||
// build because make resets the directory between each command.
|
// build because make resets the directory between each command.
|
||||||
std::string cmd = "cd ";
|
std::string cmd = "cd ";
|
||||||
cmd += this->ConvertToOutputForExisting(dest);
|
cmd += this->ConvertToOutputForExisting(destination);
|
||||||
|
|
||||||
// Check the build system in destination directory.
|
// Check the build system in destination directory.
|
||||||
cmd += " && ";
|
cmd += " && ";
|
||||||
cmd += this->GetRecursiveMakeCall("cmake_check_rerun");
|
cmd += this->GetRecursiveMakeCall("cmake_check_rerun");
|
||||||
|
|
||||||
// Build the targets's dependencies.
|
// Build the targets's dependencies.
|
||||||
std::string dep = jump->first;
|
|
||||||
dep += ".dir/";
|
|
||||||
dep += jump->first;
|
|
||||||
dep += ".depends";
|
|
||||||
cmd += " && ";
|
cmd += " && ";
|
||||||
cmd += this->GetRecursiveMakeCall(dep.c_str());
|
cmd += this->GetRecursiveMakeCall(dep.c_str());
|
||||||
|
|
||||||
// Build the target.
|
// Build the target.
|
||||||
std::string tgt = jump->first;
|
|
||||||
tgt += ".requires";
|
|
||||||
cmd += " && ";
|
cmd += " && ";
|
||||||
cmd += this->GetRecursiveMakeCall(tgt.c_str());
|
cmd += this->GetRecursiveMakeCall(tgt.c_str());
|
||||||
|
|
||||||
|
@ -1786,8 +1788,8 @@ cmLocalUnixMakefileGenerator2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scan the file if it has not been scanned already.
|
// Scan the file if it was found and has not been scanned already.
|
||||||
if(scanned.find(fullName) == scanned.end())
|
if(fullName.size() && (scanned.find(fullName) == scanned.end()))
|
||||||
{
|
{
|
||||||
// Record scanned files.
|
// Record scanned files.
|
||||||
scanned.insert(fullName);
|
scanned.insert(fullName);
|
||||||
|
@ -1808,21 +1810,35 @@ cmLocalUnixMakefileGenerator2
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the dependencies to the output file.
|
// Write the dependencies to the output file.
|
||||||
|
std::string depMarkFile = objFile;
|
||||||
std::string depMakeFile = objFile;
|
std::string depMakeFile = objFile;
|
||||||
|
depMarkFile += ".depends";
|
||||||
depMakeFile += ".depends.make";
|
depMakeFile += ".depends.make";
|
||||||
std::ofstream fout(depMakeFile.c_str());
|
std::ofstream fout(depMakeFile.c_str());
|
||||||
fout << "# Dependencies for " << objFile << std::endl;
|
fout << "# Dependencies for " << objFile << std::endl;
|
||||||
for(std::set<cmStdString>::iterator i=dependencies.begin();
|
for(std::set<cmStdString>::iterator i=dependencies.begin();
|
||||||
i != dependencies.end(); ++i)
|
i != dependencies.end(); ++i)
|
||||||
{
|
{
|
||||||
fout << objFile << " : " << i->c_str() << std::endl;
|
fout << objFile << ": "
|
||||||
|
<< cmSystemTools::ConvertToOutputPath(i->c_str()).c_str()
|
||||||
|
<< std::endl;
|
||||||
}
|
}
|
||||||
fout << std::endl;
|
fout << std::endl;
|
||||||
fout << "# Dependencies for " << objFile << ".depends" << std::endl;
|
fout << "# Dependencies for " << depMarkFile.c_str() << std::endl;
|
||||||
for(std::set<cmStdString>::iterator i=dependencies.begin();
|
for(std::set<cmStdString>::iterator i=dependencies.begin();
|
||||||
i != dependencies.end(); ++i)
|
i != dependencies.end(); ++i)
|
||||||
{
|
{
|
||||||
fout << objFile << ".depends : " << i->c_str() << std::endl;
|
fout << depMarkFile.c_str() << ": "
|
||||||
|
<< cmSystemTools::ConvertToOutputPath(i->c_str()).c_str()
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we could write the dependencies, touch the corresponding
|
||||||
|
// depends file to mark dependencies up to date.
|
||||||
|
if(fout)
|
||||||
|
{
|
||||||
|
std::ofstream fmark(depMarkFile.c_str());
|
||||||
|
fmark << "Dependencies updated for " << objFile << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue