2008年3月20日木曜日

(pkgsrc) Solaris8で、pkgsrcのmath/capc-calcがビルドできなかった ~ /bin/sh: test: argument expected

いきなり脱線。



25年くらい前ですかね、パソコンの…というかそのころはマイコンって呼んでましたけど…紹介する書籍や雑誌記事で、よく見られた例ですけど、こんな感じでしたでしょうか

マイコンは、電卓の代わりにもなります。こうやって、計算もできるんです。



PRINT 5+8   ここでReturnキーを押す
13        答えが表示される
OK        これはプロンプト



ほら、すごく便利でしょう。

え~と、わざわざPRINTと入力するのがめんどくさくて、やってられないんですけど(笑)。まあ、そんなこともあろうかと、PRINTと入力する代わりに、?でもよい場合があって

? 5+8
13

とできたりもしました。他にも、省略形というのが使えるBASICでは、PRINTの代わりにP.か、PR.か、命令語の先頭数文字にピリオド(.)をつけるだけでもよかったりもしました。ああ懐かしい。



というわけで、マイコン、というか、そのBASICという言語では、電卓代わりとして使うには、なんだかな~、だったわけです。



そんな中、当時、シャープのポケコンPC-1245を手に入れたわけなんです。今も覚えていますが9800円でした。おっと、ポケコンは、ポケット・コンピュータのことです。手のひらにのるくらいの大きさで、胸のポケットに入れるにはでかすぎるけど、コートのポケットには入る程度。



シャープのポケコン(すみません、他社のポケコンは知りません)では、モードという概念がありました。モードは、スイッチでパチッとやって切り替えます。
正確な名前は忘れちゃったんですけど、BASICのプログラムを入力するモードと、プログラムを実行するモード、その2つのモードがありました。



その後者、実行するほうのモードでは、計算式を直接入力して、計算させることができて、
>というプロンプトが表示されているときに、

5+8   と入力してEnterキーを押すと
13   と表示されました。

画面表示は、1文字が5x7ドットで構成された液晶ディスプレイで、1行しか表示できなかったんで、あれを知らない人には、この感覚がよくわかんないかと思いますけど。



この実行モードでは、変数への代入もできたりで、電卓と同じように使えるどころか、電卓よりもずっと使いやすくて、コンピュータって便利だ、もう電卓なんて使う気にはなれない、と、そう思わせるのに十分すぎるほどの使いやすさでした。



というわけで、ポケコンが大のお気に入りで、大学に入学したときにも、PC-1480Uってのを買ったりしましたし(Uがつくのは、大学生協バージョン)。
長年ポケコンを使ってたんですけど、パソコンをメインに使うころになると、パソコンとポケコンの2つを同時に使うのもなんとなくめんどくさくて、だんだんとポケコンを使わなくなってしまいました。



私の場合、パソコンで、ちょこちょこっと計算したいときに、どんなソフトを使うかっていうと、たいていは、bcコマンドですかね。

% bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5+8
13

Windowsの「電卓」や、X Window Systemのxcalcなどなど、本物の電卓を模倣したツールもありますが、私に言わせれば

電卓なんて不便な道具を、なぜコンピュータ上で、わざわざ不便なところまで模倣までして、使わなければならないのだ

ということです。



bcでも大抵はよかったんですが、シャープのポケコンみたいな使い方はできないので、かなり不満に感じているところがありました。
そんな中、最近みつけたのが、「calc」というツールでした。FreeBSDだとportsになっていて、math/calc、pkgsrcの場合は、math/capc-calcとなっています。



% calc
C-style arbitrary precision calculator (version 2.12.1.8)
Calc is open software. For license details type:  help copyright
[Type "exit" to exit, or "help" for help.]



; 5+8
        13
; a=5+8
; a*2
        26



変数も使えるし、



; 0x10 * 2
        32
; config("mode","hex")
        "real"
; 0x10*2
        0x20    ※元に戻すにはconfig("mode","real")



16進数も使えるし、けっこうかゆいところに手が届く、便利なツールです。
でも、まだポケコンの方がよかったかなぁ…





閑話休題。



先日、Solaris8で、pkgsrcを使ってmath/capc-calcをbmakeしたら、以下のようなエラーになりました。



# bmake
=> Bootstrap dependency digest>=20010302: found digest-20070803
===> Skipping vulnerability checks.
=> Checksum SHA1 OK for calc-2.12.2.tar.gz
=> Checksum RMD160 OK for calc-2.12.2.tar.gz
===> Installing dependencies for capc-calc-2.12.2
==========================================================================
The following variables will affect the build process of this package,
capc-calc-2.12.2.  Their current value is shown below:

        * CURSES_DEFAULT = curses

Based on these variables, the following variables have been set:

        * CURSES_TYPE = curses
        * TERMCAP_TYPE = curses

You may want to abort the process now with CTRL-C and change their value
before continuing.  Be sure to run `/usr/pkg/bin/bmake clean' after
the changes.
==========================================================================
=> Build dependency gmake>=3.78: found gmake-3.81
=> Full dependency ncurses>=5.4nb1: found ncurses-5.6nb2
=> Full dependency readline>=5.0: found readline-5.2
=> Full dependency gcc34>=3.4.6: found gcc34-3.4.6nb1
===> Overriding tools for capc-calc-2.12.2
===> Extracting for capc-calc-2.12.2
GConf エラー: 使用できないキーまたはディレクトリ名です: "/desktop/gnome/url-handlers/DDd+hh/command": '+' は キー/ディレクトリ名の中では不正な文字です
===> Patching for capc-calc-2.12.2
=> Applying pkgsrc patches for capc-calc-2.12.2
===> Creating toolchain wrappers for capc-calc-2.12.2
===> Configuring for capc-calc-2.12.2
===> Building for capc-calc-2.12.2
/bin/sh: test: argument expected
gmake: *** [.static] Error 1
*** Error code 2

Stop.
bmake: stopped in /usr/pkgsrc/math/capc-calc
*** Error code 1

Stop.
bmake: stopped in /usr/pkgsrc/math/capc-calc



GConfエラーってのは、よくわからないので無視するとして、



/bin/sh: test: argument expected



を調べてみました。



とりあえず、bmake PKG_DEBUG_LEVEL=2 してみたり、gmakeにデバッグ用の-dオプションをつけて手動実行してみたところ、結局よくわからず、わかったのは、上のログにも出ているように、Makefileの.staticというターゲットの中でエラーがおきているらしいことだけ。



仕方ないので、嫌々、Makefileを眺めてみました。え~と…読みづらいんだよなぁ。



.static: ${MAKE_FILE}
        ${Q} r="calc-static-only"; \                                           
            if [ "${BLD_TYPE}" != "$$r" ]; then \                              
            echo "NOTE: The host target $(target) defaults to a build" 1>&2; \ 
            echo "      type of: ${BLD_TYPE}, so you need to use" 1>&2; \
            echo "      the following make command:" 1>&2; \
            echo "" 1>&2; \
            echo "      ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
            echo "      ${MAKE} -f ${MAKE_FILE} $$r BLD_TYPE=$$r" 1>&2; \
            echo "" 1>&2; \
            echo "NOTE: It is a very good idea to c first clobber any" 1>&2; \
            echo "      previously built .o, libs and executables" 1>&2; \
            echo "      before switching to $$r!" 1>&2; \
            echo "" 1>&2; \
            echo "=== aborting make ===" 1>&2; \
            exit 3; \
        fi
        ${Q} for i in .dynamic ${CALC_DYNAMIC_LIBS} ${SYM_DYNAMIC_LIBS} \      
                      custom/libcustcalc${LIB_EXT_VERS}; do \                  
            r="calc-static-only"; \                                             
            if [ -e "$$i" ]; then \                                             
                echo "Found the dynamic target $$i file.  You must:" 1>&2; \   
                echo "" 1>&2; \                                                
                echo "      ${MAKE} -f ${MAKE_FILE} clobber" 1>&2; \
            



testって出てたから、[を探すとして、え~と、もしかして、これですか!?



            if [ -e "$$i" ]; then \                                             



gmake、Makefile、/bin/sh、/bin/shのbuilt-inコマンドであるtestとか、[とか…、いろいろなことが絡み合って、混乱してしまうのですが、処理の流れとしては



  1. gmakeがMakefileを解釈して実行しているときに、


  2. Makefileの中の、実行すべきコマンドの部分は、Makefileで指定されたシェルによって(この場合は/bin/shだった)実行されて、


  3. /bin/shは、if文を実行し、条件式部分にある [ を、/bin/shに内蔵のコマンドとして実行しようとし、


  4. /bin/bashの内蔵コマンドであるtestコマンドで、エラーがでた。/bin/sh: test: argument expected


ということになっているようです。



どうやら一部では有名な話らしいのですが、Solarisの/bin/shの内蔵コマンドであるtestコマンドには、「-e」オプションがないんですね。



こんな感じで確認できます。

% /bin/sh



$ test -e /etc/motd && echo "OK"
test: argument expected



$ /bin/test -e /etc/motd && echo "OK"
OK           あれ?こういうものなの?

一方、Solarisでも、/bin/bashを使えば、こんな感じで、うまくいくようです。

% /bin/bash



$ test  -e /etc/motd && echo "OK"
OK



$ /bin/test -e /etc/motd && echo "OK"
OK


■ 解決方法



というわけで、この手の問題では常套手段なのですが、/bin/shがだめなら、/bin/bashを使え、ってことなわけです。



gmakeのinfoを読んでみたところ、GNU makeの場合、どのシェルで実行させるかは、Makefile中で、変数SHELLで指定させるそうです。環境変数SHELLは、ふつう、ユーザーのログインシェルになってますから、cshとかだったりするかもしれず、makeで使うわけにはいきませんからねぇ。



コンパイルが行われている作業ディレクトリに行って、Makefileを覗いてみると、SHELL= /bin/sh と堂々と記述されていました。



なので、こんな感じにMakefileを書き換え。

# standard utilities used during make
#
#SHELL= /bin/sh
SHELL= /bin/bash
LANG= C
MAKE= make

元のディレクトリ(/usr/pkgsrc/math/capc-calc)に戻って、もう一度bmake。



これでうまく最後まで通りました。GConfうんぬんは、どうでもよかったみたいです。



0 件のコメント:

コメントを投稿