makefile条件中的多个if语句

时间:2016-10-24 11:26:34

标签: makefile

make文档说明复杂条件的语法如下:

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 个答案:

答案 0 :(得分:3)

使用你的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的建议(即ifeq之后的空格)编辑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: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

有关$(info ...)的更多信息,请参阅https://www.gnu.org/software/make/manual/html_node/Make-Control-Functions.html#index-error - 如果您愿意,可以将其置于条件限制内,但为什么会这样? : - >

答案 1 :(得分:3)

恕我直言,ifeq陈述占用太多空间,更难打字和阅读。一个更好的选择:

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