GNU Makefile多个目标中的多个规则

GNU Makefile多个目标中的多个规则,makefile,gnu,Makefile,Gnu,我正在做一个nasm项目,我需要执行ej并使用ex.asm作为参数。我试着搜索如何逐个选择参数。我的解决方案一直在编写ex1和ex2,但我想将它们放在$(ex)依赖项中,因此我不必重复多次相同的代码。有办法吗 先谢谢你 守则: ej = ej1_gen ej2_gen ex = ex1 ex2 # ----------------------------------------------- all: $(ej) $(ex) exs: ex1_ ex2_ # ------------

我正在做一个nasm项目,我需要执行ej并使用ex.asm作为参数。我试着搜索如何逐个选择参数。我的解决方案一直在编写ex1和ex2,但我想将它们放在$(ex)依赖项中,因此我不必重复多次相同的代码。有办法吗

先谢谢你

守则:

ej = ej1_gen ej2_gen
ex = ex1     ex2

# -----------------------------------------------
all: $(ej) $(ex)
exs: ex1_ ex2_ 
# -----------------------------------------------

$(ex): exs
    nasm -g -o $@.o -f elf32 $@.asm
    $(CC) $(FLAGS) -m32 -o $@ $@.o alfalib.o

ex1_:
    ./ej1_gen ex1.asm
ex2_:
    ./ej2_gen ex2.asm

当我阅读问题时,您在项目中有程序或脚本
ej1_gen
ej2_jen
,用于生成所需的程序集源。它们都将输出文件的名称作为命令行参数。如果这是一种误解,则需要对答案的部分内容进行调整


描述如何生成程序集文件的规则应将生成的程序集文件指定为目标。此外,假设代码生成器程序是项目的一部分,它们应该被指定为先决条件,因为更改这些程序可能会导致它们产生不同的输出。为通知结果而读取的任何配置文件或类似文件也应命名为先决条件(未显示)。这就产生了类似这样的规则:

ex1.asm: ej1_gen
    ./ej1_gen $@

ex2.asm: ej2_gen
    ./ej2_gen $@
听起来你可能想通过一条规则来表达这一点,但在这种情况下我不会这么做。我认为,即使要生成两个以上的程序集文件,也没有比上述内容更清楚的了。如果使用具有不同选项的相同代码生成器程序生成所有程序集文件,或者生成器名称可以更直接地从目标名称派生,则可能会有所不同

有了这些规则,您可以编写通用后缀规则或模式规则来组装生成的文件。既然您标记了[gnu],我就假设模式规则是可以接受的:

%.o: %.asm
    nasm -g -o $@ -f elf32 $<
有了它,您应该能够去掉
ej
变量和
exs
目标,离开

all: $(ex)

作为唯一的另一条规则(它仍然应该像现在一样首先出现在文件中)。

那么
ex1.asm
ex2.asm
是生成的文件吗?使用不同的程序生成它们?这些代码生成器程序是否有任何需要说明的输入?*\u gen收到文件名,其中必须包含ex的nasm代码。所以它不一定是ex1.asm和ex2.asm,但它们必须遵循相同的结构。我希望ex1和ex2可以用类似于$*或%的东西生成,因为我只在这里放了2个,但我有将近40个,所以我认为有一种更简单的方法,不需要逐个编写它们。但是如果你向我推荐这个,我会做的。非常感谢你@SugarG.García,如果每个.asm文件都有自己的专用生成器程序,并且命名模式是并且必须保持如问题中所示,那么是的,这就是我建议的,即使对于40.asm文件也是如此。但请注意,只有这一步你才有这么多的规则。这只提供了一个用于组装所有文件的规则,以及一个用于链接这些文件的规则。
all: $(ex)