makefile: синтаксическая ошибка рядом с неожиданным токеном `, ' - PullRequest
0 голосов
/ 12 октября 2018

Мне не удалось решить проблему при выполнении следующего кода:

%.o: %.c 
if [ $(notdir $<) = file1.c ]; then \
    echo "  >>  $(notdir $<) is excluded"; \
else\ 
    ifneq ($(FLAG1),)
        $(run_function1)
    endif
    ifneq ($(FLAG2),)
        $(run_function2)
    endif
fi

Проблема заключается в следующем:

 if [ file2.c = file1.c ]; then \
 echo "  >>  file2.c is excluded"; \
 else\
 ifneq (,)
 /bin/sh: -c: line 4: syntax error near unexpected token `,'
 /bin/sh: -c: line 4: ` ifeq (,)'

Есть идеи?

1 Ответ

0 голосов
/ 12 октября 2018

В рецепте вы смешиваете синтаксис 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...