Chinaunix首页 | 论坛 | 博客
  • 博客访问: 822336
  • 博文数量: 54
  • 博客积分: 8076
  • 博客等级: 中将
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-01 15:11
文章分类

全部博文(54)

分类: 项目管理

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.1phase4.1-origphase6.0-orig。其中phase4.1phase4.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的,然后才patchphase6.0上面。

事实上我们并不需要checkout phase4.1phase4.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用新版本开发包里面的;scriptsqte目录可以直接拷贝过来;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下的scriptsqte目录拷贝到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的内核、文件系统、应用程序进行编译运行,出现错误时及时修正,然后再commitsvn服务器上。

 

注:在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 “ ”

 

阅读(7357) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~