SlideShare ist ein Scribd-Unternehmen logo
1 von 25
rbenv/ruby-build の直し方
FreeBSD 11.0 でも rbenv を使いたい!
2017年1月23日
(株)創夢 内藤 祐一郎
はじめに
より正確には rbenv install がエラーになる。
10.3 のときは問題なかった。
11.0 で何が問題なのか調べてみました。
FreeBSD 11.0 で rbenv が動かない!?
エラーメッセージ
$ 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 がないと言われている。
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) は
共有ライブラリとしてはインストールされないとのこと。
ベースシステムで使っているソフトウェアは
全てスタティックリンクされました。
11.0 のreadline
アプリケーションが使うにはどうするのか?
→ ports/devel/readline を使えばよい。
ちなみに ports/lang/ruby22では
configure のオプションに
“--with-readline-dir=${LOCALBASE}”
を渡しています。
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 を
追加する。
ruby-build の Pull Request
1. 以上の修正でコンパイルできるようになった
のでPull Request を送りました。
2. ports の openssl を使いたいらしいとの
意見があり対応しました。
3. コードのスタイルについて細かく具体的に指
摘をもらいましたので修正しました。
4. テストが通らないよ!
ruby-buildのテスト
● GitHub で Pull Request を作成すると自
動的に実行されます。
●
結果は GitHubのコミットから参照可能。
● ruby-build では Travis CI が使われていま
した。
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からの抜粋>
bats
● bash スクリプトのテストフレームワーク
●
テスト用の拡張表記 @test を有効にしてくれ
ます。
● テストコードを実行するために必要です。
● .travis.yml にかかれている通り
git clone すれば使えます。
テストのエラー
● エラーメッセージは次の通り。
✗ 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
テストのエラー
● Mac のテストなど今回の修正とは無関係と思
われる部分でエラーになっている。
● よく見るとエラーのメッセージはほぼ同じ。
● unstab uname とやらでエラーになってい
るっぽい。
テストコード
● テストコードは次のようになっていました。
@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
(省略)
}
stub uname
● stub uname とは何か?
1. uname コマンドをラップするもの
2. 引数に渡された内容を実行し結果を返す。
3. “-s : echo FreeBSD”ならば uname -s の呼び出
し時に “FreeBSD” を表示する。
4. 呼び出される回数分、処理内容を記載する。
5. “-s : echo FreeBSD” “-r : echo 11.0-R” など
unstub uname
● stub uname に渡したリスト以上に
uname コマンドが実行されるとエラー。
● unstub uname は再度 uname を実行し
リストが空でないことを確認する。
テストを通す
● ruby-build で FreeBSD であることの判
定に uname -s を、バージョン番号の判定
に uname -r を追加した。
●
よってテストの stub uname の引数が足り
ない。
● エラーになるテストに不足分を追加しました。
FreeBSD でテストを通す
● Travis は Linux 環境でテストするため、
FreeBSD ではテストスクリプトが動作しま
せんでした。
●
開発にとっても不便なので、FreeBSDでも
テストを通したい!
テストスクリプトの変更点
● /bin/bash 決め打ちを /usr/bin/env
bashに変更します。
● /usr/local/bin に PATH を通します。
● Linux 用のテストに
stub uname “-s : Linux” を入れます。
→以上で FreeBSD でテストが通ります!
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 送信中です。
Rubinius
● rubinius がコンパイルできません・・・
● 原因は以下の3つです。
1. llvm
2. readline
3. cc & c++ ラッパー
llvm
● llvm[37|38|39|-devel]のバージョン番号を
いれて、llvm-config[37|38|39|-devel]
を呼び出すように configure オプションを作
成します。
readline
● configure オプションに
“--with-opt-dir=/usr/local”
を渡すようにします。
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”
のような呼び出しをします。
cc & c++ ラッパー
● “/usr/local/llvm37/bin/cc” は存在しないた
め、コンパイラ呼び出しがエラーになります。
●
回避策としては ports/lang/rubinusと同様に
rubinius のラッパーを書き換えるのが良さそうで
す。
●
こちらは Pull Request を作成するべく現在英
作文中です。
おわり
FreeBSD 11.0 で rbenv が使えます!

Weitere ähnliche Inhalte

Was ist angesagt?

Codeceptionの受け入れテストをマネる
Codeceptionの受け入れテストをマネるCodeceptionの受け入れテストをマネる
Codeceptionの受け入れテストをマネるinfinite_loop
 
エンジニアのための痔の話
エンジニアのための痔の話エンジニアのための痔の話
エンジニアのための痔の話Kouhei Maeda
 
S2s websrv201011-presen
S2s websrv201011-presenS2s websrv201011-presen
S2s websrv201011-presenKouhei Maeda
 
第4回 一撃サーバー構築シェルスクリプト勉強会(もくもく) 発表資料 - さくらのクラウド操作案内
第4回 一撃サーバー構築シェルスクリプト勉強会(もくもく) 発表資料 - さくらのクラウド操作案内第4回 一撃サーバー構築シェルスクリプト勉強会(もくもく) 発表資料 - さくらのクラウド操作案内
第4回 一撃サーバー構築シェルスクリプト勉強会(もくもく) 発表資料 - さくらのクラウド操作案内Yasutaka Hamada
 
Casperjsのインストール
CasperjsのインストールCasperjsのインストール
CasperjsのインストールKohei Misu
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presenKouhei Maeda
 
Vagrant intro
Vagrant introVagrant intro
Vagrant introt9md
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 
秋のVim祭り Rubyを添えて
秋のVim祭り Rubyを添えて秋のVim祭り Rubyを添えて
秋のVim祭り Rubyを添えてYuta Ogura
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzzyy yank
 
第1回鹿児島node.jsの会資料_内村
第1回鹿児島node.jsの会資料_内村第1回鹿児島node.jsの会資料_内村
第1回鹿児島node.jsの会資料_内村Koichi Uchimura
 
マイクラ自動化枠第3回資料
マイクラ自動化枠第3回資料マイクラ自動化枠第3回資料
マイクラ自動化枠第3回資料Ryo Fujita
 
ぼくがかんがえたさいきょうの☆きっくすたーと☆
ぼくがかんがえたさいきょうの☆きっくすたーと☆ぼくがかんがえたさいきょうの☆きっくすたーと☆
ぼくがかんがえたさいきょうの☆きっくすたーと☆Naoya Nakazawa
 
How_to_install_OpenCV_ver1.0
How_to_install_OpenCV_ver1.0How_to_install_OpenCV_ver1.0
How_to_install_OpenCV_ver1.0Satoshi Kume
 

Was ist angesagt? (20)

Symfony2 workshop-2
Symfony2 workshop-2Symfony2 workshop-2
Symfony2 workshop-2
 
Codeceptionの受け入れテストをマネる
Codeceptionの受け入れテストをマネるCodeceptionの受け入れテストをマネる
Codeceptionの受け入れテストをマネる
 
Monit
MonitMonit
Monit
 
エンジニアのための痔の話
エンジニアのための痔の話エンジニアのための痔の話
エンジニアのための痔の話
 
Kernel fcache-bug
Kernel fcache-bugKernel fcache-bug
Kernel fcache-bug
 
S2s websrv201011-presen
S2s websrv201011-presenS2s websrv201011-presen
S2s websrv201011-presen
 
第4回 一撃サーバー構築シェルスクリプト勉強会(もくもく) 発表資料 - さくらのクラウド操作案内
第4回 一撃サーバー構築シェルスクリプト勉強会(もくもく) 発表資料 - さくらのクラウド操作案内第4回 一撃サーバー構築シェルスクリプト勉強会(もくもく) 発表資料 - さくらのクラウド操作案内
第4回 一撃サーバー構築シェルスクリプト勉強会(もくもく) 発表資料 - さくらのクラウド操作案内
 
Casperjsのインストール
CasperjsのインストールCasperjsのインストール
Casperjsのインストール
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
Vagrant intro
Vagrant introVagrant intro
Vagrant intro
 
Memory sanitizer
Memory sanitizerMemory sanitizer
Memory sanitizer
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
秋のVim祭り Rubyを添えて
秋のVim祭り Rubyを添えて秋のVim祭り Rubyを添えて
秋のVim祭り Rubyを添えて
 
Hachioji pm 21
Hachioji pm 21Hachioji pm 21
Hachioji pm 21
 
Iocage
IocageIocage
Iocage
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzz
 
第1回鹿児島node.jsの会資料_内村
第1回鹿児島node.jsの会資料_内村第1回鹿児島node.jsの会資料_内村
第1回鹿児島node.jsの会資料_内村
 
マイクラ自動化枠第3回資料
マイクラ自動化枠第3回資料マイクラ自動化枠第3回資料
マイクラ自動化枠第3回資料
 
ぼくがかんがえたさいきょうの☆きっくすたーと☆
ぼくがかんがえたさいきょうの☆きっくすたーと☆ぼくがかんがえたさいきょうの☆きっくすたーと☆
ぼくがかんがえたさいきょうの☆きっくすたーと☆
 
How_to_install_OpenCV_ver1.0
How_to_install_OpenCV_ver1.0How_to_install_OpenCV_ver1.0
How_to_install_OpenCV_ver1.0
 

Andere mochten auch

穏やかにファイルを削除する
穏やかにファイルを削除する穏やかにファイルを削除する
穏やかにファイルを削除する鉄次 尾形
 
勉強会資料 LT会 zfsで遊んでみた_公開版
勉強会資料 LT会 zfsで遊んでみた_公開版勉強会資料 LT会 zfsで遊んでみた_公開版
勉強会資料 LT会 zfsで遊んでみた_公開版Ryoma Fujiwara
 
20161227 Classmethod Basic Knowledge for Direct Connect
20161227 Classmethod Basic Knowledge for Direct Connect20161227 Classmethod Basic Knowledge for Direct Connect
20161227 Classmethod Basic Knowledge for Direct ConnectKazuki Ueki
 
AWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAmazon Web Services Japan
 

Andere mochten auch (8)

Intel graphics
Intel graphicsIntel graphics
Intel graphics
 
FreeBSD10.2 on_mac
FreeBSD10.2 on_macFreeBSD10.2 on_mac
FreeBSD10.2 on_mac
 
穏やかにファイルを削除する
穏やかにファイルを削除する穏やかにファイルを削除する
穏やかにファイルを削除する
 
FreeBSD on Mac
FreeBSD on MacFreeBSD on Mac
FreeBSD on Mac
 
勉強会資料 LT会 zfsで遊んでみた_公開版
勉強会資料 LT会 zfsで遊んでみた_公開版勉強会資料 LT会 zfsで遊んでみた_公開版
勉強会資料 LT会 zfsで遊んでみた_公開版
 
20161227 Classmethod Basic Knowledge for Direct Connect
20161227 Classmethod Basic Knowledge for Direct Connect20161227 Classmethod Basic Knowledge for Direct Connect
20161227 Classmethod Basic Knowledge for Direct Connect
 
Hairpin dx pattern
Hairpin dx patternHairpin dx pattern
Hairpin dx pattern
 
AWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct Connect
 

Ähnlich wie Ruby build

Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825hiro345
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_BetaKohei KaiGai
 
Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Sea Mountain
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1Kotaro Noyama
 
Infinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondInfinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondTaisuke Yamada
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件y-uti
 
自分色のLinuxホームサーバーを作ってみよう
自分色のLinuxホームサーバーを作ってみよう自分色のLinuxホームサーバーを作ってみよう
自分色のLinuxホームサーバーを作ってみようMasahiko Hashimoto
 
Ansibleを失敗しながら学ぶ その1
Ansibleを失敗しながら学ぶ その1Ansibleを失敗しながら学ぶ その1
Ansibleを失敗しながら学ぶ その1Kazuyuki Ichikawa
 
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編Toshimichi Suekane
 
遺伝研スパコンを使った解析の並列化.pptx
遺伝研スパコンを使った解析の並列化.pptx遺伝研スパコンを使った解析の並列化.pptx
遺伝研スパコンを使った解析の並列化.pptxOsamu Ogasawara
 
Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Hitoshi Kurokawa
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料Yasutaka Hamada
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたKazuhiro Nishiyama
 
Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021Hideki Saito
 
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜niwatako
 

Ähnlich wie Ruby build (20)

Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 
Ruby In Wheezy
Ruby In WheezyRuby In Wheezy
Ruby In Wheezy
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3
 
Rbenv
RbenvRbenv
Rbenv
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 
Infinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondInfinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every second
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
 
自分色のLinuxホームサーバーを作ってみよう
自分色のLinuxホームサーバーを作ってみよう自分色のLinuxホームサーバーを作ってみよう
自分色のLinuxホームサーバーを作ってみよう
 
Hadoop on LXC
Hadoop on LXCHadoop on LXC
Hadoop on LXC
 
Ansibleを失敗しながら学ぶ その1
Ansibleを失敗しながら学ぶ その1Ansibleを失敗しながら学ぶ その1
Ansibleを失敗しながら学ぶ その1
 
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
 
遺伝研スパコンを使った解析の並列化.pptx
遺伝研スパコンを使った解析の並列化.pptx遺伝研スパコンを使った解析の並列化.pptx
遺伝研スパコンを使った解析の並列化.pptx
 
Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみた
 
Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021
 
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
 
Sinatra and heroku for mac
Sinatra and heroku for macSinatra and heroku for mac
Sinatra and heroku for mac
 

Mehr von Yuichiro Naito

Mehr von Yuichiro Naito (20)

Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSDReporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
 
Bmd
BmdBmd
Bmd
 
WireGurad in the FreeBSD kernel
WireGurad in the FreeBSD kernelWireGurad in the FreeBSD kernel
WireGurad in the FreeBSD kernel
 
FreeBSD Capsicum
FreeBSD CapsicumFreeBSD Capsicum
FreeBSD Capsicum
 
Xrdp
XrdpXrdp
Xrdp
 
Bhyve debug-server
Bhyve debug-serverBhyve debug-server
Bhyve debug-server
 
Tramp mode
Tramp modeTramp mode
Tramp mode
 
HandBrake with QSV
HandBrake with QSVHandBrake with QSV
HandBrake with QSV
 
FreeBSD 12.1 RELESE
FreeBSD 12.1 RELESEFreeBSD 12.1 RELESE
FreeBSD 12.1 RELESE
 
Modern fonts
Modern fontsModern fonts
Modern fonts
 
FreeBSD 12.0 RELEASE!
FreeBSD 12.0 RELEASE!FreeBSD 12.0 RELEASE!
FreeBSD 12.0 RELEASE!
 
Psql & proctitle
Psql & proctitlePsql & proctitle
Psql & proctitle
 
FreeBSD 11.2 RELEASE!
FreeBSD 11.2 RELEASE!FreeBSD 11.2 RELEASE!
FreeBSD 11.2 RELEASE!
 
How to use PTI & IBRS patch
How to use PTI & IBRS patchHow to use PTI & IBRS patch
How to use PTI & IBRS patch
 
FreeBSD Desktop
FreeBSD DesktopFreeBSD Desktop
FreeBSD Desktop
 
FreeBSD Ports Flavors
FreeBSD Ports Flavors FreeBSD Ports Flavors
FreeBSD Ports Flavors
 
Bsdtw repo
Bsdtw repoBsdtw repo
Bsdtw repo
 
How to use blacklistd
How to use blacklistdHow to use blacklistd
How to use blacklistd
 
Custom Package Building with Poudriere
Custom Package Building with PoudriereCustom Package Building with Poudriere
Custom Package Building with Poudriere
 
Programming under capability mode
Programming under capability modeProgramming under capability mode
Programming under capability mode
 

Ruby build

  • 1. rbenv/ruby-build の直し方 FreeBSD 11.0 でも rbenv を使いたい! 2017年1月23日 (株)創夢 内藤 祐一郎
  • 2. はじめに より正確には rbenv install がエラーになる。 10.3 のときは問題なかった。 11.0 で何が問題なのか調べてみました。 FreeBSD 11.0 で rbenv が動かない!?
  • 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. 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. 11.0 のreadline アプリケーションが使うにはどうするのか? → ports/devel/readline を使えばよい。 ちなみに ports/lang/ruby22では configure のオプションに “--with-readline-dir=${LOCALBASE}” を渡しています。
  • 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. ruby-build の Pull Request 1. 以上の修正でコンパイルできるようになった のでPull Request を送りました。 2. ports の openssl を使いたいらしいとの 意見があり対応しました。 3. コードのスタイルについて細かく具体的に指 摘をもらいましたので修正しました。 4. テストが通らないよ!
  • 8. ruby-buildのテスト ● GitHub で Pull Request を作成すると自 動的に実行されます。 ● 結果は GitHubのコミットから参照可能。 ● ruby-build では Travis CI が使われていま した。
  • 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. bats ● bash スクリプトのテストフレームワーク ● テスト用の拡張表記 @test を有効にしてくれ ます。 ● テストコードを実行するために必要です。 ● .travis.yml にかかれている通り git clone すれば使えます。
  • 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. テストのエラー ● Mac のテストなど今回の修正とは無関係と思 われる部分でエラーになっている。 ● よく見るとエラーのメッセージはほぼ同じ。 ● unstab uname とやらでエラーになってい るっぽい。
  • 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. 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. unstub uname ● stub uname に渡したリスト以上に uname コマンドが実行されるとエラー。 ● unstub uname は再度 uname を実行し リストが空でないことを確認する。
  • 16. テストを通す ● ruby-build で FreeBSD であることの判 定に uname -s を、バージョン番号の判定 に uname -r を追加した。 ● よってテストの stub uname の引数が足り ない。 ● エラーになるテストに不足分を追加しました。
  • 17. FreeBSD でテストを通す ● Travis は Linux 環境でテストするため、 FreeBSD ではテストスクリプトが動作しま せんでした。 ● 開発にとっても不便なので、FreeBSDでも テストを通したい!
  • 18. テストスクリプトの変更点 ● /bin/bash 決め打ちを /usr/bin/env bashに変更します。 ● /usr/local/bin に PATH を通します。 ● Linux 用のテストに stub uname “-s : Linux” を入れます。 →以上で FreeBSD でテストが通ります!
  • 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. Rubinius ● rubinius がコンパイルできません・・・ ● 原因は以下の3つです。 1. llvm 2. readline 3. cc & c++ ラッパー
  • 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. cc & c++ ラッパー ● “/usr/local/llvm37/bin/cc” は存在しないた め、コンパイラ呼び出しがエラーになります。 ● 回避策としては ports/lang/rubinusと同様に rubinius のラッパーを書き換えるのが良さそうで す。 ● こちらは Pull Request を作成するべく現在英 作文中です。
  • 25. おわり FreeBSD 11.0 で rbenv が使えます!