У меня есть несколько исходных файлов XML, которые должны быть обработаны скриптом Ruby для создания сгенерированных файлов c # до того, как моя главная цель может быть построена.Начальная стоимость сценария намного больше, чем время обработки каждого файла, поэтому обрабатывать их один за другим совершенно неэффективно, как это обычно делается в make-файлах.То, что я хочу сделать, это собрать их все вместе и передать их в виде списка в сценарий, который выполняется непосредственно перед обновлением основной цели.
Теперь у меня есть что-то вроде:
_generated_/%.xml.cs : %.cs
#execute ruby script to generate .cs file
out.exe : a.cs b.cs _generated_/e.xml.cs ....
#compile .cs files
Мне пришла в голову идея использовать для этого eval, так что если обрабатываемые файлы имеют суффикс .s и выдают файлс суффиксом .t при обработке скриптом моя идея состояла в том, чтобы сделать это:
%.xml : _generated_/%.xml.cs
$(eval SOURCE_FILES += $<)
Однако это правило не сработает, если после eval не будет команды shell (echo будет делать) - я думаюэто потому, что make знает, что простой вызов функции не может создать файл.Вместо этого у меня была другая идея - собрать список файлов во временный файл.
.INTERMEDIATE source_list.txt
%.xml : _generated_/%.xml.cs
echo $< >> source_list.txt
Хотя они, вероятно, будут работать, мне интересно, есть ли лучший способ сделать это.
Обновление:
То, что я в итоге сделал, было примерно таким: префикс @ для дураков функции eval заставляет поверить, что команда оболочки выполняется.
_generated_/%.xml.cs : %.cs
@ $(eval DIRTY_XML += $(<))
out.exe : a.cs b.cs _generated_/e.xml.cs ....
# Create generated cs files
# by running ruby script with DIRTY_XML as input
# Compile all .cs files