akefile变量使用条件及判断使用.pdfVIP

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Makefile变量使用条件及判断使用

Makefile变量使用条件及判断使用 使用变量 ———— 在Makefile 中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串, 在Makefile 中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同 的是,你可以在Makefile 中改变其值。在Makefile 中,变量可以使用在“目标”,“依 赖目标”,“命令”或是Makefile 的其它部分中。 变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、 “=”或是空字符(空格、回车等)。变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个 不同的变量名。传统的Makefile 的变量名是全大写的命名方式,但我推荐使用大小写搭 配的变量名,如:MakeFlags。这样可以避免和系统的变量冲突,而发生意外的事情。 有一些变量是很奇怪字串,如“$”、“$@”等,这些是自动化变量,我会在后面介绍。 一、变量的基础 变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括 号“ ()”或是大括号“{}”把变量给包括起来。如果你要使用真实的“$”字符,那么你需要 用“$$”来表示。 变量可以使用在许多地方,如规则中的“目标”、“依赖”、“命令”以及新的变量中。先看一 个例子: objects = program.o foo.o utils.o program : $(objects) cc -o program $(objects) $(objects) : defs.h 变量会在使用它的地方精确地展开,就像C/C++中的宏一样,例如: foo = c prog.o : prog.$(foo) $(foo)$(foo) -$(foo) prog.$(foo) 展开后得到: prog.o : prog.c cc -c prog.c 当然,千万不要在你的Makefile 中这样干,这里只是举个例子来表明Makefile 中的变 量在使用处展开的真实样子。可见其就是一个“替代”的原理。 另外,给变量加上括号完全是为了更加安全地使用这个变量,在上面的例子中,如果你不想 给变量加上括号,那也可以,但我还是强烈建议你给变量加上括号。 二、变量中的变量 在定义变量的值时,我们可以使用其它变量来构造变量的值,在Makefile 中有两种方式 来在用变量定义变量的值。 先看第一种方式,也就是简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变 量的值可以定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好的值, 其也可以使用后面定义的值。如: foo = $(bar) bar = $(ugh) ugh = Huh? all: echo $(foo) 我们执行“make all”将会打出变量$(foo)的值是“Huh?” ($(foo)的值是$(bar), $(bar)的值是$(ugh),$(ugh)的值是“Huh?”)可见,变量是可以使用后面的变量来定 义的。 这个功能有好的地方,也有不好的地方,好的地方是,我们可以把变量的真实值推到后面来 定义,如: CFLAGS = $(include_dirs) -O include_dirs = -Ifoo -Ibar 当“CFLAGS”在命令中被展开时,会是“-Ifoo -Ibar -O”。但这种形式也有不好的地方, 那就是递归定义,如: CFLAGS = $(CFLAGS) -O 或: A = $(B) B = $(A) 这会让make 陷入无限的变量展开过程中去,当然,我们的make 是有能力检测这样的定义, 并会报错。还有就是如果在变量中使用函数,那么,这种方式会让我们的make 运行时非常 慢,更糟糕的是,他会使用得两个make 的函数“wildcard”和“shell”发生不可预知的 错误。因为你不会知道这两个函数会被调用多少次。 为了避免上面的这种方法,我们可以使用make 中的另一种用变量来定义变量的方法。这种 方法使用的是“:=”操作符,如: x := foo y := $(x) bar x := later 其等价于: y := foo bar x := later 值

文档评论(0)

rovend + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档