|
|
@@ -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.
|