@@ -16,6 +16,17 @@ function(llvm_ExternalProject_BuildCmd out_var target bin_dir)
16
16
endif ()
17
17
endfunction ()
18
18
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
+
19
30
# llvm_ExternalProject_Add(name source_dir ...
20
31
# USE_TOOLCHAIN
21
32
# Use just-built tools (see TOOLCHAIN_TOOLS)
@@ -37,12 +48,14 @@ endfunction()
37
48
# Extra variable prefixes (name is always included) to pass down
38
49
# STRIP_TOOL path
39
50
# Use provided strip tool instead of the default one.
51
+ # TARGET_TRIPLE triple
52
+ # Optional target triple to pass to the compiler
40
53
# )
41
54
function (llvm_ExternalProject_Add name source_dir)
42
55
cmake_parse_arguments (ARG
43
56
"USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
44
57
"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 "
46
59
${ARGN} )
47
60
canonicalize_tool_name(${name} nameCanon)
48
61
@@ -58,14 +71,22 @@ function(llvm_ExternalProject_Add name source_dir)
58
71
set (_cmake_system_name "${CMAKE_HOST_SYSTEM_NAME} " )
59
72
endif ()
60
73
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
+
61
82
if (NOT ARG_TOOLCHAIN_TOOLS)
62
83
set (ARG_TOOLCHAIN_TOOLS clang)
63
84
# AIX 64-bit XCOFF and big AR format is not yet supported in some of these tools.
64
85
if (NOT _cmake_system_name STREQUAL AIX)
65
86
list (APPEND ARG_TOOLCHAIN_TOOLS lld llvm-ar llvm-ranlib llvm-nm llvm-objdump)
66
87
if (_cmake_system_name STREQUAL Darwin)
67
88
list (APPEND ARG_TOOLCHAIN_TOOLS llvm-libtool-darwin llvm-lipo)
68
- elseif (_cmake_system_name STREQUAL Windows )
89
+ elseif (is_msvc_target )
69
90
list (APPEND ARG_TOOLCHAIN_TOOLS llvm-lib)
70
91
else ()
71
92
# TODO: These tools don't fully support Mach-O format yet.
@@ -138,7 +159,7 @@ function(llvm_ExternalProject_Add name source_dir)
138
159
139
160
if (ARG_USE_TOOLCHAIN AND NOT CMAKE_CROSSCOMPILING )
140
161
if (CLANG_IN_TOOLCHAIN)
141
- if (_cmake_system_name STREQUAL Windows )
162
+ if (is_msvc_target )
142
163
set (compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR} /clang-cl${CMAKE_EXECUTABLE_SUFFIX}
143
164
-DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR} /clang-cl${CMAKE_EXECUTABLE_SUFFIX}
144
165
-DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR} /clang-cl${CMAKE_EXECUTABLE_SUFFIX} )
@@ -149,14 +170,14 @@ function(llvm_ExternalProject_Add name source_dir)
149
170
endif ()
150
171
endif ()
151
172
if (lld IN_LIST TOOLCHAIN_TOOLS)
152
- if (_cmake_system_name STREQUAL Windows )
173
+ if (is_msvc_target )
153
174
list (APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR} /lld-link${CMAKE_EXECUTABLE_SUFFIX} )
154
175
elseif (NOT _cmake_system_name STREQUAL Darwin)
155
176
list (APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR} /ld.lld${CMAKE_EXECUTABLE_SUFFIX} )
156
177
endif ()
157
178
endif ()
158
179
if (llvm-ar IN_LIST TOOLCHAIN_TOOLS)
159
- if (_cmake_system_name STREQUAL Windows )
180
+ if (is_msvc_target )
160
181
list (APPEND compiler_args -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR} /llvm-lib${CMAKE_EXECUTABLE_SUFFIX} )
161
182
else ()
162
183
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)
190
211
list (APPEND compiler_args -DCMAKE_STRIP=${ARG_STRIP_TOOL} )
191
212
endif ()
192
213
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
+
193
220
add_custom_command (
194
221
OUTPUT ${CMAKE_CURRENT_BINARY_DIR} /${name} -clobber-stamp
195
222
DEPENDS ${ARG_DEPENDS}
0 commit comments