我有以下問題:我有一個編譯 C 專案并生成 .hex 檔案的 makefile。我正在為源檔案使用 Git 不幸的是,makefile 生成了一個 app.hex 檔案,所以我想在 makefile 中添加一個新子句,該子句將生成一個 hex 檔案,其名稱包含我當前提交的短哈希編譯。我在 Windows 下作業。我已經在 Makefile 中添加了以下內容:
tag : prebuild postbuild addtag
addtag : $(BUILD_SDIR)/$(BINARY).hex
@echo ----------------------------------------
@echo Getting Git tag
@echo ----------------------------------------
@echo GIT_TAG = call ./getGitTag.sh
@echo ----------------------------------------
@echo Adding GIT tag to hex file
@echo ----------------------------------------
@echo cp $(BUILD_DIR)\$(BINARY).hex $(BUILD_DIR)\$(BINARY)$(GIT_TAG).hex
使用 getGitTag.sh 如下:
git rev-parse HEAD | cut -c 1-8
不幸的是,這不起作用,我不知道為什么,我的知識很基礎,所以我不知道如何除錯它。即使 .sh 腳本在我呼叫它時有效,GIT TAG 似乎總是為空這是我在 cmd 行中運行 make tag 時得到的輸出:
----------------------------------------
Getting Git tag
----------------------------------------
GIT_TAG = call ./getGitTag.sh
----------------------------------------
Adding GIT tag to hex file
----------------------------------------
cp .\build\app.hex .\build\app.hex
uj5u.com熱心網友回復:
這個問題經常出現make。配方行逐行執行,每行都在一個單獨的 shell 行程中執行,這意味著您不能簡單地實體化 shell 變數并在幾行之后使用它們,因為它們在行尾立即與 shell 行程一起處理。您有兩個選擇,#1 是使用偽命令關閉此功能.ONESHELL:- 這可能會對不是來自您個人的部分 makefile 產生影響(如果不是說問題) - 或 #2:連接帶有反斜杠的配方行;因此,shell 會收到一長串命令,但這對于復雜的腳本可能會變得相當復雜。
還有另一種繞過的選項make,即在你在配方行中呼叫的真正獨立的 shell 腳本中處理所有內容。
作為一種不太干凈的方法,可以make在配方執行期間引入一個變數:
$(eval GIT_TAG := $(shell git rev-parse --short HEAD))
@echo ----------------------------------------
@echo Git tag is: $(GIT_TAG), adding this to hex file now:
cp $(BUILD_DIR)\$(BINARY).hex $(BUILD_DIR)\$(BINARY)$(GIT_TAG).hex
@echo ----------------------------------------
考慮這是一種解決方法,因為代碼具有明顯的臨時性質 - 通常您不應該以make這種方式將功能分成兩半。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/497537.html
