# 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
NAME=        l4basic
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 l4strv.o l4arg.o \
					   l4list.o l4str.o l4posix.o l4sysdep.o
libl4basic_a_HEADERS=  $(libl4basic_a_OBJECTS:.o=.h) l4common.h

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

# Build dependencies
l4array_o_DEPENDS=     l4common.h
l4array2_o_DEPENDS=    l4common.h
l4file_o_DEPENDS=      l4common.h l4array.o
l4strv_o_DEPENDS=      l4common.h l4array.o
l4arg_o_DEPENDS=       l4common.h l4array.o
l4list_o_DEPENDS=      l4common.h
l4str_o_DEPENDS=       l4common.h
l4posix_o_DEPENDS=     l4common.h
l4sysdep_o_DEPENDS=    l4common.h l4posix.o l4str.o

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

# Distribution
EXTRA_DIST=            Makefile README README.zh VERSION
RM_R=                  $(RM) -r
CHMOD_R=               chmod -R 400
CHMOD_W=               chmod -R 755
TAR_PACK=              tar -zcf
TAR_UNPACK=            tar -zxf
TARBALL_EXTENSION=     .tar.gz

.POSIX:
.PHONY: all clean install install-HEADERS install-LIB \
		uninstall deinstall remove dist distcheck
.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)
l4strv.o: l4strv.c l4strv.h $(l4strv_o_DEPENDS)
l4arg.o: l4arg.c l4arg.h $(l4arg_o_DEPENDS)
l4list.o: l4list.c l4list.h $(l4list_o_DEPENDS)
l4str.o: l4str.c l4str.h $(l4list_o_DEPENDS)
l4posix.o: l4posix.c l4posix.h $(l4list_o_DEPENDS)
l4sysdep.o: l4sysdep.c l4sysdep.h $(l4list_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-strv: test-strv.o $(test_strv_o_DEPENDS)
	$(CC) $(M_CFLAGS) test-strv.o $(test_strv_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)
test-list: test-list.o $(test_list_o_DEPENDS)
	$(CC) $(M_CFLAGS) test-list.o $(test_list_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

dist:
	$(MKDIR_P) $(NAME)-`cat VERSION`
	for i in $(EXTRA_DIST) $(check_OBJECTS:.o=.c) \
		$(libl4basic_a_HEADERS) $(libl4basic_a_OBJECTS:.o=.c); do \
		$(INSTALL) $$i $(NAME)-`cat VERSION`; done
	$(TAR_PACK) $(NAME)-`cat VERSION`$(TARBALL_EXTENSION) $(NAME)-`cat VERSION`
	$(RM_R) $(NAME)-`cat VERSION`

distcheck: dist
	$(TAR_UNPACK) $(NAME)-`cat VERSION`$(TARBALL_EXTENSION)
	cd $(NAME)-`cat VERSION` && $(MAKE) \
		CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" RM="$(RM)" \
		MKDIR="$(MKDIR)" MKDIR_P="$(MKDIR_P)" INSTALL="$(INSTALL)" \
		CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" all check
	$(RM_R) $(NAME)-`cat VERSION`
	@echo "--------------------"
	@echo "$(NAME)-`cat VERSION`$(TARBALL_EXTENSION) is ready for distribution!"
	@echo "--------------------"