|
|
Bu makalenin farklı dillerde bulunduğu adresler: English Castellano Deutsch Francais Nederlands Portugues Russian Turkce |
tarafından Wilbert Berendsen Yazar hakkında: Wilbert Berendsen is a profesyonel bir müzisyen ve coşkulu bir Linux kullanıcısı.İlk olarak Z80 'ler için assembly kodlarını kırdı.Bu günlerde tüm çalışmaları için Linux kullanıyor. Yalnızca eğlenmek amacıyla giriş niteliğinde yazıları yazıyor ve bunları küçük görselyöresinde anlatıyor: http://www.xs4all.nl/~wbsoft/. Kaynak kodları açık olarak ! İçerik: |
Özet:
Bu yazı make'in nasıl çalıştığı ve yazılım geliştirme alanında pek çok şeyde nasıl kullanıldığı anlatılıyor.
Ara sıra hemen hemen her Linux kullanıcısı,make'i kullanmıştır.Bu,bir program veya çekirdek kaynak kodundan oluşturuldugunda,bir paket kurulduğunda ve benzeri durumlarda işini yapar.'Make' önemli bir yazılım gelistirme aracıdır. Bununla beraber,make daha fazla olanağı sağlar.
Bu yazıda,göreceğiz ki;makale veya kitap yazmak ya da güzel bir görselyöre oluşturmak gibi günlük işlerde,make çok önemli bir araçtır. Bu sunum sırasında,daha bir çok 'unix bilgisi' ele alınacaktır. Bu hikayenin sonunda,make kullanmak konusunda bir kaç ipucu daha sunulacaktır. Lütfen dikkat:Biz şu anda Linux hakkında konuşuyoruz,fakat make'in kullanımı her işletim sisteminde mümkündür.
Düzen ve içeriği birbirinden ayıran basit bir sisteme gereksinim duyarız. Etkin çözüm;sayfa her istendiğinde,içeriğin veritabanından okunmasıdır.Örneğin,PHP ve Microsoft Active Server Sayfaları bu şekilde çalışır.Bununla beraber,sadece basit HTML(HyperText Markup Language) saklama olanağına sahibiz. Ayrıca,içerik veritabanı'nı daha etkili yapılandırmak için değişmiyor.
Bazı basit komutlar kullanılarak bir görselyöre kurulabilir.
Mesela, Pınar sitenin başlığını< i>başlık.htmlye , sayfa altlığını da altlık.htmlye koyar. başlık.html şöyle görünebilir:
<html><!-- başlık --> <head> <title>Pınar ve Can'ın yapımı</title> </head> <body bgcolor="white"> <table border="0" width="100%"><tr> <td bgcolor="#c040ff" valign="top"> Bu bizim web sitemiz.<br> Burda bir takım şeyler yazıyor.<br> Biz çok sosyaliz.<br> işte telefon numaramız:<br> <b>0123-456789</b> </td><td valign="top"> <!-- İçerikleri buraya koy -->Bu da sayfa altlığı altlık.html:
<!-- sayfa altlığı --> </td></tr></table> </body></html>Can'ın içerik.html'ini son sayfa olarak,unix komutuyla,yerleştirilmesinin bir örneği:
cat başlık.html /home/can/Docs/görselyöre/içerik.html echo -n '<hr>Son güncelleme: ' tarih '+%A %e %B' cat altlık.htmlLütfen bu komutların manual sayfalarına başvurun.Yukarıdaki komutlar sonucunda;son dosya standard output'a iletilir ve bu bir dosyada tutulur.
{ cat başlık.html /home/can/Docs/görselyöre/içerik.html echo -n '<hr>Son güncelleme: ' tarih '+%A %e %B' cat altlık.html } > /home/pınar/public_html/içerik.htmlBu işlem öteki dosya öneri.html için de tekrarlanır. Aslında,görselyöremizin işleyişini sağlayacak küçük bir betik (script) yaratmış olduk.
Bununla beraber,bu komutlar elle çalıştırılamaz.Can'ın yaptığı her içerik değişikliğinde çalıştırılan bir kabuk betiği yaratabiliriz. Ayrıca,eğer Pınar başlığı ve sayfa altlığını değiştirmeye karar verirse de,bu betik çalıştırılmalıdır!Diğer yandan,eğer Can her gün bir değişiklik yapmıyorsa,betik çalıştırılmamalıdır. Linux kullanıyoruz, bu yüzden akılcıl bir çözüm arıyoruz!
Bu noktada make kendini gösterir.
Make,hedef dosya ile kaynak dosyanın zaman-damgası(time-stamp) üzerine kuruludur ve bir takım komutlar dizisinin çalıştırılıp çalıştırılmayacağına karar verir.Başka bir deyişle; herbir kaynak dosyası, bir hedef dosyaya ihtiyaç duyar ve kaynak dosya ,hedef dosyadan daha yeniyse;bir takım komutlar dizisi çalıştırılır.Bu komutlar hedef dosyanın yenilenmesini sağlar.
Hedef dosya 'hedef'tir , kaynak dosyaları `önceden gerekli olan'dır. (ilk istek). Komutlar,eğer bir 'önceden gerekli olan(prerequisites)'kaynak dosyadan daha yeni ise (veya herhangi bir kaynak dosya yoksa),çalıştırılır. Eğer bütün bu 'önceden gerekli olan'lar kaynak dosyadan eski veya onunla eşit eskilikte ise ,komutlar çalıştırılmaz ve 'hedef' güncellenmiş kabul edilir.
Şimdi bulunan dizinde,adı Makefile olan bir dosya yaratılmalıdır.Bu dosya make'in işini gerektiği gibi yapabilmesi için gerekli olan bilgiyi içerir.Makefile'ı edindikten sonra,yapmamız gereken tek şey: 'make' yazmamız ve yeni bir hedef dosya yaratılması için gerekli olan komutlar otomatik olarak çalıştırılır.
Make komutla çağırılır.
make hedef1 hedef2 ....
Hedef isteğe bağlıdır(eğer hedef silinirse,Makefiledaki ilk dosya kullanılır.). Make her zaman Makefile'ı bulunulan dizinde arar.Birden fazla hedef sağlamak mümkündür.
# Bu bir Makefile örneğidir. # Yorumlar '#'işaretinden sonra yazılabilir. hedef: önceden gerekli olan komut hedef: önceden gerekli olan komut # vs...vs...vs...Hedef ile başladık,iki nokta üst üste ile devam ettik (:) ve 'önceden gerekli olan(prerequisites)'a ihtiyac duyduk.Birçok 'önceden gerkli olan'ın varlığında, satırı ters slash(\\) ile bitirmek ve diğer satırdan devam etmek mümkün.
Bir sonraki satır(lar)da,bir veya daha fazla komut bulunabilir.Her satır tek bir komut olarak düşünülür.Eğer bir komut için birden fazla satır kullanmak istiyorsanız,satırlanırın sonuna ters slash (\\) koymalısınız.Make onları sanki tek bir satıra yazılmış gibi ilişkilendirecektir.Bu durumda,çalıştırma kabuklarında meydana gelebilir muhtemel hataları önlemek için,komutları iki nokta üst üste (;) ile ayırmamız gereklidir.
Not: Komutlar satır başından,8 boşluk bırakarak değil,TAB tuşu ile ayrılmalıdır!
Make Makefile'ı okuyarak, her bir hedef için (ilkinden başlayarak)komutların çalıştırılıp çalıştırılmayacağına karar verir.Her hedef,'önceden gerekli olan' ve komutlarla beraber 'kural' anlamına gelir.
Eğer Make sorunsuz çalışırsa,sadece ilk hedef çalıştırılır.
# Bu Makefile patates canavarı Pınar ile Can'ın görselyöresini kurar. hepsi: /home/pınar/public_html/içerik.html /home/pınar/public_html/öneri.html /home/pınar/public_html/içerik.html: başlık.html altlık.html \ /home/can/Docs/görselyöre/içerik.html { \ cat başlık.html /home/can/Docs/görselyöre/içerik.html ;\ echo -n '<hr>Son güncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altlık.html ;\ } > /home/pınar/public_html/içerik.html /home/pınar/public_html/öneri.html: başlık.html altlık.html \ /home/can/Docs/görselyöre/öneri.html { \ cat başlık.html /home/can/Docs/görselyöre/içerik.html ;\ echo -n '<hr>Son güncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altlık.html ;\ } > /home/pınar/public_html/öneri.html # son
Şimdi,üç hedefimiz var, 'hepsi' ve siteden dosyalar içerik.html ve öneri.html .'hepsi' hedefinin tek fonksiyonu öteki iki dosyayı 'önceden gerekli olan'olarak algılamasıdır.Bunlar test edilmiştir.Çünkü 'hepsi' tek başına bir dosya ismi değildir,hedef 'hepsi her zaman çalıştırılır. (Daha sonra,dosya olmayan hedefleri tanıtmak için daha şık bir yol sunacağız.).
Eğer başlık ve sayfa altlığı değiştirilmiş ise bütün sayfalar güncellenecektir.Eğer Can sadece bir tane dosyasını yenilemiş ise sadece yenilenmiş sayfa güncellenecektir.Çalıştırılan 'make' komutu bu işi yapar.!!
Tabiki,Makefile'ın bir dezavantajı var : denetlemek kolay değil! Neyseki,işleri kolaylaştırmak için pek çok yol var!
değişken = değerDeğişkene bir ifade atıyoruz.$(variabele).Bunu Makefile içine katarsak,daha iyi şu şekilde görünür:
# Bu Makefile patates canavarı Pınar ile Can'ın görselyöresini kurar. # görselyörenin bulunduğu dizin: HEDEFDIR = /home/pınar/public_html # Can'ın dizini : CANDIR = /home/can/Docs/görselyöre # Düzen için gerekli dosyalar: DÜZEN = başlık.html altlık.html hepsi: $(HEDEFDIR)/içerik.html $(HEDEFDIR)/öneri.html $(HEDEFDIR)/içerik.html: $(DÜZEN) $(CANDIR)/içerik.html { \ cat başlık.html $(CANDIR)/içerik.html ;\ echo -n '<hr>Son güncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altlık.html ;\ } > $(HEDEFDIR)/içerik.html $(HEDEFDIR)/öneri.html: $(DÜZEN) $(CANDIR)/öneri.html { \ cat başlık.html $(CANDIR)/öneri.html ;\ echo -n '<hr>Son güncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altlık.html ;\ } > $(HEDEFDIR)/öneri.html # sonDeğişkenler için büyük harf kullanmak iyi bir alışanlıktır.Şimdi,değişiklik daha kolay.
Eğer isterseniz,doğru düzen elde etmek için tanımlanmış başka bir method daha var.Eğer bütün dokumanlar aynı çıktıya konması gerekiyorsa ne yapmalıyız?Çok fazla tekrar, Makefile'ın boyutunu çokca büyütebilir. Bu da basitleştirilebilir.
Eğer model kuralar kullanılıyorsa,satırların yapısı bir tane daha model elemanı eklenerek değişecektir:
Çoklu hedef: model : önceden gerekli olan önceden gerekli olan... komutModel,bütün hedefler uygulanabilecek bir ifade olmalıdır.yüzde işareti(%)değişken bölümleriyle hedef isimleri birbirinden ayırmak için kullanılır.
Bir örnek:
/home/bla/hedef1.html /home/bla/hedef2.html: /home/bla/% : % komutlarMake bunu okurken ikisatıra genişletir ve iki satırmış gibi algılar.Burda model hedef ismin hangi yüzde işareti ile ilişkili olduğuna karar verir.
Önceden gerekli olanlar kısmındaki yüzde işaretleri ise yüzde işaretleri ile kopyalanan bölümleri yerine kullanılır.
Make yukarıdakini şu şekilde genişletir:
/home/bla/hedef1.html: hedef1.html komutlar /home/bla/hedef2.html: hedef2.html komutlar`/home/bla/%' modelindeki yüzde işareti, `/home/bla/hedef1.html' hedefiyle `hedef1.html'değerini alır,böylelikle önceden gerekli olan `%' `hedef1.html'e genişletilmiş olur.
Bizim örnek görselyöremiz için,aşağıdaki komutlar kullanılmalıdır:
$(HEDEFDIR)/içerik.html $(HEDEFDIR)/öneri.html: $(HEDEFDIR)/% : $(CANDIR)/% \ $(DÜZEN)Geriye bir tek bu değişkenleri komutlarımızda nasıl kullanabiliriz sorusu kaldı. Hedefler komutlardan biraz daha farklı.
Özel değişken $\ , ilk gerekli olanı işaret etmekte kullanılır ve $@ değişkeni o anki dizine genişletir.
Bu değişkenleri kullanarak,aşağıdaki tamamlanmış kurallara ulaşmak mümkün:
$(HEDEFDIR)/içerik.html $(HEDEFDIR)/öneri.html: $(HEDEFDIR)/% : $(CANDIR)/% \ $(DÜZEN) { \ cat başlık.html $< ;\ echo -n '<hr>Son güncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altlık.html ;\ } > $@İşte,bu tek satırlık fonksiyonlar her bir dosya için geçerli!
Daha fazla tutarlılık için Makefile ,daha çok olumlu yön sunmaktadır:
# Bu Makefile'ı patates canavarı Pınar ile Can'ın görselyöresini kurar. # görselyörenin bulunduğu dizin: HEDEFDIR = /home/pınar/public_html # Can'ın dizini: CANDIR = /home/can/Docs/görselyöre # Düzen için gerekli dosyalar: DÜZEN = başlık.html altlık.html # Web sayfası: DOCS = $(HEDEFDIR)/içerik.html $(HEDEFDIR)/öneri.html # Lütfen aşağıdaki satırdan sonrasını değiştirmeyin:-) ) # ------------------------------------------------------------- hepsi: $(DOCS) $(DOCS): $(HEDEFDIR)/% : $(CANDIR)/% $(DÜZEN) { \ cat başlık.html $< ;\ echo -n '<hr>Son güncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altlık.html ;\ } > $@ # sonGörünmesi gerektiği gibi olmaya başlıyor.Eğger daha fazla doküman eklenirse,daha fazla yazmaya gerek kalmadan, DOCS değişkeniyle Makefile'da bunları ilişkilendirmek mümkün.
Sonunda,nasıl çalıştığı hakkında hiç bir sorusu kalmadan Makefile'ın nasıl kolaylıkla çalıştığını görebiliriz!
TEXTS = içerik.html öneri.html vebaşkabirdosya.html # Lütfen aşağıdaki satırdan sonrasını değiştirmeyiniz;-) # ------------------------------------------------------------- DOCS = $(addprefix $(HEDEFDIR)/,$(TEXTS)) hepsi: $(DOCS) # vs..vs..Burda gördüğümüz değişkenler yerine kullanabileceğimiz bir make fonksiyonudur,parantezler arasına tamamlanmış ifadeler koymak mümkün.Bu şekilde texts'i birden fazla yolla ifade etmek de mümkün.
$(addprefix prefix,list) özel komutu satırdaki tüm elemanları birbirine bir önekmiş gibi ekler.Bu örnekte,HEDEFDIR değişkeninin içeriği artı slashdir.
Listelenmiş araçlar boşluk(space)larla birbirinden ayrılır.Bu sebepten dolayı,make komutlarıyla ,dosya adında boşluk olan dosyaları işleme sokmak iyi bir fikir değildir.
Eklemek gerekirse:başta da belirttiğimiz gibi 'hepsi' hedefi 'hepsi' adında bir dosya yaratmaz ve sonuç olarak da,bu hedef her zaman çalıştırılır.<Tesadüfen> aynı adı taşıyana ve diğerlerinden yeni olan bir dosyanın varlığı söz konusu olduğunda ne olur..?
Bunu make'e anlatmanın ve hedefin hard diskte belli bir dosya belirtmemesini, belli bir hedefin sürekli çalıştırılmasını sağlayan kolay bir yolu var.Bunu sağlamak için;hedef 'phony' (gerçek değil) olarak tanımlanır.Ve şöyle yapılır:
.PHONY: hepsiŞimdi tüm Makefile şöyle gözükür:
# Bu Makefil'ı patates canavarı Pınar ve Can'ın görselyöresini kurar. # görselyörenin bulunduğu dizin: HEDEFDIR = /home/pınar/public_html # Can'ın dizini: CANDIR = /home/can/Docs/görselyöre # Düzen için gerekli dosyalar: DÜZEN = başlık.html altlık.html # Websayfasını isimleri: TEXTS = içerik.html öneri.html vebaşkabirdosya.html # Lütfen aşağıdaki satırdan sonrasını değiştirmeyiniz;-) # ------------------------------------------------------ DOCS = $(addprefix $(HEDEFDIR)/,$(TEXTS)) .PHONY: hepsi hepsi: $(DOCS) $(DOCS): $(HEDEFDIR)/% : $(CANDIR)/% $(DÜZEN) { \ cat başlık.html $< ;\ echo -n '<hr>Son güncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altlık.html ;\ } > $@ # sonBu dosyayı saklayın ve unutun!Bu andan itibaren,websayfanızı oluşturmak ve düzeni içerikten tamamen ayırmak mümkün!
Örneğin,yaratılmış bir dokümanın bir hataya sebep olması o kadar da kolay değil:Eğer Can yanlışlıkla makalesin </body></html> şeklinde isimlendirirse bu Pınar'ın yaptığı altlığın pek çok browser tarafından gösterilememesine neden olur. Bununla beraber, Can textlerini LyXda veya lyx2html gibi bir program kullanarak yazmış da olabilir.Çeşitli olanaklar vardır!
Resimlerin web dizinine taşınma mümkünlüğünü henüz konuşmadık.Bu işlemi otomatikleştirmekte mümkün!
Bu örnekte, Pınar Can'ın görselyöre dizini okuma hakkına sahip olmalıdır.Bu işin ilginç yanı çok büyük düzenlemelere uygulanabilir olmasıdır.Pınar'ın dünyanın bir ucundan login olması veya NFS aracılığı ile kendi dizinini kurması bile mümkün.Tek kişi tarafından yürütülen çalışmaları da bu şekilde oluşturmmak mümkün.
Sonunda,Makefile prensibini açıklığa kavuşturmuş ve iyi bir Makefile yazıldığında günlük işlerimizi ne kadar kolaylıştırdığını görmüş olduk!
'Phony' hedefler kullanmak(.PHONY: hedef),basit fonksiyonları paketlemekte kolaylık sağlar.Örnek olarak,Linux çekirdek konfigürasyonu verilebilir.
Make menuconfig yazılması interaktif bir menü ile konfigürasyonunu başlatır.Make xconfig yazılması X altında Tcl/Tk arayüzü oluşturarak konfigürasyonu başlatır.
Yukarıda bahsettiklerimizin gerçek bir çekirdek oluşturulması ile hiçbir ilgisi yoktur.Bunlar ,çekirdek konfigürasyonu gibi gerekli fonkrsiyona basit bir arayüz oluşturur.
Aşağıdaki PHONY hedeflerle bir Makefile yaratmalısınız.
Bu yolla,yeni elde edilmiş HTML dosyasının düzenini iyileştirmek için bir text dosyasından HTML üretmek mümkün.Bir örnek:
TEMPLATE = layout1/Template1.txt /home/httpd/sales/sales.html: sales.html $(TEMPLATE) perl Scripts/BuildPage.pl -template $(TEMPLATE) $< > $@-new mv -f $@-new $@ sales.html: sales.txt aptconvert -toc $@ $<Template1.txt dosyası değiştiğinde yeni dosyanın nasıl güncelleneceğine dikkat ediniz.
Eğer bir komut '@' işaretinden sonra geliyorsa make tarafından sergilenmez:
hedef: önceden gerekli olan @cc -o hedef önceden gerekli olanEğer bir komut '-' ile başlarsa,make işlemi bu komut bir sorun çıkarırsa sona ermeyecektir.(mesela olmayan bir dosyanın silinmesi.):
.PHONY: clean clean: -rm -r $(tempdir)Make install gibi belli make komutlarının ne yaptığını görmek fakat çalıştırılmasını önlemek istiyorsanız; -n opsiyonunu kullanın:
wilbert@nutnix:~ > make -n install install -m 755 program /usr/local/bin install -m 644 program.1 /usr/local/man/man1 wilbert@nutnix:~ >
Eğer herhangi bir kabuk veya dosya adı olarak dolar işareti kullanmanız gerekiyorsa ($$) çift dolar işareti kullanın:
# Bir Makefile # Bunu evde denemeyin!:-) source = menu.txt help.txt target: $(source) for i in $(source) ;\ do \ if [ "$$i" = "menu.txt" ] ;\ then \ doThis $$i ;\ else \ doThat $$i ;\ fi ;\ done > targetMake bu komutları çalıştırmak için kabuğa göndermeden önce,kendi değişkenlerini ve çift dolar işaretlerini tek dolara çevirir.
info makeTabiki,GNU Make Manual'ına GNOME ve KDE yardımcı browserlarının yanı sıra elle tkinfo programıyla ulaşabilirsiniz.
Make hakkında daha fazla bilgi bulabileceğiniz linkler:
|
Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Wilbert Berendsen, FDL LinuxFocus.org Burayı klikleyerek hataları rapor edebilir ya da yorumlarınızı LinuxFocus'a gönderebilirsiniz |
Çeviri bilgisi:
|
2001-08-03, generated by lfparser version 2.17