またしてもCyrus IMAPのアップグレード時に、片方のサーバでだけコンパイルに失敗した。前回はPerlのバージョンを一時的に下げてIMAPdを入れ、その後またPerlのバージョンを戻すという一時しのぎで入れたけれども、今回は原因を調べてみた。
ビルドの比較
ビルドログの比較
失敗するサーバのエラー箇所。
Checking if your kit is complete... Looks good Generating a Unix-style Makefile Writing Makefile for Cyrus::IMAP Writing MYMETA.yml and MYMETA.json Smartmatch is experimental at /usr/local/lib/perl5/5.20/BSDPAN/ExtUtils/Packlist.pm line 218. cp IMAP/Shell.pm blib/lib/Cyrus/IMAP/Shell.pm cp IMAP.pm blib/lib/Cyrus/IMAP.pm cp IMAP/Admin.pm blib/lib/Cyrus/IMAP/Admin.pm cp IMAP/IMSP.pm blib/lib/Cyrus/IMAP/IMSP.pm Running Mkbootstrap for Cyrus::IMAP () chmod 644 IMAP.bs /usr/local/bin/perl /usr/local/lib/perl5/5.20/ExtUtils/xsubpp -typemap /usr/local/lib/perl5/5.20/ExtUtils/typemap -typemap typemap IMAP.xs > IMAP.xsc && mv IMAP.xsc IMAP.c cc -c -I../../lib -I../.. -I../../com_err/et -I/usr/local/include -I/usr/include -DAPPLLIB_EXP="/usr/local/lib/perl5/5.20/BSDPAN" -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -g -DVERSION=\"1.00\" -DXS_VERSION=\"1.00\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.20/mach/CORE" -DPERL_POLLUTE IMAP.c In file included from IMAP.xs:51: In file included from /usr/local/lib/perl5/5.20/mach/CORE/perl.h:5152: /usr/local/lib/perl5/5.20/mach/CORE/inline.h:264:22: error: expected ')' *(*dest)++ = UTF8_EIGHT_BIT_HI(byte); ^ /usr/local/lib/perl5/5.20/mach/CORE/utf8.h:374:31: note: expanded from macro 'UTF8_EIGHT_BIT_HI' #define UTF8_EIGHT_BIT_HI(c) (__ASSERT_(FITS_IN_8_BITS(c)) \ ^ /usr/local/lib/perl5/5.20/mach/CORE/handy.h:281:51: note: expanded from macro '__ASSERT_' # define __ASSERT_(statement) assert(statement), ^ /usr/local/lib/perl5/5.20/mach/CORE/inline.h:264:22: note: to match this '(' /usr/local/lib/perl5/5.20/mach/CORE/utf8.h:374:30: note: expanded from macro 'UTF8_EIGHT_BIT_HI' #define UTF8_EIGHT_BIT_HI(c) (__ASSERT_(FITS_IN_8_BITS(c)) \ ^ In file included from IMAP.xs:51: In file included from /usr/local/lib/perl5/5.20/mach/CORE/perl.h:5152: /usr/local/lib/perl5/5.20/mach/CORE/inline.h:264:20: error: assigning to 'U8' (aka 'unsigned char') from incompatible type 'void' *(*dest)++ = UTF8_EIGHT_BIT_HI(byte); ^ ~~~~~~~~~~~~~~~~~~~~~~~ /usr/local/lib/perl5/5.20/mach/CORE/inline.h:265:22: error: expected ')' *(*dest)++ = UTF8_EIGHT_BIT_LO(byte); ^ /usr/local/lib/perl5/5.20/mach/CORE/utf8.h:376:31: note: expanded from macro 'UTF8_EIGHT_BIT_LO' #define UTF8_EIGHT_BIT_LO(c) (__ASSERT_(FITS_IN_8_BITS(c)) \ ^ /usr/local/lib/perl5/5.20/mach/CORE/handy.h:281:51: note: expanded from macro '__ASSERT_' # define __ASSERT_(statement) assert(statement), ^ /usr/local/lib/perl5/5.20/mach/CORE/inline.h:265:22: note: to match this '(' /usr/local/lib/perl5/5.20/mach/CORE/utf8.h:376:30: note: expanded from macro 'UTF8_EIGHT_BIT_LO' #define UTF8_EIGHT_BIT_LO(c) (__ASSERT_(FITS_IN_8_BITS(c)) \ ^ In file included from IMAP.xs:51: In file included from /usr/local/lib/perl5/5.20/mach/CORE/perl.h:5152: /usr/local/lib/perl5/5.20/mach/CORE/inline.h:265:20: error: assigning to 'U8' (aka 'unsigned char') from incompatible type 'void' *(*dest)++ = UTF8_EIGHT_BIT_LO(byte); ^ ~~~~~~~~~~~~~~~~~~~~~~~ IMAP.xs:218:19: warning: incompatible pointer types initializing 'int (*)(void)' with an expression of type 'int (void *, int, const char **, unsigned int *)' [-Wincompatible-pointer-types] { SASL_CB_USER, get_username, NULL }, ^~~~~~~~~~~~ IMAP.xs:219:23: warning: incompatible pointer types initializing 'int (*)(void)' with an expression of type 'int (void *, int, const char **, unsigned int *)' [-Wincompatible-pointer-types] { SASL_CB_AUTHNAME, get_username, NULL }, ^~~~~~~~~~~~ IMAP.xs:220:19: warning: incompatible pointer types initializing 'int (*)(void)' with an expression of type 'int (sasl_conn_t *, void *, int, sasl_secret_t **)' [-Wincompatible-pointer-types] { SASL_CB_PASS, get_password, NULL }, ^~~~~~~~~~~~ 3 warnings and 4 errors generated. *** Error code 1
コンパイルが通る方の同じ個所のログ。
Checking if your kit is complete... Looks good Generating a Unix-style Makefile Writing Makefile for Cyrus::IMAP Writing MYMETA.yml and MYMETA.json Smartmatch is experimental at /usr/local/lib/perl5/5.20/BSDPAN/ExtUtils/Packlist.pm line 218. cp IMAP.pm blib/lib/Cyrus/IMAP.pm cp IMAP/Admin.pm blib/lib/Cyrus/IMAP/Admin.pm cp IMAP/Shell.pm blib/lib/Cyrus/IMAP/Shell.pm cp IMAP/IMSP.pm blib/lib/Cyrus/IMAP/IMSP.pm Running Mkbootstrap for Cyrus::IMAP () chmod 644 IMAP.bs /usr/local/bin/perl /usr/local/lib/perl5/5.20/ExtUtils/xsubpp -typemap /usr/local/lib/perl5/5.20/ExtUtils/typemap -typemap typemap IMAP.xs > IMAP.xsc && mv IMAP.xsc IMAP.c cc -c -I../../lib -I../.. -I../../com_err/et -I/usr/local/include -I/usr/include -DAPPLLIB_EXP="/usr/local/lib/perl5/5.20/BSDPAN" -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -O2 -pipe -fno-strict-aliasing -DVERSION=\"1.00\" -DXS_VERSION=\"1.00\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.20/mach/CORE" -DPERL_POLLUTE IMAP.c IMAP.xs:218:19: warning: incompatible pointer types initializing 'int (*)(void)' with an expression of type 'int (void *, int, const char **, unsigned int *)' [-Wincompatible-pointer-types] { SASL_CB_USER, get_username, NULL }, ^~~~~~~~~~~~ IMAP.xs:219:23: warning: incompatible pointer types initializing 'int (*)(void)' with an expression of type 'int (void *, int, const char **, unsigned int *)' [-Wincompatible-pointer-types] { SASL_CB_AUTHNAME, get_username, NULL }, ^~~~~~~~~~~~ IMAP.xs:220:19: warning: incompatible pointer types initializing 'int (*)(void)' with an expression of type 'int (sasl_conn_t *, void *, int, sasl_secret_t **)' [-Wincompatible-pointer-types] { SASL_CB_PASS, get_password, NULL }, ^~~~~~~~~~~~ 3 warnings generated.
IMAP.cのコンパイルエラーで止まっていることがわかった。
コンパイルオプションの比較
よく見ると、コンパイルが通る方と通らない方ではコンパイルオプションが微妙に違う。コンパイルに失敗する行の出力をスペース位置ですべて改行して比較してみる。
まずは、失敗する方。
cc -c -I../../lib -I../.. -I../../com_err/et -I/usr/local/include -I/usr/include -DAPPLLIB_EXP="/usr/local/lib/perl5/5.20/BSDPAN" -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -g -DVERSION=\"1.00\" -DXS_VERSION=\"1.00\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.20/mach/CORE" -DPERL_POLLUTE IMAP.c
次に成功する方。
-c -I../../lib -I../.. -I../../com_err/et -I/usr/local/include -I/usr/include -DAPPLLIB_EXP="/usr/local/lib/perl5/5.20/BSDPAN" -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -O2 -pipe -fno-strict-aliasing -DVERSION=\"1.00\" -DXS_VERSION=\"1.00\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.20/mach/CORE" -DPERL_POLLUTE IMAP.c
diffをとってみる。
11d10 < -DDEBUGGING 16c15,17 < -g --- > -O2 > -pipe > -fno-strict-aliasing
コンパイルが通らない方には、デバッグオプションがついていた。
環境の比較
ひとつずつ違いを調べてみる。
cyrus-imapd24のコンフィグ比較
両方のサーバでcyrus-imapd24のコンフィグを比較してみる。
# cd /usr/ports/mail/cyrus-imapd24 # sudo make config
→ 同じだった。
依存パッケージの比較
依存しているパッケージに違いがないか比較してみる。
# cd /usr/ports/mail/cyrus-imapd24 # portmaster --show-work ===>>> Currently installed version: cyrus-imapd24-2.4.17_5 ===>>> Port directory: /usr/ports/mail/cyrus-imapd24 ===>>> Starting check for all dependencies ===>>> Gathering dependency list for mail/cyrus-imapd24 from ports ===>>> Installed databases/db41 ===>>> Installed devel/pcre ===>>> Installed lang/perl5.20 ===>>> Installed ports-mgmt/pkg ===>>> Installed security/cyrus-sasl2 #
→ インストールされているバージョン以外は違いなし。
依存パッケージのコンフィグ比較
次のパッケージについて、コンフィグを比較してみる。
- databases/db41
- devel/pcre
- lang/perl5.20
- ports-mgmt/pkg
- security/cyrus-sasl2
→ lang/perl5.20のコンフィグに違いがあった。コンパイルに通らない方は、DEBUGがOnになっていた。他は全部一緒。
対処
Perlの再インストール
コンフィグを変更し、DEBUGをOffにしてPerlを再インストールしてみた。
# sudo portmaster --force-config
cyrus-imapd24のアップグレード
Perlの再インストール後に、Cyrus IMAPdを再度アップグレードしてみる。
# sudo portmaster mail/cyrus-imapd24
→ 無事にアップグレード完了。
結論
Cyrus IMAPd 2.4をインストールする場合、PerlがデバッグオプションつきでコンパイルしてあるとIMAPdのビルドに失敗する。したがって、デバッグオプションをはずしてPerlをインストールし直せば良い。
前回、Perlのバージョンを下げてからIMAPdをビルドしたら通ったのは、バージョンを下げたときにデバッグオプションをつけなかったせい。
そもそもデバッグオプションをつける必要もなかったはずなのだけど、デバッガが使えるようになるオプションかと勘違いしてサブサーバのみDEBUGをOnにしていたみたい。それでビルドに失敗するのはCyrus IMAPdのバグだとは思うけども、実際問題Perlのデバッグオプションが必要になることはないはずなので、これで解決としよう。