diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -1,4 +1,5 @@ include(GNUInstallDirs) +include(ExtendPath) include(LLVMDistributionSupport) include(LLVMProcessSources) include(LLVM-Config) @@ -1953,7 +1954,7 @@ function(add_lit_testsuites project directory) if (NOT LLVM_ENABLE_IDE) cmake_parse_arguments(ARG "EXCLUDE_FROM_CHECK_ALL" "FOLDER" "PARAMS;DEPENDS;ARGS" ${ARGN}) - + if (NOT ARG_FOLDER) set(ARG_FOLDER "Test Subdirectories") endif() @@ -2009,11 +2010,14 @@ set(output_dir lib${LLVM_LIBDIR_SUFFIX}) if(WIN32 AND "${type}" STREQUAL "SHARED") - set(output_dir bin) + set(output_dir "${CMAKE_INSTALL_BINDIR}") endif() + # `install_symlink` needs an absoute path. + extend_path(output_dir "${CMAKE_INSTALL_PREFIX}" "${output_dir}") + install(SCRIPT ${INSTALL_SYMLINK} - CODE "install_symlink(${full_name} ${full_dest} ${output_dir})" + CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\")" COMPONENT ${component}) endfunction() @@ -2048,8 +2052,11 @@ set(full_dest llvm${CMAKE_EXECUTABLE_SUFFIX}) endif() + # `install_symlink` needs an absoute path. + extend_path(output_dir "${CMAKE_INSTALL_PREFIX}" "${${project}_TOOLS_INSTALL_DIR}") + install(SCRIPT ${INSTALL_SYMLINK} - CODE "install_symlink(${full_name} ${full_dest} ${${project}_TOOLS_INSTALL_DIR})" + CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\")" COMPONENT ${component}) if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE) diff --git a/llvm/cmake/modules/LLVMInstallSymlink.cmake b/llvm/cmake/modules/LLVMInstallSymlink.cmake --- a/llvm/cmake/modules/LLVMInstallSymlink.cmake +++ b/llvm/cmake/modules/LLVMInstallSymlink.cmake @@ -1,22 +1,26 @@ # We need to execute this script at installation time because the # DESTDIR environment variable may be unset at configuration time. # See PR8397. +# +# `outdir` must be an absolute path. This module gets a very reduced +# `CMAKE_MODULE_PATH` so it is easier to make the caller the responsible +# for this. include(GNUInstallDirs) function(install_symlink name target outdir) set(DESTDIR $ENV{DESTDIR}) - set(bindir "${DESTDIR}${CMAKE_INSTALL_PREFIX}/${outdir}") + set(outdir "${DESTDIR}${outdir}") message(STATUS "Creating ${name}") execute_process( COMMAND "${CMAKE_COMMAND}" -E create_symlink "${target}" "${name}" - WORKING_DIRECTORY "${bindir}" ERROR_VARIABLE has_err) + WORKING_DIRECTORY "${outdir}" ERROR_VARIABLE has_err) if(CMAKE_HOST_WIN32 AND has_err) execute_process( COMMAND "${CMAKE_COMMAND}" -E copy "${target}" "${name}" - WORKING_DIRECTORY "${bindir}") + WORKING_DIRECTORY "${outdir}") endif() endfunction()