建网站用什么服务器,公司网站开发怎么做账,wordpress群空间,贾汪建设局网站目录
一、定义模式规则
1、模式规则介绍
2、模式规则示例
3、自动化变量
4、模式的匹配
5、重载内建隐含规则 一、定义模式规则 你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则#xff0c;只是 在规则中#xff0c;目标的定义需要有%只是 在规则中目标的定义需要有%字符。%的意思是表示一个或多个任意字符。在依赖目标 中同样可以使用%只是依赖目标中的%的取值取决于其目标。 有一点需要注意的是%的展开发生在变量和函数的展开之后变量和函数的展开发 生在 make 载入 Makefile 时而模式规则中的%则发生在运行时。
1、模式规则介绍 模式规则中至少在规则的目标定义中要包含%否则就是一般的规则。目标中的 %定义表示对文件名的匹配%表示长度任意的非空字符串。例如%.c表示以.c结 尾的文件名文件名的长度至少为 3而s.%.c则表示以s.开头.c结尾的文件名文 件名的长度至少为 5。 如果%定义在目标中那么目标中的%的值决定了依赖目标中的%的值也就是说目标中的模式的%决定了依赖目标中%的样子。例如有一个模式规则如下 %.o : %.c ;
其含义是指出了怎么从所有的[.c]文件生成相应的[.o]文件的规则。如果要生成的目标 是a.o b.o那么%c就是a.c b.c。 一旦依赖目标中的%模式被确定那么make 会被要求去匹配当前目录下所有的文件名 一旦找到make 就会规则下的命令所以在模式规则中目标可能会是多个的如果有 模式匹配出多个目标make 就会产生所有的模式目标此时make 关心的是依赖的文件名 和生成目标的命令这两件事。
2、模式规则示例 下面这个例子表示了,把所有的[.c]文件都编译成[.o]文件.
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $ -o $ 其中$表示所有的目标的挨个值$.y执行然后生成 .tab.c和.tab.h文件。其中表示一个任意字符串。如果我们的执行程 序 foo 依 赖 于 文 件 parse.tab.o 和 scan.o 并 且 文 件 scan.o 依 赖 于 文 件 parse.tab.h如果parse.y文件被更新了那么根据上述的规则bison -d parse.y 就会被执行一次于是parse.tab.o和scan.o的依赖文件就齐了。假设parse.tab.o 由parse.tab.c生成和scan.o由scan.c生成而foo由parse.tab.o和scan.o 链接生成而且 foo 和其[.o]文件的依赖关系也写好那么所有的目标都会得到满足
3、自动化变量 在上述的模式规则中目标和依赖文件都是一系例的文件那么我们如何书写一个命令 来完成从不同的依赖文件生成相应的目标因为在每一次的对模式规则的解析时都会是不 同的目标和依赖文件。 自动化变量就是完成这个功能的。在前面我们已经对自动化变量有所提涉相信你看 到这里已对它有一个感性认识了。所谓自动化变量就是这种变量会把模式中所定义的一系 列的文件自动地挨个取出直至所有的符合模式的文件都取完了。这种自动化变量只应出现 在规则的命令中。 下面是所有的自动化变量及其说明
$ 表示规则中的目标文件集。在模式规则中如果有多个目标那么$就是匹配于 目标中模式定义的集合。
$% 仅当目标是函数库文件中表示规则中的目标成员名。例如如果一个目标是foo.a (bar.o)那么
$% 就是bar.o$就是foo.a。如果目标不是函数库文件Unix 下是[.a]Windows 下是[.lib]那么其值为空。
$ 依赖目标中的第一个目标名字。如果依赖目标是以模式即%定义的那么$很有可能不兼容于其它版本的 make所以你应该尽量避免使用$*除非是在隐含规则 或是静态模式中。如果目标中的后缀是 make 所不能识别的那么
$* 就是空值。 当你希望只对更新过的依赖文件进行操作时
$? 在显式规则中很有用例如假设有 一个函数库文件叫lib其由其它几个 object 文件更新。那么把 object 文件打包的比较 有效率的 Makefile 规则是 lib : foo.o bar.o lose.o win.o ar r lib $? 在上述所列出来的自动量变量中。四个变量$、$$(D) $(F) 分别表示所有依赖文件的目录部分和文件部分。可以有相同的 $(?D) $(?F) 分别表示被更新的依赖文件的目录部分和文件部分。 最后想提醒一下的是对于$
4、模式的匹配 一般来说一个目标的模式有一个有前缀或是后缀的%或是没有前后缀直接就是 一个%。因为%代表一个或多个字符所以在定义好了的模式中我们把%所匹配的内 容叫做茎例如%.c所匹配的文件test.c中test就是茎。因为在目标和依赖目标 中同时有%时依赖目标的茎会传给目标当做目标中的茎。 当一个模式匹配包含有斜杠实际也不经常包含的文件时那么在进行模式匹配时 目录部分会首先被移开然后进行匹配成功后再把目录加回去。在进行茎的传递时 我们需要知道这个步骤。例如有一个模式e%t文件src/eat匹配于该模式于是src/a 就是其茎如果这个模式定义在依赖目标中而被依赖于这个模式的目标中又有个模式 c%r那么目标就是src/car。茎被传递
5、重载内建隐含规则 你可以重载内建的隐含规则或是定义一个全新的例如你可以重新构造和内建隐含 规则不同的命令如
%.o : %.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) -D$(date)
你可以取消内建的隐含规则只要不在后面写命令就行。如
%.o : %.s 同样你也可以重新定义一个全新的隐含规则其在隐含规则中的位置取决于你在哪里 写下这个规则。朝前的位置就靠前。