LinuxカーネルのMakefileはどのように.configを理解しますか? defconfigファイルのパーサーはありますか? defconfigから有効なオプションごとに多くの#defineを生成し、.configファイルのディレクティブに基づいてコンパイルされているかどうかに関係なく多くのマイナーなMakefileを維持する必要があります。
.config
ファイルの構文はmakeと互換性があります。たとえば、CONFIG_CRC16=m
のような行は、make変数CONFIG_CRC16
を値m
に設定します。 makeによって解析され、トップレベルのMakefile
に間接的に含まれます。
Makefile
には-include include/config/auto.conf
が含まれていますinclude/config/auto.conf
は、Makefile
ターゲットでトップレベルのsilentoldconfig
を再帰的に呼び出すことによって構築されます。ファイルの条件付きコンパイルは、主にターゲット名で遊ぶことによって行われます。makefileには次のようなルールが含まれます
obj-$(CONFIG_CRC16) += crc16.o
したがって、ターゲットobj-y
は、構成オプションによって組み込みとして有効になっているすべてのオブジェクトをビルドし、obj-m
は、モジュールとして有効になっているすべてのオブジェクトをビルドします。より複雑な場合のために、メイクファイルには条件付きディレクティブもあります。
C言語での条件付きコンパイルの場合、Cソースファイルにはinclude/generated/autoconf.h
のような行を含む#define CONFIG_CRC16_MODULE 1
が含まれます。このファイルは、xxxconfig
ターゲット(oldconfig
のバッチターゲットの場合はinclude/config/auto.conf
、xconfig
の場合はscripts/kconfig/conf
など)によって呼び出されるプログラムによってscripts/kconfig/qconf
から生成されます。そのソースコードはscripts/kconfig/confdata.c
で、非常に単純なテキスト処理を行います。