Получение переносимого (gnu) Makefile для работы с шаблонными правилами для файлов в подкаталогах, соответствующих регулярному выражению - PullRequest
0 голосов
/ 04 мая 2020

Я хотел бы использовать этот Makefile как в Debian, так и в Windows 10.

У меня есть набор измерений (и я продолжаю добавлять больше) и файлы необработанных данных go в подкаталоги, называемые "измерения" -12-апр-2020 "(с указанием даты дня, когда я проводил измерения). На этих файлах необработанных данных я выполняю серию этапов постобработки, каждый из которых инкапсулируется в своем собственном небольшом инструменте, создавая новые выходные файлы и опираясь друг на друга. Эти различные выходные файлы имеют различные расширения: .raw для файлов необработанных данных, .rot для поворота координат, .off для удаления смещения и т. Д. c. У меня есть шаблонные правила в моем Makefile для этих шагов. Для нескольких таких шагов я вычисляю специальные матрицы преобразования, которые, конечно, соответствуют только их набору файлов данных. Те, которые я называю, например, «transform.calibrate» или «transform.aligne»

До сих пор Makefile работал только в одном каталоге, и я вручную перемещал файлы данных в их каталоги и из них.

Теперь я хотел бы, чтобы мой Makefile верхнего уровня с его шаблонными правилами работал с данными в подкаталогах.

Как мне заставить его просматривать файлы в каталогах, которые соответствуют шаблону «измерение-ДАТА»? И как мне получить правила шаблонов для работы с одним набором данных, используя локальные файлы преобразования?

Вот мой код с рекурсивным make-файлом. Я хотел бы, чтобы нерекурсивный make-файл без уродливого BIN := ${CURDIR}/../bin и не очень хорошего использования переменных и содержимого, когда Makefile запускается в подкаталогах. Кроме того, я получаю python ошибку 9009, так как я переключился на подкаталоги и каталог bin (что, скорее всего, связано, но на самом деле другая проблема.).

ifdef OS
   RM = del /Q
   FixPath = $(subst /,\,$1)
   COPY = copy
   PYTHON = "c:\Users\Blah\AppData\Local\Programs\Python\Python37\python.exe"
else
   ifeq ($(shell uname), Linux)
      RM = rm -f
      FixPath = $1
   endif
   COPY = cp
   PYTHON = python
endif

.PHONY: test default
.DEFAULT_GOAL := default

# This is for running inside PyCharm
export PATH:=${CURDIR}/venv/bin:${PATH}

# file endings:
# raw
# calibrate  file ending for transformation matrix
# cal calibrated data file
# ali alignement transformation
# rot rotated, aligned sensors
# off offset removed
# pha phase and

measurement_dirs :=  $(filter %/, $(wildcard messung-*/))
BIN := ../bin

DIRS_CMD = $(foreach subdir, $(measurement_dirs), make-rule/$(subdir))
# Makefiles = $(foreach subdir, $(measurements_dirs), $(subdir)Makefile )

default: transform.align transform.calibrate $(wildcard messung-*.pha)

all: $(DIRS_CMD)
    @echo $(BIN)

transform.calibrate: calibrationsequence.raw
    $(PYTHON) $(BIN)/calculateCalibration.py $<

%.cal: transform.calibrate %.raw
    $(PYTHON) $(BIN)/applyCalibration.py $*.raw

transform.align: calibrationsequence.cal transform.calibrate
    $(PYTHON) $(BIN)/calulateAlignement.py calibrationsequence.cal

%.rot: transform.align %.cal
    $(PYTHON) $(BIN)/applyAlignment.py $*.cal

%.off: %.rot
    $(PYTHON) $(BIN)/clearOffset.py $*.rot

%.pha: %.off
    $(PYTHON) $(BIN)/demodulateSignals.py $*.off

test: test_%.py
    $(PYTHON) pytest -v test

make-rule/%:
    cp Makefile $* && cd $* && make

1 Ответ

0 голосов
/ 06 мая 2020

Суть проблемы заключается в том, что две переменные заранее неизвестны: имена каталогов и имена необработанных файлов. 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 так же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...