# Programs
HOST=
PROG_CC=     cc
PROG_AR=     ar
PROG_RANLIB= ranlib
CC=          $(HOST)$(PROG_CC)
AR=          $(HOST)$(PROG_AR)
RANLIB=      $(HOST)$(PROG_RANLIB)
RM=          rm -f
MKDIR=       mkdir
MKDIR_P=     $(MKDIR) -p
INSTALL=     install -c -m 644

# User flags
CFLAGS=      -g -O2 -pipe
LDFLAGS=

# Internal flags
M_CFLAGS=    -Wall -I. $(CFLAGS)
M_LDFLAGS=   $(LDFLAGS)

# Installation
DESTDIR=
PREFIX=      /usr/local
LIBDIR=      $(DESTDIR)$(PREFIX)/lib
INCLUDEDIR=  $(DESTDIR)$(PREFIX)/include

# Tasks definition
lib_LIBRARIES=         libl4basic.a
libl4basic_a_OBJECTS=  l4array.o l4array2.o l4file.o l4list.o l4arg.o
libl4basic_a_HEADERS=  $(libl4basic_a_OBJECTS:.o=.h)

check_PROGRAMS=        test-array test-array2 test-file test-list test-arg
check_OBJECTS=         $(check_PROGRAMS:=.o)

# Build dependencies
l4array_o_DEPENDS=     l4common.h
l4array2_o_DEPENDS=    l4common.h
l4file_o_DEPENDS=      l4common.h l4array.o
l4list_o_DEPENDS=      l4common.h
l4arg_o_DEPENDS=       l4common.h l4array.o

test_array_o_DEPENDS=  l4array.o
test_array2_o_DEPENDS= l4array2.o
test_file_o_DEPENDS=   l4file.o l4array.o
test_list_o_DEPENDS=   l4list.o
test_arg_o_DEPENDS=    l4arg.o l4array.o

.POSIX:
.PHONY: all clean install install-HEADERS install-LIB \
		uninstall deinstall remove
.SUFFIXES: .c.o
.c.o:
	$(CC) $(M_CFLAGS) -c $< -o $@

all: $(lib_LIBRARIES)
check: $(check_PROGRAMS)
	for i in $(check_PROGRAMS); do ./$$i || exit 1; done
libl4basic.a: $(libl4basic_a_OBJECTS)
	$(AR) rcs $@ $(libl4basic_a_OBJECTS)
	$(RANLIB) $@
l4array.o: l4array.c l4array.h $(l4array_o_DEPENDS) 
l4array2.o: l4array2.c l4array2.h $(l4array2_o_DEPENDS)
l4file.o: l4file.c l4file.h $(l4file_o_DEPENDS)
l4list.o: l4list.c l4list.h $(l4list_o_DEPENDS)
l4arg.o: l4arg.c l4arg.h $(l4arg_o_DEPENDS)

test-array: test-array.o $(test_array_o_DEPENDS)
	$(CC) $(M_CFLAGS) test-array.o $(test_array_o_DEPENDS) -o $@ $(M_LDFLAGS)
test-array2: test-array2.o $(test_array2_o_DEPENDS)
	$(CC) $(M_CFLAGS) test-array2.o $(test_array2_o_DEPENDS) -o $@ $(M_LDFLAGS)
test-file: test-file.o $(test_file_o_DEPENDS)
	$(CC) $(M_CFLAGS) test-file.o $(test_file_o_DEPENDS) -o $@ $(M_LDFLAGS)
test-list: test-list.o $(test_list_o_DEPENDS)
	$(CC) $(M_CFLAGS) test-list.o $(test_list_o_DEPENDS) -o $@ $(M_LDFLAGS)
test-arg: test-arg.o $(test_arg_o_DEPENDS)
	$(CC) $(M_CFLAGS) test-arg.o $(test_arg_o_DEPENDS) -o $@ $(M_LDFLAGS)

clean:
	-$(RM) \
		$(lib_LIBRARIES) $(libl4basic_a_OBJECTS) \
		$(check_PROGRAMS) $(check_OBJECTS)

install: all install-HEADERS install-LIB
install-LIB:
	-$(MKDIR_P) $(LIBDIR)
	$(INSTALL) $(lib_LIBRARIES) $(LIBDIR)
install-HEADERS:
	-$(MKDIR_P) $(INCLUDEDIR)
	$(INSTALL) $(libl4basic_a_HEADERS) $(INCLUDEDIR)

deinstall: uninstall
remove: uninstall
uninstall:
	for i in $(lib_LIBRARIES); do $(RM) $(LIBDIR)/$$i; done
	for i in $(libl4basic_a_HEADERS); do $(RM) $(INCLUDEDIR)/$$i; done
