gpt4 book ai didi

linux - 内核模块编译和 KBUILD_NOPEDANTIC

转载 作者:IT王子 更新时间:2023-10-29 00:27:44 25 4
gpt4 key购买 nike

我注意到最近的内核(从 2.16.24 开始?)不喜欢在外部模块 Kbuild 文件中更改 CFLAGS。如果 CFLAGS 被更改,Linux 内核 Kbuild 系统将发出以下错误:

scripts/Makefile.build:46: *** CFLAGS was changed in "/some/path". Fix it to use EXTRA_CFLAGS.  Stop.

来自 here :

External modules have in a few cases modifed gcc option by modifying CFLAGS. This has never been documented and was a bad practice.

来自 LKML 的附加电子邮件

为什么这是个坏主意?什么是理性?

最佳答案

首先,可能值得一提的是 EXTRA_CFLAGS不久前已被弃用并被 ccflags-y 取代.您可以阅读 ccflags-y 的意图。在 Documentation/kbuild/makefiles.txt , 第 3.7 节。

基本上,此变量允许您将设置附加到 C 编译标志集,仅在分配它的文件范围内。您不应该更改全局标志,因为那可能 具有超出您自己的 makefile 的全局影响,这被认为是不好的做法。您提到的检查证实,全局标志确实没有被包含的 makefile 更改。

查看 ccflags-y 的方式很有趣,以前称为 EXTRA_CFLAGS ,最终在构建过程中使用。追踪一些相关点(但不是全部,因为这是留给读者的练习 ;-) )显示以下内容:

EXTRA_CFLAGS仍然可以使用,根据scripts/Makefile.lib

1 # Backward compatibility
2 asflags-y += $(EXTRA_AFLAGS)
3 ccflags-y += $(EXTRA_CFLAGS)

同一个文件显示了 ccflags-y最终出现在 C 编译标志中(并且还向您展示了您可以随意使用另一个变量,称为 CFLAGS_<filename>.o ):

104 orig_c_flags   = $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(KBUILD_SUBDIR_CCFLAGS) \
105 $(ccflags-y) $(CFLAGS_$(basetarget).o)
106 _c_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags))
...
133 __c_flags = $(_c_flags)
...
147 c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
148 $(__c_flags) $(modkern_cflags) \
149 -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)

然后在scripts/Makefile.build ,编译规则定义为:

234 cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<

请注意,这些都是递归扩展的变量,使用=而不是 := , 这意味着你自己的值(value) ccflags-y当您在自己的 makefile 中定义它时,它会被插入到 cflags中。

最后关于KBUILD_NOPEDANTIC ,你在标题中提到但在实际问题中没有提到。此测试更改了 CFLAGS 的值可以通过提供 KBUILD_NOPEDANTIC 来禁用任何值——参见 scripts/Makefile.build

47 ifeq ($(KBUILD_NOPEDANTIC),)
48 ifneq ("$(save-cflags)","$(CFLAGS)")
49 $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y)
50 endif
51 endif

此答案中引用的文件均已于今天检索。

现在...不是这方面的专家,在写下整个故事后进一步查看 makefile,有一件事我也不明白。在我看来CFLAGS未在构建系统中使用(不是隐式地,也不是显式地),而是 KBUILD_CFLAGS是。所以我想知道这是否检查了 CFLAGS 中的更改实际上应该检查 KBUILD_CFLAGS 中的变化相反。

关于linux - 内核模块编译和 KBUILD_NOPEDANTIC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com