Seperti telah disebutkan diatas, seseorang dapat mem-patch source original dengan hanya membuat perubahaan dalam direktori source yang telah dibongkar. Contoh nyata dari hal ini adalah cron. Jika Anda mengambil paket source cron lalu melihat isi .diff.gz maka Anda akan melihat bahwa beberapa berkas paket source original telah diubah.
apt-get source cron zgrep +++ cron*.diff.gz
Tapi seperti telah kita singgung sebelumnya bahwa cara ini bukan cara terbaik untuk menunjukkan patch. Salah satu cara yang lebih baik adalah dengan membuat berkas patch secara individu, tapi menaruhnya di debian/patches/ dan menerapkan patch (menggunakan patch) di debian/rules. Cara inilah yang digunakan untuk udev:
apt-get source udev zgrep +++ udev*.diff.gz ls udev*/debian/patches/ less udev*/debian/rules
Berkas rules memiliki peraturan berikut untuk menerima dan tidak menerima patch:
# Apply patches to the package
patch: patch-stamp
patch-stamp:
dh_testdir
@patches=debian/patches/*.patch; for patch in $$patches; do \
test -f $$patch || continue; \
echo "Applying $$patch"; \
patch -stuN -p1 < $$patch || exit 1; \
done
touch $@
# Remove patches from the package
unpatch:
dh_testdir
@if test -f patch-stamp; then \
patches=debian/patches/*.patch; \
for patch in $$patches; do \
reversepatches="$$patch $$reversepatches"; \
done; \
for patch in $$reversepatches; do \
test -f $$patch || continue; \
echo "Reversing $$patch"; \
patch -suRf -p1 < $$patch || exit 1; \
done; \
rm -f patch-stamp; \
fi
Semua ini terlihat sangat baik, tapi bagaimana cara kita membuat patch baru untuk udev dengan menggunakan skema ini? Pendekatan yang umum adalah dengan:
salin isi source yang ada ke direktori sementara
terapkan seluruh patch ke berkas yang ingin Anda sunting; Jika Anda ingin membuat patch baru, terapkan seluruh patch yang telah ada. (hal ini penting karena patch yang ada tergantung dari patch sebelumnya)
Jika Anda ingin, dapat pula menggunakan debian/rules untuk ini: caranya hapus patch yang datang *setelah* patch yang ingin Anda sunting, lalu jalankan 'debian/rules patch'. Nama sebenarnya untuk target patch bervariasi, Saya pribadi sejauh ini telah melihat beberapa nama yang digunakan: patch setup apply-patches unpack patch-stamp. Anda perlu melihat di dalam debian/rules untuk mengetahui nama yang digunakan untuk target patch.
salin lagi seluruh isi source:
cp -a /tmp/old /tmp/new
masuk ke /tmp/new, dan lakukan modifikasi
kembali ke direktori source original Anda, lalu generate patch dengan:
diff -Nurp /tmp/old /tmp/new > mypatchname.patch
Mari kita membuat patch baru untuk udev dengan nama 90_penguins.patch yang isinya mengganti kata Linux dengan Penguin dalam berkas README udev:
cd udev*/ cp -a . /tmp/old pushd /tmp/old debian/rules patch cp -a . /tmp/new; cd ../new sed -i 's/Linux/Penguin/g' README cd .. diff -Nurp old new > 90_penguins.patch popd mv /tmp/90_penguins.patch debian/patches rm -rf /tmp/old /tmp/new
Apa yang terjadi jika kita ingin menyunting patch yang telah ada? Kita dapat menggunakan prosedur yang sama dengan Contoh 1 tetapi kita harus menerapkan patch untuk disunting terlebih dahulu:
cp -a . /tmp/old pushd /tmp/old cp -a . /tmp/new; cd ../new patch -p1 < debian/patches/10-selinux-include-udev-h.patch sed -i '1 s/$/***** HELLO WORLD ****/' udev_selinux.c cd .. diff -Nurp old new > 10-selinux-include-udev-h.patch popd mv /tmp/10-selinux-include-udev-h.patch debian/patches rm -rf /tmp/old /tmp/new
Sementara cara ini secara teknis baik, namun dapat berubah menjadi rumit dan tidak terkendali. Untuk membuat proses patch lebih mudah dan tidak berbelit maka sistem patch dikembangkan. Kita akan melihat beberapa contoh populernya.