在Linux内核的makefile中,"make oldconfig "到底是做什么的?

95 人关注

谁能解释一下Linux内核的makefile中的目标 "oldconfig "到底是做什么的? 我看到在一些构建文档中提到了它,但从未解释过它的具体作用。

linux
makefile
linux-kernel
fred basset
fred basset
发布于 2010-11-15
6 个回答
Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams
发布于 2015-07-28
已采纳
0 人赞同

它读取现有的用于旧内核的 .config 文件,并提示用户在当前的内核源中找到文件中没有的选项。当把现有的配置移到一个新的内核上时,这很有用。

Ciro Santilli OurBigBook.com
Ciro Santilli OurBigBook.com
发布于 2015-07-28
0 人赞同

如前所述 作者:伊格纳西奥 在你更新内核源之后,它会为你更新你的 .config ,比如说用 git pull

It tries to keep your existing options.

有一个这样的脚本是有帮助的,因为。

  • 可能增加了新的选项,或删除了旧的选项

  • 内核的Kconfig配置格式有以下选项。

  • imply one another via select
  • depend on another via depends
  • 这些选项关系使得手动配置的解决更加困难。

    让我们手动修改.config以了解它是如何解析配置的

    首先生成一个默认的配置。

    make defconfig
    

    现在手动编辑生成的.config文件以模拟内核更新并运行。

    make oldconfig
    

    来看看会发生什么。一些结论。

  • Lines of type:

    # CONFIG_XXX is not set
    

    不是单纯的评论,而是实际表明参数没有被设置。

    例如,如果我们删除这一行。

    # CONFIG_DEBUG_INFO is not set
    

    并运行make oldconfig,它将询问我们。

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    当它结束时,.config文件将被更新。

    如果你改变了该行的任何字符,例如改为# CONFIG_DEBUG_INFO,则不算数。

  • Lines of type:

    # CONFIG_XXX is not set
    

    始终用于否定一个属性,虽然。

    CONFIG_XXX=n
    

    也被理解为否定。

    例如,如果你删除了# CONFIG_DEBUG_INFO is not set并回答。

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    N,则输出文件包含。

    # CONFIG_DEBUG_INFO is not set
    
    CONFIG_DEBUG_INFO=n
    

    此外,如果我们手动将这一行修改为。

    CONFIG_DEBUG_INFO=n
    

    并运行make oldconfig,则该行被修改为。

    # CONFIG_DEBUG_INFO is not set
    

    没有oldconfig问我们。

  • 没有满足依赖关系的配置,不会出现在.config上。所有其他的都会出现。

    例如,设置。

    CONFIG_DEBUG_INFO=y
    

    并运行make oldconfig。它现在会要求我们提供。DEBUG_INFO_REDUCEDDEBUG_INFO_SPLIT等配置。

    这些房产以前没有出现在defconfig上。

    如果我们在lib/Kconfig.debug下查看它们的定义,我们会发现它们取决于DEBUG_INFO

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    因此,当DEBUG_INFO被关闭时,他们根本就没有出现。

  • 被打开的配置selected会自动设置,不需要询问用户。

    例如,如果CONFIG_X86=y,我们删除了这一行。

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    

    并运行make oldconfig,该行会被重新创建,而不像DEBUG_INFO那样不问我们。

    发生这种情况是因为arch/x86/Kconfig包含。

    config X86
        def_bool y
        [...]
        select ARCH_MIGHT_HAVE_PC_PARPORT
    

    并选择强制该选项为真。另见。https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  • 不符合约束条件的配置被要求提供。

    例如,defconfig曾设定。

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    If we edit:

    CONFIG_64BIT=n
    

    并运行make oldconfig,它将询问我们。

    Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
    

    这是因为RCU_FANOUTinit/Kconfig定义为。

    config RCU_FANOUT
        int "Tree-based hierarchical RCU fanout value"
        range 2 64 if 64BIT
        range 2 32 if !64BIT
    

    因此,如果没有64BIT,最大值为32,但我们在64上设置了.config,这将使其不一致。

  • Bonuses

    make olddefconfig将每个选项设置为默认值,而不需要交互询问。它在make上自动运行,以确保.config是一致的,以防你像我们一样手动修改它。也请参见。https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

    make alldefconfigmake olddefconfig一样,但它也接受一个要合并的配置片段。这个目标被merge_config.sh脚本所使用。https://stackoverflow.com/a/39440863/895245

    而如果你想把.config的修改自动化,那也不是太简单。如何在Linux内核.配置文件中非交互式地开启功能?

    Angelo Babudro
    Angelo Babudro
    发布于 2015-07-28
    0 人赞同

    在你运行 make oldconfig 之前,你需要从一个旧内核中复制一个内核配置文件到新内核的根目录。

    你可以在 /boot/config-3.11.0 中找到运行中系统的旧内核配置文件的拷贝。另外,内核的源代码在 linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig} 中有配置。

    如果你的内核源位于 /usr/src/linux

    cd /usr/src/linux
    cp /boot/config-3.9.6-gentoo .config
    make oldconfig
        
    ted
    不要以root身份构建内核!见 youtube.com/watch?v=fMeH7wqOwXA#t=15m44s
    Šimon Tóth
    Šimon Tóth
    发布于 2015-07-28
    0 人赞同

    用新的/改变的/删除的选项更新一个旧的配置。

    Danial
    Danial
    发布于 2015-07-28
    0 人赞同

    这是种折磨。他们没有包括一个通用的配置文件,而是让你按9000次回车键来生成一个。

    Try: yes "" | make oldconfig
    Nan Xiao
    Nan Xiao
    发布于 2015-07-28
    0 人赞同

    From this :

    Make oldconfig会获取.config并通过Kconfig文件的规则来运行它。 Kconfig文件,并产生一个与Kconfig规则一致的.config。 Kconfig规则。如果有缺失的CONFIG值,make oldconfig会要求它们。

    如果.config已经与Kconfig中的规则一致。 那么制作oldconfig基本上是一个无用功。