みずりゅの自由帳

主に参加したイベントやソフトウェア技術/開発について記録しています

tokyo.ex #13に参加して、Elixir本体をコンパイルしてきた

2019/09/29に、「tokyo.ex #13 elixir本体ソースコードもくもくリード会」に参加してきました。
今回は、fukuoka.ex さんとのオンライン接続によるコラボ開催(笑)です。

beam-lang.connpass.com

fukuokaex.connpass.com

そのイベントで、独自のコードを含めてElixirをコンパイルしてきたので、簡単に記録しておきます。

https://cdn-ak.f.st-hatena.com/images/fotolife/m/mzryuka/20190929/20190929202523.png


もくもく前の事前準備

ハヤブサさん@hayabusa333、おーはら@ohrdevさん、piacere@piacere_exさんがそれぞれ、各コミュニティの説明やソースコードリードに関係する内容についての説明をしてくださいました。
公開されている資料を載せておきます。

特に、おーはらさんの資料は、makeについても詳細に触れられていました。
最近ではmakeについて話を聞くことは少ないので、非常に貴重な内容であったと感じています。

また、piacereさんのお話を聴いていて、Elixirについては西日本側が勢いあるなぁ、と感じました。

もくもく

事前のインプットを終えたら、あとはひたすら黙々です。

手順としては、Erlangの用意も含めて以下の4点です。

  • 事前準備:Erlangをインストールしておく。(コンパイルElixirのバージョンに合わせたErlangのバージョンが必要)
  • GitHubに上がっているElixir本体のソースコードをcloneする。
  • 本体コードを修正する。
  • makeコマンドを実行する。

cloneするElixr本体のソースコードはこちらになります。

github.com

cloneした後で、elixirディレクトリに移動しておきます。

このディレクトリ直下にはMakefileがありますので、原則はこのディレクトリ上で、makeコマンドを実行していきます。

$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir

makeコマンドについては、特にオプションをつけずに実行して問題ありません。
ただし、一度makeコマンドを実行した後では、再びmakeする前にmake cleanを実施しておくのが良いです。これは、以前にコンパイルしていたファイルが悪さをする可能性があるためです。

やり忘れを防ぐためにも、セットで実行しておくのが良いでしょう。

$ make clean && make

コンパイルされた結果出来上がったElixirの実行コマンド(elixiriexmixなど)は、elixrディレクトリ配下のbinディレクトリ直下に配置されています。
まずは、コンパイルしたbin配下のelixirコマンドを発行してみましょう。

$bin/elixir --version
Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Elixir 1.10.0-dev (b23b94e) (compiled with Erlang/OTP 22)

これが確認できれば成功です。

それにしても、makeコマンドがこんな簡単に済むなんて、すごく久方ぶりな気がしています。
だいたい、何かしらのライブラリが足りないって怒られることが多かったのでw。

コードを修正してみる(出力されるバージョンを変える)

まずは既存のコードを修正してみます。
バージョンの内容は「VERSION」というファイル中に記載されています。

今回は、これを

1.10.0-dev

以下のように変更します。

1.10.0-dev-HHacking

その後、makeコマンドを実行し再コンパイルをします。
コンパイルが成功した後で、「 bin/elixir 」を実行してみます。

$bin/elixir --version
Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Elixir 1.10.0-dev-HHacking (b23b94e) (compiled with Erlang/OTP 22)

バージョンの表記が変わりました。

モジュールを追加してみる

続いて、独自のモジュールを追加してみます。

モジュールの追加手順は以下の2点です。

今回は、「 lib/elixir/lib/uramasu.ex 」というファイルでUramasuモジュールを用意してみます。
ElixirのコードはElixirで書かれています。Golangを思い起こさせますね。

defmodule Uramasu do
  @moduledoc ~S"""
  Uramasu module !
  - hello(yourname): output greeting message.
  """

  def hello(:usamaru), do: IO.puts "Pieeee!!!"
  def hello(:usako), do: IO.puts "Love!!!"
  def hello(:hiyoko), do: IO.puts "Piyo piyo"
  def hello(:kuma), do: IO.puts "..."
  def hello(x) do
    IO.puts "Hello. #{x}!!"
  end

end

続いて、このファイルをコンパイルさせるために、「 lib/elixir/src/elixir_compiler.erl 」ファイルを修正します。
具体的には、前述の「 uramasu.ex 」をコンパイル対象に追記します。
bootstrap_main() ->」という箇所があるので、以下のように「 <<"lib/elixir/lib/uramasu.ex">>, 」を追記してください。

〜(略)〜

bootstrap_main() ->
  [<<"lib/elixir/lib/kernel.ex">>,
   <<"lib/elixir/lib/uramasu.ex">>,
   <<"lib/elixir/lib/macro/env.ex">>,
   <<"lib/elixir/lib/keyword.ex">>,

〜(略)〜

その後、makeコマンドでコンパイルを実行します。
コンパイルが成功したら、iexを起動してみます。

$bin/iex
Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Interactive Elixir (1.10.0-dev-HHacking) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> h Uramasu

                                    Uramasu                                     

Uramasu module !

  • hello(yourname): output greeting message.

iex(2)> Uramasu.hello(:usamaru)
Pieeee!!!
:ok
iex(3)> Uramasu.hello(:usako)  
Love!!!
:ok
iex(4)> Uramasu.hello(:hiyoko)
Piyo piyo
:ok
iex(5)> Uramasu.hello(:kuma)  
...
:ok
iex(6)> Uramasu.hello(:mzryuka)
Hello. mzryuka!!
:ok
iex(7)>

独自モジュールが実行されました。


余談:懇親会

もくもく作業も終わり懇親会に突入です。
Fukuoka.exとは、懇親会中もオンラインでつながっていました。

Elixir系のイベントいうことで、先日の技術書典7で頒布したElixir本(=えりいざ本)も持参していきました。
Twitterにも書いていますが、強強の人に認識してもらいたくて。

そして、懇親会の場で同じテーブルになった主催のおーはらさんに、軽く読んでいただきました。
その際に「初心者には向いている本だと思います」というコメントをいただけました。

というわけで、Elixirの初心者にオススメする一冊としていかがですか?
とらのあな」さんで物理本を委託販売していますので、気になる方はどうぞ。
ec.toranoana.shop


コホン。話を戻します。

また、懇親会の場では、技術書典7で「えりいざ本」を数冊購入された、myasu@etcinitd さんにもお会いすることができました。(加えて、お名前を聞きそびれたのですが、同じく技術書典7で本を購入してくださった方ともお話できました。)

myasuさんは西日本に在住されているとのことですが、今日はたまたま用事があって関東の方に出てきてこのイベントに参加されたとのこと。技術書典7の際には運悪く入れ違いになったのですが、すぐに直接お会いする機会に恵まれたのは幸運でした。

myasuさんは、西日本側のElixirコミュニティでも活動されているということでした。加えて、Nerves+IoTを色々と普及させようと奮闘されているとのこと。
ですので、また別の機会にもお会いすることができそうです。直近では、11月30日にNervesを使ってイベント(「IoTをつくるよ2」)に参加されるとか。要チェック。

www.tsukuruyo.net

「IoTをつくるよ2」の参加についてはこちらから。

algyan.connpass.com


また、myasuさんのご好意で、Fukuoka.exの方々とオンラインで簡単にお話させていただくこともできました。「えりいざ本」の執筆者として、自分の書いた本がElixir普及の一端を担えれば嬉しいな、と思いました。