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: ;
答案 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}")