Makefile的变量

$@
代表规则中的目标文件名。如果目标是一个文档(Linux中,一般称.a文件为文档),那么它代表这个文档的文件名。在多目标的模式规则中,它代表的是哪个触发规则被执行的目标文件名。
$%
规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则的目标是“foo.a(bar.o)”,那么,“$%”的值就为“bar.o”,“$@”的值为“foo.a”。如果目标不是函数库文件,其值为空。
$<
规则的第一个依赖文件名。如果是隐含规则,则它代表通过目标指定的第一个依赖文件。
$?
所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成

员(.o文件)的更新情况。
$^
规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件名,它所代表的只能是所有库成员(.o文件)名。一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的一次引用情况。就是说变量“$^”会去掉重复的依赖文件。
$+
类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时,库的交叉引用场合。
$*
在模式规则和静态模式规则中,代表“茎”。“茎”是目标模式中“%”所代表的部分(当文件名中存在目录时,“茎”也包含目录(斜杠之前)部分,可参考 9.5.4 模式的匹配 一小节)。例如:文件“dir/a.foo.b”,当目标的模式为“a.%.b”时,“$*”的值为“dir/a.foo”。“茎”对于构造相关文件名非常有用。

$(@D)
代表目标文件的目录部分(去掉目录部分的最后一个斜杠)。如果“$@”是“dir/foo.o”,

那么“$(@D)”的值为“dir”。如果“$@”不存在斜杠,其值就是“.”(当前目录)。

$(@F)
目标文件的完整文件名中除目录以外的部分(实际文件名)。如果“$@”为“dir/foo.o”,那么“$(@F)”只就是“foo.o”。“$(@F)”等价于函数“$(notdir $@)”。
$(*D)
$(*F)
分别代表目标“茎”中的目录部分和文件名部分。
$(%D)
$(%F)
当以如“archive(member)”形式静态库为目标时,分别表示库文件成员“member”名中的目录部分和文件名部分。它仅对这种形式的规则目标有效。
$(<D)
$(<F)
分别表示规则中第一个依赖文件的目录部分和文件名部分。
$(^D)
$(^F)
分别表示所有依赖文件的目录部分和文件部分(不存在同一文件)。
$(+D)
$(+F)
分别表示所有依赖文件的目录部分和文件部分(可存在重复文件)。
$(?D)
$(?F)
分别表示被更新的依赖文件的目录部分和文件部分。


Makefile中变量的特征:

1.Makefile中变量和函数的展开(除规则的命令行以外),是在make读取makefile文件时进行的。这里的变量包括了使用"="定义和使用指示符"define"定义的。

2.变量可以用来代表一个文件名列表、编译选项列表、程序运行的选项参数列表、搜索源文件的目录列表、便以输出的目录列表等等。

3.变量名是不包括":"、"#"、"="前置空白和尾空白的任何字符串。

4.变量名是大小写敏感的。

5.另外有一些变量名只包含了一个或者很少的几个特殊的字符。

变量的引用:

$(VARIABLE_NAME) 或 ${VARIABLE_NAME}来引用一个变量的定义。

所有在命令或者文件名中使用"$"时需要用"$$"来表示。

变量的定义:

1.递归展开式变量:

变量的定义是通过"="或者使用指示符"define"定义的变量。对这种变量的引用,在引用的地方是严格的文本替换过程,此变量值的字符串原模原样的出现在引用它的地方。(变量在引用它的地方进行替换展开的同时,它说引用的其它变量才会被替换展开)

优点:在定义时,可以引用其它的之前没有定义的变量

缺点:

1.可能会由于出现变量的递归定义而导致make陷入到无限的变量展开过程中,最终使make执行失败.

2.风格变量的定义中如果使引用了某一个函数,那么函数总会在其被引用的地方被执行。

 

2.直接展开式变量

通过":="来定义变量。变量值中对另外变量的引用或者函数的引用在定义时被展开。所以在变量定义后就是一个实际所需要定义的文本串,其中不再包含任何对其它变量的引用。

 

3.定义一个空格

nullstring =

space := $(nullstring) #end of the line

 

4.条件赋值

条件赋值操作符"?=", 只有此变量在之前没有赋值的情况下才会对这个变量进行赋值。

例如: FOO ?= bar 等价于:

ifeq(&(origin FOO), undefined)

    FOO = bar

endif

 

变量的替换引用:

$(VAR:A=B):替换变量"VAR"中所有"A"字符结尾的字为"B"结尾的字。“结尾”的含义是空格之前。


AR:函数库打包程序,可创建静态库.a文档。默认是"ar".

AS:汇编程序。默认是"as"。

CC:C编译程序。默认是"cc"。

CXX:C++编译程序。默认是"g++"。

CO:从RCS中提取文件的程序。默认是"CO"。

CPP:C程序的预处理器(输出是标准输出设备)。默认是"$(CC) -E"。

FC:编译器和预处理Fortran和Ratfor 原文件的编译器。默认是"f77"。

GET:从SCCS中提取文件程序。默认是"get"

LEX:将Lex语言转变为C或Ratfo的程序。默认是“lex”.

PC:Pascal语言编译器。默认是"PC"。

YACC :Yacc文法分析器。默认命令是"yacc".

YACCR:Yacc文法分析器(针对于Ratfor程序)。默认是"yacc -r"。

MAKEINFO:转换Texinfo源文件(.texi)到Info文件程序。默认"makeinfo"。

TEX:从源文件TeX创建TeX DVI文件的程序。默认是"tex".

TEXI2DVI:从Texinfo源文件创建TeX DVI文件的程序。默认"texi2dvi".

WEAVE:转换Web到TeX的程序。默认是"weave".

CWEAVE:转换C Web到TeX的程序。默认是"cweave".

TANGLE:转换C Web 到 C.默认是"ctangle"。

RM:删除命令.默认是"rm -f"。

命令参数的变量:

ARFLAGS:执行"AR"命令的命令行参数。默认是"rv"。

ASFLAGS:执行汇编语器"AS"的命令行参数(明确指定".s"或".S"文件时)。

CFLAGS:执行"CC"编辑器的命令行参数。

CXXFLAGS:执行"g++"编译器的命令行参数。

COFLAGS:执行"co"的命令行参数(在RCS中提取文件的选项)

CPPFLAGS执行C预处理器"cc -E"的命令行参数

FFLAGS:Fortran  语言编译器"f77"执行的命令行参数。

GFLAGS:SCCS "get"程序参数

LDFLAGS:链接器参数。 如"ld"

LFLAGS:Lex文法分析器参数。

PFLAGS:Pascal语言编译器参数

RFLAGS:Ratfor程序的Fortran编译器参数。

YFLAGS:Yacc文法分析器参数。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值