我的makefile中有一个变量我希望unset
或重新定义,以便目标a
,b
和c
使用正确的值{{ 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中以不同方式处理编译。
此外,它看起来不像目标中的a
或export
变量。例如:
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
将状态与子目标进行通信的示例?
答案 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