web-dev-qa-db-ja.com

Makefileを介してPATHにディレクトリを追加する

Makefile内で変更したPATHを現在のターミナルにエクスポートする際に問題が発生します。 Makefileディレクトリがどこにあっても、PATH、binフォルダー内に追加しようとしています。

Makefileの関連するストリップは次のとおりです。

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

install:
    mkdir -p ./bin 
    export PATH
    echo $(PATH)

エコーはそれを正しく出力しますが、ターミナルでエコーをやり直しても、PATHは同じままです。

9
user6685

あなたは単にこれを行うことはできません。 makeプロセスが親の環境(または、次に考えているかもしれない現在のディレクトリ)を変更できる方法はありません。

実際、あなたが思っているよりもずっと少ないことが起こっています。

  • すべてのmake実装が環境内のmake PATH変数への割り当てを反映しているわけではありません。 GNU make(Linuxおよびその他のシステムで見つかる)にはありますが、BSD makeにはありません。
  • ターゲットの下の各コマンドラインは、個別のサブシェルで実行されます。 (一部の古いBSD makeの実装を除きます。)したがって、export PATH行は、すぐに終了するシェルで実行されています。この行はそもそも何かをしているわけではありません—その時点でPATHが定義されている場合、それはシェルの環境に既にあるためです。

Makeは自動的にビルドするためのものです。インタラクティブ環境に変数を設定したい場合、これはあなたが見ているは​​ずのツールではありません。代わりに、シェルスニペットを記述し、現在のシェルにsourceを記述します。

. ./define-my-variables.sh

Makefileで、スクリプトすべてのサブシェルをソースします。バックスラッシュを使用して長いコマンドを作成できます。覚えて

  • バックスラッシュと改行のシーケンスはmakeによって削除されるため、シェルは改行を認識しません。
  • それでも、各行の先頭にタブを付けることを忘れないでください。
  • Makeのエラー動作は、コマンドが失敗した場合に中止することです。シェルはデフォルトではそれを行わず、コマンドの失敗はデフォルトで無視されます。そのため、set -eを実行する必要があります。
install:
    set -e; \
    . ./define-my-variables.sh; \
    mkdir -p bin; \
    …

¹ 義務的なメモ:正気の道はありません。デバッガーからchdirを介してリモートでptraceを呼び出しても、現在のディレクトリを自分の足元で変更したくないため、ほとんどのシェルではそのままでは機能しません。

できません。サブプロセス(makeなど)が親プロセスの環境を変更することはできません。

あなたは次のようなことをすることができます

$ eval `make pathupdate`

pathupdateターゲットは次のようになります。

pathupdate:
    @echo PATH=\"$(PATH)\"
7
cjm

あなたの答えはここにあります: https://stackoverflow.com/a/8942216/367461

基本的に、これを行う必要があります:

export PATH := $(Shell pwd)/bin:$(PATH)

test:
    mkdir -p ./bin
    @echo $(PATH)

私はこれをFedora 23でGNU Make 4.0を使用してテストしましたが、うまく動作します。

6
Dan Jones

他の答えの例が機能しなかったので、これと同じ質問をします。

しかし、私はevalコマンドを使用することで、自分に合った解決策を達成することができました。これが以前に投稿されなかった理由がよくわかりません。

do_something: 
    $(eval export PATH=$(Shell pwd)/bin:$(PATH))
    @echo $(PATH)

注:PATHの変更はmake自体の一時的なものです。 makeを終了すると、PATHは以前の値にリセットされます。

2
Yeo

次のように、変更した環境で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
1
Sam B.