ПОС/Лаб 4 2016

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Група 3

Задатак 1

Поставка

(6) У фајл 'test/project/makefile' уписати правила за превођење кода датог у фолдерима 'src' и 'include'. У фолдеру 'obj' треба се нађу сви .о фајлови, У 'project' фолдеру треба да се налази извршни фајл под називом 'program'. Правила треба да уклоне непотребне зависности. Користити променљиве, '$@', '$<', '$^' и 'patsubst' где год има смисла.

(4) У 'makefile' додати акције 'clean' и 'all'. 'clean' треба да брише све фајлове који нису '.c' или '.h' или 'makefile' (потребно је уклонити и скривене фајлове који имају '~' на крају, а које генерише едитор) 'all' треба да уради поновно формирање свих зависних фајлова без обзира да ли су ажурирани или не (дакле, треба да се опет генеришу сви '.о' фајлови, као и сам програм) Заштити 'clean' и 'all' акције тако да се увек извршавају.

Решење

Једно од решења које има максимални број бодова:

# makefile

CC = gcc
OBJDIR = ./obj
SRCDIR = ./src
IDIR = ./src/include
CFLAGS = -w -I$(IDIR)
PROGRAM = ../program

SRC = $(wildcard $(SRCDIR)/*.c)
OBJ = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRC))
DEP = $(patsubst $(SRCDIR)/%.c,$(SRCDIR)/%.d,$(SRC))

$(PROGRAM): $(OBJ) 
	$(CC) -o $@ $^

$(OBJDIR)/%.o: $(SRCDIR)/%.c | proveridir
	$(CC) -o $@ -c $< $(CFLAGS)

$(SRCDIR)/%.d: $(SRCDIR)/%.c
	$(CC) -MM $< $(CFLAGS) > $@
	include $(DEP) 

clean:
	rm -rf obj
	rm -f $(PROGRAM)
	rm -f $(SRCDIR)/*.d
	rm -f *~
all: clean $(PROGRAM)

proveridir:
	[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
.PHONY: 
	proveridir
	clean
	all