Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ruby build

369 views

Published on

Fixing rbenv/ruby-build for FreeBSD-11.0R

Published in: Software
  • Hello! Who wants to chat with me? Nu photos with me here http://bit.ly/helenswee
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

Ruby build

  1. 1. rbenv/ruby-build の直し方 FreeBSD 11.0 でも rbenv を使いたい! 2017年1月23日 (株)創夢 内藤 祐一郎
  2. 2. はじめに より正確には rbenv install がエラーになる。 10.3 のときは問題なかった。 11.0 で何が問題なのか調べてみました。 FreeBSD 11.0 で rbenv が動かない!?
  3. 3. エラーメッセージ $ rbenv install 2.3.3 Downloading ruby-2.3.3.tar.bz2... -> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.3.tar.bz2 Installing ruby-2.3.3… (中略) The Ruby readline extension was not compiled. ERROR: Ruby install aborted due to missing extensions Configure options used: --prefix=/home/yuichiro/.rbenv/versions/2.3.3 CFLAGS= -O3 -Wno-error=shorten-64-to-32 LDFLAGS=-L/home/yuichiro/.rbenv/versions/2.3.3/lib CPPFLAGS=-I/home/yuichiro/.rbenv/versions/2.3.3/include → readline がないと言われている。
  4. 4. 11.0 の readline (リリースノートの抜粋) 4.7. Runtime Libraries and API The readline(3) library is now statically linked in software within the base system, and the shared library is no longer installed, allowing the Ports Collection to use a modern version of the library. [r268461] リリースノートによると readline(3) は 共有ライブラリとしてはインストールされないとのこと。 ベースシステムで使っているソフトウェアは 全てスタティックリンクされました。
  5. 5. 11.0 のreadline アプリケーションが使うにはどうするのか? → ports/devel/readline を使えばよい。 ちなみに ports/lang/ruby22では configure のオプションに “--with-readline-dir=${LOCALBASE}” を渡しています。
  6. 6. ruby-build を修正する ruby-buildでも同じようにします。 1. FreeBSD-11.0 以上の場合、かつ 2. pkg info -e readline が TRUE なら --with-readline-dir を追加する。 3. pkg info -e libedit が TRUE なら --with-libedit-dir –と enable-libedit を 追加する。
  7. 7. ruby-build の Pull Request 1. 以上の修正でコンパイルできるようになった のでPull Request を送りました。 2. ports の openssl を使いたいらしいとの 意見があり対応しました。 3. コードのスタイルについて細かく具体的に指 摘をもらいましたので修正しました。 4. テストが通らないよ!
  8. 8. ruby-buildのテスト ● GitHub で Pull Request を作成すると自 動的に実行されます。 ● 結果は GitHubのコミットから参照可能。 ● ruby-build では Travis CI が使われていま した。
  9. 9. Travis CI ● 継続的インテグレーションツール ● ruby-build では以下のテストを実行します。 install: git clone --depth 1 https://github.com/sstephenson/bats.git script: PATH="./bats/bin:$PATH" script/test <ruby-build/.travis.ymlからの抜粋>
  10. 10. bats ● bash スクリプトのテストフレームワーク ● テスト用の拡張表記 @test を有効にしてくれ ます。 ● テストコードを実行するために必要です。 ● .travis.yml にかかれている通り git clone すれば使えます。
  11. 11. テストのエラー ● エラーメッセージは次の通り。 ✗ number of CPU cores is detected on Mac (from function `unstub' in file test/test_helper.bash, line 73, in test file test/build.bats, line 245) `unstub uname' failed ✗ number of CPU cores is detected on FreeBSD (from function `unstub' in file test/test_helper.bash, line 73, in test file test/build.bats, line 269) `unstub uname' failed
  12. 12. テストのエラー ● Mac のテストなど今回の修正とは無関係と思 われる部分でエラーになっている。 ● よく見るとエラーのメッセージはほぼ同じ。 ● unstab uname とやらでエラーになってい るっぽい。
  13. 13. テストコード ● テストコードは次のようになっていました。 @test "number of CPU cores is detected on FreeBSD" { cached_tarball "ruby-2.0.0" stub uname '-s : echo FreeBSD' false stub sysctl '-n hw.ncpu : echo 1' stub_make_install export -n MAKE_OPTS run_inline_definition <<DEF install_package "ruby-2.0.0" "http://ruby-lang.org/ruby/2.0/ruby-2.0.0.tar.gz" DEF assert_success unstub uname (省略) }
  14. 14. stub uname ● stub uname とは何か? 1. uname コマンドをラップするもの 2. 引数に渡された内容を実行し結果を返す。 3. “-s : echo FreeBSD”ならば uname -s の呼び出 し時に “FreeBSD” を表示する。 4. 呼び出される回数分、処理内容を記載する。 5. “-s : echo FreeBSD” “-r : echo 11.0-R” など
  15. 15. unstub uname ● stub uname に渡したリスト以上に uname コマンドが実行されるとエラー。 ● unstub uname は再度 uname を実行し リストが空でないことを確認する。
  16. 16. テストを通す ● ruby-build で FreeBSD であることの判 定に uname -s を、バージョン番号の判定 に uname -r を追加した。 ● よってテストの stub uname の引数が足り ない。 ● エラーになるテストに不足分を追加しました。
  17. 17. FreeBSD でテストを通す ● Travis は Linux 環境でテストするため、 FreeBSD ではテストスクリプトが動作しま せんでした。 ● 開発にとっても不便なので、FreeBSDでも テストを通したい!
  18. 18. テストスクリプトの変更点 ● /bin/bash 決め打ちを /usr/bin/env bashに変更します。 ● /usr/local/bin に PATH を通します。 ● Linux 用のテストに stub uname “-s : Linux” を入れます。 →以上で FreeBSD でテストが通ります!
  19. 19. gcc での問題点 ● pkg install gcc をするとコンパイルエラーになります・・・ ● cc が clang の場合、 ruby-build が "-Wno-error=shorten-64-to-32" を CFLAGS に追加する。 ● しかし、gcc がインストールされているとconfigure スクリプトが "gcc -Wno-error=shorten-64-to-32" でコンパイルするが、"- Wno-error=shorten-64-to-32" は gcc ではサポートされてないためエラーとなる。 ● gcc がインストールされていない時にのみ "-Wno-error=shorten-64-to-32" をつけるようにしました。 ● 現在 Pull Request 送信中です。
  20. 20. Rubinius ● rubinius がコンパイルできません・・・ ● 原因は以下の3つです。 1. llvm 2. readline 3. cc & c++ ラッパー
  21. 21. llvm ● llvm[37|38|39|-devel]のバージョン番号を いれて、llvm-config[37|38|39|-devel] を呼び出すように configure オプションを作 成します。
  22. 22. readline ● configure オプションに “--with-opt-dir=/usr/local” を渡すようにします。
  23. 23. cc & c++ ラッパー ● rubinius の ビルドスクリプトが cc → clang[37|38|39|-devel] c++ → clang++[37|38|39|-devel] へのリンクを張ります。 ● しかし、ports の /usr/local/bin/clang* はラッパースクリプトで、 “/usr/local/llvm37/bin/$0” のような呼び出しをします。
  24. 24. cc & c++ ラッパー ● “/usr/local/llvm37/bin/cc” は存在しないた め、コンパイラ呼び出しがエラーになります。 ● 回避策としては ports/lang/rubinusと同様に rubinius のラッパーを書き換えるのが良さそうで す。 ● こちらは Pull Request を作成するべく現在英 作文中です。
  25. 25. おわり FreeBSD 11.0 で rbenv が使えます!

×