4

我的 makefile 中有一个变量,我想unset重新定义或重新定义,以便 target ab并在各自的 makefilec中使用正确的值MY_VARIABLE(或根本没有)。

如果我运行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
...

相反,如果我make foo使用以下 makefile 运行:

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
...

MY_VARIABLE指定目标时如何取消设置或重新定义(例如foo,在这种情况下)?

编辑

这是我想避免的情况:

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 中以不同方式处理编译。

此外,它看起来不像我可以exportunset目标内的变量。例如:

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

如果我尝试这样做,我会得到类似于以下错误的内容export MY_VARIABLE='true'(如果我尝试使用类似unset):

Makefile:16: *** unterminated variable reference.  Stop.

这是否有助于澄清我正在尝试做的事情?

编辑 2

我尝试了一个touch-es 文件并尝试运行子目标的目标makefile(检查文件是否存在):

foo: prep_foo
prep_foo:
    touch a/src/.foo
    make -C a/src

当我尝试通过 运行它时make foo,我收到以下错误:

Makefile:14: *** commands commence before first target.  Stop.

如果我从中删除make语句prep_foo,那么我可以touch在没有收到错误消息的情况下创建文件,但我无法触发创建a目标,所以这似乎没有帮助。

以下产生相同的commands commence before first target错误消息:

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

是否有使用touch将状态传达给子目标的示例?

4

2 回答 2

1

Makefile 中目标之间通信的常用方法是通过文件。只是touch一个目标中的一个文件并在另一个目标中检查它。这可以帮助您解决问题吗?

于 2012-06-13T23:54:43.427 回答
0

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

您也许可以像这样完成这项工作:

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

或者

a:
    $MAKE MY_VARIABLE=foo -C a/src
于 2012-06-13T23:14:54.323 回答