読者です 読者をやめる 読者になる 読者になる

ぶていのログでぶログ

思い出したが吉日

メモ: CentOS5でNginxのSRPMからRPMをビルドするために必要なこと

メモ Linux Nginx

最近CentOS5でNginxのRPMをビルドする必要に迫られたので、その時にハマったポイントをメモしておく。

ちなみに、CentOS6以上だったりUbuntu14.04以上だったら id:h-sbtさんのngx_muby-package-builder使うのが便利。

github.com

1. yum-builddepがコケる

yum-builddep -y /tmp/nginx-1.9.12-1.el5.ngx.src.rpm とかすると yum.Errors.MiscError: Could not open local rpm file: /tmp/nginx-1.9.12-1.el5.ngx.src.rpm というエラーが出てものすごくハマる。。。

原因は、GPGキーがインポートされていないせい。 (だったらそういうエラーを出してくれればいいのに…Warningじゃ無視しちゃうよ。。。)

$ sudo rpm --import http://nginx.org/packages/keys/nginx_signing.key

すると直る。 (CentOS6以降では、 --no-gpgcheck オプションが使えるっぽい)

2. %rhelマクロが定義されていない

nginx.src.specではRHELのバージョンによって定義が分岐されている。 その判定には %rhel マクロが使われているのだが、CentOS5には定義されていないためrpmbuildするときにエラーになってしまう。 なので、以下のコマンドで定義してやる。

$ echo "%rhel 5" >> ~/.rpmmacros

または

$ rpmbuild -ba --define "rhel 5" /path/to/nginx.src.spec

3. ccがWarningでもエラー扱いにしてしまう

デフォルトの設定では、ソースコンパイル中のWarningをすべてエラー扱いにしてしまいrpmbuildが止まってしまう。 そこで、ccするときに -Wno-error を追加する必要がある。

ccのオプションは、%optflags マクロを展開していて手元の環境では以下の様な定義になっている。

$ rpmbuild --showrc | grep optflags
optflags              : %{__global_cflags} -m32 -march=i686 -mtune=generic -fasynchronous-unwind-tables
  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS;
RPM_OPT_FLAGS="%{optflags}"
RPM_OPT_FLAGS="%{optflags}"
  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ;
  CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ;
  FFLAGS="${FFLAGS:-%optflags}" ; export FFLAGS ;
-11: optflags   %{__global_cflags} -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables

仕組みをよく理解していないのだが、このマクロは後から上書きできないようなので、内部的に使用している __global_cflags マクロを上書きすることにした。 以下のようなコマンドで -Wno-error を追加する。

$ echo "%__global_cflags $(rpm --eval %{__global_cflags}) -Wno-error" >> ~/.rpmmacros