目次
SunOS Specific make
ちょろっとGoogleって見る限り、期待通りmake(1S)のマニュアル日本語版は
存在しない模様なので、仕方なく自前で用意する方向になった。;-)
ず〜っと簡単に使えればいいや@GNU makeばかりだったのが、
こんな時にこんな形でつけを払うことになるとは思っていなかったのである。
なお、参照元は Solaris 10 2005-02-22 updateのmanページである。
以下は、そのまま翻訳してもなんなので、知りたいことだけを書いておきます。
NAME
省略
SYNOPSIS
/usr/ccs/bin/make [-d] [-dd] [-D] [-DD] [-e] [-i] [-k] [-n]
[-p] [-P] [-q] [-r] [-s] [-S] [-t] [-V] [-f makefile]...
[-K statefile]... [target...] [ macro = value...]
/usr/xpg4/bin/make [-d] [-dd] [-D] [-DD] [-e] [-i] [-k] [-n]
[-p] [-P] [-q] [-r] [-s] [-S] [-t] [-V] [-f makefile]...
[target...] [ macro = value...]
そういえばxpg4版(=POSIX)のmakeもあるから、文法だとそっちに
準じる方向もありなのかな、あるのか知らんが。
DESCRIPTION
まぁ、適当に。
ずっと意識したことがなかったが、SunOSの頃からあり、現存の
make(1S)にはdefaultのSUFIXES設定が /usr/share/lib/make/make.rulesとして
用意されていて、特に指定がない場合はこれに準じるそうだ。対象言語は
C,C++,Java,Fotran各種,Module-2,Pascal,asm,shell,NeWSである。
つまりはこんな感じで、hello worldのmakefileはok。
all: hello
まぁ、hellow worldにはイランカ。。。
(環境)変数としてコンパイラ(CC)やCFLAGSやらは適正に設定しておく必要がある。
驚くべきwことに、.c~にもルールがある。
さて、.cの場合だけ引用しておくと、下記の通り。
CC=cc
CFLAGS=
CPPFLAGS=
LINT=lint
LINTFLAGS=
LINK.c=$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
LINT.c=$(LINT) $(LINTFLAGS) $(CPPFLAGS)
#
.c:
$(LINK.c) -o $@ $< $(LDLIBS)
上記のmakefileの場合、helloが無いから hello.cを探して、
上記のルールに従うと言う動作(だろう;-))。
無論のことだが、GNU makeでも上記のmakefileは機能します。
いつからか忘れた頃から自前suffix ruleを使い続けていたのだが・・
って、こんなところで知識のなさを公開してしまうとは。orz
OPTIONS
- -d
- -dd
- 動作中の出力を表示する。ruleに従う動作も出力する。
- -D
- -DD
- 読み込んだruleファイルとmakefileを表示する
- -e
- 環境変数でmakefileの内容を上書きする。これが指定されていない状態で、
makefileに定義されているマクロと環境変数名が当たった場合、makeは
マクロを優先するが、このオプションが指定されていると、環境変数値を
優先する。
- -f <makefile>
- 引数のmakefileを利用する。 - の場合、標準入力をmakefileとする。
ファイル未指定の場合の、makefileの検索順は以下表の通り。
1 | ./makefile ./Makefile |
2 | s.makefile SCCS/s.makefile |
3 | s.Makefile SCCS/s.Makefile |
- -i
- cmdのエラーを無視する。.IGNORE: セクションで定義可能。
- -k
- エラーが起きても可能な範囲でターゲットを処理する。
- -K <statefile>
- stateファイルとして<statefile>を利用する。- の場合、標準入力を利用する。
- -n
- 行を読み込むが、実行はしない。POSIXモード(=xpg4)の場合、行頭が+なら実行する。
- -p
- ターゲットと概要を出力する。ついでにruleも出力する。
- -P
- -pに対して、対象makefileのターゲットを出力するだけ。
- -q
- -r
- -s
- silentモード。.SILENT:.セクションを定義するのと同等。
- -S
- -t
- -V
OPERANDS
書けるのは targetか macro=valueの形だけ。
USAGE
ここが長い。w
Reading Makefiles and the Environment
Makefileの動作に関して記載されている。
- 1. 環境変数 MAKEFILESにある引数を読む。POSIX.2の仕様に準じて、
optionは -付きと限定している。
- 2. デフォのmakefileを読んで、カレントにmake.rulesがあればこれを、無ければ
デフォルトのruleファイル(/usr/share/lib/make/make.rules)を読み込む。
- 3. -eが指定されていないなら、境変数を読みんで、makefileのマクロとして追加する。
- 4. -fで指定されたmakefileを読む。
- 5. -eが指定されているなら、引数指定されたマクロ文を評価して、必要があれば上書きする。
- 6. 実行時の環境変数を直近の内容に書き換える。makefile内のマクロは環境変数にはしない。
- appendix. MAKEFILES, MAKE, SHELL, HOST_ARCH, HOST_MACH,TARGET_MACHは特殊なマクロなので、
これらの処理には準じない。
Makefile Target Entries
ターゲットの書式はこんな感じ。
target [:|::] [dependency] ... [; command] ...
\t[command]
\t...
\tはタブ。
Special Characters
- #
- include <filename>
- :と::
- 複数ターゲット
- %
- ./pathname
マクロ
- =
- $
- 参照。後続の ( )か { }で囲まれたマクロに変える。
- ( ) or { }
- $$
- \$
マクロのコマンドによる置換
マクロを参照する際に、$(MACRO:sh)と :shをつけると、マクロのその時点の
値がコマンド名として扱われ、このマクロの参照結果は、シェルでコマンドを
実行した結果となる。
具体的にはこんな感じ。
% make -D
>>>>>>>>>>>>>>>> Reading makefile makefile
HOGE = ls -F
test:
echo $(HOGE:sh)
>>>>>>>>>>>>>>>> End of makefile makefile
echo makefile
makefile
|