为什么我们没有 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 :=
据我了解 y
和 m
在 kbuild
中的含义,m - 用于可加载模块,y - 用于内置。所以用 ccflags-y
指定编译器选项似乎不合逻辑,而不是 ccflags-m
.
问题:为什么 ccflags-y
没有 -m
对应的 ccflags-m
可加载模块?
实际上,不同的后缀-m
和-y
只是为了确定目标文件的最终用途:
obj-y
用于构建给定的目标文件作为内置,obj-m
用于将它们构建为模块
subdir-y
和 subdir-m
用于更复杂的事情。
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
是一个 bool (y
/n
).
我正在分析 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 :=
据我了解 y
和 m
在 kbuild
中的含义,m - 用于可加载模块,y - 用于内置。所以用 ccflags-y
指定编译器选项似乎不合逻辑,而不是 ccflags-m
.
问题:为什么 ccflags-y
没有 -m
对应的 ccflags-m
可加载模块?
实际上,不同的后缀-m
和-y
只是为了确定目标文件的最终用途:
obj-y
用于构建给定的目标文件作为内置,obj-m
用于将它们构建为模块subdir-y
和subdir-m
用于更复杂的事情。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
是一个 bool (y
/n
).