export
を試しましたか Make 自体のディレクティブ (GNU Make を使用すると仮定)?
export PATH := bin:$(PATH)
test all:
x
また、あなたの例にはバグがあります:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
まず、値は echo
です ed は PATH
の拡張です シェルではなく Make によって実行される変数。期待値が表示される場合は、 PATH
を設定したと思います Makefile の前のどこか、または Make を呼び出したシェルのどこかに変数を追加します。このような動作を防ぐには、ドルをエスケープする必要があります:
test all:
PATH=bin:$$PATH
@echo $$PATH
x
第 2 に、Make はレシピの各行を個別のシェルで実行するため、いずれにせよこれは機能しません。これは、レシピを 1 行で記述することで変更できます:
test all:
export PATH=bin:$$PATH; echo $$PATH; x
仕様 make
パーサーは個別のシェル呼び出しで行を実行します。そのため、変数を変更します (例:PATH
) 1 行で、変更が次の行に適用されない場合があります (この投稿を参照してください)。
この問題を回避する 1 つの方法は、複数のコマンドを 1 行に変換することです (;
で区切る)。 )、または One Shell の特別なターゲット (.ONESHELL
) を使用します。 、GNU Make 3.82 以降)。
または、 PATH
を提供することもできます シェル起動時の変数。例:
PATH := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash
私が通常行うことは、実行可能ファイルへのパスを明示的に指定することです:
EXE=./bin/
...
test all:
$(EXE)x
また、クロス コンパイルを行う場合、この手法を使用して、QEMU などのエミュレーターで非ネイティブ バイナリを実行します。
EXE = qemu-mips ./bin/
make が sh シェルを使用している場合、これは機能するはずです:
test all:
PATH=bin:$PATH x
最初にメイクファイルで SHELL 変数を設定すると、パスの変更が永続的に表示されます:
SHELL := /bin/bash
PATH := bin:$(PATH)
test all:
x
これが望ましい動作かどうかはわかりません。