Ошибка присвоения переменной 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 и вы хотите проверить синтаксис рецепта (или аналогичный для других makes):

Определение переменной в "контексте правила", которая вставляется в качестве первого символа в строке как табуляция, будет рассматриваться как часть рецепта, а не как определение переменной make, и передается в оболочку.

Другие вопросы по тегам