Отрицательный глобус в синтаксической ошибке рецепта Makefile - PullRequest
0 голосов
/ 21 ноября 2018

Если я запускаю следующую команду прямо в / bin / bash, она отлично работает:

cp test_!(*.o) ./tmp/

(я просто хочу скопировать все файлы, кроме объектов)

В любом случае, если я поставлю эту командукоманда внутри рецепта Makefile дает

bin/bash: -c: line 0: syntax error near unexpected token `('

Пример Makefile

all:
        cp test_!(*.o) ./tmp/

Что с этим не так?

1 Ответ

0 голосов
/ 21 ноября 2018

Ваш глобус:

test_!(*.o)

использует расширенный синтаксис глобализации.

Посмотрите на это:

$ shopt | grep extglob
extglob         on

А затем на:

$ cat Makefile
SHELL := /bin/bash

all:
    shopt | grep extglob

$ make
shopt | grep extglob
extglob         off

Вызывается в терминале, bash находится в интерактивном режиме (согласно bash -i), а параметр оболочки extglob имеет значение on.

Вызывается make, bash нетв интерактивном режиме (согласно bash -c <command>), а параметр оболочки extglob равен off.

Вы можете заставить команду рецепта работать, включив extglob в .SHELLFLAGS вашего make-файла, например

$ cat Makefile
SHELL := /bin/bash
.SHELLFLAGS := -O extglob -c

all:
    cp test_!(*.o) ./tmp/

$ make
cp test_!(*.o) ./tmp/
cp: cannot stat 'test_!(*.o)': No such file or directory
Makefile:5: recipe for target 'all' failed
make: *** [all] Error 1

Как видите, в моем рабочем каталоге нет совпадений, но нет синтаксической ошибки.

...