Makefile:几个语法问题

时间:2010-05-05 06:55:16

标签: syntax makefile

  • package_version:= $(版本)x0d $(日期)

    版本和日期变量之间的x0d部分是什么?它只是字符串吗?

  • $(dotin_files:.in =)的作用

dotin_files       := $(shell find . -type f -name \*.in)
dotin_files       := $(dotin_files:.in=)
  • 这意味着什么 $(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范围...

感谢您的时间

3 个答案:

答案 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)

迈克尔,你一直在问很多基本的Makefile问题,你现在要问的是那些你应该能够通过实验自己回答的问题。

can target contain multiple files?

试一试:

dotin_files := foo.in bar.in

$(dotin_files):
    @echo $@

现在尝试make foo.inmake 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组中的反向引用。

相关问题