make -C ~/kernel-2.6 M=`pwd` modules
上記の行のM = 'pwd'の意味は何ですか?
説明が理解できませんでした:
M =オプションを指定すると、モジュールターゲットをビルドする前に、メイクファイルがモジュールソースディレクトリに戻ります。
これをもっと明確にできますか?
M
はmake
のオプションではありません。ハイフンがないことに注意してください。 M
は、make
の実行に割り当てられる変数です。 make
がMakefile
スクリプトを実行する場合、このスクリプトは変数M
を読み取り、その内容を使用できます。
指定した例では、make
は~/kernel-2.6
のMakefile
を読み取り、現在の作業ディレクトリを変数M
に割り当てます。通常、これにより、make
がMakefile
の処理後に現在のディレクトリに戻るようになります。
同様のクイズがありました
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 =オプションを指定すると、モジュールターゲットをビルドする前に、メイクファイルがモジュールソースディレクトリに戻ります。
make
のマニュアルを読む:
-C dir, --directory=dir
Change to directory dir before reading the makefiles or doing anything else.
呼び出しにより、ディレクトリが~/kernel
に変更され、そこでmake
が呼び出されます。つまり、そのディレクトリからMakefile
が読み取られます。 M
変数を使用すると、makefileは実際のプロジェクトファイルの場所を認識し、その場所に戻すことができます。
重要なのは、独自のmakefileを作成するのではなく、単一の、すべてのバージョンを使用することです。
他の答えはほとんどが正しいですが、それを学ぶ方法を教えたいと思います。
M
はオプションではありませんM
はMakefile
の変数です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
がツリー外ソースを構築する方法です。
外部モジュールを構築するコマンドは次のとおりです。
$ make -C <path_to_kernel_src> M=$PWD
Kbuildシステムは、コマンドで指定された「M =」オプションが原因で外部モジュールがビルドされていることを認識しています。
実行中のカーネルに対してビルドするには、次を使用します。
$ make -C /lib/modules/`uname -r`/build M=$PWD
Unixシェルでは、コマンドの途中で`foobar`
と書くことは、「コマンドfoobar
を実行し、その出力をここで置き換える」ことを意味します。
したがって、make
コマンドにM=`pwd`
を含めることは、「pwd
コマンドを実行して現在の作業ディレクトリを出力し、M
変数をその値に設定する」ことを意味します。