summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-08-19 15:43:51 (GMT)
committerBrad King <brad.king@kitware.com>2008-08-19 15:43:51 (GMT)
commitfe98e57e3825344811e40d30bde1c07ffeeb5696 (patch)
tree5935917ed60f489e002623aa0ef5ce2424515d3d /Source
parent41c5dd13dc2b45007db8d6d781a2655cd4ab7cba (diff)
downloadCMake-fe98e57e3825344811e40d30bde1c07ffeeb5696.zip
CMake-fe98e57e3825344811e40d30bde1c07ffeeb5696.tar.gz
CMake-fe98e57e3825344811e40d30bde1c07ffeeb5696.tar.bz2
ENH: Disallow link-type keywords in link interface
The LINK_INTERFACE_LIBRARIES target property may not contain the "debug", "optimized", or "general" keywords. These keywords are supported only by the target_link_libraries (and link_libraries) command and are not a generic library list feature in CMake. When a user attempts to add one of these keywords to the property value, we now produce an error message that refers users to alternative means.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmSetPropertyCommand.cxx3
-rw-r--r--Source/cmSetTargetPropertiesCommand.cxx1
-rw-r--r--Source/cmTarget.cxx64
-rw-r--r--Source/cmTarget.h1
4 files changed, 69 insertions, 0 deletions
diff --git a/Source/cmSetPropertyCommand.cxx b/Source/cmSetPropertyCommand.cxx
index 21eeaf1..9d00e32 100644
--- a/Source/cmSetPropertyCommand.cxx
+++ b/Source/cmSetPropertyCommand.cxx
@@ -271,6 +271,9 @@ bool cmSetPropertyCommand::HandleTarget(cmTarget* target)
target->SetProperty(name, value);
}
+ // Check the resulting value.
+ target->CheckProperty(name, this->Makefile);
+
return true;
}
diff --git a/Source/cmSetTargetPropertiesCommand.cxx b/Source/cmSetTargetPropertiesCommand.cxx
index 26615dc..895386a 100644
--- a/Source/cmSetTargetPropertiesCommand.cxx
+++ b/Source/cmSetTargetPropertiesCommand.cxx
@@ -103,6 +103,7 @@ bool cmSetTargetPropertiesCommand
{
target->SetProperty(propertyPairs[k].c_str(),
propertyPairs[k+1].c_str());
+ target->CheckProperty(propertyPairs[k].c_str(), mf);
}
}
// if file is not already in the makefile, then add it
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 062ac0b..e4d7307 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -22,6 +22,7 @@
#include "cmGlobalGenerator.h"
#include "cmComputeLinkInformation.h"
#include "cmListFileCache.h"
+#include <cmsys/RegularExpression.hxx>
#include <map>
#include <set>
#include <queue>
@@ -1691,6 +1692,69 @@ void cmTarget::AppendProperty(const char* prop, const char* value)
}
//----------------------------------------------------------------------------
+static void cmTargetCheckLINK_INTERFACE_LIBRARIES(
+ const char* prop, const char* value, cmMakefile* context, bool imported
+ )
+{
+ // Look for link-type keywords in the value.
+ static cmsys::RegularExpression
+ keys("(^|;)(debug|optimized|general)(;|$)");
+ if(!keys.find(value))
+ {
+ return;
+ }
+
+ // Support imported and non-imported versions of the property.
+ const char* base = (imported?
+ "IMPORTED_LINK_INTERFACE_LIBRARIES" :
+ "LINK_INTERFACE_LIBRARIES");
+
+ // Report an error.
+ cmOStringStream e;
+ e << "Property " << prop << " may not contain link-type keyword \""
+ << keys.match(2) << "\". "
+ << "The " << base << " property has a per-configuration "
+ << "version called " << base << "_<CONFIG> which may be "
+ << "used to specify per-configuration rules.";
+ if(!imported)
+ {
+ e << " "
+ << "Alternatively, an IMPORTED library may be created, configured "
+ << "with a per-configuration location, and then named in the "
+ << "property value. "
+ << "See the add_library command's IMPORTED mode for details."
+ << "\n"
+ << "If you have a list of libraries that already contains the "
+ << "keyword, use the target_link_libraries command with its "
+ << "LINK_INTERFACE_LIBRARIES mode to set the property. "
+ << "The command automatically recognizes link-type keywords and sets "
+ << "the LINK_INTERFACE_LIBRARIES and LINK_INTERFACE_LIBRARIES_DEBUG "
+ << "properties accordingly.";
+ }
+ context->IssueMessage(cmake::FATAL_ERROR, e.str());
+}
+
+//----------------------------------------------------------------------------
+void cmTarget::CheckProperty(const char* prop, cmMakefile* context)
+{
+ // Certain properties need checking.
+ if(strncmp(prop, "LINK_INTERFACE_LIBRARIES", 24) == 0)
+ {
+ if(const char* value = this->GetProperty(prop))
+ {
+ cmTargetCheckLINK_INTERFACE_LIBRARIES(prop, value, context, false);
+ }
+ }
+ if(strncmp(prop, "IMPORTED_LINK_INTERFACE_LIBRARIES", 33) == 0)
+ {
+ if(const char* value = this->GetProperty(prop))
+ {
+ cmTargetCheckLINK_INTERFACE_LIBRARIES(prop, value, context, true);
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
void cmTarget::MarkAsImported()
{
this->IsImportedTarget = true;
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 07004be..695d9e8 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -245,6 +245,7 @@ public:
const char *GetProperty(const char *prop);
const char *GetProperty(const char *prop, cmProperty::ScopeType scope);
bool GetPropertyAsBool(const char *prop);
+ void CheckProperty(const char* prop, cmMakefile* context);
bool IsImported() const {return this->IsImportedTarget;}