Sfoglia il codice sorgente

Add a way to print the origins of used include directories.

Stephen Kelly 13 anni fa
parent
commit
0941d6232a

+ 9 - 0
Source/cmDocumentVariables.cxx

@@ -896,6 +896,15 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
       " script, it may get fatal error messages from the script.",false,
       "Variables That Change Behavior");
 
+  cm->DefineProperty
+    ("CMAKE_DEBUG_TARGET_PROPERTIES", cmProperty::VARIABLE,
+     "Enables tracing output for target properties.",
+     "This variable can be populated with a list of properties to generate "
+     "debug output for when evaluating target properties.  Currently it can "
+     "only be used when evaluating the INCLUDE_DIRECTORIES target property.  "
+     "In that case, it outputs a backtrace for each include directory in "
+     "the build.  Default is unset.",false,"Variables That Change Behavior");
+
   // Variables defined by CMake that describe the system
 
   cm->DefineProperty

+ 5 - 0
Source/cmGeneratorExpression.h

@@ -83,6 +83,11 @@ public:
     return this->Input;
   }
 
+  cmListFileBacktrace GetBacktrace() const
+  {
+    return this->Backtrace;
+  }
+
 private:
   cmCompiledGeneratorExpression(cmListFileBacktrace const& backtrace,
               const char *input);

+ 27 - 0
Source/cmTarget.cxx

@@ -2485,6 +2485,7 @@ void cmTarget::SetProperty(const char* prop, const char* value)
   if(strcmp(prop,"INCLUDE_DIRECTORIES") == 0)
     {
     cmListFileBacktrace lfbt;
+    this->Makefile->GetBacktrace(lfbt);
     cmGeneratorExpression ge(lfbt);
     deleteAndClear(this->Internal->IncludeDirectoriesEntries);
     cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(value);
@@ -2507,6 +2508,7 @@ void cmTarget::AppendProperty(const char* prop, const char* value,
   if(strcmp(prop,"INCLUDE_DIRECTORIES") == 0)
     {
     cmListFileBacktrace lfbt;
+    this->Makefile->GetBacktrace(lfbt);
     cmGeneratorExpression ge(lfbt);
     this->Internal->IncludeDirectoriesEntries.push_back(
               new cmTargetInternals::IncludeDirectoriesEntry(ge.Parse(value)));
@@ -2541,6 +2543,20 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
                                               this->GetName(),
                                               "INCLUDE_DIRECTORIES", 0, 0);
 
+
+  std::vector<std::string> debugProperties;
+  const char *debugProp =
+              this->Makefile->GetDefinition("CMAKE_DEBUG_TARGET_PROPERTIES");
+  if (debugProp)
+    {
+    cmSystemTools::ExpandListArgument(debugProp, debugProperties);
+    }
+
+  bool debugIncludes = std::find(debugProperties.begin(),
+                                 debugProperties.end(),
+                                 "INCLUDE_DIRECTORIES")
+                        != debugProperties.end();
+
   for (std::vector<cmTargetInternals::IncludeDirectoriesEntry*>::const_iterator
       it = this->Internal->IncludeDirectoriesEntries.begin(),
       end = this->Internal->IncludeDirectoriesEntries.end();
@@ -2553,6 +2569,7 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
                                               this,
                                               &dagChecker),
                                     entryIncludes);
+    std::string usedIncludes;
     for(std::vector<std::string>::const_iterator
           li = entryIncludes.begin(); li != entryIncludes.end(); ++li)
       {
@@ -2565,8 +2582,18 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
       if(uniqueIncludes.insert(inc).second)
         {
         includes.push_back(*li);
+        if (debugIncludes)
+          {
+          usedIncludes += " * " + *li + "\n";
+          }
         }
       }
+    if (!usedIncludes.empty())
+      {
+      this->Makefile->GetCMakeInstance()->IssueMessage(cmake::LOG,
+                            "Used includes:\n" + usedIncludes,
+                            (*it)->ge->GetBacktrace());
+      }
     }
   return includes;
 }

+ 1 - 0
Tests/RunCMake/include_directories/DebugIncludes-result.txt

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

+ 42 - 0
Tests/RunCMake/include_directories/DebugIncludes-stderr.txt

@@ -0,0 +1,42 @@
+CMake Warning at DebugIncludes.cmake:8 \(include_directories\):
+  Used includes:
+
+   \* .*/Tests/RunCMake/include_directories/one
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
++
+CMake Warning at DebugIncludes.cmake:8 \(include_directories\):
+  Used includes:
+
+   \* .*/Tests/RunCMake/include_directories/two
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
++
+CMake Warning at DebugIncludes.cmake:13 \(set_property\):
+  Used includes:
+
+   \* .*/Tests/RunCMake/include_directories/three
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
++
+CMake Warning at DebugIncludes.cmake:18 \(include_directories\):
+  Used includes:
+
+   \* .*/Tests/RunCMake/include_directories/four
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
++
+CMake Warning at DebugIncludes.cmake:25 \(set_property\):
+  Used includes:
+
+   \* .*/Tests/RunCMake/include_directories/five
+   \* .*/Tests/RunCMake/include_directories/six
+
+Call Stack \(most recent call first\):
+  DebugIncludes.cmake:35 \(some_macro\)
+  DebugIncludes.cmake:38 \(some_function\)
+  CMakeLists.txt:3 \(include\)

+ 38 - 0
Tests/RunCMake/include_directories/DebugIncludes.cmake

@@ -0,0 +1,38 @@
+
+project(DebugIncludes)
+
+set(CMAKE_DEBUG_TARGET_PROPERTIES INCLUDE_DIRECTORIES)
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/DebugIncludes.cpp" "enum { dummy };\n")
+
+include_directories(
+  "${CMAKE_CURRENT_SOURCE_DIR}/one"
+  "${CMAKE_CURRENT_SOURCE_DIR}/two"
+)
+
+set_property(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES
+                          "${CMAKE_CURRENT_SOURCE_DIR}/three")
+
+add_library(lll "${CMAKE_CURRENT_BINARY_DIR}/DebugIncludes.cpp")
+
+include_directories(
+  "${CMAKE_CURRENT_SOURCE_DIR}/two"
+  "${CMAKE_CURRENT_SOURCE_DIR}/three"
+  "${CMAKE_CURRENT_SOURCE_DIR}/four"
+)
+
+macro(some_macro)
+  set_property(TARGET lll APPEND PROPERTY
+      INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/one"
+                          "${CMAKE_CURRENT_SOURCE_DIR}/three"
+                          "${CMAKE_CURRENT_SOURCE_DIR}/four"
+                          "${CMAKE_CURRENT_SOURCE_DIR}/five"
+                          "${CMAKE_CURRENT_SOURCE_DIR}/six"
+  )
+endmacro()
+
+function(some_function)
+  some_macro()
+endfunction()
+
+some_function()

+ 1 - 0
Tests/RunCMake/include_directories/RunCMakeTest.cmake

@@ -1,3 +1,4 @@
 include(RunCMake)
 
 run_cmake(NotFoundContent)
+run_cmake(DebugIncludes)