我有一个目录结构,我想在我的主文件夹中有一个主makefile,然后在我的test和src文件夹中有另一个makefile。
在我的主makefile中,我有针对test / all调用单个文件夹makefile的指令。我正在尝试在我的主makefile中声明变量,并让它们可以访问其他文件夹。
例如在我的主Makefile
中PACKAGES = jansson mysql ....
all:
do something here
test:
cd test
make test
然后在我的test / Makefile中,我希望能够访问先前的PACKAGES变量并将此makefile的各个依赖项添加到其中。
在test / Makefile中
PACKAGES += googletest googlemock
test
do something here
有人可以帮我解决这个问题吗?
由于
答案 0 :(得分:11)
您可以创建另一个文件,例如Makefile.variable
,其中定义了这些共享变量并使用
include $(PATHTOSHAREDMAKEFILE)/Makefile.variable
查看include manual了解更多信息
答案 1 :(得分:8)
您可以在命令行上传递变量:
test:
make -C test PACKAGES="$(PACKAGES)"
请注意,虽然不可能反过来。如果test/Makefile
更改了变量,则这些更改无法返回到调用makefile。
如果要添加到主makefile中的PACKAGES
变量,则必须重构构建系统以包含子makefile。所以主makefile设置了所有内容,然后包括(使用大多数make实现中可用的include
指令)子makefile文件,它们添加了本地特定的目标,以及更改/添加变量。
例如,假设您有两个测试目录test_foo
和test_bar
,您可以拥有一个包含测试目标的变量,我们可以将其称为TEST_TARGETS
。 test_*
文件夹中的每个makefile都将其本地和唯一目标添加到全局变量中,然后主makefile可以运行它们。
这样的事情:
主要makefile:
# Start empty
TEST_TARGETS =
include test_foo/Makefile
include test_bar/Makefile
test:
for target in "$(TEST_TARGETS)"; do \
$(MAKE) $(target); \
done
test_foo /生成文件:
TEST_TARGETS += test_foo
test_foo:
# Do some foo testing
test_bar /生成文件:
TEST_TARGETS += test_bar
test_bar:
# Do some bar testing
答案 2 :(得分:0)
export PACKAGES = jansson mysql ....