【问题标题】:Why did not we have ccflags-m, but ccflags-y?为什么我们没有ccflags-m,而是ccflags-y?
【发布时间】:2019-12-16 17:18:06
【问题描述】:

我正在分析 Linux Kernel Makefiles 包。我们可以定义一个额外的编译器标志来使用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 可加载模块?

【问题讨论】:

  • 您错误地理解了ccflags-y 的意图:它适用于所有 目标,无论是模块还是内置。参见例如that answer.

标签: c linux makefile linux-kernel kbuild


【解决方案1】:

实际上,-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是一个布尔y/ n)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 2017-02-11
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多