Я просто хочу подчеркнуть, что это "Открывается/Закрывает", даже при том, что быть очевидно полезным в программировании OO, здоровый метод для использования во всех аспектах разработки. Например, в моем собственном опыте это - большое болеутоляющее для использования, "Открываются/Закрывают" как можно больше при работе с плоскостью C.
/Robert
BUILT_SOURCES = version.h
Все файлы, указанные как BUILT_SOURCES
, будут построены до запуска любого из обычных правил компиляции.
Однако это создаст небольшую проблему: Как версия .h
необходимо будет перестраивать при каждом вызове make
, перекомпиляции каждого файла foo.c
, который имеет версию #include
s . h
будет запускаться снова при каждом запуске make
. Мы бы предпочли, чтобы перекомпиляция происходила только тогда, когда что-то действительно изменилось.
Чтобы обойти эту проблему, используйте зависимость BUILT_SOURCES
от файла штампа, который "создается" каждый раз (никогда фактически создается, поэтому правило сборки запускается каждый раз). Правило сборки для этого файла штампа создает новую версию . h
файл как version.h.tmp
, и только version.h.tmp
копируется в version.h
, если version.h. tmp
на самом деле отличается от version.h
(как и ваше правило version.h
). Таким образом, если ничего не изменилось в version.h
, его временная метка (mtime) останется прежней, и не будет запущена сборка объектов в зависимости от version.h
:
BUILT_SOURCES = version.stamp
version.stamp:
echo '#define VERSION "'`hg id`'"' > version.h.tmp
cmp version.h.tmp version.h || mv version.h.tmp version.h
Это решение будет делайте то, о чем просите.
К сожалению, при сборке из дистрибутивного архива возникнет небольшая проблема: тогда hg id
предоставит вам ложную информацию, а , вероятно, не будет ] version.h
в вашем архиве, поэтому сборка завершится ошибкой или будет содержать ложную информацию о версии.
Я решил эту проблему для проекта xf86-video-radeonhd , который использует git
. Файл git-version.h
, созданный в этом решении, содержит дополнительную информацию о версии, чем просто номер версии. Вы можете увидеть это мое решение update-only-if-different в конце git_version.sh и подключения BUILT_SOURCES
(включая обработку, надеюсь, всех сценарии сборки out-of-source-tree и from-dist-tarball ) в RadeonHD.am , если вам интересно.