@ 一般用来关闭命令的回显
所以,测试看这样可不可以 :)
$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
4
1
如果Q 取值为 @,那命令部分就是 @@:,不回显
如果Q没有取值,那命令部分就是 @:,一样不回显所以,测试看这样可不可以 :)
$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
$(Q)@: In fact, nothing to do here.
2
archclean:
@$(MAKEBOOT) clean
或者
checkbin:
@ /bin/ture
@ true
这里面
@$和@代表着什么意思啊?
$(MAKEBOOT) 是变量 MAKEBOOT 的值,
@表示在make时不输出make的信息(类似Windows下的echo off)。
3
makefile文件出现“ARCH := arm”,请问“:=”代表什么意思??
我正在看vivi的makefile文件,其中有一句是:
[b]ARCH := arm[/b]
请问那个":="符号代表什么意思哦?
我只知道在makefile文件里面,使用变量时,是用的"="这个符号。
那这里的":="是什么意思呢?
4
:= ,=,?=的区别
:=不递归赋值
= 递归赋值
?=默认值
“:=” 的意思是,它右边赋得值如果是变量,只能使用在这条语句之前定义好的,而不能使用本条语句之后定义的变量;
于此对应的是“=”,当它的右边赋值是变量时,这个变量的定义在本条语句之前或之后都可以;
而“?=”是指,该符号左边的变量,如果在本条语句之前没有定义过,则执行本语句,如果已经定义,那么本语句什么都不做
makefile中的自动化变量$@,$%,$
自动化变量
模式规则中,规则的目标和依赖文件名代表了一类文件名;规则的命令是对所有这
一类文件重建过程的描述,显然,在命令中不能出现具体的文件名,否则模式规则失去
意义。那么在模式规则的命令行中该如何表示文件,将是本小节的讨论的重点。
假如你需要书写一个将.c 文件编译到.o 文件的模式规则,那么你该如何为gcc 书写
正确的源文件名?当然了,不能使用任何具体的文件名,因为在每一次执行模式规则时
源文件名都是不一样的。为了解决这个问题,就需要使用“自动环变量”,自动化变量
的取值是根据具体所执行的规则来决定的,取决于所执行规则的目标和依赖文件名。
下面对所有的自动化变量进行说明: www.2cto.com
$@
表示规则的目标文件名。如果目标是一个文档文件(
Linux中,一般称.a 文件为
文档文件,也称为静态库文件),那么它代表这个文档的文件名。在多目标模式
规则中,它代表的是哪个触发规则被执行的目标文件名。
$%
当规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则
的目标是“foo.a(bar.o)”,那么,“ $%”的值就为“bar.o”,“ $@ ”的值为“foo.a”。
如果目标不是静态库文件,其值为空。
$<
规则的第一个依赖文件名。如果是一个目标文件使用隐含规则来重建,则它代表
由隐含规则加入的第一个依赖文件。
$?
所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代
表的是库成员(.o 文件)。 www.2cto.com
$^
规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的
只能是所有库成员(.o 文件)名。一个文件可重复的出现在目标的依赖中,变量
“$^”只记录它的一次引用情况。就是说变量“$^”会去掉重复的依赖文件。
$+
类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库
的交叉引用场合。
$*
在模式规则和静态模式规则中,代表“茎”。“茎”是目标模式中“% ”所代表的
部分(当文件名中存在目录时,“茎”也包含目录(斜杠之前)部分,可参考 10.5.4
模式的匹配 一小节)。例如:文件“dir/a.foo.b”,当目标的模式为“a.%.b ”时,
“$* ”的值为“dir/a.foo ”。“茎”对于构造相关文件名非常有用。
自动化变量“$* ”需要两点说明:
? 对于一个明确指定的规则来说不存在“茎”,这种情况下“$* ”的含义发
生改变。此时,如果目标文件名带有一个可识别的后缀(参考 10.7 后
缀规则 一节),那么“$* ”表示文件中除后缀以外的部分。例如:“foo.c”
则“$* ”的值为:“foo ”,因为.c 是一个可识别的文件后缀名。GUN make
对明确规则的这种奇怪的处理行为是为了和其它版本的make兼容。通
常,在除静态规则和模式规则以外,明确指定目标文件的规则中应该避
免使用这个变量。
? 当明确指定文件名的规则中目标文件名包含不可识别的后缀时,此变量
为空。
自动化变量“$?”在显式规则中也是非常有用的,使用它规则可以指定只对更新
以后的依赖文件进行操作。例如,静态库文件“libN.a ”,它由一些.o 文件组成。这个规
则实现了只将更新后的.o 文件加入到库中:
lib: foo.o bar.o lose.o win.o
ar r lib $?