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 就不一一列举了。

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)  

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
1月前
|
C语言
Makefile模式规则与自动变量
Makefile模式规则与自动变量
11 0
|
6月前
|
存储 Shell 编译器
makefile 变量赋值方式
makefile 变量赋值方式
55 1
|
6月前
makefile 变量的替换,嵌套引用,命令行变量
makefile 变量的替换,嵌套引用,命令行变量
52 1
|
6月前
|
Shell
makefile 变量的扩展
makefile 变量的扩展
22 1
|
8月前
|
运维 Shell Linux
【运维知识高级篇】超详细的Shell编程讲解1(Shell作用+脚本书写方式+脚本执行方式+变量分类+变量配置文件+变量定义+Shell重要的位置变量+三种传参方式)
【运维知识高级篇】超详细的Shell编程讲解1(Shell作用+脚本书写方式+脚本执行方式+变量分类+变量配置文件+变量定义+Shell重要的位置变量+三种传参方式)
261 1
|
8月前
|
Linux Shell
一分钟学会变量,别名,历史命令,一行上执行两个命令,引号的使用
变量简单说就是让某一个特定字符串代表不固定的内容,变量可分为两类:环境变量(全局变量)和普通变量(局部变量
38 0
|
8月前
|
存储 Shell
Shell 变量使用(环境变量、预定义变量、位置变量、自定义变量的区别)
Shell 变量使用(环境变量、预定义变量、位置变量、自定义变量的区别)
82 0
|
Shell 索引
shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)
shell变量 shell变量是指用一个特定的字符串去表示不固定的内容 1.变量的类型 1.1自定义变量 一般情况下不怎么使用环境变量,如果需要在其他文件中引入某个文件的变量则在脚本最开始的位置使用source 或者. 执行下该脚本即可
1904 0
shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)
脚本变量中包含空格的解决办法
脚本变量中包含空格的解决办法
167 0

热门文章

最新文章