Я использую autotools и git в программе C / C ++.

Я бы хотел, чтобы моя программа показывала, из какого коммита она была скомпилирована. Например, он покажет:

$ myprog --version
Binary compiled from commit 9ddb505

В bash легко определить текущую фиксацию:

COMMIT=$(git log -1 --pretty='%h')

Но этот синтаксис недопустим в файле Makefile.am.

Скажем, у меня есть очень простой Makefile.am:

bin_PROGRAMS = myprog
myprog_SOURCES = main.c
myprog_CPPFLAGS = -Wall -DGIT_COMMIT=\"??SOMETHING??\"

Как я могу передать правильное значение фиксации моему источнику, учитывая, что имя фиксации должно быть актуальным при каждом вызове make?


РЕДАКТИРОВАТЬ

Я также пробовал (в Makefile.am):

COMMIT=\"$(shell git log -1 --pretty='%h')\"

Но этот синтаксис генерирует ошибку с automake:

src / Makefile.am: 3: предупреждение: оболочка git log -1 --pretty = '% h': имя переменной, отличной от POSIX src / Makefile.am: 3: (возможно, расширение GNU make)

, и он окрашен в красный цвет в соответствии с синтаксисом Vim (filetype = automake).

Решением было бы передать эту строку напрямую для включения в окончательный Makefile, но как я могу сделать это в Makefile.am? Я попытался избежать знака $, но безуспешно.

3
yolenoyer 16 Апр 2016 в 10:52

3 ответа

Лучший ответ

Добавить

GITVERSION:= $(shell git log -1 --pretty='%h')

В ваш Makefile и

-DGITVERSION="\"${GITVERSION}\""

В ваш CPPFLAGS, и вы можете использовать GITVERSION внутри кода

1
Lazy Badger 16 Апр 2016 в 08:20

Я думаю, что для вас недостающее звено похоже на команду оболочки в Make.

Вы можете сделать в своем Makefile:

GIT_MSG=\"$(shell git log -1 --pretty='%h')\"
CFLAGS=-Wall -DGIT_COMMIT=$(GIT_MSG)

Затем используйте GIT_COMMIT в качестве макроса в исходных файлах C / C ++.

П.с .:

Используйте следующее для чего-то вроде master-1399ff4:

GIT_MSG=\"$(shell echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`, ")\"

И используйте git describe для печати тегов, если в вашем репозитории git они есть.

1
G.Pei 16 Апр 2016 в 08:31

Используйте это в Makefile.am

AM_CXXFLAGS = -DGIT_VERSION="\"$(shell git log -1 --pretty='%h')\""

Вы все равно получите предупреждение

Makefile.am:14: warning: shell git log -1 --pretty='%h': non-POSIX variable name
Makefile.am:14: (probably a GNU make extension)

Заставьте его исчезнуть с помощью:

AM_INIT_AUTOMAKE(-Wno-portability)

В configure.am

0
Angelo Dureghello 19 Мар 2020 в 22:56