package_version:= $(版本)x0d $(日期)
版本和日期变量之间的x0d部分是什么?它只是字符串吗?
$(dotin_files:.in =)的作用
码
dotin_files := $(shell find . -type f -name \*.in)
dotin_files := $(dotin_files:.in=)
码
$(dotin_files): $(dotin_files:=.in)
$(substitute) $@.in > $@
目标是否包含多个文件?
将目标变量声明为PHONY是什么意思?
码
.PHONY: $(dotin_files)
码
substitute := perl -p -e 's/@([^@]+)@/defined $$ENV{$$1} ? $$ENV{$$1} : $$&/ge'
$$ENV{$$1}
和$$&
是什么?我猜这是Perl范围...
感谢您的时间
答案 0 :(得分:2)
可变扩展
$()
是make中的变量扩展,这应该只是字符串替换 - 如果你的makefile是
version=1
date=1.1.10
package_version:=$(version)x0d$(date)
然后变量package_version
将扩展为1x0d1.1.10
。
<强>换人强>
语法$(var:a=b)
为substitution reference,并将扩展为var
,后缀a
替换为b
。
例如,在
中foobar:= foo bar
faabar:=$(foobar:oo=aa)
$(faabar)
将扩展为字符串faa bar
。
多个目标
make规则中的多个目标等同于具有单个目标的n个规则,例如
foo bar:foo.c bar.c
$(CC) -o $@ $^
相当于
foo:foo.c bar.c
$(CC) -o $@ $^
bar:foo.c bar.c
$(CC) -o $@ $^
请记住,此处的所有变量都已展开。
虚假目标
.PHONY
目标声明规则不会生成实际文件,因此它将始终构建。与往常一样,变量首先被扩展。在你的情况下,这将扩展到类似
.PHONY: foo bar
<强>逃逸强>
美元符号是makefile中的转义字符,perl示例中的$$
是文字$
,例如substitute
将是字符串
perl -p -e 's/@([^@]+)@/defined $ENV{$1} ? $ENV{$1} : $&/ge'
这里的美元符号由perl处理,可能会给出环境变量(我不知道perl)。
答案 1 :(得分:1)
can target contain multiple files?
试一试:
dotin_files := foo.in bar.in
$(dotin_files):
@echo $@
现在尝试make foo.in
和make bar.in
。会发生什么?
What $(dotin_files:.in=) does
这是替代参考。亲自尝试看看会发生什么,比如:
dotin_files := foo.in bar.in
dotin_files := $(dotin_files:.in=)
all:
@echo $(dotin_files)
它做了什么?
substitute := perl -p -e 's/@([^@]+)@/defined $$ENV{$$1} ? $$ENV{$$1} : $$&/ge'
what are $$ENV{$$1} and $$&? I guess it's Perl scope...
我们来看看:
all:
@echo $(substitute)
如果您想了解更多关于Perl或正则表达式,或者找到,或制作或者其他什么,请随时在这里询问,但请花点时间尝试先弄清楚。
答案 2 :(得分:1)
x0d版本和日期变量之间的部分,是否只是字符串?
是
$(dotin_files:.in =)在下面做什么 从shell find中找到的文件名中删除.in。
这意味着$(dotin_files:=。in)
我认为你的意思是$(dotin_files:.in =)。正如已经回答的那样,在变量dotin_files中,它用空字符串(“=”和“)”之间的部分替换任何出现的“.in”。
目标是否包含多个文件?
是
将目标变量声明为PHONY是什么意思?
make将忽略目标时间戳并将其视为新的
因此每次重建它们。
在下面的正则表达式替换代码中,$$ ENV {$$ 1}和$$&amp ;?
为了避免$ ENV的扩展,$加倍,想到C格式字符串中的'%',因此字符串
perl -p -e's / @([^ @] +)@ /定义$$ ENV {$$ 1}? $$ ENV {$$ 1}:$$&amp; / ge'
当作为shell命令调用时将变为:
perl -p -e's / @([^ @] +)@ /定义$ ENV {$ 1}? $ ENV {$ 1}:$&amp; / ge'
$ ENV是perl Environment hash,$ 1我认为它是s /// regexp组中的反向引用。