星期二, 3月 29, 2011

Linux下的patch製作與使用

最近常常使用一些open source做cross complier,
當然總是不太順遂,因為open source的configure寫的並非能符合所有的平台,
有時還必須手動去改Makefile,後來想到用patch的方式協助,
寫個簡單的shell就可以讓其他人用更簡單的方式編譯程式,
這裡拿openssl來做一個簡單的範例:



1. 首先下載openssl-1.0.0d.tar.gz
wget http://www.openssl.org/source/openssl-1.0.0d.tar.gz
2. 解開tar檔
tar xzvf openssl-1.0.0d.tar.gz
3. 進入openssl-1.0.0d/並執行configure,我曾經用linux:'arm-linux-gcc'來指定cc,可是最後share libary都沒有成功編譯出來
./Configure linux-generic32 shared
4. 現在要開始製作patch檔,先複製configure製作的Makefile,再手動修改Makefile裡的定義
cp Makefile Makefile.arm
vim Makefile.arm

修改下面的內容並存檔:
CC= arm-linux-gcc
AR=arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib

5. 修改完成後,我們就有了修改前與修改後兩個版本的Makefile,用diff製作出兩個檔案的差異文件Makefile.patch
diff -Naur Makefile Makefile.arm >> Makefile.patch
6. 手動修改一下Makefile.patch裡的檔案,為他們補上路徑 ,因為patch裡的檔案不可以僅有檔案名稱
--- old/Makefile
+++new/Makefile.arm

 7. 最後寫上一個shell script,內容如下
./Configure linux-generic32 shared
patch -p1 < Makefile.patch
make


patch中的-p1是指跳過一個路徑,也就是剛剛所加的old與new的路徑,會被patch所忽略,若patch找不到要patch的檔案,會有提示訊息要求使用者輸入,這時要檢查patch檔案的路徑是否為遺漏

沒有留言: