target_link_libraries: Add LINK_(PUBLIC|PRIVATE) options

Makes it possible to specify the link dependencies and link
interfaces in one command without repetition.
This commit is contained in:
Stephen Kelly
2011-10-07 02:41:37 +02:00
committed by Brad King
parent cf64218eeb
commit 914382224d
11 changed files with 191 additions and 11 deletions
+42 -10
View File
@@ -95,8 +95,8 @@ bool cmTargetLinkLibrariesCommand
bool haveLLT = false;
// Start with primary linking and switch to link interface
// specification when the keyword is encountered.
this->DoingInterface = false;
// specification if the keyword is encountered as the first argument.
this->CurrentProcessingState = ProcessingLinkLibraries;
// add libraries, nothe that there is an optional prefix
// of debug and optimized than can be used
@@ -104,7 +104,7 @@ bool cmTargetLinkLibrariesCommand
{
if(args[i] == "LINK_INTERFACE_LIBRARIES")
{
this->DoingInterface = true;
this->CurrentProcessingState = ProcessingLinkInterface;
if(i != 1)
{
this->Makefile->IssueMessage(
@@ -115,6 +115,32 @@ bool cmTargetLinkLibrariesCommand
return true;
}
}
else if(args[i] == "LINK_PUBLIC")
{
if(i != 1 && this->CurrentProcessingState != ProcessingPrivateInterface)
{
this->Makefile->IssueMessage(
cmake::FATAL_ERROR,
"The LINK_PUBLIC or LINK_PRIVATE option must appear as the second "
"argument, just after the target name."
);
return true;
}
this->CurrentProcessingState = ProcessingPublicInterface;
}
else if(args[i] == "LINK_PRIVATE")
{
if(i != 1 && this->CurrentProcessingState != ProcessingPublicInterface)
{
this->Makefile->IssueMessage(
cmake::FATAL_ERROR,
"The LINK_PUBLIC or LINK_PRIVATE option must appear as the second "
"argument, just after the target name."
);
return true;
}
this->CurrentProcessingState = ProcessingPrivateInterface;
}
else if(args[i] == "debug")
{
if(haveLLT)
@@ -186,11 +212,13 @@ bool cmTargetLinkLibrariesCommand
cmSystemTools::SetFatalErrorOccured();
}
// If the INTERFACE option was given, make sure the
// LINK_INTERFACE_LIBRARIES property exists. This allows the
// command to be used to specify an empty link interface.
if(this->DoingInterface &&
!this->Target->GetProperty("LINK_INTERFACE_LIBRARIES"))
// If any of the LINK_ options were given, make sure the
// LINK_INTERFACE_LIBRARIES target property exists.
// Use of any of the new keywords implies awareness of
// this property. And if no libraries are named, it should
// result in an empty link interface.
if((this->CurrentProcessingState != ProcessingLinkLibraries)
&& !this->Target->GetProperty("LINK_INTERFACE_LIBRARIES"))
{
this->Target->SetProperty("LINK_INTERFACE_LIBRARIES", "");
}
@@ -217,11 +245,15 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
cmTarget::LinkLibraryType llt)
{
// Handle normal case first.
if(!this->DoingInterface)
if(this->CurrentProcessingState != ProcessingLinkInterface)
{
this->Makefile
->AddLinkLibraryForTarget(this->Target->GetName(), lib, llt);
return;
if (this->CurrentProcessingState != ProcessingPublicInterface
|| this->CurrentProcessingState == ProcessingPrivateInterface)
{
return;
}
}
// Get the list of configurations considered to be DEBUG.