xcode替换LLVM插件

一、查找LLVM

1、当前你使用的xcode对应的LLVM版本

复制代码
✗ swift --version
swift-driver version: 1.127.14.1 Apple Swift version 6.2.1 (swiftlang-6.2.1.4.8 clang-1700.4.4.1)
Target: arm64-apple-macosx15.0

可以看出我们使用的swift版本在6.2之后

复制代码
✗ clang --version
Apple clang version 17.0.0 (clang-1700.4.4.1)
Target: arm64-apple-darwin24.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

说明我们使用的clang在17.0

2、找到相同的版本源码

查看https://github.com/swiftlang/llvm-project/blob/swift-6.0-RELEASE/llvm/utils/gn/secondary/llvm/version.gni

可以看到其使用的llvm版本为17

复制代码
llvm_version_major = 17
llvm_version_minor = 0
llvm_version_patch = 6
llvm_version = "$llvm_version_major.$llvm_version_minor.$llvm_version_patch"

从https://github.com/swiftlang/llvm-project/tags?after=swift-6.3-DEVELOPMENT-SNAPSHOT-2025-12-01-a

选择我们的的llvm源码下载:

https://github.com/swiftlang/llvm-project/releases/tag/swift-6.2.3-RELEASE 现在zip后解压出llvm-project-swift-6.2.3-RELEASE文件

二、编译llvm和插件

1、插件

插件放在在llvm-project-swift-6.2.3-RELEASE/llvm/lib/Transforms目录下,如果是有我们自己定义的插件(MyPlugin),需要在CMakeLists.txt增加add_subdirectory(MyPlugin)

2、cmake

在根目录下创建build目录,cd到该目录下,执行命令(或者写一个sh文件去运行):

复制代码
cmake -G Xcode\
  -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra' \
  -DLLVM_ENABLE_PLUGINS=ON \
  -DLLVM_BUILD_LLVM_DYLIB=ON \
  -DCLANG_BUILD_EXAMPLES=OFF \
  -DLLVM_TARGETS_TO_BUILD=Native \
  -DCMAKE_INSTALL_PREFIX=/usr/local/llvm-26 \
  ../llvm

会在目录下生成一个xcode工程

3、编译

打开LLVM.xcodeproj文件,选中Manage Schemes ,选择llvm、MyPlugin创建target

然后分别build,编译出产物

复制代码
build/Release/lib/MyPlugin.dylib
build/Release/bin/clang
build/Release/bin/clang++

三、替换xcode编译器

在我们业务工程的podfie中设置post hook,在pod install后修改xcconfig配置环境变量,指定为我们编译出来的clang产物

复制代码
 # 获取插件路径
  llvm_plugin_path = "....llvm-project-swift-6.2.3-RELEASE/build/Release/lib/MyIRPlugin.dylib"
  llvm_clang_path = "...llvm-project-swift-6.2.3-RELEASE/build/Release/bin/clang"
  llvm_clangpp_path = "...lllvm-project-swift-6.2.3-RELEASE/build/Release/bin/clang++"
  
  # 遍历所有 Pod 目标
  installer.pods_project.targets.each do |target|

    # 为每个目标设置编译器和插件选项
    target.build_configurations.each do |config|
      # 获取当前配置
      xcconfig_path = config.base_configuration_reference.real_path
      xcconfig = File.read(xcconfig_path)
      
      # 添加 LLVM 插件配置
      new_xcconfig = xcconfig + <<~EOF
      
        CC=#{llvm_clang_path}
        CXX=#{llvm_clangpp_path}
        OTHER_CFLAGS = $(inherited) -fpass-plugin=#{llvm_plugin_path} -O1
        OTHER_CPLUSPLUSFLAGS = $(inherited) -fpass-plugin=#{llvm_plugin_path} -O1
        
      EOF
      
      # 写回配置文件
      File.write(xcconfig_path, new_xcconfig)
    end
  end

pod install后重启xcode生效

相关推荐
kite01211 天前
TraeCode 与 TraeWork 合并:AI 时代 IDE 的三种形态与未来开发工具
ide·ade·traework·traecode
weixin_461769401 天前
VS Code 中创建 Jupyter 文件(.ipynb)
ide·python·jupyter
浪潮IT馆1 天前
Android Studio 非最新版本下载安装教程
android·ide·android studio
慧都小项1 天前
组件改名,引用同步更新:WebStorm的重构能力用在哪里?
ide·重构·webstorm
Lancker1 天前
没有 Mac 也能上架 iOS:GitHub Actions 全自动构建 + 签名 + TestFlight 送审实录
macos·ios·github
fei_sun2 天前
RIB、FIB、MAC 、ARP 表
服务器·网络·macos
Highcharts.js2 天前
如何在macOS桌面应用集成Highcharts
macos·highcharts·前端可视化·交互图表
zaemyn20202 天前
macOS 上 AccessClient 无法唤起?排查 Python 架构与 Windows App 识别问题
windows·python·macos·远程桌面·accessclient
*wait for?2 天前
VScode使用uv-创建python虚拟环境
ide·vscode·编辑器
殷忆枫3 天前
基于STM32的独居老人语音/一键双模紧急呼救系统设计与实现
stm32·嵌入式硬件·xcode