From: John Ericson Date: Fri, 21 Jan 2022 02:54:54 +0000 (+0000) Subject: [llvm][cmake] Make `install_symlink` workflow work with absolute install dirs X-Git-Tag: upstream/15.0.7~511 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5acd376438a53747c84e38c8b69fc74a270da680;p=platform%2Fupstream%2Fllvm.git [llvm][cmake] Make `install_symlink` workflow work with absolute install dirs If `CMAKE_INSTALL_BINDIR` is a different absolute path per project, as it is with NixOS when we install every package to its own prefix, the old way fails when the absolute path gets prepended with `CMAKE_INSTALL_PREFIX`. Using `extend_path` from the install-time script isn't really possible, so we just make the caller responsible for making the path absolute instead. Also fix one stray `bin` -> `CMAKE_INSTALL_BINDIR` Reviewed By: sebastian-ne Differential Revision: https://reviews.llvm.org/D101070 --- diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 365742d..4b72a42 100644 --- 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 @@ endfunction() 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 @@ function(llvm_install_library_symlink name dest type) 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 @@ function(llvm_install_symlink project name dest) 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 index b5c35f7..29c096c 100644 --- 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()