
我有一個關於 Makefile 中的一行的問題。我的目標是「清理」本地安裝的測試/登台伺服器。目前它看起來像這樣:
clean:
rm -rf $(LOCAL_SERVER_PATH)/*
只要變數LOCAL_SERVER_PATH
被定義並且看起來像/srv/www/htdocs
這樣,一切都很好。但是...如果使用者犯了錯誤並錯誤地輸入了變數定義,或者某些設定步驟出現問題,並且使用錯誤的定義建立了 Makefile,該怎麼辦?
本質上,我擔心,我可能會錯誤地得到一個未定義的結果$(LOCAL_SERVER_PATH)
,然後我的目標將屈服於:
clean:
rm -rf /*
是否可以重構我的 Makefile 以使其針對此類錯誤更加穩健?我不想最終得到一個 Makefile,它可能會清除我的整個 linux 安裝(甚至是其中的一部分,因為我的用戶不是“root”)。
答案1
如前所述,檢查變數以確保它不為空:
clean:
test -n "$(LOCAL_SERVER_PATH)" && rm -rf $(LOCAL_SERVER_PATH)/*
同樣的習慣用法出現在大量 RPM 規範文件中,其中似乎BUILD_ROOT
已知該變數未設定。由於它的替代品並不普遍可用(儘管不久前有評論)回覆:[Fedora 打包] 逐步淘汰 buildroot?),仍然可以在這裡或那裡找到它。
答案2
您可以測試 Makefile 中的變數並採取不同的行為,而不是使用該test
命令 - 例如,向使用者顯示錯誤,因此拒絕執行 Makefile:
ifeq (,$(LOCAL_SERVER_PATH))
$(error Set LOCAL_SERVER_PATH variable to run this Makefile)
endif