Swift コンパイラーをビルドする環境を Fork したリポジトリーから作成する

Swift プログラミング

Swift コンパイラーのビルド環境を自分で Fork したリポジトリーからビルド環境を整える場合はどうしたら良いのか調べてみました。


以前に こちら で、Apple 公式のリポジトリーから Swift コンパイラーのビルド環境を整える方法を綴ってみましたけれど、今回は 自分で Fork したリポジトリーからビルド環境を整える場合はどうしたら良いのか について調べてみることにしました。

必要なリポジトリーを Fork する

自分で Fork したリポジトリーを使って Swift コンパイラーのビルド環境を作るために、まずは必要なリポジトリーを Apple から Fork します。Swift コンパイラーは複数のリポジトリーで構成されていて、必要なリポジトリーだけ Fork すれば大丈夫そう な様子でしたけど、今回は試しに次のすべてのリポジトリーを Fork しておくことにしました。

これらの Fork したリポジトリーをすべて利用した Swift コンパイラーのビルド環境を整えてみることにします。

Swift コンパイラーのビルド環境を構築する

基本的な流れは こちら で記したのと同じです。その記事の中の ソースコードセットを取得する のところが僅かに変わる感じです。

Fork した Swift リポジトリーをクローンする

この手順が必要なのは apple/swift リポジトリーを 公式のものの代わりに自分で Fork したものを使いたい場合 に限られますけど、まずは swift_source ディレクトリーに、自分で Fork したリポジトリーをクローンするところから始めます。

git clone git@github.com:es-kumagai/swift.git

今回は ssh のアドレスを使ってクローンしましたけど、HTTP が良ければ https のアドレスを使ってクローンします。クローンするリポジトリーが Apple 公式から自分のリポジトリーに変わるだけで、それ以外はまったく同じです。

構成リポジトリーを Fork したリポジトリーから取得する

続いて、Swift コンパイラーのビルドで使うリポジトリーを、自分で Fork したリポジトリーから取得できるようにします。そのために、まずは swift/utils/update-checkout-config.jsonswift_source/ ディレクトリー直下にコピーしておきます。

cp swift/utils/update-checkout-config.json .

そうしたら、この ファイル内 に記載されている repos の中から、Fork したリポジトリーに差し替えたいところの apple/ のところを Fork 先のユーザー名に書き換えます。

    "repos" : {
        "llvm": {
            "remote": { "id": "apple/swift-llvm" } },
        "clang": {
            "remote": { "id": "apple/swift-clang" } },
        "swift": {
            "remote": { "id": "apple/swift" } },
        "lldb": {
            "remote": { "id": "apple/swift-lldb" } },
        "cmark": {
            "remote": { "id": "apple/swift-cmark" } },
        "llbuild": {
            "remote": { "id": "apple/swift-llbuild" } },
        "swiftpm": {
            "remote": { "id": "apple/swift-package-manager" } },
        "compiler-rt": {
            "remote": { "id": "apple/swift-compiler-rt" } },
        "swift-corelibs-xctest": {
            "remote": { "id": "apple/swift-corelibs-xctest" } },
        "swift-corelibs-foundation": {
            "remote": { "id": "apple/swift-corelibs-foundation" } },
        "swift-corelibs-libdispatch": {
            "remote": { "id": "apple/swift-corelibs-libdispatch" } },
        "swift-integration-tests": {
            "remote": { "id": "apple/swift-integration-tests" } },
        "swift-xcode-playground-support": {
            "remote": { "id": "apple/swift-xcode-playground-support" } },
        "ninja": {
            "remote": { "id": "ninja-build/ninja" } }
    },

今回はすべての Apple 公式リポジトリーを自分自身で Fork したリポジトリー(es-kumagai/)に差し替えてみようと思うので、次のコマンドを使って一括で編集してみることにしました。全部を変える必要がなければ、テキストエディター等で必要な部分だけを書き換えれば大丈夫です。

sed -i -e 's/\bapple\//es-kumagai\//g' update-checkout-config.json

このようにしたら、あとはこの update-checkout-config.json を指定して update-checkout コマンドを実行します。

./swift/utils/update-checkout --config ./update-checkout-config.json --clone-with-ssh

直接 update-checkout-config.json を書き換えても良いのですけど、今回はなるべく元のリポジトリーに影響しないように swift_source ディレクトリーにコピーしてから編集することにしました。

環境準備、完了

これで Fork したディレクトリーを使った Swift コンパイラーのビルド環境を作ることができた様子です。 これ以降は update-checkout コマンドを --config を指定しないで使っても origin に対して git 命令が発行される様子なので、普段どおりに操作することができそうです。

ところで、このようにして Fork したリポジトリーで環境を構築してみましたけれど、公式とは完全に独立したリポジトリーで Swift を作っていくような場合とかでなければ、このようにしても 意味がないような 気もします。

普段それほど git に親しんでないので詳しいことはわからないのですけど、複数のリポジトリーで構成されている都合、公式の更新を取り込むのも煩雑になりそうですし、 おそらく普通は Apple 公式のものを http のアドレスでクローンして、fork したリポジトリーをリモートリポジトリーとして ssh のアドレスで追加して運用するのが良いのかなって思ったりしました。