【问题标题】:GNU Makefile Multiple rules in multiple targetsGNU Makefile 多个目标中的多个规则
【发布时间】:2020-10-18 14:43:50
【问题描述】:

我正在做一个 nasm 项目,我需要执行 ej 并将 ex.asm 用作参数。我尝试通过GNU 搜索如何一一选择参数。我的解决方案一直在写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

【问题讨论】:

  • 那么ex1.asmex2.asm是生成的文件吗?使用生成它们的不同程序ej1_genej2_gen?这些代码生成器程序是否有任何需要考虑的输入?
  • *_gen 接收前任 nasm 代码所在的文件名。所以不一定是 ex1.asm 和 ex2.asm,但它们必须遵循相同的结构

标签: makefile gnu


【解决方案1】:

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


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

ex1.asm: ej1_gen
    ./ej1_gen $@

ex2.asm: ej2_gen
    ./ej2_gen $@

听起来您可能在寻求一种方法来表达这一点,只通过一个涵盖两者的规则,但在这种情况下我不会这样做。我认为您没有比上面更清楚的了,即使要生成两个以上的汇编文件。如果使用相同的代码生成器程序,使用不同的选项来生成所有汇编文件,或者生成器名称可以更直接地从目标名称派生,则可能会有所不同。

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

%.o: %.asm
    nasm -g -o $@ -f elf32 $<

您可以采取类似的方法来表达链接规则:

%: %.o alfalib.o
    $(CC) $(FLAGS) -m32 -o $@ $^

这样,您应该能够摆脱 ej 变量和 exs 目标,离开

all: $(ex)

作为唯一的其他规则(它仍然应该出现在文件的最前面,就像现在一样)。

【讨论】:

  • 我希望 ex1_ 和 ex2_ 使用类似于 $* 或 % 的东西生成,因为我只放了 2 个,但我有将近 40 个,所以我认为会有更简单的方法和不一一写出来。但是如果你推荐我这个,我会做的。非常感谢!!
  • @SugarG.García,如果每个 .asm 文件都有自己的专用生成器程序,并且命名模式是并且必须保持如问题所示,那么是的,这就是我的建议,即使对于40 个 .asm 文件。但请注意,只有那一步才有这么多规则。这给你一个规则,用于组装所有文件,一个用于链接它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多