ENH: Added warning when an install rule is created from an EXCLUDE_FROM_ALL target. Added a foo/preinstall version of targets that need relinking so that exclude-from-all targets can be manually relinked for installation.

This commit is contained in:
Brad King 2007-08-03 16:31:08 -04:00
parent d7118006de
commit bffcff4530
5 changed files with 58 additions and 6 deletions

View File

@ -539,7 +539,7 @@ cmGlobalUnixMakefileGenerator3
this->WriteDirectoryRule2(ruleFileStream, lg, "clean", false, false); this->WriteDirectoryRule2(ruleFileStream, lg, "clean", false, false);
// Write directory-level rules for "preinstall". // Write directory-level rules for "preinstall".
this->WriteDirectoryRule2(ruleFileStream, lg, "preinstall", false, true); this->WriteDirectoryRule2(ruleFileStream, lg, "preinstall", true, true);
} }
@ -677,6 +677,23 @@ cmGlobalUnixMakefileGenerator3
(makefileName.c_str(), makeTargetName.c_str())); (makefileName.c_str(), makeTargetName.c_str()));
lg->WriteMakeRule(ruleFileStream, "fast build rule for target.", lg->WriteMakeRule(ruleFileStream, "fast build rule for target.",
localName.c_str(), depends, commands, true); localName.c_str(), depends, commands, true);
// Add a local name for the rule to relink the target before
// installation.
if(t->second.NeedRelinkBeforeInstall())
{
makeTargetName = lg->GetRelativeTargetDirectory(t->second);
makeTargetName += "/preinstall";
localName = t->second.GetName();
localName += "/preinstall";
depends.clear();
commands.clear();
commands.push_back(lg->GetRecursiveMakeCall
(makefileName.c_str(), makeTargetName.c_str()));
lg->WriteMakeRule(ruleFileStream,
"Manual pre-install relink rule for target.",
localName.c_str(), depends, commands, true);
}
} }
} }
} }

View File

@ -144,6 +144,9 @@ public:
"On non-DLL platforms mySharedLib will be installed to <prefix>/lib " "On non-DLL platforms mySharedLib will be installed to <prefix>/lib "
"and /some/full/path." "and /some/full/path."
"\n" "\n"
"Installing a target with EXCLUDE_FROM_ALL set to true has "
"undefined behavior."
"\n"
"The FILES signature:\n" "The FILES signature:\n"
" INSTALL(FILES files... DESTINATION <dir>\n" " INSTALL(FILES files... DESTINATION <dir>\n"
" [PERMISSIONS permissions...]\n" " [PERMISSIONS permissions...]\n"

View File

@ -45,6 +45,17 @@ cmInstallTargetGenerator
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmInstallTargetGenerator::GenerateScript(std::ostream& os) void cmInstallTargetGenerator::GenerateScript(std::ostream& os)
{ {
// Warn if installing an exclude-from-all target.
if(this->Target->GetPropertyAsBool("EXCLUDE_FROM_ALL"))
{
cmOStringStream msg;
msg << "WARNING: Target \"" << this->Target->GetName()
<< "\" has EXCLUDE_FROM_ALL set and will not be built by default "
<< "but an install rule has been provided for it. CMake does "
<< "not define behavior for this case.";
cmSystemTools::Message(msg.str().c_str(), "Warning");
}
// Track indentation. // Track indentation.
Indent indent; Indent indent;

View File

@ -353,10 +353,10 @@ void cmLocalUnixMakefileGenerator3
depends.clear(); depends.clear();
// Build the target for this pass. // Build the target for this pass.
std::string tmp = cmake::GetCMakeFilesDirectoryPostSlash(); std::string makefile2 = cmake::GetCMakeFilesDirectoryPostSlash();
tmp += "Makefile2"; makefile2 += "Makefile2";
commands.push_back(this->GetRecursiveMakeCall commands.push_back(this->GetRecursiveMakeCall
(tmp.c_str(),localName.c_str())); (makefile2.c_str(),localName.c_str()));
this->CreateCDCommand(commands, this->CreateCDCommand(commands,
this->Makefile->GetHomeOutputDirectory(), this->Makefile->GetHomeOutputDirectory(),
this->Makefile->GetStartOutputDirectory()); this->Makefile->GetStartOutputDirectory());
@ -390,6 +390,26 @@ void cmLocalUnixMakefileGenerator3
this->Makefile->GetStartOutputDirectory()); this->Makefile->GetStartOutputDirectory());
this->WriteMakeRule(ruleFileStream, "fast build rule for target.", this->WriteMakeRule(ruleFileStream, "fast build rule for target.",
localName.c_str(), depends, commands, true); localName.c_str(), depends, commands, true);
// Add a local name for the rule to relink the target before
// installation.
if(t->second.NeedRelinkBeforeInstall())
{
makeTargetName = this->GetRelativeTargetDirectory(t->second);
makeTargetName += "/preinstall";
localName = t->second.GetName();
localName += "/preinstall";
depends.clear();
commands.clear();
commands.push_back(this->GetRecursiveMakeCall
(makefile2.c_str(), makeTargetName.c_str()));
this->CreateCDCommand(commands,
this->Makefile->GetHomeOutputDirectory(),
this->Makefile->GetStartOutputDirectory());
this->WriteMakeRule(ruleFileStream,
"Manual pre-install relink rule for target.",
localName.c_str(), depends, commands, true);
}
} }
} }
} }

View File

@ -123,8 +123,9 @@ void cmTarget::DefineProperties(cmake *cm)
"A property on a target that indicates if the target is excluded " "A property on a target that indicates if the target is excluded "
"from the default build target. If it is not, then with a Makefile " "from the default build target. If it is not, then with a Makefile "
"for example typing make will cause this target to be built. " "for example typing make will cause this target to be built. "
"The same concept applies to the default build of other generators.", "The same concept applies to the default build of other generators. "
false); "Installing a target with EXCLUDE_FROM_ALL set to true has "
"undefined behavior.");
cm->DefineProperty cm->DefineProperty
("INSTALL_NAME_DIR", cmProperty::TARGET, ("INSTALL_NAME_DIR", cmProperty::TARGET,