“ make oldconfig”在Linux内核makefile中到底有什么作用?


81

谁能解释一下目标“ oldconfig”在Linux内核makefile中到底做了什么?我在某些构建文档中看到了它的引用,但从未解释它的确切功能。

Answers:


125

它读取现有.config文件,并提示用户输入当前内核源中未在文件中找到的选项。当采用现有配置并将其移至新内核时,这很有用。


谢谢,非常有帮助。
fred basset 2010年

嗨,我测试了u-boot代码(它也使用Kconfig)。我使用了“ make menuconfig”并将其设置为arm体系结构(并生成了一个新的.config文件。默认体系结构为Sandbox。)。然后我做了'make menuconfig',发现仍然选择了arm体系结构。因此,如果有.config,则“ make menuconfig”从该.config文件开始。那么目标'menuconfig'和'oldconfig'的作用相同吗?
灿金

25

在运行之前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

3
不要以root身份构建内核!看到youtube.com/watch?v=fMeH7wqOwXA#t=15m44s
泰德

24

概要

Ignacio所述,它.config会在您更新内核源代码后为您更新您的代码,例如使用git pull

它试图保留您现有的选项。

拥有一个脚本对此很有帮助,因为:

  • 可能已添加新选项,或已删除旧选项

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

    • 通过暗示彼此 select
    • 依靠另一个 depends

    这些选项关系使手动配置解析更加困难。

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

首先使用以下命令生成默认配置:

make defconfig

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

make oldconfig

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

  1. 类型行:

    # 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,则不计入。

  2. 类型行:

    # 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问我们。

  3. 不满足依赖性的配置不会出现在 .config。所有其他人都这样做。

    例如,设置:

    CONFIG_DEBUG_INFO=y
    

    然后跑make oldconfig。现在它将要求我们:DEBUG_INFO_REDUCEDDEBUG_INFO_SPLIT,等CONFIGS。

    这些属性未显示在 defconfig之前。

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

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    所以什么时候 DEBUG_INFO他们离开的时候,他们根本没有露面。

  4. 的配置是 selected通过开启CONFIGS自动设置而无需询问用户。

    例如,如果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
    

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

  5. 要求不满足其约束的配置。

    例如,defconfig已设置:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    如果我们编辑:

    CONFIG_64BIT=n
    

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

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

    这是因为RCU_FANOUT定义init/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,这将使其不一致。

奖金

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文件中的功能?



2

从此页面

Make oldconfig将使用.config并通过Kconfig文件的规则运行它,并生成一个与Kconfig规则一致的.config。如果缺少CONFIG值,make oldconfig将要求它们。

如果.config已经符合Kconfig中的规则,则make oldconfig本质上是无操作的。

如果要运行make oldconfig,然后再次运行make oldconfig,则第二次将不会导致进行任何其他更改。


1

酷刑。他们没有包含通用的conf文件,而是使您按回车9000次生成一个。


6
试试:yes "" | make oldconfig
Ray Donnelly
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.