いきなり脱線。
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とか、[とか…、いろいろなことが絡み合って、混乱してしまうのですが、処理の流れとしては
- gmakeがMakefileを解釈して実行しているときに、
- Makefileの中の、実行すべきコマンドの部分は、Makefileで指定されたシェルによって(この場合は/bin/shだった)実行されて、
- /bin/shは、if文を実行し、条件式部分にある [ を、/bin/shに内蔵のコマンドとして実行しようとし、
- /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 件のコメント:
コメントを投稿