しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

.NET Core Runtime (CoreCLR) を Ubuntu 14.04 LTS 上でビルドして実行まで試してみた

以前、Raspberry Pi 2 で .NET Core Runtime (CoreCLR) をビルドしようとして挫折しましたが、x64 な Ubuntu を使えば問題なくビルドと実行が出来たので、内容をメモ程度に残しておきます。

基本的な手順は CoreCLR の GitHub Wiki にまとまっています。この通りに動かすのが目的です。

Building and Running CoreCLR on Linux · dotnet/coreclr Wiki · GitHub

実行するための、大まかな手順をまとめておきます。途中で Visual Studio 2013 が必須になったりするので、まだまだ粗削りという感じがしますね。

  1. CoreCLR を Ubuntu 上でビルド
  2. mscorlib.dll と CoreFX を Windows でビルド
  3. NuGet からパッケージをダウンロード、ASP.NET Core 5 向けパッケージのみコピー
  4. mcs を使って実行ファイルを作成
  5. corerun コマンドで実行

とりあえず、自分がはまった部分を中心にメモを残しておきます。

CoreCLR をビルド

Wiki の通りに LLVM や Clang をインストールして build.sh を実行しましたが、PAL のビルド付近でエラーになってしまう問題に直面しました。

関連するのか分かりませんが、以下の Issue にあったコマンドを使って、パッケージをインストールしたところ、問題なく最後までビルドが通るようになりました。

該当するコメント部分を引用しておきます。

Just FYI. I was able to compile without errors before the patch using these commands on fresh Ubuntu 14.04, but there were no binaries in Product directory.

sudo apt-get install git cmake clang-3.5 make llvm-3.5 gcc
git clone https://github.com/dotnet/coreclr
cd coreclr
./build.sh
Can't built on Ubuntu 14.04 · Issue #33 · dotnet/coreclr · GitHub

ビルド自体は 10-15 分ぐらいで終わった気がします。割とコンパイルは早かったです。

CoreCLR のビルド結果としては corerun と libcoreclr.so が重要なものとなります。特に libcoreclr.so は 90MB もある巨大なライブラリで、この中に GC や JIT が入っているわけです。

f:id:shiba-yan:20150311150520p:plain

corerun は mono コマンドみたいなものです。実行ファイルを与えると、それを実際に動かしてくれます。

mscorlib.dll と CoreFX をビルド

これからは Visual Studio 2013 が入った Windows 上での作業となります。同じように CoreCLR と CoreFX の Git リポジトリをクローンしておきます。

Unix 向けの mscorlib.dll を作るには CoreCLR リポジトリの build.cmd にパラメータを渡すだけです。CMake は必要なので、予めパスを通しておきます。

coreclr> build.cmd unixmscorlib

これで Unix 向けの mscorlib.dll がビルドされます。

次に CoreFX リポジトリで Unix 向けに各ライブラリをコンパイルします。

corefx> build.cmd /p:OS=Unix /p:SkipTests=true

今回は System.Console.dll と System.Diagnostics.Debug.dll だけが必要なので、その 2 つだけを Ubuntu 上にコピーしておきます。

その後は Wiki の通りに NuGet から必要なパッケージをインストールして、ASP.NET Core 5 向けの dll だけコピーする必要がありますが、このあたりは特にはまることもないので省略します。

CoreCLR でアプリケーションを実行

用意されている HelloWorld.cs をダウンロードして、mcs を使って実行ファイルを作成します。後はその実行ファイルを corerun に与えると、コンソールアプリケーションとして動作します。

./corerun HelloWorld.exe linux

実行した結果は以下のような感じです。Linux のマスコットが表示されていますね。

f:id:shiba-yan:20150311144736p:plain

まだかなり粗削りな部分もありましたが、実際に動作しているものを見ると興奮してきますね。パフォーマンスや ARM 対応など、まだ課題も多いはずですが、引き続き追いかけていきたいですね。

f:id:shiba-yan:20150311152958p:plain

ちなみに、ちょっと前に OS X 向けの Travis CI 環境が追加されるようになりました。既に Xcode 付属の環境で CoreCLR のビルドが可能になっているようです。

追記

上のコマンドでビルドするとデバッグモードのバイナリが吐かれるので、リリースモードにしてもう一度ビルドしました。ちなみにコマンドは以下のような感じに。

./build.sh amd64 release

当然ですが、リリースの方がコンパイルに時間がかかりました。A2 インスタンスで 20 分ぐらいです。

f:id:shiba-yan:20150311192334p:plain

ファイルサイズは libcoreclr.so が 12MB と、90MB だったのと比べて大幅に縮みました。