[LinuxFocus-icon]
Ev  |  Erişimdüzeni  |  İçindekiler  |  Arama

Duyumlar | Belgelikler | Bağlantılar | LF Nedir
Bu makalenin farklı dillerde bulunduğu adresler: English  Castellano  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Wilbert Berendsen]
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:

 

İşinizi make ile yapın!

[Illustration]

Çeviri : Hülya Karaman

Ö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.



 

Giriş

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.  

Örnek: bir görselyöre oluşturmak

Varsayalım ki;birden fazla kişi tarafından yapılandırılan bir görsel yöre oluşturmak istiyoruz.Can iki sayfayı takip edip,yapılandırırken,Pınar düzenleriyle ilgileniyor.

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.html
Lü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.html
Bu 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'le ilk tanışma

GNU'nun info-manual'ı harika bir dokümandır.Bununla beraber,en başından beribu doküman programlama üzerine yoğunlaşıyor.Budan dolayı,make'in fonksiyonunu daha geniş açıdan ele almaya çalışıyorum.
    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.  

Makefile sözdizimi

Makefile bir editörle yaratılabilir ve şuna benzer:
# 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.  

Örneğimiz için bir Makefile

Örneğimiz için Makefile şu şekilde olmalıdı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!  

Makefile'ı Şekillendirmek

 

Değişkenler

Makefile,değişkenler sayesinde çok basitleştirilebilir.değişkenler aşağıdaki gibi tanımlanır:
değişken = değer
Değ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

# son
Değ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.  

Model kurallar

`Model kurallar' aynı komutlar dizisini farklı hedefler üzerinde kullanabilmemizi sağlar.

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...
	komut
Model,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/% : %
	komutlar
Make 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ı.  

Otomatik değişkenler

Kaçınılmaz ki;make kendi içinde tanımlı birtakım değişkenlere sahiptir.Bu bazı değişkenlere otomatik değişken adı verilir.Bu değişkenler komutların çalıştırılması sırasında (daha açık olarak:komutlar çalıştırılmadan az önce) hedef ve/veya önceden gerekli olanların değerini alır.

Ö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                           ;\
        } > $@

# son
Gö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!  

Son küçük iyileştirmeler

DOCS'daki dokümanları bütün dizini eklemeksizin belirtebiliriz.Bu aşağıdaki şekilde yapılabilir(makefile'daki DOCS'u TEXTS'e çeviriyoruz):
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                           ;\
        } > $@

# son
Bu dosyayı saklayın ve unutun!Bu andan itibaren,websayfanızı oluşturmak ve düzeni içerikten tamamen ayırmak mümkün!  

Son söz

Tabiki,bu örneği başka durumlar için de kullanmak 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!  

Öneriler

 

Daha fazla bilgi

Make'in nasıl çalıştığı ve diğer olanakları hakkında daha fazla bilgi `GNU Make Manual'da bulunmaktadır.Bu manual'a Linux'da şu komutla ulaşabilirsiniz:
info make
Tabiki,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:

İyi eğlenceler!  

Bu yazı için görüş bildiriminde bulunabilirsiniz

Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
 talkback page 

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:
nl -> -- Wilbert Berendsen
nl -> en Philip de Groot
en -> tr Hülya Karaman

2001-08-03, generated by lfparser version 2.17