Как я могу добавить свой git коммит в мой bin в make-файле? - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь создать правило в файле make для чтения git коммита и добавления его в имя двоичного файла, поэтому я до сих пор борюсь с тем фактом, что переменная, которая будет содержать коммит, кажется пустой ,

append_git_commit: $(preName)/FLASH.bin
    GIT_COMMIT=$(git log -1 --pretty=format:%h)
    echo "$(info GIT_COMMIT="$(GIT_COMMIT)")"

показывает это

GIT_COMMIT=
echo ""

Почему это? Я ожидал бы, что GIT_COMMIT содержит мой ха sh как GIT_COMMIT=62f9926a

И, во-вторых, как будет правилом добавлять этот контент GIT_COMMIT в мой FLASH.bin, чтобы получить результат

FLASH_62f9926a.bin

Спасибо

1 Ответ

1 голос
/ 02 апреля 2020

Есть несколько проблем с вашим текущим 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.

...