всегда запускайте скрипт при запуске make перед компиляцией - PullRequest
0 голосов
/ 25 июня 2018

Я использую automake.

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

Этот скрипт выполняет git diff и генерирует MD5-суммуdiff.

Хеш записывается как #define в repos_version.h, например:

#define REPOS_DIFF "-190886e9f895e80c42cf6b426dc85afd"

Сценарий переписывает этот файл, только если он не существует или если diff имеетотличается от того, что уже есть в repos_version.h.Но сценарий нужно запускать для каждой сборки.

main.c включает repos_version.h и распечатывает хэш при запуске исполняемого файла.

Вот попытка 1 для Makefile.am

all: config.h
        @chmod +x gen_diff_hash.sh
        @./gen_diff_hash.sh
        $(MAKE) $(AM_MAKEFLAGS) all-recursive

Это работает, но я получаю следующую ошибку

Makefile: 1234: предупреждение: переопределение рецепта для цели all' Makefile:734: warning: ignoring old recipe for target all '

Вот попытка 2 для Makefile.am

all-local:
        @chmod +x gen_diff_hash.sh
        @./gen_diff_hash.sh

main.c: repos_version.h

Тем не менее, это не работает, поскольку локальный запуск выполняется слишком поздно.Второй запуск make делает желаемый результат, но это не бегун.

Так что ни тот, ни другой.Есть идеи?Я читал документацию по ловушкам automake, но не вижу ничего, что бы соответствовало моим потребностям.

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете убедиться, что скрипт всегда запускается каждый раз, когда Make загружает Makefile, выполняя его с помощью $(shell ./gen_diff_hash.sh) и присваивая его одноразовой переменной (или используя его в какой-либо другой конструкции, такой как ifeq или что-то в этом роде). Обратите внимание, что это не POSIX , а на реализациях Make, отличных от GNU, это недопустимый синтаксис. GNU Make 4.x также поддерживает использование VAR != ./gen_diff_hash.sh, что по крайней мере совместимо с BSD Make.

Но, возможно, было бы лучше создать цель .PHONY: gendiff, которая запускает скрипт, и сделать заголовок зависимым от этого gendiff. Затем цель будет переоцениваться каждый раз, когда Make проверяет актуальность repos_version.h, а не каждый раз, когда Make запускается вообще.

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