Swiftをbuildした話

千里の道も一歩から(どこへ向かってるのか?)

Swift1を使う人は多いけど、日常的にSwift(as プログラミング言語)をbuildしている人はおそらく500人以下 (2017/1現在)。

ということなので、とりあえず、ビルドしてみれば何かがわかるかもしれないということでビルドしてみました。

用意

  • Mac OS X Sierra and Xcode 8
  • Python2.x(SystemのものでOK). Python3.xは動かないので注意

あと、

brew install cmake ninja

あとはREADMEに沿って、ビルドして行く。

作業

READMEに書いてあるんですが、まずはroot directoryを作りましょう。

$ mkdir swift-resources

みたいな感じです。この中に大量のリソースがcheckoutされます。

全部うまく行くとこんな感じになるはず

swift-resources
	├── build
	├── clang
	├── cmark
	├── compiler-rt
	├── llbuild
	├── lldb
	├── llvm
	├── swift
	├── swift-corelibs-foundation
	├── swift-corelibs-libdispatch
	├── swift-corelibs-xctest
	├── swift-integration-tests
	├── swift-xcode-playground-support
	└── swiftpm

最終的に自分が実行したコマンドは

$ cd swift
$ utils/build-script -r

です。-rはdebuginfo付きのリリースビルドという意味らしいです。

ビルドすると、上記のようにbuildというディレクトリがswift-resourcesの中に作られます。
もしも、ビルドに失敗した、buildディレクトリを削除してから再コンパイルしましょう。
buildの中にはキャッシュファイルなどがあるので、何回も同じエラーが出てしまうことがあります。

コマンド実行後はじっくり待ちましょう。Machineが貧弱な場合、最悪1時間くらいかかります。2

いよいよ、自前のswiftが完成します。場所はbuild/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/binというところにあります。

build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/bin
	├── Benchmark_DTrace
	├── Benchmark_Driver
	├── Benchmark_GuardMalloc
	├── Benchmark_O
	├── Benchmark_Onone
	├── Benchmark_Ounchecked
	├── Benchmark_RuntimeLeaksRunner
	├── complete-test
	├── lldb-moduleimport-test
	├── sil-func-extractor
	├── sil-nm
	├── sil-opt
	├── sil-passpipeline-dumper
	├── sourcekitd-repl
	├── sourcekitd-test
	├── swift
	├── swift-api-digester
	├── swift-api-dump.py -> path-to/swift-resource/swift/utils/swift-api-dump.py
	├── swift-autolink-extract -> swift
	├── swift-demangle
	├── swift-format -> swift
	├── swift-ide-test
	├── swift-llvm-opt
	├── swift-reflection-dump
	├── swift-reflection-test-macosx-x86_64
	├── swift-remoteast-test
	└── swiftc -> swift

ここにswiftがあるというわけです。
作業的には、ビルドに時間がかかるという以外に特に難しいところはありません。

感想

ビルド時間が長すぎるので、開発するには何らかの自動ビルドは必須だと思われます。リモートでは、swift-ciというのが動いてるっぽい。
次はproject fileをxcodeで開いてみるかな。

Leave a Reply

Your email address will not be published. Required fields are marked *