{"id":837,"date":"2017-04-21T11:18:54","date_gmt":"2017-04-21T08:18:54","guid":{"rendered":"https:\/\/burakcaliskan.org\/blog\/?p=837"},"modified":"2017-05-08T23:21:44","modified_gmt":"2017-05-08T20:21:44","slug":"gnu-make-ve-makefile-kullanimi","status":"publish","type":"post","link":"https:\/\/burakcaliskan.org\/blog\/gnu-make-ve-makefile-kullanimi\/","title":{"rendered":"Gnu Make ve Makefile Kullan\u0131m\u0131"},"content":{"rendered":"<p>Make Unix t\u00fcrevi i\u015fletim sistemlerinde s\u0131k\u00e7a kullan\u0131lan pop\u00fcler bir otomatik yaz\u0131l\u0131m derleme arac\u0131d\u0131r. Makefile ad\u0131 verilen dosyalardaki ayarlar\u0131 kullanarak tek komutla projelerin derlenmesini sa\u011flar. Bu dosyalarda sizin ayarlayaca\u011f\u0131n\u0131z parametrelerle projenizin derlenmesi, kurulmas\u0131, sistemden kald\u0131r\u0131lmas\u0131 ya da derlenmi\u015f dosyalar\u0131n silinmesi gibi i\u015flemler tek komut ile kolayca halledilebilecek hale gelir.<!--more--><\/p>\n<p>En basit kullan\u0131m \u015fekli sadece &#8216;make&#8217; komutunun konsolda yaz\u0131lmas\u0131ylad\u0131r. S\u0131kl\u0131kla kullan\u0131lan di\u011fer parametreler, &#8216;make install&#8217;, &#8216;make clean&#8217; dir. &#8216;make&#8217; komutu projeyi derler, &#8216;make install&#8217; derlenen projenin sisteme kurulmas\u0131na ve &#8216;make clean&#8217; de derlenmi\u015f olan proje dosyalar\u0131n\u0131n silinmesine yarar. Siz bu parametre isimlerini kullanmak zorunda de\u011filsiniz ya da parametrelerinizi bunlarla s\u0131n\u0131rlamak durumunda da de\u011filsiniz ama belli ba\u015fl\u0131 g\u00f6revler i\u00e7in (kurulum, silme vs.) en fazla kullan\u0131lan parametreler bunlard\u0131r.<\/p>\n<p>Konsolda &#8216;make&#8217; komutunu verdi\u011finizde make program\u0131 o an i\u00e7inde bulundu\u011funuz klas\u00f6rde bir makefile dosyas\u0131 arar. Bu dosyan\u0131n sadece ad\u0131 &#8216;Makefile&#8217; ya da &#8216;makefile&#8217; olabilir. Ba\u015fka bir isme sahip bir makefile dosyas\u0131 kullanmak istiyorsan\u0131z bunu -f parametresi ile make program\u0131na bildirmeniz gerekir.<\/p>\n<pre class=\"programlisting\">make -f makefile.win\r\n<\/pre>\n<p>\u00dcstteki \u00f6rnekte make program\u0131 &#8216;makefile&#8217; ya da &#8216;Makefile&#8217; ad\u0131nda bir dosya aramak yerine sadece &#8216;makefile.win&#8217; ad\u0131nda bir dosya arayacakt\u0131r.<\/p>\n<p>Bir makefile dosyas\u0131n\u0131n yap\u0131s\u0131 \u015fu \u015fekildedir.<\/p>\n<pre class=\"programlisting\">hedef: gereklilikler\r\n[tab] komutlar\r\n<\/pre>\n<p>Olduk\u00e7a basit bir makefile \u00f6rne\u011fi de \u015f\u00f6yle olabilir.<\/p>\n<pre class=\"programlisting\">all: proje_adi\r\n\r\nproje_adi: main.c\r\n       gcc -o projem main.c\r\n\r\nclean: \r\n       rm -rf *.o\r\n       rm -rf projem\r\n<\/pre>\n<p>Herhangi bir parametre olmadan &#8216;make&#8217; komutu verildi\u011finde \u00e7al\u0131\u015ft\u0131r\u0131lan parametre &#8216;all&#8217; parametresi olur. &#8216;all&#8217; parametresi &#8216;proje_adi&#8217; parametresini \u00e7al\u0131\u015ft\u0131r\u0131r. O parametrede de main.c dosyas\u0131 derlenerek projem dosyas\u0131 olu\u015fturulur. E\u011fer &#8216;make clean&#8217; komutu verilirse klas\u00f6rde bulunan b\u00fct\u00fcn .o uzant\u0131l\u0131 dosyalar ve projem dosyas\u0131 silinir. &#8216;.o&#8217; uzant\u0131l\u0131 dosyalar gcc taraf\u0131ndan olu\u015fturulan obje dosyalar\u0131d\u0131r. Make&#8217;in bir avantaj\u0131 da bu dosyalarda bir de\u011fi\u015fiklik yap\u0131lmam\u0131\u015fsa makefile&#8217;da o dosyaya ait olan derleme komutlar\u0131n\u0131 atlar. Bu sayede tekrar tekrar derlemeler yapt\u0131\u011f\u0131n\u0131z projelerinizde derleme zamanlar\u0131 olduk\u00e7a k\u0131sal\u0131r.<\/p>\n<p>Makefile dosyalar\u0131nda s\u0131k s\u0131k tekrar etti\u011fimiz komutlar\u0131 bir de\u011fi\u015fkene atay\u0131p o de\u011fi\u015fkeni \u00e7a\u011f\u0131rma \u015fans\u0131m\u0131z vard\u0131r. Bu \u00f6zellik s\u0131kl\u0131klar derleyici ad\u0131, k\u00fct\u00fcphane dosyalar\u0131, proje dosyalar\u0131 gibi tekrar eden metinler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre class=\"programlisting\">LIBS=-L\"\/usr\/lib\" -lSDL -lGL\r\n<\/pre>\n<p>Yukar\u0131daki \u015fekilde tan\u0131mlad\u0131\u011f\u0131m\u0131z de\u011fi\u015fkeni makefile i\u00e7inde kullanman\u0131n yolu ise $(LIBS) \u015feklinde yazmakt\u0131r.<\/p>\n<p>\u00d6rnek olarak \u015f\u00f6yle bir makefile yazabiliriz.<\/p>\n<pre class=\"programlisting\">CC=gcc\r\n\r\nLIBS=-L\"\/usr\/lib\" -lSDL\r\nEXE=projem\r\n\r\nall: proje\r\n\r\nproje: main.c\r\n       $(CC) -o $(EXE) main.c $(LIBS)\r\n<\/pre>\n<p>\u00dcstte yazd\u0131\u011f\u0131m\u0131z \u00f6rnek \u00e7ok basit ka\u00e7m\u0131\u015f olabilir ama sadece bir kaynak dosyas\u0131 yerine 5 ya da daha fazla kaynak dosyan\u0131z oldu\u011funu, projede 4-5 farkl\u0131 k\u00fct\u00fcphane de kulland\u0131\u011f\u0131n\u0131z\u0131 hayal edin. \u0130\u015fte o zaman bu \u00f6zellik i\u015fleri olduk\u00e7a kolayla\u015ft\u0131r\u0131yor.<\/p>\n<p>Bunlar\u0131n d\u0131\u015f\u0131nda makefile&#8217;\u0131n\u0131z i\u00e7inde a\u00e7\u0131klama sat\u0131r\u0131 yazmak i\u00e7in sat\u0131r\u0131n ba\u015f\u0131na &#8216;#&#8217; karakterini koyman\u0131z yeterlidir. Uzun sat\u0131rlar\u0131 b\u00f6lmek i\u00e7in &#8216;\\&#8217; karakterini kullan\u0131p, alt sat\u0131rdan yazmaya devam edebilirsiniz. $@ de\u011fi\u015fkeni o anda kullan\u0131lan hedefin ad\u0131n\u0131 belirtir, ayn\u0131 \u015fekilde $&lt; de\u011fi\u015fkeni de kullan\u0131ld\u0131\u011f\u0131 andaki girdi dosyas\u0131n\u0131 belirtir. Son olarak dikkat etmeniz gereken \u015fey ise en ba\u015fta makefile yap\u0131s\u0131n\u0131 g\u00f6sterir verdi\u011fim \u00f6rnekte de yazd\u0131\u011f\u0131 gibi hedef&#8217;in alt\u0131ndaki komutlar\u0131 yazarken ba\u015f\u0131na bo\u015fluk b\u0131rakmayacaks\u0131n\u0131z, orada kullanman\u0131z gereken \u015fey &#8216;tab&#8217; karakteridir. Bo\u015fluk b\u0131rak\u0131rsan\u0131z make program\u0131 hata verip sonlanacakt\u0131r.<\/p>\n<p>Son olarak size projelerinizde kullanman\u0131z i\u00e7in ufak ama etkili bir makefile \u00f6rne\u011fi verip yaz\u0131m\u0131 burada sonland\u0131r\u0131yorum.<\/p>\n<pre class=\"programlisting\"># projenizde kullanacaginiz derleyiciler\r\nCPP  = g++\r\nCC   = gcc\r\n\r\nOBJ=$(SOURCES:.cpp=.o)\r\n\r\n# projenizde kullandiginiz kutuphaneler \r\n# bu ornekte ben sdl kitapliklari kullaniyorum\r\nLIBS =  -L\"\/usr\/lib\" -lSDLmain -lSDL \\\r\n              -lSDL_mixer -lSDL_ttf\r\n\r\n# projede kullandiginiz kutuphanelerin .h \r\n# dosyalarinin bulundugu klasorler\r\nINCS =  -I\"\/usr\/include\" -I\"\/usr\/include\/SDL\"\r\nCXXINCS =  -I\"\/usr\/include\" \r\nCXXFLAGS = $(CXXINCS)  \r\nCFLAGS = -c $(INCS)  \r\n\r\n# sources degiskenine projenizdeki \r\n# kaynak kod dosyalarini (.c yada .cpp)\r\n# aralarinda bir bosluk birakarak yazin, \r\n# en basta main dosyaniz olsun\r\nSOURCES= main.cpp\r\n\r\n# buraya projeniz derlendiginde cikacak \r\n# executable dosyanin adi yazilacak\r\nBIN  = proje_adi\r\nRM = rm -f\r\n\r\nall: $(SOURCES) $(BIN)\r\n\r\n$(BIN): $(OBJ)\r\n    $(CC) $(OBJ) -o $(BIN) $(LIBS)\r\n\r\n.cpp.o:\r\n    $(CC) $(CFLAGS) $&lt; -o $@\r\n\r\nclean: \r\n    ${RM} $(OBJ) $(BIN)\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Make Unix t\u00fcrevi i\u015fletim sistemlerinde s\u0131k\u00e7a kullan\u0131lan pop\u00fcler bir otomatik yaz\u0131l\u0131m derleme arac\u0131d\u0131r. Makefile ad\u0131 verilen dosyalardaki ayarlar\u0131 kullanarak tek komutla projelerin derlenmesini sa\u011flar. Bu dosyalarda sizin ayarlayaca\u011f\u0131n\u0131z parametrelerle projenizin derlenmesi, kurulmas\u0131, sistemden kald\u0131r\u0131lmas\u0131 ya da derlenmi\u015f dosyalar\u0131n silinmesi gibi i\u015flemler tek komut ile kolayca halledilebilecek hale gelir.<\/p>\n","protected":false},"author":2,"featured_media":839,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[12],"tags":[],"_links":{"self":[{"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/posts\/837"}],"collection":[{"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/comments?post=837"}],"version-history":[{"count":2,"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/posts\/837\/revisions"}],"predecessor-version":[{"id":890,"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/posts\/837\/revisions\/890"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/media\/839"}],"wp:attachment":[{"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/media?parent=837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/categories?post=837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/burakcaliskan.org\/blog\/wp-json\/wp\/v2\/tags?post=837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}