Как обрабатывать расширения оболочки в GNU Make под Ubuntu? - PullRequest
17 голосов
/ 13 июля 2011

Учитывая это очень просто Makefile:

all:
    @mkdir -pv test/{a,b}

Я получаю этот вывод на OS X 10.6.8 и CentOS 5.5:

mkdir: created directory `test'
mkdir: created directory `test/a'
mkdir: created directory `test/b'

Но в Ubuntu 11.04 я получаю это:

mkdir: created directory `test'
mkdir: created directory `test/{a,b}'

Выполнение команды mkdir -pv test/{a,b} вручную в оболочке на всех платформах дает ожидаемый результат.

Версия GNU Make одинакова на всех платформах:

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program is built for [PLATFORM]

Что отличается под Ubuntu и почему там не работает расширение оболочки?

Ответы [ 2 ]

27 голосов
/ 13 июля 2011

Проблема, вероятно, в том, что Make порождает /bin/sh.Обычно это символическая ссылка на оболочку вашей системы по умолчанию.

Опция 1

Вы можете убедиться, что она указывает на bash (так как это bashism).Вероятно, теперь это / bin / dash или / bin / sh, в зависимости от вашей версии Ubuntu.

Option 2

Более простой вариант:

SHELL=/bin/bash

all:
    @echo a{3,4}
    @bash -c 'echo a{3,4}'

Это печатаетодин и тот же вывод дважды, если вы не закомментируете строку SHELL=

Опция 3

Если вы не можете / не хотите изменять файл make, вы можете вызвать его следующим образом:

make SHELL=/bin/bash

Остерегайтесь взаимодействий с суб-make-файлами или включениями.Возможно, вы захотите взглянуть на параметр make -e и ключевое слово make export: http://www.gnu.org/s/hello/manual/make/Variables_002fRecursion.html

0 голосов
/ 13 июля 2011

Прошло очень много времени с тех пор, как я использовал Make ...

Есть несколько способов указать конкретную оболочку для использования.Оболочкой по умолчанию для старого Make была оригинальная оболочка Bourne.Если вам нужна другая оболочка, вам нужно было установить ее самостоятельно.

Вы используете Linux и GNU, поэтому я предполагаю, что вы используете BASH в качестве оболочки по умолчанию.Попробуйте эту команду в вашем Make:

echo "random = $RANDOM"

Если это просто печатает random = и не содержит случайного числа, ваш Make использует оболочку Bourne в качестве оболочки по умолчанию вместо BASH.(Что странно, потому что я не думал, что в Linux была настоящая оболочка Bourne ...) Чтобы обойти это:

  • Вы можете добавить макрос SHELL, указывающий на оболочку BASH..
  • Вы можете включить оболочку в свою команду.

Вместо:

@mkdir -pv test/{a,b}

Поставьте это:

/bin/bash -c @mkdir -pv test/{a,b}

Thisуказывает, что вы хотите использовать BASH, а не стандартную оболочку / bin / sh Bourne.

Если echo random = $RANDOM печатает случайное число, вы используете BASH (или, по крайней мере, Kornshell), но BRACE EXPANSIONне может быть установлен.Попробуйте использовать это в вашем Makefile:

set -o

и убедитесь, что braceexpand включен.Это может быть отключено при запуске Make.

...