首页 > 解决方案 > 处理从单个输入生成的多个文件

问题描述

我有一个由脚本处理以生成多个输出文件的数据文件。然后进一步处理这些输出文件中的每一个。创建哪些文件取决于输入文件的内容,因此我无法明确列出它们。我不太清楚如何引用生成文件中生成的各种文件。

目前,我有这样的事情:

final.out: *.out2
  merge_files final.out $(sort $^)

%.out2: %.out1
  convert_files $?

%.out1: data.in
  extract_data data.in

这失败了No rule to make target '*.out2', needed by 'final.out'。我认为这是因为 .out2 文件还不存在,因此通配符表达式没有按照我希望的方式替换。我曾尝试使用通配符函数,但由于先决条件列表最终为空而失败。

任何指针将不胜感激。

标签: makefilegnu-make

解决方案


编辑:修复了第二遍中的先决条件列表。

您显然无法在运行extract_data命令之前计算中间文件列表。在这种情况下,解决方案在于运行两次 make。第一次生成*.out1文件,第二次完成工作。您可以使用一个空的虚拟文件来标记该 extract_data命令是否应再次运行:

ifeq ($(FIRST_PASS_DONE),)
final.out: .dummy
    $(MAKE) FIRST_PASS_DONE=yes

.dummy: data.in
    extract_data $<
else
OUT1 := $(wildcard *.out1)
OUT2 := $(patsubst %.out1,%.out2,$(OUT1))

final.out: $(OUT2)
    merge_files $@ $(sort $^)

%.out2: %.out1
    convert_files $?
endif

推荐阅读