Ubuntu rbenvで古いruby(1.9.0)を入れようとした際にmake[1]: *** [ossl_ns_spki.o] Error 1で引っかかったメモ。

Ubuntu 14.04.5 LTS

Ruby1.9.0のインストール失敗。

BUILD FAILED (Ubuntu 14.04 using ruby-build 20171226)

Inspect or clean up the working tree at /tmp/ruby-build.20180113163504.1885
Results logged to /tmp/ruby-build.20180113163504.1885.log

Last 10 log lines:
                                           ^
In file included from /usr/include/openssl/asn1_mac.h:62:0,
                 from ossl.h:53,
                 from ossl_ns_spki.c:11:
/usr/include/openssl/x509.h:877:1: note: expected ‘const unsigned char **’ but argument is of type ‘unsigned char **
’
 DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI)
 ^
make[1]: *** [ossl_ns_spki.o] Error 1
make[1]: Leaving directory `/tmp/ruby-build.20180113163504.1885/ruby-1.9.0-0/ext/openssl'
make: *** [all] Error 1

結論から書くと、

# RUBY_CONFIGURE_OPTS="--without-openssl" rbenv install 1.9.0-0

でインストールできました。
初めはOpenSSLのバージョンのせいかな?と思い1.0.0や0.9.8を入れてみたのですが、どうもうまくいかない。
そんな中、↓のIssueを見つけて解決しました。

github.com

古いバージョンのrubyをインストールする際はOpenSSLを無効にする必要があるらしいです。(又は古いOpenSSLをインストールして指定)
でもこちらでも「0.9.8入れたけどエラー出てる」って書き込みがありますね。

一応、以上で解決しているのですが--without-openssl オプションに辿り着くまでに行った作業は以下に載せておきます。
土日を使い果たした作業の報告を↑だけで終わらせるのはあまりにも寂しいので。


今のOpenSSLのバージョンは↓

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014


入れるためにディレクトリ移動。

$ sudo -s
# cd /usr/local/src

usr/local以下にダウンロードする理由は↓の/usr/localの項目を参照。

www.atmarkit.co.jp

(FHSという決まり事に則って、システム管理者がアプリケーションをインストールする際に/usr/localを指定するという話は最近知ったのですが、常識っぽいですね。)
バージョンごとのディレクトリにインストールしておく手があるという記事*1もあったので、0.9.8をインストールした時は/opt/opensslを指定しました。


opensslのソースは下記から持ってきます。
とりあえず1.0.0をダウンロード。
https://www.openssl.org/source/old/

一度curl に-Oをつけ忘れて標準出力してしまいましたがダウンロードできました。

# curl -L -O https://www.openssl.org/source/old/1.0.0/openssl-1.0.0s.tar.gz

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 4005k  100 4005k    0     0   559k      0  0:00:07  0:00:07 --:--:--  893k

# ls
openssl-1.0.0s.tar.gz


続けて解凍してmake installまで。
prefixオプションははusr/localを指定します。

# tar xf openssl-1.0.0s.tar.gz
# cd openssl-1.0.0s
# ./config --prefix=/usr/local
# make
# make install

# /usr/local/bin/openssl version
OpenSSL 1.0.0s 11 Jun 2015

↑のmake installで下記のようなエラーが出る場合、make install_swしてください。

installing man1/cms.1
cms.pod around line 457: Expected text after =item, not a number
cms.pod around line 461: Expected text after =item, not a number
cms.pod around line 465: Expected text after =item, not a number
cms.pod around line 470: Expected text after =item, not a number
cms.pod around line 474: Expected text after =item, not a number
POD document had syntax errors at /usr/bin/pod2man line 71.
make: *** [install_docs] Error 255

今インストールしたopensslを指定してRuby1.9をインストールします。

# CONFIGURE_OPTS="--with-openssl-dir=/usr/local" rbenv install 1.9.0-0

BUILD FAILED (Ubuntu 14.04 using ruby-build 20171226)

Last 10 log lines:
make[1]: Entering directory `/tmp/ruby-build.20180113180235.16329/ruby-1.9.0-0/ext/digest/md5'
/usr/bin/gcc -I. -I../../../.ext/include/x86_64-linux -I../../.././include -I../../.././ext/digest/md5 -I../../.././ext/digest/md5/.. -DRUBY_EXTCONF_H=\"extconf.h\" -I/usr/local/include -I/home/vagrant/.rbenv/versions/1.9.0-0/include    -fPIC -g -O2   -o md5init.o -c md5init.c
/usr/bin/gcc -I. -I../../../.ext/include/x86_64-linux -I../../.././include -I../../.././ext/digest/md5 -I../../.././ext/digest/md5/.. -DRUBY_EXTCONF_H=\"extconf.h\" -I/usr/local/include -I/home/vagrant/.rbenv/versions/1.9.0-0/include    -fPIC -g -O2   -o md5ossl.o -c md5ossl.c
/usr/bin/gcc -shared -o ../../../.ext/x86_64-linux/digest/md5.so md5init.o md5ossl.o -L. -L../../.. -L/usr/local/lib -Wl,-R/usr/local/lib -L. -L/home/vagrant/.rbenv/versions/1.9.0-0/lib  -rdynamic -Wl,-export-dynamic    -lcrypto  -lpthread -lrt -ldl -lcrypt -lm   -lc
/usr/bin/ld: /usr/local/lib/libcrypto.a(md5_dgst.o): relocation R_X86_64_PC32 against undefined symbol `memcpy@@GLIBC_2.14' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
make[1]: *** [../../../.ext/x86_64-linux/digest/md5.so] Error 1
make[1]: Leaving directory `/tmp/ruby-build.20180113180235.16329/ruby-1.9.0-0/ext/digest/md5'
make: *** [all] Error 1

ダメでした。(この後0.9.8インストール→失敗→--without-opensslオプションで成功)