Каков управляющий символ для символа '=' в GNU make? - PullRequest
0 голосов
/ 02 ноября 2011

Я хочу вызвать make-файл, передав переменную окружения CPU_TYPE и ее значение -mcpu=603 в качестве аргумента командной строки этому make-файлу.Я ввожу приведенную ниже команду

make -f make_file CPU_TYPE=-mcpu=603

Но данная ошибка вызвана тем, что значение переменной среды имеет символ =.Как экранировать этот равный символ в значении среды.

Примечание: я не могу добавить эту переменную среды или любую другую переменную внутри make_file.Я должен передать его только в виде командной строки.

Ответы [ 3 ]

4 голосов
/ 02 ноября 2011

Невероятная возможность

Не должно быть никаких проблем, но, возможно, вы используете нечасто используемую функцию оболочки.

Если вы используете set -k в работающей оболочке,или используйте sh -k для запуска оболочки, она будет рассматривать все, что выглядит как переменная среды, как переменную среды.

Вы, вероятно, уже знаете, что оболочки, отличные от семейства оболочек C, могут устанавливать переменную среды дляодиночная команда, добавляя ее перед командой:

PATH="/somewhere/else:$PATH" cmdname -opts file1 file2

Команда сама видит измененную среду;поиск в оболочке cmdname не изменяется.Однако при действующем set -k все, что выглядит как переменная среды, обрабатывается как единое целое:

cmdname -opts PATH="/somewhere/else:$PATH" file1 file2

Вы можете проверить это, используя, например, env, в качестве команды.Существуют веские причины (например, команда dd), чтобы не делать это поведением по умолчанию.

Против гипотезы

Против этой гипотезы я не знаю оболочки, которая возражаетдо «=» в значении окружающей среды.Было бы неприятно, если бы было такое ограничение.

Обычный GNU Make в порядке

Однако я могу сделать:

make CFLAGS='-Dxyz=pqr' progname

и, сset -k в действительности, я также могу сделать:

make -e CFLAGS='-Dxyz=pqr' progname

В обоих случаях компиляция принимает значение, указанное в командной строке, как переопределение того, что установлено в make-файле.

одинарные кавычки не видны make;они удаляются оболочкой, конечно.Вы можете прекрасно их опустить, и я получу тот же результат.Я использую bash в MacOS X, но я ожидаю, что такие же результаты будут получены в любой Unix-подобной системе, использующей любую из стандартных оболочек POSIX-иша (Bourne, Korn, Bash).

0 голосов
/ 02 ноября 2011

Я не уверен, что есть прямой способ достичь того, что вы хотите.

Но, возможно, вы могли бы изменить свой Makefile , чтобы он устанавливал CPU_TYPE, например, чтение файла Вы можете вставить в свой make_file что-то вроде

CPU_TYPE=$(shell cat $(CPU_TYPE_FILE))

и затем создайте файл my603.cputype, например,

echo '-mcpu=603' > my603.cputype

и, наконец, запустите make как

make -f make_file CPU_TYPE_FILE=my603.cputype
0 голосов
/ 02 ноября 2011
...