Как настроить make для отслеживания вывода скрипта python и запуска скрипта, только если входной файл был обновлен - PullRequest
0 голосов
/ 13 апреля 2020

Я знаю, что в контексте создания исполняемого файла ac / c ++, make автоматически заботится о создании исполняемого файла, только если файлы зависимостей были обновлены.

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

Запись Makefile:

update_info:
    python update_info.py info.xml

# Output file : info.hpp

В основном я хотел бы проверить версию info.xml. Если он не был обновлен, я не хочу, чтобы make запускал скрипт update_info.py.

Просто пытаюсь выяснить, существует ли способ сделать это. Я могу жить с этим, если это не может быть сделано.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Придумал способ сделать это для существующих файлов, которые обновляются скриптом:

Решение состоит в том, чтобы создать новый файл, скопировав файл make target.

update_info: target/info.hpp

target/info.hpp: info.xml
    python update_info.xml info.xml
    cp info.hpp target/info.hpp

Таким образом, текущая папка может содержать предыдущую версию info.hpp. Make отслеживает файл info.hpp в целевой папке и запускает скрипт, только если информация о входном файле изменилась. xml.

Побочным эффектом этого является то, что файл info.hpp в текущей папке обновляется, только если информация. xml изменилась. Что и было нужно.

Если вы используете git, вам может потребоваться добавить файл target / info.hpp в список игнорируемых.

Этот метод полезен при использовании make для отслеживания этих файлов в хранилище с существующим файлом, который обновляется с помощью скрипта.

0 голосов
/ 13 апреля 2020

Мне было интересно, есть ли способ указать входные и выходные файлы скрипта python для создания, чтобы make мог использовать свои магические значения c в зависимости от состояния входного файла.

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

Make ничего не знает о характер целей и предпосылок, отличных от того, что они представляют собой файлы с метками времени (или так, как предполагается). Make, разработанный с учетом требований к созданию программного обеспечения, он поставляется с некоторыми встроенными правилами, предназначенными для создания программ из исходного кода, написанного на нескольких выбранных языках, но это удобная функция, а не ограничение.

Если вы хотите обеспечить создание файла с именем info.hpp на основе другого файла с именем info.xml, тогда info.hpp является целью, а info.xml является обязательным условием (a). Тогда будет уместным правило в этом духе:

info.hpp: info.xml
    python update_info.py info.xml

Вообще говоря, лучше по возможности избегать повторения целевых и обязательных названий в рецепте. Вместо этого используйте соответствующие автоматические c make переменные, такие как $^, которые представляют отдельные элементы списка предварительных условий:

info.hpp: info.xml
    python update_info.py $^

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

...