Что не так со следующим GNU make расширения переменной оболочки? - PullRequest
8 голосов
/ 12 августа 2011

В этой строке:

GCCVER:=$(shell a=`mktemp` && echo $'#include <stdio.h>\nmain() {printf("%u.%u\\n", __GNUC__, __GNUC_MINOR__);}' | gcc -o "$a" -xc -; "$a"; rm "$a")

Я получаю:

*** unterminated call to function `shell': missing `)'.  Stop.

Что не так с моей тупо крутой переменной?

Update0

$ make --version
GNU Make 3.81
$ bash --version
GNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu)
$ uname -a
Linux 2.6.38-10-generic #46-Ubuntu SMP x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

1 Ответ

12 голосов
/ 12 августа 2011

при использовании $ для Bash внутри Makefile, вам нужно удвоить их: $$a например.Я не знаком с обозначением $', но я должен предположить, что вы знаете, что вы делаете с этим.если это не конструкция Makefile, вам тоже нужно удвоить знак доллара на этом.

Кроме того, знак хеша # завершает расширение оболочки в оценке Make, поэтому он никогда не видит нужную часть.,экранирование помогает, но у меня пока что оно работает не совсем правильно.

Я отлаживаю его, выполнив два шага: сначала задаю GCCVER, чтобы он представлял собой список команд без включенного $(shell), затемв настройке 2-го шага GCCVER := $(shell $(GCCVER)).Вы также можете попробовать это, закомментировав шаг $(shell), когда он не работает, используя export, и сделав рецепт "set":

GCCVER := some commands here
#GCCVER := $(shell $(GCCVER))  # expand the commands, commented out now
export  # all variables available to shell
set:
        set  # make sure this is prefixed by a tab, not spaces

Затем:

make set | grep GCCVER

[обновить] это работает:

GCCVER := a=`mktemp` && echo -e '\#include <stdio.h>\nmain() {printf("%u.%u\\n", __GNUC__, __GNUC_MINOR__);}' | gcc -o "$$a" -xc -; "$$a"; rm "$$a"
GCCVER := $(shell $(GCCVER))
export
default:
    set

jcomeau@intrepid:/tmp$ make | grep GCCVER
GCCVER=4.6

И полный круг, избавившись от дополнительного шага:

jcomeau@intrepid:/tmp$ make | grep GCCVER; cat Makefile 
GCCVER=4.6
GCCVER := $(shell a=`mktemp` && echo -e '\#include <stdio.h>\nmain() {printf("%u.%u\\n", __GNUC__, __GNUC_MINOR__);}' | gcc -o "$$a" -xc -; "$$a"; rm "$$a")
export
default:
    set

Использование конструкции $' Bash:

jcomeau@intrepid:/tmp$ make | grep GCCVER; cat Makefile 
GCCVER=4.6
GCCVER := $(shell a=`mktemp` && echo $$'\#include <stdio.h>\nmain() {printf("%u.%u\\n", __GNUC__, __GNUC_MINOR__);}' | gcc -o "$$a" -xc -; "$$a"; rm "$$a")
export
default:
    set

Поскольку ваша система не работает так же, как моя, я собираюсь справиться и сказать, либо использовать предложение reinierpost, либо, альтернативно:

GCCVER := $(shell gcc -dumpversion | cut -d. -f1,2)
...