15 Haziran 2016 Çarşamba

Linux Kernel İçin Yama Hazırlamak




Merhabalar, 

Geçen yıl, henüz 2.sınıftayken Linux Kernel için yamalar hazırladığım bir dönem olmuştu fakat bununla ilgili blog yazmayı atladığımı farkettim ve Türkçe kaynaklarında yetersiz olması sebebiyle kolları sıvadım :)

OPW isimli Gnome'un kadınlar için düzenlediği bir etkinlik var. Yılda iki defa düzenleniyor. Etkinliğin birçok katılımcısı bulunuyor (Linux Kernel, Gnome, Debian, Fedora, Mozilla gibi). Bende o dönemde Linux Kernel projeleri için hazırlandım. 

Linux Kernel projelerinden birine başvurmadan önce çekirdeğe yamalar yollamanız ve öngörülen sayıda yamalarınızın kabul edilmesi gerekiyor.
Opw Kernel sayfasında tüm yapılması gerekenler, okumak için önerilen birkaç kitap var. Burada da Greg Kroah-Hartman ilk yamanın nasıl yapılacağından bahsetmiş. 


Çok fazla kişinin sürekli aynı dosyalar üzerinde değişiklik yapıyor olması durumunda da daha gelişmiş bir biçimde sürüm takip sistemi kullanmam gerekti.
Git uzaktan birlikte çalışmak için oldukça yetenekli bir araç. Bu süreçte zaten bildiğim temel git kullanımının yanında, git'in daha fazla özelliğini kullanmam gerekti.


Temel olarak yama göndermeye kernel.org'dan aldığım çekirdek kodları dizini içerisindeki drivers/staging'den başladım. Çok temel kodlama biçimi düzeltmeleri yapabileceğimiz gibi, daha karmaşık düzeltmeler de yapabiliriz. 

Çalışmaya ilk başladığımda checkpatch.pl, sparse ve coccinelle araçlarını kullanmayı öğrendim. Bunlar statik ve en temel araçlardır. Başlangıç olarak Linux Kernel'a kodlama biçimi düzeltme dışında Sparse ve Coccinelle araçlarını kullanarak katkı verebiliriz. Bu araçlarla drivers/staging altındaki kodları derlediğimizde aldığımız uyarı mesajlarına göre düzeltmeler yapabiliriz.

Sparse aracı ile fonksiyon tiplerinin ya da değişken tiplerinin doğruluğu, gereksiz fonksiyonları kaldırma, tip dönüşüm işlemlerinin doğruluğu gibi uyarıları analiz edebiliriz.

Coccinelle, otomatik olarak analiz yapan ve C kodunu yeniden yazabilen bir araçtır. Kendine özel Smpl (Semantic Patch Languange) ile yazılan anlamsal betiklerden oluşmaktadır. Asıl yararı aynı düzeltmeleri her dosya için tek tek yapmak yerine, bir şablon oluşturup onunla birçok dosyayı tek seferde tarayayıp değiştirebilmesidir.

Yama gönderirken zorlandığım yanlardan birisi de, Linux Kernel ekibi kodlama biçimine oldukça önem veriyor. Bu yüzden aynı yamayı defalarca yeniden sürümlediğim zamanlar oldu. Hatta kodlama biçimini test etmek için yazdıkları bir Perl betiği de var. (Kodlama biçimi düzeltme yamalarını gönderebilmek için bu betiği kullanmalıyız.) 

Hazırlandığım süre boyunca git kullanımı, çekirdek ve derleme hakkında çok şey öğrendim. Teknik bilgiler dışında asıl kazandığım büyük deneyimin, uzaktan yabancı birileri ile çalışmak olduğunu düşünüyorum. 

Yazının geri kalanında bu işin biraz teknik kısmından bahsedeceğim.


Kernel'ı Derleme 

$ sudo apt-get install vim libncurses5-dev gcc make git exuberant-
ctags


$ mkdir -p git/kernels; cd git/kernels

$ git clone -b staging-next
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git


$ cp /boot/config-`uname -r`* .config

$ make -jX

$ sudo make modules_install install

* Bu adımlardan sonra bir takım grub ayarlarını yapmamız gerekiyor.

$ sudo vim /etc/default/grub komutu ile dosya içeriğini açarak, gerekli düzenlemeyi yapıyoruz.
   
  GRUB_HIDDEN_TIMEOUT=0
  GRUB_HIDDEN_TIMEOUT_QUIET=true
  GRUB_TIMEOUT=10 
 
Düzenleme işlemi bitince çalıştırmamız gereken komut ise: 

$ sudo update-grub2

E-mail Ayarları

Linux kernel için yama göndermek istiyorsak, bazı e-mail ayarlarını düzenlemeye ihtiyacımız var.

$ sudo apt-get install git-email

$ vim .gitconfig 


[user]
   name = Your Name
   email = your.email@example.com 

Git ile Yama Hazırlarken Kullandığım Temel Komutlar

$ git add . 

$ git commit -m “İlk commit”

$ git branch -a

$ git checkout -b ilk-yama

İlk Yamayı Göndermek 

$ git diff

$ git add <degisiklik_yapilan_dosya>

$ git commit -s -v 

$ git send-email --annotate HEAD^

Sonraki Yamalar İçin

 *Depo Güncelleme:
     
      $ git fetch staging
      $ git checkout -b staging-fixes-rebase
      $ git rebase staging/staging-next
  
 *Versiyonlama:

      $ git format-patch –subject-prefix="PATCHv2"

  *Eski commitleri görüntülemek
      
      $ git log

 *Commitleri Birleştirmek:
    
     $ git rebase -i commit_id

Sonraki yazımda görüşmek üzere :)