Как я могу собрать список устаревших зависимостей в GNU make? - PullRequest
1 голос
/ 05 марта 2011

У меня есть несколько исходных файлов 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

Ответы [ 2 ]

3 голосов
/ 05 марта 2011

Используйте пустой файл с именем, скажем, ruby-marker, чтобы указать, что все XML-файлы были обработаны. Время его модификации можно сравнить с временем в файлах "x.s". Затем используйте $?, чтобы выбрать только необходимые файлы "x.s", которые изменились с момента последнего запуска сценария ruby.

main-target: ruby-marker
    whatever...

ruby-marker: foo.s bar.s baz.s
    ruby-script $?
    @touch $@
0 голосов
/ 05 марта 2011

Вы можете использовать $(filter) для $? - $? - это список предпосылок, которые новее, чем цель.

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