HACK#5 使用checkpatch.pl检查补丁的格式
本节介绍发布前检查补丁格式的方法。
Linux内核是由多个开发者进行开发的。因此,为了保持补丁评估与源代码的可读性,按照统一的规则进行编写是非常重要的。编写规则写在Linux内核源代码的Documentation/CodingStyle中。所有开发者必须先阅读规则内容,遵照这些规则进行编写后再将补丁发布到论坛上。
话虽如此,但要从一开始就将这些规则完全记住也是不太可能的。因此Linux内核的源码树内准备了用来检查补丁格式的脚本scripts/patchcheck.pl。下面将介绍使用这个脚本来检查补丁格式的方法。
检查格式的示例
首先,看一个对源代码进行一些简单修改并生成补丁的例子。在fs/namei.c内的符号链接系统调用(symbolic link system call)的入口函数中添加printk()。这个补丁wrong-patch-example.patch的内容如下所示。
From 6064092a8a276fa6e09755872193cfe1e4a16f42 Mon Sep 17 00:00:00 2001
From:Munehiro"Muuhh"Ikeda<m_ikeda@hogeraccho.com>
Date:Sun,22 May 2011 14:54:58-0700
Subject:[PATCH]wrong patch example
Added printk()on sys_symlink().
fs/namei.c|1+
1 files changed,1 insertions(+),0 deletions(-)
diff—git a/fs/namei.c b/fs/namei.c
index e3c4f11..d40214a 100644
—-a/fs/namei.c
+++b/fs/namei.c
@@-2912,6+2912,7@@out_putname:
SYSCALL_DEFINE2(symlink, const charuser*,oldname, const charuser*,
newname)
{
+printk(KERN_DEBUG"[TRIAL]trying symlink:%s—>%s¥n",oldname, newname);
return sys_symlinkat(oldname, AT_FDCWD, newname);
}
—
1.7.4
当检查补丁的格式时,需在内核源码树的根下,以补丁文件名为变量执行scripts/checkpatch.pl。当不指定任何选项时,含有格式错误的行的内容也会输出。在这里如果指定—terse选项,就可以将各错误或警告的概要分别在1行中输出。
$scripts/checkpatch.pl—terse wrong-patch-example.patch
wrong-patch-example.patch:19:WARNING:line over 80 characters
wrong-patch-example.patch:19:ERROR:space prohibited after that open
parenthesis'('
wrong-patch-example.patch:19:ERROR:space prohibited before that close
parenthesis')'
wrong-patch-example.patch:25:ERROR:Missing Signed-off-by:line(s)
total:3 errors,1 warnings,7 lines checked
短短1行的补丁,竟然输出了这么多的内容。这些内容依次分别是针对下列内容的错误或警告。
·[警告]1行的字数超过80字。
·[错误]前括号“(”后面有多余的空格。
·[错误]后括号“)”前面有多余的空格。
·[错误]没有Signed-off-by(补丁发布人的署名)。
前3个是关于编写规则的错误或警告,最后1个是编写规则之外的补丁格式的错误。
对这些错误进行修改,将较长的行分成两行,删除不需要的空格并添加在Signed-off-by后,补丁的内容就如下所示。
From cb24866e8c989f55abebc3e6bf879cf3d17d3e87 Mon Sep 17 00:00:00 2001
From:Munehiro"Muuhh"Ikeda<m_ikeda@hogeraccho.com>
Date:Sun,22 May 2011 14:54:58-0700
Subject:[PATCH]correct patch example
Added printk()on sys_symlink().
Signed-off-by:Munehiro"Muuhh"Ikeda<m_ikeda@hogeraccho.com>
fs/namei.c|2++
1 files changed,2 insertions(+),0 deletions(-)
diff—git a/fs/namei.c b/fs/namei.c
index e3c4f11..1c47443c 100644
—-a/fs/namei.c
+++b/fs/namei.c
@@-2912,6+2912,8@@out_putname:
SYSCALL_DEFINE2(symlink, const charuser*,oldname, const charuser*,
newname)
{
+printk(KERN_DEBUG"[TRIAL]trying symlink:%s—>%s¥n",
+oldname, newname);
return sys_symlinkat(oldname, AT_FDCWD, newname);
}
—
1.7.4