Jim*_*nie 5 llvm clang macos-big-sur apple-silicon
我正在尝试构建 LLVM 编译器,以便我可以在 Apple M1 上启用 OpenMP。我正在使用 LLVM 开发树,(因为我最近看到一些 OpenMP 运行时对此进行了处理)。
我已经结束了这个脚本来调用 cmake:
# Xcode, Ninja
BUILD_SYSTEM=Ninja
BUILD_TAG=Ninja
cmake ../llvm \
-G$BUILD_SYSTEM -B ${BUILD_TAG}_build \
-DCMAKE_OSX_ARCHITECTURES='arm64' \
-DCMAKE_C_COMPILER=`which clang` \
-DCMAKE_CXX_COMPILER=`which clang++` \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_BUILD_WITH_INSTALL_RPATH=1 \
-DCMAKE_INSTALL_PREFIX=$HOME/software/clang-12.0.0/arm64 \
-DLLVM_ENABLE_WERROR=FALSE \
-DLLVM_TARGETS_TO_BUILD='AArch64' \
-DLLVM_ENABLE_PROJECTS='clang;openmp,polly' \
-DLLVM_DEFAULT_TARGET_TRIPLE='aarch64-apple-darwin20.1.0'
Run Code Online (Sandbox Code Playgroud)
这里使用的编译器是
$ /usr/bin/clang --version
Apple clang version 12.0.0 (clang-1200.0.32.27)
Target: arm64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Run Code Online (Sandbox Code Playgroud)
然后 ninja 可以成功构建 clang、clang++ 和 OpenMp 运行时并安装它们。(很简单,针对 Arms64 的 Arm64 图像)
$ file ~/software/clang-12.0.0/arm64/bin/clang
/Users/jcownie/software/clang-12.0.0/arm64/bin/clang: Mach-O 64-bit executable arm64
$ ~/software/clang-12.0.0/arm64/bin/clang --version
clang version 12.0.0 (https://github.com/llvm/llvm-project.git 879c15e890b4d25d28ea904e92497f091f796019)
Target: aarch64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /Users/jcownie/software/clang-12.0.0/arm64/bin
Run Code Online (Sandbox Code Playgroud)
这一切看起来都很正常,除了当我尝试用它们编译任何东西时,它们都缺少获取系统头文件的包含路径。
$ ~/software/clang-12.0.0/arm64/bin/clang hello.c
hello.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)
所以,毕竟,
谢谢
isu*_*ruf 12
您可以-DDEFAULT_SYSROOT=/path/to/MacOSX11.1.sdk在构建时设置或export SDKROOT=/path/to/MacOSX11.1.sdk在运行时执行。
您需要进行编译clang -arch arm64 -arch x86_64才能从 clang 中获取胖二进制文件。您也需要为 Apple clang 执行此操作。
2021 年 2 月 8 日更新
Homebrew现在支持基于 M1 的 Arm 机器,因此使用它是比下面的更好的答案。如果您想自己执行此操作,下面的信息可能仍然有用,但使用brew可能会简单得多。
预冲泡答案
我还没有找到一个干净的解决方案,但如果它对其他人有帮助,我确实有一个可怕的黑客。
完整的配方,然后使用此脚本进行配置,然后构建并安装。
# Xcode, Ninja
BUILD_SYSTEM=Ninja
BUILD_TAG=ninja
INSTALLDIR=$HOME/software/clang-12.0.0/arm64
cmake ../llvm \
-G$BUILD_SYSTEM -B ${BUILD_TAG}_build \
-DCMAKE_OSX_ARCHITECTURES='arm64' \
-DCMAKE_C_COMPILER=`which clang` \
-DCMAKE_CXX_COMPILER=`which clang++` \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$INSTALLDIR \
-DLLVM_LOCAL_RPATH=$INSTALLDIR/lib \
-DLLVM_ENABLE_WERROR=FALSE \
-DLLVM_TARGETS_TO_BUILD='AArch64' \
-DLLVM_DEFAULT_TARGET_TRIPLE='aarch64-apple-darwin20.1.0' \
-DDEFAULT_SYSROOT="$(xcrun --show-sdk-path)" \
-DLLVM_ENABLE_PROJECTS='clang;openmp;polly;clang-tools-extra;libcxx;libcxxabi' \
# -DLLVM_ENABLE_PROJECTS='clang;openmp;polly'
Run Code Online (Sandbox Code Playgroud)
这使得编译器可以找到正确的标头,但如果使用 OpenMP,则无法成功链接,因为它不会传递任何有用的 -L 路径或添加必要的 rpath。
为了克服这个问题,我创建了一个位于 my 中的小型 shell 脚本~/bin,位于 my 的前面$PATH,它添加了这些额外的链接器标志。
#
# A truly awful hack, but it seems necessary.
# Install this with execute permissions as clang and clang++ in
# a directory early in your path, so that it is executed when clang or
# clang++ is needed.
#
# For brew...
INSTALLDIR=/usr/local/opt/llvm
# For a local build.
INSTALLDIR=${HOME}/software/clang-12.0.0/arm64/
# Find out the name of this file, and then invoke the same file in the
# compiler installation, adding the necessary linker directives
CMD=`echo $0 | sed "s/\/.*\///"`
${INSTALLDIR}/bin/${CMD} -L${INSTALLDIR}/lib -Wl,-rpath,${INSTALLDIR}/lib $*
Run Code Online (Sandbox Code Playgroud)
我并不是特别推荐这个;显然应该有更好的方法让它工作,但它现在就可以了,让我重新使用编译器而不是构建它!
| 归档时间: |
|
| 查看次数: |
6948 次 |
| 最近记录: |