[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.
This commit is contained in:
parent
4a58116b7e
commit
a7cad6680b
|
@ -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}
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Loading…
Reference in New Issue