2007年8月24日金曜日

最近Solarisでpkgsrcを使うとエラー /bin/sh: syntax error at line 1: `;' unexpected

FreeBSDでportsによるソフトウェア・パッケージ管理の快感を覚えてしまったので、FreeBSD以外のSolarisやLinux系などのOSでも(なぜかNetBSDは無いのですが・・・笑)、portsによく似た、pkgsrcを使っています。



さてさて、このごろ、Solaris9、Solaris10なホストで、pkgsrcを使って、bmakeコマンドでソフトウェアをビルドしようとすると、



/bin/sh: syntax error at line 1: `;' unexpected



というエラーがでるようになりました。



たとえば、こんな感じです。



# bmake
=> Required installed package digest>=20010302: digest-20070803 found
===> Skipping vulnerability checks.
=> Checksum SHA1 OK for php-5.2.3/php-5.2.3.tar.bz2
=> Checksum RMD160 OK for php-5.2.3/php-5.2.3.tar.bz2
===> Installing dependencies for php-5.2.3nb3
==========================================================================
The supported build options for php are:



        cgi fastcgi inet6 ssl



The currently selected options are:



        cgi inet6 ssl



You can select which build options to use by setting PKG_DEFAULT_OPTIONS
or the following variable.  Its current value is shown:



        PKG_OPTIONS.php (not defined)
/bin/sh: syntax error at line 1: `;' unexpected
*** Error code 2



Stop.
bmake: stopped in /usr/pkgsrc/lang/php5




bmake -n
してコマンドを抽出して、実行しなおしてみると、この部分がエラーになっていることがわかりました。



set -- dummy  "Deprecated variable "USE_INET6" set to "YES", use PKG_DEFAULT_OPTIONS+="inet6" instead.";  if test $# -gt 1; then /usr/ucb/echo; fi;  for l; do  if test "$l" = "dummy"; then continue; fi;  /usr/ucb/echo "$l";  done



ためしに、セミコロンで継続している部分を、改行して別々の行に分離してみると、エラーがでません。



少しずつ、セミコロンを置き換えてみて、問題となる箇所をしぼりこんでいくと・・・こんな内容のファイルhogehogeを、



set -- dummy  "Deprecated variable "USE_INET6" set to "YES", use PKG_DEFAULT_OPTIONS+="inet6" instead."
if test $# -gt 1
then /usr/ucb/echo
fi
for l ;  do  if test "$l" = "dummy"; then continue; fi
  /usr/ucb/echo "$l";  done



/bin/sh hogehogeして、実行してみると



hogehoge: syntax error at line 5: `;' unexpected



となるので、どうやらSolarisの/bin/shは、



for l ;  do  if test "$l" = "dummy"; then continue; fi



という書き方が、気に入らないようです(!?)。



ちなみに、上記のコマンドは、pkgsrc/mk/bsd.options.mkの以下の部分から作られているようです。



@${ECHO} "or "${PKG_OPTIONS_VAR:Q}"."
@set -- dummy ${PKG_OPTIONS_DEPRECATED_WARNINGS}; \
if ${TEST} $$# -gt 1; then ${ECHO}; fi; \
for l; \
do \
        if ${TEST} "$$l" = "dummy"; then continue; fi; \
        ${ECHO} "$$l"; \
done



しかし、/bin/shでエラーになる書き方でも、bashならOKなので、/etc/mk.confに、こんなのを書いてみました。



.SHELL: name=bash path=/bin/bash hasErrCtl=true \
       check="set -e" ignore="set +e" \
       echo="set -v" quiet="set +v" filter="set +v" \
       echoFlag=v errFlag=e



こうすると、Makefile中のコマンドが、/bin/shではなく、/bin/bashで実行されるようになるそうです。



こんなテクニックを、昔から知ってたわけじゃなくて、FreeBSDのmakeコマンド(GNU makeではなく、BSD系のmake)のマニュアルをざ~っと眺めて、あたりをつけたのち、pkgsrc/mk/platform/OSF1.mk のなかに、そっくりな記述を見つけたのでした。



# current bmake is broken, see pkg/25559



#.SHELL: name=ksh path=/bin/ksh hasErrCtl=true \
#       check="set -e" ignore="set +e" \
#       echo="set -v" quiet="set +v" filter="set +v" \
#       echoFlag=v errFlag=e



これを参考にしただけです。



3 件のコメント:

  1. はじめまして.
    Googleで検索してこのエントリを見つけました.
    私も先日同じ問題でハマりまして,そのときはbsd.options.mkを適当に修正することで対処したのですが,なるほど,こういう方法もあるのですね.勉強になりました.ありがとうございます.
    なお,私の取った方法は私の日記の以下のエントリに書いております.ご参考になれば幸いです.
    http://d.hatena.ne.jp/uenoB/20070821
    また,勝手で恐縮ですが上記エントリからこのエントリにリンクを張らせて頂きました.よろしくお願い致します.

    返信削除
  2. sendmail を インスト−ル 中に qpopper4.1.0を make make install すると @if ..... ; then \ という表記が 気に入らないでしょうか syntax error とでます。 どこが 悪いのか な?
    困ってます。solaris11 です。

    返信削除
  3. お騒がせしまして 済みません qpopper4.1.0 は Makefile を書き直した時の タイプミスでした。 スペ−スをとりすぎ。
    申し訳ありません。

    返信削除