我正在阅读 github 上的 swift 源代码,我注意到有扩展名为 gyb 的文件,例如Swift github Integers.swift.gyb .
我做了一些研究,我认为(如果我错了请纠正我)gyb 是 swift 团队编写的预处理器,这样他们就不必编写重复的代码,例如不必为不同的 int 类型编写许多不同版本的代码,它们之间的差异很小。
但是我真的不明白写gyb文件的python代码。有什么办法可以把那些gyb文件转换成swift代码吗?所以有可能研究多快,例如int类型实现了吗?
最佳答案
你可以做的是:
- 按照 https://github.com/apple/swift 中的说明获取 Swift 源代码.
- 安装编译源代码的先决条件(cmake、ninja、...)
然后使用“详细选项”编译源代码:
cd swift-source/swift utils/build-script --verbose
这显示了所有执行的命令,包括那些预处理 .gyb
的命令
文件。特别是你会发现类似的东西
/usr/bin/python /path/to/swift-source/swift/utils/gyb -DunicodeGraphemeBreakPropertyFile=/path/to/swift-source/swift/utils/UnicodeData/GraphemeBreakProperty.txt -DunicodeGraphemeBreakTestFile=/path/to/swift-source/swift/utils/UnicodeData/GraphemeBreakTest.txt -DCMAKE_SIZEOF_VOID_P=8 -o /path/to/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/8/Integers.swift.tmp Integers.swift.gyb && /opt/local/bin/cmake -E copy_if_different /path/to/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/8/Integers.swift.tmp /path/to/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/8/Integers.swift && /opt/local/bin/cmake -E remove /path/to/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/8/Integers.swift.tmp
这表明 Python 脚本 swift-source/swift/utils/gyb
被调用到
预处理Integers.swift.gyb
文件,结果复制到
/path/to/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/8/Integers.swift
你也可以自己调用脚本,使用上面的命令作为模板:
cd swift-source/swift/stdlib/public/core /usr/bin/python /path/to/swift-source/swift/utils/gyb \\ -DunicodeGraphemeBreakPropertyFile=/path/to/swift-source/swift/utils/UnicodeData/GraphemeBreakProperty.txt \\ -DunicodeGraphemeBreakTestFile=/path/to/swift-source/swift/utils/UnicodeData/GraphemeBreakTest.txt \\ -DCMAKE_SIZEOF_VOID_P=8 \\ -o Integers.swift.tmp Integers.swift.gyb
关于ios - 如何将gyb文件转换成swift代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43224203/