从make文件中的命令获取值

时间:2018-06-27 08:32:37

标签: shell makefile sh gnu-make gnu

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

tmpDir=$(xtr execute run)

在命令代码本身中,我将值打印为

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

然后在脚本中添加echo时,我得到tmpDir

的值

现在,我需要切换为使用制作文件,而我的操作与此完全相同 而我在tmpDir中没有任何价值。我在这里想念什么?

这是makefile

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

       ....

1 个答案:

答案 0 :(得分:0)

首先通过make扩展制作配方,然后将其传递给shell。因此,您的DIR=$(xtr execute run)首先是用make扩展的,但是由于没有名为xtr execute run的make变量,它会扩展为DIR=

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

DIR=$(xtr execute run)

由于此shell调用中没有其他内容,因此没有用。就像您正在生成一个新的shell,在其中执行DIR=,然后退出。

DIR配方中的app变量是另一个具有相同名称的变量。再次,make将配方部分传递到外壳之前将其扩展,但是由于没有这样的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时分配一次的make变量(请注意:=,这一点很重要)。从现在开始,它们可以在配方中使用,在将配方的一部分实际传递给外壳执行之前,它们将通过make进行扩展。