Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
Macos 如何在makefile中追加文件路径_Macos_Makefile - Fatal编程技术网

Macos 如何在makefile中追加文件路径

Macos 如何在makefile中追加文件路径,macos,makefile,Macos,Makefile,我在MacOS的makefile中使用了下面的示例代码来构建路径,但它总是不起作用 all: ROOT=$(shell pwd) @echo $(ROOT) AGENT:=$(ROOT)/agent @echo $(AGENT) @mkdir -p $(AGENT) 它将输出为AGENT:=/AGENT,显然,AGENT变量没有扩展为ROOT这里有几个常见错误: 配方行在单独的shell中运行,您不能期望在一个shell中分配的shell变量仍然在另一个shell中定义 无

我在MacOS的makefile中使用了下面的示例代码来构建路径,但它总是不起作用

all:
  ROOT=$(shell pwd)
  @echo $(ROOT)
  AGENT:=$(ROOT)/agent
  @echo $(AGENT)
  @mkdir -p $(AGENT)

它将输出为
AGENT:=/AGENT
,显然,
AGENT
变量没有扩展为
ROOT

这里有几个常见错误:

  • 配方行在单独的shell中运行,您不能期望在一个shell中分配的shell变量仍然在另一个shell中定义
  • 无需在recipes中使用
    $(shell…
    make函数:recipes已经是shell脚本了
  • 显然,你把shell变量弄混了,然后生成了变量。
    • Shell变量被分配为
      var=xxx
      (在
      =
      周围没有空格),仅在配方中(好的,几乎只有)。它们是用
      $var
      ${var}
      扩展的,但从来没有用
      $(var)
      扩展,仍然几乎只在配方中
    • Make变量被赋值为
      var:=xxx
      var=xxx
      (在
      :=
      =
      周围有空格或没有空格),仅在配方之外(好吧,几乎仅限于此)。它们用
      $(var)
      ${var}
      展开,而不是在任何地方用
      $var
      展开。请注意,
      =
      :=
      是不同的,但这超出了范围
  • 如果你是初学者,请忽略上面解释中的“几乎”,你现在不需要这个

    Makefile使用两种不同的语言编写:recipes中的shell语言和其他地方的make语言。有点像网页是用HTML和CSS编写的。shell语言和make语言有时看起来很相似,但它们是不同的。一些重要的考虑是,制造将通过食谱到壳牌…在首先展开它们以替换make变量或进行函数调用之后。因此,经常需要保护shell语法的某些部分不受make扩展的影响(参见下面的示例)

    不管怎样,试试这样,也许:

    使用make变量
    ROOT
    AGENT
    是make变量,使用
    :=
    分配到任何配方之外,并且可以在任何地方使用,包括配方中。它们用
    $(var)
    展开。在将配方传递给shell之前,make会将其展开为:

    echo /some/where
    echo /some/where/agent
    mkdir -p /some/where/agent
    
    每一行都将在一个单独的shell中执行,但这并不重要,因为它们之间没有shell变量传递

    注意:如果您使用的是GNU make,则将定义
    CURDIR
    make变量,并将其扩展为当前工作目录。无需使用
    pwd
    ,只需使用
    $(CURDIR)
    而不是
    $(ROOT)

    注意:如果
    ROOT
    指向make文件的位置,并且如果使用
    -f
    make选项从其他地方调用make,
    $(CURDIR)
    不再工作,因为它指向调用make文件的位置,而不是make文件的位置。但您也可以通过以下方法获得正确的
    根目录

    ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
    
    在Makefile的最开始(在任何
    include
    语句之前)

    使用shell变量 仅使用shell语法和单行配方:

    all:
        @ROOT="`pwd`"; AGENT="$$ROOT"/agent; echo "$$ROOT"; echo "$$AGENT"; mkdir -p "$$AGENT"
    
    ROOT
    AGENT
    是shell变量,在配方内部分配有
    =
    ,仅在配方的同一行中可用。请注意,用于展开shell变量的双精度
    $
    。在将结果传递给shell之前,需要它们来逃避make执行的第一次扩展。通过make进行扩展后,配方被传递到外壳,如下所示:

    ROOT="`pwd`"; AGENT="$ROOT"/agent; echo "$ROOT"; echo "$AGENT"; mkdir -p "$AGENT"
    
    (make将
    $$
    扩展为
    $
    并在那里停止)这就是您想要的。它在一个shell中执行,这就是shell变量从列表的一个命令传递到下一个命令的原因

    如果您愿意,为了更好的可读性,您可以使用
    \
    行继续符将配方拆分为几行,但仍然只有一个配方在一个shell中执行:

    all:
        @ROOT="`pwd`"; \
        AGENT="$$ROOT/agent"; \
        echo "$$ROOT"; \
        echo "$$AGENT"; \
        mkdir -p "$$AGENT"
    
    这严格等同于另一种形式,只是更易于阅读。但它完全不同于:

    all:
        @ROOT="`pwd`"
        @AGENT="$$ROOT/agent"
        @echo "$$ROOT"
        @echo "$$AGENT"
        @mkdir -p "$$AGENT"
    
    因为对于最后一个表单,5行由5个不同的shell执行。例如,当第二个shell运行时,由第一个shell分配的
    ROOT
    shell变量不再定义,结果如下:

    AGENT="/agent"
    
    然后,这两条
    echo
    行什么也不回显,只回显一条新行。最后您会得到一个错误,因为:

    mkdir -p
    

    无效。

    这里有几个常见错误:

  • 配方行在单独的shell中运行,您不能期望在一个shell中分配的shell变量仍然在另一个shell中定义
  • 无需在recipes中使用
    $(shell…
    make函数:recipes已经是shell脚本了
  • 显然,你把shell变量弄混了,然后生成了变量。
    • Shell变量被分配为
      var=xxx
      (在
      =
      周围没有空格),仅在配方中(好的,几乎只有)。它们是用
      $var
      ${var}
      扩展的,但从来没有用
      $(var)
      扩展,仍然几乎只在配方中
    • Make变量被赋值为
      var:=xxx
      var=xxx
      (在
      :=
      =
      周围有空格或没有空格),仅在配方之外(好吧,几乎仅限于此)。它们用
      $(var)
      ${var}
      展开,而不是在任何地方用
      $var
      展开。请注意,
      =
      :=
      是不同的,但这超出了范围
  • 如果你是初学者,请忽略上面解释中的“几乎”,你现在不需要这个

    Makefile使用两种不同的语言编写:recipes中的shell语言和其他地方的make语言。有点像网页是用HTML和CSS编写的。shell语言和make语言有时看起来很相似,但它们是不同的。一些重要的考虑是,制造将通过配方到SH。
    AGENT="/agent"
    
    mkdir -p