Makefile GNU make:根据特定目录内容创建目标(1:1目标目录映射)

Makefile GNU make:根据特定目录内容创建目标(1:1目标目录映射),makefile,gnu-make,Makefile,Gnu Make,我有一系列这样组织的目录: foo/ foo.file1 foo.file2 bar/ bar.file1 bar.file2 baz/ baz.file1 baz.file2 现在,我正在使用一个脚本来处理这些文件,该脚本执行所有文件存在性检查等操作,但我认为也许我可以使用一个Makefile来处理这些文件(因为所述脚本非常脆弱),以避免重新处理未更改的文件 问题是每个目录都是独立的,我需要这样做,例如: foo.file1.processed: foo.file1

我有一系列这样组织的目录:

foo/
    foo.file1 foo.file2
bar/
    bar.file1 bar.file2
baz/
    baz.file1 baz.file2
现在,我正在使用一个脚本来处理这些文件,该脚本执行所有文件存在性检查等操作,但我认为也许我可以使用一个Makefile来处理这些文件(因为所述脚本非常脆弱),以避免重新处理未更改的文件

问题是每个目录都是独立的,我需要这样做,例如:

foo.file1.processed: foo.file1
      run_random_program foo.file1 -o foo.file1.processed
对于该路径中总共71个目录中的每一个。这看起来非常乏味,我想知道是否有什么东西会阻止我用手写这些东西

这可能吗

编辑:一些示例显示了我的想法,我为每个目录创建了一个Makefile:

file1.cds.callable: file1.callable
    long_script_name -i $< -o $@

file1.rds: file1.cds.callable
    another_long_script_name $< additional_file_in_folder $@

file1.csv: file1.rds
    yet_another_script $< $@
file1.cds.callable:file1.callable
长脚本名称-i$<-o$@
file1.rds:file1.cds.callable
另一个\u long\u脚本\u name$<文件夹中的附加\u文件\u$@
file1.csv:file1.rds
还有另一个脚本$<$@
似乎正是您所需要的:

# These are the original source files (based on the example)
CALLABLE := $(wildcard */*.callable)

# These are the final targets
TARGETS := $(CALLABLE:%.callable=%.csv)

all: $(TARGETS)

%.csv : %.rds
        yet_another_script $< $@
%.rds: %.cds.callable
        another_long_script_name $< additional_file_in_folder $@
%.cds.callable: %.callable
        long_script_name -i $< -o $@
#这些是原始源文件(基于示例)
可调用:=$(通配符*/*.CALLABLE)
#这些是最终目标
目标:=$(可调用:%.CALLABLE=%.csv)
全部:$(目标)
%.csv:%.rds
还有另一个脚本$<$@
%.rds:%.cds.callable
另一个\u long\u脚本\u name$<文件夹中的附加\u文件\u$@
%.cds.callable:%.callable
长脚本名称-i$<-o$@
似乎正是您所需要的:

# These are the original source files (based on the example)
CALLABLE := $(wildcard */*.callable)

# These are the final targets
TARGETS := $(CALLABLE:%.callable=%.csv)

all: $(TARGETS)

%.csv : %.rds
        yet_another_script $< $@
%.rds: %.cds.callable
        another_long_script_name $< additional_file_in_folder $@
%.cds.callable: %.callable
        long_script_name -i $< -o $@
#这些是原始源文件(基于示例)
可调用:=$(通配符*/*.CALLABLE)
#这些是最终目标
目标:=$(可调用:%.CALLABLE=%.csv)
全部:$(目标)
%.csv:%.rds
还有另一个脚本$<$@
%.rds:%.cds.callable
另一个\u long\u脚本\u name$<文件夹中的附加\u文件\u$@
%.cds.callable:%.callable
长脚本名称-i$<-o$@

您将
foo.file1.processed
放在哪里
foo/foo.file1
是输出的输入
bar/bar.files
?是否有规则定义
运行\u random\u程序
?目录或文件名与它们所经历的处理步骤之间是否存在任何共性或联系?立即回答两个注释:-否,每个目录都是独立的。-每个目录的所有步骤都是相同的,目录名与(同一个stem)中的文件直接相关。您将
foo.file1.processed
放在哪里
foo/foo.file1
是输出的输入
bar/bar.files
?是否有规则定义
运行\u random\u程序
?目录或文件名与它们所经历的处理步骤之间是否存在任何共性或联系?立即回答两个注释:-否,每个目录都是独立的。-每个目录的所有步骤都是相同的,目录的名称与(同一stem)中的文件直接相关。