Правило Makefile в зависимости от изменения количества / заголовков файлов вместо изменения содержимого файлов - PullRequest
3 голосов
/ 16 марта 2010

Я использую make-файл для автоматизации генерации документов. У меня есть несколько документов в каталоге, и одно из моих правил makefile создаст страницу индекса этих файлов. Сам список файлов загружается на лету с помощью list := $(shell ls documents/*.txt), поэтому мне не нужно вручную редактировать make-файл каждый раз, когда я добавляю, удаляю или переименовываю документ. Естественно, я хочу, чтобы правило генерации индекса срабатывало при изменении количества / заголовка файлов в каталоге документов, но я не знаю, как настроить предварительные условия для такой работы.

Я мог бы использовать .PHONY или что-то подобное, чтобы заставить генерацию индекса работать все время, но я бы не стал тратить циклы впустую. Я попытался передать ls в файл list.txt и использовать , что , в качестве предварительного условия для моего правила генерации индекса, но для этого потребуется либо отредактировать list.txt вручную (пытаясь избежать этого), либо автоматически -произведения его в make-файле (это меняет время создания, поэтому я не могу использовать list.txt в предварительном условии, потому что это будет вызывать правило каждый раз).

Ответы [ 3 ]

6 голосов
/ 16 марта 2010

Если вам нужна зависимость от количества файлов, то ... почему бы просто не зависеть от самого числа ? Номер будет представлен как фиктивный файл, который создается, когда указанный номер файла находится в каталоге documents.

NUMBER=$(shell ls documents/*.txt | wc -l).files
# This yields name like 2.files, 3.files, etc...
# .PHONY $(NUMBER) -- NOT a phony target!

$(NUMBER):
        rm *.files    # Remove previous trigger
        touch $(NUMBER)

index.txt: $(NUMBER)
        ...generate index.txt...

Хотя количество файлов - это одно свойство для отслеживания, вместо этого вы можете зависеть от хеша списка каталогов. Маловероятно, что хеш-функция будет одинаковой для двух списков, которые встречаются в вашем рабочем процессе. Вот пример:

NUMBER=$(shell ls -l documents/*.txt | md5sum | sed 's/[[:space:]].*//').files

Заметьте, используя -l - таким образом, вы будете зависеть от полного списка файлов, который включает время модификации, размеры и имена файлов. Но если вам это не нужно, вы можете отказаться от этой опции.

Примечание: sed был необходим, потому что в моей системе md5sum дает некоторые вещи после самой хеш-суммы.

2 голосов
/ 16 марта 2010

Вы можете установить зависимость от самого каталога для файла списка, например,

list.txt: documents
        ls documents/*.txt 2>/dev/null > $@ || true

Каждый раз, когда вы добавляете или удаляете файл в каталоге документов, метка времени каталога будет изменяться, и make будет делать все правильно.

0 голосов
/ 20 июня 2010

Вот решение, которое обновляет индекс тогда и только тогда, когда набор файлов изменился:

list.txt.tmp: documents
    ls $</*.txt > $@

list.txt: list.txt.tmp
    cmp -s $< $@ || cp $< $@

index.txt: list.txt
    ...generate index.txt...

Благодаря «cmp || cp» ctime «list.txt» не изменяется, пока не будет изменен вывод «ls».

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