makefile(02)_变量

4.变量与赋值

4.1.变量

Makefile中支持程序设计语言中变量的概率,但没有变量类型,只代表文本数据;
变量命名规则:变量可以包含字符、数字、下划线,单不能包含”:”,”#”, “=”,” ”,变量名大小写敏感。
变量的定义和使用:

4.2.赋值

Makefile中有4中变量赋值方式:

4.2.1.简单赋值(:=)

程序设计语言中的通用赋值方式,只针对当前语句有效,等价于C语言中的赋值。建议无特殊要求时使用简单赋值。

x := foo
y := $(x)b
x := new

test :
    @echo "x => $(x)"
    @echo "y => $(y)"

输出结果:

4.2.2.递归赋值(=)

赋值操作可能影响多个其它变量,所有与目标变量相关的其他变量都会受到影响。

x = foo
y = $(x)b
x = new

test :
    @echo "x => $(x)"
    @echo "y => $(y)"

输出结果:

注意:如果不是必要请尽可能不要使用递归赋值,这里的赋值号完全不等价与C语言中的赋值号。

4.2.3.条件赋值(?=)

如果变量未定义,使用赋值符号中的值定义变量,如果已经定义,赋值无效。

x := foo
y := $(x)b
x ?= new

test :
    @echo "x => $(x)"
    @echo "y => $(y)"

输出结果:

4.2.4.追加赋值(+=)

原变量值后加一个新值,原变量与新值之间由空格隔开

x := foo
y := $(x)b
x += new

test :
    @echo "x => $(x)"
    @echo "y => $(y)"

输出结果:

5.预定义变量的使用

在Makefile中存在一些预定义的变量,主要分为两类:自动变量和特殊变量。

5.1.自动变量

[email protected] 当前规则中触发命令被执行的目标
$^ 当前规则中的所有依赖
$< 当前规则中的第一个依赖
自动变量的使用:

.PHONY : all first second third 

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

firtst:
second:
third:

输出结果:

注意:
1.“$”符号在Makefile中有特殊含义,当打印其字面量时需要加上$进行转义
2.“[email protected]”则需要加上\$进行转义

5.2.特殊变量

$(MAKE) 当前make解释器的文件名
$(MAKECMDGOALS) 命令行中指定的目标名,(make的命令行参数)
$(MAKEFILE_LIST) make需要要处理的makefile文件列表,注意当前Makefile的文件名总是位于列表最后,文件名之间使用空格分隔。
$(MAKE_VERSION) 当前make解释器的版本
$(CURDIR) 当前make解释器的工作目标
$(.VARIABLES) 所有已经定义的变量名和列表(预定义变量和自定义变量)
$(RM) rm -f
通常我们会打印$(.VARIABLES) 查看当前操作系统所支持的自定变量,然后对照make 手册(可从官网下载:http://www.gnu.org/software/make/manual/make.html),查看每个变量的意义

.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

输出结果:

6.变量的高级主题-上

6.1.变量值的替换

6.1.1.后缀替换

使用指定字符串替换变量中的后缀:
语法规则: $(var:cc=o)或 ${src1:cc=o}
替换表达式中不能有任何的空格,make中支持使用${}对变量进行取值

src1 := a.cc b.cc c.cc
obj1 := $(src1:cc=o)

test1 :
    @echo "obj1 => $(obj1)"

输出结果:

6.1.2.模式替换

变量的模式替换,使用%保留变量值中的指定字符,替换其他字符
语法格式:$(var:a%b=x%y)或 ${src1:a%b=x%y}

src2 := a11b.c a22b.c a33b.c
obj2 := $(src2:a%b.c=x%y)

test2 :
    @echo "obj2 => $(obj2)"

输出结果:

6.1.3.规则中的模式替换


意义:
通过target-patten从targets中匹配子目标;再通过prereq-patten从子目标生成依赖;进而构成完成的规则。

src1 := a.cc b.cc c.cc
obj1 := $(src1:cc=o)

test1 :
    @echo "obj1 => $(obj1)"

src2 := a11b.c a22b.c a33b.c
obj2 := $(src2:a%b.c=x%y)

test2 :
    @echo "obj2 => $(obj2)"

输出结果:

6.2.变量的嵌套引用

一个变量名之中可以包含对其他变量的引用,本质上是使用一个变量表示另一个变量。

6.3.命令行变量

运行make时,可以在命令行中定义变量,命令行变量默认覆盖Makefile中定义的变量。

6.4.override关键字

用于指示Makefile中定义的变量不能被覆盖,变量的定义和赋值都需要使用override关键字

6.5.define关键字

用于定义Makefile中的多行变量,多行变量的定义从变量名开始到endef结束,可以使用override关键字防止变量被覆盖,define定义的变量等价于使用=定义的变量。

hm := hello makefile

override var := override-test

define foo
I‘m fool!
endef

override define cmd
    @echo "run cmd ls ..."
    @ls
endef

test :
    @echo "hm => $(hm)"
    @echo "var => $(var)"
    @echo "foo => $(foo)"
    ${cmd}

直接运行makefile的结果:

命令行传参的结果:
make makefile foo="i am cmd foomake -f makefile.3" var="cmd line var"

显然我们改变了foo变量的值,因为foo变量没有被override修饰,但不能改变var变量的值。

7.变量的高级主题-下

7.1.环境变量

Makefile中能够使用环境变量的值,如果定义的普通变量和环境变量同名,环境变量将被覆盖,运行make时指定-e选项,优先使用环境变量
优势:环境变量可以在所有文件中使用;
劣势:过多的环境变量会导致移植性降低
变量在不同Makefile之间传递的方式:
1.直接在外部定义环境变量进行传递
2.使用export定义变量进行传递(定义临时环境变量)
3.使用make命令行变量进行传递(推荐)

PATH := path
export var := D.T.Software
new := TDelphi

test :
    @echo "PATH => $(PATH)"
    @echo "make another file ..."
    @$(MAKE) -f makefile.2
    @$(MAKE) -f makefile.2 new:=$(new)

makefile.2的内容:

test:
    @echo "PATH => $(PATH)"     #1.直接在外部定义环境变量进行传递
    @echo "var => $(var)"       #2.使用export定义变量进行传递(定义临时环境变量)
    @echo "new => $(new)"       #3.使用make命令行变量进行传递(推荐)

输出结果:

7.2.目标变量(局部变量)

作用域只在指定目标及连带规则中。
target : name <assignment> value
target : voerride name <assignment > value

7.3.模式变量(局部变量)

模式变量是目标变量的扩展,作用域只在符合的目标及连带规则中。
pattrn : name <assignment > value
pattrn : voerride name <assignment > value

var := D.T.Software
new := TDelphi

test : var := test-var          # 目标变量
%e : override new := test-new   # 模式变量

test : another
    @echo "test :"
    @echo "var => $(var)"
    @echo "new => $(new)"

another :
    @echo "another :"
    @echo "var => $(var)"
    @echo "new => $(new)"

rule :
    @echo "rule :"
    @echo "var => $(var)"
    @echo "new => $(new)"

直接运行结果:

make rule运行结果:

原文地址:http://blog.51cto.com/11134889/2108156

时间: 2024-11-14 16:15:30

makefile(02)_变量的相关文章

makefile的中变量

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

02.第二章_C++ Primer学习笔记_变量和基本类型

2.1  基本内置类型 2.1.1  算术类型 算术类型包括两类:整型和浮点型 2.2  变量 2.3  复合类型 2.4  const限定符 2.5  处理类型 2.6  自定义数据结构

makefile(07)_路径搜索

17.Make中的路径搜索_上 17.0.实验素材 源文件位于: src目录下源文件:main.c #include <stdio.h> #include "func.h" int main() { foo(); return 0; } 源文件:func.c #include <stdio.h> #include "func.h" void foo() { printf("void foo() : %s\n", "

makefile(08)_打造专业的编译环境

20.打造专业的编译环境(上)_模块Makefile设计 20.0. 实验材料 项目架构:其中各个文件的内容请自己填写. 20.1.大型项目的目录结构(无第三方库) 20.2.项目架构设计分析 项目被划分为不同的多个模块:每个模块用一个文件夹进行管理,文件由inc, src, makefile构成每个模块的对外函数统一放置于common/inc中,如common.h xxxfunc.h 20.3.项目目标 工程项目中不希望源文件夹在编译时被改动(只读文件夹)在编译时自动创建文件夹(build)用

python基础_变量

变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建 等号(=)用来给变量赋值= 左边是一个变量名= 右边是存储在变量中的值 变量名 = 值 变量定义之后,后续就可以直接使用了 1) 变量演练1 -- iPython # 定义 qq_number 的变量用来保存 qq 号码 In [1]: qq_number = "1234567"

php基础_变量

1.自定义变量 <?php #变量规则 /*变量需要以$符号开头,其后是变量的名称 变量名称必须以字母或下划线开头 变量名称不能以数字开头 变量名称只能保护数字字符和下划线(A-z,0-9以及_) 变量名称对大小写铭感($y与$Y是两个不同的变量) */ ?> 示例: <?php $x="hello "; $y="word!"; echo "$x  $y"; ?> 2.数组变量 <?php /* 创建方式: 1.直接

Makefile之自动变量篇

自动变量假设您编写一个编译‘.c’文件生成‘.o’文件的规则:您怎样编写命令‘CC’,使它能够操作正确的文件名?您当然不能将文件名直接写进命令中,因为每次使用隐含规则操作的文件名都不一样. 您应该使用make的另一个特点,自动变量.这些变量在规则每次执行时都基于目标和依赖产生新值.例如您可以使用变量‘[email protected]’代替目标文件名,变量‘$<’代替依赖文件名. 下面是自动变量列表: [email protected] 规则的目标文件名.如果目标是一个档案成员,则变量‘[ema

Makefile之自动化变量

makefile自动化变量在大型项目的Makefile使用的太普遍了,如果你看不懂自动化变量,开源项目的makefile你是看不下去的. 以往总是看到一些项目的makefile,总是要翻gnu的Makefile文档,很是麻烦,索性一起总结.也算是重新学习一次. Makefile  [email protected], $^, $< [email protected]  表示目标文件$^  表示所有的依赖文件$<  表示第一个依赖文件$?  表示比目标还要新的依赖文件列表 ...待续

makefile(03)_条件判断

8.条件判断语句 8.1.语法规则 Makefile中支持条件判断语句,可以直接比较两个不同变量的值和常量值.注意:条件判断语句只能用于控制make实际执行的语句,不能控制规则中命令的执行过程.条件判读语法说明:条件判断关键字:示例: .PHONY : test var1 := A var2 := $(var1) var3 := test: ifeq ($(var1),$(var2)) @echo "var1 == var2" else @echo "var1 != var2