makefile 分析 -- 内置变量及自动变量
makefile 分析1
-p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则。
-n 选项, 只运行,不执行,
-d 选项,相当于--debug=a, b(basic),v(verbose),i(implicity),j(innvocation of command),m(remake files)
这里着重解释一下 -p
make -p -f /dev/null 可以打印出内置变量和内置规则
变量可以分为3类,
第一类: 环境变量, 比较重要的是PATH, PWD 就不一一列举了。
第二类: 内置变量, 比较重要的是cc, CXX, .INCLUDE_DIRS, .DEFAULT_GOAL等
例如:
cc 是 /usr/bin/cc -> /usr/bin/gcc
CXX 是 g++
查找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)
第三类:自动变量。我的机器是这样的。
[hjj@hjj ~]$ cat 3.txt
%D = $(patsubst %/,%,$(dir $%))
*D = $(patsubst %/,%,$(dir $*))
+D = $(patsubst %/,%,$(dir $+))
?D = $(patsubst %/,%,$(dir $?))
@D = $(patsubst %/,%,$(dir $@))
^D = $(patsubst %/,%,$(dir $^))
%F = $(notdir $%)
*F = $(notdir $*)
+F = $(notdir $+)
<F = $(notdir $<)
?F = $(notdir $?)
@F = $(notdir $@)
^F = $(notdir $^)
代表文件(4个)
$@--目标文件,
$<--第一个依赖文件。
$*--代表"茎",例如:文件“dir/a.foo.b”,当目标的模式为“a.%.b ”时,“$* ”的值为“dir/a.foo ”
$%--当规则的目标文件是一个静态库文件时,代表静态库的一个成员名
代表文件列表(3个)
$^--所有的依赖文件,
$?--所有比目标文件更新的依赖文件列表
$+--类似“$^”,但是它保留了依赖文件中重复出现的文件
$(@D) -- 目标的目录部分,文件名部分
$(@F)
$(*D) -- 代表"茎"的目录部分,文件名部分
$(*F)
$(<D) -- 第一个依赖文件目录部分,文件名部分
$(<F)
$(?D) -- 被更新的依赖文件目录部分,文件名部分
$(?F)
$(^D) -- 所有依赖文件目录部分,文件名部分
$(^F)
$(%D) -- 库文件成员目录部分,文件名部分
$(%F)
$(+D) -- 所有依赖的目录部分,文件名部分(可存在重复文件)
$(+F)
makefile 分析 -- 内置变量及自动变量的更多相关文章
- Thymeleaf 之 内置对象、定义变量、URL参数及标签自定义属性
Thymeleaf 之 内置对象.定义变量.URL参数及标签自定义属性 本文章来自[知识林] 如标题所述,这篇文章主要讲述Thymeleaf中的内置对象(list解析.日期格式化.数字格式化等).定义 ...
- MyBatis 源码分析 - 内置数据源
1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...
- awk内置函数、外部变量
外部变量 ①获取外部变量 格式: awk '{action}' 变量名=变量值 ,这样传入变量可以在action中获得值. 示例: test='awk test'--day-5 外部变量 ①获取外部变 ...
- (jmeter内置可调用的变量)jmeter beanShell断言
用户可以在jmeter- “beanShell断言”中自定义断言.自由灵活的用脚本实现自己的断言 beanShell断言接口介绍 在beanShell中直接可以调用的变量,无需加前缀. 1.lo ...
- Perl中的特殊内置变量详解
#!/usr/bin/perl -w @array = qw(a b c d); foreach (@array) { print $_," "; } 例子的作用就是定义一个数组并 ...
- GLSL语言内置的变量详解
GLSL语言内置的变量,包括内置的顶点属性(attribute).一致变量(uniform).易变变量(varying)以及常量(const),一方面加深印象,另一方面今天的文章可以为以后的编程做查询 ...
- 静态局部变量、静态全局变量、extern全局变量、自动变量 札记
静态局部变量 静态局部变量. 从称呼上我们可以看出,静态局部变量首先是一个局部变量,因此其只在定义它的函数内有效,冠以静态的头衔后,其生存期就被延长了,不会随着函数的返回而被撤销.我们可以这样来理解: ...
- python之路——内置函数和匿名函数
阅读目录 楔子 内置函数 匿名函数 本章小结 楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们 ...
- JS中的常量(基本数据类型)和内置对象
JS中的基本数据类型: String .number.null.boolean.undefined.object.symbol(ES6) 1. 利用typeof运算符时其中只有null是异常的,ty ...
随机推荐
- poj 1475 uva 589 - Pushing Boxes
题目大意 人推箱子从起点到终点,要求推箱子的次数最少,并打印出来人移动的路径. 题目分析 对于箱子进行宽搜的同时,要兼顾人是否能够把箱子推到相应的位置 每一次对箱子bfs 然后对人再bfs #incl ...
- Apache CXF 103 CXF Basics - partial
本Spike记录中内容,如无特别指出,均引用[1]. 0 引言 0.1 基本的Web服务术语 XML 业界的结构化交换信息表示的事实上的标准. XML namespace是在XML文档中提供唯一的命名 ...
- mysql导入sql文件过大或连接超时的解决办法
前段时间出差在现场开发的时候,导入数据库老是出问题.最后发现了一个神奇sql语句交给实施,只要导入出错就把如下语句执行就可以了.至今屡试不爽. 1 2 3 4 5 6 7 set global max ...
- hdu 2795 线段树(二维问题一维化)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- JavaWeb学习记录(六)——用户登录功能之Session与验证码验证功能的实现
一.产生验证码的工具类 package blank.util; import java.awt.Color;import java.awt.Graphics;import java.awt.image ...
- puppet安装配置及使用
puppet安装前准备 一.服务器信息 master端:10.10.10.201 master.fansik.com slave端:10.10.10.156 slave.fansik.com 三台机 ...
- 《苹果开发之Cocoa编程》挑战2 创建一个数据源 练习
<苹果开发之Cocoa编程>第4版 P87 创建一个to-do list应用程序,在文本框中输入任务.当用户单击Add按钮时,添加字符串到一个变长队列,新任务就出现在list的末尾. 关键 ...
- 黑马程序员——JAVA基础之Vector集合
------- android培训.java培训.期待与您交流! ---------- 基本已被淘汰 枚举就是Vector特有的取出方式.枚举和迭代器很像.其实枚举和迭代是一样的. 因为枚举的名称 ...
- Wireshark抓包实例分析TCP重复ACK与乱序
转载请在文首保留原文出处: EMC 中文支持论坛https://community.emc.com/go/chinese 介绍 TCP 的一大常见问题在于重复 ACK 与快速重传.这一现象的发生也是由 ...
- 【转】NSString属性什么时候用copy,什么时候用strong?
原文网址:http://www.cocoachina.com/ios/20150512/11805.html 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境) ...