Странная проблема с перенаправлением с gnumake - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть система, в которой я создаю make-файл и которая отлично работает под Mac OS X. Когда я запускаю его под Linux, у меня возникает странная проблема. Мне удалось сократить мой make-файл до очень простого примера:

    compile:
        gcc -o prog *.c &> compile__

    chm:
        chmod u=rwx,g=rwx,o= prog

    both0:
        gcc -o prog *.c &> compile__ ;  \
        chmod u=rwx,g=rwx,o= prog

    both1:
        gcc -o prog *.c ;  \
        chmod u=rwx,g=rwx,o= prog

Идея состоит в том, чтобы скомпилировать файл и затем изменить его разрешения. Если я выполню последовательность команд:

    make compile
    make chm

все отлично работает. Однако, если я выполню:

    make both0

Я получаю сообщение:

    chmod: cannot access `prog': No such file or directory

и разрешения не изменены. С другой стороны, если я выполню:

    make both1

разрешения изменены правильно. Единственная разница - это перенаправление "&> compile__" под обоими0, которое я удалил для обоих1.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 15 апреля 2011
&> compile__

- это , а не - переносимое перенаправление. В bash он перенаправляет как стандартную ошибку, так и стандартный вывод, который, как я полагаю, является вашим намерением. Другие оболочки, вероятно, будут делать с этим разные вещи. В частности, тире выполняет фон команды (&) и перенаправляет стандартный вывод (> compile__). chmod выполняется до завершения компиляции и создает prog. Перенаправление как стандартной ошибки, так и стандартного вывода может быть выполнено с помощью cc -o prog *.c > compile__ 2>&1.

(Почему это работало на Mac? Возможно, другая оболочка, которая интерпретирует &> по-разному, возможно, компилятор открыл файл раньше, возможно, состояние гонки вышло немного по-другому.)

0 голосов
/ 11 июня 2013

Альтернативное решение - указать shell для использования GNU make. Раздел 5.3.1 руководства содержит информацию об этом. Например, следующее

export SHELL=`which bash`

В Makefile кажется, что Gnu Make 3.8.1 в Ubuntu / Debian выбирает bash в качестве оболочки.

Другие проблемы - это различия в поведении всех встроенных встроенных оболочек , таких как echo, printf, test и т. Д. Эзотерические опции для этих встроенных может таинственно завершиться ошибкой при запуске под make в системах на основе Debian.

...