Index: llvm/cmake/modules/LLVMExternalProjectUtils.cmake =================================================================== --- llvm/cmake/modules/LLVMExternalProjectUtils.cmake +++ llvm/cmake/modules/LLVMExternalProjectUtils.cmake @@ -16,6 +16,17 @@ 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 @@ # 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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} Index: llvm/runtimes/CMakeLists.txt =================================================================== --- llvm/runtimes/CMakeLists.txt +++ llvm/runtimes/CMakeLists.txt @@ -85,13 +85,12 @@ -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 @@ -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 @@ -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 @@ ${SUB_CHECK_TARGETS} ${SUB_INSTALL_TARGETS} USE_TOOLCHAIN + TARGET_TRIPLE ${TARGET_TRIPLE} ${EXTRA_ARGS}) endfunction() @@ -330,9 +326,6 @@ -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 @@ EXTRA_TARGETS ${${name}_extra_targets} ${${name}_test_targets} USE_TOOLCHAIN + TARGET_TRIPLE ${target} ${EXTRA_ARGS}) endfunction()