Gun make可识别指示符
1,可识别指示符
2,多行定义--define VARIABLE endef
define two-lines echo foo echo $(bar) endef
相当于: two-lines = echo foo; echo $(bar)
3,条件判断 --ifdef --ifeq
ifdef VARIABLE -----定义 ifndef VARIABLE -----未定义 ifeq (A,B) -----相等 ifeq "A" "B" -----相等 ifeq 'A' 'B' -----相等 ifneq (A,B) -----不相等 ifneq "A" "B" -----不相等 ifneq 'A' 'B' -----不相等 else endif
4,包含文件--include sinclude
include FILE -include FILE sinclude FILE
5,overide指示符--=,:=,?=,+=
override VARIABLE = VALUE override VARIABLE := VALUE override VARIABLE += VALUE override VARIABLE ?= VALUE override define VARIABLE ende
1)overide主要作用是,覆盖make命令传递的参数
2)=,:=,?=,+=
2.1) =---递归展开式变量的赋值
example1:
foo = $(bar) bar = $(ugh) ugh = Huh? all:;echo $(foo)
执行“make”将会打印出“Huh?”。整个变量的替换过程时这样的:首先“$(foo)”被 替换为“$(bar)”,接下来“$(bar)”被替换为“$(ugh)”,最后“$(ugh)”被替换为“Hug?”。 整个替换的过程是在执行“echo $(foo)”时完成的。
其优点是: 这种类型变量在定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义, 或者是通过 make 的命令行选项传递的变量)。
example2:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
“CFLAGS”会在命令中被展开为“-Ifoo -Ibar -O”。而在“CFLAGS”的定义中使用 了其后才定义的变量“include_dirs”。
example3:
x = foo y = $(x) bar x = xyz
y的值将会是 xyz bar ,而不是 foo bar
2.2) :=---直接展开式变量的赋值
变量被定义后就是一个实际需要的文本串,其中不再包含任何变量的引用
example1:
x := foo y := $(x) bar x := later
等价于:
y := foo bar
x := later
y的值将会是 foo bar ,而不是 later bar 了
2.3) ?=---条件赋值操作符
只有此变量在之前没有赋值的情况下才会对这个变量进行赋值
FOO ?= bar
其等价于:
ifeq ($(origin FOO), undefined) FOO = bar endif
含义是:如果变量“FOO”在之前没有定义,就给它赋值“bar”。否则不改变它的值。
关于origin函数参见后续文章或者makefile之origin函数 - suonikeyinsu - 博客园 (cnblogs.com),主要用来查看是否定义,从哪里来的
2.4)+=----追加,这里就不详细描述了
6,export /unexport VARIABLE
需要将一个在上层定义的变量传递给子 make,应该在上层 Makefile 中使用指示符 “export”对此变量进行声明。格式如下: export VARIABLE ... 当不希望将一个变量传递给子 make 时,可以使用指示符“unexport”来声明这个变量。 格式如下: unexport VARIABLE ...
7,vpath
1,VPATH
通过变量“VPATH”可以指定依赖 文件的搜索路径,当规则的依赖文件在当前目录不存在时,make 会在此变量所指定的,目录下去寻找这些依赖文件。通常我们都是用此变量来指定规则的依赖文件的搜索路 径。其实“VPATH”变量所指定的是 Makefile 中所有文件的搜索路径,包括了规则的 依赖文件和目标文件。定义变量“VPATH”时,使用空格或者冒号(:)将多个需要搜索的目录分开。
example
VPATH = src:../headers
这样我们就为所有规则的依赖指定了两个搜索目录,“src”和“../headers”。对于规则 “foo:foo.c”如果“foo.c”存在于“src”目录下,此规则等价于“foo:src:/foo.c”。
2,vpath
它 不是一个变量,而是一个 make 的关键字,它所实现的功能和上一小节提到的“VPATH” 变量很类似,但是它更为灵活。它可以为不同类型的文件(由文件名区分)指定不同的 搜索目录。它的使用方法有三种:
1)、vpath PATTERN DIRECTORIES 为所有符合模式“PATTERN”的文件指定搜索目录“DIRECTORIES”。多个目 录使用空格或者冒号(:)分开。类似上一小节的“VPATH”变量。
2)、vpath PATTERN 清除之前为符合模式“PATTERN”的文件设置的搜索路径。
3)、vpath 清除所有已被设置的文件搜索路径。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)