Makefile的变量

1.变量基础

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”

或是大括号“{}”把变量给包括起来。如果你要使用真实的“$”字符,那么你需要用“$$”来表示。

变量可以使用在许多地方,如规则中的“目标”、“依赖”、“命令”以及新的变量中。先看一个例子:

objects = program.o foo.o utils.o

program : $(objects)

cc -o program $(objects)

$(objects) : defs.h

变量会在使用它的地方精确地展开,就像 C/C++中的宏一样,例如:

foo = c

prog.o : prog.$(foo)

$(foo)$(foo) -$(foo) prog.$(foo)

展开后得到:

prog.o : prog.c

cc -c prog.c

2.变量中的变量

在定义变量的值时,我们可以使用其他变量来构造变量的值,在Makefile中有两种方式来使用变量定义变量的值。

第一种方式,也就是简单的使用"="号,在"="左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何地方,也就说,右侧的变量不一定非要是已定义好的值,也可是使用后面定义的值。如:

foo=$(bar)

bar=$(ugh)

ugh=Huh?

all:

echo $(foo)

当我们执行make all会打印变量$(foo)的值:Huh?

可见,便是是可以使用后定义的。

这个功能有好的地方,也有不好的地方,好的地方是,我们可以把变量的真实值推到后面来定义,如:

CFLAGS = $(include_dirs) -O

include_dirs = -Ifoo -Ibar

当"CFLAGS"在命令中展开时,会是"-Ifoo -Ibar -O"。但这种形式也有不好的地方,就是递归定义,如:

CFLAGS = $(CFLAGS) -O

或:

A = $(B)

B = $(A)

这会让 make 陷入无限的变量展开过程中去,当然,我们的make 是有能力检测这样的定义,并会报错。

还有就是如果在变量中使用函数,那么,这种方式会让我们的make 运行时非常慢,更糟糕的是,他会使

用得两个make 的函数“wildcard”和“shell”发生不可预知的错误。因为你不会知道这两个函数会被调用

多少次。

为了避免上面的这种方法,我们可以使用 make 中的另一种用变量来定义变量的方法。这种方法使用

的是“:=”操作符,如:

x := foo

y := $(x) bar

x := later

其等价于:

y := foo bar

x := later

值得一提的是,这种方法,前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。

Makefile的变量,布布扣,bubuko.com

时间: 2024-10-24 14:39:52

Makefile的变量的相关文章

makefile之变量赋值

makefile中变量赋值有4种方法: = ,   := ,  += ,  ?= = :直接赋值 变量 = 值 :=   :位置相关赋值 如果右值为一个值,那么它和=没区别,如果右值为变量,那么左边变量的值等于右边变量当前位置的值,什么意思呢? a = abc b = $(a) a = jkl all: @echo $(b) .PHONY:all 执行这个makefile,输出 b的值为jkl,  在 b = $(a) 这句中,变量a的值被延迟展开,即由变量a最后一条赋值语句 a = jkl 决

Makefile中变量赋值的方式

Makefile中的"="":="."?="和"+="区别是:"="是直接给变量赋值.":="是将":="右边中包含的变量直接展开给左边的变量赋值."?="是在该变量没有被赋值 的情况下为其赋值."+="是给该变量追加值.例:a = 1b = 2c := $(a) 3d = 4d ?= 5b += 6结果:a=1c=1 3d=4

makefile 特殊变量

SHELL = /bin/bash # 设置执行shell, 默认为sh Rule 速记 --> [email protected]: $< $? $^ [email protected] 目标, 包括使用 .PHONY: ? 声明的价目标 $ 是 makefile 关键字, 要在 shell 中使用 '$' 字符, 一律使用 "$$" 转义 makefile 特殊变量 原文地址:https://www.cnblogs.com/develon/p/11622537.html

关于Makefile自动化变量

Makefile的自动化变量在管理大量源文件时是十分高效的,它可以避免Makefile管理大型工程时编写过于繁琐. 下面是常用的Makefile自动化变量及其释义. [email protected] 表示目标文件集合,以空格分隔.生成目标时该变量会依次输出目标文件. 示例: OBJ=first second third $(OBJ): @echo [email protected] 其输出为: first second third $^ 表示目标依赖文件集合,以空格分隔.生成目标时该变量会输出

关于makefile中变量的多次赋值以及override指令

1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影响这条原则. 1.3 原则3 当使用了override指令定义赋值了变量后,其后对该变量的所有的赋值都是无效的.但是override之前的所有的赋值都是有效的.使用的时候是往前最近原则. 2 override变量.命令行参数和普通变量之间的屏蔽关系 override变量会屏蔽命令行参数,除非用+=:

Makefile——使用变量

在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串.变量可以使用在“目标”,“依赖目标”,“命令”或是Makefile的其它部分中. 命名规范 ①变量大小写敏感,推荐大小写搭配命名,方便区分系统变量(全大写) ②变量名字可以包含字符.数字,下划线(可以是数字开头),但不可以含有“:”.“#”.“=”或是空字符(空格.回车等) ③“$<”.“[email protected]”这种奇怪的符号是自动化变量 = 和 := 变量定义方式:变量名 = 值 变量在声明时需

makefile自动化变量$*

1.如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分. makefile文件如下 1 all: foo.o 2 echo final 3 4 foo.o: bar.c 5 echo $* bar.c文件存在,执行make后的结果: echo foo foo echo final final

从头開始写项目Makefile(三):变量的使用

[版权声明:转载请保留出处:blog.csdn.net/gentleliu. Mail:shallnew at 163 dot com] 细致研究我们的之前Makefile发现.我们还有改进的地方.就是此处: target_bin : main.o debug.o ipc.o timer.o tools.o >---gcc -o target_bin main.o debug.o ipc.o timer.o tools.o 假设添加一个源文件xx.c的话.须要在两处或多处添加xx.o文件. 我们

很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序

很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用make更新函数库文件 后序 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出来,方便学习. 后记,看完发现这篇文章和<Linux环境下的C编程指南>