Почему мой make-файл не делает то, что я хочу - конфликт между неявными и явными правилами? - PullRequest
1 голос
/ 17 июля 2011

Сайт, который я создаю из источников, состоит в основном из двух групп файлов.Во-первых, набор HTML-файлов, которые содержат инструкции по обработке PHP, которые я обрабатываю с помощью PHP во время сборки как часть создания локализованных файлов разметки.Иными словами, HTML-файл из исходного каталога обрабатывается с помощью PHP, который направляет вывод в другой HTML-файл в каталоге сборки с тем же именем.

Обработка указанных файлов HTML включает собственный набор файлов PHP.Эти файлы содержат фактические тексты локализации, которые заменяют заполнители в исходных файлах HTML.Эти файлы PHP, в свою очередь, генерируются из соответствующих файлов XML.Это потому, что мы выбрали XML в качестве исходного носителя для текстов локализации, поскольку этот проект является частью более крупного проекта, который довольно неоднороден в отношении используемой технологии, и поэтому мы использовали XML, чтобы помочь себе в быстром переводе.

Во-вторых, и наконец, у меня есть вторая группа файлов, которые мы можем назвать «статическими» активами, которые просто необходимо дословно скопировать из источника в каталог сборки.

Я пытаюсь написать краткий make-файл для использования в GNU make, который правильно выражает зависимости.В лучшем случае я выполняю половину, в то время как make, кажется, играет со мной шутки, которые меня смущают.

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

  • Процесс, который преобразует данные локализации из формата XML в код, который PHP может include, вызывается с помощью xml_to_php_res.Файлы XML находятся в текущем (исходном) каталоге и соответствуют *.res.xml.
  • Вызов PHP для include файлов локализации и обработки файлов HTML абстрагируется в сценарии process_html
  • DESTDIR переменная make используется для указания префикса каталога сборки.Поскольку это префикс, он обычно заканчивается /, когда он определен.По понятным причинам он не может соответствовать исходному каталогу.
  • Исходный каталог считается текущим каталогом
  • Файлы локализации PHP, созданные из файлов XML, соответствуют $(DESTDIR)resources/*.php.Я не выбрасываю их после использования, потому что 1) хорошо их кэшировать и 2) они могут использоваться во время выполнения, если это будет сочтено необходимым.Я полагаю, это то, что make называет "промежуточными" предпосылками?

Makefile:

php_pp_def_files := $(patsubst ./%.res.xml,$(DESTDIR)resources/%.php,$(shell find -name \*.res.xml))

$(DESTDIR)resources/%.php: %.res.xml
    ./xml_to_php_res $< > $@

$(DESTDIR)%.html: %.html $(php_pp_def_files) # Each built HTML file depends on corresponding source HTML file and all PHP localization definition files
    ./process_html $< > $@

$(DESTDIR)%: %
    $(INSTALL_DATA) -D $< $@

Последнее правило, кажется, мешает моим намерениям.Кажется, именно так устроен make - если не существует каких-либо предпосылок для второго правила, он просто пропускает его и вместо этого рассматривает третье правило.Это совсем не то, что мне нужно.

Я пропустил цель all, потому что make-файл даже не работает для произвольных отдельных файлов.

Я думаю, что мне не хватает каких-то первостепенных знаний о том, как выполнять поиск и соответствует правилам и т. Д. Я практически уже перевернул руководство в первый раз, но оно довольно загадочное, и я злился, прежде чем мне удалось вздрогнутьэто: /

1 Ответ

1 голос
/ 17 июля 2011

Если я правильно понимаю, последнее правило предназначено для копирования статических ресурсов в каталог сборки. Если это так, первое решение, которое приходит на ум, - это превратить его в правило статического шаблона . Таким образом, правило применяется только к указанным вами целям. Для этого вам нужно будет составить список статических ресурсов.

STATICS := $(addprefix $(DESTDIR), ...)
$(STATICS): $(DESTDIR)%: %
    $(INSTALL_DATA) -D $< $@

Изменить в ответ на комментарий:
Я думаю, что следующее должно составить список файлов, которые вам нужны.

STATICS := $(addprefix $(DESTDIR), $(filter-out %.php %.html, $(wildcard *)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...