Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax Makefile:两个语法问题_Syntax_Makefile - Fatal编程技术网

Syntax Makefile:两个语法问题

Syntax Makefile:两个语法问题,syntax,makefile,Syntax,Makefile,软件包版本:=$(版本)x0d$(日期) 版本和日期变量之间的x0d部分是什么?只是一根绳子吗 $(dotin\u文件:.in=)在下面做了什么 代码 这意味着什么$(dotin\u文件:=.in) 代码 目标可以包含多个文件吗 将目标变量声明为假的意思是什么 代码 在下面的正则表达式替换代码中 代码 什么是$$ENV{$$1}和$$&?我想这是Perl范围 感谢您抽出时间变量扩展 $()是make中的变量扩展,如果makefile是 version=1 date=1.1.10 p

软件包版本:=$(版本)x0d$(日期)

版本和日期变量之间的x0d部分是什么?只是一根绳子吗

  • $(dotin\u文件:.in=)在下面做了什么

  • 代码

    • 这意味着什么$(dotin\u文件:=.in)
    代码

    • 目标可以包含多个文件吗

    • 将目标变量声明为假的意思是什么

    代码

    • 在下面的正则表达式替换代码中
    代码

    什么是
    $$ENV{$$1}
    $$&
    ?我想这是Perl范围


    感谢您抽出时间

    变量扩展

    $()
    是make中的变量扩展,如果makefile是

    version=1
    date=1.1.10
    package_version:=$(version)x0d$(date)
    
    然后变量
    package\u version
    将扩展到
    1x0d1.1.10

    替代

    语法
    $(var:a=b)
    是a,将扩展为
    var
    ,后缀
    a
    替换为
    b

    例如,在

    foobar:= foo bar
    faabar:=$(foobar:oo=aa)
    
    $(faabar)
    将扩展到字符串
    faa条

    多个目标

    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
    
    转义

    美元符号是makefiles中的转义字符,perl示例中的
    $$
    是文本
    $
    ,例如
    substitute
    将是字符串

    perl -p -e 's/@([^@]+)@/defined $ENV{$1} ? $ENV{$1} : $&/ge'
    

    这里的美元符号是由perl处理的,可能会给出环境变量(我不知道perl)。

    变量扩展

    $()
    是make中的变量扩展,如果makefile是

    version=1
    date=1.1.10
    package_version:=$(version)x0d$(date)
    
    然后变量
    package\u version
    将扩展到
    1x0d1.1.10

    替代

    语法
    $(var:a=b)
    是a,将扩展为
    var
    ,后缀
    a
    替换为
    b

    例如,在

    foobar:= foo bar
    faabar:=$(foobar:oo=aa)
    
    $(faabar)
    将扩展到字符串
    faa条

    多个目标

    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
    
    转义

    美元符号是makefiles中的转义字符,perl示例中的
    $$
    是文本
    $
    ,例如
    substitute
    将是字符串

    perl -p -e 's/@([^@]+)@/defined $ENV{$1} ? $ENV{$1} : $&/ge'
    

    这里的美元符号是由perl处理的,可能会给出环境变量(我不知道perl)。

    Michael,你已经问了很多基本的Makefile问题,现在你要问的是那些你应该能够通过实验自己回答的问题

    can target contain multiple files?
    
    试试看:

    dotin_files := foo.in bar.in
    
    $(dotin_files):
        @echo $@
    
    现在尝试
    makefoo.in
    makebar.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、Regex、find、make或其他方面的知识,请在这里随意提问,但请先花点时间尝试解决它。

    Michael,您已经问了很多基本的Makefile问题,现在要问的是您应该能够通过实验自己回答的问题

    can target contain multiple files?
    
    试试看:

    dotin_files := foo.in bar.in
    
    $(dotin_files):
        @echo $@
    
    现在尝试
    makefoo.in
    makebar.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、Regex、find、make或其他方面的信息,请在这里随意提问,但请先花点时间尝试解决。

    • 版本和日期变量之间的x0d部分,是否只是字符串?

    • 美元(dotin_文件:.in=)在下面做了什么
      从与shell find一起找到的文件名中删除.in

    • 这意味着$(dotin_文件:=.in)
      我想你指的是$(dotin_文件:.in=)。如前所述,在变量dotin_文件中,它用空字符串(介于“=”和“)”之间的部分)替换出现的“.in”

    • 目标能否包含多个文件?

    • 将目标变量声明为假的含义是什么?
      将忽略目标时间戳并将其视为新的 因此每次都要重建它们

    • 在下面的正则表达式替换代码中$$ENV{$$1}和$$&是什么?

    为了避免扩展$ENV,$增加了一倍,请考虑C格式字符串中的“%”,因此字符串
    perl-p-e的/@([^@]+)@/defined$$ENV{$$1}$$环境{$$1}:$$&/ge'
    当作为shell命令调用时,命令将变为:
    perl-p-e的/@([^@]+)@/定义的$ENV{$1}$环境{$1}:$&/ge'

    $ENV是perl环境散列,$1我认为它是s///regexp组中的一个反向引用。

    • 版本和日期变量之间的x0d部分,是否只是字符串?

    • 美元(dotin_文件:.in=)在下面做了什么
      从与shell find一起找到的文件名中删除.in

    • 这意味着$(dotin_文件:=.in)
      我想你指的是$(dotin_文件:.in=)。如前所述,在变量dotin_文件中,它将替换任何事件