From 39e048e60ae2153f7621b7d1a1949dcb69778fa1 Mon Sep 17 00:00:00 2001 From: Michael Platings Date: Mon, 6 Mar 2023 22:53:54 +0000 Subject: [PATCH] Use LLVM_USE_SYMLINKS option in install_symlink The change to potentially use symlinks on Windows was added in https://reviews.llvm.org/D99170. LLVM_USE_SYMLINKS was added more recently in https://reviews.llvm.org/D135578 and allows specifying at configure time whether or not symlinks should be created. The benefit of using this option is it allows building the package on a symlink-capable Windows machine with symlinks disabled so that the resulting package can be used on a Windows machine that doesn't support symlinks. Differential Revision: https://reviews.llvm.org/D145443 --- llvm/cmake/modules/AddLLVM.cmake | 16 ++++++++++++++-- llvm/cmake/modules/LLVMInstallSymlink.cmake | 14 ++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 76695e69e740..fa23bf1d883a 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -2008,13 +2008,19 @@ function(llvm_install_library_symlink name dest type) set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX}) set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX}) + if(LLVM_USE_SYMLINKS) + set(LLVM_LINK_OR_COPY create_symlink) + else() + set(LLVM_LINK_OR_COPY copy) + endif() + set(output_dir lib${LLVM_LIBDIR_SUFFIX}) if(WIN32 AND "${type}" STREQUAL "SHARED") set(output_dir "${CMAKE_INSTALL_BINDIR}") endif() install(SCRIPT ${INSTALL_SYMLINK} - CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\")" + CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\" \"${LLVM_LINK_OR_COPY}\")" COMPONENT ${component}) endfunction() @@ -2049,10 +2055,16 @@ function(llvm_install_symlink project name dest) set(full_dest llvm${CMAKE_EXECUTABLE_SUFFIX}) endif() + if(LLVM_USE_SYMLINKS) + set(LLVM_LINK_OR_COPY create_symlink) + else() + set(LLVM_LINK_OR_COPY copy) + endif() + set(output_dir "${${project}_TOOLS_INSTALL_DIR}") install(SCRIPT ${INSTALL_SYMLINK} - CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\")" + CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\" \"${LLVM_LINK_OR_COPY}\")" 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 e9be04aceb3d..fb61265543d1 100644 --- a/llvm/cmake/modules/LLVMInstallSymlink.cmake +++ b/llvm/cmake/modules/LLVMInstallSymlink.cmake @@ -4,7 +4,10 @@ set(CMAKE_INSTALL_LIBDIR "lib") include(GNUInstallDirs) -function(install_symlink name target outdir) +function(install_symlink name target outdir link_or_copy) + # link_or_copy is the "command" to pass to cmake -E. + # It should be either "create_symlink" or "copy". + set(DESTDIR $ENV{DESTDIR}) if(NOT IS_ABSOLUTE "${outdir}") set(outdir "${CMAKE_INSTALL_PREFIX}/${outdir}") @@ -14,12 +17,7 @@ function(install_symlink name target outdir) message(STATUS "Creating ${name}") execute_process( - COMMAND "${CMAKE_COMMAND}" -E create_symlink "${target}" "${name}" - 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 "${outdir}") - endif() + COMMAND "${CMAKE_COMMAND}" -E ${link_or_copy} "${target}" "${name}" + WORKING_DIRECTORY "${outdir}") endfunction() -- 2.39.0.1.g6739ec1790