Linux中的自动化变量

  Linux中的自动化变量

  模式规则中,规则的目标和依赖文件名代表了一类文件名;规则的命令是对所有这一类文件重建过程的描述,显然,在命令中不能出现具体的文件名,否则模式规则失去意义。那么在模式规则的命令行中该如何表示文件,将是本小节的讨论的重点。

  假如你需要书写一个将.c文件编译到.o文件的模式规则,那么你该如何为gcc书写正确的源文件名?当然了,不能使用任何具体的文件名,因为在每一次执行模式规则时源文件名都是不一样的。为了解决这个问题,就需要使用“自动环变量”,自动化变量的取值是根据具体所执行的规则来决定的,取决于所执行规则的目标和依赖文件名。

  下面对所有的自动化变量进行说明:

  $@

  表示规则的目标文件名。如果目标是一个文档文件(Linux中,一般称.a文件为文档文件,也称为静态库文件),那么它代表这个文档的文件名。在多目标模式规则中,它代表的是哪个触发规则被执行的目标文件名。

  $%

  当规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则的目标是“foo.a(bar.o)”,那么,“$%”的值就为“bar.o”,“$@”的值为“foo.a”。如果目标不是静态库文件,其值为空。

  $<

  规则的第一个依赖文件名。如果是一个目标文件使用隐含规则来重建,则它代表由隐含规则加入的第一个依赖文件。

  $?

  所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成员(.o文件)。

  $^

  规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有库成员(.o文件)名。一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的一次引用情况。就是说变量“$^”会去掉重复的依赖文件。

  $+

  类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。

  $*

  在模式规则和静态模式规则中,代表“茎”。“茎”是目标模式中“%”所代表的部分(当文件名中存在目录时,“茎”也包含目录(斜杠之前)部分)。例如:文件“dir/a.foo.b”,当目标的模式为“a.%.b”时,“$*”的值为“dir/a.foo”。“茎”对于构造相关文件名非常有用。

  自动化变量“$*”需要两点说明:

  1 对于一个明确指定的规则来说不存在“茎”,这种情况下“$*”的含义发生改变。此时,如果目标文件名带有一个可识别的后缀,那么“$*”表示文件中除后缀以外的部分。例如:“foo.c”则“$*”的值为:“foo”,因为.c是一个可识别的文件后缀名。GUN make对明确规则的这种奇怪的处理行为是为了和其它版本的make兼容。通常,在除静态规则和模式规则以外,明确指定目标文件的规则中应该避免使用这个变量。

  2 当明确指定文件名的规则中目标文件名包含不可识别的后缀时,此变量为空。

  自动化变量“$?”在显式规则中也是非常有用的,使用它规则可以指定只对更新以后的依赖文件进行操作。例如,静态库文件“libN.a”,它由一些.o文件组成。这个规则实现了只将更新后的.o文件加入到库中:

  lib: foo.o bar.o lose.o win.o

  ar r lib $?

  以上罗列的自动化变量中。其中有四个在规则中代表文件名($@、$<、$%、$*)。而其它三个的在规则中代表一个文件名列表。GUN make中,还可以通过这七个自动化变量来获取一个完整文件名中的目录部分和具体文件名部分。在这些变量中加入“D”或者“F”字符就形成了一系列变种的自动环变量。这些变量会出现在以前版本的make中,在当前版本的make中,可以使用“dir”或者“notdir”函数来实现同样的功能。

  $(@D)

  表示目标文件的目录部分(不包括斜杠)。如果“$@”是“dir/foo.o”,那么“$(@D)”的值为“dir”。如果“$@”不存在斜杠,其值就是“.”(当前目录)。注意它和函数“dir”的区别!

  $(@F)

  目标文件的完整文件名中除目录以外的部分(实际文件名)。如果“$@”为“dir/foo.o”,那么“$(@F)”只就是“foo.o”。“$(@F)”等价于函数“$(notdir $@)”。

  $(*D)

  $(*F)

  分别代表目标“茎”中的目录部分和文件名部分。

  $(%D)

  $(%F)

  当以如“archive(member)”形式静态库为目标时,分别表示库文件成员“member”名中的目录部分和文件名部分。它仅对这种形式的规则目标有效。

  $(

  $(

  分别表示规则中第一个依赖文件的目录部分和文件名部分。

  $(^D)

  $(^F)

  分别表示所有依赖文件的目录部分和文件部分(不存在同一文件)。

  $(+D)

  $(+F)

  分别表示所有依赖文件的目录部分和文件部分(可存在重复文件)。

  $(?D)

  $(?F)

  分别表示被更新的依赖文件的目录部分和文件名部分。

  在讨论自动化变量时,为了和普通变量(如:“CFLAGS”)区别,我们直接使用了“$<”的形式。这种形式仅仅是为了和普通变量进行区别,没有别的目的。其实对于自动环变量和普通变量一样,代表规则第一个依赖文件名的变量名实际上是“<”,我们完全可以使用“$(<)”来替代“$<”。但是在引用自动化变量时通常的做法是“$<”,因为自动化变量本身是一个特殊字符。

  GUN make同时支持“Sysv”特性,允许在规则的依赖列表中使用特殊的变量引用(一般的自动化变量只能在规则的命令行中被引用)“$$@”、“$$(@D)”和“$$(@F)”(注意:要使用“$$”),它们分别代表了“目标的完整文件名”、“目标文件名中的目录部分”和“目标的实际文件名部分”。这三个特殊的变量只能用在明确指定目标文件名的规则中或者是静态模式规则中,不用于隐含规则中。另外Sysv make和GNU make对规则依赖的处理也不尽相同。Sysv make对规则的依赖进行两次替换展开,而GUN make对依赖列表的处理只有一次,对其中的变量和函数引用直接进行展开。

  自动化变量的这个古怪的特性完全是为了兼容Sysv 版本的makefile文件。在使用GNU make时可以不考虑这个,也可以在Makefile中使用伪目标“.POSIX”来禁止这一特性。

时间: 2024-10-28 11:27:06

Linux中的自动化变量的相关文章

Linux有问必答:如何在Linux中修改环境变量PATH

Linux有问必答:如何在Linux中修改环境变量PATH 提问: 当我试着运行一个程序时,它提示"command not found". 但这个程序就在/usr/local/bin下.我该如何添加/usr/local/bin到我的PATH变量下,这样我就可以不用指定路径来运行这个命令了. 在Linux中,PATH环境变量保存了一系列的目录用于用户在输入的时候搜索命令.PATH变量的值由一系列的由冒号分隔的绝对路径组成.每个用户都有特定的PATH环境变量(由系统级的PATH变量初始化)

Linux中修改环境变量及生效方法_Linux

在/etc/profile文件中添加变量[对所有用户生效(永久的)] 用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是"永久的". 要让刚才的修改马上生效,需要执行以下代码 source /etc/profile 以上这篇Linux中修改环境变量及生效方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索

Linux中修改环境变量PATH

PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻.用以下命令可以看到 PATH的值. $ echo $PATH 例如,在主机中,用户yogin的PATH值为: /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/yogin/bin 其中":"为分隔符.所以,上面的一串目录可以看成是如下的目录列表. /opt/kde/bin /usr/local/bin /bin:/usr/bin /u

linux中Kickstart自动化安装教程

在 RHEL,CentOS,Fedora 等系统中,安装系统使用的程序名叫 anaconda,它属于 FedoraProject,由 Python 开发,能够提供图形或者文本界面用于系统安装. Anaconda 安装程序最大的优点是:它可以用一个称之为 Kickstart 的特性进行非交互式脚本安装.Kickstart 脚本是一个用来指定安装要求详情的简单 ASCII 文本文件.该脚本可用常规文本编辑器编写,或用 Kickstart 配置程序来生成. Kickstart 脚本通常有三个不同的部分

Linux中PATH环境变量的查看和添加方法

$PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接. 编辑 PATH 声明,其格式为: PATH=$PATH:<PATH1>:<PATH2>:<PATH3>:--:<PATHN> 你可以自己加上指定的路径,中间用冒号隔开.环境变量更改后,在用户下次登陆时生效,如果想立刻生效,则可执行下面的语句: $source .bash_profile 可用 export命令查看P

Linux中修改环境变量

<1>Linux 的变量作用范围可分为两类:环境变量和本地变量 环境变量,或者称为全局变量,存在与所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了.Linux 的环境变量具有继承性,即子shell 会继承父shell 的环境变量. 本地变量,当前shell 中的变量,很显然本地变量中肯定包含环境变量.Linux 的本地变量的非环境变量不具备继承性. set 用于显示与设置当前本地 变量.单独一个set 就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量

RHEL 6 Linux中的shell变量总结

环境变量路径: [root@localhost ~]# set   //查看到的是局部变量和全局变量2种 [root@localhost ~]# env  //查看系统的全局环境变量 [root@localhost ~]# echo $PATH  //查看系统环境变量路径 [root@localhost ~]# export $PATH  //也可以使用export查看环境变量路径 [root@localhost ~]# export PATH=$PATH:/date/  //临时添加/date

linux中Bash内部变量使用示例

$@ "$@"把所有的命令行参数作为一个数组返回.与"$*"不一样,它是作为一个字符串来返回. "$@"可以通过循环来遍历所有元素,如下脚本: #!/bin/bash for var in "$*"; do     echo $var done 因为$*只把参数作为一个字符串返回,echo就只被调用一次: ~> $ ./testscript.sh firstarg secondarg thirdarg firstarg

linux中shell 特殊变量$0 $n $* $@ $! $?的详解

$0:获取当前执行脚本的文件名,包括路径. [root@test script]# cat 0.sh #!/bin/bash echo $0 [root@test script]# sh 0.sh 0.sh [root@test script]# cat 0.sh #!/bin/bash dirname "$0" basename "$0" [root@test script]# sh /byrd/script/0.sh /byrd/script 0.sh $n:获