免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 697 | 回复: 0
打印 上一主题 下一主题

makefile笔记(2) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-07 14:09 |只看该作者 |倒序浏览
make命令能自动识别的文件名是:GNUmakefile(最好不用)、makefile、Makefile,若是其他文件名则要使用 -f 或 --file  选项来指明make命令应该使用的文件。
在makefile中使用include关键词包含其他位置的文件。include为一行的开始时,决不要在include前使用tab。找这些文件也是有路径的。
                            如果文件都没有指定绝对路径或是相对路径的话,make 会在当前目录下首先寻找,如果当前目录下没有找到,那么,make 还会在下面的几个目录下找:
    1、如果 make 执行时,有“-I”或“--include-dir”参数,那么 make 就会在这个参数所指定的目录下去寻找。
    2、如果目录/include(一般是:/usr/local/bin 或/usr/include)存在的话,make 也会去找。如果有文件没有找到的话,make 会生成一条警告信息,但不会马上出现致命错误。它会继续载入其它的文件,一旦完成 makefile 的读取,make 会再重试这些没有找到,或是不能读取的文件,如果还是不行,make 才会出现一条致命信息。如果你想让make
不理那些无法读取的文件,而继续执行,你可以在 include 前加一个减号“-”。
make支持三个通配符:“*”,“?”和“[...]”
~表示用户主目录。
变量就是宏,使用的形式是$(name)。
文件搜索路径设置:在环境变量VPATH中添加路径,用:分隔各个路径。
还有一种方法是使用vpath。用法有3种:
1、vpath   
为符合模式的文件指定搜索目录。
2、vpath  
清除符合模式的文件的搜索目录。
3、vpath
清除所有已被设置好了的文件搜索目录。
vapth使用方法中的需要包含“%”字符。“%”的意思是匹配零或若干字符,指定了要搜索的文件集,而则指定了的文件集的搜索的目录。
例:vpath %.h ../headers
“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”。 伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。
大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。这样在依赖文件中就不需要在指明头文件了,而只需要在gcc命令行中加入-M选项。如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。
生成.d文件的部分没去管。
当依赖目标新于目标时,也就是当规则的目标需要被更新时,make会一条一条的执行其后的命令。需要注意的是,如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。
忽略命令的出错,我们可以在Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的。还有一个全局的办法是,给make加上“-i”或是“--ignore-errors”参数,那么,Makefile中所有命令都会忽略错误。而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。还有一个要提一下的make的参数的是“-k”或是“--keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。
嵌套执行make。系统变量$(MAKE)宏变量的意思是,也许我们的make需要一些参数,所以定义成一个变量比较利于维护。注意这样高层的环境有些会传递到子目录中,而有些则不会。
可以通过define…endef来定义一个命令宏。
Makefile中的变量。变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、 “#”、“=”或是空字符(空格、回车等)。变量是大小写敏感的。变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来。如果你要使用真实的“$”字符,那么你需要用“$$”来表示。
变量的赋值:1. 简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值。2. 另一种方法使用的是“:=”操作符。这种方法,前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。
系统变量“MAKELEVEL”,其意思是,如果我们的make有一个嵌套执行的动作(参见前面的“嵌套使用make”),那么,这个变量会记录了我们的当前Makefile的调用层数。
在操作符的右边是很难描述一个空格的,可定一个空变量,在对其引用就得到了空格了。
一个比较有用的操作符是“?=”,表示如果变量被定义过了就什么也不做,没定义就赋值。
变量值的替换,替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。另外一种变量替换的技术是以“静态模式”,这依赖于被替换字串中的有相同的模式,模式中必须包含一个“%”字符。
可以把变量的值再当成变量。
如:x = y
y = z
a := $($(x))


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69984/showart_728923.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP