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.