HomeArchiveBlog


Original contents are licensed under CC BY-NC 4.0. All rights reserved © 2026 Kai.
Back to Archives
Uncategorized: Miscellaneous Things

A collection of various topics and notes that don't fit into other categories.

Fri Dec 26 2025
Wed Dec 31 2025
MiscUncategorized
On this page
  • Miscellaneous Things
    • Cross-Compile LLVM for MacOS on Linux

Miscellaneous Things

Cross-Compile LLVM for MacOS on Linux

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