make: автоматические переменные в предпосылках правила шаблона - PullRequest
0 голосов
/ 01 мая 2019

Я использую GNU Make на Arch Linux для создания PDF-файлов из исходных файлов LilyPond. У меня есть структура каталогов следующим образом:

scores/
├── makefile
├── out
│   ├── others-songs
│   │   ├── ...
│   │   ├── ...
│   │   └── 失恋阵线联盟
│   │       ├── 失恋阵线联盟.edition.log
│   │       ├── 失恋阵线联盟.oll.log
│   │       └── 失恋阵线联盟.pdf
│   └── ...
├── src
│   ├── others-songs
│   │   ├── ...
│   │   ├── ...
│   │   └── 失恋阵线联盟
│   │       ├── chorus.ily
│   │       ├── verse.ily
│   │       ├── words.ily
│   │       └── 失恋阵线联盟.ly
│   └── ...

PDF-файлы в каталоге out зависят от файлов .ily и .ly в соответствующем каталоге в src. Следующее неявное шаблонное правило работает, если файл .ly изменен, но не если любой из других файлов:

LY = $(shell find src -iname '*.ly')
PDF = $(subst src,out,$(LY:.ly=.pdf))

pdf: $(PDF)
out/%.pdf: src/%.ly
    @mkdir -p $(dir $@)
    @lilypond --include=$(lib) \
             -dpoint-and-click=\#f \
             -o $(basename $@) $<

Я пытался сделать несколько разных вещей, например, добавить $(<D)*.ily к предварительным условиям, но это не увенчалось успехом. Я обратился к GNU make manual онлайн за помощью, но я не нашел ничего такого, что я мог бы применить к моей конкретной ситуации.

Как я могу написать шаблонное правило, чтобы каждый PDF-файл зависел от всех файлов в соответствующем соответствующем исходном каталоге?

EDIT

Возможно, я не был достаточно ясен с моим первым вопросом. Мне нужно поведение, если какой-либо из файлов в исходных каталогах изменяется, соответствующий PDF обновляется. Например, если chorus.ily изменено, то 失恋阵线联盟.ly будет сделано.

1 Ответ

0 голосов
/ 01 мая 2019

Рабочий пример:

LY := $(shell find src -iname '*.ly')
PDF := ${LY:src/%.ly=out/%.pdf}
pdf: $(PDF)

define pdf_deps
$(1:src/%.ly=out/%.pdf) : $(wildcard $(dir ${1})*)
endef

# Make each pdf depend on all the files in its src directory.
$(foreach ly,${LY},$(eval $(call pdf_deps,${ly})))

out/%.pdf:
    @echo "making $@ from $^"

Использование:

$ ls -1R
.:
Makefile
out
src

./out:

./src:
A
B

./src/A:
a.ly

./src/B:
b.1
b.ly

$ make
making out/B/b.pdf from src/B/b.ly src/B/b.1
mkdir -p out/B
touch out/B/b.pdf
making out/A/a.pdf from src/A/a.ly
mkdir -p out/A
touch out/A/a.pdf

$ make
make: Nothing to be done for 'pdf'.

$ touch src/B/b.ly
$ make
making out/B/b.pdf from src/B/b.ly src/B/b.1
mkdir -p out/B
touch out/B/b.pdf

$ make
make: Nothing to be done for 'pdf'.

$ touch src/B/b.1
$ make
making out/B/b.pdf from src/B/b.ly src/B/b.1
mkdir -p out/B
touch out/B/b.pdf

$ make
make: Nothing to be done for 'pdf'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...