nginxのビルドエラー
いつからだったか忘れたけどMacでnginx-buildを使ってOpenSSLを静的リンクしたnginxのビルドが通らなくなっていた。
$ nginx-build -d work -openssl
nginx-build: 0.2.0
Compiler: gc go1.4.1
2015/01/18 06:27:21 [warn]configure option is empty.
2015/01/18 06:27:21 Download nginx-1.7.9.....
2015/01/18 06:27:21 Download openssl-1.0.1k.....
2015/01/18 06:27:23 Extract nginx-1.7.9.tar.gz.....
2015/01/18 06:27:39 Extract openssl-1.0.1k.tar.gz.....
2015/01/18 06:27:40 Generate configure script for nginx-1.7.9.....
2015/01/18 06:27:40 Configure nginx-1.7.9.....
2015/01/18 06:27:46 Build nginx-1.7.9.....
exit status 2
2015/01/18 06:30:12 Failed to build nginx-1.7.9
$
直接ビルドするようにしてもやっぱりエラーになる。
$ cd nginx-1.7.9
$ ./configure ¥
--with-http_ssl_module ¥
--with-openssl=../openssl-1.0.1k
$ make
・
・
・
"_sk_value", referenced from:
_ngx_ssl_session_cache in ngx_event_openssl.o
_ngx_ssl_check_host in ngx_event_openssl.o
_ngx_ssl_stapling in ngx_event_openssl_stapling.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [objs/nginx] Error 1
make: *** [build] Error 2
$
OpenSSLのリンクに失敗しているようだ。makeの出力を眺めてるとOpenSSLのconfigure時にこんな警告が出ている。
Operating system: i686-apple-darwinDarwin Kernel Version 14.0.0: Fri Sep 19 00:26:44 PDT 2014; root:xnu-2782.1.97~2/RELEASE_X86_64
WARNING! If you wish to build 64-bit library, then you have to
invoke './Configure darwin64-x86_64-cc' *manually*.
You have about 5 seconds to press Ctrl-C to abort.
OSが32bitって判定されてるけど、64bit環境向けに./Configure darwin64-x86_64-cc
を実行しろ、とある。う〜ん、使ってるMacBook Proは64bit環境のはずなんだけどなぁ。
しかし、uname
実行してみると、プロセッサアーキテクチャは32bitのものだった。原因はこれっぽい。(Core i7なんだけど、何でi386になるんだろ?)
$ uname -p # print the machine processor architecture name.
i386
$ uname -m # print the machine hardware name.
x86_64
$
nginxにテキトーなパッチをあててみる
diff -r e9effef98874 auto/lib/openssl/make
--- a/auto/lib/openssl/make Fri Dec 26 16:22:59 2014 +0300
+++ b/auto/lib/openssl/make Fri Jan 09 19:24:06 2015 +0900
@@ -56,7 +56,7 @@
$OPENSSL/.openssl/include/openssl/ssl.h: $NGX_MAKEFILE
cd $OPENSSL \\
&& if [ -f Makefile ]; then \$(MAKE) clean; fi \\
- && ./config --prefix=$ngx_prefix no-shared
$OPENSSL_OPT \\
+ && ./Configure darwin64-x86_64-cc
--prefix=$ngx_prefix no-shared $OPENSSL_OPT \\
&& \$(MAKE) \\
&& \$(MAKE) install LIBDIR=lib
一応これをあてるとOpenSSLのリンクに成功する。しかし、そのためにnginxのビルドスクリプトを変更するのはまともなやり方ではないので、nginxのconfigure
オプション等で外部から情報与えるようにして対処したい。
nginxのMLで聞いてみた
どうすればいいかnginxのMLで聞いてみた。
- A build of nginx with static-linked OpenSSL fails on Mac
- Re: A build of nginx with static-linked OpenSSL fails on Mac
以下、nginxの開発者からの返信。
Defining KERNEL_BITS=64 in the environment will convince recent
enough OpenSSL to build 64-bit library instead.
KERNEL_BIT=64
をビルド時に付加してやればいい、とのこと。実際これでビルドが通るようになった。
nginx-build側の対応
nginx-buildの方はGOOS
とGOARCH
で環境判別し、必要に応じてKERNEL_BIT=64
を付加することで対応した。
Fixed a build failure when OpenSSL is static-linked on Mac.
これでMacでもOpenSSLを静的リンクしてnginxをビルドできるかテストできるようになった。めでたしめでたし。