* 5 コマンド
- うーん。この章もいまひとつわかりにくい。
- infoの方がわかりやすい気がする。
- もしかしたら、infoがけっこうちゃんと書かれてい
るので、それとは違うことを書こうとしてこういう
風になっていのかなぁ。
- いずれにしても、infoをやった方がよさそうだ。
** 5 Writing the Commands in Rules
- makeによるコマンドゾーンの取扱い
- 一行毎に取扱うのが基本
- 書かれた順に、一行毎に実行される。
- デフォルトのシェルは/bin/sh
- これは環境変数のSHELLをみているのではなく、
make独自管理。
*** 5.1 Command Syntax
- makefileというのは、make構文とshell構文という2
つの言語が入り乱れるものである。
- makeはshell構文を基本的には理解しない。よって、
その文字列に必要な処理を加えた上で、シェルにわ
たすだけである。
- rule context とは
- target-and-prerequistes行で始まる。
- 次のtarget-and-prerequistes行がでてきたら終わ
る。
- また、変数定義がでてきても終わる。
- command line とは
- rule contextにあり、行頭文字がタブの行は、
command line for that ruleと呼ばれる。
**** 5.1.1 Splitting Command Lines
- makeはcommand lineのかきぶりに応じて多少振る舞
いをかえる。これはそのひとつ。
- command lineの行末のbackslashを、makeは認識する。
makeは行末がbackslashの間は同一のシェルに
command lineを渡しつづける。
あくまで単一のシェルで処理をするということだけ
がmakeの所作。backslash含めて、各行はそのままシェ
ルに送られる。backslashの行の次の行では、タブか
ら始まっていなくともcommand lineとみなし、シェ
ルにおくる。
------
all :
@echo no\
space
@echo no\
space
@echo one \
space
@echo one\
space
------
結果
------
nospace
nospace
one space
one space
------
**** 5.1.2 Using Variables in Commands
- makeはcommand lineのかきぶりに応じて多少振る舞
いをかえる。これもそのひとつ。
- makeはcommand lineの中の変数参照と関数参照を展開
する。
- 例。
------
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
# 結果
#for i in one two three; do \
# echo $i; \
#done
#
#one
#two
#three
------
- $が先頭にある文字列について、makeに展開させずに
シェルにそのまま渡したい場合は、$を頭につける。
すなわちシェルに$iをわたしたければ、$$iとする。
*** 5.2 Command Echoing
- makeはcommand lineをシェルに渡す前に、その
command lineを出力する。これによって、どんな
commandが実行されているのかが見てとれる。これを
Echoingと言う。
- command lineのcommandの先頭を'@'にすると、この
Echoingが抑制される。
- 例は既出。
*** 5.3 Command Execution
- 各command line毎に別のsubshellで実行するのが基
本。(実際には結果が変わらない範囲で、同一の
subshellを使いつづける。これは効率のためのmake
の工夫)
- なので、例えば、作業ディレクトリといてcdすると
きなどは注意が必要。そのcdは、そのcommand line
のみで有効だからだ。
- そういう場合は、command lineのシェルとしてのか
きぶりで対応する。
cd $(@D) && gobble $(@F) > ../$@
など。
**** 5.3.1 Choosing the Shell
- makefileで設定したSHELL変数はデフォルトではエキ
スポートされない。
*** 5.4 Parallel Execution
- デフォルトでは、makeはcommandをシーケンシャルに
実行する。
- '-j'をmakeにつけると、複数commandsを並行実行す
るようになる。
- '-j N'とすると同時に最大N個のcommandsを並行実行
する。
- 難点
- makeからのメッセージが混乱して、読みにくい。
- 標準入力を扱うcommandsは、競合し、エラーとな
ることがある。
- '-l R'によって(Rは実数)、makeが並行プロセスを追
加で立ち上げる際に、load averageを確認するように
なる。R以上なら追加しない。
*** 5.5 Errors in Commands
- まず、makeは各command lineの終了時にexit status
を確認する。正常終了であれば、先に進み、エラー
であれば、makeの処理を停止する。これが基本。
- エラーになっても処理を停止したくないcommand
linesには、commandの頭に'-'をつける。
- 例。
------
clean:
-rm -f *.o
------
*** 5.6 Interrupting or Killing 'make'
- C-cなどでmakeを中断した場合、makeを開始したとき
よりも最新の日付にかわっているターゲットは、
makeによって削除される。これは壊れたターゲット
が存在することを避けるためです。
- ターゲットを'.PRECIOUS'で指定すると、この自動削
除は実施されない。
*** 5.7 Recursive Use of 'make'
- これは後の章にて。
*** 5.8 Defining Canned Command Sequences
- defineマクロのこと。
*** 5.9 Using Empty Commands
- Empty Commandsは、
------
target: ;
------
と書いた方がよい。tabだけcommand lineは、見にく
いから。
- これは、暗黙ルールからターゲットを除外するため
に使う。
こつこつ。
0 件のコメント:
コメントを投稿