テストを実行するMakefileを書きたいです。テストはディレクトリ「./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を変更するにはどうすればよいですか?
export
ディレクティブ Makeを試しましたか(GNU Make)を使用すると仮定しますか?)
export PATH := bin:$(PATH)
test all:
x
また、あなたの例にはバグがあります:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
まず、echo
edの値は、シェルではなくMakeによって実行されるPATH
変数の拡張です。予想される値が出力される場合は、MakefileまたはMakeを呼び出したシェルのどこかでPATH
変数を設定していると思います。このような動作を防ぐには、ドルをエスケープする必要があります。
test all:
PATH=bin:$$PATH
@echo $$PATH
x
第二に、いずれにしても、Makeは separate Shell でレシピの各行を実行するため機能しません。これは、レシピを1行で記述することで変更できます。
test all:
export PATH=bin:$$PATH; echo $$PATH; x
最初にmakefileでShell変数を設定すると、パスの変更が永続的に表示されます。
Shell := /bin/bash
PATH := bin:$(PATH)
test all:
x
これが望ましい動作であるかどうかはわかりません。
私が通常行うことは、実行可能ファイルへのパスを明示的に指定することです。
EXE=./bin/
...
test all:
$(EXE)x
また、この手法を使用して、クロスコンパイルしている場合、QEMUなどのエミュレーターで非ネイティブバイナリを実行します。
EXE = qemu-mips ./bin/
Makeがshシェルを使用している場合、これは機能するはずです。
test all:
PATH=bin:$PATH x