Это не лучший способ сделать это, но если вы делаете это в соответствии с этим, запишите это как условие оболочки, не используя GNU make conditionals:
$(TMPDIRPATH)%.o: %.cpp
@echo compile $<
@if [ $(notdir $<) != main.cpp ]; \
then $(COMPILE.cpp) $(OUTPUT_OPTION) $<; \
fi
Требуются маркеры продолжения (обратная косая черта). Как и точки с запятой. Значения с префиксом $
будут расширены на make
до вызова оболочки для их интерпретации. Вы, вероятно, не хотите, чтобы эхо там, где оно есть. Вам, вероятно, нужно:
$(TMPDIRPATH)%.o: %.cpp
@if [ $(notdir $<) != main.cpp ]; \
then echo compile $<; \
$(COMPILE.cpp) $(OUTPUT_OPTION) $<; \
fi
То, как я ожидал бы сделать это, - это список файлов для компиляции. Использование любого механизма подстановки приводит к проблемам при добавлении дополнительных файлов - других тестов или случайных файлов, которые на самом деле не являются частью системы.
Комментарий гласит: «Но Руководство по сборке GNU говорит, что ifneq
должно работать».
ifneq
будет работать, если он будет правильно расположен, что означает «не отступать как часть команд, связанных с правилом». Таким образом, вы могли бы написать что-то вроде (ужасно плохой пример, но мой мозг на фритюре):
ifneq (${CFLAGS}, -Wall)
CFLAGS += -Wall
endif
file1.o: file1.c
${CC} ${CFLAGS} -c $<
Но когда ifneq
имеет отступ, как в вопросе, это просто команда, которая на самом деле не найдена в системе, когда make
запускает оболочку для обработки команды.