GNU make: создавать цели на основе определенного содержимого каталога (отображение целевого каталога 1: 1) - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть ряд каталогов, организованных следующим образом:

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 $< $@

1 Ответ

2 голосов
/ 20 сентября 2019

Похоже, шаблонные правила - это именно то, что вам нужно:

# 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 $@
...