web-dev-qa-db-ja.com

makefileにインクルードをファイルの場所に相対的にする

この質問 に直接関連しています。 makefileのincludeディレクティブを現在のスクリプトの場所に対して相対的に動作させるにはどうすればよいですか?

currentパスは任意であり、制御できないと仮定します。 makefileの場所のみがわかっています。 makefileはルートファイルではなく、含まれています。それがまさにそれがAndroid NDKにある方法です。

現在のメイクファイルの名前を持つ組み込み変数はありますか?パスだけを残して、ファイル名を削除できますか? Cygwinでmake3.81を使用します。

19
Seva Alekseyev

現在処理されているメイクファイルの名前は、 MAKEFILE_LIST組み込み変数 から取得できます。

現在のmakefileが含まれている最後のmakefileであるとすると(つまり、現在のスクリプトの開始以降、別のincludeディレクティブを使用していません) )、スクリプト自体へのパスは次のようになります。

SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))

これで、同じディレクトリにスクリプトを含めることができます(スラッシュがないことに注意してください。すでに$(dir ...)によって追加されています)。

include $(SELF_DIR)another.mk

注:GNU Make 3.80にはlastword組み込み関数はありませんでした。その場合、$(lastword ...)$(call lastword,...)に置き換えて次のように実装できます。

lastword = $(if $(firstword $1),$(Word $(words $1),$1))
17

現在のメイクファイルの名前を持つ組み込み変数はありますか?

はい、あります。$ {CURDIR}を使用してください。これはトップレベルのMakefileが配置されているディレクトリであるため、そこから何も削除する必要はありません。

http://www.gnu.org/software/make/manual/make.html#Recursion

6
user1036181

相対パスが機能することがわかりました(GNUMake 3.81)が、機能しない場合は、次のことを試してください。

include $(abspath ../whatever)
2
Beta