Как написать несколько условий в Makefile.am с помощью else if

Я хочу скомпилировать свой проект с помощью autoconf / automake. В моем configure.ac определены 2 условия

AM_CONDITIONAL(HAVE_CLIENT, test $enable-client -eq 1)
AM_CONDITIONAL(HAVE_SERVER, test $enable-server -eq 1)

Я хочу отделить _LIBS от этих двух условий в Makefile.am

if HAVE_CLIENT

libtest_LIBS = \

    $(top_builddir)/libclient.la

else if HAVE_SERVER

libtest_LIBS = \

    $(top_builddir)/libserver.la

else

libtest_LIBS = 

endif

но else if HAVE_SERVER НЕ работает.

Как написать else if в makefile.am?


person Wind    schedule 09.11.2011    source источник


Ответы (5)


Код ptomato также может быть написан более чистым способом, например:

ifeq ($(TARGET_CPU),x86)
  TARGET_CPU_IS_X86 := 1
else ifeq ($(TARGET_CPU),x86_64)
  TARGET_CPU_IS_X86 := 1
else
  TARGET_CPU_IS_X86 := 0
endif

Это не отвечает на вопрос OP, но, поскольку это лучший результат в Google, я добавляю его сюда на случай, если он будет полезен кому-либо еще.

person R.D.    schedule 25.07.2012
comment
но здесь вам нужно соединить два endif на одном уровне отступа, что в целом тоже будет не очень хорошо - person ; 27.12.2012
comment
@amc в приведенном выше примере достаточно одного endif, который я только что добавил. Проблема с отступом возникает во всех случаях (при использовании большего / вложенного блока else). - person blueyed; 16.03.2015
comment
Продолжая в духе «поскольку это лучший результат в Google» :), если вы пытаетесь повторить это, убедитесь, что вы не забыли пробел перед скобкой в ​​else ifeq (…). make запутается, если он отсутствует, и преждевременно завершит условное выполнение. - person Lucas Werkmeister; 21.06.2018
comment
Вы не можете использовать этот синтаксис в Makefile.am - person Łukasz Daniluk; 30.07.2018
comment
Это не удается с GNU Make 3.80. Сообщения об ошибках: Extraneous text after 'else' directive.. - person jww; 17.07.2019

Я бы принял ответ ldav1s на вашем месте, но я просто хочу указать, что «else if» может быть написано в терминах «else» и «if» на любом языке:

if HAVE_CLIENT
  libtest_LIBS = $(top_builddir)/libclient.la
else
  if HAVE_SERVER
    libtest_LIBS = $(top_builddir)/libserver.la
  else
    libtest_LIBS = 
  endif
endif

(Отступ для ясности. Не делайте отступы между строк, они не будут работать).

person ptomato    schedule 09.11.2011
comment
Я пробовал это, но не получилось. Возможно ли, что Makefile.am не поддерживает рекурсивные условия if. - person Wind; 13.11.2011
comment
Вы убрали отступ? Все эти утверждения должны начинаться в столбце 1. - person ptomato; 13.11.2011
comment
Извините, отступ не убрал, попробую. - person Wind; 14.11.2011
comment
Я только что попробовал это, и он отлично работает. Спасибо большое за вашу помощь. - person Wind; 14.11.2011
comment
Вы можете использовать отступ в строках 2, 5 и 7. (только с табуляцией, а не с пробелами). Только операторы if, else и endif не допускают отступы. - person ndreisg; 19.12.2017

Как вы обнаружили, вы не можете этого сделать. Ты можешь сделать:

libtest_LIBS = 

...

if HAVE_CLIENT
libtest_LIBS += libclient.la
endif

if HAVE_SERVER
libtest_LIBS += libserver.la
endif
person ldav1s    schedule 09.11.2011
comment
Да, это хорошо. Спасибо за ответ, но на самом деле у меня есть 3 условия. КЛИЕНТ, СЕРВЕР, не-КЛИЕНТ-не-СЕРВЕР. Я не знаю, как добавить в свой код 3-е условие. - person Wind; 13.11.2011
comment
На самом деле существует 4 условия относительно AM_CONDITIONAL:! CLIENT &&! SERVER,! CLIENT && SERVER, CLIENT && SERVER, CLIENT &&! SERVER. Этот ответ будет работать со всеми этими условиями. Для 3-го условия (! CLIENT &&! SERVER) libtest_LIBS устанавливается на значение, которое вы хотели в 'else if'. - person ldav1s; 14.11.2011

ifdef $(HAVE_CLIENT)
libtest_LIBS = \
    $(top_builddir)/libclient.la
else
ifdef $(HAVE_SERVER)
libtest_LIBS = \
    $(top_builddir)/libserver.la
else
libtest_LIBS = 
endif
endif

ПРИМЕЧАНИЕ: НЕ делайте отступ для if, тогда это не сработает!

person dkjkj    schedule 11.10.2013

person    schedule
comment
Это не удается с GNU Make 3.80. Сообщения об ошибках: Extraneous text after 'else' directive. - person jww; 17.07.2019
comment
Мне нравится этот стиль, и этот синтаксис работает так, как написано в версии gnu make, которую я использую. Вопрос: Может ли этот синтаксис работать, если условный тест для каждого "else ifeq" отличается от других ??? Например, я мог бы сделать это: ifeq ($ chipset), 1860) BLD_ENV_BUILD_ID = 8960 else ifeq ($ hostname, JohnsLaptop) BLD_ENV_BUILD_ID = 9615 else BILD_ENV_BUILD_ID = endif - person LivingDust; 20.04.2021