make: выполнение нескольких целей в зависимости от первой остановки после создания первой цели - PullRequest
0 голосов
/ 01 июля 2018

Я хочу выполнить следующие "вещи", используя make :

  1. Преобразование файлов .pdf в папке в файлы .txt, но переименование их расширения от .txt до .textfile.
  2. Удалите их номера страниц и сохраните их как .nopage файлы.
  3. Сохранение всех файлов .nopage в архив. Название архива должно быть archive.tgz.

Мои цели: textfile, nopage и archive. all должен делать то же самое, что и archive.

Вот мой код:

SRC=$(wildcard *.pdf)
OBJ=$(SRC:.pdf=.converted)

.PHONY: all archive trimmed converted search-% help clean

.SECONDARY:

help:
    @echo "$$helptext"

textfile: $(OBJ)                        
%.textfile: %.pdf
    pdftotext $< $@

nopage: textfile
%.nopage: %.textfile
    @cat $< | sed 's/Page [0-9]*//g' > $@

archive: nopage
archive.tgz: %nopage
    tar -c --gzip $@ $<

all: archive

Используя переменные SRC и OBJ, я собираю все имена файлов .pdf, чтобы textfile мог начинаться с «первой операции», от которой зависят все следующие цели. Однако мой Makefile останавливается после выполнения textfile. Поэтому, если бы я назвал «make nopage», он только создал бы файлы .textfile и остановился на этом. То же самое для целей, которые следуют.

Есть идеи, как мне это решить?

1 Ответ

0 голосов
/ 01 июля 2018

Посмотрите на эти два правила:

nopage: textfile
%.nopage: %.textfile
    @cat $< | sed 's/Page [0-9]*//g' > $@

Да, это два правила. Первый тот, кого вы называете; его цель - nopagee, она имеет обязательное условие textfile и не имеет команд. Поэтому после того, как make выполнит правило textfile, is is not more. Правило шаблона (%.nopage: ...) никогда не выполняется вообще.

Вот хороший способ сделать это:

NOPAGES := $(patsubst %.pdf, %.nopage, $(SRC))
# or you could use NOPAGES := $(SRC:.pdf=.nopage)

.PHONY: nopages
nopages: $(NOPAGES)
%.nopage: %.textfile
    @sed 's/Page [0-9]*//g' $< > $@

И обязательно измените правило архива:

archive.tgz: $(NOPAGES)
    tar -c --gzip $@ $^

Обратите внимание на использование $^ вместо $< в этой последней команде. Также обратите внимание, что я скопировал синтаксис tar из вашего make-файла; моя версия tar не примет эту команду, она требует "-f" перед "$ @".

...