# Compiler/Linker
CC = gcc
LD = gcc

# compiler/linker flags
CFLAGS = -g -Wall
LDFLAGS = -g -L/usr/X11R6/lib -lX11

# files removal
RM = /bin/rm -f

# programs' object files
S_WIN_OBJS = simple-window.o
S_DRAW_OBJS = simple-drawing.o
EVENTS_OBJS = events.o
S_TEXT_OBJS = simple-text.o
S_WM_HINTS_OBJS = simple-wm-hints.o
WIN_OPS_OBJS = window-operations.o
COLOR_DRAW_OBJS = color-drawing.o
DRAW_PIXMAP_OBJS = draw-pixmap.o
CURSOR_OBJS = cursor.o

ALL_OBJS = $(S_WIN_OBJS) $(S_DRAW_OBJS) $(EVENTS_OBJS) $(S_TEXT_OBJS) \
		$(S_WM_HINTS_OBJS) $(WIN_OPS_OBJS) $(COLOR_DRAW_OBJS) \
		$(DRAW_PIXMAP_OBJS) $(CURSOR_OBJS)

# programs' executables
S_WIN = simple-window
S_DRAW = simple-drawing
EVENTS = events
S_TEXT = simple-text
S_WM_HINTS = simple-wm-hints
WIN_OPS = window-operations
COLOR_DRAW = color-drawing
DRAW_PIXMAP = draw-pixmap
CURSOR = cursor

ALL_PROGS = $(S_WIN) $(S_DRAW) $(EVENTS) $(S_TEXT) $(S_WM_HINTS) $(WIN_OPS) \
		$(COLOR_DRAW) $(DRAW_PIXMAP) $(CURSOR)

# top-level rule
all: $(S_WIN) $(S_DRAW) $(EVENTS) $(S_TEXT) $(S_WM_HINTS) $(WIN_OPS) $(COLOR_DRAW) $(DRAW_PIXMAP) $(CURSOR)

$(S_WIN): $(S_WIN_OBJS)
	$(LD) $(LDFLAGS) $(S_WIN_OBJS) -o $(S_WIN)

$(S_DRAW): $(S_DRAW_OBJS)
	$(LD) $(LDFLAGS) $(S_DRAW_OBJS) -o $(S_DRAW)

$(EVENTS): $(EVENTS_OBJS)
	$(LD) $(LDFLAGS) $(EVENTS_OBJS) -o $(EVENTS)

$(S_TEXT): $(S_TEXT_OBJS)
	$(LD) $(LDFLAGS) $(S_TEXT_OBJS) -o $(S_TEXT)

$(S_WM_HINTS): $(S_WM_HINTS_OBJS)
	$(LD) $(LDFLAGS) $(S_WM_HINTS_OBJS) -o $(S_WM_HINTS)

$(S_WIN_OPS): $(S_WIN_OPS_OBJS)
	$(LD) $(LDFLAGS) $(S_WIN_OPS_OBJS) -o $(S_WIN_OPS)

$(COLOR_DRAW): $(COLOR_DRAW_OBJS)
	$(LD) $(LDFLAGS) $(COLOR_DRAW_OBJS) -o $(COLOR_DRAW)

$(DRAW_PIXMAP): $(DRAW_PIXMAP_OBJS)
	$(LD) $(LDFLAGS) $(DRAW_PIXMAP_OBJS) -o $(DRAW_PIXMAP)

$(CURSOR): $(CURSOR_OBJS)
	$(LD) $(LDFLAGS) $(CURSOR_OBJS) -o $(CURSOR)

# compile C source files into object files.
%.o: %.c $(HEADERS)
	$(CC) $(CFLAGS) -c $<

# clean everything
clean:
	$(RM) $(ALL_OBJS) $(ALL_PROGS) core

