![避免在 makefile 中使用“rm”](https://linux22.com/image/1453637/%E9%81%BF%E5%85%8D%E5%9C%A8%20makefile%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E2%80%9Crm%E2%80%9D.png)
我对 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 spec 文件中,似乎已知BUILD_ROOT
变量已被取消设置。由于它的替换不是普遍可用的(尽管前段时间的评论回复:[Fedora-packaging] 逐步淘汰 buildroot?),至今仍可在此处或彼处发现。
答案2
除了使用test
命令之外,您还可以测试 Makefile 中的变量并采取不同的行为 - 例如向用户显示错误,从而拒绝运行 Makefile:
ifeq (,$(LOCAL_SERVER_PATH))
$(error Set LOCAL_SERVER_PATH variable to run this Makefile)
endif