при использовании $
для 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)