2010-12-29 11 views
4

現在実行中のメイクファイルが存在するディレクトリを取得する正しい方法は何ですか?ディレクトリmakefileの取得方法は

私は現在export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))を使用していますが、まったく同じオプションでmakeを実行するとROOTの値が異なるといういくつかの問題が発生しています。時間の約90%が正しい値を持っていますが、残りの10%に無効なパスがいくつかあります。

+0

は本当にあなたが使用make' 'OSに依存し、$をエコー(LinuxのGNU makeを?) – reinierpost

答えて

4

makefileがpwd以外のディレクトリに存在する可能性があります(make -fで許可されているように)$(shell pwd)が正しくありません。

OPの提案

export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST)))) 

を除いて、結構です、S /彼はおそらく、特にROOTにassigingする前に、トップレベルのmakefile(潜在的に)includeの他のメイクファイル(複数可)場合は、代わりにfirstwordを使用したいです。条件があった場合は10%の問題を説明することができ

OPSが10前の割り当てまでの時間の%、しかし、ちょっと、それは推測だ...

10

realpathabspathlastwordやカップルが含まれますより多くの機能がGNU Make 3.81に導入されました。今、あなたはwordswordを使用して古いバージョンで現在のファイル名を取得することができます:

THIS_MAKEFILE:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) 

しかし、私はシェルに行かなくてもrealpathの回避策のを確認していません。例えばこれは、make v3.80で動作します:

$ make -f ../M 
This makefile is M in the /home/sandipb directory 

参考与え

THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) 
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) 
THIS_MAKEFILE:=$(notdir $(THIS_MAKEFILE_PATH)) 

all: 
     @echo "This makefile is $(THIS_MAKEFILE) in the $(THIS_DIR) directory" 

:あなたの便宜のためにhttp://cvs.savannah.gnu.org/viewvc/make/NEWS?revision=2.93&root=make&view=markup

1

、(それがどんな-Cオプションを処理した後に)GNUの開始を作る を変数CURDIRに現在の作業ディレクトリのパス名を設定します。この値 は、makeによって再び変更されることはありません。特に、 ディレクトリのファイルをインクルードすると、CURDIRの値は変更されません。デフォルトでは、環境変数CURDIRは にこの値を上書きしません。これは、メイクファイルに設定されている場合、値は と同じ優先順位を持ちます。この変数を設定しても、 makeの動作に影響はないことに注意してください(makeはその作業ディレクトリを変更するなどしません)。

すべて: は(CURDIR)

関連する問題