web-dev-qa-db-ja.com

Makefileの$ PATHにdirを追加するにはどうすればよいですか?

テストを実行する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を変更するにはどうすればよいですか?

69

exportディレクティブ Makeを試しましたか(GNU Make)を使用すると仮定しますか?)

export PATH := bin:$(PATH)

test all:
    x

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

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

まず、echoedの値は、シェルではなく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
86

最初にmakefileでShell変数を設定すると、パスの変更が永続的に表示されます。

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

test all:
    x

これが望ましい動作であるかどうかはわかりません。

22
underspecified

設計により、makeパーサーは個別のシェル呼び出しで行を実行します。そのため、1行で変数(たとえばPATH)を変更すると、変更は次の行に適用されません(これを参照してください 投稿 )。

この問題を回避する1つの方法は、複数のコマンドを1行に変換することです(;)、または One Shell 特別なターゲット(.ONESHELL、GNU Make 3.82)以降。

または、シェルが呼び出されたときにPATH変数を提供できます。例えば:

PATH  := $(PATH):$(PWD)/bin:/my/other/path
Shell := env PATH=$(PATH) /bin/bash
18
kenorb

私が通常行うことは、実行可能ファイルへのパスを明示的に指定することです。

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

また、この手法を使用して、クロスコンパイルしている場合、QEMUなどのエミュレーターで非ネイティブバイナリを実行します。

EXE = qemu-mips ./bin/

Makeがshシェルを使用している場合、これは機能するはずです。

test all:
    PATH=bin:$PATH x
3