Makefileの$ PATHにdirを追加するにはどうすればよいですか?


87

テストを実行するMakefileを作成したいと思います。テストはディレクトリ './tests'にあり、テストされる実行可能ファイルはディレクトリ './bin'にあります。

テストを実行すると、ディレクトリ./binが$ PATHにないため、execファイルが表示されません。

私がこのようなことをするとき:

EXPORT PATH=bin:$PATH
make test

すべてが機能します。ただし、Makefileの$ PATHを変更する必要があります。

単純なMakefileコンテンツ:

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

パスを正しく出力しますが、ファイルxが見つかりません。

これを手動で行う場合:

$ export PATH=bin:$PATH
$ x

それならすべてOKです。

Makefileの$ PATHを変更するにはどうすればよいですか?


のように実行可能ディレクトリからテストを呼び出すことはできません../test/test_to_runか?質問を誤解してしまったらごめんなさい。
クリス

このファイルをテストで正常に表示できるようにします。私はそれをリファクタリングするので、ディレクトリをいじりたくありません。
のSzymonリピンスキー

これに近づく唯一の方法は、makefileに変数declsを含むシェルスクリプトを書き出させてから、そのスクリプトを含む親シェルソースを持たせること.です。ただし、これはおそらく実用的ではありません。
Michael Smith

unix.stackexchange.com/questions/11530/…は、あなたの質問とは異なり、非常に異なる(愚かな)質問だと思います。
imz --Ivan Zakharyaschev 2015年

回答:


106

Make自体のexportディレクティブを試しましたか(GNU Makeを使用していると仮定)?

export PATH := bin:$(PATH)

test all:
    x

また、あなたの例にはバグがあります:

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

まず、echoedされる値PATHは、シェルではなく、Makeによって実行される変数の展開です。期待値が出力される場合は、PATHMakefileのどこか、またはMakeを呼び出したシェルのどこかに変数を設定していると思います。そのような振る舞いを防ぐために、あなたはドルを逃れるべきです:

test all:
    PATH=bin:$$PATH
    @echo $$PATH
    x

次に、Makeはレシピの各行を個別のシェルで実行するため、いずれの場合もこれは機能しません。これは、レシピを1行で記述することで変更できます。

test all:
    export PATH=bin:$$PATH; echo $$PATH; x

7
$(PATH)PATHmakeを呼び出すシェルの値に設定されます。あたりとして、マニュアル、「それは起動時にmakeが見ているすべての環境変数が同じ名前と値を持つメイク変数に変換されます。」
エミルシット2013

エクスポートディレクティブは私のために機能しました(ありがとう!)が、GNU Make4.3をインストールした後でのみです。バージョン3.81(MacOSのカタリナ上のデフォルト)では、更新がPATH正しく(変数に反映されているecho $(PATH))と、コマンド環境内(envwhich pythonbash -c python)が、コマンドの実行可能ファイルを検索するときに使用されていないようです:コマンドがpythonまだ実行されますオリジナルのPython実行可能ファイルPATH
doctaphred

27

意図的に makeパーサーは別のシェル呼び出しで行を実行します。そのため、ある行で変数(たとえばPATH)を変更すると、変更が次の行に適用されない場合があります(この投稿を参照)。

この問題を回避する1つの方法は、複数のコマンドを1行に変換する(で区切る;)か、One Shellの特別なターゲット(.ONESHELLGNU Make 3.82以降)を使用することです。

またはPATH、シェルが呼び出されたときに変数を指定することもできます。例えば:

PATH  := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash

2
私はアプローチが好きです!
Alan Franzoni 2016年

2
これは、$(shell)呼び出しでも機能するため、最適です。:D例:pastebin.com/Pii8pmkD
PsychoX

dev.azureで、次のようになります。env: 'env':そのようなファイルまたはディレクトリはありません。ローカルで動作します; /
Kamil Dziedzic

make4.2のDebian10では機能しません:make:env PATH = <path> / bin / sh:コマンドが見つかりません。輸出作品の使用。ホームディレクトリのパスには、〜ではなく$(HOME)を使用してください。
MKesper

25

最初にメイクファイルでSHELL変数を設定すると、パスの変更は永続的に表示されます。

SHELL := /bin/bash
PATH := bin:$(PATH)

test all:
    x

これが望ましい動作であるかどうかはわかりません。


これにより、私が抱えていた問題が修正されました(zshを実行しています)。ありがとう!
Jezen Thomas 2014

ええ、これは確かにOPが望んでいたことをします...しかしそれは機能ですか、それともバグですか?メイクマニュアルのSHELLセクションを読んだ後でも、よくわかりません。
pje 2014

5
これは私にとってもうまくいきません。whichそしてenv今、新しいPATHを取得しますが、バイナリを直接実行することは、変更されたPATHにはまだなく、元のPATHにのみあります。
Konrad Rudolph

3

私が通常行うことは、実行可能ファイルへのパスを明示的に指定することです。

EXE=./bin/
...
test all:
    $(EXE)x

クロスコンパイルしている場合は、この手法を使用して、QEMUなどのエミュレーターで非ネイティブバイナリを実行します。

EXE = qemu-mips ./bin/

makeがshシェルを使用している場合、これは機能するはずです。

test all:
    PATH=bin:$PATH x

はい、クールな魂ですが、テストはperlで記述されているので、makefileから直接ではなく、perlスクリプトからexeを呼び出す必要があります。私はこのようなもののテスト全体を再考する必要があります:)
SzymonLipiński2012年

ガッチャ。コマンドライン自体にPATHを設定するのはどうですか?上記の編集を参照してください。
リチャードペニントン2012年

-2

PATH変数を設定するには、Makefile内でのみ、次のようなものを使用します。

PATH := $(PATH):/my/dir

test:
@echo my new PATH = $(PATH)

それは私が望むようには機能しません。私が達成したいことの例で質問を更新しました。
のSzymonリピンスキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.