Как я могу использовать зависимости в make-файле без вызова цели? - PullRequest
1 голос
/ 17 марта 2010

Я использую make-файлы для преобразования внутреннего формата файла в файл XML, который отправляется другим коллегам.Они будут вносить изменения в файл XML и отправлять его нам (не спрашивайте, это должно быть так ;)).Я хотел бы использовать свой make-файл для обновления внутренних файлов при изменении этого XML.

Итак, у меня есть следующие правила:

%.internal: $(DATAFILES)
       # Read changes from XML if any
       # Create internal representation here

%.xml: %.internal
       # Convert to XML here

Теперь XML может измениться из-за описанного выше рабочего процесса,Но так как никакие файлы данных не изменились, make сказала бы, что file.internal обновлен.Я хотел бы избежать установки %.internal target phony и циклической зависимости от %.xml, очевидно, не работает.

Любым другим способом я мог бы заставить make проверить изменения в файле XML и повторно-строить %.internal?

Ответы [ 3 ]

1 голос
/ 17 марта 2010

Я думаю, вы могли бы сделать что-то вроде этого:

all: .last-converted-xml .last-converted-internal

.last-converted-internal: *.internal
    ./internal-2-xml $?
    touch $@ .last-converted-xml

.last-converted-xml: *.xml
    ./xml-2-internal $?
    touch $@ .last-converted-internal

Это запускает «xml-convert» для любых файлов .xml, более новых, чем произвольный файл маркера, «.last-convert». $? должен предоставить вам список всех зависимостей (* .xml), которые новее, чем файл маркера.

Конечно, программа xml-convert должна быть написана, чтобы взять список файлов xml и обработать каждый из них.

Я не уверен из вопроса, нужен ли вам файл .internal или это была просто попытка заставить работать make-файл. Таким образом, либо ваша программа «xml-convert» может преобразовать каждый XML-файл на месте, либо она также может сгенерировать file.internal, если вам это нужно.

1 голос
/ 17 марта 2010

Вы хотите разрешить два различных действия: создание файла xml из внутреннего файла и создание внутреннего файла из файла xml. Поскольку Make знает только времена модификации, она знает, какая цель старше, но не знает, нужно ли ее переделывать. Поэтому вставьте другой файл в качестве флага, чтобы записать, когда было выполнено последнее действие, и сделайте это своей основной целью; если какая-либо цель новее, чем флаг, она была изменена чем-то иным, чем эти действия, и make должна перестроить более старую цель (а затем коснуться флага).

Есть несколько способов реализовать это. В некоторых версиях Make (например, в последних версиях GNUMake) вы можете написать правила с двойным двоеточием, чтобы Make по-разному перестраивала цель, в зависимости от того, какой preq ее вызвал:

%.flag:: %.internal
    # convert $*.internal to $*.xml
    touch $@

%.flag:: %.xml
    # rewrite $*.internal based on $*.xml
    touch $@

Менее элегантный, но более портативный способ - смотреть на $? и перестройте файл other :

%.flag: %.xml %.internal
ifeq ($?,$*.internal)
    # convert $*.internal to $*.xml
else
    # rewrite $*.internal based on $*.xml
endif
    touch $@
0 голосов
/ 18 марта 2010

Используйте параметр -W команды make, чтобы заставить думать, что один из файлов данных изменился:

make -W somedatafile

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


Можно ли использовать разные имена для файла XML? Файл, который вы создаете из внутреннего формата, будет иметь одно имя, а файл, который ваши коллеги отправят вам, другой? Если бы они использовали разные имена, не было бы круговой зависимости.

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