在makefile条件语句中使用多个if语句

7
制作文档说明复杂条件的语法如下:

conditional-directive-one
text-if-one-is-true
else conditional-directive-two
text-if-two-is-true
else
text-if-one-and-two-are-false
endif

但我不明白如何使用这个语法来重写下面的代码:
ifeq ($(option), 1)
CC=gcc
@echo use gcc
else ifeq($(option), 2)
CC=clang
@echo use clang
else
CC=mipsel-linux-gcc
@echo use mipsel-linux-gcc
endif

#first target
foo: ;

2
我不明白为什么你想要“重写”那段代码。它有问题吗?如果有的话,问题是什么?我会指出两个地方:首先,在else ifeq($(option), 2)中的ifeq后面需要加一个空格。其次,这种语法是在GNU make的3.81版本中添加的,所以如果你使用的是旧版本,它是不可用的。 - MadScientist
我在ifeq之后省略了空格,并且我的text-if-one-is-truetext-two-is-truetext-if-one-and-two-are-false块包含了第一个目标之前的配方(这里没有显示)。这两点导致我的Makefile不能工作。 - Cauchy Schwarz
很抱歉,我仍然不理解。您需要在ifeq之后添加一个空格,而不是省略一个空格。提问时,请展示实际问题的最小示例,而不是可能无法显示问题的不同示例。此外,请剪切并粘贴您看到的确切错误消息。在您的评论中,您提到“在第一个目标之前包含配方”,这是一种完全不同类型的错误,只有上面显示的示例makefile无法发生。 - MadScientist
我的意思是在ifeq之后我漏掉了一个空格,导致make文件无法工作。而且我不知道在第一个目标之前不能编写recipes,所以我从先前版本的代码中将它们删除了。 - Cauchy Schwarz
2个回答

9

使用您的Makefile:

ifeq ($(option), 1)
    CC=gcc
    @echo use gcc
else ifeq($(option), 2)
    CC=clang
    @echo use clang
else
    CC=mipsel-linux-gcc
    @echo use mipsel-linux-gcc
endif

#first target
foo:
    echo CC $(CC)

我收到了以下错误信息:

$ make
Makefile:4: Extraneous text after `else' directive
Makefile:6: *** commands commence before first target.  Stop.

根据 @MadScientist 的建议编辑 makefile(即在ifeq后添加一个空格):
ifeq ($(option), 1)
    CC=gcc
    @echo use gcc
else ifeq ($(option), 2)
    CC=clang
    @echo use clang
else
    CC=mipsel-linux-gcc
    @echo use mipsel-linux-gcc
endif

#first target
foo:
    echo CC $(CC)

我理解为:

$ make
Makefile:9: *** commands commence before first target.  Stop.

这意味着除非它是规则的一部分,否则您不能使用命令。如果您想记录类似的内容,请尝试以下方法:

ifeq ($(option), 1)
    CC=gcc
else ifeq ($(option), 2)
    CC=clang
else
    CC=mipsel-linux-gcc
endif

$(info CC is $(CC))

#first target
foo:
    @echo foo

从这个中,我得到了:
$ make
CC is mipsel-linux-gcc
foo

请参阅https://www.gnu.org/software/make/manual/html_node/Make-Control-Functions.html#index-error了解更多关于$(info ...)的信息 - 如果您愿意,可以将其放在条件语句中,但为什么要这样做? :->

谢谢,但是Maxim的答案非常简单而优雅。 - Cauchy Schwarz

7

在我看来,ifeq语句占用太多空间,难以输入和阅读。更好的替代方案:

CC.1 := gcc
CC.2 := clang
CC := $(or ${CC.${option}},mipsel-linux-gcc)
$(info "Using ${CC}")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接