在閱讀 Linux 系統構建腳本時,經常會遇到類似 hide := @ 這樣的定義,後續命令前會加上 $(hide)。這其實是 Makefile 中常見的靜默執行技巧。本文將詳細解析這段腳本的含義、執行流程以及 @ 符號的作用。
hide := @
SHOWTIMECMD := date "+%Y/%m/%d H:%M:%S"
ifeq ($(TRUSTZONE_PARTITION),yes)
ifneq ($(wildcard $(TRUST_TEE_WD)/build.sh),)
$(hide) echo $(SHOWTIME) $@ ing ...
$(hide) echo -e \\t\\t\\t\\b\\b\\b\\bLOG: $(LOG_DIR)$(PROJECT_NAME)_$@.log
$(hide) rm -f $(LOG_DIR)$(PROJECT_NAME)_$@.log $(LOG_DIR)$(PROJECT_NAME)_$@.log_err
$(hide) $(SHELL) $(TZ_BUILD_SCRIPT) $(PROJECT_NAME) $(DEAL_STDOUT)
$(hide) cp -f $(TRUST_TEE_IMAGES) $(LOG_DIR)/$(PROJECT_NAME)/
else
$(hide) echo Not find $(TRUST_TEE_WD)/build.sh, skip $@.
endif
else
$(hide) echo Not support $@.
endif
hide := @ 定義了一個變量,其值為 @。在 Makefile 中,命令行前加上 @ 可以抑制該命令本身的回顯。默認情況下,Make 會在執行命令前將命令打印到終端;加上 @ 後,只會顯示命令的輸出結果,不會顯示命令本身。
例如:
echo hello → 輸出:echo hello 然後換行 hello@echo hello → 輸出:hello這在構建過程中非常有用,避免終端被大量命令行刷屏,只保留關鍵日誌信息。
腳本使用了 Makefile 的條件語法:
ifeq ($(TRUSTZONE_PARTITION),yes):判斷是否啟用 TrustZone 分區ifneq ($(wildcard $(TRUST_TEE_WD)/build.sh),):使用 wildcard 函數檢查構建腳本是否存在只有當 TrustZone 分區啟用 且 存在對應的 build.sh 時,才會執行後續的構建流程:打印時間戳、日誌路徑、清理舊日誌、調用構建腳本、複製生成的鏡像文件。
$(SHOWTIME):引用時間命令變量(注意原代碼中定義為 SHOWTIMECMD 但引用為 SHOWTIME,可能是筆誤)$@:Makefile 自動變量,表示當前目標名稱\\t\\t\\t\\b\\b\\b\\b:轉義序列,用於格式化輸出對齊(製表符 + 退格符)這類腳本常見於 Android 系統構建、嵌入式 Linux 構建系統(如 Buildroot、Yocto)或廠商定製的構建流程中。TrustZone 是 ARM 架構的安全擴展,TEE (Trusted Execution Environment) 相關組件的編譯往往需要獨立的構建流程,因此在主構建系統中通過條件判斷來調用子構建腳本。
SHOWTIMECMD 但使用 SHOWTIME,實際使用時需確認變量名是否正確TRUST_TEE_WD、LOG_DIR、PROJECT_NAME 等需在上層 Makefile 或環境變量中定義build.sh 不存在或構建失敗,腳本僅打印提示,不會中斷主構建流程(除非顯式調用 exit 或返回非零值)這段腳本展示了 Makefile 中靜默執行(@)、條件構建(ifeq/ifneq)、文件存在性檢查(wildcard)以及子腳本調用的典型模式。理解 hide := @ 這一技巧,有助於編寫更乾淨、可讀性更強的構建腳本,也能在閱讀現有項目的構建系統時快速定位關鍵邏輯。