Просмотр исходного кода

Merge topic 'toolchain-include_directories'

588fa1bb9e Restore support for include_directories() in toolchain files

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3140
Brad King 6 лет назад
Родитель
Сommit
8494bc2713

+ 1 - 0
Modules/CMakeDetermineCompilerABI.cmake

@@ -51,6 +51,7 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
       OUTPUT_VARIABLE OUTPUT
       COPY_FILE "${BIN}"
       COPY_FILE_ERROR _copy_error
+      __CMAKE_INTERNAL ABI
       )
 
     # Restore original LC_ALL, LC_MESSAGES, and LANG

+ 16 - 1
Source/cmCoreTryCompile.cxx

@@ -123,6 +123,7 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
   std::string targetName;
   std::vector<std::string> cmakeFlags(1, "CMAKE_FLAGS"); // fake argv[0]
   std::vector<std::string> compileDefs;
+  std::string cmakeInternal;
   std::string outputVariable;
   std::string copyFile;
   std::string copyFileError;
@@ -174,7 +175,8 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
     DoingCExtensions,
     DoingCxxExtensions,
     DoingCudaExtensions,
-    DoingSources
+    DoingSources,
+    DoingCMakeInternal
   };
   Doing doing = useSources ? DoingSources : DoingNone;
   for (size_t i = 3; i < argv.size(); ++i) {
@@ -223,6 +225,8 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
     } else if (argv[i] == "CUDA_EXTENSIONS") {
       doing = DoingCudaExtensions;
       didCudaExtensions = true;
+    } else if (argv[i] == "__CMAKE_INTERNAL") {
+      doing = DoingCMakeInternal;
     } else if (doing == DoingCMakeFlags) {
       cmakeFlags.push_back(argv[i]);
     } else if (doing == DoingCompileDefinitions) {
@@ -296,6 +300,9 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
       doing = DoingNone;
     } else if (doing == DoingSources) {
       sources.push_back(argv[i]);
+    } else if (doing == DoingCMakeInternal) {
+      cmakeInternal = argv[i];
+      doing = DoingNone;
     } else if (i == 3) {
       this->SrcFileSignature = false;
       projectName = argv[i].c_str();
@@ -508,6 +515,14 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
       }
     }
     fprintf(fout, "project(CMAKE_TRY_COMPILE%s)\n", projectLangs.c_str());
+    if (cmakeInternal == "ABI") {
+      // This is the ABI detection step, also used for implicit includes.
+      // Erase any include_directories() calls from the toolchain file so
+      // that we do not see them as implicit.  Our ABI detection source
+      // does not include any system headers anyway.
+      fprintf(fout,
+              "set_property(DIRECTORY PROPERTY INCLUDE_DIRECTORIES \"\")\n");
+    }
     fprintf(fout, "set(CMAKE_VERBOSE_MAKEFILE 1)\n");
     for (std::string const& li : testLangs) {
       std::string langFlags = "CMAKE_" + li + "_FLAGS";

+ 1 - 0
Tests/RunCMake/ToolchainFile/IncludeDirectories-toolchain.cmake

@@ -0,0 +1 @@
+include_directories(${CMAKE_CURRENT_LIST_DIR}/IncludeDirectories)

+ 5 - 0
Tests/RunCMake/ToolchainFile/IncludeDirectories.c

@@ -0,0 +1,5 @@
+#include <IncDir.h>
+
+void IncDir(void)
+{
+}

+ 2 - 0
Tests/RunCMake/ToolchainFile/IncludeDirectories.cmake

@@ -0,0 +1,2 @@
+enable_language(C)
+add_library(IncDir STATIC IncludeDirectories.c)

+ 1 - 0
Tests/RunCMake/ToolchainFile/IncludeDirectories/IncDir.h

@@ -0,0 +1 @@
+/* IncDir.h */

+ 8 - 0
Tests/RunCMake/ToolchainFile/RunCMakeTest.cmake

@@ -9,3 +9,11 @@ run_cmake_toolchain(CallEnableLanguage)
 run_cmake_toolchain(CallProject)
 run_cmake_toolchain(FlagsInit)
 run_cmake_toolchain(LinkFlagsInit)
+
+function(run_IncludeDirectories)
+  run_cmake_toolchain(IncludeDirectories)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/IncludeDirectories-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  run_cmake_command(IncludeDirectories-build ${CMAKE_COMMAND} --build . --config Debug)
+endfunction()
+run_IncludeDirectories()