【问题标题】:Makefile - fail if directory doesn't exist - cross platformMakefile - 如果目录不存在则失败 - 跨平台
【发布时间】:2023-03-25 05:04:01
【问题描述】:
我正在编写 Makefile 的安装部分,我想检查项目是否已构建,如果未构建,则安装应该失败。为此,我想检查某些目录是否存在,如果不存在 - 失败并出现适当的错误(例如“请先运行 make all”)。
我还希望这个 Makefile 可以在 Linux、Windows (mingw) 和 MacOS 上运行。
谁能帮我解决这个问题?
【问题讨论】:
标签:
makefile
directory
installation
cross-platform
【解决方案1】:
如果您使用的是 GNU make 或支持 order-only prerequisites 的 make 版本,则有一个自然的解决方案。将这些目录声明为安装目标的仅订购先决条件:
install: | $(DIRS)
<install recipe>
$(DIRS):
@echo "please run make all first" && exit 1
【解决方案2】:
如果您使用的是 mingw make,那么所有平台的答案都应该相同:
dirs-exist:
test -d dir1 || echo Run make install first && exit 2
test -d dir2
在第一个目录中,如果测试失败,我们使用 or 运算符打印一条消息。然而,即使我们成功打印了消息,我们也希望整行都失败,所以我们以错误代码 2 退出。
如果您希望在所有情况下都有消息,则可以将上述逻辑应用于每个目录。如果您有很多目录,可能会使用如下循环
test_dirs:
for d in dir1 dir2; do if test \! -d $$d; then echo run make install first; exit 2; fi
唯一的复杂性是如果您需要在 Windows 上使用 nmake 和 cmd;听起来这不是问题。
【解决方案3】:
@SamHarman 的回答是正确的(他之前发布过),所以你应该在他修复他的第一个例子后立即接受他的回答。无论如何,我想我也会发布这个,它是同一件事的一个略短且更令人困惑的版本...... :-)
DIRS=dir1 dir2 dir3
checkdirs:
[[ 1 ${DIRS:%= && -d %} ]] || ( echo "uh oh..." && false );
.PHONY: checkdirs