Ошибка присвоения переменной Makefile в echo
У меня есть цель файла как это
foo:
i = 1
@echo $(i)
когда я запускаю файл make следующим образом:
$ make foo
я = 1
make: i: команда не найдена
Makefile:2: рецепт для цели 'foo' не удался
make: [foo] Ошибка 127
Но если я не дам пробелы в присваивании (то есть)
i=1
Тогда нет ошибок, но нет вывода, значение i не печатается
2 ответа
Первая попытка запускает команду i
с параметрами =
а также 2
, Правильное присваивание в оболочке не имеет пробелов по обе стороны от знака равенства.
Ваша вторая проблема заключается в том, что рецепт на двух физических строках будет запускать два не связанных экземпляра оболочки. Сначала присваивается значение переменной, затем она завершается и теряет переменную. Второй, не связанный экземпляр не имеет представления о том, что сделал первый, и, конечно, не имеет следов присваивания переменной. Решением для этого является логическое объединение двух в одну строку (вы можете разделить строки на несколько физических строк, если между ними будет точка с запятой):
foo:
i = 1; \
echo "$${i}"
Обратите также внимание на то, как нам нужно удвоить знаки доллара, чтобы предотвратить make
от их интерпретации; и правильное использование кавычек вокруг строк в оболочке. (В данном конкретном случае мы знаем, что строка не содержит метасимволов оболочки; но многие новички также спотыкаются об этом.)
В первом случае вы инструктируете make
запустить команду оболочки: i = 1
,
Если вы хотите переменную внутри Makefile
Вы должны установить без начальных пробелов / табуляции.
Я полагаю, вы используете GNU make
и вы хотите проверить синтаксис рецепта (или аналогичный для других make
s):
Определение переменной в "контексте правила", которая вставляется в качестве первого символа в строке как табуляция, будет рассматриваться как часть рецепта, а не как определение переменной make, и передается в оболочку.