{"id":36684,"date":"2025-12-21T16:00:42","date_gmt":"2025-12-21T13:00:42","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/"},"modified":"2025-12-21T16:00:42","modified_gmt":"2025-12-21T13:00:42","slug":"makefile-kullanarak-firmware-olusturma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/","title":{"rendered":"Makefile Kullanarak Firmware Olu\u015fturma Rehberi"},"content":{"rendered":"<h2>Makefile Kullanarak Firmware Olu\u015fturma Rehberi<\/h2>\n<p>G\u00f6m\u00fcl\u00fc sistemler d\u00fcnyas\u0131nda, donan\u0131m \u00fczerinde \u00e7al\u0131\u015facak yaz\u0131l\u0131m\u0131, yani firmware&#8217;i olu\u015fturmak karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. Birden fazla kaynak dosyan\u0131n derlenmesi, k\u00fct\u00fcphanelerin ba\u011flanmas\u0131, \u00f6zel derleyici bayraklar\u0131n\u0131n kullan\u0131lmas\u0131 ve nihai ikili dosyan\u0131n olu\u015fturulmas\u0131 gibi ad\u0131mlar i\u00e7erir. Bu s\u00fcrecin manuel olarak y\u00f6netilmesi hem zaman al\u0131c\u0131 hem de hataya a\u00e7\u0131kt\u0131r. \u0130\u015fte tam da bu noktada Makefile&#8217;lar devreye girer. Makefile, bu derleme s\u00fcrecini otomatikle\u015ftiren, tekrarlanabilir ve y\u00f6netilebilir k\u0131lan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bu makale, Makefile&#8217;\u0131n temellerinden ba\u015flayarak, firmware projeleriniz i\u00e7in nas\u0131l etkili bir \u015fekilde kullanabilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h2>1. Makefile Nedir ve Firmware Geli\u015ftirmedeki Rol\u00fc<\/h2>\n<h3>1.1. Makefile&#8217;\u0131n Tan\u0131m\u0131 ve Amac\u0131<\/h3>\n<p>Makefile, Unix benzeri i\u015fletim sistemlerinde ve di\u011fer platformlarda yaz\u0131l\u0131m derleme s\u00fcrecini otomatikle\u015ftirmek i\u00e7in kullan\u0131lan bir yap\u0131land\u0131rma dosyas\u0131d\u0131r. GNU Make arac\u0131 taraf\u0131ndan yorumlanan bu dosyalar, belirli hedeflere ula\u015fmak i\u00e7in hangi komutlar\u0131n hangi s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gerekti\u011fini tan\u0131mlar. Bir Makefile, genellikle bir projenin kaynak kodundan \u00e7al\u0131\u015ft\u0131r\u0131labilir bir program veya bir k\u00fct\u00fcphane olu\u015fturmak i\u00e7in gerekli olan t\u00fcm ad\u0131mlar\u0131 (derleme, ba\u011flama vb.) i\u00e7erir. Amac\u0131, geli\u015ftiricinin her derlemede ayn\u0131 komutlar\u0131 tekrar tekrar yazmas\u0131n\u0131 engellemek, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek ve yaln\u0131zca de\u011fi\u015fen dosyalar\u0131n yeniden derlenmesini sa\u011flayarak derleme s\u00fcresini optimize etmektir.<\/p>\n<h3>1.2. Neden Firmware Geli\u015ftirmede Makefile Kullanmal\u0131?<\/h3>\n<p>Firmware geli\u015ftirme, genellikle mikrodenetleyiciler i\u00e7in C\/C++ gibi d\u00fc\u015f\u00fck seviyeli dillerde yaz\u0131l\u0131r. Bu projeler, donan\u0131ma \u00f6zel k\u00fct\u00fcphaneler, bellek haritalar\u0131 ve \u00e7apraz derleyiciler (cross-compilers) gerektirir. Makefile&#8217;lar, bu \u00f6zel gereksinimleri y\u00f6netmek i\u00e7in idealdir:<\/p>\n<ul>\n<li><b>Otomasyon:<\/b> Derleme, ba\u011flama, flashlama gibi ad\u0131mlar\u0131 tek bir komutla otomatikle\u015ftirebilirsiniz.<\/li>\n<li><b>Tekrarlanabilirlik:<\/b> Her zaman ayn\u0131 derleme ortam\u0131n\u0131 ve ad\u0131mlar\u0131n\u0131 kullanarak tutarl\u0131 sonu\u00e7lar elde edersiniz.<\/li>\n<li><b>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/b> Bir kaynak dosya de\u011fi\u015fti\u011finde, sadece o dosyan\u0131n ve ona ba\u011fl\u0131 di\u011fer dosyalar\u0131n yeniden derlenmesini sa\u011flar, bu da derleme s\u00fcresini k\u0131salt\u0131r.<\/li>\n<li><b>Esneklik:<\/b> Farkl\u0131 donan\u0131m platformlar\u0131 veya derleme yap\u0131land\u0131rmalar\u0131 i\u00e7in kolayca uyarlanabilir.<\/li>\n<li><b>Versiyon Kontrol\u00fc:<\/b> Makefile dosyas\u0131 da projenin bir par\u00e7as\u0131 oldu\u011fu i\u00e7in versiyon kontrol sistemleri (Git gibi) ile takip edilebilir.<\/li>\n<\/ul>\n<h3>1.3. Alternatif Ara\u00e7lar ve Makefile&#8217;\u0131n Avantajlar\u0131<\/h3>\n<p>Makefile&#8217;lara alternatif olarak CMake, SCons, Bazel gibi daha modern derleme sistemleri bulunmaktad\u0131r. Bu ara\u00e7lar genellikle daha y\u00fcksek seviyeli soyutlamalar sunar ve b\u00fcy\u00fck, karma\u015f\u0131k projeler i\u00e7in daha kolay \u00f6l\u00e7eklenebilir olabilirler. Ancak firmware geli\u015ftirme alan\u0131nda Makefile&#8217;\u0131n hala g\u00fc\u00e7l\u00fc avantajlar\u0131 vard\u0131r:<\/p>\n<ul>\n<li><b>Hafif ve \u015eeffaf:<\/b> Makefile&#8217;lar genellikle daha az karma\u015f\u0131k ve ne yapt\u0131klar\u0131n\u0131 anlamak daha kolayd\u0131r.<\/li>\n<li><b>Evrensel Destek:<\/b> Neredeyse t\u00fcm g\u00f6m\u00fcl\u00fc sistem geli\u015ftirme ortamlar\u0131 ve \u00e7apraz derleyiciler Make ile uyumludur.<\/li>\n<li><b>D\u00fc\u015f\u00fck Seviye Kontrol:<\/b> Derleme s\u00fcrecinin her ad\u0131m\u0131n\u0131 ince ayr\u0131nt\u0131s\u0131na kadar kontrol etme yetene\u011fi sunar, bu da donan\u0131ma yak\u0131n \u00e7al\u0131\u015f\u0131lan firmware projelerinde kritik olabilir.<\/li>\n<li><b>\u00d6\u011frenme E\u011frisi:<\/b> Temel Makefile s\u00f6zdizimi nispeten basittir ve h\u0131zl\u0131ca \u00f6\u011frenilebilir.<\/li>\n<\/ul>\n<h2>2. Temel Makefile S\u00f6zdizimi ve Bile\u015fenleri<\/h2>\n<h3>2.1. Hedefler (Targets) ve Ba\u011f\u0131ml\u0131l\u0131klar (Prerequisites)<\/h3>\n<p>Bir Makefile&#8217;\u0131n temel yap\u0131 ta\u015f\u0131 hedeflerdir. Bir hedef, genellikle olu\u015fturulacak bir dosya (\u00f6rne\u011fin, <code>.o<\/code> nesne dosyas\u0131 veya nihai <code>.elf<\/code> firmware dosyas\u0131) veya bir eylemi (\u00f6rne\u011fin, <code>clean<\/code>) temsil eder. Hedefler, bir veya daha fazla ba\u011f\u0131ml\u0131l\u0131\u011fa sahip olabilir. Ba\u011f\u0131ml\u0131l\u0131klar, hedefin olu\u015fturulmas\u0131 i\u00e7in gerekli olan di\u011fer dosyalard\u0131r.<\/p>\n<pre><code>\nhedef: ba\u011f\u0131ml\u0131l\u0131k1 ba\u011f\u0131ml\u0131l\u0131k2\n    komut\n<\/pre>\n<p><\/code><br \/>\nE\u011fer ba\u011f\u0131ml\u0131l\u0131klar hedeften daha yeniyse veya hedef mevcut de\u011filse, Make komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<h3>2.2. Komutlar (Recipes)<\/h3>\n<p>Komutlar, hedefe ula\u015fmak i\u00e7in Make taraf\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131lacak shell komutlar\u0131d\u0131r. Her komut sat\u0131r\u0131 bir <b>TAB karakteri<\/b> ile ba\u015flamak zorundad\u0131r. Bu, Makefile s\u00f6zdiziminin en kritik ve en s\u0131k hata yap\u0131lan noktalar\u0131ndan biridir.<\/p>\n<pre><code>\nprogram: main.o func.o\n    gcc main.o func.o -o program\n\nmain.o: main.c\n    gcc -c main.c -o main.o\n<\/pre>\n<p><\/code><\/p>\n<h3>2.3. De\u011fi\u015fkenler ve Kullan\u0131m\u0131<\/h3>\n<p>De\u011fi\u015fkenler, Makefile'larda tekrar eden de\u011ferleri depolamak ve kodu daha okunabilir ve y\u00f6netilebilir hale getirmek i\u00e7in kullan\u0131l\u0131r. De\u011fi\u015fkenler, <code>=<\/code>, <code>:=<\/code>, <code>?=<\/code> veya <code>+=<\/code> operat\u00f6rleriyle tan\u0131mlan\u0131r ve <code>$(DE\u011e\u0130\u015eKEN_ADI)<\/code> veya <code>${DE\u011e\u0130\u015eKEN_ADI}<\/code> \u015feklinde \u00e7a\u011fr\u0131l\u0131r.<\/p>\n<pre><code>\nCC = arm-none-eabi-gcc\nCFLAGS = -Wall -g -O2\nSOURCES = main.c uart.c\n\nall:\n    $(CC) $(CFLAGS) $(SOURCES) -o firmware.elf\n<\/pre>\n<p><\/code><\/p>\n<h3>2.4. Yorum Sat\u0131rlar\u0131<\/h3>\n<p>Makefile'larda yorum sat\u0131rlar\u0131, <code>#<\/code> karakteri ile ba\u015flar ve o sat\u0131r\u0131n sonuna kadar devam eder. Bu, Makefile'\u0131 a\u00e7\u0131klamak ve okunabilirli\u011fini art\u0131rmak i\u00e7in \u00f6nemlidir.<\/p>\n<pre><code>\n# Bu bir yorum sat\u0131r\u0131d\u0131r.\n# Derleyiciyi tan\u0131mla\nCC = arm-none-eabi-gcc\n<\/pre>\n<p><\/code><\/p>\n<h2>3. Firmware Projeleri \u0130\u00e7in Makefile Yap\u0131land\u0131rmas\u0131<\/h2>\n<h3>3.1. Derleyici ve Ba\u011flay\u0131c\u0131 Tan\u0131mlar\u0131<\/h3>\n<p>G\u00f6m\u00fcl\u00fc sistemler i\u00e7in genellikle \u00e7apraz derleyiciler kullan\u0131l\u0131r (\u00f6rne\u011fin, ARM tabanl\u0131 sistemler i\u00e7in <code>arm-none-eabi-gcc<\/code>). Makefile'\u0131n ba\u015f\u0131nda bu derleyici ve ba\u011flay\u0131c\u0131lar\u0131 tan\u0131mlamak standart bir uygulamad\u0131r.<\/p>\n<pre><code>\n# \u00c7apraz Derleyici Tan\u0131mlar\u0131\nTOOLCHAIN_PATH = \/usr\/local\/arm\/gcc-arm-none-eabi-10.3-2021.07\/bin\nCC = $(TOOLCHAIN_PATH)\/arm-none-eabi-gcc\nLD = $(TOOLCHAIN_PATH)\/arm-none-eabi-ld\nOBJCOPY = $(TOOLCHAIN_PATH)\/arm-none-eabi-objcopy\n<\/pre>\n<p><\/code><\/p>\n<h3>3.2. Kaynak Dosyalar\u0131n Y\u00f6netimi<\/h3>\n<p>Projenizdeki t\u00fcm C ve Assembly kaynak dosyalar\u0131n\u0131 listelemek, Makefile'\u0131n en \u00f6nemli ad\u0131mlar\u0131ndan biridir. Bu listeyi otomatik olarak olu\u015fturmak i\u00e7in joker karakterler (wildcards) veya <code>patsubst<\/code> gibi fonksiyonlar kullan\u0131labilir.<\/p>\n<pre><code>\n# Kaynak Dosyalar\u0131\nC_SOURCES = $(wildcard Src\/*.c)\nASM_SOURCES = $(wildcard Startup\/*.s)\n\n# Nesne Dosyalar\u0131\nOBJ_FILES = $(C_SOURCES:.c=.o) $(ASM_SOURCES:.s=.o)\n<\/pre>\n<p><\/code><br \/>\nBurada <code>$(wildcard ...)<\/code> belirli bir dizindeki t\u00fcm <code>.c<\/code> veya <code>.s<\/code> dosyalar\u0131n\u0131 bulur. <code>$(C_SOURCES:.c=.o)<\/code> ise <code>.c<\/code> uzant\u0131l\u0131 dosyalar\u0131 <code>.o<\/code> uzant\u0131l\u0131 dosyalara d\u00f6n\u00fc\u015ft\u00fcr\u00fcr, b\u00f6ylece nesne dosyalar\u0131n\u0131n listesi olu\u015fturulur.<\/p>\n<h3>3.3. Include Yollar\u0131 ve K\u00fct\u00fcphaneler<\/h3>\n<p>Derleyicinin ba\u015fl\u0131k dosyalar\u0131n\u0131 (header files) bulabilmesi i\u00e7in include yollar\u0131n\u0131 belirtmek gerekir. Ayr\u0131ca, harici k\u00fct\u00fcphaneler kullan\u0131l\u0131yorsa, bunlar\u0131n da ba\u011flanmas\u0131 (linking) gerekir.<\/p>\n<pre><code>\n# Include Yollar\u0131\nINC_DIRS = -IInc -I$(TOOLCHAIN_PATH)\/..\/arm-none-eabi\/include\n\n# K\u00fct\u00fcphaneler (\u00f6rne\u011fin, matematik k\u00fct\u00fcphanesi)\nLIBS = -lm\n\n# Ba\u011flay\u0131c\u0131 Beti\u011fi (Linker Script)\nLDSCRIPT = Linker\/stm32f4xx_flash.ld\n<\/pre>\n<p><\/code><\/p>\n<h3>3.4. Derleme Bayraklar\u0131 (Compiler Flags)<\/h3>\n<p>Derleyiciye hangi optimizasyon seviyesini kullanaca\u011f\u0131n\u0131, hangi uyar\u0131lar\u0131 g\u00f6sterece\u011fini veya hangi i\u015flemci mimarisine derleme yapaca\u011f\u0131n\u0131 bildiren bayraklar \u00e7ok \u00f6nemlidir.<\/p>\n<pre><code>\n# Derleyici Bayraklar\u0131\nMCU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard\nCFLAGS = $(MCU) -Wall -g -O2 -fno-common -ffunction-sections -fdata-sections\nASFLAGS = $(MCU) -g -Wa,-adhlns=$(@:.o=.lst)\nLDFLAGS = $(MCU) -T$(LDSCRIPT) -nostdlib -Wl,--gc-sections -Wl,-Map=$(BUILD_DIR)\/$(TARGET).map $(LIBS)\n<\/pre>\n<p><\/code><br \/>\nBurada <code>-g<\/code> hata ay\u0131klama sembollerini ekler, <code>-O2<\/code> optimizasyon seviyesini belirler, <code>-T$(LDSCRIPT)<\/code> ise ba\u011flay\u0131c\u0131 beti\u011fini belirtir.<\/p>\n<h2>4. Derleme S\u00fcreci: Hedefler, Ba\u011f\u0131ml\u0131l\u0131klar ve Komutlar<\/h2>\n<h3>4.1. <code>all<\/code> ve <code>clean<\/code> Hedefleri<\/h3>\n<p>Her Makefile'da neredeyse standart olan iki hedef vard\u0131r:<\/p>\n<ul>\n<li><b><code>all<\/code>:<\/b> Varsay\u0131lan hedeftir ve projenin nihai \u00e7\u0131kt\u0131s\u0131n\u0131 (firmware) olu\u015fturur. Genellikle ilk hedef olarak tan\u0131mlan\u0131r.<\/li>\n<li><b><code>clean<\/code>:<\/b> Derleme s\u0131ras\u0131nda olu\u015fan t\u00fcm ge\u00e7ici dosyalar\u0131 (<code>.o<\/code>, <code>.elf<\/code>, <code>.hex<\/code> vb.) siler. Bu, temiz bir derleme yapmak veya projenin boyutunu k\u00fc\u00e7\u00fcltmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<\/ul>\n<pre><code>\nTARGET = firmware\nBUILD_DIR = build\n\n.PHONY: all clean\n\nall: $(BUILD_DIR)\/$(TARGET).elf\n\nclean:\n    rm -f $(BUILD_DIR)\/*.o $(BUILD_DIR)\/*.elf $(BUILD_DIR)\/*.hex $(BUILD_DIR)\/*.map $(BUILD_DIR)\/*.bin\n    rm -rf $(BUILD_DIR)\n<\/pre>\n<p><\/code><br \/>\n<code>.PHONY<\/code> anahtar kelimesi, <code>all<\/code> ve <code>clean<\/code> gibi hedeflerin ger\u00e7ek bir dosya olmad\u0131\u011f\u0131n\u0131, sadece bir eylemi temsil etti\u011fini Make'e bildirir.<\/p>\n<h3>4.2. Nesne Dosyalar\u0131n\u0131n Olu\u015fturulmas\u0131 (.o)<\/h3>\n<p>Her <code>.c<\/code> veya <code>.s<\/code> kaynak dosyas\u0131, derleyici taraf\u0131ndan ayr\u0131 ayr\u0131 derlenerek bir <code>.o<\/code> (nesne) dosyas\u0131 olu\u015fturur. Make, bu i\u015flemi otomatik olarak yapabilen \"pattern rules\" (desen kurallar\u0131) kullan\u0131r.<\/p>\n<pre><code>\n$(BUILD_DIR)\/%.o: %.c\n    @mkdir -p $(@D)\n    $(CC) -c $(CFLAGS) $(INC_DIRS) $< -o $@\n\n$(BUILD_DIR)\/%.o: %.s\n    @mkdir -p $(@D)\n    $(CC) -c $(ASFLAGS) $< -o $@\n<\/pre>\n<p><\/code><br \/>\nBurada <code>%<\/code> bir joker karakterdir. <code>$<<\/code> mevcut kural\u0131n ilk ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 (yani kaynak dosyay\u0131), <code>$@<\/code> ise hedefin ad\u0131n\u0131 (yani nesne dosyas\u0131n\u0131) temsil eden otomatik de\u011fi\u015fkenlerdir. <code>@mkdir -p $(@D)<\/code> komutu, hedef dosyan\u0131n dizini yoksa olu\u015fturur.<\/p>\n<h3>4.3. Firmware Dosyas\u0131n\u0131n Ba\u011flanmas\u0131 (Linking)<\/h3>\n<p>T\u00fcm nesne dosyalar\u0131 olu\u015fturulduktan sonra, ba\u011flay\u0131c\u0131 (linker) taraf\u0131ndan bir araya getirilerek nihai firmware dosyas\u0131 (genellikle <code>.elf<\/code> uzant\u0131l\u0131) olu\u015fturulur. Bu i\u015flem s\u0131ras\u0131nda ba\u011flay\u0131c\u0131 beti\u011fi (linker script) kullan\u0131l\u0131r.<\/p>\n<pre><code>\n$(BUILD_DIR)\/$(TARGET).elf: $(OBJ_FILES)\n    $(CC) $(LDFLAGS) $(OBJ_FILES) -o $@\n    $(OBJCOPY) -O ihex $@ $(BUILD_DIR)\/$(TARGET).hex\n    $(OBJCOPY) -O binary $@ $(BUILD_DIR)\/$(TARGET).bin\n<\/pre>\n<p><\/code><br \/>\nBurada <code>$(OBJCOPY)<\/code> arac\u0131, <code>.elf<\/code> dosyas\u0131n\u0131 flashlama i\u00e7in uygun <code>.hex<\/code> veya <code>.bin<\/code> formatlar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>4.4. \u00d6rnek Bir Firmware Makefile'\u0131<\/h3>\n<p>Yukar\u0131daki par\u00e7alar\u0131 bir araya getiren basitle\u015ftirilmi\u015f bir \u00f6rnek:<\/p>\n<pre><code>\n# Makefile for a simple ARM Cortex-M project\n\n# Toolchain ayarlar\u0131\nTOOLCHAIN_PATH = \/usr\/local\/arm\/gcc-arm-none-eabi-10.3-2021.07\/bin\nCC = $(TOOLCHAIN_PATH)\/arm-none-eabi-gcc\nOBJCOPY = $(TOOLCHAIN_PATH)\/arm-none-eabi-objcopy\n\n# Proje ayarlar\u0131\nTARGET = my_firmware\nBUILD_DIR = build\nSRC_DIRS = Src Startup\nINC_DIRS = -IInc -I$(TOOLCHAIN_PATH)\/..\/arm-none-eabi\/include\nLDSCRIPT = Linker\/my_linker_script.ld\n\n# MCU ve derleyici bayraklar\u0131\nMCU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard\nCFLAGS = $(MCU) -Wall -g -O2 -fno-common -ffunction-sections -fdata-sections\nASFLAGS = $(MCU) -g -Wa,-adhlns=$(@:.o=.lst)\nLDFLAGS = $(MCU) -T$(LDSCRIPT) -nostdlib -Wl,--gc-sections -Wl,-Map=$(BUILD_DIR)\/$(TARGET).map\n\n# Kaynak dosyalar\u0131 bulma\nC_SOURCES = $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)\/*.c))\nASM_SOURCES = $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)\/*.s))\nOBJ_FILES = $(patsubst %.c,$(BUILD_DIR)\/%.o,$(C_SOURCES)) \\\n            $(patsubst %.s,$(BUILD_DIR)\/%.o,$(ASM_SOURCES))\n\n.PHONY: all clean flash\n\nall: $(BUILD_DIR)\/$(TARGET).elf\n\n# Nesne dosyalar\u0131n\u0131 derleme kurallar\u0131\n$(BUILD_DIR)\/%.o: %.c\n    @mkdir -p $(@D)\n    $(CC) -c $(CFLAGS) $(INC_DIRS) $< -o $@\n\n$(BUILD_DIR)\/%.o: %.s\n    @mkdir -p $(@D)\n    $(CC) -c $(ASFLAGS) $(INC_DIRS) $< -o $@\n\n# ELF dosyas\u0131n\u0131 ba\u011flama ve di\u011fer formatlara d\u00f6n\u00fc\u015ft\u00fcrme\n$(BUILD_DIR)\/$(TARGET).elf: $(OBJ_FILES)\n    $(CC) $(LDFLAGS) $(OBJ_FILES) -o $@\n    $(OBJCOPY) -O ihex $@ $(BUILD_DIR)\/$(TARGET).hex\n    $(OBJCOPY) -O binary $@ $(BUILD_DIR)\/$(TARGET).bin\n    @echo \"Firmware olu\u015fturuldu: $(BUILD_DIR)\/$(TARGET).elf\"\n\nclean:\n    rm -rf $(BUILD_DIR)\n\nflash: all\n    # Flashlama komutlar\u0131 buraya gelecek (\u00f6rne\u011fin, st-flash veya openocd)\n    # openocd -f interface\/stlink.cfg -f target\/stm32f4x.cfg -c \"program $(BUILD_DIR)\/$(TARGET).elf verify reset exit\"\n    @echo \"Firmware flashland\u0131.\"\n<\/pre>\n<p><\/code><\/p>\n<h2>5. Geli\u015fmi\u015f Makefile Teknikleri ve Optimizasyon<\/h2>\n<h3>5.1. Otomatik De\u011fi\u015fkenler ve Desen Kurallar\u0131<\/h3>\n<p>Yukar\u0131daki \u00f6rnekte kullan\u0131lan <code>$<<\/code> ve <code>$@<\/code> gibi otomatik de\u011fi\u015fkenler, Makefile'lar\u0131 \u00e7ok daha esnek ve genel hale getirir.<\/p>\n<ul>\n<li><code>$@<\/code>: Hedefin tam ad\u0131.<\/li>\n<li><code>$<<\/code>: \u0130lk ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n ad\u0131.<\/li>\n<li><code>$^<\/code>: T\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n bo\u015flukla ayr\u0131lm\u0131\u015f listesi.<\/li>\n<li><code>$(@D)<\/code>: Hedefin dizin k\u0131sm\u0131.<\/li>\n<li><code>$(@F)<\/code>: Hedefin dosya ad\u0131 k\u0131sm\u0131.<\/li>\n<\/ul>\n<p>Desen kurallar\u0131 (<code>%.o: %.c<\/code> gibi), Make'in bir\u00e7ok benzer dosyay\u0131 tek bir kural ile derlemesini sa\u011flar.<\/p>\n<h3>5.2. Ko\u015fullu \u0130fadeler ve Fonksiyonlar<\/h3>\n<p>Makefiles, <code>ifeq<\/code>, <code>ifneq<\/code>, <code>ifdef<\/code>, <code>ifndef<\/code> gibi ko\u015fullu ifadeler ve <code>subst<\/code>, <code>patsubst<\/code>, <code>wildcard<\/code>, <code>foreach<\/code> gibi yerle\u015fik fonksiyonlar sunar. Bu, Makefile'\u0131 farkl\u0131 derleme yap\u0131land\u0131rmalar\u0131 veya platformlar i\u00e7in dinamik olarak uyarlaman\u0131za olanak tan\u0131r.<\/p>\n<pre><code>\n# Debug veya Release moduna g\u00f6re bayraklar\u0131 de\u011fi\u015ftirme\nifeq ($(BUILD_TYPE), debug)\n    CFLAGS += -DDEBUG -O0\nelse\n    CFLAGS += -DNDEBUG -O2\nendif\n\n# foreach fonksiyonu ile birden fazla dizindeki kaynaklar\u0131 toplama\nSRC_DIRS = Core\/Src Drivers\/Src\nC_SOURCES = $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)\/*.c))\n<\/pre>\n<p><\/code><\/p>\n<h3>5.3. Paralel Derleme ve Performans \u0130yile\u015ftirmeleri<\/h3>\n<p>Modern i\u015flemciler birden fazla \u00e7ekirde\u011fe sahiptir. Make, <code>-j<\/code> bayra\u011f\u0131 ile paralel derlemeyi destekler. Bu, \u00f6zellikle b\u00fcy\u00fck projelerde derleme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131saltabilir.<\/p>\n<pre><code>\nmake -j8 # 8 \u00e7ekirdek kullanarak paralel derleme yap\n<\/pre>\n<p><\/code><br \/>\nAyr\u0131ca, sadece de\u011fi\u015fen dosyalar\u0131n derlenmesini sa\u011flamak (ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi) ve gereksiz yeniden derlemeleri \u00f6nlemek de performans\u0131 art\u0131ran temel fakt\u00f6rlerdir.<\/p>\n<h2>6. Hata Ay\u0131klama, Temizleme ve Ek \u00d6zellikler<\/h2>\n<h3>6.1. Hata Ay\u0131klama Sembolleri ve Optimizasyon Seviyeleri<\/h3>\n<p>Firmware geli\u015ftirirken hata ay\u0131klama (debugging) kritik \u00f6neme sahiptir. Derleyiciye <code>-g<\/code> bayra\u011f\u0131n\u0131 eklemek, hata ay\u0131klay\u0131c\u0131n\u0131n kaynak kodunuzu anlayabilmesi i\u00e7in gerekli sembolleri \u00fcretmesini sa\u011flar. Optimizasyon seviyeleri (<code>-O0<\/code>, <code>-O1<\/code>, <code>-O2<\/code>, <code>-O3<\/code>, <code>-Os<\/code>) kodun boyutunu ve h\u0131z\u0131n\u0131 etkiler. Hata ay\u0131klama yaparken genellikle <code>-O0<\/code> (optimizasyon yok) kullan\u0131l\u0131r, \u00e7\u00fcnk\u00fc optimize edilmi\u015f kodun ad\u0131m ad\u0131m izlenmesi zordur. \u00dcretim i\u00e7in ise <code>-O2<\/code> veya <code>-Os<\/code> (boyut i\u00e7in optimize) tercih edilir.<\/p>\n<h3>6.2. <code>clean<\/code> ve <code>distclean<\/code> Hedefleri<\/h3>\n<p><code>clean<\/code> hedefi, genellikle <code>.o<\/code>, <code>.elf<\/code>, <code>.hex<\/code> gibi derleme \u00e7\u0131kt\u0131lar\u0131n\u0131 siler. <code>distclean<\/code> hedefi ise daha kapsaml\u0131d\u0131r; sadece derleme \u00e7\u0131kt\u0131lar\u0131n\u0131 de\u011fil, ayn\u0131 zamanda otomatik olu\u015fturulan yap\u0131land\u0131rma dosyalar\u0131n\u0131, log dosyalar\u0131n\u0131 veya test sonu\u00e7lar\u0131n\u0131 da silebilir. Bu, projeyi ilk haline d\u00f6nd\u00fcrmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code>\ndistclean: clean\n    rm -f config.h\n    # Di\u011fer da\u011f\u0131t\u0131m \u00f6ncesi temizleme i\u015flemleri\n<\/pre>\n<p><\/code><\/p>\n<h3>6.3. Firmware'\u0131 Y\u00fckleme (Flashing) Komutlar\u0131<\/h3>\n<p>Firmware olu\u015fturulduktan sonra, mikrodenetleyiciye y\u00fcklenmesi (flashing) gerekir. Bu i\u015flem genellikle JTAG\/SWD hata ay\u0131klay\u0131c\u0131lar\u0131 (ST-Link, J-Link vb.) veya \u00f6zel programlama ara\u00e7lar\u0131 arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r. Makefile'a bir <code>flash<\/code> hedefi ekleyerek bu s\u00fcreci otomatikle\u015ftirebilirsiniz.<\/p>\n<pre><code>\nflash: all\n    # ST-Link ile flashlama \u00f6rne\u011fi (st-flash arac\u0131 kullanarak)\n    st-flash write $(BUILD_DIR)\/$(TARGET).bin 0x08000000\n\n    # OpenOCD ile flashlama \u00f6rne\u011fi\n    # openocd -f interface\/stlink.cfg -f target\/stm32f4x.cfg -c \"program $(BUILD_DIR)\/$(TARGET).elf verify reset exit\"\n<\/pre>\n<p><\/code><br \/>\nBu komutlar, kulland\u0131\u011f\u0131n\u0131z donan\u0131m ve ara\u00e7 zincirine g\u00f6re de\u011fi\u015fiklik g\u00f6sterecektir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Makefile'lar, g\u00f6m\u00fcl\u00fc sistemler ve firmware geli\u015ftirme d\u00fcnyas\u0131nda vazge\u00e7ilmez ara\u00e7lard\u0131r. Derleme s\u00fcrecini otomatikle\u015ftirmek, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek ve projeyi daha d\u00fczenli hale getirmek i\u00e7in g\u00fc\u00e7l\u00fc bir yap\u0131 sunarlar. Temel s\u00f6zdizimini ve geli\u015fmi\u015f \u00f6zelliklerini anlayarak, karma\u015f\u0131k firmware projelerinizi bile verimli bir \u015fekilde y\u00f6netebilir, derleme s\u00fcrelerini optimize edebilir ve geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rabilirsiniz. Her ne kadar ilk ba\u015fta biraz \u00f6\u011frenme e\u011frisi olsa da, Makefile'lara yat\u0131r\u0131m yapmak, uzun vadede zaman ve \u00e7aba tasarrufu sa\u011flayacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><b>1. Makefile kullanmak zorunda m\u0131y\u0131m?<\/b><br \/>\nHay\u0131r, zorunda de\u011filsiniz. K\u00fc\u00e7\u00fck projelerde manuel derleme komutlar\u0131 kullanabilir veya IDE'lerin (Entegre Geli\u015ftirme Ortam\u0131) kendi derleme sistemlerini kullanabilirsiniz. Ancak b\u00fcy\u00fck ve karma\u015f\u0131k projelerde, ekip \u00e7al\u0131\u015fmas\u0131nda veya s\u00fcrekli entegrasyon (CI) ortamlar\u0131nda Makefile'lar otomasyon ve tutarl\u0131l\u0131k i\u00e7in \u015fiddetle tavsiye edilir.<\/p>\n<p><b>2. CMake ile Makefile'\u0131n fark\u0131 nedir? Hangisini kullanmal\u0131y\u0131m?<\/b><br \/>\nCMake, Makefile'lar i\u00e7in bir \"Makefile \u00fcreteci\" olarak d\u00fc\u015f\u00fcn\u00fclebilir. CMake, daha y\u00fcksek seviyeli bir yap\u0131land\u0131rma dili kullanarak platformdan ba\u011f\u0131ms\u0131z derleme dosyalar\u0131 (\u00f6rne\u011fin, Linux'ta Makefile, Windows'ta Visual Studio projesi) olu\u015fturur. Makefile'lar ise do\u011frudan derleme komutlar\u0131n\u0131 i\u00e7erir. Firmware projeleri genellikle daha d\u00fc\u015f\u00fck seviye kontrol gerektirdi\u011finden ve derleme ortamlar\u0131 daha standart oldu\u011fundan, do\u011frudan Makefile kullanmak yayg\u0131nd\u0131r. B\u00fcy\u00fck, \u00e7ok platformlu projelerde CMake daha uygun olabilir.<\/p>\n<p><b>3. Makefile'\u0131mda \"Tab karakteri hatas\u0131\" al\u0131yorum, neden?<\/b><br \/>\nBu, Makefile'larda en s\u0131k kar\u015f\u0131la\u015f\u0131lan hatalardan biridir. Make, komut sat\u0131rlar\u0131n\u0131n mutlaka bir TAB karakteri ile ba\u015flamas\u0131n\u0131 bekler, bo\u015fluk (space) karakteri ile de\u011fil. Edit\u00f6r\u00fcn\u00fcz\u00fcn TAB karakterini otomatik olarak bo\u015fluklara d\u00f6n\u00fc\u015ft\u00fcrmedi\u011finden emin olun.<\/p>\n<p><b>4. Makefile'\u0131m\u0131 nas\u0131l optimize edebilirim?<\/b><br \/>\nOptimizasyon i\u00e7in \u015funlar\u0131 yapabilirsiniz:<\/p>\n<ul>\n<li>Do\u011fru ba\u011f\u0131ml\u0131l\u0131klar\u0131 tan\u0131mlay\u0131n, b\u00f6ylece sadece de\u011fi\u015fen dosyalar yeniden derlenir.<\/li>\n<li>Paralel derlemeyi etkinle\u015ftirin (<code>make -jN<\/code>).<\/li>\n<li>Gereksiz dosyalar\u0131 ve dizinleri <code>clean<\/code> hedefine ekleyin.<\/li>\n<li>De\u011fi\u015fkenleri ve fonksiyonlar\u0131 kullanarak kodu daha mod\u00fcler ve okunabilir hale getirin.<\/li>\n<\/ul>\n<p><b>5. Makefile'\u0131 farkl\u0131 donan\u0131mlar i\u00e7in nas\u0131l uyarlayabilirim?<\/b><br \/>\nKo\u015fullu ifadeler (<code>ifeq<\/code>) kullanarak veya farkl\u0131 Makefile'lar olu\u015fturarak bunu yapabilirsiniz. \u00d6rne\u011fin, <code>MCU<\/code> veya <code>BOARD<\/code> de\u011fi\u015fkenlerine g\u00f6re farkl\u0131 derleyici bayraklar\u0131 veya linker scriptleri se\u00e7ebilirsiniz.<\/p>\n<pre><code>\nifeq ($(BOARD), STM32F407)\n    LDSCRIPT = Linker\/stm32f407_flash.ld\n    MCU = -mcpu=cortex-m4\nelse ifeq ($(BOARD), ESP32)\n    CC = xtensa-esp32-elf-gcc\n    LDSCRIPT = Linker\/esp32.ld\n    MCU = -mlongcalls\nendif\n<\/pre>\n<p><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"Makefile Kullanarak Firmware Olu\u015fturma Rehberi\nG\u00f6m\u00fcl\u00fc sistemler d\u00fcnyas\u0131nda, donan\u0131m \u00fczerinde \u00e7al\u0131\u015facak yaz\u0131l\u0131m\u0131, yani firmware&#8217;i olu\u015fturmak k&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-36684","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Makefile Kullanarak Firmware Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Makefile Kullanarak Firmware Olu\u015fturma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Makefile Kullanarak Firmware Olu\u015fturma Rehberi G\u00f6m\u00fcl\u00fc sistemler d\u00fcnyas\u0131nda, donan\u0131m \u00fczerinde \u00e7al\u0131\u015facak yaz\u0131l\u0131m\u0131, yani firmware&#039;i olu\u015fturmak k...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-21T13:00:42+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Makefile Kullanarak Firmware Olu\u015fturma Rehberi\",\"datePublished\":\"2025-12-21T13:00:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/\"},\"wordCount\":2027,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/\",\"name\":\"Makefile Kullanarak Firmware Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-21T13:00:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Makefile Kullanarak Firmware Olu\u015fturma Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Makefile Kullanarak Firmware Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Makefile Kullanarak Firmware Olu\u015fturma Rehberi","og_description":"Makefile Kullanarak Firmware Olu\u015fturma Rehberi G\u00f6m\u00fcl\u00fc sistemler d\u00fcnyas\u0131nda, donan\u0131m \u00fczerinde \u00e7al\u0131\u015facak yaz\u0131l\u0131m\u0131, yani firmware'i olu\u015fturmak k...","og_url":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-21T13:00:42+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"7 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Makefile Kullanarak Firmware Olu\u015fturma Rehberi","datePublished":"2025-12-21T13:00:42+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/"},"wordCount":2027,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/","name":"Makefile Kullanarak Firmware Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-21T13:00:42+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/makefile-kullanarak-firmware-olusturma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Makefile Kullanarak Firmware Olu\u015fturma Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36684"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36684\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}