複数バージョンのDコンパイラを切り替えて使う

趣味の開発にD言語を使いたくなったので 人生最良の選択 *1 をしようと思いました。

今までの僕のD言語の用途は専ら AtCoder だったので、ローカルにはジャッジ環境に合わせた DMD v2.070.1 をインストールしていたのですが、これは 人生最良の選択 としては少々古すぎます。 しかしながら AtCoder のためには古いバージョンも持っておきたい……というわけで表題の通りです。

Digger という bisect ツールがあるのですが、これが今回の目的にも使えそうな感じだったので使っていきます。 以下、OS は Window を想定していますが Linux などでも大差ないと思います(多分……)。

下ごしらえの手順は以下の通り:

  1. 最新の DMD をインストールする: https://dlang.org/download.html
    • 最新版なら dub も一緒にインストールされるはずです
  2. dub fetch digger で Digger をグローバルにインストールする
  3. 適当にディレクトリを掘る (以下ここを wd とします)
  4. wddub run digger -- build ... を実行し、古いコンパイラをビルドする

以上で wd/work 以下に古いコンパイラ(を動かすために必要なファイル群)が生成されます。

古いコンパイラを使いたいときには:

  1. wd に移動する
  2. dub run digger -- install

dmd --version でバージョンをチェックして古くなってたら成功です。

digger install現在のD環境を wd/work 以下のファイルで 部分的に 置き換えます。 その際、 <path to dmd>/.digger-install に元のD環境を復元するために必要な情報が格納されます。

元に戻すときには、dub経由せずdigger uninstall のように Digger の実行ファイルを直接叩きます(切り替え先のコンパイラのバージョンによっては dub run digger -- uninstall が動かない可能性があるからです)。 Windows の場合には digger.exeAppData\Local\dub\packages\digger-<version>\digger にあるはずです。