回答:
あなたは単にこれを行うことはできません。makeプロセスが親の環境(または次に考えているかもしれない現在のディレクトリ)を変更できる方法はありません。
実際、あなたが思っているよりもずっと少ないことが起こっています。
make
実装PATH
が環境内のmake 変数への割り当てを反映しているわけではありません。GNU make(Linuxや他のシステムで見つかる)にはありますが、BSD makeにはありません。export PATH
行はシェルで実行され、その後すぐに終了します。この行はそもそも何かをしているわけではありません— PATH
その時点で定義されている場合、それはシェルの環境に既にあるからです。Makeは自動的にビルドするためのものです。インタラクティブ環境に変数を設定したい場合、これは注目すべきツールではありません。代わりに、シェルスニペットを書き、ソース現在のシェルでそれを:
. ./define-my-variables.sh
メイクファイルで、すべてのサブシェルでスクリプトを入手します。バックスラッシュを使用して長いコマンドを作成できます。覚えて
set -e
。install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
¹ 義務的な注記:正気の道はありません。デバッガーからリモートで呼び出しchdir
てもptrace
、現在のディレクトリを自分の足元で変更したくないため、ほとんどのシェルではそのままでは機能しません。
あなたの答えはここにあります:https : //stackoverflow.com/a/8942216/367461
基本的に、これを行う必要があります:
export PATH := $(shell pwd)/bin:$(PATH)
test:
mkdir -p ./bin
@echo $(PATH)
私はこれをGNU Make 4.0を備えたFedora 23でテストしましたが、私には問題なく動作しました。
.SHELL: name=sh path=/path/to/wrapper-script
し、その後のようなラッパースクリプトを作るexport FOO=bar; exec bash "$@"
他の回答例を機能させることができなかったので、これと同じ質問をします。
しかし、私はeval
コマンドを使用することによって私のために実用的なソリューションを達成することができました。これが以前に投稿されなかった理由がよくわかりません。
do_something:
$(eval export PATH=$(shell pwd)/bin:$(PATH))
@echo $(PATH)
注:
PATH
変更はmake自体の一時的なものです。makeを終了すると、PATHは以前の値にリセットされます。
export PATH=…
と、do_something:
必要ありませんeval
。