@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

Rubyのコンパイルに挑戦した記録

OpenSSLがみつからない

GithubのREADMEに従って

git clone git@github.com:ruby/ruby.git

して

./configure
make
make check

すると、次のような警告メッセージがでました。

*** Following extensions are not compiled:
openssl:
    Could not be configured. It will not be installed.
    /Users/shigerunakajima/ruby/ext/openssl/extconf.rb:97: OpenSSL library could not be found. You might want to use --with-openssl-dir=<dir> option to specify the prefix where OpenSSL is installed.
    Check ext/openssl/mkmf.log for more details.
*** Fix the problems, then remove these directories and try again if you want.

OpenSSLが見つからないみたいです。

brew info opensslすると

For compilers to find openssl@1.1 you may need to set:
  set -gx LDFLAGS "-L/usr/local/opt/openssl@1.1/lib"
  set -gx CPPFLAGS "-I/usr/local/opt/openssl@1.1/include"

と表示されたので、この設定をして

./configure
make clean
make

しました。 該当の警告メッセージは消えました。

テスト失敗

make check

すると、今度は次のテストが失敗しました。

1)
Socket.getnameinfo using IPv6 using a 3 element Array as the first argument using NI_NUMERICHOST as the flag returns an Array containing the numeric hostname and service name FAILED
Expected ["::ffff:127.0.0.1", "ftp"] == ["::1", "ftp"]
to be truthy but was false
/Users/shigerunakajima/ruby/spec/ruby/library/socket/socket/getnameinfo_spec.rb:111:in `block (6 levels) in <top (required)>'
/Users/shigerunakajima/ruby/spec/ruby/library/socket/socket/getnameinfo_spec.rb:65:in `<top (required)>'

該当のテストコードは https://github.com/ruby/ruby/blob/master/spec/ruby/library/socket/socket/getnameinfo_spec.rb#L109-L113 です。

describe 'using NI_NUMERICHOST as the flag' do
  it 'returns an Array containing the numeric hostname and service name' do
    Socket.getnameinfo(@addr, Socket::NI_NUMERICHOST).should == [ip_address, 'ftp']
  end
end

ソースコード追っかけて要約すると、このテストコードは

Socket.getnameinfo([Socket::AF_INET6, 21, 'localhost'], Socket::NI_NUMERICHOST)

[":1", "ftp"] を返すことを期待しています。

irbを使ってためしてみます。

irb(main):012:0> Socket.getnameinfo([Socket::AF_INET6, 21, 'localhost'], Socket::NI_NUMERICHOST)
=> ["::ffff:127.0.0.1", "ftp"]

なるほど["::ffff:127.0.0.1", "ftp"]が返ってきています。 それでテストが失敗しているようです。

ネットワークを変えると

ネットワークをLANからスマートフォンテザリングに変更して試してみます。

irb(main):003:0> Socket.getnameinfo([Socket::AF_INET6, 21, 'localhost'], Socket:
:NI_NUMERICHOST)
=> ["::1", "ftp"]

ネットワーク環境依存しているみたいです。