diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -293,10 +293,23 @@ if ( LLVM_USE_LINKER ) message(FATAL_ERROR "LLVM_ENABLE_LLD and LLVM_USE_LINKER can't be set at the same time") endif() + # In case of MSVC cmake always invokes the linker directly, so the linker # should be specified by CMAKE_LINKER cmake variable instead of by -fuse-ld # compiler option. - if ( NOT MSVC ) + if ( MSVC ) + if(NOT CMAKE_LINKER MATCHES "lld-link") + get_filename_component(CXX_COMPILER_DIR ${CMAKE_CXX_COMPILER} DIRECTORY) + get_filename_component(C_COMPILER_DIR ${CMAKE_C_COMPILER} DIRECTORY) + find_program(LLD_LINK NAMES "lld-link" "lld-link.exe" HINTS ${CXX_COMPILER_DIR} ${C_COMPILER_DIR} DOC "lld linker") + if(NOT LLD_LINK) + message(FATAL_ERROR + "Using LLD as linker required, but cannot find lld-link. " + "Consider setting CMAKE_LINKER to lld-link path.") + endif() + set(CMAKE_LINKER ${LLD_LINK}) + endif() + else() set(LLVM_USE_LINKER "lld") endif() endif()