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

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

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変数を作成するための割り当てを反映するわけではありません。PATHGNU 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

関連情報