CoreCLRをビルドしてみた連載:「○○してみた」日記

いまさら感が漂うが、CoreCLRをOS XとUbuntuでビルドしてみた。サクサクとビルドできるから皆さんもぜひビルドしてみよう!

» 2015年03月25日 15時58分 公開
[Insider.NET編集部かわさき しんじ]
連載:「○○してみた」日記
Insider.NET

 

「連載:「○○してみた」日記」のインデックス

連載目次

 今回はマイクロソフトが開発中の新たなアプリ開発/実行フレームワークである.NET Coreの実行エンジン「CoreCLR」をビルドしてみる。そもそも、「CoreCLRをビルドしてみよう」と思ったのははるか昔のことなのだが(CoreCLRがGitHubで公開された直後くらいだから2月の頭だ……)、ものぐさな体質だったりとか、当初はWindowsでも日本語環境ではそのままではビルドできなかったりなどの原因で今ごろになってこの日記を書いているという次第である(むしろ、ビルドできないのを日記にすべきという気がするのだが)。

 UbuntuでのCoreCLRのビルドについては、本サイトでもお世話になっている「しばやん」氏のブログ記事「.NET Core Runtime (CoreCLR) を Ubuntu 14.04 LTS 上でビルドして実行まで試してみた」が詳しいのでそちらも参照していただきたい。まあ、本稿ではOS XとUbuntuでビルドをしてみることにしよう(たいして違いはなかったぞ)。

ビルドの大まかな手順

 OS XとUbuntuでCoreCLRをビルドする手順はGitHubのCoreCLRリポジトリ内のドキュメント「OS X instructions」(OS X用。英語)と「Linux instructions」(Linux用。英語)でそれぞれ説明されている。ざっくりまとめると次のようになる。

  1. ビルドに必要なツールを用意する
  2. CoreCLRリポジトリの内容をローカルにクローンする
  3. CoreCLRをビルドする
  4. Windows環境でmscorlib.dllファイルを作成する
  5. HelloWorldプログラムを書いて実行してみる
  6. CoreFX(.NET Core用のライブラリ群)を必要に応じてビルドする(今回はここまではしない)

 それでは、OS XとUbuntuの両方の環境で実際にビルドをしてみよう。詳細に書くとエラいタイヘンなことになりそうなので、サクサクと進めていくことにする(日記だし)。

1. 必要なツールの準備

 まずは必要なツールを準備しよう。ここだけはOS XとUbuntuで別々に話をしておこう。

OS Xの場合

 OS Xではコンパイラー関連ツールとmono、CMake(ビルドツール)が必要になる。筆者の環境には、「ASP.NET 5をOS X/Linuxで使うための準備」で述べた手順でOS XにXRE(ASP.NET 5を実行するためのクロスプラットフォーム環境)をインストールしてあったので、「コマンドライン・デベロッパ・ツール」「Homebrew」「mono」がインストール済みで、追加で必要なのはCMakeのインストールだけだった。これも「brew install cmake」コマンドを実行すればよいだけだ。

 ASP.NET 5も使ってみようという方は、上記のページを参考に「コマンドライン・デベロッパ・ツール」と「Homebrew」をインストールして、ついでにXREまでインストールしてしまおう(XREと同時にmonoもインストールされる)。ASP.NET 5に興味のない方は、上記のページを参考に「コマンドライン・デベロッパ・ツール」と「Homebrew」をインストールした後に、別途monoをインストールしよう。どちらにせよ、その後にCMakeをインストールすれば、ツール類の準備は完了だ。

Ubuntuの場合

 Linux用のインストラクションによれば、必要なツールは以下のものだ。

  • CMake: ビルドツール
  • LLVM 3.5: 各種のコンパイラーを動作させるための基盤
  • Clang 3.5: LLVM上で動作するC/C++/Objective-Cコンパイラー
  • LLDB: デバッガー。ここではインストラクションに従って、lldb-3.6/lldb-3.6-devをインストールする
  • libunwind: プログラムのコールチェーンを決定/操作するためのツール

 ここではUbuntu 14.04 LTSを使用する。この場合、LLDB 3.6をインストールするためにリポジトリを追加する必要があるので、上記のインストラクションに従って以下を実行しておく。

$ echo "deb http://llvm.org/apt/trusty/ llvm-toolchain-trusty-3.6 main" | sudo tee /etc/apt/sources.list.d/llvm.list
$ wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add -
$ sudo apt-get update


LLDB 3.6をインストールするためにリポジトリを追加して、パッケージのリストを更新

 その後は「sudo apt-get install cmake llvm-3.5 clang-3.5 lldb-3.6 lldb-3.6-dev libunwind8 libunwind8-dev」コマンドを実行する。これで、必要なツールの準備は完了だ。

2. CoreCLRリポジトリの内容をローカルにクローン

 次に「git clone https://github.com/dotnet/coreclr」コマンドなどを実行して、ローカルリポジトリにCoreCLRリポジトリ内容を取り込む。あるいはリポジトリからZIPファイルをダウンロードして、適宜展開をしておこう。ここでは「~/work/coreclr」ディレクトリにリポジトリの内容が含まれているものとする。

3. CoreCLRをビルド

 CoreCLR本体のビルドはコマンド一発。リポジトリのルートディレクトリ(この場合は「~/work/coreclr」ディレクトリ)で以下のコマンドを実行するだけだ。

$ cd ~/work/coreclr
$ ./build.sh


CoreCLRのビルド

 ちょっと時間がかかるかもしれないが、必要なツールが用意されていれば、特に問題なくビルドできるはずだ。

 CoreCLRはリポジトリのルートディレクトリの下の「binaries/Product/mac.x64.debug」ディレクトリ(OS X)または「binaries/Product/linux.x64.debug」(Linux)に作成される。CoreCLRの本体は「libcorclr.dylib」ファイル(OS X)/「libcorclr.so」ファイル(Ubuntu)だ。

 これ以外には「corerun」ファイルが重要となる。CoreCLR環境ではここからプログラムが起動される。例えば、「./corerun Program.exe」のようにこのファイルにプログラムファイルを渡すと、CoreCLRが起動し、corerunコマンドの引数に指定したプログラムがランタイムに引き渡されて実行される(monoにおける「mono」コマンドに相当)。ただし、実際にプログラムを実行するには「mscorlib.dll」ファイルが必要なので、次にこれを作成する。

4. Windows環境でmscorlib.dllファイルを作成

 本稿執筆時点では、OS X/Linuxでmscorlib.dllファイルを作成することがまだできないので、Windowsでこれを作成する必要がある。WindowsでCoreCLRやOS X/Linux用のmscorlib.dllファイルを作成するための要件は「Windows instructions」にまとめられているので参照されたい。簡単にいえばVisual Studio 2013 Community以上/CMake 3.0.2/PowerShell/Git関連ツールがインストールされていればよい。

 気を付けるところはVisual Studio 2012をインストールした環境にVisual Studio 2013をインストールした場合に、DIA SDKがVisual Studio 2013のディレクトリに作成されない点くらいだ(上記ページの「Known Issues」を参照)。この場合は、DIA SDKをVisual Studio 2013のインストールディレクトリにコピーしておく必要がある。

 なお、上記ページに記載されている要件は基本的にWindowsでCoreCLRをビルドするために必要なものだ。この要件にはCMakeが含まれているものの、OS X/Linux用のmscorlib.dllファイルを作成するだけなら、CMakeは不要だ。実質的にはVisual Studio 2013がインストールされてさえいればよいともいえる。というわけで、mscorlib.dllファイルを作成するだけなら、本サイトの読者のほとんどは何もする必要はないだろう。とはいえ、ここまできたら一蓮托生。CMakeもインストールして、WindowsでもCoreCLRをビルドしてみよう(筆者はそこまでしていないが)。

 準備ができたらGitHubからCoreCLRリポジトリの内容をクローンして、リポジトリのルートディレクトリで以下のコマンドを実行する。

$ build.cmd unixmscorlib


OS X/Linux用のmscorlib.dllファイルの作成

 これでmscorlib.dllファイルが「binaries/intermediates/Unix.x64.debug」ディレクトリに作成される(CoreCLRは「binaries/Product/XXX.x64.debug」ディレクトリに作成されたが、ここで必要になるmscorlib.dllファイルは「binaries/intermediates/Unix.x64.debug」ディレクトリに作成されるので注意しよう)。作成されたファイルはOS X/Linuxのどちらの環境でも利用可能だ。

 mscorlib.dllファイルができたら、これを何らかの方法でOS Xマシン/Linuxマシンにコピーする。コピー先は取りあえずCoreCLRのバイナリがあるディレクトリにしておけばよい(binaries/Product/XXX.x64.debugディレクトリ)。

5. HelloWorldプログラムを書いて実行してみる

 最後に、以下のようなHelloWorldプログラムを書いて、実行してみる。

using System;

namespace test
{
  public class Program
  {
    public static void Main(string[] args)
    {
      Console.WriteLine("Hello from OS X/Ubuntu");
    }
  }
}

HelloWorldプログラム(Program.csファイル)

 ソースコードはCoreCLRとcorerunコマンド、mscorlib.dllファイルが格納されているディレクトリに作成しておこう(これはコマンドラインでいろいろと指定をしなければならないので、その指定が面倒にならないようにするためだ)。

 ソースコードを作成したら、コンパイルをする。これにはmonoが提供するC#コンパイラーを使用する(mcsコマンド)。

$ mcs -nostdlib -r:mscorlib.dll Program.cs


ソースコードのコンパイル

 コンパイル時には「-nostdlib」オプションと「-r:mscorlib.dll」オプションを指定する。前者は、コンパイル時にデフォルトで参照されるアセンブリを全て参照しないように伝えるものだ。後者は先ほど作成したmscorlib.dllファイルを参照するように指定している。

 コンパイルが成功すると、「ソースコードのベースネーム+.exe」という名前のファイルが作成される(この場合は「Program.exe」)。最後に、これを実行してみる。

$ ./corerun Program.exe
Hello from OS X/Ubuntu


プログラムの実行

 以上で、CoreCLRとcorerunコマンド、mscorlib.dllファイルのビルドがうまくいったことが確認できた。めでたし。めでたし。

 自分でやってみると分かるが、Windows以外の環境でもCoreCLRがビルドできて、実際にプログラムが動作してしまうのを体験できるのが楽しい。ビルドも今なら素直に通るし。といっても、苦労してコンパイルを通すのが楽しい人もいるだろう。そうした方々は安定バージョンではなく、開発バージョンのビルドに突撃してもよいだろう。この楽しさはMINIX(古い)やLinuxなんかのOSを自分で再コンパイルして、あれこれ試してみて……といった世界に通じるものがある(自作PCの楽しさにも似ている)。興味のある方はぜひビルドしてみてほしい。

で……?

 と、ここまで話がうまく進んだように思えるが、実際にはそうでもない。GitHubの「dotnet/corefxlab」リポジトリでは、上記の単なるHelloWorldプログラムよりも少々複雑なコンソールアプリが公開されている。そして、このアプリは上記の作業だけではうまくコンパイル/実行できないのだ。これにはやはりCoreFXライブラリのコンパイルが必要になる。というわけで、この日記、次回に続く……(早めに続き書きます……)。

「連載:「○○してみた」日記」のインデックス

連載:「○○してみた」日記

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。