[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