From 1295088fba658f46b187ba613327d40210013d14 Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Tue, 9 Jan 2018 07:50:18 +0000 Subject: [PATCH] [cmake] Use symlinks for Windows-hosted toolchains built on Unix When cross-compiling for Windows on Unix, the built toolchain will need to be transferred to Windows to actually run. My opinion is that the Unix build should use symlinks, and the transfer to Windows should take care of making those symlinks usable. E.g., I envision tarballs to be a common form of transfer from Unix to Windows, in which case the tarball can be created using --dereference to follow the symlinks. The motivation here is that, when cross-compiling for Windows on Unix, the installation will *already* create symlinks. The reason is that the installation script will be invoked without knowing the host system, so the `if(UNIX)` check in the installation symlink creation script will reflect the build system rather than the host system. We could either make the build and install trees both contain copies or both contain symlinks, and using symlinks is a significant space saving without (in my opinion) having any detrimental effect on the usage of the cross- compiled toolchain on Windows. A secondary motivation is that Windows 10 version 1703 and later finally lift the administrator rights requirement for creating symbolic links (if the system is in Developer Mode), which makes symlinks a lot more practical even on Windows. Of course Unix and Windows symlinks aren't interoperable, but symlinks for Windows toolchains is a reasonable future direction to be going in anyway. Differential Revision: https://reviews.llvm.org/D41314 llvm-svn: 322061 --- llvm/cmake/modules/AddLLVM.cmake | 4 ++-- llvm/cmake/modules/LLVMInstallSymlink.cmake | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index fd5627eecbb2..20166d2cd30c 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -1473,7 +1473,7 @@ function(add_llvm_tool_symlink link_name target) if(NOT ARG_OUTPUT_DIR) # If you're not overriding the OUTPUT_DIR, we can make the link relative in # the same directory. - if(UNIX) + if(CMAKE_HOST_UNIX) set(dest_binary "$") endif() if(CMAKE_CONFIGURATION_TYPES) @@ -1499,7 +1499,7 @@ function(add_llvm_tool_symlink link_name target) endif() endif() - if(UNIX) + if(CMAKE_HOST_UNIX) set(LLVM_LINK_OR_COPY create_symlink) else() set(LLVM_LINK_OR_COPY copy) diff --git a/llvm/cmake/modules/LLVMInstallSymlink.cmake b/llvm/cmake/modules/LLVMInstallSymlink.cmake index 482697b06baf..1a04de931ff7 100644 --- a/llvm/cmake/modules/LLVMInstallSymlink.cmake +++ b/llvm/cmake/modules/LLVMInstallSymlink.cmake @@ -3,7 +3,7 @@ # See PR8397. function(install_symlink name target outdir) - if(UNIX) + if(CMAKE_HOST_UNIX) set(LINK_OR_COPY create_symlink) set(DESTDIR $ENV{DESTDIR}) else()