[llvm] a7cad66 - [PR48898][CMake] Support MinGW Toolchain tool sin llvm_ExternalProject_Add

Markus Böck via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 2 13:45:15 PST 2021


Author: Markus Böck
Date: 2021-03-02T22:45:05+01:00
New Revision: a7cad6680b4087eff8994f1f99ac40c661a6621f

URL: https://github.com/llvm/llvm-project/commit/a7cad6680b4087eff8994f1f99ac40c661a6621f
DIFF: https://github.com/llvm/llvm-project/commit/a7cad6680b4087eff8994f1f99ac40c661a6621f.diff

LOG: [PR48898][CMake] Support MinGW Toolchain tool sin llvm_ExternalProject_Add

Windows is in the unique position of having two drivers, clang-cl and normal GNU clang, depending on whether a GNU or MSVC target is used. The current implementation with the USE_TOOLCHAIN argument assumes that when CMAKE_SYSTEM_NAME is set to Windows that clang-cl should be used, which is the incorrect choice when targeting a GNU environment.

This patch solves this problem by adding an optional TARGET_TRIPLE argument to llvm_ExternalProject_Add, which sets the various CMAKE_<LANG>_COMPILER_TARGET variables. Additionally, if the triple is detected as an MSVC environment, clang-cl and similar MSVC specific tools will be used instead of the GNU tools.

Added: 
    

Modified: 
    llvm/cmake/modules/LLVMExternalProjectUtils.cmake
    llvm/runtimes/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake
index 1b4a1f339e2b..4a53dca47bb1 100644
--- a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake
+++ b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake
@@ -16,6 +16,17 @@ function(llvm_ExternalProject_BuildCmd out_var target bin_dir)
   endif()
 endfunction()
 
+# is_msvc_triple(out_var triple)
+#   Checks whether the passed triple refers to an MSVC environment
+function(is_msvc_triple out_var triple)
+  if (triple MATCHES ".*-windows-msvc.*")
+    set(${out_var} TRUE PARENT_SCOPE)
+  else()
+    set(${out_var} FALSE PARENT_SCOPE)
+  endif()
+endfunction()
+
+
 # llvm_ExternalProject_Add(name source_dir ...
 #   USE_TOOLCHAIN
 #     Use just-built tools (see TOOLCHAIN_TOOLS)
@@ -37,12 +48,14 @@ endfunction()
 #     Extra variable prefixes (name is always included) to pass down
 #   STRIP_TOOL path
 #     Use provided strip tool instead of the default one.
+#   TARGET_TRIPLE triple
+#     Optional target triple to pass to the compiler
 #   )
 function(llvm_ExternalProject_Add name source_dir)
   cmake_parse_arguments(ARG
     "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
     "SOURCE_DIR"
-    "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL"
+    "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL;TARGET_TRIPLE"
     ${ARGN})
   canonicalize_tool_name(${name} nameCanon)
 
@@ -58,6 +71,14 @@ function(llvm_ExternalProject_Add name source_dir)
     set(_cmake_system_name "${CMAKE_HOST_SYSTEM_NAME}")
   endif()
 
+  if(NOT ARG_TARGET_TRIPLE)
+    set(target_triple ${LLVM_DEFAULT_TARGET_TRIPLE})
+  else()
+    set(target_triple ${ARG_TARGET_TRIPLE})
+  endif()
+
+  is_msvc_triple(is_msvc_target ${target_triple})
+
   if(NOT ARG_TOOLCHAIN_TOOLS)
     set(ARG_TOOLCHAIN_TOOLS clang)
     # AIX 64-bit XCOFF and big AR format is not yet supported in some of these tools.
@@ -65,7 +86,7 @@ function(llvm_ExternalProject_Add name source_dir)
       list(APPEND ARG_TOOLCHAIN_TOOLS lld llvm-ar llvm-ranlib llvm-nm llvm-objdump)
       if(_cmake_system_name STREQUAL Darwin)
         list(APPEND ARG_TOOLCHAIN_TOOLS llvm-libtool-darwin llvm-lipo)
-      elseif(_cmake_system_name STREQUAL Windows)
+      elseif(is_msvc_target)
         list(APPEND ARG_TOOLCHAIN_TOOLS llvm-lib)
       else()
         # TODO: These tools don't fully support Mach-O format yet.
@@ -138,7 +159,7 @@ function(llvm_ExternalProject_Add name source_dir)
 
   if(ARG_USE_TOOLCHAIN AND NOT CMAKE_CROSSCOMPILING)
     if(CLANG_IN_TOOLCHAIN)
-      if(_cmake_system_name STREQUAL Windows)
+      if(is_msvc_target)
         set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}
                           -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}
                           -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
@@ -149,14 +170,14 @@ function(llvm_ExternalProject_Add name source_dir)
       endif()
     endif()
     if(lld IN_LIST TOOLCHAIN_TOOLS)
-      if(_cmake_system_name STREQUAL Windows)
+      if(is_msvc_target)
         list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})
       elseif(NOT _cmake_system_name STREQUAL Darwin)
         list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/ld.lld${CMAKE_EXECUTABLE_SUFFIX})
       endif()
     endif()
     if(llvm-ar IN_LIST TOOLCHAIN_TOOLS)
-      if(_cmake_system_name STREQUAL Windows)
+      if(is_msvc_target)
         list(APPEND compiler_args -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-lib${CMAKE_EXECUTABLE_SUFFIX})
       else()
         list(APPEND compiler_args -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar${CMAKE_EXECUTABLE_SUFFIX})
@@ -190,6 +211,12 @@ function(llvm_ExternalProject_Add name source_dir)
     list(APPEND compiler_args -DCMAKE_STRIP=${ARG_STRIP_TOOL})
   endif()
 
+  if (ARG_TARGET_TRIPLE)
+    list(APPEND compiler_args -DCMAKE_C_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
+    list(APPEND compiler_args -DCMAKE_CXX_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
+    list(APPEND compiler_args -DCMAKE_ASM_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
+  endif()
+
   add_custom_command(
     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp
     DEPENDS ${ARG_DEPENDS}

diff  --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index 1681cd959e07..cb9bb700b1ef 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -85,13 +85,12 @@ function(builtin_default_target compiler_rt_path)
                                       -DLLVM_RUNTIME_OUTPUT_INTDIR=${LLVM_TOOLS_BINARY_DIR}
                                       -DLLVM_DEFAULT_TARGET_TRIPLE=${TARGET_TRIPLE}
                                       -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default}
-                                      -DCMAKE_C_COMPILER_TARGET=${TARGET_TRIPLE}
-                                      -DCMAKE_ASM_COMPILER_TARGET=${TARGET_TRIPLE}
                                       -DCMAKE_C_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
                                       ${BUILTINS_CMAKE_ARGS}
                            PASSTHROUGH_PREFIXES COMPILER_RT
                            USE_TOOLCHAIN
+                           TARGET_TRIPLE ${TARGET_TRIPLE}
                            ${EXTRA_ARGS})
 endfunction()
 
@@ -117,13 +116,12 @@ function(builtin_register_target compiler_rt_path target)
                                       -DLLVM_RUNTIME_OUTPUT_INTDIR=${LLVM_TOOLS_BINARY_DIR}
                                       -DLLVM_DEFAULT_TARGET_TRIPLE=${target}
                                       -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON
-                                      -DCMAKE_C_COMPILER_TARGET=${target}
-                                      -DCMAKE_ASM_COMPILER_TARGET=${target}
                                       -DCMAKE_C_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
                                       -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON
                                       ${${target}_extra_args}
                            USE_TOOLCHAIN
+                           TARGET_TRIPLE ${target}
                            ${EXTRA_ARGS})
 endfunction()
 
@@ -228,9 +226,6 @@ function(runtime_default_target)
                                       -DLLVM_DEFAULT_TARGET_TRIPLE=${TARGET_TRIPLE}
                                       -DLLVM_ENABLE_PROJECTS_USED=${LLVM_ENABLE_PROJECTS_USED}
                                       -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default}
-                                      -DCMAKE_C_COMPILER_TARGET=${TARGET_TRIPLE}
-                                      -DCMAKE_CXX_COMPILER_TARGET=${TARGET_TRIPLE}
-                                      -DCMAKE_ASM_COMPILER_TARGET=${TARGET_TRIPLE}
                                       -DCMAKE_C_COMPILER_WORKS=ON
                                       -DCMAKE_CXX_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
@@ -243,6 +238,7 @@ function(runtime_default_target)
                                          ${SUB_CHECK_TARGETS}
                                          ${SUB_INSTALL_TARGETS}
                            USE_TOOLCHAIN
+                           TARGET_TRIPLE ${TARGET_TRIPLE}
                            ${EXTRA_ARGS})
 endfunction()
 
@@ -330,9 +326,6 @@ function(runtime_register_target name target)
                                       -DLLVM_DEFAULT_TARGET_TRIPLE=${target}
                                       -DLLVM_ENABLE_PROJECTS_USED=${LLVM_ENABLE_PROJECTS_USED}
                                       -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON
-                                      -DCMAKE_C_COMPILER_TARGET=${target}
-                                      -DCMAKE_CXX_COMPILER_TARGET=${target}
-                                      -DCMAKE_ASM_COMPILER_TARGET=${target}
                                       -DCMAKE_C_COMPILER_WORKS=ON
                                       -DCMAKE_CXX_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
@@ -342,6 +335,7 @@ function(runtime_register_target name target)
                            EXTRA_TARGETS ${${name}_extra_targets}
                                          ${${name}_test_targets}
                            USE_TOOLCHAIN
+                           TARGET_TRIPLE ${target}
                            ${EXTRA_ARGS})
 endfunction()
 


        


More information about the llvm-commits mailing list