소스 검색

Merge topic 'fbuild_clang_cl'

888e9e1081 FASTBuild: fix CMake build with clang-cl

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !11137
Brad King 1 개월 전
부모
커밋
daf5cc56a0
3개의 변경된 파일20개의 추가작업 그리고 8개의 파일을 삭제
  1. 9 3
      Modules/Platform/Windows-Clang.cmake
  2. 5 4
      Modules/Platform/Windows-MSVC.cmake
  3. 6 1
      Source/cmGlobalFastbuildGenerator.cxx

+ 9 - 3
Modules/Platform/Windows-Clang.cmake

@@ -158,9 +158,15 @@ macro(__enable_llvm_rc_preprocessing clang_option_prefix extra_pp_flags)
     endif()
     if(DEFINED CMAKE_RC_PREPROCESSOR)
       set(CMAKE_DEPFILE_FLAGS_RC "${clang_option_prefix}-MD ${clang_option_prefix}-MF ${clang_option_prefix}<DEP_FILE>")
-      # The <FLAGS> are passed to the preprocess and the resource compiler to pick
-      # up the eventual -D / -C options passed through the CMAKE_RC_FLAGS.
-      set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_COMMAND> -E cmake_llvm_rc <SOURCE> <OBJECT>.pp <${CMAKE_RC_PREPROCESSOR}> <DEFINES> -DRC_INVOKED <INCLUDES> <FLAGS> ${extra_pp_flags} -E -- <SOURCE> ++ <CMAKE_RC_COMPILER> <DEFINES> -I <SOURCE_DIR> <INCLUDES> <FLAGS> /fo <OBJECT> <OBJECT>.pp")
+      # llvm-rc runs preprocessor starting from LLVM-13, so we can run it directly instead of using "cmake_llvm_rc".
+      # See https://reviews.llvm.org/D100755 for more details.
+      if (CMAKE_GENERATOR MATCHES "FASTBuild")
+        set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <DEFINES> -I <SOURCE_DIR> <INCLUDES> <FLAGS> /fo<OBJECT> <SOURCE>")
+      else()
+        # The <FLAGS> are passed to the preprocess and the resource compiler to pick
+        # up the eventual -D / -C options passed through the CMAKE_RC_FLAGS.
+        set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_COMMAND> -E cmake_llvm_rc <SOURCE> <OBJECT>.pp <${CMAKE_RC_PREPROCESSOR}> <DEFINES> -DRC_INVOKED <INCLUDES> <FLAGS> ${extra_pp_flags} -E -- <SOURCE> ++ <CMAKE_RC_COMPILER> <DEFINES> -I <SOURCE_DIR> <INCLUDES> <FLAGS> /fo <OBJECT> <OBJECT>.pp")
+      endif()
       if(CMAKE_GENERATOR MATCHES "Ninja")
         set(CMAKE_NINJA_CMCLDEPS_RC 0)
         set(CMAKE_NINJA_DEP_TYPE_RC gcc)

+ 5 - 4
Modules/Platform/Windows-MSVC.cmake

@@ -434,10 +434,11 @@ macro(__windows_compiler_msvc lang)
     # macOS paths usually start with /Users/*. Unfortunately, clang-cl interprets
     # paths starting with /U as macro undefines, so we need to put a -- before the
     # input file path to force it to be treated as a path.
-    string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_COMPILE_OBJECT "${CMAKE_${lang}_COMPILE_OBJECT}")
-    string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "${CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE}")
-    string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "${CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE}")
-
+    if(NOT CMAKE_GENERATOR MATCHES "FASTBuild")
+      string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_COMPILE_OBJECT "${CMAKE_${lang}_COMPILE_OBJECT}")
+      string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "${CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE}")
+      string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "${CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE}")
+    endif()
   elseif(MSVC_VERSION GREATER_EQUAL 1913)
     # At least MSVC toolet 14.13 from VS 2017 15.6
     set(CMAKE_PCH_PROLOGUE "#pragma system_header")

+ 6 - 1
Source/cmGlobalFastbuildGenerator.cxx

@@ -890,7 +890,7 @@ void cmGlobalFastbuildGenerator::WriteCompilers()
       std::map<std::string, std::string> compilerIdToFastbuildFamily = {
         { "MSVC", "msvc" },        { "Clang", "clang" },
         { "AppleClang", "clang" }, { "GNU", "gcc" },
-        { "NVIDIA", "cuda-nvcc" },
+        { "NVIDIA", "cuda-nvcc" }, { "Clang-cl", "clang-cl" },
       };
       auto ft = compilerIdToFastbuildFamily.find(compilerDef.CmakeCompilerID);
       if (ft != compilerIdToFastbuildFamily.end()) {
@@ -969,6 +969,11 @@ void cmGlobalFastbuildGenerator::AddCompiler(std::string const& language,
   compilerDef.Executable = compilerLocation;
   compilerDef.CmakeCompilerID =
     mf->GetSafeDefinition("CMAKE_" + language + "_COMPILER_ID");
+  if (compilerDef.CmakeCompilerID == "Clang" &&
+      mf->GetSafeDefinition("CMAKE_" + language +
+                            "_COMPILER_FRONTEND_VARIANT") == "MSVC") {
+    compilerDef.CmakeCompilerID = "Clang-cl";
+  }
 
   compilerDef.CmakeCompilerVersion =
     mf->GetSafeDefinition("CMAKE_" + language + "_COMPILER_VERSION");