我有以下 make 文件片段:
DATA_DIR ?= cpp/gen_data_cpp/build
TXT_FILES := $(wildcard ${DATA_DIR}/*.txt)
BIFI_FILES := $(TXT_FILES:.txt=.txtbifikreversed)
${BIFI_FILES}: ${TXT_FILES} cpp/build/exe_convert_multicov2rivet
bash $(S_process_pt_cloud) $< 3
bifi: $(BIFI_FILES)
line: cpp/build/exe_project_bifi_along_path $(BIFI_FILES)
bash script.sh file1 file2
每次调用
make line
时,规则bifi
都会被触发,这非常耗时,事实上,规则bifi会生成${BIFI_FILES}中定义的所有文件。 所以他们只需要完成一次,有人可以向我解释我在这里做错了什么吗?
首先,我们进行一些格式化以便于查看:
DATA_DIR ?= cpp/gen_data_cpp/build
TXT_FILES := $(wildcard ${DATA_DIR}/*.txt)
BIFI_FILES := $(TXT_FILES:.txt=.txtbifikreversed)
${BIFI_FILES}: ${TXT_FILES} cpp/build/exe_convert_multicov2rivet
bash $(S_process_pt_cloud) $< 3
bifi: $(BIFI_FILES)
line: cpp/build/exe_project_bifi_along_path $(BIFI_FILES)
bash script.sh file1 file2
目标
bifi
没有配方,因此它本身不会做任何事情。但它有先决条件 $(BIFI_FILES)
并且执行 $(BIFI_FILES)
目标。
目标
$(BIFI_FILES)
是一个有很多文件的目标。假设您的 a.txt
中有 b.txt
和 ${DATA_DIR}
,那么 $(BIFI_FILES)
目标将变为:
datadir/a.txtbifikreversed datadir/b.txtbifikreversed: datadir/a.txt datadir/b.txt cpp/build/exe_convert_multicov2rivet
bash $(S_process_pt_cloud) $< 3
因此,它将检查所有三个源文件(
a.txt
、b.txt
和exe_convert_multicov2rivet
)的时间戳,如果其中任何一个比最近的目标(a.txtbifikreversed
或b.txtbifikreversed
)更新,则bash $(S_process_pt_cloud) $< 3
将被处决。
假设
cpp/build/exe_convert_multicov2rivet
是所有 *.txt
到 *.txtbifikreversed
的转换器 - 将为所有文件运行,无论它们是否需要更新。
您应该拥有一个将 1
.txt
转换为 1 .txtbifikreversed
的转换器:
${DATA_DIR}/%.txtbifikreversed : ${DATA_DIR}/%.txt $(process_one_file)
bash $(process_one_file) $<
现在,如果需要为
*.txtbifikreversed
(或 line
)目标更新 bifi
中的任何一个,并且这已经通过将 $(BIFI_FILES)
作为 line
的先决条件包含在内来完成 - 仅适用于一个 的规则.txt
将开始。
更新转换 ($(process_one_file)
) 当然会强制处理所有 .txt
文件。