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行の先頭に@をつけると、コマンド行が表示されなくなる。
#はコメント。
shellの変数iを渡したいときは $$iとか書くとよい
<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) $<