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 = (patsubst(patsubst %/,%,(patsubst(dir $%))
D = (patsubst(patsubst %/,%,(patsubst(dir $))
+D = (patsubst(patsubst %/,%,(patsubst(dir $+))
?D = (patsubst(patsubst %/,%,(patsubst(dir $?))
@D = (patsubst(patsubst %/,%,(patsubst(dir $@))
^D = (patsubst(patsubst %/,%,(patsubst(dir $^))
%F = $(notdir $%)
F = $(notdir $)
+F = $(notdir $+)
<F = $(notdir $<)
?F = $(notdir $?)
@F = $(notdir $@)
^F = $(notdir $^)

代表文件(4个)
$@–目标文件,
$<–第一个依赖文件。
∗−−代表"茎",例如:文件“dir/a.foo.b”,当目标的模式为“a.*--代表"茎",例如:文件“dir/a.foo.b”,当目标的模式为“a.%.b ”时,“∗−−代表"茎",例如:文件“dir/a.foo.b”,当目标的模式为“a.* ”的值为“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 (foo)我们执行“makeall”将会打出变量(foo) 我们执行“make all”将会打出变量(foo)我们执行“makeall”将会打出变量(foo)的值是“Huh?”( (foo)的值是(foo)的值是(foo)的值是(bar),(bar)的值是(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)

makefile中变量有哪些?相关推荐

  1. Makefile中 变量赋值含义

    From:  http://hi.baidu.com/linuxking/item/aab87527ac88550a76272c91 作者联系方式:李先静 <xianjimli at hotma ...

  2. 【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

    加qq:1126137994 微信:liu1126137994 一起学习更多技术~ 继续上一篇文章关于变量的学习! 1.环境变量(全局变量) -makefile中能够直接使用环境变量的值 如果make ...

  3. 【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上

    抓住基础,学习更多技术,迎接挑战,加qq:1126137994 微信:liu1126137994 一起学习更多技术~ 上一篇文章学习了makefile中的预定义变量的使用,今天来继续学习makefil ...

  4. Makefile中的变量

    Makefile中的变量 2007-11-03 12:03 Makefile中变量有以下几个特征: 1. Makefile中变量和函数的展开(除规则命令行中的变量和函数以外),是在make读取make ...

  5. makefile中的shell调用---注意事项

    在之前一次编写makfile时候,有看到相关的makefile中使用$$来引用变量,而且尝试后发现$$使用居然和${}有类似的功能.当时也没具体追究相关的用法,当然刚才所说的都是错误的观念 $$:在m ...

  6. Makefile中的变量和shell变量

    我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...

  7. Linux学习笔记-Makefile中的变量及函数

    Makefile中的变量 此处的变量不是C/C++,Java等中的变量(认为他是一个字符串就阔以了) 一般变量名用大写字母来写,如下所属: SUBDIR = src xml SUBDIR += osa ...

  8. makefile中的foreach、patsubst等函数及自动化变量

    参考链接: Makefile中foreach函数使用方法 Makefile中的$@, $^, $< , $?, $%, $+, $* Makefile之patsubst wildcard ,no ...

  9. makefile 中 =, :=, ?=, +=的区别

    在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为: ifdef DEFINE_VRE     VRE ...

最新文章

  1. Blender 和Unreal Engine中的模块化3D建筑技能学习视频教程
  2. 硬核!手写一个优先队列
  3. WCF分布式开发常见错误(10):套接字连接中断,The socket connection was aborted
  4. src/main/resorces applicationContext.xml
  5. Vue通过id跳转到商品详情页
  6. node express创建项目步骤
  7. deepin更新启动项_Deepin系统更新的两大方法
  8. webstorm 配置sass
  9. python购物车代码_(Python基础)简单购物车代码
  10. node+redis+阿里云短信验证码,注册手机验证码完整功能代码
  11. 微信小程序:最新掌上题库微信小程序源码下载,修复登录接口,支持在线考试,自定义导入考题
  12. [线性代数] 1.2 全排列和对换
  13. win10位置定位服务器,win10定位设置在哪里进行设置|win10定位的设置方法详解
  14. canvas实现图片剪切
  15. U3D开发的逆天级大型游戏有哪些
  16. 课改要实现“软着陆”
  17. linux系统Kile+Okular实现逆向搜索
  18. 【转】CCIE一年后的心语
  19. barrnap:预测基因组上的核糖体RNA
  20. 万恶之源 - Python基础

热门文章

  1. Luogu1714 切蛋糕
  2. Mysql 解压版 安装时候的注意事项
  3. 转: Ubuntu 安装字体方法
  4. VIM基础130命令
  5. eclipse常用快捷键排行
  6. UA MATH567 高维统计专题1 稀疏信号及其恢复4 Basis Pursuit的算法 Projected Gradient Descent
  7. PowerDesigner中Stereotype的创建图解
  8. 使用Win32汇编开发一个dll并在C#中调用
  9. 11 mybatis-高级应用
  10. 【bzoj4408】[Fjoi 2016]神秘数 主席树