makefile ile derleme -4

Adım 5: clean rule

hellomake dışında yani kodumuzu derleme dışında make'e yeni bir iş yaptırmak için yeni bir kural tanımlıyoruz: clean

Öncelikle, anladığım, bu ":" öncesi kuralların sonucunda bir çıktı (output) oluyor. Onun olmaması için, yani make clean dediğimde bazı dosyaları silmesi, clean.exe diye bir şey üretmemesi için .PHONY kuralını çalıştırıyorum. Bu kuralla tanımlanan kurallar çıktı üretmiyor.

.PHONY: clean

clean dışında başka çıktı üretmesini istemediğim kurallar olsa yanına yazmaya devam edecektim.
Şimdi clean kuralını tanımlıyorum:

clean:
rm -f $(OBJ)

Burada dosyayı silecek rm komutunu -f yani "force" parametresi ile çağırıyorum. böylece zaten "dosya yok, yine de devam edecek misin" gibi sorular sormadan olanı silip işini bitiriyor.

Ancak burada şu sorun var. komut satırında rm yazınca herhangi bir şey çalışmıyor. yani path'imde gcc.exe gibi make.exe ya da mingw31-make.exe gibi rm.exe olması gerekiyordu ancak yok. komut satırına rm yazdığımda 
"'rm' is not recognized as an internal or external command, operable program or batch file."
hatası alıyorum.
Bunun için yine MinGW klasöründe msys dizini var. onun altındaki bin'de rm.exe yer alıyor.
"C:\MinGW\msys\1.0\bin"i ortam değişkenlerine ekliyorum. komut satırını (cmd.exe) tekrardan çalıştırıyorum, rm dediğimde  "rm: missing operand" hatası veriyor yanına bir argüman tanımlamadığım için. Yani rm.exe artık çalışıyor.

denemek için makefile öncesi şu satırı çalıştırıyorum.
rm -f hellomake.o hellofunc.o
ve .o dosyalarını siliyor. o zaman makefile'a bu satırları ekleyebilirim.
Eklediğimde
make dediğimde kodu derleyip .o dosyalarını oluşturup sonra .exe'yi oluşturuyor.
make clean dediğimde oluşan .o dosyalarını siliyor.
(msys altında make.exe de olduğu için artık mingw32-make dememe gerek kalmadı)

Adım 5: farklı dizinler

Dediğim gibi bu işe başlarken asıl amacım farklı dizinlerdeki kodları derlemekti. daha doğrusu, kaynak kodları ayrı dizinde, header dosyaları ayrı dizinde, oluşan object dosyaları farklı dizinde olacak. Çünkü elimde başkasının oluşturduğu bir proje var ve tüm kaynak kodları, header dosyaları birlikte duruyor. bir de .o dosyaları eklenince ortalık epey karışıyor. Aynı klasörde 60 üzerinde dosya oluşuyor.

Öncelikle her şeyi ana klasör altında src (source) diye bir klasöre atıyorum. Anladığım kadarıyla makefile ile kaynak kodları aynı klasörde olmak zorunda.
Sonra bu klasör altında obj diye bir klasör oluşturuyorum ve kodu şu şekilde değiştiriyorum.

CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
_OBJ = hellomake.o hellofunc.o 

ODIR=obj
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
@echo merhaba
@echo $(OBJ)

$(CC) -o $@ $^ $(CFLAGS)

.PHONY: clean

clean:
rm -f $(_OBJ)

Şimdi derleme yaptığımda .o dosyaları obj klasörünün altına gidiyor. clean dediğimde de oradaki .o dosyaları siliniyor.

Son olarak da header dosyasını ana dizin altında inc klasörüne koyuyorum, yani src klasörünün yanında bir de inc oluyor. makefile ve *.c dosyaları hala src altında.

CC=gcc
_DEPS = hellomake.h
_OBJ = hellomake.o hellofunc.o 

ODIR=obj
IDIR =../inc
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

CFLAGS=-I$(IDIR)


$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
@echo merhaba
@echo $(OBJ)
@echo $(DEPS)
$(CC) -o $@ $^ $(CFLAGS)

.PHONY: clean

clean:
rm -f $(OBJ)

Bu şekilde kod derleniyor.
Çok şükür bitti...

Yorumlar

Bu blogdaki popüler yayınlar

Nasıl yazılır

makefile ile derleme -1

makefile ile derleme -2