2016-10-24 6 views
2

Информации о производителе документации говорит синтаксис сложных условного выглядит следующим образом:Multiple если заявления в Makefile условных

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: ; 
+1

Я не понимаю, почему вы хотите «переписать» этот код. Есть ли проблема с этим? Если да, то в чем проблема? Я укажу на две вещи: во-первых, вам нужно пространство после 'ifeq' в' else ifeq ($ (опция), 2) '. Во-вторых, этот синтаксис был добавлен в GNU make в версии 3.81, поэтому, если у вас установлена ​​более старая версия, она недоступна. – MadScientist

+0

Я пропустил пробел после блоков 'ifeq' и' text-if-one-is-true', 'text-two-is-true',' text-if-one-and-two-are-false' содержат рецепты перед первой целью (они здесь не показаны). Эти две вещи делают мой Makefile неработоспособным. –

+0

Извините, но я до сих пор не понимаю. Вам нужно _add_ пробел после 'ifeq', а не опустить его. При задании вопросов, пожалуйста, покажите минимальный пример проблемы _actual_, а не другой пример, который может не показать проблему. Также, пожалуйста, вырежьте и вставьте точное сообщение об ошибке, которое вы видите. В своем комментарии вы упоминаете «содержать рецепты перед первой целью», что является совершенно другой ошибкой, что не может произойти только с примером makefile, который вы показываете выше. – MadScientist

ответ

0

IMHO, ifeq заявления занимают слишком много места, сложнее вводить и читать. Лучшая альтернатива:

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

Использование 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. 

Редактирование Makefile как на предложение от @MadScientist (т.е. пробел после 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 ...) - вы можете поместить его внутри условными, если это вы хотите, но почему бы вам? : ->

+0

Спасибо, но ответ Максима так прост и изящен. –

Смежные вопросы