0

我对 GNU makefiles 比较陌生,目前我的工作是,我需要在 makefile 中为项目创建一个目标来编译一堆驱动程序。每个驱动程序已经在自己的构建目录中创建了自己的makefile,并且每个驱动程序需要调用的目标是相同的。IE。对于驱动程序 A 和驱动程序 B,必须调用“make shared”。

我目前的想法是在主 makefile 中定义每个驱动程序的路径,如下所示:

DRIVER_A = $(CURR_DIR)/<path_to_a>/driver
DRIVER_B = $(CURR_DIR)/<path_to_b>/driver
DRIVER_C = $(CURR_DIR)/<path_to_c>/driver

从这里开始,我真正想做的是为每个 DRIVER_A、DRIVER_B 和 DRIVER_C 调用相同的过程,即:

        source <some_compiler>; \
        cp -r <some_folder> DRIVER_A/source/; \
        cd DRIVER_A/build; \
        make shared <some_flags>; \
        make so_test <some_flags>

因此,为了实现这一点,我尝试将 DRIVER_A、DRIVER_B 和 DRIVER_C 放入一个对象中,例如

DRIVER_SOURCES := \
        DRIVER_A\
        DRIVER_B \
        DRIVER_C

然后在 DRIVER_SOURCES 上调用目标

drivers_sw: ${DRIVER_SOURCES}
        source <some_compiler>; \
        cp -r <some_folder> $@/source/; \
        cd $@/build; \
        make shared <some_flags>; \
        make so_test <some_flags>

但这不起作用,因为没有规则为 DRIVER_A、DRIVER_B 和 DRIVER_C 制定目标,这在事后看来对我来说是有意义的,但是我不知道另一种方法来完成我想要完成的事情。

我也愿意为每个驱动程序调用 make 的更好方法,而不是 cd'ing 到它的目录并调用 make,我确信有一种更清洁的方法,但我只是马上开始使用功能。

任何帮助都会很棒,如果需要更多信息,请告诉我,如果我遗漏了什么,我深表歉意,我对在堆栈溢出上发帖还很陌生。

编辑:我在第 4 个代码块中打错字,将“DRIVER_A”替换为 $@

4

1 回答 1

1

让我们先做粗略和简单的方法。您已经有了驱动程序 A 的配方:

DRIVER_A = $(CURR_DIR)/<path_to_a>/driver
build_DRIVER_A:
    source <some_compiler>; \
    cp -r <some_folder> DRIVER_A/source/; \
    cd DRIVER_A/build; \
    make shared <some_flags>; \
    make so_test <some_flags>

如果您确认这可行,您可以轻松地为 B 和 C 编写规则。

一旦它们都正常工作,您可以使用一条规则来构建所有三个:

build_all_drivers: build_DRIVER_A build_DRIVER_B build_DRIVER_C

不要忘记:

.PHONY: build_all_drivers build_DRIVER_A build_DRIVER_B build_DRIVER_C

一旦一切正常,您就可以让整个设计更加优雅,但如果不了解项目的细节,就很难知道如何做到这一点。我不知道 egsource <some compiler>的作用,所以我不知道如何解除它。我不知道各种<some folders>包含什么,所以我不知道将这些源文件作为其驱动程序的先决条件是多么容易。但我肯定会查看不同驱动程序目录中的 makefile,看看它们是否可以承担一些这种负担——毕竟,它们是负责构建各自驱动程序的人。

于 2020-03-26T17:23:45.363 回答