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現在のディレクトリを変更するのが好きではないため、ほとんどのシェルのようには機能しません。

おすすめ記事