[Cmake-commits] CMake branch, next, updated. v2.8.12-4142-gc213869

Stephen Kelly steveire at gmail.com
Fri Oct 18 11:39:12 EDT 2013


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  c21386901d1b2aa7ef73fe18edc296d6e164b5f5 (commit)
       via  36739a83bee81e83da6e7870616cc3cc6995b722 (commit)
      from  325dc77dc22c56cf1ec1fc62f23e8e64d705ba6c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c21386901d1b2aa7ef73fe18edc296d6e164b5f5
commit c21386901d1b2aa7ef73fe18edc296d6e164b5f5
Merge: 325dc77 36739a8
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Fri Oct 18 11:39:06 2013 -0400
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Fri Oct 18 11:39:06 2013 -0400

    Merge topic 'double-colon-is-imported' into next
    
    36739a8 Consider targets with double colons to be IMPORTED or ALIAS targets.


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=36739a83bee81e83da6e7870616cc3cc6995b722
commit 36739a83bee81e83da6e7870616cc3cc6995b722
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Tue Jul 30 09:51:56 2013 +0200
Commit:     Stephen Kelly <steveire at gmail.com>
CommitDate: Fri Oct 18 17:28:16 2013 +0200

    Consider targets with double colons to be IMPORTED or ALIAS targets.
    
    Introduce a policy to control the behavior.
    
    The AliasTargets unit test already tests that using a
    double-semicolon in the name is not an error. Change the ExportImport
    test to use a namespace with a double-semicolon too.

diff --git a/Help/policy/CMP0028.rst b/Help/policy/CMP0028.rst
new file mode 100644
index 0000000..33a90d6
--- /dev/null
+++ b/Help/policy/CMP0028.rst
@@ -0,0 +1,23 @@
+CMP0028
+-------
+
+Double semicolon in target name means ALIAS or IMPORTED target.
+
+CMake 2.8.12 and lower allowed the use of targets and files with double
+semi-colons in target_link_libraries, with some buildsystem generators.
+
+The use of double-semicolons is a common pattern used to namespace IMPORTED
+targets and ALIAS targets.  When computing the link dependencies of a target,
+the name of each dependency could either be a target, or a file on disk.
+Previously, if a target was not found with a matching name, the name was
+considered to refer to a file on disk.  This can lead to confusing error
+messages if there is a typo in what should be a target name.
+
+The OLD behavior for this policy is to search for targets, then files on disk,
+even if the search term contains double-semicolons.  The NEW behavior for this
+policy is to issue a FATAL_ERROR if a link dependency contains
+double-semicolons but is not an IMPORTED target or an ALIAS target.
+
+This policy was introduced in CMake version 3.0.0.  CMake version
+|release| warns when the policy is not set and uses OLD behavior.  Use
+the cmake_policy command to set it to OLD or NEW explicitly.
diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx
index a2f3f7d..0ee6300 100644
--- a/Source/cmComputeLinkDepends.cxx
+++ b/Source/cmComputeLinkDepends.cxx
@@ -632,6 +632,44 @@ cmTarget* cmComputeLinkDepends::FindTargetToLink(int depender_index,
     }
   cmTarget* tgt = mf->FindTargetToUse(name);
 
+  if(!tgt && std::string(name).find("::") != std::string::npos)
+    {
+    bool noMessage = false;
+    cmake::MessageType messageType = cmake::FATAL_ERROR;
+    cmOStringStream e;
+    switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0028))
+      {
+      case cmPolicies::WARN:
+        {
+        e << (mf->GetPolicies()
+              ->GetPolicyWarning(cmPolicies::CMP0028)) << "\n";
+        messageType = cmake::AUTHOR_WARNING;
+        }
+        break;
+      case cmPolicies::OLD:
+        noMessage = true;
+      case cmPolicies::REQUIRED_IF_USED:
+      case cmPolicies::REQUIRED_ALWAYS:
+      case cmPolicies::NEW:
+        // Issue the fatal message.
+        break;
+      }
+
+    if(!noMessage)
+      {
+      e << "Target \"" << this->Target->GetName() << "\" links to target \""
+        << name << "\" but the target was not found.  Perhaps a "
+        "find_package() call is missing for an IMPORTED target, or a ALIAS "
+        "target is missing?";
+      this->CMakeInstance->IssueMessage(messageType, e.str(),
+                                        this->Target->GetBacktrace());
+      if (messageType == cmake::FATAL_ERROR)
+        {
+        return 0;
+        }
+      }
+    }
+
   // Skip targets that will not really be linked.  This is probably a
   // name conflict between an external library and an executable
   // within the project.
diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx
index ffab8e5..07a5c5e 100644
--- a/Source/cmPolicies.cxx
+++ b/Source/cmPolicies.cxx
@@ -241,6 +241,11 @@ cmPolicies::cmPolicies()
     CMP0027, "CMP0027",
     "Conditionally linked imported targets with missing include directories.",
     3,0,0,0, cmPolicies::WARN);
+
+  this->DefinePolicy(
+    CMP0028, "CMP0028",
+    "Double semicolon in target name means ALIAS or IMPORTED target.",
+    3,0,0,0, cmPolicies::WARN);
 }
 
 cmPolicies::~cmPolicies()
diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h
index 39c2afb..8837248 100644
--- a/Source/cmPolicies.h
+++ b/Source/cmPolicies.h
@@ -79,6 +79,8 @@ public:
     CMP0026, ///< Disallow use of the LOCATION target property.
     CMP0027, ///< Conditionally linked imported targets with missing include
     /// directories.
+    CMP0028, ///< Double semicolon in target name means ALIAS or IMPORTED
+    /// target.
 
     /** \brief Always the last entry.
      *
diff --git a/Tests/ExportImport/Export/Interface/CMakeLists.txt b/Tests/ExportImport/Export/Interface/CMakeLists.txt
index fc9c0c7..b713262 100644
--- a/Tests/ExportImport/Export/Interface/CMakeLists.txt
+++ b/Tests/ExportImport/Export/Interface/CMakeLists.txt
@@ -24,7 +24,7 @@ add_library(sharediface INTERFACE)
 target_link_libraries(sharediface INTERFACE sharedlib)
 
 export(TARGETS sharediface sharedlib headeronly
-  NAMESPACE bld_
+  NAMESPACE bld::
   FILE ../ExportInterfaceBuildTree.cmake
 )
 
@@ -46,4 +46,4 @@ install(FILES
   DESTINATION include/sharedlib
 )
 
-install(EXPORT expInterface NAMESPACE exp_ DESTINATION lib/exp)
+install(EXPORT expInterface NAMESPACE exp:: DESTINATION lib/exp)
diff --git a/Tests/ExportImport/Import/Interface/CMakeLists.txt b/Tests/ExportImport/Import/Interface/CMakeLists.txt
index c7bd13e..e31031c 100644
--- a/Tests/ExportImport/Import/Interface/CMakeLists.txt
+++ b/Tests/ExportImport/Import/Interface/CMakeLists.txt
@@ -10,12 +10,12 @@ set_property(TARGET define_iface PROPERTY
   INTERFACE_COMPILE_DEFINITIONS DEFINE_IFACE_DEFINE)
 
 add_executable(headeronlytest_bld headeronlytest.cpp)
-target_link_libraries(headeronlytest_bld bld_headeronly)
+target_link_libraries(headeronlytest_bld bld::headeronly)
 
-set_property(TARGET bld_sharediface APPEND PROPERTY INTERFACE_LINK_LIBRARIES define_iface)
+set_property(TARGET bld::sharediface APPEND PROPERTY INTERFACE_LINK_LIBRARIES define_iface)
 
 add_executable(interfacetest_bld interfacetest.cpp)
-target_link_libraries(interfacetest_bld bld_sharediface)
+target_link_libraries(interfacetest_bld bld::sharediface)
 
 include(CheckCXXSourceCompiles)
 
@@ -42,14 +42,14 @@ macro(do_try_compile prefix)
   endif()
 endmacro()
 
-do_try_compile(bld_)
+do_try_compile(bld::)
 
 add_executable(headeronlytest_exp headeronlytest.cpp)
-target_link_libraries(headeronlytest_exp exp_headeronly)
+target_link_libraries(headeronlytest_exp exp::headeronly)
 
-set_property(TARGET exp_sharediface APPEND PROPERTY INTERFACE_LINK_LIBRARIES define_iface)
+set_property(TARGET exp::sharediface APPEND PROPERTY INTERFACE_LINK_LIBRARIES define_iface)
 
 add_executable(interfacetest_exp interfacetest.cpp)
-target_link_libraries(interfacetest_exp exp_sharediface)
+target_link_libraries(interfacetest_exp exp::sharediface)
 
-do_try_compile(exp_)
+do_try_compile(exp::)
diff --git a/Tests/RunCMake/CMP0028/CMP0028-NEW-result.txt b/Tests/RunCMake/CMP0028/CMP0028-NEW-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMP0028-NEW-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt
new file mode 100644
index 0000000..a7b0799
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt
@@ -0,0 +1,6 @@
+CMake Error at CMP0028-NEW.cmake:4 \(add_library\):
+  Target "foo" links to target "External::Library" but the target was not
+  found.  Perhaps a find_package\(\) call is missing for an IMPORTED target, or
+  a ALIAS target is missing\?
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/CMP0028/CMP0028-NEW.cmake b/Tests/RunCMake/CMP0028/CMP0028-NEW.cmake
new file mode 100644
index 0000000..a0a6ae8
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMP0028-NEW.cmake
@@ -0,0 +1,5 @@
+
+cmake_policy(SET CMP0028 NEW)
+
+add_library(foo empty.cpp)
+target_link_libraries(foo PRIVATE External::Library)
diff --git a/Tests/RunCMake/CMP0028/CMP0028-OLD-result.txt b/Tests/RunCMake/CMP0028/CMP0028-OLD-result.txt
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMP0028-OLD-result.txt
@@ -0,0 +1 @@
+0
diff --git a/Tests/RunCMake/CMP0028/CMP0028-OLD-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-OLD-stderr.txt
new file mode 100644
index 0000000..10f3293
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMP0028-OLD-stderr.txt
@@ -0,0 +1 @@
+^$
diff --git a/Tests/RunCMake/CMP0028/CMP0028-OLD.cmake b/Tests/RunCMake/CMP0028/CMP0028-OLD.cmake
new file mode 100644
index 0000000..d4a870b
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMP0028-OLD.cmake
@@ -0,0 +1,5 @@
+
+cmake_policy(SET CMP0028 OLD)
+
+add_library(foo empty.cpp)
+target_link_libraries(foo PRIVATE External::Library)
diff --git a/Tests/RunCMake/CMP0028/CMP0028-WARN-result.txt b/Tests/RunCMake/CMP0028/CMP0028-WARN-result.txt
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMP0028-WARN-result.txt
@@ -0,0 +1 @@
+0
diff --git a/Tests/RunCMake/CMP0028/CMP0028-WARN.cmake b/Tests/RunCMake/CMP0028/CMP0028-WARN.cmake
new file mode 100644
index 0000000..70a6cc6
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMP0028-WARN.cmake
@@ -0,0 +1,3 @@
+
+add_library(foo empty.cpp)
+target_link_libraries(foo PRIVATE External::Library)
diff --git a/Tests/RunCMake/CMP0028/CMakeLists.txt b/Tests/RunCMake/CMP0028/CMakeLists.txt
new file mode 100644
index 0000000..f1d9cae
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8.4)
+project(${RunCMake_TEST} CXX)
+include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)
diff --git a/Tests/RunCMake/CMP0028/RunCMakeTest.cmake b/Tests/RunCMake/CMP0028/RunCMakeTest.cmake
new file mode 100644
index 0000000..293e27b
--- /dev/null
+++ b/Tests/RunCMake/CMP0028/RunCMakeTest.cmake
@@ -0,0 +1,5 @@
+include(RunCMake)
+
+run_cmake(CMP0028-NEW)
+run_cmake(CMP0028-OLD)
+run_cmake(CMP0028-WARN)
diff --git a/Tests/RunCMake/CMP0028/empty.cpp b/Tests/RunCMake/CMP0028/empty.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index 52c8667..460732c 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -55,6 +55,7 @@ add_RunCMake_test(CMP0019)
 add_RunCMake_test(CMP0022)
 add_RunCMake_test(CMP0026)
 add_RunCMake_test(CMP0027)
+add_RunCMake_test(CMP0028)
 add_RunCMake_test(CTest)
 if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles")
   add_RunCMake_test(CompilerChange)

-----------------------------------------------------------------------

Summary of changes:
 Help/policy/CMP0028.rst                            |   23 ++++++++++++
 Source/cmComputeLinkDepends.cxx                    |   38 ++++++++++++++++++++
 Source/cmPolicies.cxx                              |    5 +++
 Source/cmPolicies.h                                |    2 +
 Tests/ExportImport/Export/Interface/CMakeLists.txt |    4 +-
 Tests/ExportImport/Import/Interface/CMakeLists.txt |   16 ++++----
 .../CMP0028-NEW-result.txt}                        |    0
 Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt      |    6 +++
 Tests/RunCMake/CMP0028/CMP0028-NEW.cmake           |    5 +++
 .../CMP0028-OLD-result.txt}                        |    0
 .../CMP0028-OLD-stderr.txt}                        |    0
 Tests/RunCMake/CMP0028/CMP0028-OLD.cmake           |    5 +++
 .../CMP0028-WARN-result.txt}                       |    0
 Tests/RunCMake/CMP0028/CMP0028-WARN.cmake          |    3 ++
 Tests/RunCMake/{CMP0027 => CMP0028}/CMakeLists.txt |    2 +-
 Tests/RunCMake/CMP0028/RunCMakeTest.cmake          |    5 +++
 Tests/RunCMake/{CMP0004 => CMP0028}/empty.cpp      |    0
 Tests/RunCMake/CMakeLists.txt                      |    1 +
 18 files changed, 104 insertions(+), 11 deletions(-)
 create mode 100644 Help/policy/CMP0028.rst
 copy Tests/RunCMake/{CMP0004/CMP0004-NEW-result.txt => CMP0028/CMP0028-NEW-result.txt} (100%)
 create mode 100644 Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt
 create mode 100644 Tests/RunCMake/CMP0028/CMP0028-NEW.cmake
 copy Tests/RunCMake/{CMP0022/CMP0022-WARN-empty-old-result.txt => CMP0028/CMP0028-OLD-result.txt} (100%)
 copy Tests/RunCMake/{CMP0022/CMP0022-NOWARN-static-link_libraries-stderr.txt => CMP0028/CMP0028-OLD-stderr.txt} (100%)
 create mode 100644 Tests/RunCMake/CMP0028/CMP0028-OLD.cmake
 copy Tests/RunCMake/{CMP0022/CMP0022-WARN-empty-old-result.txt => CMP0028/CMP0028-WARN-result.txt} (100%)
 create mode 100644 Tests/RunCMake/CMP0028/CMP0028-WARN.cmake
 copy Tests/RunCMake/{CMP0027 => CMP0028}/CMakeLists.txt (73%)
 create mode 100644 Tests/RunCMake/CMP0028/RunCMakeTest.cmake
 copy Tests/RunCMake/{CMP0004 => CMP0028}/empty.cpp (100%)


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list