Makefile静态模式
2015-12-08 00:02
337 查看
静态模式
makefile中,一个规则中可以有多个目标,规则所定义的命令对所有的目标有效。一个具有多目标的规则相当于多个规则。使用多目标可以使makefile文件变得简洁。
静态模式规则是这样一个规则:规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件。
静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。
我们还是先来看一下语法:
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
...
targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。
target-parrtern是指明了targets的模式,也就是的目标集模式。
prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。
简单的解释一下:如果我们的<target-parrtern>定义成
“%.o”,意思是我们的<target>集合中都是以“.o”结尾的,而如果我们的<prereq-parrterns>定义
成“%.c”,意思是对<target-parrtern>所形成的目标集进行二次定义,其计算方法是,取<target-
parrtern>模式中的“%”(也就是去掉了[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合。
所以,我们的“目标模式”或是“依赖模式”中都应该有“%”这个字符,如果你的文件名中有“%”那么你可以使用反斜杠“\”进行转义,来标明真实的“%”字符
看一个例子:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我们的目标从$object中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.o
bar.o”,也就是变量$object集合的模式,而依赖模式“%.c”则取模式“%.o”的“%”,也就是“foo
bar”,并为其加下“.c”的后缀,于是,我们的依赖目标就是“foo.c
bar.c”。而命令中的“$<”和“$@”则是自动化变量(见[makefile笔记]之七),“$<”表示所有的依赖目标集(也就是
“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)。
于是,上面的规则展开后等价于下面的规则:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
试想,如果我们的“%.o”有几百个,那种我们只要用这种很简单的“静态模式规则”就可以写完一堆规则,实在是太有效率了.
可以研究一下:
http://www.gnu.org/software/make/manual/html_node/Static-Usage.html
用的是大家经常用的例子:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
我想,是否可以把它类比于通配符。 $(objects)里的内容都要是.o 格式。而每个 .o 都依赖于 .c。
makefile中,一个规则中可以有多个目标,规则所定义的命令对所有的目标有效。一个具有多目标的规则相当于多个规则。使用多目标可以使makefile文件变得简洁。
静态模式规则是这样一个规则:规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件。
静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。
我们还是先来看一下语法:
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
...
targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。
target-parrtern是指明了targets的模式,也就是的目标集模式。
prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。
简单的解释一下:如果我们的<target-parrtern>定义成
“%.o”,意思是我们的<target>集合中都是以“.o”结尾的,而如果我们的<prereq-parrterns>定义
成“%.c”,意思是对<target-parrtern>所形成的目标集进行二次定义,其计算方法是,取<target-
parrtern>模式中的“%”(也就是去掉了[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合。
所以,我们的“目标模式”或是“依赖模式”中都应该有“%”这个字符,如果你的文件名中有“%”那么你可以使用反斜杠“\”进行转义,来标明真实的“%”字符
看一个例子:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我们的目标从$object中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.o
bar.o”,也就是变量$object集合的模式,而依赖模式“%.c”则取模式“%.o”的“%”,也就是“foo
bar”,并为其加下“.c”的后缀,于是,我们的依赖目标就是“foo.c
bar.c”。而命令中的“$<”和“$@”则是自动化变量(见[makefile笔记]之七),“$<”表示所有的依赖目标集(也就是
“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)。
于是,上面的规则展开后等价于下面的规则:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
试想,如果我们的“%.o”有几百个,那种我们只要用这种很简单的“静态模式规则”就可以写完一堆规则,实在是太有效率了.
可以研究一下:
http://www.gnu.org/software/make/manual/html_node/Static-Usage.html
用的是大家经常用的例子:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
我想,是否可以把它类比于通配符。 $(objects)里的内容都要是.o 格式。而每个 .o 都依赖于 .c。
相关文章推荐
- 台湾10M带宽独享香港10M带宽独享尽在双12促销Q320005871
- ldap2.4主主双向部署
- 润达软件:苹果零售店员工2015圣诞礼物亮相
- 自定义旋转加载进度
- SQL(postgreSQL) “不常见”问题寻解
- 隐藏ActionBar
- 数据持久化--SharedPreferences
- 鼠标滑过时间,略过无意义的鼠标滑过,;获取URL参数
- KVO
- header使用笔记
- 数组的定义和数组的遍历
- 数组排序_冒泡排序、选择排序、快速排序
- 数组工具类
- 类的不同形式
- Java基础_01
- 十四、转到 linux
- 十五、转入内核
- 学习 AngularJS (三) module
- 学习 AngularJS (四) directive 指令
- Object-C NSTimer 使用