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 分析 -- 内置变量及自动变量的更多相关文章

  1. Thymeleaf 之 内置对象、定义变量、URL参数及标签自定义属性

    Thymeleaf 之 内置对象.定义变量.URL参数及标签自定义属性 本文章来自[知识林] 如标题所述,这篇文章主要讲述Thymeleaf中的内置对象(list解析.日期格式化.数字格式化等).定义 ...

  2. MyBatis 源码分析 - 内置数据源

    1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...

  3. awk内置函数、外部变量

    外部变量 ①获取外部变量 格式: awk '{action}' 变量名=变量值 ,这样传入变量可以在action中获得值. 示例: test='awk test'--day-5 外部变量 ①获取外部变 ...

  4. (jmeter内置可调用的变量)jmeter beanShell断言

    用户可以在jmeter- “beanShell断言”中自定义断言.自由灵活的用脚本实现自己的断言  beanShell断言接口介绍  在beanShell中直接可以调用的变量,无需加前缀.  1.lo ...

  5. Perl中的特殊内置变量详解

    #!/usr/bin/perl -w @array = qw(a b c d); foreach (@array) { print $_," "; } 例子的作用就是定义一个数组并 ...

  6. GLSL语言内置的变量详解

    GLSL语言内置的变量,包括内置的顶点属性(attribute).一致变量(uniform).易变变量(varying)以及常量(const),一方面加深印象,另一方面今天的文章可以为以后的编程做查询 ...

  7. 静态局部变量、静态全局变量、extern全局变量、自动变量 札记

    静态局部变量 静态局部变量. 从称呼上我们可以看出,静态局部变量首先是一个局部变量,因此其只在定义它的函数内有效,冠以静态的头衔后,其生存期就被延长了,不会随着函数的返回而被撤销.我们可以这样来理解: ...

  8. python之路——内置函数和匿名函数

    阅读目录 楔子 内置函数 匿名函数 本章小结 楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们 ...

  9. JS中的常量(基本数据类型)和内置对象

    JS中的基本数据类型: String .number.null.boolean.undefined.object.symbol(ES6) 1.  利用typeof运算符时其中只有null是异常的,ty ...

随机推荐

  1. 检测到在集成的托管管道模式下不适用的 ASP.NET 设置的解决方法

    在将应用程序从经典模式迁移到集成模式时,可以保留经典模式下的自定义模块和处理程序注册,也可以将这些注册移除.如果不移除经典模式下使用的 httpModules 和 httpHandlers 注册,则必 ...

  2. 学习iOS的一些网站收藏

    1,CocoaChina:http://www.cocoachina.com/ 2,Code4App:http://code4app.com/ 3,梦维:http://www.dreamingwish ...

  3. 关于环境变量PATH的几点注意事项

    查看执行文件路径变量PATH的内容可用echo $PATH.echo表示显示打印之意,$表示后接的是变量. 如下图所示,其中每个目录中间用冒号(:)来隔开,每个目录是有顺序之分的: 如果预修改PATH ...

  4. jQuery弹出层始终垂直居中相对于屏幕或当前窗口

    把弹出层的位置设为fixed,设置top:50%,然后获取当前元素的整体的高度height,用获取的高度height/2,设置margin-top:-height/2.即可把当前的弹出层始终垂直居中于 ...

  5. HDU-4777 Rabbit Kingdom(区间更新求和)

    题目大意:给一个n个整数的数列,q次询问,每次询问区间[l,r]中与区间中其它数互质的数的个数.. 题目分析:离线处理,这里以询问区间的左端点从小到大的顺序为例.为了叙述方便,用f(l,r)表示区间[ ...

  6. 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)

    嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...

  7. [AC自动机]题目合计

    我只是想记一下最近写的题目而已喵~ 题解什么的才懒得写呢~ [poj 1625]Censored! 这题注意一个地方,就是输入数据中可能有 ASCII 大于 128 的情况,也就是说用 char 读入 ...

  8. java的nio之:java的bio流下实现的socket服务器同步阻塞模型和socket的伪异步的socket服务器的通信模型

    同步I/O模型的弊端===>每一个线程的创建都会消耗服务端内存,当大量请求进来,会耗尽内存,导致服务宕机 伪异步I/O的弊端分析===>当对Socket的输入流进行读取操作的时候,它会一直 ...

  9. CentOS 6 DEPRECATED

    Created by YEISON CAMARGO, last modified by John Boteler on 2016.02.02 Go to start of metadata   Abo ...

  10. linux下单节点oracle数据库间ogg搭建

    环境说明:   linux为Linux 2.6.32-573.el6.x86_64     oracle为 11g Enterprise Edition Release 11.2.0.1.0 - 64 ...