2009年12月1日火曜日

print/cups-base の更新がうまくいかない…

portupgrade -a をちょっとやってみたのですが、 print/cups-base のアップグレード (cups-base-1.3.9_3 から 1.4.2 へ)に失敗してしまいました。


cc -L../cgi-bin -L../cups -L../filter -L../ppdc -L../scheduler -L/usr/local/lib/ -L/usr/local/lib -Wl,-R/usr/local/lib -pie -fPIE -Wall -Wno-format-y2k -fPIC -Os -g -fstack-protector -o cupsd auth.o banners.o cert.o classes.o client.o conf.o dirsvc.o env.o main.o ipp.o listen.o job.o log.o network.o policy.o printers.o process.o quotas.o removefile.o select.o server.o statbuf.o subscriptions.o sysman.o -L. -lcupsmime \
-lz -L/usr/local/lib -lgnutls -lldap -lpam \
-lpaper -L/usr/local/lib -ldbus-1 -lcups -L/usr/local/lib -lgnutls -pthread -lm -lcrypt \

client.o(.text+0x233a): In function `encrypt_client':
/usr/ports/print/cups-base/work/cups-1.4.2/scheduler/client.c:3217: undefined reference to `_httpReadGNUTLS'
client.o(.text+0x234e):/usr/ports/print/cups-base/work/cups-1.4.2/scheduler/client.c:3218: undefined reference to `_httpWriteGNUTLS'
gmake[1]: *** [cupsd] エラー 1
gmake[1]: ディレクトリ `/usr/ports/print/cups-base/work/cups-1.4.2/scheduler' から出ます
gmake: *** [all] エラー 1
*** Error code 1

Stop in /usr/ports/print/cups-base.
*** Error code 1

Stop in /usr/ports/print/cups-base.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portupgrade20091130-71145-r2vh1l-0 env UPGRADE_TOOL=portupgrade UPGRADE_PORT=cups-base-1.3.9_3 UPGRADE_PORT_VER=1.3.9_3 make
** Fix the problem and try again.
** Listing the failed packages (-:ignored / *:skipped / !:failed)
! print/cups-base (cups-base-1.3.9_3) (linker error)


他にも同様の問題が報告されていたり、既にsend-prされている(ports/141014)みたいなので、しばらく動向を見守るなり、対策が思いつく方はcommitしてみて下さい。どうもDBUSへの対応を切るといいみたいなんですが、それはgnomeで使うときに問題にならないんだろうか……?

で、終わっとく予定だったんですが、ついかっとなって調べた。正直おなかが空いている。

引っかかっている原因は、どうも
/usr/ports/print/cups-base/work/cups-1.4.2/cups/http.c
のコンパイルが行われていないせいなのではないか? という気がします。

というのは、上記ソースに _httpReadGNUTLS() が含まれているのですが、
/usr/ports/print/cups-base/ で make して止まったとき、
/usr/ports/print/cups-base/work/cups-1.4.2/cups/lib*
には _httpReadGNUTLS() が含まれていないのです。だからリンク時エラーが出てるんですね。

で、script を使って make 時のログを見てみたんですが、どうも http.c がコンパイルされていないようなんです。(何故?)

エラーで止まった状態で
/usr/ports/print/cups-base/work/cups-1.4.2/cups
まで下がり、 make testhttp を実行した後だと、
# grep _httpReadGNUTLS lib*
Binary file libcups.a matches
で無事 _httpReadGNUTLS() が含まれるようになります。このときのログにはちゃんと、

echo Compiling http.c...
Compiling http.c...
cc -Wall -Wno-format-y2k -fPIC -Os -g -fstack-protector -I.. -D_CUPS_SOURCE -I/
usr/local/include/avahi-compat-libdns_sd/ -I/usr/local/include -I/usr/local/incl
ude/avahi-compat-libdns_sd/ -O2 -fno-strict-aliasing -pipe -DLDAP_DEPRECATED -I
/usr/local/include/dbus-1.0 -I/usr/local/include/dbus-1.0/include -DDBUS_API_S
UBJECT_TO_CHANGE -I/usr/local/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
-D_THREAD_SAFE -D_REENTRANT -c http.c
echo Compiling http-addr.c...
Compiling http-addr.c...
cc -Wall -Wno-format-y2k -fPIC -Os -g -fstack-protector -I.. -D_CUPS_SOURCE -I/
usr/local/include/avahi-compat-libdns_sd/ -I/usr/local/include -I/usr/local/incl
ude/avahi-compat-libdns_sd/ -O2 -fno-strict-aliasing -pipe -DLDAP_DEPRECATED -I
/usr/local/include/dbus-1.0 -I/usr/local/include/dbus-1.0/include -DDBUS_API_S
UBJECT_TO_CHANGE -I/usr/local/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
-D_THREAD_SAFE -D_REENTRANT -c http-addr.c

といったようなログが残っています。ところが、ports で make したときにはこれが無い。

多分Makefileの違いなのだろうと思うんですが……なんでだろう?

追記:とりあえず解決? Makefileのほうで置き換えをしていたようです。こんな感じになおすとmakeが通るようになりました。


# diff -u print/cups-base/Makefile.orig print/cups-base/Makefile
--- print/cups-base/Makefile.orig 2009-12-01 22:53:29.000000000 +0900
+++ print/cups-base/Makefile 2009-12-01 22:56:09.000000000 +0900
@@ -261,7 +261,7 @@
${WRKSRC}/Makefile
.else
@${REINPLACE_CMD} \
- -e 's|cups filter backend|backend|' \
+ -e 's|cups filter backend|cups backend|' \
-e 's|$$.INSTALL_SCRIPT. cups-config|echo skip: cups-config|' \
-e 's|/usr/share|${PREFIX}/share|g' \
-e 's|installhdrs$$||' \


本家にも報告しておいたけど、合ってるのかな……?

0 件のコメント: