检查makefile中变量的ifeq

检查makefile中变量的ifeq,makefile,Makefile,以下内容不起作用,你知道为什么吗 注意:当前_群集不是“我的本地群集”,并且stil失败 check-env: ifeq ($(CURRENT_CLUSTER), 'my-local-cluster') $(error CURRENT_CLUSTER is local $(CURRENT_CLUSTER), should be production cluster) endif 也许你想要的是: check-env: ifeq ($(CURRENT_CLUSTE

以下内容不起作用,你知道为什么吗

注意:当前_群集不是“我的本地群集”,并且stil失败

check-env:
    ifeq ($(CURRENT_CLUSTER), 'my-local-cluster')
        $(error CURRENT_CLUSTER is local $(CURRENT_CLUSTER), should be production cluster)
    endif

也许你想要的是:

check-env:
ifeq ($(CURRENT_CLUSTER),my-local-cluster)
    $(error CURRENT_CLUSTER is local $(CURRENT_CLUSTER), should be production cluster)
endif
    @echo Whatever

all:
    @echo "Still good"
这将产生以下结果:

$ make check-env CURRENT_CLUSTER=my-local-cluster
Makefile:220: *** CURRENT_CLUSTER is local my-local-cluster, should be
$ make all CURRENT_CLUSTER=my-local-cluster
Still good
$ make check-env CURRENT_CLUSTER=anything
Whatever

这里有很多错误。首先,makefile将在ifneq中比较两部分上的所有内容,这意味着ifeq s,s将因为空间而失败,例如ifeq s,'s'因为'。还有,$error。。。应该出现在配方之外。它在目标完成之前停止编译called@Zelnes:$error。。。可以完美地用于配方中,例如,在不受支持的情况下强制它失败。@RenaudPacalet在达到配方之前它不会失败吗?@Zelnes:不,它是配方的一部分。仅当make在将配方传递给shell之前展开配方时,并且仅当条件传递时,配方才会展开并失败。在上面的示例中,ifeq缩进。这就是我指的。如果不缩进ifeq,则在读取makefile时将对其求值。只要条件是静态的,不依赖于特定的配方或读取makefile的顺序,那么它就可以工作。但是,如果当前_集群是一个特定于目标的变量,或者依赖于自动变量,如$@或$*,或者在定义此规则后重置为不同的值,则它将不起作用。注意:正如@MadScientist所指出的,这仅在条件为静态时起作用。记住这一点可能很重要。