portupgrade で “error: spawn.h: No such file or directory” が発生

FreeBSD 7.3 のサーバーで、オリジナル tar コマンドが xz アーカイブを解凍できなくて「tar unrecognized archive format」となる現象は、gnu tar をインストールすることにより回避できましたが、他のアップグレードが必要なパッケージで同じく xz アーカイブで配布されているソースをビルドしようとしたところ、別のエラーが発生しました。

今のところ、bison と wget が問題。

bison-2.7,1                         <   needs updating (port has 2.7.1,1)
wget-1.14                           <   needs updating (port has 1.14_2)

portupgrade コマンドを発行すると、

In file included from spawn-pipe.c:47:
 ./spawn.h:28:25: error: spawn.h: No such file or directory
 In file included from spawn-pipe.c:47:
./spawn.h:554: error: expected ';', ',' or ')' before '*' token
./spawn.h:588: error: expected ')' before '*' token
./spawn.h:613: error: expected ')' before '*' token
./spawn.h:746: error: expected ')' before '*' token
./spawn.h:812: error: expected ')' before '*' token
./spawn.h:1039: error: expected ')' before '*' token
./spawn.h:1069: error: expected ')' before '*' token
./spawn.h:1093: error: expected ')' before '*' token
./spawn.h:1132: error: expected ')' before '*' token
./spawn.h:1163: error: expected ')' before '*' token
spawn-pipe.c: In function 'create_pipe':
spawn-pipe.c:255: error: 'posix_spawn_file_actions_t' undeclared (first use in this function)
spawn-pipe.c:255: error: (Each undeclared identifier is reported only once
spawn-pipe.c:255: error: for each function it appears in.)
spawn-pipe.c:255: error: expected ';' before 'actions'
spawn-pipe.c:257: error: 'posix_spawnattr_t' undeclared (first use in this function)
spawn-pipe.c:257: error: expected ';' before 'attrs'
spawn-pipe.c:284: warning: implicit declaration of function 'posix_spawn_file_actions_init'
spawn-pipe.c:284: error: 'actions' undeclared (first use in this function)
spawn-pipe.c:287: warning: implicit declaration of function 'rpl_posix_spawn_file_actions_adddup2'
spawn-pipe.c:295: warning: implicit declaration of function 'rpl_posix_spawn_file_actions_addclose'
spawn-pipe.c:307: warning: implicit declaration of function 'rpl_posix_spawn_file_actions_addopen'
spawn-pipe.c:327: warning: implicit declaration of function 'posix_spawnattr_init'
spawn-pipe.c:327: error: 'attrs' undeclared (first use in this function)
spawn-pipe.c:329: warning: implicit declaration of function 'posix_spawnattr_setsigmask'
spawn-pipe.c:332: warning: implicit declaration of function 'posix_spawnattr_setflags'
spawn-pipe.c:335: warning: implicit declaration of function 'posix_spawnp'
spawn-pipe.c:341: warning: implicit declaration of function 'posix_spawn_file_actions_destroy'
spawn-pipe.c:343: warning: implicit declaration of function 'posix_spawnattr_destroy'
*** Error code 1
Stop in /usr/ports/devel/bison/work/bison-2.7.1/lib.
*** Error code 1

となりコンパイルが停止。ビルドディレクトリの lib/spawn-pipe.c の47行目をチェックすると、

/* Unix API. */
# include <spawn.h>

システムの spawn.h をインクルードしようとしていることがわかりますが、FreeBSD 7.3の/usr/includeにはありません。

<FreeBSD 7.3>

> ll /usr/include/spawn.h
ls: /usr/include/spawn.h: No such file or directory

8.3のホストには存在しています。

<FreeBSD 8.3>

> ll /usr/include/spawn.h
-r--r--r-- 1 root wheel 4383 10月 10 2012 /usr/include/spawn.h

8.3のホストから /usr/include/spawn.h を 7.3 のホストにコピーしてビルドするとどうか?と試しましたが、spawin.h だけでは駄目なようでエラーになって終わり。

いろいろ検索してみたところ、

http://forums.freebsd.org/showthread.php?t=15775

というページが見つかりました。
同様のエラーと回避コマンドがページ下部に書かれていました。
回避するには、portupgrade ではなく、手動でビルドすればよいようです。bison の場合、

cd /usr/ports/devel/bison

のあと、

make ac_cv_header_spawn_h=no

すれば、spawn.h をバイパスしてビルドできることが判明。

/usr/ports/devel/bison/work/bison-2.7.1/src> ./bison --version
bison (GNU Bison) 2.7.12-4996
Robert Corbett と Richard Stallman によって書かれました

インストールは、まだ試していませんが、
make deinstall; make reinstall
でアップデートできるような気がします。

FreeBSD 7系を使い続けるのはそろそろ限界かな~。

Comments

  1. 初めまして、私の環境(7.4)でも同様のエラーが発生しました
    下記サイトを参考にしました

    http://www.mail-archive.com/freebsd@uafug.org.ua/msg06625.html

    /usr/ports/Templates/config.siteの以下の行をコメントアウトすることでportupgradeを使用することが可能になります。
    57 #ac_cv_header_spawn_h=${ac_cv_header_spawn_h=yes}

    ご参考までに

    1. mojamoja3さん、

      情報をありがとうございます。
      私は、その他に発生する ports メンテナンス関係のエラー(tar + xz と strnlen )に耐えきれず、先週 8.3にアップグレードしてしまったのですが、同じ症状とエラーを検索してこのページにたどり着く方もあるようですから、その方々の参考になると思います。

      書き込みありがとうございました。

  2. こちらこそ、いつも有益な情報をありがとうございます。

    先日の投稿、情報が少し古かったようです、現在は上記に加えて以下のコメントアウトも必要なようです。
    270 #: ${ac_cv_func_posix_spawn=yes}
    しかしながら、strnlenのエラーが私の環境でも発生しました。
    このエラーを回避しても以前のようにportupgradeすることはもうむつかしそうです。
    近日中にメジャーアップグレードをしようと思っています。

    1. ports 関係のメモを参照される方は、国内アクセスポイントよりも、なぜか海外ドメインからの方が多いように思えます。日本語のメモを読めるんだろうか?とも思いますが、コマンドやファイル名は英語ですから文字化けさえしなければヒントくらいにはなるのかもしれません。入力いただいた情報は多くの方々に参考になると思いますよ。

      FreeBSDサーバーの場合はWindowsサーバーと異なり、どのプロセスが、何に管理していているか明らかであるため、JPCERTのような組織が知らせてくれるセキュリティー情報を見ていれば、自分のサーバーに関係ある穴なのか、緊急なのか、無視してもいいものなのか、簡単に判別できるところがありがたいです。従って、OSサポートが終了しても、あわてて最新OSバージョンに上げる必要は無く、腰を落ち着けてメンテナンスを続けることが出来ますね。

      しかし、ports からパッケージをインストールしたり、更新出来なくなってしまうと、来るべき時が来たかと感じてしまいます。 このメモの対象サーバーは、FreeBSD7.3 を入れる前は、4.3あたりを使っていて、5系、6系はスキップしてしまいました。7.3に上げたのも、ports から必要なパッケージをビルドできなくなったためです。そう考えると、今回は結構早い時期にportsが使えなくなってしまったものだと感じますが、4系の時は、セキュリティーをそれほど気にする必要がなかった時代だったということもあります。

      今は、8.3に上げ終わったため、ports の管理は楽になりましたが、 8.3 でも perl のバージョンアップで、別のエラーメッセージ遭っているところです。1週間くらいダウンタイムをもらえるなら、クリーンインストールしたいころですよ。
      そうそう、カーネルをGENERICに戻してサイズが大きくなったためか、深夜のCronジョブの最中に、
      swap_pager_getswapspace(16): failed
      が出ることがあります。

      ファイルシステムのことばかり考えていて、スワップサイズに気が回りませんでした。
      次回OSアップデート時は、パーティション切り直しか、スワップスペース追加が必要かも。と考えているところです。

コメントを残す