“make oldconfig”在Linux内核makefile中完全做了什么?

时间:2010-11-14 16:52:49

标签: linux makefile linux-kernel

任何人都可以解释目标“oldconfig”在Linux内核makefile中的作用吗?我在一些构建文档中看到它被引用但从未解释过它的确切内容。

6 个答案:

答案 0 :(得分:109)

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

答案 1 :(得分:20)

在运行'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

答案 2 :(得分:15)

<强>摘要

如上所述by 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等配置。

    这些属性之前没有出现在defconfig上。

    如果我们查看定义它们的lib/Kconfig.debug,我们会发现它们依赖于DEBUG_INFO

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    所以当DEBUG_INFO关闭时,它们根本没有出现。

  4. 启动配置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
    

    并选择强制该选项为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_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,这会使其不一致。

    < / LI>

    <强>奖金

    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修改,那不是太简单:How do you non-interactively turn on features in a Linux kernel .config file?

答案 3 :(得分:5)

使用新/更改/删除选项更新旧配置。

答案 4 :(得分:2)

从此page

  

make oldconfig接受.config并通过规则运行它   Kconfig文件并生成一个与.con一致的.config   Kconfig规则。如果缺少CONFIG值,则make   oldconfig会要求他们。

     

如果.config已经与Kconfig中的规则一致,   然后make oldconfig本质上是一个无操作。

     

如果要运行make oldconfig,然后运行make oldconfig a   第二次,第二次不会引起任何额外的改变   制成。

答案 5 :(得分:0)

这是折磨。它们不会包含通用配置文件,而是让您返回9000次以生成一个。