GNU make -p option

$make -p
にていろいろな暗黙ルールがわかるね
長いので grep -v "^#" | grep -v "^$" でフィルターしたのが以下

たとえば、
ファイルの検出順位とSUFFIXESとの関係は
SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el

でわかるし、

ファイルの生成規則は
たとえば、.c から .oは
.c.o:
$(COMPILE.c) $(OUTPUT_OPTION) $<

マクロの定義例

CC = cc

自動展開されるマクロ名(?,@,<,*)は見つけられなかったので、備忘録として書いときます。

ターゲットと実行条件に基づいて、 ルールが実行されるたびにこれらは計算された値を持つ

$* 	ターゲット名からサフィクスを取り除いたものに展開
$@ 	ターゲットの完全名に展開 (生成されるファイルだね)
$< 	コマンド実行のトリガーとなった関連ファイル名に展開(元ファイルだね)
$? 	ターゲットファイル名より更新時刻の新しいファイル名に展開
通常、アーカイブの構成メンバなど
$% 	ターゲットがアーカイブメンバの場合は、その名前。 それ以外は、空

ルールの中で $ 記号を使う場合は、 $$ とする

makefileの形式は

 target : target1 target2 ...
 <tab> command1
 <tab> command2
 ...

または
 target : target1 ... ; command
 <tab> command
  ....

target1とか2は targetに依存するファイル。
makeは子プロセスとしてshを起動し、以降のcommandを一行ずつ引き渡す。
一行ずつだよ。ここ大事
あと、command行の先頭に@をつけると、コマンド行が表示されなくなる。
#はコメント。
shellの変数iを渡したいときは $$iとか書くとよい

  command1 ; command2ってできるのかなぁ、これ宿題w


<D = $(patsubst %/,%,$(dir $<))
?F = $(notdir $?)
DESKTOP_SESSION = ubuntu-2d
CWEAVE = cweave
?D = $(patsubst %/,%,$(dir $?))
@D = $(patsubst %/,%,$(dir $@))
XAUTHORITY = /home/hirasawa/.Xauthority
GDMSESSION = ubuntu-2d
XMODIFIERS = @im=ibus
CURDIR := /home/hirasawa
SHELL = /bin/sh
RM = rm -f
CO = co
_ = /usr/bin/make
PREPROCESS.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F
XDG_CONFIG_DIRS = /etc/xdg/xdg-ubuntu-2d:/etc/xdg
OUTPUT_OPTION = -o $@
COMPILE.cpp = $(COMPILE.cc)
MAKEFILE_LIST := 
@F = $(notdir $@)
LINK.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
MANDATORY_PATH = /usr/share/gconf/ubuntu-2d.mandatory.path
XDG_DATA_DIRS = /usr/share/ubuntu-2d:/usr/share/gnome:/usr/local/share/:/usr/share/
DBUS_SESSION_BUS_ADDRESS = unix:abstract=/tmp/dbus-RTfNuQQnE2,guid=5f0d077befcd46c07f00acc9000000fa
CC = cc
CHECKOUT,v = +$(if $(wildcard $@),,$(CO) $(COFLAGS) $< $@)
LESSOPEN = | /usr/bin/lesspipe %s
CPP = $(CC) -E
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
XDG_SESSION_PATH = /org/freedesktop/DisplayManager/Session0
LEX = lex
PATH = /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LD = ld
TEXI2DVI = texi2dvi
GPG_AGENT_INFO = /tmp/keyring-YXUrhG/gpg:0:1
YACC = yacc
SESSION_MANAGER = local/ubuntu1204-20:@/tmp/.ICE-unix/1703,unix/ubuntu1204-20:/tmp/.ICE-unix/1703
COMPILE.mod = $(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)
ARFLAGS = rv
LINK.r = $(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)
WINDOWID = 67108869
COMPILE.f = $(FC) $(FFLAGS) $(TARGET_ARCH) -c
LINT.c = $(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)
LINT = lint
UBUNTU_MENUPROXY = libappmenu.so
YACC.y = $(YACC) $(YFLAGS)
AR = ar
.FEATURES := target-specific order-only second-expansion else-if archives jobserver check-symlink
TANGLE = tangle
LS_COLORS = rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
SSH_AUTH_SOCK = /tmp/keyring-YXUrhG/ssh
GET = get
%F = $(notdir $%)
DISPLAY = :0
COMPILE.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
CTANGLE = ctangle
GTK_IM_MODULE = ibus
.LIBPATTERNS = lib%.so lib%.a
LINK.C = $(LINK.cc)
PWD = /home/hirasawa
LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)
PREPROCESS.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F
SSH_AGENT_PID = 1742
LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.s = $(CC) $(ASFLAGS) $(LDFLAGS) $(TARGET_MACH)
HOME = /home/hirasawa
XDG_SESSION_COOKIE = ed54b70751e68cb7608c38290000000b-1341018922.434808-1780229165
LOGNAME = hirasawa
LESSCLOSE = /usr/bin/lesspipe %s %s
GNOME_DESKTOP_SESSION_ID = this-is-deprecated
^D = $(patsubst %/,%,$(dir $^))
COLORTERM = gnome-terminal
MAKE = $(MAKE_COMMAND)
QT_IM_MODULE = xim
SHLVL = 1
AS = as
PREPROCESS.S = $(CC) -E $(CPPFLAGS)
COMPILE.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
MAKE_VERSION := 3.81
USER = hirasawa
FC = f77
.DEFAULT_GOAL := 
XDG_CURRENT_DESKTOP = Unity
%D = $(patsubst %/,%,$(dir $%))
GNOME_KEYRING_PID = 1692
WEAVE = weave
MAKE_COMMAND := make
LINK.cpp = $(LINK.cc)
F77 = $(FC)
OLDPWD = /home/hirasawa
.VARIABLES := 
PC = pc
*F = $(notdir $*)
XDG_SEAT_PATH = /org/freedesktop/DisplayManager/Seat0
COMPILE.def = $(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)
GNOME_KEYRING_CONTROL = /tmp/keyring-YXUrhG
MAKEFLAGS = p
MFLAGS = -p
*D = $(patsubst %/,%,$(dir $*))
LEX.l = $(LEX) $(LFLAGS) -t
+D = $(patsubst %/,%,$(dir $+))
COMPILE.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c
+F = $(notdir $+)
M2C = m2c
DEFAULTS_PATH = /usr/share/gconf/ubuntu-2d.default.path
MAKEFILES := 
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
<F = $(notdir $<)
CXX = g++
COFLAGS = 
COMPILE.C = $(COMPILE.cc)
^F = $(notdir $^)
COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c
LINK.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.s = $(AS) $(ASFLAGS) $(TARGET_MACH)
.INCLUDE_DIRS = /usr/include /usr/local/include /usr/include
MAKELEVEL := 0
MAKEINFO = makeinfo
LINK.f = $(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)
TEX = tex
LANG = ja_JP.UTF-8
TERM = xterm
F77FLAGS = $(FFLAGS)
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
%.out:
%.a:
%.ln:
%.o:
%: %.o
	$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.c:
%: %.c
	$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.ln: %.c
	$(LINT.c) -C$* $<
%.o: %.c
	$(COMPILE.c) $(OUTPUT_OPTION) $<
%.cc:
%: %.cc
	$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.cc
	$(COMPILE.cc) $(OUTPUT_OPTION) $<
%.C:
%: %.C
	$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.C
	$(COMPILE.C) $(OUTPUT_OPTION) $<
%.cpp:
%: %.cpp
	$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.cpp
	$(COMPILE.cpp) $(OUTPUT_OPTION) $<
%.p:
%: %.p
	$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.p
	$(COMPILE.p) $(OUTPUT_OPTION) $<
%.f:
%: %.f
	$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.f
	$(COMPILE.f) $(OUTPUT_OPTION) $<
%.F:
%: %.F
	$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.F
	$(COMPILE.F) $(OUTPUT_OPTION) $<
%.f: %.F
	$(PREPROCESS.F) $(OUTPUT_OPTION) $<
%.r:
%: %.r
	$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.r
	$(COMPILE.r) $(OUTPUT_OPTION) $<
%.f: %.r
	$(PREPROCESS.r) $(OUTPUT_OPTION) $<
%.y:
%.ln: %.y
	$(YACC.y) $< 
	$(LINT.c) -C$* y.tab.c 
	$(RM) y.tab.c
%.c: %.y
	$(YACC.y) $< 
	mv -f y.tab.c $@
%.l:
%.ln: %.l
	@$(RM) $*.c
	$(LEX.l) $< > $*.c
	$(LINT.c) -i $*.c -o $@
	$(RM) $*.c
%.c: %.l
	@$(RM) $@ 
	$(LEX.l) $< > $@
%.r: %.l
	$(LEX.l) $< > $@ 
	mv -f lex.yy.r $@
%.s:
%: %.s
	$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.s
	$(COMPILE.s) -o $@ $<
%.S:
%: %.S
	$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.S
	$(COMPILE.S) -o $@ $<
%.s: %.S
	$(PREPROCESS.S) $< > $@
%.mod:
%: %.mod
	$(COMPILE.mod) -o $@ -e $@ $^
%.o: %.mod
	$(COMPILE.mod) -o $@ $<
%.sym:
%.def:
%.sym: %.def
	$(COMPILE.def) -o $@ $<
%.h:
%.info:
%.dvi:
%.tex:
%.dvi: %.tex
	$(TEX) $<
%.texinfo:
%.info: %.texinfo
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
%.dvi: %.texinfo
	$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.texi:
%.info: %.texi
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
%.dvi: %.texi
	$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.txinfo:
%.info: %.txinfo
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
%.dvi: %.txinfo
	$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.w:
%.c: %.w
	$(CTANGLE) $< - $@
%.tex: %.w
	$(CWEAVE) $< - $@
%.ch:
%.web:
%.p: %.web
	$(TANGLE) $<
%.tex: %.web
	$(WEAVE) $<
%.sh:
%: %.sh
	cat $< >$@ 
	chmod a+x $@
%.elc:
%.el:
(%): %
	$(AR) $(ARFLAGS) $@ $<
%.out: %
	@rm -f $@ 
	cp $< $@
%.c: %.w %.ch
	$(CTANGLE) $^ $@
%.tex: %.w %.ch
	$(CWEAVE) $^ $@
%:: %,v
	$(CHECKOUT,v)
%:: RCS/%,v
	$(CHECKOUT,v)
%:: RCS/%
	$(CHECKOUT,v)
%:: s.%
	$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
%:: SCCS/s.%
	$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
.web.p:
	$(TANGLE) $<
.l.r:
	$(LEX.l) $< > $@ 
	mv -f lex.yy.r $@
.dvi:
.F.o:
	$(COMPILE.F) $(OUTPUT_OPTION) $<
.l:
.y.ln:
	$(YACC.y) $< 
	$(LINT.c) -C$* y.tab.c 
	$(RM) y.tab.c
.o:
	$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
.y:
.def.sym:
	$(COMPILE.def) -o $@ $<
.p.o:
	$(COMPILE.p) $(OUTPUT_OPTION) $<
.p:
	$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@
.txinfo.dvi:
	$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
.a:
.l.ln:
	@$(RM) $*.c
	$(LEX.l) $< > $*.c
	$(LINT.c) -i $*.c -o $@
	$(RM) $*.c
.w.c:
	$(CTANGLE) $< - $@
.texi.dvi:
	$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
.sh:
	cat $< >$@ 
	chmod a+x $@
.cc:
	$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
.cc.o:
	$(COMPILE.cc) $(OUTPUT_OPTION) $<
.def:
.SUFFIXES: .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
.c.o:
	$(COMPILE.c) $(OUTPUT_OPTION) $<
Makefile:
.r.o:
	$(COMPILE.r) $(OUTPUT_OPTION) $<
.r:
	$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@
makefile:
.info:
.elc:
.l.c:
	@$(RM) $@ 
	$(LEX.l) $< > $@
.out:
.C:
	$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@
.r.f:
	$(PREPROCESS.r) $(OUTPUT_OPTION) $<
.S:
	$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@
.texinfo.info:
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
.c:
	$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
.w.tex:
	$(CWEAVE) $< - $@
.c.ln:
	$(LINT.c) -C$* $<
.s.o:
	$(COMPILE.s) -o $@ $<
.s:
	$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
.texinfo.dvi:
	$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
.el:
.texinfo:
.y.c:
	$(YACC.y) $< 
	mv -f y.tab.c $@
.web.tex:
	$(WEAVE) $<
.texi.info:
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
.DEFAULT:
.h:
.tex.dvi:
	$(TEX) $<
.cpp.o:
	$(COMPILE.cpp) $(OUTPUT_OPTION) $<
.cpp:
	$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
.C.o:
	$(COMPILE.C) $(OUTPUT_OPTION) $<
.ln:
.texi:
.txinfo:
.tex:
.txinfo.info:
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
.ch:
GNUmakefile:
.S.s:
	$(PREPROCESS.S) $< > $@
.mod:
	$(COMPILE.mod) -o $@ -e $@ $^
.mod.o:
	$(COMPILE.mod) -o $@ $<
.F.f:
	$(PREPROCESS.F) $(OUTPUT_OPTION) $<
.w:
.S.o:
	$(COMPILE.S) -o $@ $<
.F:
	$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@
.web:
.sym:
.f:
	$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@
.f.o:
	$(COMPILE.f) $(OUTPUT_OPTION) $<