如何在 GNU Make 中将单词列表分成更小的块

How to break a list of words into smaller chunks in GNU Make

我的目标是在 GNU Make 中找到一种方法来动态创建规则,以相等的块构建文件集。让我试着解释一下...

假设我有一个包含我们需要构建的所有源文件的 make 变量:

SOURCE_FILES := one.c two.c three.c four.c five.c six.c

现在我希望能够将文件列表动态分解为 N 个子列表,并为每个子列表动态生成规则。例如,如果 N = 3 我会得到

one.o two.o: one.c two.c
    @command to build just the 2 files

three.o four.o: three.o four.c
    @command to build just the 2 files

five.o six.o: five.c six.c
    @command to build just the 2 files

如果 N = 2,我希望有以下规则:

one.o two.o three.o: one.c two.c three.c
    @command to build just the 3 files

four.o five.o six.o: four.c five.c six.c
    @command to build just the 2 files

我在想,一旦我将单词列表分解成子列表,我就可以使用 eval 来创建规则,我想我可以尝试使用 wordlist 来创建子列表-列表。我可以使用 words 获取源文件总数,但我不确定如何进行除法或迭代。我正在尝试在不使用 shell 的情况下在 Make 中完成所有操作,以尝试保持它 shell 不可知。

这样做的全部原因是我们专有的编译器对每个源文件的调用都非常昂贵。但是将所有文件作为输入调用一次需要太长时间。所以我希望找到一个可以创建多个规则的快乐媒介,这样我就可以利用 -j N 选项并行构建。

最后,我计划使用一个规则来进行链接:

executable.elf : one.o two.o three.o four.o five.o six.o
    @command to link the object files

根本的想法是不正确的,至少在你遇到分割文件的问题之前是不正确的。

这条规则:

one.o two.o: one.c two.c
        @command to build just the 2 files

并不像您希望的那样工作。具有多个目标的显式规则并不意味着,“运行 这个配方一次创建所有这些输出文件”。它被 make exactly 解释为好像你写了这个:

one.o: one.c two.c
        @command to build just the 2 files
two.o: one.c two.c
        @command to build just the 2 files

这意味着如果您启用并行构建,make 将 运行 配方两次,而不是一次。