如果两个shell变量的状态是某个状态,则退出make文件

Mak*_*mmy 13 if-statement makefile gnu-make

所以我需要确保如果我为特定目标交叉编译设置了一个shell变量.如果未设置变量,则make应显示消息,然后退出.

我的Makefile中有以下规则:

.PHONY: checksource

all: checksource default

checksource:
    $(if $(and $(ifeq ($(CROSS_COMPILE), whatever)), $(ifeq ($(VARIABLE),))), \
    ($(shell echo "Error! VARIABLE not defined!") \
     $(shell exit 2)))
Run Code Online (Sandbox Code Playgroud)

如果$CROSS_COMPILE设置为任何:

$> echo $CROSS_COMPILE
whatever
$>
Run Code Online (Sandbox Code Playgroud)

并且未定义$ VARIABLE:

$> echo $VARIABLE
$>
Run Code Online (Sandbox Code Playgroud)

它不会退出make并构建默认目标.好吧,我知道我可以使用嵌套ifeq来做到这一点,但我想让它漂亮(并学习更多关于makefile).

Jac*_*lly 15

没有这样的事情$(ifeq).我仍然认为你应该在makefile本身进行检查,而不是作为目标之一:

ifeq ($(CROSS_COMPILE),whatever)
ifeq ($(VARIABLE),)
$(error Variables not set correctly.)
endif
endif
Run Code Online (Sandbox Code Playgroud)

如果您打算避免嵌套ifeq:

ifeq ($(or $(subst whatever,,$(CROSS_COMPILE)),$(VARIABLE)),)
$(error Variables not set correctly.)
endif
Run Code Online (Sandbox Code Playgroud)

但我没有看到这是一种改进.如果你想在目标中执行它,只需使用shell并且不要使用make函数:

checksource:
    @if [ "$(CROSS_COMPILE)" = whatever -a -z "$(VARIABLE)" ]; then \
        echo "Error: Variables not set correctly"; exit 2; \
    else true; fi
Run Code Online (Sandbox Code Playgroud)

我仍然使用第一个选项,因为你可以在stat所有文件名称之前停止make Makefile并决定开始执行checksource.