9

この行で:

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
4

1 に答える 1

13

$Makefile 内で for Bashを使用する場合は、それらを 2 倍にする必要があります$$a。私は表記法に精通していません$'が、あなたがそれで何をしているのか知っていると仮定する必要があります. それが Makefile コンストラクトでない限り、そのコンストラクトでもドル記号を 2 倍にする必要があります。

また、ハッシュ記号#は Make の評価でシェル展開を終了させます。これが、正しい括弧が表示されない理由です。エスケープすることは役に立ちますが、まだうまく機能していません。

私は2つのステップでデバッグしています。最初にGCCVERを囲みのないコマンドのリストに$(shell)設定し、次に2番目のステップで設定しますGCCVER := $(shell $(GCCVER))$(shell)あなたもそれを試して、うまくいかないステップをコメントアウトし、 を使用exportして、「セット」レシピを作成することをお勧めします。

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)
于 2011-08-12T06:33:36.157 に答える