Проблема в использовании $(shell ...)
. То, что вы хотите:
.PHONY : clean
clean:
@echo "Running Clean"
@if [ -e exe ]; then rm exe; else echo "no files"; fi
Что касается объяснения того, что идет не так - когда вы впервые запускаете чистую цель, make раскроет все переменные и функции make в рецептах до того, как начнет их запускать - потому что $(shell ...)
имеет только одну $
это считается функцией make. Make запускает команду, которая выводит no files
в stdout и заменяет вызов этой строкой, а затем начинает выполнение рецептов ... Итак, теперь make видит следующее:
clean:
@echo "Running Clean"
no files
Когда он пытается запустить no files
, из-за отсутствия @
он выводит строку на экран, а затем передает команду оболочке. Поскольку оболочка не распознает ключевое слово no
, она выводит ошибку, которую вы видите. В этом случае происходит самопроизвольный сбой, поскольку оболочка вернула ошибку.