BUG: cd into local directory to reduce link line length

This commit is contained in:
Ken Martin 2005-10-19 10:03:20 -04:00
parent 66e50573c1
commit 6b444ee345
2 changed files with 52 additions and 104 deletions

View File

@ -1304,9 +1304,9 @@ cmLocalUnixMakefileGenerator3
// Convert to the output path to use in constructing commands.
std::string targetOutPath =
this->Convert(targetFullPath.c_str(),HOME_OUTPUT,MAKEFILE);
this->Convert(targetFullPath.c_str(),START_OUTPUT,MAKEFILE);
std::string targetOutPathReal =
this->Convert(targetFullPathReal.c_str(),HOME_OUTPUT,MAKEFILE);
this->Convert(targetFullPathReal.c_str(),START_OUTPUT,MAKEFILE);
// Get the language to use for linking this executable.
const char* linkLanguage =
@ -1330,35 +1330,7 @@ cmLocalUnixMakefileGenerator3
// Build a list of compiler flags and linker flags.
std::string flags;
std::string linkFlags;
#if 0
// Loop over all libraries and see if all are shared
const cmTarget::LinkLibraries& tlibs = target.GetLinkLibraries();
int AllShared = 2; // 0 = false, 1 = true, 2 = unknown
for(cmTarget::LinkLibraries::const_iterator lib = tlibs.begin();
lib != tlibs.end(); ++lib)
{
// look up the target if there is one
cmTarget *libtgt = m_GlobalGenerator->FindTarget(0,lib->first.c_str());
if (libtgt)
{
if (libtgt->GetType() != cmTarget::SHARED_LIBRARY)
{
AllShared = 0;
}
else if (AllShared == 2)
{
AllShared = 1;
}
}
}
// if all libs were shared then add the special borland flag for linking an
// executable to only shared libs
if(AllShared == 1)
{
this->AppendFlags
(linkFlags,m_Makefile->GetDefinition("CMAKE_SHARED_BUILD_CXX_FLAGS"));
}
#endif
// Add flags to deal with shared libraries. Any library being
// linked in might be shared, so always use shared flags for an
// executable.
@ -1368,7 +1340,6 @@ cmLocalUnixMakefileGenerator3
this->AddConfigVariableFlags(linkFlags, "CMAKE_EXE_LINKER_FLAGS");
if(target.GetPropertyAsBool("WIN32_EXECUTABLE"))
{
this->AppendFlags(linkFlags,
@ -1415,8 +1386,12 @@ cmLocalUnixMakefileGenerator3
std::string linkRuleVar = "CMAKE_";
linkRuleVar += linkLanguage;
linkRuleVar += "_LINK_EXECUTABLE";
std::string linkRule = m_Makefile->GetRequiredDefinition(linkRuleVar.c_str());
cmSystemTools::ExpandListArgument(linkRule, commands);
std::string linkRule =
m_Makefile->GetRequiredDefinition(linkRuleVar.c_str());
std::vector<std::string> commands1;
cmSystemTools::ExpandListArgument(linkRule, commands1);
this->CreateCDCommand(commands1);
commands.insert(commands.end(), commands1.begin(), commands1.end());
// Add a rule to create necessary symlinks for the library.
if(targetOutPath != targetOutPathReal)
@ -1670,13 +1645,13 @@ cmLocalUnixMakefileGenerator3
// Construct the output path version of the names for use in command
// arguments.
std::string targetOutPath =
this->Convert(targetFullPath.c_str(),HOME_OUTPUT,MAKEFILE);
this->Convert(targetFullPath.c_str(),START_OUTPUT,MAKEFILE);
std::string targetOutPathSO =
this->Convert(targetFullPathSO.c_str(),HOME_OUTPUT,MAKEFILE);
this->Convert(targetFullPathSO.c_str(),START_OUTPUT,MAKEFILE);
std::string targetOutPathReal =
this->Convert(targetFullPathReal.c_str(),HOME_OUTPUT,MAKEFILE);
this->Convert(targetFullPathReal.c_str(),START_OUTPUT,MAKEFILE);
std::string targetOutPathBase =
this->Convert(targetFullPathBase.c_str(),HOME_OUTPUT,MAKEFILE);
this->Convert(targetFullPathBase.c_str(),START_OUTPUT,MAKEFILE);
// Add the link message.
std::string buildEcho = "Linking ";
@ -1743,7 +1718,10 @@ cmLocalUnixMakefileGenerator3
// Construct the main link rule.
std::string linkRule = m_Makefile->GetRequiredDefinition(linkRuleVar);
cmSystemTools::ExpandListArgument(linkRule, commands);
std::vector<std::string> commands1;
cmSystemTools::ExpandListArgument(linkRule, commands1);
this->CreateCDCommand(commands1);
commands.insert(commands.end(), commands1.begin(), commands1.end());
// Add a rule to create necessary symlinks for the library.
if(targetOutPath != targetOutPathReal)
@ -1832,12 +1810,11 @@ cmLocalUnixMakefileGenerator3
ruleFileStream
<< "# Object files for target " << target.GetName() << "\n"
<< variableName.c_str() << " =";
std::string relPath = this->GetHomeRelativeOutputPath();
std::string object;
for(std::vector<std::string>::const_iterator i = objects.begin();
i != objects.end(); ++i)
{
object = relPath;
object.clear();
object += *i;
ruleFileStream
<< " \\\n"
@ -1857,7 +1834,7 @@ cmLocalUnixMakefileGenerator3
for(std::vector<std::string>::const_iterator i = external_objects.begin();
i != external_objects.end(); ++i)
{
object = this->Convert(i->c_str(),HOME_OUTPUT);
object = this->Convert(i->c_str(),START_OUTPUT);
ruleFileStream
<< " \\\n"
<< this->ConvertToQuotedOutputPath(object.c_str());
@ -2340,8 +2317,6 @@ cmLocalUnixMakefileGenerator3
::AppendCustomCommand(std::vector<std::string>& commands,
const cmCustomCommand& cc)
{
// TODO: Convert outputs/dependencies (arguments?) to relative paths.
std::vector<std::string> commands1;
// Add each command line to the set of commands.
@ -2371,44 +2346,10 @@ cmLocalUnixMakefileGenerator3
commands1.push_back(cmd);
}
}
// stick this group of commands into a cd of the proper path
// Build the jump-and-build command list.
if(m_WindowsShell)
{
// On Windows we must perform each step separately and then jump
// back because the shell keeps the working directory between
// commands.
std::string cmd = "cd ";
cmd += this->ConvertToOutputForExisting(m_Makefile->GetStartOutputDirectory());
commands.push_back(cmd);
// push back the custom commands
commands.insert(commands.end(), commands1.begin(), commands1.end());
// Jump back to the home directory.
cmd = "cd ";
cmd += this->ConvertToOutputForExisting(m_Makefile->GetHomeOutputDirectory());
commands.push_back(cmd);
}
else
{
// On UNIX we must construct a single shell command to jump and
// build because make resets the directory between each command.
std::string cmd = "cd ";
cmd += this->ConvertToOutputForExisting(m_Makefile->GetStartOutputDirectory());
// add the commands
unsigned int i;
for (i = 0; i < commands1.size(); ++i)
{
cmd += " && ";
cmd += commands1[i];
}
// Add the command as a single line.
commands.push_back(cmd);
}
// push back the custom commands
this->CreateCDCommand(commands1);
commands.insert(commands.end(), commands1.begin(), commands1.end());
}
//----------------------------------------------------------------------------
@ -2990,9 +2931,7 @@ void cmLocalUnixMakefileGenerator3
}
void cmLocalUnixMakefileGenerator3
::CreateJumpCommand(std::vector<std::string>& commands,
const char *MakefileName,
std::string& localName)
::CreateCDCommand(std::vector<std::string>& commands)
{
if(m_WindowsShell)
{
@ -3001,18 +2940,12 @@ void cmLocalUnixMakefileGenerator3
// commands.
std::string cmd = "cd ";
cmd += this->ConvertToOutputForExisting
(m_Makefile->GetHomeOutputDirectory());
commands.push_back(cmd);
// Build the target for this pass.
commands.push_back(this->GetRecursiveMakeCall
(MakefileName,localName.c_str()));
(m_Makefile->GetStartOutputDirectory());
commands.insert(commands.begin(),cmd);
// Change back to the starting directory. Any trailing slash must be
// removed to avoid problems with Borland Make.
std::string back =
cmSystemTools::RelativePath(m_Makefile->GetHomeOutputDirectory(),
m_Makefile->GetStartOutputDirectory());
std::string back = m_Makefile->GetHomeOutputDirectory();
if(back.size() && back[back.size()-1] == '/')
{
back = back.substr(0, back.size()-1);
@ -3026,18 +2959,30 @@ void cmLocalUnixMakefileGenerator3
// On UNIX we must construct a single shell command to change
// directory and build because make resets the directory between
// each command.
std::string cmd = "cd ";
cmd += this->ConvertToOutputForExisting(m_Makefile->GetHomeOutputDirectory());
// Build the target for this pass.
cmd += " && ";
cmd += this->GetRecursiveMakeCall(MakefileName,localName.c_str());
// Add the command as a single line.
commands.push_back(cmd);
std::vector<std::string>::iterator i = commands.begin();
for (; i != commands.end(); ++i)
{
std::string cmd = "cd ";
cmd += this->ConvertToOutputForExisting(m_Makefile->GetStartOutputDirectory());
cmd += " && ";
cmd += *i;
*i = cmd;
}
}
}
void cmLocalUnixMakefileGenerator3
::CreateJumpCommand(std::vector<std::string>& commands,
const char *MakefileName,
std::string& localName)
{
// Build the target for this pass.
commands.push_back(this->GetRecursiveMakeCall
(MakefileName,localName.c_str()));
this->CreateCDCommand(commands);
}
//----------------------------------------------------------------------------
void cmLocalUnixMakefileGenerator3::CheckDependencies(cmMakefile* mf,
bool verbose,

View File

@ -170,8 +170,11 @@ protected:
const char *MakefileName,
std::string & localName);
// these two methods just compute reasonable values for m_LibraryOutputPath and
// m_ExecutableOutputPath
// create a command that cds to the start dir then runs the commands
void CreateCDCommand(std::vector<std::string>& commands);
// these two methods just compute reasonable values for m_LibraryOutputPath
// and m_ExecutableOutputPath
void ConfigureOutputPaths();
void FormatOutputPath(std::string& path, const char* name);