Friday, April 25, 2008

GNU/Linux'ta Program Derleme - I

Bu kısımda yeni başlayanlar için GNU/Linux üzerinde program derlemeyi ve kurmayı anlatacağım. Anlatacağım konular temel seviyede ve bu yazıda bütün kütüphanelerin sistemde kurulu ve tanıtılmış olduğunu varsayıyorum. (Tanıtılmamış olduğu durumları sonraki yazılarda inceleyebilirim.) Öncelikle, aslında küçük (iki üç dosyadan oluşan) programlarımızı gcc komutlarını konsolda kullanarak derleyebiliriz; ama program büyüdükçe hangi dosyanın hangisine bağlanacağı gibi kararlar karmaşıklaşır. Bu nedenle, automake gibi bu genel derleme işini otomatikleştiren araçlar kullanılmakta. Bu bölümde daha önceden automake kullanılmış programlara sahip olduğumuzu varsayıyoruz. (ki kullandığımız birçok programın kaynak kodları bu şekilde zaten) GNU/Linux'ta program derlemek üç ana adımdan oluşur:
  1. configure etme: configure komutları genelde sistemle ilgili veri almak için kullanılır. Bu komut sayesinde sistemde hangi program/kütüphanelerin nerede kurulu olduğu araştırılır ve programın hangi özelliklerini etkinleştirmek istediğimizi bu adımda belirtiriz. Bu adımdaki komutumuz şu şekilde: ./configure configure komutunun başındaki ./ karakterleri sistem PATH'inde bulunmayan herhangi bir çalışır dosyayı çalıştırmak için kullanılmakta. Yani, Windows altında olduğu gibi geçerli klasördeki çalışır dosyayı sadece adını vererek çalıştıramıyoruz; komutun önüne ./ eklememiz gerekiyor. (Not: Bir dosyayı çalışır hale getirmek için de chmod +x dosyaadi yapmamız gerekiyor.) Bunun dışında configure aşamasında programın seçeneklerini değiştirebileceğimizden bahsetmiştim. Mevcut seçenekleri çoğu durumda ./configure --help ile öğrenebiliyoruz. Daha sonra yapmamız gereken de ./configure --enable-abc --disable-foo şeklinde istediğimiz özellikleri ekleyip kaldırmak. Bu aşamada aynı zamanda bazı kütüphaneleri nereye kurduğumuzu da belirtiyoruz: ./configure --with-ffmpeg --with-ffmpeg-path=/usr/ffmpeg gibi. Tabii burada yazdığım parametreler sadece örnek, geçerli parametreleri daha önce belirttiğim gibi ./configure --help ile öğrenmeniz gerekiyor. configure komutunun sonucunda o klasör altında bir Makefile oluşturuluyor. Bu dosya bir sonraki adımda işe yarayacak.
  2. make: Bir sonraki aşama, asıl derleme aşamasının olduğu aşama. Genelde başkalarının yazdığı kodları çalıştırırken birinci aşamayı geçmeniz halinde make aşamasında fazla sorun yaşamıyorsunuz. Tabii kendi yazdığınız bir programsa bu aşamada hatalar çıkabilir.
  3. make install: Bu son aşamada aslında herhangi bir derleme yapmıyoruz. Bu adımın amacı derlediğimiz programı sistem klasörlerine kopyalamak; çünkü şu ana kadar yaptığımız bütün işlemler sonuçlarını içinde bulunduğumuz klasörde oluşturdu. Tabii ki sistem klasörlerine erişmemiz gerektiği için root kullanıcı olmamız gerekiyor. Bu komutu da make install deyip uyguladıktan sonra program her kullanıcı tarafından kullanılabilir duruma geliyor. Bu adımla ilgili belirtilmesi gereken diğer bir nokta aslında bu adımda 2. adımdaki make komutuna farklı bir parametre vermiş olduğumuz. Yani make komutu default halinde derlemeyi yapıyor; ama make install gibi bir komutla başka işlemler yapmasını sağlayabiliyorsunuz. Burada bir diğer örnek make clean olabilir. Bu da bütün derleme sonrası oluşturulmuş dosyaları silmenize ve sadece kaynak dosyalarının olduğu özgün duruma dönmenizi sağlıyor. Makefile dosyasını dikkatli incelerseniz bütün bu install, clean gibi komutların işlevlerinin yazılmış olduğunu göreceksiniz.
Son olarak aslında derleme işlemiyle direk ilgisi olmayan; ama işinize yarayabilecek birkaç ipucunu belirtmek istiyorum.
  1. .tar.gz uzantılı bir dosyayı açmak için gereken komut tar -zxf dosyaadi ve tar.bz2 içinse tar -jxf dosyaadi
  2. VLC gibi programlarda çok uzun configure komutları oluyor. Bunları her seferinde girmek yerine, DOS'taki batch dosyaları gibi script dosyaları oluşturabilirsiniz. Yapmanız gereken şunlar: Düz metin dosyasının ilk satırına #!/bin/sh yazın, sonraki satırlara da gireceğiniz komutları yazın. Eğer tek bir satırdan uzun olursa okunabilirliği artırmak adına \ kullanarak bir sonraki satırın bu satırını devamı olduğunu belirtin. Örneğin: ./configure --enable-a --enable-b --enable-c --enable-d --enable-e --enable-f --enable-g --enable-h --enable-i --enable-j --enable-k yerine ./configure --enable-a --enable-a \ --enable-b --enable-c --enable-d \ --enable-e --enable-f --enable-g gibi satırlar yazın. NOT: Her satırdaki son karakter \ olmak zorunda, yani \ karakterinden sonra boşluk bile gelmemeli.
  3. Bu komutları çalıştırdığınızda ekrana bir sürü yazı gönderecekler. Bunların bir kısmı normal çıktılar, diğerleri ise uyarı ve hatalar. Haliyle bu iki grubu birbirinden ayırdetmek güçleşiyor. Bu nedenle bu iki grubu iki ayrı dosyaya yazdırmak işinize yarayabilir. Burada yapmanız gereken 1> ve 2> ile sırasıyla normal veriyi ve hataları başka dosyalara göndermek. Örneğin, ./configure 1>normal.txt 2>hata.txt satırıyla programın normal metnini normal.txt dosyasına, hataları ise hata.txt dosyasına yazdırabiliriz.
  4. Derleme işlemleri uzun sürdüğü için configure ve make işlemlerini ardarda yaptırmak isteyebilirsiniz. Burada dikkat edilmesi gereken nokta şu: Eğer yukarıda anlatıldığı şekilde bir script(batch) dosyası oluşturup bu iki komutu alt alta yazarsanız, birinci komut hata verse de ikinci komut yapılacaktır. Ör: ./configure make hatalı bir kullanımdır. Birincinin düzgün tamamlanması halinde ikinci programı başlatmak istersem ikisi arasına && koymak gerekir. Ör: ./configure && make

No comments: