makefile中变量有哪些?
make一些參數(shù)選項(xiàng):
-p 選項(xiàng),可以打印出make過程中的數(shù)據(jù)庫, 下面研究一下內(nèi)置的變量和規(guī)則。
-n 選項(xiàng), 只運(yùn)行,不執(zhí)行,
-d 選項(xiàng),相當(dāng)于–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 的執(zhí)行規(guī)矩等。從而查看到相應(yīng)的makefile中的各個變量的值。xx 把這些數(shù)據(jù)都重定向到xx這個文件中。
===========================================
makefile變量可以分為4類:
第一類: 環(huán)境變量, 比較重要的是PATH, PWD 就不一一列舉了。
第二類: 內(nèi)置變量或叫默認(rèn)變量(default), 比較重要的是CC, CXX, .INCLUDE_DIRS, .DEFAULT_GOAL等。
CURDIR := /home/zht # 記錄當(dāng)前路徑 SHELL = /bin/sh MAKEFILE_LIST := Makefile .DEFAULT_GOAL := all MAKEFLAGS = p HOSTARCH := x86_64 CC = cc # C語言編譯器的名稱 CPP = $(CC) -E # C語言預(yù)處理器的名稱 $(CC) -E CXX = g++ # C++語言的編譯器名稱 RM = rm -f # 刪除文件程序的名稱 CFLAGS # C語言編譯器的編譯選項(xiàng),無默認(rèn)值 CPPFLAGS # C語言預(yù)處理器的編譯選項(xiàng),無默認(rèn)值 CXXFLAGS # C++語言編譯器的編譯選項(xiàng),無默認(rèn)值 ......第三類: 自動變量,例如:
$@:表示目標(biāo)文件的名稱,包含擴(kuò)展名 $^:表示所有的依賴文件,以空格隔開,不重復(fù) $<:表示第一個依賴文件的名稱 $+:表示所有的依賴文件,空格隔開,可以重復(fù) $*:表示目標(biāo)文件的名稱,不包含擴(kuò)展名 $?:依賴項(xiàng)中,所有比目標(biāo)文件新的依賴文件[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個)
$@–目標(biāo)文件,
$<–第一個依賴文件。
???代表"莖",例如:文件“dir/a.foo.b”,當(dāng)目標(biāo)的模式為“a.*--代表"莖",例如:文件“dir/a.foo.b”,當(dāng)目標(biāo)的模式為“a.%.b ”時,“???代表"莖",例如:文件“dir/a.foo.b”,當(dāng)目標(biāo)的模式為“a.* ”的值為“dir/a.foo ”
$%–當(dāng)規(guī)則的目標(biāo)文件是一個靜態(tài)庫文件時,代表靜態(tài)庫的一個成員名
代表文件列表(3個)
$^–所有的依賴文件,
$?–所有比目標(biāo)文件更新的依賴文件列表
+??類似“+--類似“+??類似“^”,但是它保留了依賴文件中重復(fù)出現(xiàn)的文件
$(@D) – 目標(biāo)的目錄部分,文件名部分
$(@F)
$(*D) – 代表"莖"的目錄部分,文件名部分
$(*F)
$(<D) – 第一個依賴文件目錄部分,文件名部分
$(<F)
$(?D) – 被更新的依賴文件目錄部分,文件名部分
$(?F)
$(^D) – 所有依賴文件目錄部分,文件名部分
$(^F)
$(%D) – 庫文件成員目錄部分,文件名部分
$(%F)
$(+D) – 所有依賴的目錄部分,文件名部分(可存在重復(fù)文件)
$(+F)
第四類: makefile 中我們自己定義的變量,比如下面的foo,bar變量等.
① foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:
echo (foo)我們執(zhí)行“makeall”將會打出變量(foo) 我們執(zhí)行“make all”將會打出變量(foo)我們執(zhí)行“makeall”將會打出變量(foo)的值是“Huh?”( (foo)的值是(foo)的值是(foo)的值是(bar),(bar)的值是(bar)的值是(bar)的值是(ugh),$(ugh)的值是“Huh?”)可見,變量是可以使用后面的變量來定義的。
優(yōu):這個功能有好的地方,也有不好的地方,好的地方是,我們可以把變量的真實(shí)值推到后面來定義
缺:如果出現(xiàn)遞歸定義,如CFLAGS = $(CFLAGS) -O,后果:
這會讓make陷入無限的變量展開過程中去,當(dāng)然,我們的make是有能力檢測這樣的定義,并會報錯。還有就是如果在變量中使用函數(shù),那么,這種方式會讓我們的make運(yùn)行時非常慢,更糟糕的是,他會使用得兩個make的函數(shù)“wildcard”和“shell”發(fā)生不可預(yù)知的錯誤。因?yàn)槟悴粫肋@兩個函數(shù)會被調(diào)用多少次。
② x := foo
y := $(x) bar
x := later
其等價于:
y := foo bar
x := later
優(yōu):這種方法避免了上面的問題,值得一提的是,這種方法,前面的變量不能使用后面的變量,只能使用前面已定義好了的變量。如果是這樣:
y := $(x) bar
x := foo
那么,y的值是“bar”,而不是“foo bar”。
③ FOO ?= bar
其含義是,如果FOO沒有被定義過,那么變量FOO的值就是“bar”,如果FOO先前被定義過,那么這條語將什么也不做
④ define two-lines
echo foo
echo $(bar)
endef
這是另一種設(shè)置變量值的方法,使用define關(guān)鍵字。使用define關(guān)鍵字設(shè)置變量的值可以有換行,這有利于定義一系列的命令。
綜上,注意上面四種設(shè)置變量值的區(qū)別。
===============================================
查找makefile 維護(hù)的目標(biāo)
.DEFAULT_GOAL 默認(rèn)的維護(hù)的目標(biāo)(命令行未指定目標(biāo))
MAKECMDGOALS 命令行指定的維護(hù)目標(biāo)。
為完整起見,貼出我機(jī)器上的內(nèi)置變量。大可不必死記硬背,掌握重要的,領(lǐng)會其含義即可。
[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)
總結(jié)
以上是生活随笔為你收集整理的makefile中变量有哪些?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM处理器型号
- 下一篇: ARM的cache和写缓冲器(write