在makefile之间共享变量

在makefile之间共享变量,makefile,Makefile,我有一个目录结构,我希望在主文件夹中有一个主makefile,然后在test和src文件夹中有另一个makefile 在我的主makefile中,我对调用单个文件夹makefile的test/all都有指令。我试图在我的主makefile中声明变量,并让其他文件夹可以访问它们 例如,在我的主Makefile中 PACKAGES = jansson mysql .... all: do something here test: cd test make test 然

我有一个目录结构,我希望在主文件夹中有一个主makefile,然后在test和src文件夹中有另一个makefile

在我的主makefile中,我对调用单个文件夹makefile的test/all都有指令。我试图在我的主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

有人能帮我解决这个问题吗?

您可以在命令行上传递变量:

test:
    make -C test PACKAGES="$(PACKAGES)"
请注意,这是不可能的,但反过来。如果
test/Makefile
更改了一个变量,那么这些更改就不能返回到调用Makefile


如果要添加到主makefile中的
PACKAGES
变量,则必须重构构建系统以包含子makefile。因此,主makefile设置所有内容,然后包括(使用大多数make实现中可用的
include
指令)子makefile,该子makefile将特定的目标添加到它们的本地,以及alter/add变量

例如,假设您有两个测试目录,
test\u foo
test\u bar
,您可以有一个包含测试目标的变量,我们称之为
test\u targets
test.*
文件夹中的每个makefile将其本地和唯一目标添加到全局变量,然后主makefile可以运行它们

大概是这样的:

主生成文件:

# Start empty
TEST_TARGETS =

include test_foo/Makefile
include test_bar/Makefile

test:
    for target in "$(TEST_TARGETS)"; do \
        $(MAKE) $(target); \
    done
测试\u foo/Makefile:

TEST_TARGETS += test_foo

test_foo:
    # Do some foo testing
TEST_TARGETS += test_bar

test_bar:
    # Do some bar testing
测试条/生成文件:

TEST_TARGETS += test_foo

test_foo:
    # Do some foo testing
TEST_TARGETS += test_bar

test_bar:
    # Do some bar testing

您可以创建另一个文件,例如
Makefile.variable
,其中定义了这些共享变量,并使用

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable

查看以获取更多信息

export PACKAGES=jansson mysql…

我看到的最后一种方法的问题是,使用顶级Makefile目录中的路径调用$(MAKE)$(target)。我认为路径需要位于包含感兴趣目标的Makefile的文件夹中,这样才能正常工作。