Makefileで変更されたPATHを現在の端末にエクスポートする際にいくつかの問題があります。 Makefileディレクトリを含むbinフォルダをPATHに追加しようとしています。
makefileの関連部分は次のとおりです。
PATH := $(shell pwd)/bin:$(PATH)
install:
mkdir -p ./bin
export PATH
echo $(PATH)
echoはこれを正しく印刷しますが、端末でechoを再実行するとPATHは変わりません。
答え1
あなたはそうすることはできません。 makeプロセスは親環境(または次に考える現在のディレクトリ)を変更できません。
実際に思ったより少ないことが起こります。
- すべての実装が環境で
make
変数を作成するための割り当てを反映するわけではありません。PATH
GNU make(Linuxや他のシステムにある)は反映されますが、BSD makeはそうではありません。 - ターゲットの下の各コマンドラインは、別々のサブシェルで実行されます。 (一部の以前のBSD make実装を除いて)したがって、この
export PATH
行はシェルで実行され、すぐに終了します。この行が最初から何もしません。PATH
後で定義されている場合、これはすでにシェル環境にあるためです。
Makeは自動的にものを作ることです。対話型環境の変数を設定する場合、これは考慮すべきツールではありません。代わりにシェルピースを作成し、源泉現在のシェルから:
. ./define-my-variables.sh
makefileからスクリプトを入手してください。各サブシェルで。バックスラッシュを使用して長いコマンドを書くことができます。
- バックスラッシュの改行シーケンスはmakeによって削除されるため、シェルはそこにある改行を見ることができません。
- それでも各行の前にタブ文字を追加することを忘れないでください。
- Makeの誤動作は、コマンドが失敗したときに中断されることです。シェルはデフォルトではこれを実行せず、最後のコマンドを除くすべてのコマンドの失敗はデフォルトで検出されないため、実行する必要があります
set -e
。
install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
1注意すべき点:賢明な方法はありません。デバッガからリモートchdir
で呼び出す場合でも、ptrace
現在のディレクトリを変更するのが好きではないため、ほとんどのシェルのようには機能しません。
答え2
ここで答えを見つけることができます:https://stackoverflow.com/a/8942216/367461
デフォルトでは、次のようにする必要があります。
export PATH := $(shell pwd)/bin:$(PATH)
test:
mkdir -p ./bin
@echo $(PATH)
私はこれをGNU Make 4.0を使ってFedora 23でテストし、私はうまくいきました。
答え3
あなたはできません。子プロセス(たとえば)make
が親プロセスの環境を変更することはできません。
次のようなことができます
$ eval `make pathupdate`
目標はpathupdate
次のとおりです。
pathupdate:
@echo PATH=\"$(PATH)\"
答え4
次のように変更された環境を使用して、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