在makefile之间共享变量

Jon*_*use 12 c++ makefile compilation

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

在我的主makefile中,我有针对test/all调用单个文件夹makefile的指令.我正在尝试在我的主makefile中声明变量,并让它们可以访问其他文件夹.

例如在我的主Makefile中

PACKAGES = jansson mysql ....

all:
    do something here

test:

    cd test
    make test
Run Code Online (Sandbox Code Playgroud)

然后在我的test/Makefile中,我希望能够访问先前的PACKAGES变量并将此makefile的各个依赖项添加到其中.

在test/Makefile中

PACKAGES += googletest googlemock

test
     do something here
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决这个问题?

谢谢

UmN*_*obe 11

您可以创建另一个文件,例如Makefile.variable,定义这些共享变量并使用包含该文件的位置

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅包含手册


Som*_*ude 8

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

test:
    make -C test PACKAGES="$(PACKAGES)"
Run Code Online (Sandbox Code Playgroud)

请注意,尽管如此,它是不可能的.如果test/Makefile更改了变量,那么这些更改就无法返回到调用makefile.


如果要添加到PACKAGES主makefile中的变量,则必须重构构建系统以包含子makefile.因此主makefile设置了所有内容,然后包括(使用include大多数make实现中可用的指令)子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
Run Code Online (Sandbox Code Playgroud)

test_foo/Makefile文件:

TEST_TARGETS += test_foo

test_foo:
    # Do some foo testing
Run Code Online (Sandbox Code Playgroud)

test_bar/Makefile文件:

TEST_TARGETS += test_bar

test_bar:
    # Do some bar testing
Run Code Online (Sandbox Code Playgroud)