ucore/docs/lab1/多目标与自动变量.md

1.4 KiB
Raw Permalink Blame History

多目标与自动变量


运行如下命令:

touch foo bar fun makefile

在Makefile中添加如下内容

all: obj1 obj2 obj3

obj1 obj2 obj3: foo bar fun
	@echo $^
	@echo $<
	@echo $(subst obj,text,$@)
	@echo "\n"

然后运行make会得到如下结果:

foo bar fun
foo
text1


foo bar fun
foo
text2


foo bar fun
foo
text3
  • $^:获取所有的依赖文件
  • $<:获取第一个依赖文件
  • $@:获取所有目标文件

注意:(subst obj,text,$@)中,两个,之间不能有空格,即text前后不能有空格,否则,在替换的时候就会出现空格替换的情况。例如@echo $(subst obj,text ,$@)这种情况就会输出text 1text 2 text 3

后缀规则


对于.SUFFIXES: .c .S .h表示的后缀规则,展开为% : %.c% : %.S% : %.h,即定义了三组默认的模式规则,相当于定义了自己的后缀列表,删除了默认的后缀列表(.out, .a, .ln, .o, .c, .cc, .C, .p, .f, .F, .r, .y, .l, .s, .S, .mod, .sym, .def, .h, .info, .dvi, .tex, .texinfo, .texi, .txinfo, .w, .ch .web, .sh, .elc, .el)。

Call函数


makefile中写入如下内容:

reverse = $(2) $(1)
foo = $(call reverse,a,$(2))
bar = $(call reverse,a,b)
all:
	@echo $(foo)
	@echo $(bar)

输出结果为:

a
b a

对于没有给定的输入参数$(2),默认为空字符串。