Swift Macro
不使用 Swift Package Manager
如何集成
Swift Macro
分为两部分,一部分为宏的具体实现(编译器插件),一部分为Macro Lib
用于导出宏定义以及所需要的附属代码,这里说的不使用SPM
指的是编译器插件这部分
仔细观察Xcode
使用SPM
集成Macro
时,在编译命令中通过-load-plugin-executable
参数指定了对应宏实现的插件可执行文件路径
同时在swift
源码中也找到了相关参数TypeCheckMacros.cpp TypeCheckMacros.cpp
从swift
源码中可得知,宏实现插件即可以是动态库(dylib)也可以是可执行文件
系统内置的宏实现是通过 -plugin-path <dylib path>
加载
内置的宏实现动态库在Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/Lib/swift/host/plugins
git clone https://github.com/unixzii/EnhancedMirror
cd EnhancedMirror
swift build
新建一个测试项目,并将EnhancedMirror/Sources/EnhancedMirror
下源文件拖动到测试项目中,只是方便测试,也可将其单独编译出framework
或者xcframework
在Xcode
Build Settings
中搜索OTHER_SWIFT_FLAGS
,并添加如下参数
-Xfrontend -load-plugin-executable -Xfrontend xxx/EnhancedMirror/.build/arm64-applemacosx/debug/EnhancedMirrorMacros#EnhancedMirrorMacros
然后正常编译
以动态库的方式就是将宏实现部分代码编译成 dylib,之后同样通过OTHER_SWIFT_FLAGS
添加参数
# 1 or #2
# 1
-Xfrontend -load-plugin-library -Xfrontend xx/libEnhancedMirrorMacros.dylib
# 2
-Xfrontend -external-plugin-path -Xfrontend < dylib path>
不能直接OTHER_SWIFT_FLAGS=-load-plugin-executable path/EnhancedMirrorMacros#EnhancedMirrorMacros
,因为OTHER_SWIFT_FLAGS
的参数会交给swiftc
,但是最终完成swift
源码编译的是swift-frontend
,因此需要通过-Xfrontend xxx
方式,之后swiftc
会将-Xfrontend
的参数传递给swift-frontend
先将宏实现代码编译成可执行文件或者dylib
然后在podspec
中添加上面所示的编译参数
Pod ::Spec . new do |spec |
spec . pod_target_xcconfig = {
"OTHER_SWIFT_FLAGS" => "-Xfrontend -load-plugin-executable -Xfrontend path/EnhancedMirrorMacros#EnhancedMirrorMacros"
}
spec . user_target_xcconfig = {
"OTHER_SWIFT_FLAGS" => "-Xfrontend -load-plugin-executable -Xfrontend path/EnhancedMirrorMacros#EnhancedMirrorMacros"
}
end