# Oncelikle make islemi sirasinda olusturulacak olan cesitli # kutuklerin yerlestirilecegi dizin adlarini belirleyelim... # Programin icinde olusturulacagi dizin PROGRAM_DIZINI=bin # .o kutuklerinin koyulacagi dizin PROGRAM_PARCALARI_DIZINI=obj # Bagimlilik bilgilerinin koyulacagi dizin BAGIMLILIK_DIZINI=dep # Asil programin adi PROGRAM = $(PROGRAM_DIZINI)/pisti # make'i komut satirinda bir hedef belirtmeden # calistirdigimizda, Makefile icinde en yukarida bulunan # hedef olusturulur. Bu hedefin adi da geleneksel olarak all # oldugu icin, buraya bu ada sahip bir hedef koyuyoruz. Onu # da pisti progamina bagimli yapinca, komut satirinda # yalnizca 'make' yazmak pistiyi olusturuyor. all: $(PROGRAM) # C++ derlemesi sirasinda kullanilacak olan derleyici # secenekleri (Bunlarin bazilarini oylesine, deneysel amacla # kullandim.) CXXFLAGS = \ -g -ansi -Wall -Werror -pedantic -W -Wconversion \ -Wctor-dtor-privacy -Wnon-virtual-dtor \ -Wreorder -Woverloaded-virtual # Programi olusturan kaynak kutukler. KAYNAKLAR = \ anlatan.cpp \ deger.cpp \ dusunce.cpp \ dusuncezinciri.cpp \ duzey.cpp \ elpuani.cpp \ gerec.cpp \ kagit.cpp \ main.cpp \ oyun.cpp \ oyuncu.cpp \ renk.cpp \ takim.cpp \ # .o kutukleri. Bu kutukleri elde etmek icin KAYNAKLAR # icindeki butun .cpp'leri .o'larla degistiriyoruz ve # baslarina .o kutuklerinin dizinini ekliyoruz. PROGRAM_PARCALARI = $(KAYNAKLAR:%.cpp=$(PROGRAM_PARCALARI_DIZINI)/%.o) # Bunlar da .d bagimlilik kutukleri. Her .cpp kutugune # karsilik bir .d kutugu gerekiyor. Yine baslarina dizin adi # da geliyor. BAGIMLILIK_KUTUKLERI = $(KAYNAKLAR:%.cpp=$(BAGIMLILIK_DIZINI)/%.d) # Bu kural, her bir .cpp kutugunden nasil .d olusturuldugunu # belirliyor. Ilk once mkdir ile bagimlilik dizininin var # oldugundan emin oluyoruz. Ondan sonra, gcc'nin -MM ve -MT # secenekleri yardimiyla bagimlilik bilgisini elde ediyoruz. $(BAGIMLILIK_DIZINI)/%.d: %.cpp @mkdir -p $(BAGIMLILIK_DIZINI) $(CXX) $(CXXFLAGS) -MM -MT '$(PROGRAM_PARCALARI_DIZINI)/$*.o $@' $< > $@ # Bu kural, her bir .cpp kutugunden nasil .o olusturuldugunu # belirliyor. Burada da once .o dizininin var oldugundan # emin olmamiz gerekiyor. $(PROGRAM_PARCALARI_DIZINI)/%.o: %.cpp @mkdir -p $(PROGRAM_PARCALARI_DIZINI) $(CXX) $(CXXFLAGS) -c -o $@ $< # Bu Makefile hedefleri olusturmadan once, butun bagimlilik # kutuklerini de buraya okur (include eder). Boylece hedefe # ulasirken gereken hangi ara hedeflerin tekrar # olusturulmalari gerektigini bilir. # # Bagimlilik bilgisi 'make clean' yaparken hem gereksiz # oldugundan, hem de olusturulmasinlar diye, onlari # ozellikle 'make clean' durumunda eklemiyoruz. # # En basta (veya bir 'make clean'den sonra), bagimlilik # kutukleri var olmayacaklari icin, bu komut dogal olarak # bir hataya neden olacaktir. Onun icin, include komutunun # basina bir - karakteri koyuyoruz. ifneq ($(findstring clean, $(MAKECMDGOALS)), clean) -include $(BAGIMLILIK_KUTUKLERI) endif # Iste programi olusturan kural. Programi bu Makefile'a bile # bagimli yapiyoruz. $(PROGRAM): $(PROGRAM_PARCALARI) Makefile @mkdir -p $(PROGRAM_DIZINI) $(CXX) -o $@ $(CXXFLAGS) $(PROGRAM_PARCALARI) # Butun hedefleri ortadan kaldiran kural (make clean). clean: rm -rf $(PROGRAM) $(PROGRAM_DIZINI) $(PROGRAM_PARCALARI_DIZINI) $(BAGIMLILIK_DIZINI) bilgi: @echo 'Program dizini : $(PROGRAM_DIZINI)' @echo '.o dizini : $(PROGRAM_PARCALARI_DIZINI)' @echo 'Bagimlilik dizini : $(BAGIMLILIK_DIZINI)' @echo 'Program adi : $(PROGRAM)' @echo @echo 'Derleyici secenekleri: $(CXXFLAGS)' @echo @echo 'Kaynaklar : $(KAYNAKLAR)' @echo @echo '.o kutukleri : $(PROGRAM_PARCALARI)' @echo @echo 'Bagimlilik kutukleri : $(BAGIMLILIK_KUTUKLERI)'