有人能解释一下目标"oldconfig“在Linux内核makefile中到底做了什么吗?我在一些构建文档中看到了它的引用,但从来没有解释过它到底做了什么。
发布于 2015-08-11 07:49:12
摘要
正如前面提到的,在更新内核源代码(例如使用伊格纳西奥 )之后,它会为您更新.config
。
它试图保留你现有的选择。
为此编写一个脚本是有帮助的,因为:
- imply one another via `select`
- depend on another via `depends`
这些选项关系使得手动配置解析更加困难。
让我们手动修改.config以了解它是如何解析配置的
首先,使用以下方法生成默认配置:
make defconfig
现在手动编辑生成的.config
文件以模拟内核更新并运行:
make oldconfig
看看会发生什么。一些结论:
make oldconfig
,它会问我们:
用调试信息(DEBUG_INFO) 不/?编译内核
当它结束时,.config
文件将被更新。
如果您将行中的任何字符更改为# CONFIG_DEBUG_INFO
,则不计在内。# CONFIG_DEBUG_INFO is not set
并回答:
用调试信息(DEBUG_INFO) 不/?编译内核
使用N
时,输出文件contains:CONFIG_DEBUG_INFO不会被设置,并且不会:
CONFIG_DEBUG_INFO=n
此外,如果我们手动修改行以:
CONFIG_DEBUG_INFO=n
然后运行make oldconfig
,那么行得到修改,to:CONFIG_DEBUG_INFO就不会被oldconfig
问到。.config
上。其他人都有。
例如,设置:
CONFIG_DEBUG_INFO=y
运行make oldconfig
。现在它将要求我们:DEBUG_INFO_REDUCED
,DEBUG_INFO_SPLIT
,等等。
这些属性以前没有出现在defconfig
上。
如果我们在lib/Kconfig.debug
下面定义了它们,我们就会发现它们依赖于DEBUG_INFO
:
配置DEBUG_INFO_REDUCED bool“减少调试信息”依赖于DEBUG_INFO
所以当DEBUG_INFO
不在的时候,他们根本没有出现。selected
是通过打开信任而自动设置的,无需询问用户。
例如,如果CONFIG_X86=y
和我们删除行:
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
然后运行make oldconfig
,就可以在不需要我们询问的情况下重新创建该行,这与DEBUG_INFO
不同。
之所以会发生这种情况,是因为arch/x86/Kconfig
包含:
配置X86 def_bool y ..。选择ARCH_MIGHT_HAVE_PC_PARPORT
并选择强制该选项为真。另见:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfigdefconfig
设置:
CONFIG_64BIT=y CONFIG_RCU_FANOUT=64
如果我们编辑:
CONFIG_64BIT=n
运行make oldconfig
,它会问我们:
基于树的分层RCU扇出值(RCU_FANOUT) 32
这是因为RCU_FANOUT
在init/Kconfig
中定义为:
配置RCU_FANOUT int“基于树的分层RCU扇出值”范围为2 64 if 64位范围2 32 if!64位
因此,如果没有64BIT
,最大值是32
,但是我们在.config
上设置了64
,这将使其不一致。奖金
make olddefconfig
将每个选项设置为其默认值,而不进行交互询问。它在make
上自动运行,以确保.config
是一致的,以防您像我们一样手动修改它。另见:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree
make alldefconfig
类似于make olddefconfig
,但它也接受要合并的配置片段。这个目标由merge_config.sh
脚本使用:https://stackoverflow.com/a/39440863/895245
如果您想要自动化.config
修改,这并不是太简单:如何非交互地打开Linux内核.config文件中的特性?
https://stackoverflow.com/questions/4178526
复制相似问题