49

共通のメイクファイルを使用して、いくつかのビルド情報を統合しようとしています。私の問題は、さまざまなサブディレクトリ レベルからその makefile を使用したいということです。これにより、作業ディレクトリの値 ( pwd) が予測できなくなります。例えば:

# Makefile.common
TOP := $(shell pwd)
COMPONENT_DIR := $(TOP)/component
COMPONENT_INC := $(COMPONENT_DIR)/include
COMPONENT_LIB := $(COMPONENT_DIR)/libcomponent.a

Makefile.commonこのようにサブディレクトリからインクルードすると、$(TOP)ディレクトリが正しくなく、他のすべてがそれに続きます。

# other_component/Makefile
include ../Makefile.common
# $(COMPONENT_LIB) is incorrectly other_component/component

気まぐれな代わりに、独自のMakefile.commonディレクトリパスを使用するための最良の方法は何ですか?pwd

4

5 に答える 5

71

次のように、 MAKEFILE_LIST 変数を使用できるはずです。

# This must be the first line in Makefile.common
TOP := $(dir $(firstword $(MAKEFILE_LIST)))

ドキュメントから:

make は、MAKEFILES 変数、コマンド ライン、デフォルト ファイル、または include ディレクティブから取得したものを含め、さまざまな Makefile を読み取るため、それらの名前が MAKEFILE_LIST 変数に自動的に追加されます。それらは、make が解析を開始する直前に追加されます。これは、makefile が最初にこの変数の最後の単語を調べる場合、それが現在の makefile の名前になることを意味します。ただし、現在のメイクファイルがインクルードを使用すると、最後の単語はインクルードされたばかりのメイクファイルになります。

于 2008-11-27T23:05:22.703 に答える
10

これは別の依存関係(つまり、realpathバイナリ)を追加するため、適切なスタイルではありません。ユースケースによっては、それで問題ない場合があります。

ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

realpathがインストールされていない場合:

$ sudo apt-get install realpath # on debian and derivatives

編集:後者は遅延バインディングを使用する原因となり、後のインクルードのために変更された可能性があるため、:=代わりに必ず使用してください。=makeMAKEFILE_LIST

于 2010-03-30T19:13:43.983 に答える
2

一般的なものをに書き込みcommon.mkます。次に、common.mkを、Makeがincludeステートメントを検出したときに検索するデフォルトのディレクトリに配置します。Makeが探す一般的なディレクトリについては、マニュアルを参照してください。

common.mkをカスタムディレクトリに配置してから、と入力することもできます make -I customdir

各サブフォルダーのMakefile内で、

include common.mk

以上です。パスや物事の移動について心配する必要はありません。

于 2012-04-22T04:23:40.633 に答える
2

私の解決策:

cwd  :=  $(shell readlink -en $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))) 

これはmake -f /opt/some/dir/Makefile whenn your in のような呼び出しにも機能します/opt/other/path/subdir

于 2015-01-29T08:12:13.770 に答える
2

あなたはやってみましたか:

# Makefile.common
TOP ?= $(shell pwd)
COMPONENT_DIR := $(TOP)/component
COMPONENT_INC := $(COMPONENT_DIR)/include
COMPONENT_LIB := $(COMPONENT_DIR)/libcomponent.a

# other_component/Makefile
TOP ?= ..
include ../Makefile.common

?= コンストラクトを使用すると、すでに設定されている場合に TOP が再定義されなくなります。make を呼び出したときのツリー内の位置に基づいて、適切な値に設定できます。GNU make を使用してからしばらく経っていることを認めます。そのため、これが機能しないか、微調整が必​​要になる可能性があります。

于 2008-11-27T04:44:26.623 に答える