@Zhang wrote:
出于这样那样的原因我们时常需要自己编译一份Swift的编译器来使用。Apple官方在这方面的文档几乎没有。
首先你需要将以下文本保存到
~/.swift-build-presets
这个文件里[preset: LocalReleaseToolchain] ios tvos watchos lldb llbuild swiftpm playgroundsupport release compiler-vendor=apple dash-dash lldb-no-debugserver lldb-use-system-debugserver lldb-build-type=Release verbose-build build-ninja build-swift-static-stdlib build-swift-static-sdk-overlay playgroundsupport-build-type=Release skip-test-ios-host skip-test-tvos-host skip-test-watchos-host skip-test-ios skip-test-tvos skip-test-watchos skip-test-osx skip-test-cmark skip-test-lldb skip-test-swift skip-test-llbuild skip-test-swiftpm skip-test-xctest skip-test-foundation skip-test-libdispatch skip-test-playgroundsupport skip-test-libicu install-swift install-lldb install-llbuild install-swiftpm install-playgroundsupport install-destdir=%(install_destdir)s darwin-install-extract-symbols # Path where debug symbols will be installed. install-symroot=%(install_symroot)s # Path where the compiler, the runtime and the standard libraries will be # installed. install-prefix=%(install_toolchain_dir)s/usr # Executes the lit tests for the installable package that is created # Assumes the swift-integration-tests repo is checked out test-installable-package # If someone uses this for incremental builds, force reconfiguration. reconfigure swift-install-components=compiler;clang-builtin-headers;stdlib;swift-syntax;sdk-overlay;license;sourcekit-xpc-service;swift-remote-mirror;swift-remote-mirror-headers llvm-install-components=libclang;libclang-headers # Path to the .tar.gz package we would create. installable-package=%(installable_package)s # Path to the .tar.gz symbols package symbols-package=%(symbols_package)s # Info.plist darwin-toolchain-bundle-identifier=%(darwin_toolchain_bundle_identifier)s darwin-toolchain-display-name=%(darwin_toolchain_display_name)s darwin-toolchain-display-name-short=%(darwin_toolchain_display_name_short)s darwin-toolchain-name=%(darwin_toolchain_xctoolchain_name)s darwin-toolchain-version=%(darwin_toolchain_version)s darwin-toolchain-alias=%(darwin_toolchain_alias)s
这是个基于官方编译预设(叫做Build Preset)的配置按照我们的需求定制的预设,主要的好处是:
- 跳过了debugserver的编译(省去对debugserver进行代码签名)
- 跳过了所有耗时的测试用例
- 在Release模式下编译,默认的Toolchain脚本用Debug模式需要将近40GB的硬盘空间
然后我们正常clone一份Swift的源码:
mkdir SwiftSRC && git clone https://github.com/apple/swift.git -b swift-5.0-branch
更新Swift的其他组件:
swift/utils/update-checkout --clone
这个步骤取决于你的网速可能需要半个小时左右。
然后这里可以更改SwiftSRC/LLVM目录下的LLVM源码树来注入混淆Pass, 具体可以参见我的博客
然后修改Swift的工具链编译脚本
SwiftSRC/swift/utils/build-script
, 将如下部分:./utils/build-script ${DRY_RUN} ${DISTCC_FLAG} --preset="${SWIFT_PACKAGE}" \ install_destdir="${SWIFT_INSTALL_DIR}" \ installable_package="${SWIFT_INSTALLABLE_PACKAGE}" \
中的
${SWIFT_PACKAGE}
修改为我们一开始创建的Preset的名称,此处为LocalReleaseToolchain
,修改后变为--preset="LocalReleaseToolchain"
最后正常编译,在SwiftSRC目录下执行
swift/utils/build-toolchain 任意名称
即可,全程需花费3小时左右。
Posts: 1
Participants: 1