【问题标题】:Get the value from a command in make file从 make 文件中的命令获取值
【发布时间】:2018-06-27 08:32:37
【问题描述】:

我有一个脚本,它可以正常工作,我使用它来获得一些价值:

tmpDir=$(xtr execute run)

在命令代码本身中,我打印出类似的值

fmt.Print("the dir is: ",dir)

然后当我将 echo 放入脚本中时,我得到了 tmpDir 的值

现在我需要切换到使用 ma​​ke file,我就是这样做的 我在tmpDir 中没有得到任何价值。我在这里想念什么?

这是生成文件

all: app app_2
    PROJ_DIR=$(PWD)
# Create folder for build artifacts
    DIR=$(xtr execute run)
.PHONY: app
app:
    @echo $(DIR)

       ....

【问题讨论】:

  • 你试过什么?您发现了什么具体问题?
  • @Flimzy- 这是我尝试的,但我在 makefile 中得到了空值
  • @Flimzy - 在脚本中工作但在 makefile 中没有完全相同的代码...
  • @Flimzy - 我使用制表符并且能够执行它,这不是问题 :)
  • 什么是xtr?那是您要运行的命令吗?如果是这样,您应该使用$(shell xtr execute run)

标签: shell makefile sh gnu-make gnu


【解决方案1】:

Make 配方首先由 make 扩展,然后传递给 shell。因此,您的 DIR=$(xtr execute run) 首先由 make 扩展,但由于没有名为 xtr execute run 的 make 变量,它扩展为 DIR=

但这不是您唯一的问题:配方中名为 DIR 的变量是 shell 变量,而不是 make 变量。它只存在于 shell 的上下文中,make 将生成执行你的配方的这一部分(并且只有这一部分):

DIR=$(xtr execute run)

由于这个 shell 调用中没有其他内容,所以它是无用的。就像你在生成一个新的 shell,在其中执行 DIR=,然后退出。

app 配方中的DIR 变量是另一个变量,同名。同样,make 在将配方部分传递给 shell 之前对其进行扩展,但由于没有这样的 make 变量,它会扩展为:

echo

$(PWD) 也有类似的问题:它由 make 扩展,由于没有这样的 make 变量,它扩展为空字符串。您可能可以改用CURDIR,它是一个内置的make 变量。但请记住,PROJ_DIR 是一个 shell 变量,它只存在于配方的这一行部分......

您可以尝试以下方法:

DIR := $(shell xtr execute run)
PROJ_DIR := $(CURDIR)

all: app app_2

.PHONY: app
app:
    @echo $(DIR)

这里,DIRPROJ_DIR 是make 解析makefile 时分配一次的变量(注意:=,这很重要)。从现在开始,它们可以在配方中使用,在配方的一部分实际传递给 shell 执行之前,它们将被 make 扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多