7

在两个相对较远的提交之间对 Linux 内核源代码树进行二等分时,前几个二等分步骤通常会更改大量内核源代码,因此是否make distclean运行,不会有太大的区别。但是,随着二分范围越来越窄,每一步更改的源文件越来越少,因此清理源树会删除很多 *.o不需要重建的文件。

由于make通过比较它们的最后修改时间与其关联的源文件的最后修改时间来推断需要重建的目标文件,我认为没有必要在每个二等分步骤之后清理树,但无论如何我都会这样做作为预防措施之后我遇到了这样一种情况,漫长的二分过程最终让我陷入了与所讨论的错误无关的“错误”提交。

具体来说,这是我在第一次平分尝试中使用的步骤(这让我进入了错误的提交):

cp /boot/config-`uname -r` .config
make oldconfig
make && sudo make modules_install && sudo make install
# reboot
# Then I repeat the following steps until the bisection ends.
# test the kernel
git bisect {good,bad}
make && sudo make modules_install && sudo make install
# reboot

我使用以下过程再次一分为二,并且能够成功到达错误的提交:

make distclean
cp /boot/config-`uname -r` .config
make oldconfig
make && sudo make modules_install && sudo make install
# reboot
# test the kernel
git bisect {good,bad}
# Then I repeat the steps above until the bisection ends.

由于我对 kenrel 构建系统的内部知识不是很了解,如果有人能指出我可以避免在每个二等分步骤后清理和重建整个内核的某种方式,那就太好了,因为这样可以节省我大量的构建时间,并将大大缩短二分过程。

4

1 回答 1

3

来自 男人

make 程序使用 makefile 数据库和文件的最后修改时间来决定哪些文件需要更新。

和一个快速的实验

$ stat -c%y bar.txt
2013-05-11 22:58:46.499826200 -0500

$ git checkout HEAD~1
HEAD 现在位于 e7b9f1c... 首先

$ stat -c%y bar.txt
2013-05-11 22:58:52.583836900 -0500

如您所见,执行 acheckout会更改文件的修改时间,进而强制使用make. 所以答案是否定的,没有必要清理树,因为必要的文件将被重新编译。

于 2013-05-12T04:02:56.217 回答