1

我正在分析 Linux KernelMakefile的捆绑包。我们可以定义一个额外的编译器标志来构建外部模块ccflags-y += -std=gnu11 -Wno-declaration-after-statement -Werror。我查看了Makefile.build哪个外部模块构建下降,甚至没有注意到ccflags-m定义的选项。完整的选项列表:

obj-y :=
obj-m :=
lib-y :=
lib-m :=
always :=
targets :=
subdir-y :=
subdir-m :=
EXTRA_AFLAGS   :=
EXTRA_CFLAGS   :=
EXTRA_CPPFLAGS :=
EXTRA_LDFLAGS  :=
asflags-y  :=
ccflags-y  :=
cppflags-y :=
ldflags-y  :=

subdir-asflags-y :=
subdir-ccflags-y :=

据我了解y, m -m用于kbuild可加载模块, y - 用于内置模块。ccflags-y所以用, not来指定编译器选项似乎不合逻辑ccflags-m

问题:为什么没有ccflags-y可加载模块的-m对应项?ccflags-m

4

1 回答 1

4

实际上,不同的后缀-m-y仅用于确定 目标文件的最终目的:

  1. obj-y用于将给定的目标文件构建为内置的,并将obj-m它们构建为模块
  2. subdir-y并且subdir-m用于更复杂的事情。
  3. lib-y并且lib-m是相同的:两者都将对象构建到库中。

但是标志(编译器或链接器)无条件地应用于对象,因此它们只有-y后缀。

Makefile 中的典型场景如下所示:

obj-$(CONFIG_FOO) := foo.o
ccflags-$(CONFIG_FOO_DEBUG)  := -DFOO_DEBUG

CONFIG_FOO是一个三态选项(y/ m/ n),但CONFIG_FOO_DEBUG它是一个布尔值y/ n)。

于 2019-12-16T22:45:23.550 回答