Makefile内で変更したPATHを現在のターミナルにエクスポートする際に問題が発生します。 Makefileディレクトリがどこにあっても、PATH、binフォルダー内に追加しようとしています。
Makefileの関連するストリップは次のとおりです。
PATH := $(Shell pwd)/bin:$(PATH)
install:
mkdir -p ./bin
export PATH
echo $(PATH)
エコーはそれを正しく出力しますが、ターミナルでエコーをやり直しても、PATHは同じままです。
あなたは単にこれを行うことはできません。 makeプロセスが親の環境(または、次に考えているかもしれない現在のディレクトリ)を変更できる方法はありません。
実際、あなたが思っているよりもずっと少ないことが起こっています。
make
実装が環境内のmake PATH
変数への割り当てを反映しているわけではありません。 GNU make(Linuxおよびその他のシステムで見つかる)にはありますが、BSD makeにはありません。export PATH
行は、すぐに終了するシェルで実行されています。この行はそもそも何かをしているわけではありません—その時点でPATH
が定義されている場合、それはシェルの環境に既にあるためです。Makeは自動的にビルドするためのものです。インタラクティブ環境に変数を設定したい場合、これはあなたが見ているはずのツールではありません。代わりに、シェルスニペットを記述し、現在のシェルにsourceを記述します。
. ./define-my-variables.sh
Makefileで、スクリプトすべてのサブシェルをソースします。バックスラッシュを使用して長いコマンドを作成できます。覚えて
set -e
を実行する必要があります。install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
¹ 義務的なメモ:正気の道はありません。デバッガーからchdir
を介してリモートでptrace
を呼び出しても、現在のディレクトリを自分の足元で変更したくないため、ほとんどのシェルではそのままでは機能しません。
できません。サブプロセス(make
など)が親プロセスの環境を変更することはできません。
あなたは次のようなことをすることができます
$ eval `make pathupdate`
pathupdate
ターゲットは次のようになります。
pathupdate:
@echo PATH=\"$(PATH)\"
あなたの答えはここにあります: https://stackoverflow.com/a/8942216/367461
基本的に、これを行う必要があります:
export PATH := $(Shell pwd)/bin:$(PATH)
test:
mkdir -p ./bin
@echo $(PATH)
私はこれをFedora 23でGNU Make 4.0を使用してテストしましたが、うまく動作します。
他の答えの例が機能しなかったので、これと同じ質問をします。
しかし、私はeval
コマンドを使用することで、自分に合った解決策を達成することができました。これが以前に投稿されなかった理由がよくわかりません。
do_something:
$(eval export PATH=$(Shell pwd)/bin:$(PATH))
@echo $(PATH)
注:
PATH
の変更はmake自体の一時的なものです。 makeを終了すると、PATHは以前の値にリセットされます。
次のように、変更した環境でMakeを再帰的に呼び出すことができます。
dummy: build_all
all:
PATH=/new/directory:$(PATH) $(MAKE) build_all
build_all:
your make rules
シェルスニペットを使用する場合:
dummy: build_all
all:
. ./define-my-variables.sh ; $(MAKE) build_all
build_all:
your make rules