目次

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
    • 読み込んだmakefileを表示する
  • -DD
    • 読み込んだruleファイルとmakefileを表示する
  • -e
    • 環境変数でmakefileの内容を上書きする。これが指定されていない状態で、
    • makefileに定義されているマクロと環境変数名が当たった場合、makeは マクロを優先するが、このオプションが指定されていると、環境変数値を 優先する。
  • -f <makefile>
    • 引数のmakefileを利用する。 - の場合、標準入力をmakefileとする。
    • ファイル未指定の場合の、makefileの検索順は以下表の通り。
1./makefile ./Makefile
2s.makefile SCCS/s.makefile
3s.Makefile SCCS/s.Makefile
  • -i
    • cmdのエラーを無視する。.IGNORE: セクションで定義可能。
  • -k
    • エラーが起きても可能な範囲でターゲットを処理する。
  • -K <statefile>
    • stateファイルとして<statefile>を利用する。- の場合、標準入力を利用する。
  • -n
    • 行を読み込むが、実行はしない。POSIXモード(=xpg4)の場合、行頭が+なら実行する。
  • -p
    • ターゲットと概要を出力する。ついでにruleも出力する。
  • -P
    • -pに対して、対象makefileのターゲットを出力するだけ。
  • -q
    • 謎のQuestionモード。
  • -r
    • デフォルトのruleファイルを利用しない
  • -s
    • silentモード。.SILENT:.セクションを定義するのと同等。
  • -S
    • 実行結果が0以外の場合、処理を中断する
  • -t
    • ルールを実行しないで、ターゲットをtouchする
  • -V
    • System 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>
    • 深さ16までのincludeが可能。
  • :と::
    • 依存性のあるもののリストを後述できる。
  • 複数ターゲット
    • :の前に複数個のターゲットを書くことが出来る。
  • %
    • wild card
  • ./pathname
    • makeは先頭の ./を無視する

マクロ

  • =
    • マクロ定義の行のデリミタ
  • $
    • 参照。後続の ( )か { }で囲まれたマクロに変える。
  • ( ) or { }
    • マクロ名のデリミタ。
  • $$
    • $自体(だが、shellだと普通PID。。。)
  • \$
    • $を文字として扱う場合

マクロのコマンドによる置換

マクロを参照する際に、$(MACRO:sh)と :shをつけると、マクロのその時点の 値がコマンド名として扱われ、このマクロの参照結果は、シェルでコマンドを 実行した結果となる。
具体的にはこんな感じ。
 % make -D
 >>>>>>>>>>>>>>>> Reading makefile makefile
 HOGE  = ls -F
 test:   
         echo $(HOGE:sh)
 >>>>>>>>>>>>>>>> End of makefile makefile
 echo makefile
 makefile

Last-modified: 2006-06-22 16:57:07