В рецепте вы смешиваете синтаксис Shell и Makefile.Имейте в виду, что рецепт передается в оболочку практически без изменений, за исключением $()
расширений переменных (т. Е. ifneq
и аналогичные условия Make не раскрываются, если они имеют отступ).В особенности смотрите первый абзац и 4-й пункт документации здесь: https://www.gnu.org/software/make/manual/html_node/Recipe-Syntax.html
То, что вы хотели сказать, выглядит примерно так, но это не работает из-за продолжения строки \
, включающего последующие ifndef
/ endif
(идеи кто-нибудь?):
%.o: %.c
if [ $(notdir $<) = file1.c ]; then \
echo " >> $(notdir $<) is excluded"; \
else \
ifneq ($(FLAG1),)
$(run_function1); \
endif
ifneq ($(FLAG2),)
$(run_function2); \
endif
fi
Условная функция Make по-прежнему должна работать:
%.o: %.c
if [ $(notdir $<) = file1.c ]; then \
echo " >> $(notdir $<) is excluded"; \
else \
$(if $(FLAG1),,$(run_function1);) \
$(if $(FLAG2),,$(run_function2);) \
fi
Или, возможно, использование условных выражений оболочки понятнее:
%.o: %.c
if [ $(notdir $<) = file1.c ]; then \
echo " >> $(notdir $<) is excluded"; \
else \
if [ -n $(FLAG1) ] \
$(run_function1); \
fi \
if [ -n $(FLAG2) ] \
$(run_function2); \
fi \
fi