Makefile之自动变量篇

自动变量
假设您编写一个编译‘.c’文件生成‘.o’文件的规则:您怎样编写命令‘CC’,使它能够操作正确的文件名?您当然不能将文件名直接写进命令中,因为每次使用隐含规则操作的文件名都不一样。

您应该使用make的另一个特点,自动变量。这些变量在规则每次执行时都基于目标和依赖产生新值。例如您可以使用变量‘[email protected]’代替目标文件名,变量‘$<’代替依赖文件名。

下面是自动变量列表:

[email protected]

规则的目标文件名。如果目标是一个档案成员,则变量‘[email protected]’ 档案文件的文件名。对于有多个目标的格式规则(参阅格式规则简介),变量‘[email protected]’是那个导致规则命令运行的目标文件名。

$%

当目标是档案成员时,该变量是目标成员名,参阅使用make更新档案文件。例如,如果目标是‘foo.a(bar.o)‘,则‘$%‘的值是‘bar.o‘,‘[email protected]‘的值是‘foo.a‘。如果目标不是档案成员,则‘$%‘是空值。

$<

第一个依赖的文件名。如果目标更新命令来源于隐含规则,该变量的值是隐含规则添加的第一个依赖。参阅使用隐含规则。

$?

所有比目标‘新’的依赖名,名字之间用空格隔开。对于为档案成员的依赖,只能使用已命名的成员。参阅使用make更新档案文件。

$^

所有依赖的名字,名字之间用空格隔开。对于为档案成员的依赖,只能使用已命名的成员。参阅使用make更新档案文件。对同一个目标来说,一个文件只能作为一个依赖,不管该文件的文件名在依赖列表中出现多少次。所以,如果在依赖列表中,同一个文件名出现多次,变量‘$^’的值仍然仅包含该文件名一次。

$+

该变量象‘$^‘,但是,超过一次列出的依赖将按照它们在makefile文件中出现的次序复制。这主要的用途是对于在按照特定顺序重复库文件名很有意义的地方使用连接命令。

$*

和隐含规则匹配的stem(径),参阅格式匹配。如果一个目标为‘dir/a.foo.b‘,目标格式规则为:‘a.%.b‘ ,则stem为‘dir/foo‘。在构建相关文件名时stem 十分有用。在静态格式规则中,stem是匹配目标格式中字符‘%’的文件名中那一部分。在一个没有stem具体规则中;变量‘$*‘ 不能以该方法设置。如果目标名以一种推荐的后缀结尾(参阅过时的后缀规则),变量‘$*‘设置为目标去掉该后缀后的部分。例如,如果目标名是‘foo.c‘,则变量‘$*‘ 设置为‘foo‘, 因为‘.c‘ 是一个后缀。GNU make 处理这样奇怪的事情是为了和其它版本的make兼容。在隐含规则和静态格式规则以外,您应该尽量避免使用变量‘$*‘。在具体规则中如果目标名不以推荐的后缀结尾,则变量‘$*’在该规则中设置为空值。

当您希望仅仅操作那些改变的依赖,变量‘$?‘ 即使在具体的规则中也很有用。例如,假设名为‘lib’的档案文件包含几个OBJ文件的拷贝,则下面的规则仅将发生变化的OBJ文件拷贝到档案文件:

lib: foo.o bar.o lose.o win.o
        ar r lib $?
在上面列举的变量中,有四个变量的值是单个文件名。三个变量的值是文件名列表。这七个变量都有仅仅存放文件的路径名或仅仅存放目录下文件名的变体。变量的变体名是由变量名追加字母‘D’或‘F’构成。这些变体在GNU make中处于半废状态,原因是使用函数T dir和notdir 能够得到相同的结果。参阅文件名函数。注意,‘F‘变体省略所有在dir函数中总是输出的结尾斜杠这里是这些变体的列表:

`$(@D)‘

目标文件名中的路径部分,结尾斜杠已经移走。如果变量`[email protected]‘的值是`dir/foo.o‘,变体 `$(@D)‘的值是`dir‘。如果变量`[email protected]‘的值不包含斜杠,则变体的值是`.‘。

`$(@F)‘

目标文件名中的真正文件名部分。如果变量`[email protected]‘的值是`dir/foo.o‘,变体  `$(@F)‘的值是` foo.o ‘。`$(@F)‘ 等同于 `$(notdir [email protected])‘。

`$(*D)‘

`$(*F)‘

stem(径)中的路径名和文件名;在这个例子中它们的值分别为:`dir‘ 和 `foo‘ 。

`$(%D)‘

`$(%F)‘

档案成员名中的路径名和文件名;这仅对采用‘archive(member)’形式的档案成员目标有意义,并且当成员包含路径名时才有用。参阅档案成员目标。

`$(<D)‘

`$(<F)‘

第一个依赖名中的路径名和文件名。

`$(^D)‘

`$(^F)‘

所有依赖名中的路径名和文件名列表。

`$(?D)‘

`$(?F)‘

所有比目标‘新’的依赖名中的路径名和文件名列表。

注意,在我们讨论自动变量时,我们使用了特殊格式的惯例;我们写"the value of‘$<‘", 而不是"the variable <" ;和我们写普通变量,例如变量 objects 和 CFLAGS一样。我们认为这种惯例在这种情况下看起来更加自然。这并没有其它意义,变量‘$<‘的变量名为 < 和变量‘$(CFLAGS)‘ 实际变量名为CFLAGS一样。您也可以使用‘$(<)‘代替‘$<‘。

时间: 2024-10-14 16:37:04

Makefile之自动变量篇的相关文章

工程管理之makefile与自动创建makefile文件过程

(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的真相么,想知道Linux Makefile系统中藏有的内在奥义么,只有我来给大家全面讲解介绍Linux Makefile系统作为Linux下的程序开发人员,大家一定都遇到过Linux Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Linux Mak

解剖Nginx&#183;自动脚本篇(4)工具型脚本系列

目录 auto/have 向自动配置头文件追加可用宏定义(objs/ngx_auto_config.h) auto/nohave 向自动配置头文件追加不可用宏定义(objs/ngx_auto_config.h) auto/define 向自动配置脚本追加 K-V 宏定义(objs/ngx_auto_config.h),表示“设置了 K,其值为 V” auto/have_headers 向自动头头文件(objs/ngx_auto_header.h) auto/feature auto/types/

解剖Nginx&#183;自动脚本篇(5)编译器相关主脚本

在 Nginx 的自动脚本中,auto/cc目录下的所有脚本都是用于编译器相关配置使用的.Nginx的出色跨平台性(Linux.Darwin.Solaris.Win32 等)就有这些脚本的贡献.该目录下包含如下脚本: 目录 conf:主脚本,配置编译器的基本属性,并根据系统的编译器环境引用不同的脚本. name:与编译器名称相关的处理逻辑在该脚本中. gcc:GNU C 编译器的 Specified 配置. sunc:Sun C 编译器的 Specified 配置. acc:HP ANSI C+

makefile的中变量

1.定义命令包 如果Makefile中出现一些相同命令序列,可以为这些相同的命令序列定义一个变量.定义这种命令序列的语法以"define"开始,以"endef"结束,如: define run-yacc yacc $(firstword $^) mv y.tab.c [email protected] endef 这里,"run-yacc"是这个命令包的名字,其不要和Makefile中的变量重名.在"define"和"

makefile(02)_变量

4.变量与赋值 4.1.变量 Makefile中支持程序设计语言中变量的概率,但没有变量类型,只代表文本数据:变量命名规则:变量可以包含字符.数字.下划线,单不能包含":","#", "="," ",变量名大小写敏感.变量的定义和使用: 4.2.赋值 Makefile中有4中变量赋值方式: 4.2.1.简单赋值(:=) 程序设计语言中的通用赋值方式,只针对当前语句有效,等价于C语言中的赋值.建议无特殊要求时使用简单赋值. x

自动变量非自动变量

自动变量,就是普通的局部变量 相对于静态变量而言的 非自动变量有两种,一种是全局变量,一种是静态变量 自动的意思就是在一定的作用域内会自动消亡 非自动就是不会自己释放内存,每次访问改变值后,值会一直保存在那里

编程题:展示自动变量在内存中的生存期。

#include<stdio.h> void f(int n) { auto int s=0;  /*auto可以省略*/ s=s+1; printf("No.%d:s=%d\n",n,s); } void main() { int num; for(num=1;num<4;num++) f(num); } 编程题:展示自动变量在内存中的生存期.,布布扣,bubuko.com

局部变量的存储类别--自动变量与静态局部变量

1.自动变量  auto 动态的分配存储空间,在函数调用结束后,就自动释放这些存储空间. 2.静态局部变量 static 即在函数调用结束后继续保留原值,占有的存储单元并不释放,在下一次调用该函数时,该变量已经有值. (若没有声明为static类别,则默认为auto类别) 具体区别,通过下面这段代码来理解: 1 #include<stdio.h> 2 3 int fun(int x) 4 { 5 int a=0; 6 static int b=3; 7 a++; 8 b++; 9 return

自动变量和开辟内存的生存期和作用域探讨

<C程序设计>谭浩强第4版针对Auto变量的生存期作用域做出了说明,包括内存管理与释放,指出“函数执行完后,会自动释放自动变量所占用的内存单元” 函数结束后,自动变量会被释放,即便以指针的形式返回,返回后,指针地址没有变,但是,任何读取操作都会刷新这段内存到不可预知的状态 如果使用函数返回值,可以使用malloc申请内存,操作完成后return出去 代码及运行结果如下: 1 // CUITestingCPP.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include &quo