2016-11-08 8 views
0

私のMakefileに変数を作成したい。これはifeq-statementで比較されます。しかし、私の変数名がコマンドのように扱われます。変数をコマンドとして扱い、括弧付きのifeq-statement構文エラー

make: dif: Command not found 

私が持っている:

dif := $(shell diff file1 <(./myprog < file2)) 

私はいくつかのマニュアルやテストを読んでいましたが、何も働きました。それの私の非作用効果は上記のように見られます。

EDIT:

は、いくつかの進歩を遂げたが、第二の問題は、ifeq文で

$(eval dif = diff ./test0.out <(./rozwiązanie < ./test0.in)) // OK 

ifeq ($(dif),null) 

では、エラーを与える:

ifeq (diff ./test0.out <(./rozwiązanie < ./test0.in),null) 
Syntax error: word unexpected (expecting ")") 
Makefile:18: recipe for target 'test' failed 

答えて

0

多くの問題がここにあります。まず、使用しているオペレーティングシステムとmakeのバージョンを指定してください。上記のエラーのいくつかはGNU make(あなたが使っているmakefile構文)によって生成されたようには見えません。それは非常に奇妙です。 make --versionを実行し、出力を表示してください。

shell関数で使用している構文は、bashシェルに固有ですが、デフォルトでGNU make(すべてのバージョンのmakeなど)ではPOSIX shシェルを使用しています。そこで使用している出力リダイレクト構文(<(./myprog <file2))はshではサポートされていません。非標準のbash固有の構文を使用する必要がある場合は、bashを直接呼び出す必要があります。

dif := $(shell bash -c 'diff file1 <(./myprog <file2)') 

第3に、evalの使用は間違っています。 evalはシェルの構文ではなく、makefileの構文を展開するために使用されます。この文:

$(eval dif = diff ./test0.out <(./rozwiązanie < ./test0.in)) 

がこの声明にあらゆる方法で完全に同一である:

dif = diff ./test0.out <(./rozwiązanie < ./test0.in) 

ので、あなたが実際にあなたがちょうどこれに変数difを設定している、すべてでシェルコマンドを実行していません静的な文字列。

ifeq ($(dif),null) 

真になることはありません:if文はよう

最後に、diffからの出力は、単なる文字列nullになることはありません。

関連する問題