Есть несколько проблем с вашим текущим Makefile
.
GIT_COMMIT=$(git log -1 --pretty=format:%h)
Не делает то, что вы ожидаете, потому что это расширение переменной make, а не расширение команды в оболочке. Для того, чтобы передать его в базовую оболочку, вам нужно экранировать $
:
GIT_COMMIT=$$(git log -1 --pretty=format:%h)
. На следующей строке $(GIT_COMMIT)
относится к GIT_COMMIT
make-переменной, а не к переменная оболочки.
В результате возникает проблема:
- установка переменной в оболочке, выполняемой из make, не устанавливает переменные make (также означает, что
info
не будет иметь доступа к что произошло в командной оболочке выше); эта оболочка является дочерним процессом make - , и каждая строка рецепта выполняется в своем собственном экземпляре оболочки (поэтому переменные из одной строки не видны в следующей)
Если Я понимаю, что вы после этого, я, вероятно, сделал бы это так:
GIT_COMMIT := $(shell git log -1 --pretty=format:%h)
append_git_commit: $(preName)/$(GIT_COMMIT)_FLASH.bin
$(preName)/$(GIT_COMMIT)_FLASH.bin: $(preName)/FLASH.bin
cp "$<" "$@"
Использование переменной make и введение промежуточной цели, если нет новой ревизии и $(preName)/FLASH.bin
не получено обновлено, для append_git_commit
тоже ничего не нужно делать, потому что теперь он знает, что нужно создать $(preName)/$(GIT_COMMIT)_FLASH.bin
из $(preName)/FLASH.bin
, и все детали известны во время оценки Makefile
.