Browse Source

add_dependencies: Distinguish target v. file dependencies in error (#14050)

When called with a non-existent LHS target name the user may be trying
to add file-level dependencies.  Clarify the error message to explain
the difference between target-level and file-level dependencies.  Point
the reader at the commands and options needed for the latter.
Brad King 13 years ago
parent
commit
de13d68d11

+ 8 - 4
Source/cmAddDependenciesCommand.cxx

@@ -35,10 +35,14 @@ bool cmAddDependenciesCommand
     }
   else
     {
-    std::string error = "Adding dependency to non-existent target: ";
-    error += target_name;
-    this->SetError(error.c_str());
-    return false;
+    cmOStringStream e;
+    e << "Cannot add target-level dependencies to non-existent target \""
+      << target_name << "\".\n"
+      << "The add_dependencies works for top-level logical targets created "
+      << "by the add_executable, add_library, or add_custom_target commands.  "
+      << "If you want to add file-level dependencies see the DEPENDS option "
+      << "of the add_custom_target and add_custom_command commands.";
+    this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
     }
 
   return true;

+ 1 - 0
Tests/RunCMake/CMakeLists.txt

@@ -68,6 +68,7 @@ if(NOT WIN32)
 endif()
 add_RunCMake_test(CompatibleInterface)
 
+add_RunCMake_test(add_dependencies)
 add_RunCMake_test(build_command)
 add_RunCMake_test(find_package)
 add_RunCMake_test(include)

+ 3 - 0
Tests/RunCMake/add_dependencies/CMakeLists.txt

@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)

+ 1 - 0
Tests/RunCMake/add_dependencies/NoTarget-result.txt

@@ -0,0 +1 @@
+1

+ 9 - 0
Tests/RunCMake/add_dependencies/NoTarget-stderr.txt

@@ -0,0 +1,9 @@
+CMake Error at NoTarget.cmake:1 \(add_dependencies\):
+  Cannot add target-level dependencies to non-existent target "foo".
+
+  The add_dependencies works for top-level logical targets created by the
+  add_executable, add_library, or add_custom_target commands.  If you want to
+  add file-level dependencies see the DEPENDS option of the add_custom_target
+  and add_custom_command commands.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/RunCMake/add_dependencies/NoTarget.cmake

@@ -0,0 +1 @@
+add_dependencies(foo bar)

+ 3 - 0
Tests/RunCMake/add_dependencies/RunCMakeTest.cmake

@@ -0,0 +1,3 @@
+include(RunCMake)
+
+run_cmake(NoTarget)