分类: 项目管理
2009-08-20 14:26:21
首先从svn服务器checkout一些工程文件,如下所示:
sep@debian:~/project$ tree -L 2
.
|-- phase4.1
| |-- apply
| |-- crosstools
| |-- images
| |-- qte
| |-- scripts
| |-- linux-2.6.18
| `-- uclinux-rootfs
|-- phase4.1-orig
| |-- apply
| |-- crosstools
| |-- linux-2.6.18
| `-- uclinux-rootfs
`-- phase6.0
|-- apply
|-- crosstools
|-- linux-2.6.18
`-- uclinux-rootfs
上图是工作区的tree形二级目录,有三个工程:phase4.1、phase4.1-orig、phase6.0-orig。其中phase4.1和phase4.1-orig纳入svn版本管理,phase6.0是从bcm原始包整理处理出来的,目录命名位置应和phase4.1保持一致。
Ø phase4.1是基于老版本的开发包,对应于版本库
Ø phase4.1-orig是基于老版本的原始代码包,对应于版本库
Ø phase6.0则是基于新版本的原始代码包
现在要做的事情是:将phase4.1所做的开发代码迁移到phase6.0上面,为了制作补丁方便,我们因此要准备phase4.1-orig,所做的补丁首先应该是基于phase4.1-orig的,然后才patch到phase6.0上面。
事实上我们并不需要checkout phase4.1和phase4.1-orig到我们的本机上面的,因为制作补丁时是用svn diff命令的,其格式如下:
svn diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]
制作补丁整个工程大,项目文件多,建议不要一下子给phase目录制作补丁,应该为每个子目录单独制作,这样遇到冲突和拒绝文件时也好解决。
Ø 制作apply(应用程序和库)补丁
svn diff /apply/ /apply/ > apply.diff
Ø 制作uclinux-rootfs(文件系统)补丁
svn diff /uclinux-rootfs/ /uclinux-rootfs/ > uclinux-rootfs.diff
Ø 制作linux-2.6.18(操作系统内核)补丁
svn diff /linux-2.6.18/ / linux-2.6.18/ > linux.diff
一般而言,只需要制作这三个补丁就行了。Crosstools用新版本开发包里面的;scripts和qte目录可以直接拷贝过来;images目录有一些可以直接拷贝过来,有一些要在迁移完毕后重新生成,问题不大。
版本迁移将拿到的三个diff文件分别放到phase6.0的相关子目录下,分步进行patch。以apply.diff为例:
cd ~/project/phase6.0/apply
patch –p0 < apply.diff
在patch过程,可能会提示“patch: **** malformed patch at line 129”之类的错误,这是由于应用patch 时都会检查受影响的行数是否与记录在两个 @@ 之间的数值一致,如果不一致的话,就要打开diff文件手动修改那个数值以符合受影响的行数(这种错误并不多,手动修改是可以接受的)。
如下的patch:
@@ -104,6 +104,8 @@
#define MODULE_PROC_FAMILY "NEVADA "
#elif defined CONFIG_CPU_R8000
#define MODULE_PROC_FAMILY "R8000 "
+#elif defined CONFIG_CPU_R9721
+#define MODULE_PROC_FAMILY "R9721"
+#define MODULE_PROC_ABC "ABC"
#elif defined CONFIG_CPU_R10000
#define MODULE_PROC_FAMILY "R10000 "
#elif defined CONFIG_CPU_RM7000
以上第一行中数字6,表示记录了6行原始文件,数字8表示记录了8行目标文件。
应用这个补丁,patch 就会提示失败,并输出:
patch: **** malformed patch at line xxx
这里,注意红色标注的地方,受影响的行数为3,但是@@之间数值差8-6=2,这两个数值不一致,故报以上错误。将@@ -104,6 +104,8 @@ 改为@@ -104,6 +104,9 @@ 即可成功打上patch。
修改好diff文件,并成功patch上之后,我们要查找相关的拒绝文件(后缀名为.rej),并收到将拒绝的内容添加上去。如下:
sep@debian:~/project/phase6.0/apply$ find -name *.rej
./nexus/modules/led/led.inc.rej
./nexus/modules/led/src/nexus_led.c.rej
./nexus/modules/keypad/keypad.inc.rej
./nexus/modules/keypad/src/nexus_keypad.c.rej
./nexus/platforms/src/nexus_platform_pinmux.c.rej
./nexus/examples/Makefile.rej
./BSEAV/api/include/user_io.h.rej
./BSEAV/api/build/nexus/Makefile.rej
./BSEAV/api/src/nexus/user_io.c.rej
./magnum/basemodules/test/linuxuser/btst_kni.c.rej
./magnum/basemodules/test/linuxclient/btst_kni.c.rej
做到这一步,没有技巧可言,找到.rej文件,打开它,在相应的文件上添加被拒绝的内容。
注:patch apply目录时的.rej文件是比较多的,需要耐心解决这些冲突。其他子目录依次按这样进行迁移。
完成后,将phase4.1下的scripts、qte目录拷贝到phase6.0下。接着:
cd ~/project/phase6.0
find –name *.svn* | xargs rm –rf (把以前的svn信息删除)
cd ..
svn import ~/project/phase6.0 -m “import phase6.0” (把本地工作拷贝phase6.0导入到svn服务器)
之后,尝试对phase6.0的内核、文件系统、应用程序进行编译运行,出现错误时及时修正,然后再commit到svn服务器上。
注:在svn import时,crosstools目录下有一些目标文件(后缀名为.o)并没有被纳入svn管理,按如下处理:
cd ~/project/phase6.0/crosstools
find –name *.o | xargs svn add
find –name *.la | xargs svn add
svn ci –m “ ”