makefile - 处理从单个输入生成的多个文件
问题描述
我有一个由脚本处理以生成多个输出文件的数据文件。然后进一步处理这些输出文件中的每一个。创建哪些文件取决于输入文件的内容,因此我无法明确列出它们。我不太清楚如何引用生成文件中生成的各种文件。
目前,我有这样的事情:
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 文件还不存在,因此通配符表达式没有按照我希望的方式替换。我曾尝试使用通配符函数,但由于先决条件列表最终为空而失败。
任何指针将不胜感激。
解决方案
编辑:修复了第二遍中的先决条件列表。
您显然无法在运行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
推荐阅读
- javascript - connection.query() 外部的变量不会更新
- vue.js - Vue.js 项目中 Firefox(不是 Chrome)中的 Websocket 问题
- c# - 自动添加/删除联合表中的行
- reactjs - 用于内部加载 CSS 的 Webpack 配置
- android - Ionic 3 Android 设备后退按钮正在退出应用程序
- c# - Azure Devops 个人访问令牌 (PAT) 停止工作
- scala - Spark内置类型的Spark DataType Equality问题
- javascript - 过滤嵌套的对象数组
- sql - 第二个插入语句不插入数据
- java - 为什么我不能正确交换?