From f21ae77a0174c9ced5e61dc2b1df6499e71fe930 Mon Sep 17 00:00:00 2001 From: Nadia Holmquist Pedersen Date: Fri, 23 Jul 2021 06:31:20 +0200 Subject: [PATCH] Allow for using LLVM from Homebrew and include its libc++ --- CMakeLists.txt | 6 ++++-- cmake/Toolchain-Homebrew-LLVM.cmake | 12 ++++++++++++ tools/mac-libs.rb | 7 ++++++- 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 cmake/Toolchain-Homebrew-LLVM.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 242193e0..81fb0acf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -123,8 +123,10 @@ if (ENABLE_LTO) if (NOT LLD STREQUAL "LLD-NOTFOUND") add_link_options(-fuse-ld=lld) endif() - set(CMAKE_AR "llvm-ar") - set(CMAKE_RANLIB "llvm-ranlib") + if (NOT APPLE) + set(CMAKE_AR "llvm-ar") + set(CMAKE_RANLIB "llvm-ranlib") + endif() endif() endif() diff --git a/cmake/Toolchain-Homebrew-LLVM.cmake b/cmake/Toolchain-Homebrew-LLVM.cmake new file mode 100644 index 00000000..15b6d24d --- /dev/null +++ b/cmake/Toolchain-Homebrew-LLVM.cmake @@ -0,0 +1,12 @@ +# Toolchain file for building with Homebrew's LLVM on macOS +# This is useful on 10.14 where std::filesystem is not supported. + +set(CMAKE_C_COMPILER /usr/local/opt/llvm/bin/clang) +set(CMAKE_CXX_COMPILER /usr/local/opt/llvm/bin/clang++) + +add_link_options(-L/usr/local/opt/llvm/lib) + +# LLVM in Homebrew is built with latest Xcode which has a newer linker than +# what is bundled in the default install of Xcode Command Line Tools, so we +# override it to prevent it passing flags not supported by the system's ld. +add_link_options(-mlinker-version=450) diff --git a/tools/mac-libs.rb b/tools/mac-libs.rb index 534b003a..94e33f44 100755 --- a/tools/mac-libs.rb +++ b/tools/mac-libs.rb @@ -56,6 +56,10 @@ def expand_load_path(lib, path) file = $fallback_rpaths .map { |it| File.join(it, file_name) } .find { |it| File.exist? it } + if file == nil + path = File.join(File.dirname(lib), file_name) + file = path if File.exist? path + end return file, :rpath if file when "executable_path" file = File.join(File.dirname(executable), file_name) @@ -85,7 +89,6 @@ def install_name_tool(exec, action, path1, path2 = nil) args = ["-#{action.to_s}", path1] args << path2 if path2 != nil - FileUtils.chmod("u+w", exec) out, status = Open3.capture2e("install_name_tool", *args, exec) if status != 0 puts out @@ -129,6 +132,7 @@ def fixup_libs(prog, orig_path) next if File.exist? File.join(frameworks_dir, fwname) expath, _ = expand_load_path(orig_path, framework) FileUtils.cp_r(expath, frameworks_dir, preserve: true) + FileUtils.chmod_R("u+w", File.join(frameworks_dir, fwname)) fixup_libs File.join(frameworks_dir, fwname, fwlib), libpath else libname = File.basename(libpath) @@ -141,6 +145,7 @@ def fixup_libs(prog, orig_path) next if File.exist? dest expath, _ = expand_load_path(orig_path, libpath) FileUtils.copy expath, frameworks_dir + FileUtils.chmod("u+w", dest) fixup_libs dest, libpath end end