A collection of various topics and notes that don't fit into other categories.
Mac 上编译 LLVM 实在是有点慢 (主要还是没钱买 Pro/Max CPU 😇 ), 所以想在 Linux 上交叉编译一个 Mac 版本的 LLVM. 但 Mac 因为工具链相对封闭, 交叉编译并不是那么简单的事. 需要用到的工具是 osxcross, 可以从 GitHub 上克隆下来:
git clone https://github.com/tpoechtrager/osxcross.git
cd osxcross
git switch 2.0-llvm-based整个构建过程分为两阶段, 先构建可以在 Linux 上使用的 Apple Clang 工具链, 然后再将系统 SDK 拷贝给这个工具链 (相当于 sysroot), 从而实现交叉编译.
首先构建 Apple Clang, 这个完全可以由脚本自动完成, INSTALL_PREFIX 指定安装路径:
INSTALL_PREFIX=/opt/apple ./build_apple_clang.sh这个构建过程又分为两步, 先用主机 GCC/Clang 编译一个初始版本的 Apple Clang, 然后再用这个初始版本的 Apple Clang 自举编译出最终版本的 Apple Clang.
接着需要拷贝 Mac 系统 SDK 给这个工具链. 最方便的做法是直接从一台 Mac 机器上打包. 在 Mac 上也克隆这个仓库, 然后调用脚本打包 SDK:
./tools/gen_sdk_package_tools.sh这会打包出好几个 SDK 版本, 全部复制到 Linux 机器的 osxcross/tarballs 目录下, 不用自己解压
scp Mac:/path/to/MacOSX*.tar.xz Linux:/path/to/osxcross/tarballs/接着回到 Linux 机器, 运行脚本配置工具链:
SDK_VERSION=26.2 TARGET_DIR=/opt/osxcross ./build.sh当获得的 SDK 有很多个版本的时候, 需要指定 SDK_VERSION 环境变量告诉脚本使用哪个版本的 SDK. TARGET_DIR 指定最终工具链的安装路径.
构建完成后你就获得一个可以在 Linux 上使用的 Apple Clang 交叉编译工具链了. 它们以 aarch64-apple-darwin-* 或者 arm64-apple-darwin-* 或者 arm64e-apple-darwin-* 为前缀. 或者也可以使用 xcrun clang 来调用这个工具链. 另外还提供了一个 toolchain.cmake 位于 TARGET_DIR 下面, 要在 CMake 中使用需要先导出环境变量:
export OSXCROSS_HOST=arm64-apple-darwin25.2
export OSXCROSS_TARGET_DIR=/opt/osxcross
export OSXCROSS_TARGET=darwin25.2
export OSXCROSS_SDK=/opt/osxcross/SDK/MacOSX26.2.sdk然后在 CMake 配置时指定 toolchain 文件:
cmake -DCMAKE_TOOLCHAIN_FILE=$OSXCROSS_TARGET_DIR/toolchain.cmake ..osxcross 配置好的 Compiler Driver 会自动处理标准库和运行时库的链接, 还有链接器的选择等问题.
用来编译 LLVM 的话, 只要指定以下核心参数
cmake ... \
-DCMAKE_TOOLCHAIN_FILE=$OSXCROSS_TARGET_DIR/toolchain.cmake \
-DLLVM_TARGETS_TO_BUILD="AArch64" \
-DLLVM_USE_LINKER=lld \
-DLLVM_ENABLE_LIBCXX=ON这会强制使用 libc++ 作为标准库, 并使用 lld 作为链接器. 要把编译好的文件传回 Mac 上使用, 可以按照下面的方式打包:
cmake --install . --prefix ./dist
cd dist
tar -czvf llvm-darwin-aarch64.tar.gz ./*将压缩包传回 Mac 上解压即可.
mkdir /path/to/install
tar -xzvf llvm-darwin-aarch64.tar.gz -C /path/to/install