为什么我们没有 ccflags-m,而是 ccflags-y?

Why did not we have ccflags-m, but ccflags-y?

我正在分析 Linux 内核 Makefile 的包。我们可以定义一个额外的编译器标志来构建带有 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 :=

据我了解 ymkbuild 中的含义,m - 用于可加载模块,y - 用于内置。所以用 ccflags-y 指定编译器选项似乎不合逻辑,而不是 ccflags-m.

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

实际上,不同的后缀-m-y只是为了确定目标文件的最终用途:

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

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

Makefile 中的典型场景如下:

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

这里CONFIG_FOO是一个三态选项(y/m/n)但是CONFIG_FOO_DEBUG是一个 bool (y/n).