由于我对linux上的构建过程/ makefile没有那么有经验,我遇到了以下问题:
设置:
我有一个makefile A,它需要在运行之前设置一些环境变量,这是通过运行. ./set_A_vars.sh
(set_A_vars.sh包含许多export
行)来完成的,然后再运行make -f A
现在我需要在makefile B中创建项目A. 我为makefile B尝试了以下设置:
all: debug release
A_debug:
. ./set_A_vars.sh && make -f A DEBUG=1
A_release:
. ./set_A_vars.sh && make -f A DEBUG=0
debug: A_debug some_B_stuff_debug
release: A_release some_B_stuff_debug
然而我收到很多错误,听起来好像没有为B中的make -f A ...
设置set_A_vars.sh中的环境变量。
如何从makefile B调用makefile A,并在makefile B中设置set_A_vars.sh中的环境变量?
任何帮助表示感谢。
答案 0 :(得分:2)
你的makefile看起来很好用这些条件:
当您从makefile调用make时,请使用宏调用${MAKE}
而不是普通make
。 (这可以确保并行制作工作,也意味着即使您的制作有另一个名称(GNUmake
说),它仍然有效。)
如果您的目标与实际文件不符,请使用.PHONY
标记(见下文)。
some_B_stuff_debug
是否要求首先构建A?然后你必须说出来。
some_B_stuff_debug: A_debug some_B_stuff_debug: A_release
这显然是错误的。一种方法是通过shell强制执行排序。
尝试这样的事情:
.PHONY: debug
debug:
. ./set_A_vars.sh && ${MAKE} -f A DEBUG=1
${MAKE} some_B_stuff_debug
.PHONY: release
release:
. ./set_A_vars.sh && ${MAKE} -f A DEBUG=0
${MAKE} some_B_stuff_debug
.PHONY: some_B_stuff_debug
∶
答案 1 :(得分:0)
你的文件应该有效。我建议你尝试以下方法:
set_A_vars.sh
。
make -f MakefileA
,验证MakefileA
确实可以很好地处理这些变量集。
MakefileB
中的一项规则来测试其中一个变量,例如FOO
:
test_var:
@echo FOO is $(FOO)
如果你刚刚运行set_vars.sh
,这应该可行。如果没有,那么有几件事可能是错的......
FOO
)并在MakefileB
中尝试此规则:
set_vars_and_test_them:
./set_A_vars.sh && echo FOO is $(FOO)
A_debug:
./set_A_vars.sh && make -f MakefileA DEBUG=1
(我建议不要调用makefile“A”。)