web-dev-qa-db-ja.com

makeコマンドのMオプション、Makefile

make -C ~/kernel-2.6 M=`pwd` modules

上記の行のM = 'pwd'の意味は何ですか?

説明が理解できませんでした:

M =オプションを指定すると、モジュールターゲットをビルドする前に、メイクファイルがモジュールソースディレクトリに戻ります。

これをもっと明確にできますか?

22
user1047069

Mmakeのオプションではありません。ハイフンがないことに注意してください。 Mは、makeの実行に割り当てられる変数です。 makeMakefileスクリプトを実行する場合、このスクリプトは変数Mを読み取り、その内容を使用できます。

指定した例では、make~/kernel-2.6Makefileを読み取り、現在の作業ディレクトリを変数Mに割り当てます。通常、これにより、makeMakefileの処理後に現在のディレクトリに戻るようになります。

18
mcabreb

同様のクイズがありました

make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) modules

ここで、makeは私のプロジェクトのディレクトリ内で呼び出されます。 -Cはmakeオプションです:

-C dir、--directory = dir makefileを読み取る前、または他の処理を行う前に、ディレクトリdirに移動します。複数の-Cオプションが指定されている場合、それぞれは前のオプションと比較して解釈されます。-C/ -C etcは-C/etcと同等です。これは通常、makeの再帰的な呼び出しで使用されます。

Mはmakeオプションではなく、それに渡される引数です。 -Cはmakeディレクトリを変更するので、makeはそのディレクトリ内のmakeファイルを読み取ることがわかります。そのディレクトリのmake fileを調べると、Mで何をするのかがわかりました。

-Cが指すディレクトリ内のメイクファイル(Makefileという名前)から(ところで、カーネルビルドディレクトリです):

# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD takes precedence
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif

Linuxデバイスドライバー、第3版、ジョナサンコルベット他による説明:

このコマンドは、まず、そのディレクトリを-Cオプションで提供されたディレクトリ(つまり、カーネルソースディレクトリ)に変更します。そこでカーネルのトップレベルのメイクファイルを見つけます。 M =オプションを指定すると、モジュールターゲットをビルドする前に、メイクファイルがモジュールソースディレクトリに戻ります。

17
4pie0

makeのマニュアルを読む:

-C dir, --directory=dir
            Change to directory dir before reading the makefiles or doing anything else.

呼び出しにより、ディレクトリが~/kernelに変更され、そこでmakeが呼び出されます。つまり、そのディレクトリからMakefileが読み取られます。 M変数を使用すると、makefileは実際のプロジェクトファイルの場所を認識し、その場所に戻すことができます。

重要なのは、独自のmakefileを作成するのではなく、単一の、すべてのバージョンを使用することです。

11
Kerrek SB

他の答えはほとんどが正しいですが、それを学ぶ方法を教えたいと思います。

  1. Mはオプションではありません
  2. MMakefileの変数です
  3. したがって、make -Cが変更されるディレクトリのMakefileを読み取る必要があります。

Makefileを読んでください:コメントはほとんどありません:

# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD take precedence
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif

ifeq ("$(Origin M)", "command line")
  KBUILD_EXTMOD := $(M)
endif

KBUILD_EXTMODを検索できます:

VPATH       := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))

これがカーネルのMakefileがツリー外ソースを構築する方法です。

4
yue shangguan

外部モジュールを構築するコマンドは次のとおりです。

    $ make -C <path_to_kernel_src> M=$PWD

Kbuildシステムは、コマンドで指定された「M =」オプションが原因で外部モジュールがビルドされていることを認識しています。

実行中のカーネルに対してビルドするには、次を使用します。

    $ make -C /lib/modules/`uname -r`/build M=$PWD
2
Zhang Chen

Unixシェルでは、コマンドの途中で`foobar`と書くことは、「コマンドfoobarを実行し、その出力をここで置き換える」ことを意味します。

したがって、makeコマンドにM=`pwd`を含めることは、「pwdコマンドを実行して現在の作業ディレクトリを出力し、M変数をその値に設定する」ことを意味します。

1
Tim Pierce