BUG: Fixes for NMake.

This commit is contained in:
Brad King 2004-10-29 13:55:17 -04:00
parent 6b3ca003d7
commit 17b1cc26e0
1 changed files with 45 additions and 29 deletions

View File

@ -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);
} }
@ -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;