define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
foo.c:foo.y
$(run-yacc)
把foo.y转换为foo.c
9.使用变量
objs = program.o foo.o
使用的时候可以使用()或{}包裹起来,前面
添加$符号即可,例如$(objs) ${objs},假
设要得本身的objs字符串,则使用$$(objs),
$${objs}
变量可以精确展开,例如下面的例子
foo=c
prog.$(foo) 展开为prog.c
变量的变量 例如:
foo=$(foo1) foo1=$(aha) aha=wow, 则$(foo)为wow
上述方法会出现递归定义,例如下面的例子
A=$(B) $(B)=A,这样make会陷入无线循环展开中去。
解决上述问题的方法是使用另一种赋值方式,如下:
y := foo x := $(y) 前面的定义的变量不能使用后面
定义的变量。
FOO ?= bar ?=是一个有用的操作符,若FOO在前面没有
被定义,则FOO的值是bar,否则这忽略这一行。
10.变量值的替换
foo:=a.o b.o c.o
bar:=$(foo:.o=.c)
其表示为foo中的以o结尾的字符串换为以c结尾,即bar的
内容为a.c b.c c.c
静态模式的替换
foo:=a.o b.o c.o
bar:=$(foo:%o=%c)
把变量再当成变量
x=y
y=z
a:=$($(x)) a的值为z
11.追加变量
objs=main.o foo.o bar.o utils.o
objs+=another.o
objs的值变为main.o foo.o bar.o utils.o another.o
还可以有下面的操作,达到相同的目的
objs:=$(objs) another.o
12.多行变量
多行变量使用define定义一组操作命令
define two-lines
echo foo
echo $(bar)
endef
two-lines在makefile文件中使用的时候必须以TAB空格开头
13.目标变量
prog:CFLAGS=-g
prog:prog.o foo.o bar.o
$(CC) $(CFLAGS) prog.o foo.o bar.o
prog.o:prog.c
$(CC) $(CFLAGS) prog.c
foo.o:foo.c
$(CC) $(CFLAGS) foo.c
bar.o:bar.c
$(CC) $(CFLAGS) bar.c
变量CFLAGS和prog目标关联,在makefile中关于目标prog的
编译时候CFLAGS始终是-g