如何创建 Makeflow 以从子目录中的其他 Makefile 编译多个驱动程序
How to Create a Makeflow for Compiling Multiple Drivers from other Makefiles in Subdirectories
我对 GNU makefile 比较陌生,目前我的工作要求我在 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 到它的目录并调用 make,我相信有一种更简洁的方法,但我只是想立即使用函数蝙蝠
任何帮助都会很棒,如果需要更多信息,请告诉我,如果我遗漏了什么,我深表歉意,我对在堆栈溢出上发帖还很陌生。
编辑:我在第 4 个代码块中输入错误,将 "DRIVER_A" 替换为 $@
先来个粗略简单的方法吧。您已经有了 Driver 的食谱 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
一旦一切正常,您可以考虑让整个设计更优雅,但如果不了解项目的细节,就很难知道如何做到这一点。我不知道什么source <some compiler>
有,所以我不知道如何解除它。我不知道各种 <some folders>
包含什么,所以我不知道使这些源文件成为其 driver 的先决条件有多容易。但我肯定会查看不同 driver 目录中的 makefile,看看它们是否可以承担部分负担——毕竟,它们是负责构建各自 driver 的人。
我对 GNU makefile 比较陌生,目前我的工作要求我在 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 到它的目录并调用 make,我相信有一种更简洁的方法,但我只是想立即使用函数蝙蝠
任何帮助都会很棒,如果需要更多信息,请告诉我,如果我遗漏了什么,我深表歉意,我对在堆栈溢出上发帖还很陌生。
编辑:我在第 4 个代码块中输入错误,将 "DRIVER_A" 替换为 $@
先来个粗略简单的方法吧。您已经有了 Driver 的食谱 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
一旦一切正常,您可以考虑让整个设计更优雅,但如果不了解项目的细节,就很难知道如何做到这一点。我不知道什么source <some compiler>
有,所以我不知道如何解除它。我不知道各种 <some folders>
包含什么,所以我不知道使这些源文件成为其 driver 的先决条件有多容易。但我肯定会查看不同 driver 目录中的 makefile,看看它们是否可以承担部分负担——毕竟,它们是负责构建各自 driver 的人。