Мы поймали отчет об ошибке в нашем файле GNUmakefile. Я все еще не совсем понимаю причину ошибки (в отчете отсутствуют некоторые детали), но я хочу убедиться, что подстановка и присваивание действительны для GNU Make.

SUNCC_VERSION := $(subst `,',$(shell $(CXX) -V 2>&1))

Я, кажется, припоминаю, что это необходимо при использовании компилятора SunCC (C ++) и оболочки Solaris по умолчанию. Без подстановки make-файл при запуске выдает ошибки. Ошибка видна при поиске номеров версий с помощью grep SUNCC_VERSION.

Вот руководство по make на эту тему: 8.2 Функции для подстановки строк и анализ. В разделе не обсуждаются зарезервированные символы или подобные темы (кроме черной косой черты и процентов).

У меня вопрос, действительна ли подмена или ее нужно исправить?

0
jww 26 Фев 2018 в 18:29

1 ответ

Лучший ответ

Нет никакого способа узнать, потому что вы не указали, что означает «ошибки при запуске». Какая команда выдает ошибку? Что за сообщение об ошибке? Какое значение генерируется командой $(CC) -V до того, как make выполнит эту замену?

Нет ничего особенного в кавычках любого типа: одинарных, двойных или обратных. Make обращается с ними так же, как с любым другим персонажем. Таким образом, эта замена выполняется не для выгоды make.

Скорее всего, результат команды оболочки $(CC) -V печатает некоторую строку внутри кавычек с использованием старого формата GNU (и других), в котором обратная кавычка используется в качестве открывающей одинарной кавычки и одинарная кавычка как закрывающая одинарная кавычка, так что что-то нравиться:

foo `version' bar

Затем эта переменная SUNCC_VERSION использовалась в месте, где обратные кавычки не допускались. Может быть, как часть сценария оболочки и без правильного цитирования, например:

all:
        @echo Version is $(SUNCC_VERSION)

Если вы не замените обратную кавычку, она расширится до:

echo Version is foo `version' bar

Который не является допустимым сценарием оболочки.

Однако, поскольку в вопросе нет подробностей по этому поводу, я просто предполагаю.

1
MadScientist 27 Фев 2018 в 03:25