我正在编写Makefile的安装部分,我想检查项目是否已构建,如果不是,则安装失败。出于这个目的,我想检查某些目录是否存在,如果没有 - 失败并出现相应的错误(例如“请先运行make all”)。
我也希望这个Makefile可以在Linux,Windows(mingw)和MacOS上运行。
任何人都可以帮我吗?
答案 0 :(得分:3)
如果您使用的是GNU make或支持order-only prerequisites的make版本,则有一个自然的解决方案。将这些目录声明为安装目标的仅订单先决条件:
install: | $(DIRS)
<install recipe>
$(DIRS):
@echo "please run make all first" && exit 1
答案 1 :(得分:1)
如果您正在使用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;听起来这不是问题。
答案 2 :(得分:1)
@SamHarman的回答是正确的(他早些时候发布过),所以你应该在他修复他的第一个例子后立即接受他的回答。在任何情况下,我都认为我也会发布这个,这是一个稍短且稍微混淆相同的版本......: - )
DIRS=dir1 dir2 dir3
checkdirs:
[[ 1 ${DIRS:%= && -d %} ]] || ( echo "uh oh..." && false );
.PHONY: checkdirs