14

我有一个目录结构,我希望我的主文件夹中有一个主 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 的各个依赖项添加到它上面。

在测试/Makefile

PACKAGES += googletest googlemock

test
     do something here

谁能帮我解决这个问题?

4

3 回答 3

16

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

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable

查看包含手册以获取更多信息

于 2013-02-14T17:21:17.533 回答
8

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

test:
    make -C test PACKAGES="$(PACKAGES)"

请注意,尽管反过来是不可能的。如果test/Makefile更改了变量,则这些更改无法返回到调用 makefile。


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

例如,假设您有两个测试目录,test_foo并且test_bar您可以有一个包含测试目标的变量,让我们调用它TEST_TARGETS。文件夹中的每个 makefiletest_*将其本地和唯一目标添加到全局变量,然后主 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/Makefile:

TEST_TARGETS += test_foo

test_foo:
    # Do some foo testing

测试栏/生成文件:

TEST_TARGETS += test_bar

test_bar:
    # Do some bar testing
于 2013-02-14T17:20:11.333 回答
-1

导出 PACKAGES = jansson mysql ....

于 2019-05-10T06:00:33.690 回答