如何将变量放入 makefile 中的 $(shell) 命令中?

问题描述 投票:0回答:2
❯ make --version
GNU Make 3.81
❯ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)

如何将变量从 for 循环内部传递到 $(shell)?我可以访问 $(shell) 之外的 var,但我不知道如何将其传入:

A_LIST:= one two

.PHONY: loop
loop:
    @for iii in $(A_LIST) ; do \
        echo inside recipe loop with sh command: $$iii ; \
        export SAVED_OUTPUT=$(shell echo $$iii) ; \
        echo $$SAVED_OUTPUT ; \
    done

这是我得到的输出:

inside recipe loop with sh command: one
<blank line here>
inside recipe loop with sh command: two
<blank line here>

循环中的最后一行

echo $$SAVED_OUTPUT
应该输出
one
two
,因为它正在回显var并将其存储在另一个var中。但它是一个空行。我怀疑这是因为它正在寻找一个环境变量
$iii
但它不存在 - 那么如何将
iii
的值传递到 shell 中?

这是一种我不喜欢的糟糕方法。我不想仅仅为了访问这样的变量而编写本地文件:

.PHONY: loop
loop:
    @for iii in $(A_LIST) ; do \
        echo inside recipe loop with sh command: $$iii ; \
        echo $$iii > scratch ; \
        export SAVED_OUTPUT=$(shell echo $$(cat scratch)) ; \
        echo $$SAVED_OUTPUT ; \
    done
bash makefile gnu-make
2个回答
3
投票

for
循环已经由shell执行 - 在这种情况下,没有理由将
$(shell ...)
也带入其中。只需使用普通的
$()
shell 命令替换语法(将
$
加倍以使 make 满意,就像变量名称一样):

A_LIST:= one two

.PHONY: loop
loop:
    @for iii in $(A_LIST) ; do \
        echo "inside recipe loop with sh command: $$iii" ; \
        SAVED_OUTPUT="$$(somecommand "$$iii")" ; \
        echo "$$SAVED_OUTPUT" ; \
    done

0
投票

一个简单而干净的方法是使用“传递参数”shell 功能:

VAR=value ./myscript.sh

    SRC := ./src
    OBJ := ./obj
    
    .PHONY  mytest
mytest:
       $(shell SOURCE_DIR=$(SRC) OBJECT_DIR=$(OBJ) ./mytestscript.sh)

在 ./mytestscript.sh 里面:

#!/bin/bash
echo Source directory is "$(SOURCE_DIR)", and Object directory is "(OBJECT_DIR)"

输出:

源目录为./src,对象目录为./obj

© www.soinside.com 2019 - 2024. All rights reserved.