mirror of https://github.com/kiukotsu/ucore.git
1.4 KiB
1.4 KiB
多目标与自动变量
运行如下命令:
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 1
,text 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)
,默认为空字符串。