Explorar o código

Merge topic 'IMPORTED-target-SYSTEM-includes'

a63fcbc Always consider includes from IMPORTED targets to be SYSTEM.
Brad King %!s(int64=12) %!d(string=hai) anos
pai
achega
4e1368c1a0

+ 8 - 0
Source/cmDocumentVariables.cxx

@@ -1562,6 +1562,14 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
      "See that target property for additional information.",
      false,
      "Variables that Control the Build");
+  cm->DefineProperty
+    ("CMAKE_NO_SYSTEM_FROM_IMPORTED", cmProperty::VARIABLE,
+     "Default value for NO_SYSTEM_FROM_IMPORTED of targets.",
+     "This variable is used to initialize the "
+     "NO_SYSTEM_FROM_IMPORTED property on all the targets.  "
+     "See that target property for additional information.",
+     false,
+     "Variables that Control the Build");
   cm->DefineProperty
     ("CMAKE_<LANG>_VISIBILITY_PRESET", cmProperty::VARIABLE,
      "Default value for <LANG>_VISIBILITY_PRESET of targets.",

+ 31 - 1
Source/cmTarget.cxx

@@ -930,6 +930,17 @@ void cmTarget::DefineProperties(cmake *cm)
      "created.",
      false /* TODO: make this chained */ );
 
+  cm->DefineProperty
+    ("NO_SYSTEM_FROM_IMPORTED", cmProperty::TARGET,
+     "Do not treat includes from IMPORTED target interfaces as SYSTEM.",
+     "The contents of the INTERFACE_INCLUDE_DIRECTORIES of IMPORTED targets "
+     "are treated as SYSTEM includes by default.  If this property is "
+     "enabled, the contents of the INTERFACE_INCLUDE_DIRECTORIES of IMPORTED "
+     "targets are not treated as system includes.  "
+     "This property is initialized by the value of the variable "
+     "CMAKE_NO_SYSTEM_FROM_IMPORTED if it is set when a target is "
+     "created.");
+
   cm->DefineProperty
     ("OSX_ARCHITECTURES", cmProperty::TARGET,
      "Target specific architectures for OS X.",
@@ -1640,6 +1651,7 @@ void cmTarget::SetMakefile(cmMakefile* mf)
   this->SetPropertyDefault("WIN32_EXECUTABLE", 0);
   this->SetPropertyDefault("MACOSX_BUNDLE", 0);
   this->SetPropertyDefault("MACOSX_RPATH", 0);
+  this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
 
 
   // Collect the set of configuration types.
@@ -2673,10 +2685,28 @@ void cmTarget::FinalizeSystemIncludeDirectories()
                                                       ge.Parse(it->Value);
     std::string targetName = cge->Evaluate(this->Makefile, 0,
                                       false, this, 0, 0);
-    if (!this->Makefile->FindTargetToUse(targetName.c_str()))
+    cmTarget *tgt = this->Makefile->FindTargetToUse(targetName.c_str());
+    if (!tgt)
       {
       continue;
       }
+    if (tgt->IsImported()
+        && tgt->GetProperty("INTERFACE_INCLUDE_DIRECTORIES")
+        && !this->GetPropertyAsBool("NO_SYSTEM_FROM_IMPORTED"))
+      {
+      std::string includeGenex = "$<TARGET_PROPERTY:" +
+                                it->Value + ",INTERFACE_INCLUDE_DIRECTORIES>";
+      if (cmGeneratorExpression::Find(it->Value) != std::string::npos)
+        {
+        // Because it->Value is a generator expression, ensure that it
+        // evaluates to the non-empty string before being used in the
+        // TARGET_PROPERTY expression.
+        includeGenex = "$<$<BOOL:" + it->Value + ">:" + includeGenex + ">";
+        }
+      this->SystemIncludeDirectories.insert(includeGenex);
+      return; // The INTERFACE_SYSTEM_INCLUDE_DIRECTORIES are a subset
+              // of the INTERFACE_INCLUDE_DIRECTORIES
+      }
     }
     std::string includeGenex = "$<TARGET_PROPERTY:" +
                         it->Value + ",INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>";

+ 10 - 0
Tests/ExportImport/Export/CMakeLists.txt

@@ -298,6 +298,14 @@ set_property(TARGET cmp0022OLD APPEND PROPERTY LINK_INTERFACE_LIBRARIES testLib3
 
 add_library(noIncludesInterface empty.cpp)
 
+add_library(systemlib SHARED systemlib.cpp)
+install(FILES systemlib.h DESTINATION include/systemlib)
+target_include_directories(systemlib
+  INTERFACE
+    $<INSTALL_INTERFACE:include/systemlib>
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+)
+
 install(TARGETS testLibRequired
         EXPORT RequiredExp DESTINATION lib
         INCLUDES DESTINATION
@@ -366,6 +374,7 @@ install(
   testLib6
   testLibCycleA testLibCycleB
   cmp0022NEW cmp0022OLD
+  systemlib
   EXPORT exp
   RUNTIME DESTINATION bin
   LIBRARY DESTINATION lib NAMELINK_SKIP
@@ -417,6 +426,7 @@ export(TARGETS testExe1 testLib1 testLib2 testLib3
   testSharedLibRequired testSharedLibRequiredUser testSharedLibRequiredUser2
   testSharedLibDepends renamed_on_export
   cmp0022NEW cmp0022OLD
+  systemlib
   NAMESPACE bld_
   FILE ExportBuildTree.cmake
   )

+ 7 - 0
Tests/ExportImport/Export/systemlib.cpp

@@ -0,0 +1,7 @@
+
+#include "systemlib.h"
+
+SystemStruct::SystemStruct()
+{
+
+}

+ 22 - 0
Tests/ExportImport/Export/systemlib.h

@@ -0,0 +1,22 @@
+
+#ifndef SYSTEMLIB_H
+#define SYSTEMLIB_H
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+# define systemlib_EXPORT __declspec(dllexport)
+#else
+# define systemlib_EXPORT
+#endif
+
+struct systemlib_EXPORT SystemStruct
+{
+  SystemStruct();
+
+  void someMethod()
+  {
+    int unused;
+    // unused warning not issued when this header is used as a system header.
+  }
+};
+
+#endif

+ 47 - 0
Tests/ExportImport/Import/A/CMakeLists.txt

@@ -265,3 +265,50 @@ foreach(_config ${_configs})
     )
 endforeach()
 unset(_configs)
+
+if (((CMAKE_C_COMPILER_ID STREQUAL GNU AND CMAKE_C_COMPILER_VERSION VERSION_GREATER 4.4)
+    OR CMAKE_C_COMPILER_ID STREQUAL Clang)
+    AND (CMAKE_GENERATOR STREQUAL "Unix Makefiles" OR CMAKE_GENERATOR STREQUAL "Ninja"))
+  include(CheckCXXCompilerFlag)
+  check_cxx_compiler_flag(-Wunused-variable run_sys_includes_test)
+  if(run_sys_includes_test)
+    # The Bullseye wrapper appears to break the -isystem effect.
+    execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE out ERROR_VARIABLE out)
+    if("x${out}" MATCHES "Bullseye")
+      set(run_sys_includes_test 0)
+    endif()
+  endif()
+  if (run_sys_includes_test)
+    add_executable(test_system_exp test_system.cpp)
+    target_link_libraries(test_system_exp exp_systemlib)
+    target_compile_options(test_system_exp PRIVATE -Wunused-variable -Werror=unused-variable)
+
+    unset(EXP_ERROR_VARIABLE CACHE)
+    try_compile(EXP_ERROR_VARIABLE
+      "${CMAKE_CURRENT_SOURCE_DIR}/test_system"
+      "${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp"
+      COMPILE_DEFINITIONS "-Wunused-variable -Werror=unused-variable"
+      LINK_LIBRARIES exp_systemlib
+      OUTPUT_VARIABLE OUTPUT
+      )
+    if(NOT EXP_ERROR_VARIABLE)
+      message(SEND_ERROR "EXP_ERROR_VARIABLE try_compile failed, but it was expected to succeed ${OUTPUT}.")
+    endif()
+
+    add_executable(test_system_bld test_system.cpp)
+    target_link_libraries(test_system_bld bld_systemlib)
+    target_compile_options(test_system_bld PRIVATE -Wunused-variable -Werror=unused-variable)
+
+    unset(BLD_ERROR_VARIABLE CACHE)
+    try_compile(BLD_ERROR_VARIABLE
+      "${CMAKE_CURRENT_SOURCE_DIR}/test_system"
+      "${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp"
+      COMPILE_DEFINITIONS "-Wunused-variable -Werror=unused-variable"
+      LINK_LIBRARIES bld_systemlib
+      OUTPUT_VARIABLE OUTPUT
+      )
+    if(NOT BLD_ERROR_VARIABLE)
+      message(SEND_ERROR "BLD_ERROR_VARIABLE try_compile failed, but it was expected to succeed.")
+    endif()
+  endif()
+endif()

+ 9 - 0
Tests/ExportImport/Import/A/test_system.cpp

@@ -0,0 +1,9 @@
+
+#include "systemlib.h"
+
+int main()
+{
+  SystemStruct s;
+  (void)s;
+  return 0;
+}