makefile概述-第4部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
(CC) …c (CFLAGS) 《 …o @
(filter %。elc;(files)): %。elc: %。el
emacs …f batch…byte…pile 《
(filter %。o;(files))表示调用Makefile的filter函数,过滤“filter”集,只要其中模式为“%。o”的内容。其的它内容,我就不用多说了吧。这个例字展示了Makefile中更大的弹性。
3。8 自动生成依赖性
在Makefile中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main。c中有一句“#include 〃defs。h〃”,那么我们的依赖关系应该是:
main。o : main。c defs。h
但是,如果是一个比较大型的工程,你必需清楚哪些C文件包含了哪些头文件,并且,你在加入或删除头文件时,也需要小心地修改 Makefile,这是一个很没有维护性的工作。为了避免这种繁重而又容易出错的事情,我们可以使用C/C++编译的一个功能。大多数的C/C++编译器都支持一个“…M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。例如,如果我们执行下面的命令:
cc …M main。c
其输出是:
main。o : main。c defs。h
于是由编译器自动生成的依赖关系,这样一来,你就不必再手动书写若干文件的依赖关系,而由编译器自动生成了。需要提醒一句的是,如果你使用GNU的C/C++编译器,你得用“…MM”参数,不然,“…M”参数会把一些标准库的头文件也包含进来。
gcc …M main。c的输出是:
main。o: main。c defs。h /usr/include/stdio。h /usr/include/features。h
/usr/include/sys/cdefs。h /usr/include/gnu/stubs。h
/usr/lib/gcc…lib/i486…suse…linux/2。95。3/include/stddef。h
/usr/include/bits/types。h /usr/include/bits/pthreadtypes。h
/usr/include/bits/sched。h /usr/include/libio。h
/usr/include/_G_config。h /usr/include/wchar。h
/usr/include/bits/wchar。h /usr/include/gconv。h
/usr/lib/gcc…lib/i486…suse…linux/2。95。3/include/stdarg。h
/usr/include/bits/stdio_lim。h
gcc …MM main。c的输出则是:
main。o: main。c defs。h
那么,编译器的这个功能如何与我们的Makefile联系在一起呢。因为这样一来,我们的Makefile也要根据这些源文件重新生成,让 Makefile自已依赖于源文件?这个功能并不现实,不过我们可以有其它手段来迂回地实现这一功能。GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件中,为每一个“name。c”的文件都生成一个“name。d”的Makefile文件,'。d'文件中就存放对应'。c'文件的依赖关系。
于是,我们可以写出'。c'文件和'。d'文件的依赖关系,并让make自动更新或自成'。d'文件,并把其包含在我们的主Makefile中,这样,我们就可以自动化地生成每个文件的依赖关系了。
这里,我们给出了一个模式规则来产生'。d'文件:
%。d: %。c
@set …e; rm …f @;
(CC) …M (CPPFLAGS) 《 》 @。;
sed 's;(*)。o' :'*;1。o @ : ;g' 《 @。 》 @;
rm …f @。
这个规则的意思是,所有的'。d'文件依赖于'。c'文件,“rm …f @”的意思是删除所有的目标,也就是'。d'文件,第二行的意思是,为每个依赖文件“