2012-01-20 6 views
54

テストを実行するMakefileを書きたいと思います。 Testはディレクトリ './tests'にあり、テストする実行可能ファイルは './bin'ディレクトリにあります。

テストを実行すると、./binディレクトリが$ PATHにないので、execファイルは表示されません。

私はこのような何かをするとき:

EXPORT PATH=bin:$PATH 
make test 

すべての作品。しかし、Makefileの$ PATHを変更する必要があります。

シンプルなMakefileの内容:

test all: 
    PATH=bin:${PATH} 
    @echo $(PATH) 
    x 

それは正しくパスを出力し、しかし、それは、ファイルxを見つけることができません。

私は手動でこれを行うと:

$ export PATH=bin:$PATH 
$ x 

すべてが、その後OKです。

Makefileの$ PATHをどのように変更できますか?

+0

'../ test/test_to_run'のような実行可能ディレクトリからテストを呼び出すことはできますか?申し訳ありませんが私は質問を誤解している場合。 – Chris

+0

このファイルを通常のテストで見えるようにします。私はリファクタリングを行うことで、ディレクトリと遊びたいとは思っていません。 –

+0

これに近づける唯一の方法は、makefileに変数を含むシェルスクリプトを書き出し、そのシェルシェルソースに '.'を付けさせることです。しかしこれはおそらく実用的ではない。 –

答えて

65

あなたは(あなたがGNU makeを使うと仮定して)自分で作るのexport directiveを試してみましたか?

export PATH := bin:$(PATH) 

test all: 
    x 

はまた、あなたの例のバグがあります:

test all: 
    PATH=bin:${PATH} 
    @echo $(PATH) 
    x 

まず、echo編という値は、メイクによって行わPATH変数の展開ではなく、シェルがあります。期待された値が表示されたら、PATHをMakefileのどこかに置いていたか、またはMakeを呼び出したシェルに変数を設定したと思います。そのような行動を防ぐためにあなたがドルをエスケープする必要があります。メイクはseparate shellにレシピの各行を実行するので

test all: 
    PATH=bin:$$PATH 
    @echo $$PATH 
    x 

第二に、どのような場合には、これは動作しません。

SHELL := /bin/bash 
PATH := bin:$(PATH) 

test all: 
    x 

私はかどうかを知りません。あなたが最初にあなたのメイクファイルにSHELL変数を設定している場合

test all: 
    export PATH=bin:$$PATH; echo $$PATH; x 
+4

'$(PATH)'はmakeを起動するシェルの 'PATH'の値に設定されます。 [マニュアル](http://www.gnu.org/software/make/manual/html_node/Environment.html)によると、 "起動時に見えるすべての環境変数は、同じ変数を持つmake変数に変換されます名前と値。 –

-2

のようなものを使用、唯一のMakefile内、PATH変数を設定するには:

EXE=./bin/ 
... 
test all: 
    $(EXE)x 

私もこれを使用する:私は通常行うことは明示的に実行可能ファイルへのパスを供給している

PATH := $(PATH):/my/dir 

test: 
@echo my new PATH = $(PATH) 
+0

それは私が望むように動作しません。私は達成したいことの例を挙げて質問を更新しました。 –

2

を私がクロスコンパイルしている場合、QEMUのようなエミュレータで非ネイティブバイナリを実行する方法:

EXE = qemu-mips ./bin/ 

makeはshシェルを使用している場合、これは動作するはずです:

test all: 
    PATH=bin:$PATH x 
+0

しかし、クールな感想ですが、私のテストはperlで書かれているので、makefileから直接ではなくperlスクリプトからexeを呼び出す必要があります。私はこのものの全体のテストを再考する必要があります:) –

+0

Gotcha。コマンドライン自体にPATHを設定するのはどうですか?上記の編集を参照してください。 –

+0

ああ、今理解しています。誤った情報を申し訳ありません。 –

18

パスの変更は永続的なように見える:これは、単一の行にレシピを書き込むことによって変更することができますこれは望ましい行動であるか否かである。

+0

これは私が持っていた問題を修正しました(私はzshを実行しています)。ありがとう! –

+0

ええ、これは実際にOPが望んでいたことをしています...しかし、それは機能かバグですか? [マニュアルのシェルセクションを作る](http://www.gnu.org/software/make/manual/make.html#Choosing-the-Shell)を読んだ後でさえ、私はよく分かりません。 – pje

+2

これは私にとってもうまくいきません。 ''と '' env'は新しいPATHを受け取るようになりましたが、バイナリを直接実行することはまだ修正されたPATHでは見つからず、元のものにしかありません。 –

8

デザインによってmakeパーサーが別のシェル呼び出しで行を実行するため、変数(たとえばPATH)を1行に変更すると、変更は次の行に適用されない可能性があります(post参照)。

複数のコマンドを1行に(;で区切って)変換するか、One Shell特別ターゲット(.ONESHELL、GNU Make 3.82現在)を使用してください。

また、シェルの起動時に変数PATHを指定することもできます。例:

PATH := $(PATH):$(PWD)/bin:/my/other/path 
SHELL := env PATH=$(PATH) /bin/bash 
+1

私はアプローチが好きです! –

+1

'$(shell)'の呼び出しでも機能するので、これが最適です! :D 例:https://pastebin.com/Pii8pmkD – PsychoX