GNU make:避免在文件已存在时执行规则

问题描述 投票:0回答:1

我有以下 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}中定义的所有文件。 所以他们只需要完成一次,有人可以向我解释我在这里做错了什么吗?

makefile gnu-make
1个回答
0
投票

首先,我们进行一些格式化以便于查看:

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
文件。

© www.soinside.com 2019 - 2024. All rights reserved.