Я пытаюсь встроить номер моей версии Subversion в проект C ++, и у меня возникают проблемы при настройке GNU make для этого. Мой make-файл сейчас выглядит примерно так:
check-svnversion:
../shared/update-svnversion-h.pl
../shared/svnversion.h: check-svnversion
shared/svnversion.o: ../shared/svnversion.h
.PHONY: check-svnversion
svnversion.o
зависит от svnversion.cpp
(через правило шаблона) и svnversion.h
(указано явно, потому что проверка зависимостей по какой-то причине не подхватывает его). svnversion.h
создается и поддерживается сценарием update-svnversion-h.pl
(который в основном просто запускает svnversion
и объединяет вывод в файл C ++).
В настоящее время мне нужно дважды запустить make
, чтобы получить файл в актуальном состоянии. В первый раз make
запускает update-svnversion-h.pl
(поскольку он указан как предварительное условие), но впоследствии не проверяет отметку времени svnversion.h
, чтобы увидеть, что она была изменена на update-svnversion-h.pl
, поэтому она не преобразует svnversion.o
. Во второй раз он проверяет отметку времени, все равно запускает update-svnversion-h.pl
(который ничего не делает в этот раз, поскольку svnversion.h
обновлен), затем перекомпилирует svnversion.cpp
, чтобы сделать svnversion.o
.
Есть ли способ заставить GNU make дважды оценить одно предварительное условие или отложить проверку временной метки на предварительном условии до тех пор, пока команды этого требования не будут завершены?
В качестве альтернативы, есть ли лучший способ вставить номер ревизии в мой исходный код? (Ради скорости я стараюсь избегать решений, которые потребовали бы перекомпиляции при каждой сборке.)