Skip to content

Commit a7cad66

Browse files
committed
[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.
1 parent 4a58116 commit a7cad66

File tree

2 files changed

+36
-15
lines changed

2 files changed

+36
-15
lines changed

llvm/cmake/modules/LLVMExternalProjectUtils.cmake

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ function(llvm_ExternalProject_BuildCmd out_var target bin_dir)
1616
endif()
1717
endfunction()
1818

19+
# is_msvc_triple(out_var triple)
20+
# Checks whether the passed triple refers to an MSVC environment
21+
function(is_msvc_triple out_var triple)
22+
if (triple MATCHES ".*-windows-msvc.*")
23+
set(${out_var} TRUE PARENT_SCOPE)
24+
else()
25+
set(${out_var} FALSE PARENT_SCOPE)
26+
endif()
27+
endfunction()
28+
29+
1930
# llvm_ExternalProject_Add(name source_dir ...
2031
# USE_TOOLCHAIN
2132
# Use just-built tools (see TOOLCHAIN_TOOLS)
@@ -37,12 +48,14 @@ endfunction()
3748
# Extra variable prefixes (name is always included) to pass down
3849
# STRIP_TOOL path
3950
# Use provided strip tool instead of the default one.
51+
# TARGET_TRIPLE triple
52+
# Optional target triple to pass to the compiler
4053
# )
4154
function(llvm_ExternalProject_Add name source_dir)
4255
cmake_parse_arguments(ARG
4356
"USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
4457
"SOURCE_DIR"
45-
"CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL"
58+
"CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL;TARGET_TRIPLE"
4659
${ARGN})
4760
canonicalize_tool_name(${name} nameCanon)
4861

@@ -58,14 +71,22 @@ function(llvm_ExternalProject_Add name source_dir)
5871
set(_cmake_system_name "${CMAKE_HOST_SYSTEM_NAME}")
5972
endif()
6073

74+
if(NOT ARG_TARGET_TRIPLE)
75+
set(target_triple ${LLVM_DEFAULT_TARGET_TRIPLE})
76+
else()
77+
set(target_triple ${ARG_TARGET_TRIPLE})
78+
endif()
79+
80+
is_msvc_triple(is_msvc_target ${target_triple})
81+
6182
if(NOT ARG_TOOLCHAIN_TOOLS)
6283
set(ARG_TOOLCHAIN_TOOLS clang)
6384
# AIX 64-bit XCOFF and big AR format is not yet supported in some of these tools.
6485
if(NOT _cmake_system_name STREQUAL AIX)
6586
list(APPEND ARG_TOOLCHAIN_TOOLS lld llvm-ar llvm-ranlib llvm-nm llvm-objdump)
6687
if(_cmake_system_name STREQUAL Darwin)
6788
list(APPEND ARG_TOOLCHAIN_TOOLS llvm-libtool-darwin llvm-lipo)
68-
elseif(_cmake_system_name STREQUAL Windows)
89+
elseif(is_msvc_target)
6990
list(APPEND ARG_TOOLCHAIN_TOOLS llvm-lib)
7091
else()
7192
# TODO: These tools don't fully support Mach-O format yet.
@@ -138,7 +159,7 @@ function(llvm_ExternalProject_Add name source_dir)
138159

139160
if(ARG_USE_TOOLCHAIN AND NOT CMAKE_CROSSCOMPILING)
140161
if(CLANG_IN_TOOLCHAIN)
141-
if(_cmake_system_name STREQUAL Windows)
162+
if(is_msvc_target)
142163
set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}
143164
-DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}
144165
-DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
@@ -149,14 +170,14 @@ function(llvm_ExternalProject_Add name source_dir)
149170
endif()
150171
endif()
151172
if(lld IN_LIST TOOLCHAIN_TOOLS)
152-
if(_cmake_system_name STREQUAL Windows)
173+
if(is_msvc_target)
153174
list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})
154175
elseif(NOT _cmake_system_name STREQUAL Darwin)
155176
list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/ld.lld${CMAKE_EXECUTABLE_SUFFIX})
156177
endif()
157178
endif()
158179
if(llvm-ar IN_LIST TOOLCHAIN_TOOLS)
159-
if(_cmake_system_name STREQUAL Windows)
180+
if(is_msvc_target)
160181
list(APPEND compiler_args -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-lib${CMAKE_EXECUTABLE_SUFFIX})
161182
else()
162183
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)
190211
list(APPEND compiler_args -DCMAKE_STRIP=${ARG_STRIP_TOOL})
191212
endif()
192213

214+
if (ARG_TARGET_TRIPLE)
215+
list(APPEND compiler_args -DCMAKE_C_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
216+
list(APPEND compiler_args -DCMAKE_CXX_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
217+
list(APPEND compiler_args -DCMAKE_ASM_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
218+
endif()
219+
193220
add_custom_command(
194221
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp
195222
DEPENDS ${ARG_DEPENDS}

llvm/runtimes/CMakeLists.txt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,12 @@ function(builtin_default_target compiler_rt_path)
8585
-DLLVM_RUNTIME_OUTPUT_INTDIR=${LLVM_TOOLS_BINARY_DIR}
8686
-DLLVM_DEFAULT_TARGET_TRIPLE=${TARGET_TRIPLE}
8787
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default}
88-
-DCMAKE_C_COMPILER_TARGET=${TARGET_TRIPLE}
89-
-DCMAKE_ASM_COMPILER_TARGET=${TARGET_TRIPLE}
9088
-DCMAKE_C_COMPILER_WORKS=ON
9189
-DCMAKE_ASM_COMPILER_WORKS=ON
9290
${BUILTINS_CMAKE_ARGS}
9391
PASSTHROUGH_PREFIXES COMPILER_RT
9492
USE_TOOLCHAIN
93+
TARGET_TRIPLE ${TARGET_TRIPLE}
9594
${EXTRA_ARGS})
9695
endfunction()
9796

@@ -117,13 +116,12 @@ function(builtin_register_target compiler_rt_path target)
117116
-DLLVM_RUNTIME_OUTPUT_INTDIR=${LLVM_TOOLS_BINARY_DIR}
118117
-DLLVM_DEFAULT_TARGET_TRIPLE=${target}
119118
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON
120-
-DCMAKE_C_COMPILER_TARGET=${target}
121-
-DCMAKE_ASM_COMPILER_TARGET=${target}
122119
-DCMAKE_C_COMPILER_WORKS=ON
123120
-DCMAKE_ASM_COMPILER_WORKS=ON
124121
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON
125122
${${target}_extra_args}
126123
USE_TOOLCHAIN
124+
TARGET_TRIPLE ${target}
127125
${EXTRA_ARGS})
128126
endfunction()
129127

@@ -228,9 +226,6 @@ function(runtime_default_target)
228226
-DLLVM_DEFAULT_TARGET_TRIPLE=${TARGET_TRIPLE}
229227
-DLLVM_ENABLE_PROJECTS_USED=${LLVM_ENABLE_PROJECTS_USED}
230228
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default}
231-
-DCMAKE_C_COMPILER_TARGET=${TARGET_TRIPLE}
232-
-DCMAKE_CXX_COMPILER_TARGET=${TARGET_TRIPLE}
233-
-DCMAKE_ASM_COMPILER_TARGET=${TARGET_TRIPLE}
234229
-DCMAKE_C_COMPILER_WORKS=ON
235230
-DCMAKE_CXX_COMPILER_WORKS=ON
236231
-DCMAKE_ASM_COMPILER_WORKS=ON
@@ -243,6 +238,7 @@ function(runtime_default_target)
243238
${SUB_CHECK_TARGETS}
244239
${SUB_INSTALL_TARGETS}
245240
USE_TOOLCHAIN
241+
TARGET_TRIPLE ${TARGET_TRIPLE}
246242
${EXTRA_ARGS})
247243
endfunction()
248244

@@ -330,9 +326,6 @@ function(runtime_register_target name target)
330326
-DLLVM_DEFAULT_TARGET_TRIPLE=${target}
331327
-DLLVM_ENABLE_PROJECTS_USED=${LLVM_ENABLE_PROJECTS_USED}
332328
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON
333-
-DCMAKE_C_COMPILER_TARGET=${target}
334-
-DCMAKE_CXX_COMPILER_TARGET=${target}
335-
-DCMAKE_ASM_COMPILER_TARGET=${target}
336329
-DCMAKE_C_COMPILER_WORKS=ON
337330
-DCMAKE_CXX_COMPILER_WORKS=ON
338331
-DCMAKE_ASM_COMPILER_WORKS=ON
@@ -342,6 +335,7 @@ function(runtime_register_target name target)
342335
EXTRA_TARGETS ${${name}_extra_targets}
343336
${${name}_test_targets}
344337
USE_TOOLCHAIN
338+
TARGET_TRIPLE ${target}
345339
${EXTRA_ARGS})
346340
endfunction()
347341

0 commit comments

Comments
 (0)