预定义变量的使用(五)

在 makefile 中存在一些预定义的变量,如自动变量[email protected],$^,$< 等;还有一些特殊变量,如:$(MKAE),$(MAKECMDGOALS),$(MKAEFILE_LIST),$(MAKE_VERSION),$(CURDIR),$(.VARIABLES)等。下来我们先来解释下自动变量的意义:a> [email protected] 是指当前规则中触发命令被执行的目标;b> $^ 是指当前规则中的所有依赖;c> $< 是指当前规则中的第一个依赖。关于自动变量的使用如下

下来我们以代码为例来进行分析说明

.PHONY : all first second third

all : first second third
    @echo "\[email protected] => [email protected]"
    @echo "$$^ => $^"
    @echo "$$< => $<"

first:
second:
third:

看看编译结果

我们看到和我们之前解释的是一样的。[email protected]便是打印我们的目标名,$^ 打印的便是依赖条件,$< 打印的是依赖当中的第一个。那么我们就可以将之前写的 makefile 进行改写了

CC := g++
TARGET := hello.out

$(TARGET) : func.o main.o
    $(CC) -o [email protected] $^

func.o : func.c 
    $(CC) -o [email protected] -c $^

main.o : main.c
    $(CC) -o [email protected] -c $^

.PHONY : rebuild clean all

rebuild : clean all

all : $(TARGET)
    
clean : 
    rm *.o $(TARGET)

我们来看看编译结果是否和之前的一样的。

我们看到和之前的效果是一样的,那么这样做的好处是什么呢?在大型的项目中,我们后面难免会进行新功能的开发,那么此时写的新文件便可以海子街放在目标之后,其他的不用管就OK了,这样就非常方便。
        下来我们来看看那些特殊变量的含义:a> $(MAKE) 是指当前 make 解释器的文件名;b>$(MAKECMDGOALS) 是指命令行中指定的目标名(make 的命令行参数);c>$(MAKEFILE_LIST) 指 make 所需要处理的 makefile 文件列表,当前 makefile 的文件名总是位于列表的最后,文件名之间以空格进行分隔。

下来我们还是以代码为例来进行说明

.PHONY : all out first second third test

all out :
    @echo "$(MAKE)"
    @echo "$(MAKECMDGOALS)"
    @echo "$(MAKEFILE_LIST)"

first :
    @echo "first"

second :
    @echo "second"

third :
    @echo "third"

test :
    @$(MAKE) first
    @$(MAKE) second
    @$(MAKE) third

我们来看看编译效果

我们第一次直接 make 的时候,因为当前解释器是 make ,所以会直接打印 make,命令行后面没带参数,因此第二行是空的,最后一行是因为只有一个 makefile,但是在它前面会有一个空格。第二次 make all 的时候,因为命令行的参数为 all,所以第二行会输出 all。第三次 make test 的时候,因为需要进行三次 MAKE,所以会有三次进入到对应目录下进行进行 make 命令。第四次 make all out 的时候,在执行 all 的时候分别打印一次,在执行 out 的时候再次会打印一次。

下来我们来继续看看另一些特殊变量的含义:a> $(MAKE_VERSION) 是指当面 make 解释器的版本;b> $(CURDIR) 是指当前 make 解释器的工作目录;c> $(.VARIABLES) 是指所有已经定义的变量名列表(预定义变量和自定义变量)。

还是以代码为例来进行说明

.PHONY : test1 test2

TDelphi := Delphi Tang
D.T.Software := D.T.

test1 :
    @echo "$(MAKE_VERSION)"
    @echo "$(CURDIR)"
    @echo "$(.VARIABLES)"

test2 :
    @echo "$(RM)"

我们来看看编译效果

我们看到直接 make 的时候,执行的是 test1 目标,先是打印当前 make 的版本,接着是当前目录,然后是当前的环境变量。我们在下面用 make -v 直接看到当前 make 解释器的版本就是 3.81,而且当前目录就是 /mnt/hgfs/winshare/mentu/make1/5 。接着我们看到了我们自己定义的两个环境变量。接下来在执行 make test2,看到 RM 其实就是 rm -f,就是强制删除的符号,我们是不是就可以在前面定义的 makefile 中将 rm -f 全部替换为 $(RM) 呢。通过对 makefile 中的预定义变量的学习,总结如下:1、makefile 提供了预定义变量供开发者使用;2、预定义变量的使用能够使得 makefile 的开发更高效;3、自动变量是 makefile 中最常见的元素;4、使用 $(.VARIABLES) 能够获取所有的特殊变量。

欢迎大家一起来学习 makefile,可以加我QQ:243343083。

原文地址:http://blog.51cto.com/12810168/2128702

时间: 2024-10-28 19:57:54

预定义变量的使用(五)的相关文章

Shell 变量详解教程之位置变量与预定义变量。

Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一.   自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell变量.y=3a+2b,就是把3a+2b这个值赋予y.变量名是以字母或下线符打头的,可以从第二位开始加入数字,并且大小写字母意义不同.如dir与Dir是不同的变量.变量名的长度不受限制.比如:expert=Bill,就是将Bill赋值给expert,后来脚本读取变量$expert时,会取值为Bill

PHP预定义变量$_SERVER

PHP预定义变量$_SERVER $_SERVER 是一个包含诸如头部(headers).路径(paths)和脚本位置(script locations)的数组.数组的实体由 web 服务器创建,不能保证所有的服务器都能产生所有的信息.下面是一些常见的操作: 当前脚本的绝对路径,我本地的index.php脚本的绝对路径为:F:/phpStudy/WWW/test/index.php. $_SERVER['SCRIPT_FILENAME'] => F:/phpStudy/WWW/test/inde

复习PHP-语言参考-预定义变量

1.在之前的笔记中已经写过了,所以这里快速过一次. GLOBALS:发现一个有趣的事:$GLOBALS里有一个GLOBALS元素,是一种递归数组,实现的办法是设定一个相同名的元素,值为本身的引用. $php_errormsg:终于发现如果服务器把错误提示关了杂办,判断它是否为NULL就行了. $HTTP_RAW_POST_DATA:原生POST数据.($_POST是优化过的) $argc/$argv: Note: 这个变量仅在 register_argc_argv 打开时可用. 主要用于命令行模

解析预定义变量的用法

shell编程里有一种变量,很多资料中都把它定义为预定义变量. 工作中最常用到的预定义变量其实就两个: ① $n ② $? 那么接下来,我们先来讲解$n: n是什么?n代表的是数字.简单点说,在脚本中$0表示命令本身,$1-$9表示第1到第9个参数,n为10以上的数字要用{}表示,例如:${10} 来,我们写个脚本吧: 这就是一个简单的求和脚本 至于"$?"更简单了. 输入一条命令,例如:ls 文件夹 如果命令正确,则返回0 如果命令错误,则返回一个数字

php02~预定义变量

预定义变量 1.作用域问题 php中,自定义变量的作用域有两种:全局作用域(函数外),局部作用域(函数内) 但是: 预定义作用域成为"超全局作用域":即全局作用域+局部作用域的总和. 2:数据类型问题: 一般来说超全局作用域都是数组! 综述: 3.预定义作用域一般包括: $_GET,$_POST,$_SERVER,$_REQUEST,$GLOBALS..... (二)举例说明 $_GET变量 get,一般出现在form表单中:<form action = "abc.ph

Atitit.预定义变量与变量预处理器

1. 预定义变量与1 2. 变量预处理器1 3. 测试数据生成器3 1. 预定义变量与 姓名:$name 次数:$rdm 时间:$datetime 文件名:$filename 类型:类型2 分类:类型1 课时:$rdm 点位:$rdm 是否:$tf 电话:$tel 数量:$rdm 成功率:$pct 日期:$date 卡号:$cardno 开户行:$bank 开户人:$name 金额:$money 年龄 :$age 性别:$sex 地区:$area 状态:$stat 作者::  ★(attilax

环境变量;位置参数变量;预定义变量

环境变量 设置环境变量:1. export 变量名=变量值 2. 变量名=变量值 export 变量名 (export 变量名=变量值 :把该变量声明为环境变量,让这个SHELL中所有的子SHELL都能查看使用这个变量) 查询变量:env 查看进程树:pstree PATH:系统查找命令的路径 PATH=”$PATH”:/root/sh →PATH变量叠加(临时) 系统默认环境变量名都是大写 位置参数变量 $n:n为数字,$0代表命令本身,$1-$9代表第一到第9个参数,10以上的参数用大括号包

linux中位置参数变量和预定义变量

位置参数变量   预定义变量

预定义变量基本概念

超全局变量---超全局变量是在全部作用域中始终可用的内置变量. 每个php进程都对应一套预定义变量. PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用.在函数或方法中无需执行 global $variable; 就可以访问它们. PHP提供了9种超全局数组/变量 (1)$_GET (2)$_POST (3)$_REQUEST (4)$_SERVER (5)$_ENV (6)$_FILE (7)$_COOKIE (8)$_SESSION (9)$GLOBALS