############################################### # Macros ############################################### RELEASE_OPTIONS = DEBUG_OPTIONS = -g RELEASE_OBJS = teststack.o stack.o DEBUG_OBJS = teststack.do stack.do RELEASE_EXEC = teststack DEBUG_EXEC = teststackgdb ############################################### # Pattern rules ############################################### %.o: %.c gcc $(RELEASE_OPTIONS) -c -o $@ $< %.do: %.c gcc $(DEBUG_OPTIONS) -c -o $@ $< ############################################### # Build rules for non-file targets ############################################### all: debug release release: $(RELEASE_EXEC) debug: $(DEBUG_EXEC) clobber: clean rm -f *~ \#*\# core clean: rm -f $(RELEASE_OBJS) $(DEBUG_OBJS) $(RELEASE_EXEC) $(DEBUG_EXEC) ############################################### # Build rules for executable file targets ############################################### $(RELEASE_EXEC): $(RELEASE_OBJS) gcc -o $(RELEASE_EXEC) $(RELEASE_OBJS) $(DEBUG_EXEC): $(DEBUG_OBJS) gcc -o $(DEBUG_EXEC) $(DEBUG_OBJS) ############################################### # Build rules for object file targets # Some can be automatically generated via gcc -M .c: ############################################### teststack.o: teststack.c stack.h teststack.do: teststack.c stack.h stack.o: stack.c stack.h stack.do: stack.c stack.h