如何让 cmake 专门使用我的 llvm Homebrew 安装?

swe*_*ish 9 c++ macos homebrew cmake

我的目标是为我的 cmake 命令设置别名,以便它专门使用我的 llvm 自制安装,而不是 Xcode 安装的套件。我也想保留系统默认值。我在 Catalina 上使用最新的 Xcode 和 homebrew llvm。

我的第一步是使用自制的 clang++ 和 libc++,我可以手动完成

/usr/local/opt/llvm/bin/clang++ -Wall -Wextra -std=c++17 -stdlib=libc++ \
-nostdinc++ -I/usr/local/opt/llvm/include/c++/v1 \
-L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib \
main.cc
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这是我的 CMakeLists.txt;它非常准系统,因为我想做的大部分工作不属于 CMakeLists.txt,我只是想编译一个玩具程序。

cmake_minimum_required(VERSION 3.15)

project(test)

set(CMAKE_CXX_STANDARD 17)

add_executable(test
               main.cc)
Run Code Online (Sandbox Code Playgroud)

但我已经被 cmake 困住了。我可以使用
-DCMAKE_CXX_COMPILER="/usr/local/opt/llvm/bin/clang++C/clang 指定编译器。我也在使用CMAKE_PREFIX_PATH,但是当我打开build.ninja文件时,我仍然看到它引用 Xcode 目录。添加 aCMAKE_IGNORE_PATH似乎并没有让它真正忽略 /Applications/Xcode.app。

我还尝试将标志CMAKE_CXX_STANDARD_LIBRARIES和添加CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES到我的 cmake 命令中,但如果我这样做,我开始出现链接器错误(我相信仍然使用系统链接器而不是自制程序的 ld64.lld)。

这是我当前工作的 cmake 命令作为参考:

cmake -DCMAKE_PREFIX_PATH="/usr/local/opt/llvm" \
-DCMAKE_CXX_COMPILER="/usr/local/opt/llvm/bin/clang++" \
-DCMAKE_C_COMPILER="/usr/local/opt/llvm/bin/clang" -G Ninja ..
Run Code Online (Sandbox Code Playgroud)

仍然需要特定的编译器路径,因为 cmake 可以轻松直接连接到 AppleClang。

我知道路径重复很烦人,但我希望在开始修改 .zshrc 之前有一个完整的命令可以工作。

这是损坏的命令(因为构建程序不再成功而损坏,cmake 不会在这里抱怨):

cmake -DCMAKE_IGNORE_PATH="/Applications/Xcode.app" -DCMAKE_PREFIX_PATH="/usr/local/opt/llvm" \
-DCMAKE_CXX_COMPILER="/usr/local/opt/llvm/bin/clang++" \
-DCMAKE_C_COMPILER="/usr/local/opt/llvm/bin/clang" \
-DCMAKE_CXX_STANDARD_LIBRARIES="/usr/local/opt/llvm/lib" \
-DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES="/usr/local/opt/llvm/include/c++/v1" \
-G Ninja ..
Run Code Online (Sandbox Code Playgroud)

带有构建错误消息:

[2/2] Linking CXX executable test
FAILED: test 
: && /usr/local/opt/llvm/bin/clang++  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/test.dir/main.cc.o  -o test  /usr/local/opt/llvm/lib && :
ld: can't map file, errno=22 file '/usr/local/opt/llvm/lib' for architecture x86_64
clang-9: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
Run Code Online (Sandbox Code Playgroud)

该变量CMAKE_CXX_LINK_EXECUTABLE只是被忽略,因此不包括在内。

如果有人有任何指导,我将不胜感激。我发现的有关此问题的所有链接通常都会覆盖系统默认设置,如果可能的话,我想避免这样做。