Bash 重新定义变量的makefile中的条件?

Bash 重新定义变量的makefile中的条件?,bash,unix,build,makefile,sh,Bash,Unix,Build,Makefile,Sh,我的makefile中有一个变量,我想取消设置或重新定义,以便目标a、b和c在各自的makefile中使用正确的my_变量值(或者根本没有) 如果我使用以下命令运行make foo: export MY_VARIABLE := 'false' foo: prep_foo dist prep_foo: $(shell export MY_VARIABLE='true') echo ${MY_VARIABLE} dist: a b c a: make -C a/src b:

我的makefile中有一个变量,我想取消设置或重新定义,以便目标
a
b
c
在各自的makefile中使用正确的
my_变量值(或者根本没有)

如果我使用以下命令运行
make foo

export MY_VARIABLE := 'false'
foo: prep_foo dist
prep_foo:
    $(shell export MY_VARIABLE='true')
    echo ${MY_VARIABLE}
dist: a b c
a: 
    make -C a/src
b: 
    make -C b/src
c: 
    make -C c/src
我得到这个输出:

export MY_VARIABLE='true'
echo 'false'
false
...
相反,如果我使用以下makefile运行
makefoo

export MY_VARIABLE := 'false'
foo: prep_foo dist
prep_foo:
    $(shell unset MY_VARIABLE)
    echo ${MY_VARIABLE}
dist: a b c
a: 
    make -C a/src
b: 
    make -C b/src
c: 
    make -C c/src
我得到以下输出:

make: unset: No such file or directory
echo 'false'
false
...
在指定目标时(如本例中的
foo
),如何取消设置或重新定义
MY_变量

编辑

以下是我希望避免的情况:

dist: a b c 
foo: a_foo b_foo c_foo
a:
    make -C a/src
...
a_foo
    make -C a_foo/src
我只希望
a
目标为我的特定变量使用不同的值,以便在该目标的makefile中以不同的方式处理编译

而且,看起来我不能在目标中导出变量。例如:

dist: a b c 
foo: a_foo b_foo c_foo
a:
    make -C a/src
...
a_foo:
    export MY_VARIABLE='true'; make -C a/src
如果我尝试这样做,我会在
导出我的_VARIABLE='true'
行(如果我尝试使用
取消设置
),得到类似于以下错误的结果:

这有助于澄清我想做什么吗

编辑2

我尝试了一个目标,它触摸一个文件,并尝试运行子目标的
makefile
(检查文件是否存在):

当我试图通过
makefoo
运行此操作时,我得到以下错误:

Makefile:14: *** commands commence before first target.  Stop.
如果我从
prep\u foo
中删除
make
语句,那么我可以
触摸该文件而不会收到错误消息,但我无法触发使
成为目标,因此这似乎没有帮助

以下命令在第一个目标开始之前产生相同的
命令
错误消息:

foo: prep_foo a
prep_foo:
    touch a/src/.foo

有没有使用
touch
向子目标传递状态的示例?

不要忘记,
make
中的每个shell执行都是在一个新进程中完成的。试图像这样摆弄配方的环境变量实际上没有多大意义——在任何给定行中修改的环境在shell死后,在执行下一行之前就消失了

您可以这样做:

a:
    unset MY_VARIABLE; $MAKE -C a/src


Makefile中目标之间通信的常用方式是通过文件。只需触摸一个目标中的文件,然后在另一个目标中检查它。这能帮助您解决问题吗?

我正在寻找一种干净的方法,在一个目标中设置变量,然后将其传递给其他目标。如何在不设置自定义目标的情况下做到这一点(即,如何避免为
a
a_foo
b
b_foo
等编写目标来处理每种情况)?您的建议似乎不起作用。如果我放置
取消设置我的_变量;echo${MY_VARIABLE}
prep_foo
中,我在运行
make foo
时仍然得到
MY_VARIABLE
的旧值。噢,该死。我知道我应该先测试一下,但看起来很清楚。。。你能在问题描述中添加一两句关于
a
vs
a_foo
目标的话吗,然后我将删除这个答案?这似乎太有用了,不能丢——尽管我不太明白为什么你会有两种不同的方法来构建
a
:一种是通过
foo
,另一种是不通过
foo
。(你能解释一下吗?)不同目标中的命令不能相互影响。您甚至无法保证目标的顺序(例如,在您的情况下,
make-j
将尝试同时运行所有目标)。你不能让
a
b
c
根据你是想
make foo
还是仅仅
make dist
而做出不同的选择。我认为这与我的问题无关。我只希望在调用父目标时,所有子目标都有条件地为特定变量使用不同的值。我并不真正关心在父目标中评估子目标的顺序。这有助于澄清问题吗?不,我将用这种方法产生的错误信息编辑我的问题。@Alex Reynolds:我无法复制你的问题。第14行是哪一行?为了简单起见,我的makefile与我发布的不同。相当长。您是否有时间发布使用
touch
的工作示例?
foo: prep_foo a
prep_foo:
    touch a/src/.foo
a:
    unset MY_VARIABLE; $MAKE -C a/src
a:
    $MAKE MY_VARIABLE=foo -C a/src