makefile中变量有哪些?

make一些参数选项:
-p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则。
-n 选项, 只运行,不执行,
-d 选项,相当于–debug=a,b(basic),v(verbose),i(implicity),j(innvocation of command),m(remake files)

这里着重解释一下 -p,打印变量值使用命令:

make -p > xx

-p, --print-data-base Print make’s internal database。即打印makefile 的执行规矩等。从而查看到相应的makefile中的各个变量的值。xx 把这些数据都重定向到xx这个文件中。

===========================================
makefile变量可以分为4类:
第一类: 环境变量, 比较重要的是PATH, PWD 就不一一列举了。

HOME="/home/book"
LANG="en_US.UTF-8"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
PWD="/home/book"
SHELL="/bin/bash"
......

第二类: 内置变量或叫默认变量(default), 比较重要的是CC, CXX, .INCLUDE_DIRS, .DEFAULT_GOAL等。

CURDIR := /home/zht # 记录当前路径
SHELL = /bin/sh
MAKEFILE_LIST :=  Makefile
.DEFAULT_GOAL := all
MAKEFLAGS = p
HOSTARCH := x86_64
CC = cc 		# C语言编译器的名称
CPP = $(CC) -E  # C语言预处理器的名称 $(CC) -E
CXX = g++       # C++语言的编译器名称
RM = rm -f		# 删除文件程序的名称
CFLAGS			# C语言编译器的编译选项,无默认值
CPPFLAGS  		# C语言预处理器的编译选项,无默认值
CXXFLAGS		# C++语言编译器的编译选项,无默认值
......

第三类: 自动变量,例如:

$@:表示目标文件的名称,包含扩展名
$^:表示所有的依赖文件,以空格隔开,不重复
$<:表示第一个依赖文件的名称
$+:表示所有的依赖文件,空格隔开,可以重复
$*:表示目标文件的名称,不包含扩展名
$?:依赖项中,所有比目标文件新的依赖文件

[hjj@hjj ~]$ cat 3.txt
%D = ( p a t s u b s t (patsubst %/,%, (patsubst(dir $%))
D = ( p a t s u b s t (patsubst %/,%, (patsubst(dir $))
+D = ( p a t s u b s t (patsubst %/,%, (patsubst(dir $+))
?D = ( p a t s u b s t (patsubst %/,%, (patsubst(dir $?))
@D = ( p a t s u b s t (patsubst %/,%, (patsubst(dir $@))
^D = ( p a t s u b s t (patsubst %/,%, (patsubst(dir $^))
%F = $(notdir $%)
F = $(notdir $)
+F = $(notdir $+)
<F = $(notdir $<)
?F = $(notdir $?)
@F = $(notdir $@)
^F = $(notdir $^)

代表文件(4个)
$@–目标文件,
$<–第一个依赖文件。
∗ − − 代 表 " 茎 " , 例 如 : 文 件 “ d i r / a . f o o . b ” , 当 目 标 的 模 式 为 “ a . *--代表"茎",例如:文件“dir/a.foo.b”,当目标的模式为“a.%.b ”时,“ "",dir/a.foo.ba.* ”的值为“dir/a.foo ”
$%–当规则的目标文件是一个静态库文件时,代表静态库的一个成员名
代表文件列表(3个)
$^–所有的依赖文件,
$?–所有比目标文件更新的依赖文件列表
+ − − 类 似 “ +--类似“ +^”,但是它保留了依赖文件中重复出现的文件

$(@D) – 目标的目录部分,文件名部分
$(@F)
$(*D) – 代表"茎"的目录部分,文件名部分
$(*F)
$(<D) – 第一个依赖文件目录部分,文件名部分
$(<F)
$(?D) – 被更新的依赖文件目录部分,文件名部分
$(?F)
$(^D) – 所有依赖文件目录部分,文件名部分
$(^F)
$(%D) – 库文件成员目录部分,文件名部分
$(%F)
$(+D) – 所有依赖的目录部分,文件名部分(可存在重复文件)
$(+F)

第四类: makefile 中我们自己定义的变量,比如下面的foo,bar变量等.
① foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:
echo ( f o o ) 我 们 执 行 “ m a k e a l l ” 将 会 打 出 变 量 (foo) 我们执行“make all”将会打出变量 (foo)makeall(foo)的值是“Huh?”( ( f o o ) 的 值 是 (foo)的值是 (foo)(bar), ( b a r ) 的 值 是 (bar)的值是 (bar)(ugh),$(ugh)的值是“Huh?”)可见,变量是可以使用后面的变量来定义的。
优:这个功能有好的地方,也有不好的地方,好的地方是,我们可以把变量的真实值推到后面来定义
缺:如果出现递归定义,如CFLAGS = $(CFLAGS) -O,后果:
这会让make陷入无限的变量展开过程中去,当然,我们的make是有能力检测这样的定义,并会报错。还有就是如果在变量中使用函数,那么,这种方式会让我们的make运行时非常慢,更糟糕的是,他会使用得两个make的函数“wildcard”和“shell”发生不可预知的错误。因为你不会知道这两个函数会被调用多少次。
② x := foo
y := $(x) bar
x := later
其等价于:
y := foo bar
x := later
优:这种方法避免了上面的问题,值得一提的是,这种方法,前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。如果是这样:
y := $(x) bar
x := foo
那么,y的值是“bar”,而不是“foo bar”。
③ FOO ?= bar
其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做
④ define two-lines
echo foo
echo $(bar)
endef
这是另一种设置变量值的方法,使用define关键字。使用define关键字设置变量的值可以有换行,这有利于定义一系列的命令。

综上,注意上面四种设置变量值的区别。

===============================================

查找makefile 维护的目标
.DEFAULT_GOAL 默认的维护的目标(命令行未指定目标)
MAKECMDGOALS 命令行指定的维护目标。
为完整起见,贴出我机器上的内置变量。大可不必死记硬背,掌握重要的,领会其含义即可。
[hjj@hjj ~]$ cat 2.txt
.FEATURES := target-specific order-only second-expansion else-if archives jobserver check-symlink
.INCLUDE_DIRS = /usr/include /usr/local/include /usr/include
.LIBPATTERNS = lib%.so lib%.a
.VARIABLES :=
AR = ar
ARFLAGS = rv
AS = as
CC = cc
CHECKOUT,v = +$(if $(wildcard @ ) , , @),, @),,(CO) $(COFLAGS) $< $@)
CO = co
COFLAGS =
COMPILE.C = $(COMPILE.cc)
COMPILE.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.cpp = $(COMPILE.cc)
COMPILE.def = $(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)
COMPILE.f = $(FC) $(FFLAGS) $(TARGET_ARCH) -c
COMPILE.mod = $(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)
COMPILE.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c
COMPILE.s = $(AS) $(ASFLAGS) $(TARGET_MACH)
CPP = $(CC) -E
CTANGLE = ctangle
CWEAVE = cweave
CXX = g++
F77 = $(FC)
F77FLAGS = $(FFLAGS)
FC = f77
GET = get
LD = ld
LEX = lex
LEX.l = $(LEX) $(LFLAGS) -t
LINK.C = $(LINK.cc)
LINK.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)
LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.cpp = $(LINK.cc)
LINK.f = $(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
LINK.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.r = $(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.s = $(CC) $(ASFLAGS) $(LDFLAGS) $(TARGET_MACH)
LINT = lint
LINT.c = $(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)
M2C = m2c
MAKE = $(MAKE_COMMAND)
MAKEFILES :=
MAKEINFO = makeinfo
MAKE_COMMAND := make
MAKE_VERSION := 3.81
OUTPUT_OPTION = -o $@
PC = pc
PREPROCESS.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F
PREPROCESS.S = $(CC) -E $(CPPFLAGS)
PREPROCESS.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F
RM = rm -f
SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
TANGLE = tangle
TEX = tex
TEXI2DVI = texi2dvi
WEAVE = weave
YACC = yacc
YACC.y = $(YACC) $(YFLAGS)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值