有条件的makefile重新定义变量?

时间:2012-06-13 23:05:51

标签: bash unix build makefile sh

我的makefile中有一个变量我希望unset或重新定义,以便目标abc使用正确的值{{ 1}}(或根本没有)在他们各自的文件中。

如果我使用以下内容运行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

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

make foo

我得到以下输出:

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 目标为我的特定变量使用不同的值,以便在该目标的makefile中以不同方式处理编译。

此外,它看起来不像目标中的aexport变量。例如:

unset

如果我尝试这样做,我会在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

这有助于澄清我正在尝试做什么吗?

编辑2

我尝试了一个目标Makefile:16: *** unterminated variable reference. Stop. - es一个文件,并尝试运行子目标的touch(检查文件是否存在):

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 将状态与子目标进行通信的示例?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

不要忘记make中的每个shell执行都是在一个新进程中完成的。试图摆弄这样的食谱的环境变量并没有多大意义 - 在执行下一行之前,在shell死亡之后,你在任何给定行中修改的环境消失了。 / p>

你可以这样做:

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

a:
    $MAKE MY_VARIABLE=foo -C a/src