Есть несколько вещей не так с кодом выше, настолько, что трудно понять ваше намерение. Вот частичный список (извините, если я звучу как Microsoft clippy)
- Код
$(if $(FOUND) -eq 1, REL=$(REL)../)
выглядит как смесь синтаксиса gnu-make и синтаксиса оболочки.
- Ваш цикл кажется излишним. Вы не используете переменную цикла
d
, а используете конструкцию, которая обрабатывает всю последовательность. Например: $(findstring $(WORD),$(INPUT)
- Кажется, вы пытаетесь сгенерировать код, подобный
echo '$(WORD)../'
, но контекст этого кода неясен. Если это вне правила, код не имеет смысла. Если оно находится внутри правила, будет слишком поздно, чтобы установить переменную makefile. Есть способ обойти эту проблему, но сначала вам нужно лучше прояснить свое намерение.
- Я могу только подозревать, что вы намеревались иметь
REL=$(REL)/..
или REL=../$(REL)
, но я могу ошибаться.
- Наконец, важно понимать, что в Makefile вам действительно нужно описать граф зависимостей и дать make выяснить порядок операций, которые необходимо выполнить. Таким образом, процедурный подход, такой как вывод из приведенного выше кода, должен быть сведен к минимуму.
Редактировать:
Если я правильно вас прочитал, вы пытаетесь достичь хитрой цели в Makefile. Позвольте мне заверить вас, что ваша неопытность - не единственный камень преткновения, который у вас есть. Написание хороших Makefiles сложно. Если у вас есть контроль над этим, я настоятельно рекомендую взглянуть на некоторые другие решения для сборки. Например, cmake может написать хорошие Makefiles для вас.
Если вы пытаетесь вычислить базовый или относительный каталог, обратите внимание, что концепция текущего рабочего каталога, сохраненная в $(CURDIR)
, может соответствовать или не соответствовать ожидаемой.
По вашему вопросу вы действительно можете использовать конструкцию GNU make $(foreach ...)
, но есть несколько функций, предназначенных для обработки последовательностей без итераций, которые могут вам лучше помочь.