Суть проблемы заключается в том, что две переменные заранее неизвестны: имена каталогов и имена необработанных файлов. Make может легко обрабатывать одну переменную, но борется с двумя.
Предположим, у нас есть один каталог, messung-12-Apr-2020
, с тремя необработанными файлами alpha.raw
, beta.raw
и calibrationsequence.raw
.
Правило простое:
.PHONY: 12-Apr-2020
12-Apr-2020: messung-12-Apr-2020/apha.pha messung-12-Apr-2020/beta.pha messung-12-Apr-2020/calibrationsequence.pha
@echo $@ done
Если мы не знаем заранее имена необработанных файлов, мы можем вывести их:
RAW_FILES := $(wildcard messung-12-Apr-2020/*.raw)
PHA_FILES := $(patsubst %.raw,%.pha,$(RAW_FILES))
12-Apr-2020:$(PHA_FILES)
@echo $@ done
Если мы не знаем имя заранее, мы могли бы использовать subst
вместо patsubst
и поместить все в шаблонное правило:
TARGETS := 12-Apr-2020
.SECONDEXPANSION:
$(TARGETS): %: $$(subst .raw,.pha,$$(wildcard messung-%/*.raw))
@echo $@ done
(обратите внимание на использование $$
.) Это безопасно, пока нет шанс ".raw" встроен в имя файла. Существует более безопасный, более строгий подход, но он более сложный; если вам это нужно, дайте мне знать в комментарии, и я опубликую его.
Теперь, чтобы сгенерировать список целей:
TARGETS := $(patsubst messung-%,%,$(wildcard messung-*))
.PHONY: all $(TARGETS)
all: $(TARGETS)
и изменить другие правила шаблона, которые будут выполняться из главный каталог:
%.pha: %.off
cd $(dir $*); $(PYTHON) $(BIN)/demodulateSignals.py $(notdir $*).off
(неуклюжий, но эффективный.) Должно быть понятно, как изменить правила шаблона для %.off
, %.rot
, %.cal
, %/transform.calibrate
и %/transform.align
так же.