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 清除所有已被设置的文件搜索路径。

 

 

 

 

 

posted @ 2022-02-07 17:25  burlingame  阅读(41)  评论(0编辑  收藏  举报