make clean: удалять только файлы, которые были сгенерированы - PullRequest
0 голосов
/ 02 июля 2018

С Makefile, над которым я работаю, я конвертирую pdf файлы в txt файлы.

Я реализовал цель clean, которая удаляла бы все файлы .txt. Однако я не хочу удалять исходные файлы, только те, которые были сгенерированы .

Пример: В моей папке есть следующие файлы:

pdfsource.pdf и donotharm.txt

Запуск моего make-файла создаст следующий файл:

pdfsource.txt

На данный момент мой clean выглядит так:

rm -f *.txt

Использование make clean приведет не только к удалению pdfsource.txt, что желательно, но также и donotharm.txt.

Я думаю, что мог бы использовать: .PRECIOUS: donotharm.txt, но это действительно специфично. Я хотел бы иметь общее решение для этого.

Заранее спасибо!

Ответы [ 2 ]

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

Другой подход: «make -nps» предоставляет вам все метаданные make о зависимостях. Для любого промежуточного файла он печатает

filename: ...

Таким образом, вы можете точно удалить такие файлы с помощью общего «чистого» правила:

clean:; MAKEFLAGS= ${MAKE} -j1 -spinf $(word 1,${MAKEFILE_LIST}) \
| sed -n '/^# I/,$${/^[^\#\[%.][^ %]*: /s/:.*//p;}; 1s|.*|${clean}|p' | xargs rm -rf

Первая строка обрабатывает использование make-файлов, отличных от значений по умолчанию (makefile, GNUmakefile, Makefile) В команде «sed»:

/^# I/,$ 

... выбирает зону метаданных make с зависимостями.

/^[^\#\[%.][^ %]*: /

... отфильтровывает комментарии, неявные правила и файлы без зависимостей (конечный пробел). Это не отфильтровывает фальшивые цели; Ну что ж. Наконец:

1s|.*|${clean}|p

добавляет любые явные цели для «clean» - то, что вы знаете, что make не делает; например, * 1 016 *

clean +=  tmpdir/*  *.gcda
0 голосов
/ 02 июля 2018

Вы можете перечислить сгенерированные файлы в переменной make и использовать ее для очистки только этих:

PDF  := $(wildcard *.pdf)
TEXT := $(patsubst %.pdf,%.txt,$(PDF))
...
clean:
    rm -f $(TEXT)

Или, если вы предпочитаете более компактную (но немного менее читаемую) форму:

clean:
    rm -f $(patsubst %.pdf,%.txt,$(wildcard *.pdf))

Конечно, это работает, только если нет пары {foo.pdf,foo.txt}, для которой вы хотите сохранить foo.txt от удаления на make clean.

Примечание: использование переменных make в таком случае обычно является хорошей идеей, поскольку они могут быть общими для различных правил. Пример:

PDF  := $(wildcard *.pdf)
TEXT := $(patsubst %.pdf,%.txt,$(PDF))

.PHONY: all clean

all: $(TEXT)

$(TEXT): %.txt: %.pdf
    pdftotext $< $@

clean:
    rm -f $(TEXT)
...