之前在课堂上接触到了makefile的概念,但是不清楚具体是什么,于是想着学一下,顺便记录一下学习历程,希望能坚持下去。另外,自学是看的《跟我一起写Makefile》。
基础规则
targets : prerequisites
command
...
targets : prerequisites ; command
command
...
makefile的基础语法如上,刚开始看的时候不太能理解都代表什么,但是看了具体的例子之后会好理解很多。
foo.o: foo.c defs.h # foo模块
cc -c -g foo.c
这段代码表示makefile的目标是生成foo.o这个文件,即foo.o是最终追求的“targets”,而它依赖于foo.c和defs.h这两个文件,即“prerequisites”,如果foo.c和defs.h 的文件日期要比foo.o文件日期要新,或是foo.o不存在,那么代表“依赖关系发生”,就会执行下一行的shell命令(command)“cc -c -g foo.c”,其中规定命令必须以tab缩进为开头。
(另外贴一个新人可能不知道的小知识,学习cs的时候总是能看到foo,bar这些名称,一开始一直不知道代表什么,后来查了下发现就是一个比较随便的约定俗成的名称,比较详细的解释可以看这篇文章:http://t.csdn.cn/Xln1b)
通配符
make支持三个通配符,分为是~,?和*。以Linux操作系统举例,~代表用户的默认路径,*代表匹配任意个数的任意字符(包含0个),?代表匹配单个任意字符。
在文件搜寻的部分,make使用VPATH定义额外寻找文件的路径,其中也有一个类似通配符作用的符号,即百分号%。它的意义跟常见的*一样,代表匹配任意个数的任意字符(包含0个)。
举例:vpath %.h ../headers
这一行表示在../headers文件夹下寻找所有后缀为.h的文件(如果某文件在当前目录没有找到的话)。
文件搜寻
文件搜寻分为VPATH和vpath,其中前者可以理解为变量,就像Linux下的PATH环境变量一样,后者可以看作一种命令。
如果定义了VPATH变量,那么,make就会在当前目录找不到的情况下,到所指定的目录中去找寻文件。
举例:
VPATH = src:../headers
其中多个路径之间用冒号分隔(这与Linux下的PATH环境变量相同)。
vpath有三种用法:
vpath <pattern> <directories> # 1
为符合模式<pattern>的文件指定搜索目录<directories>。
vpath <pattern> # 2
清除符合模式<pattern>的文件的搜索目录。
vpath # 3
清除所有已被设置好了的文件搜索目录。
vpath使用方法中的<pattern>需要包含 %
字符。
vpath可以连续写多行,如:
vpath %.c dir1
vpath %.c fir2
vpath %.c fir3
结语
第一次记录就先到这里,因为时间有限只是非常简单的看了下介绍和第一部分内容,后面接着是伪目标,等下次多看些再写了。