+
# Default flags
+AR ?= ar
CC ?= gcc
+RANLIB ?= ranlib
#INCLUDES = -I../debug -D__MEMORY_ALLOCATION__
INCLUDES += -DVERBOSE_COLOR=1
LDFLAGS += -g $(LDOPTS) $(OPTIONS)
LDOPT = linker
+AROPT = archive
MV = mv
ifneq (, $(findstring linux, $(MAKE_HOST)))
# Linux
CFLAGS += -DWIN32
#LDLIBS += -lws2_32
LDOPT = winlnk
+AROPT =
else ifneq (, $(findstring cygwin, $(MAKE_HOST)))
-CFLAGS += -DWIN32
# Windows CygWin
+CFLAGS += -DWIN32
LDOPT = winlnk
+AROPT =
else ifneq (, $(findstring msdos, $(MAKE_HOST)))
# MSDOS
LDOPT = doslnk
+AROPT =
MV = move
endif
+ifeq ($(DESTDIR),)
+DESTDIR = /usr/local
+endif
+
+BINDIR = $(DESTDIR)/bin
+INCDIR = $(DESTDIR)/include/
+LIBDIR = $(DESTDIR)/lib
+
# Targets
ALLEXE = $(shell for f in *.c; do grep -q '/\*\s*$(LDOPT):' $$f && echo $${f/.c}; done)
+ALLDLL = $(shell for f in *.c; do grep -q '/\*\s*$(AROPT):' $$f && echo lib$${f/.c}; done)
+
SHELL = bash
#MAKE = mingw32-make
WARN = echo -e "\033[1;33m$(strip $(1))\033[0;0m"
FAIL = echo -e "\033[1;31m$(strip $(1))\033[0;0m"
-MKDIR = mkdir -p $(1) && chmod a+rx,go-w $(1)
-
-INSTALL = test -d `dirname $(2)` || $(call MKDIR, `dirname $(2)`) && cp -pa $(1) $(2) && chmod a+rX,go-w $(2)
+INSTALL = test -d $(2) || mkdir -p $(2) && cp -pa $(1) $(2) && chmod a+rX,go-w $(2) $(addprefix $(2)/,$(1))
VALID = $(call TITLE, $(1)) && $(2) && $(call PASS, SUCCESS) || { $(call FAIL, FAILED); test; }
gprofs:
$(MAKE) $(addprefix gprof_,$(ALLEXE))
+lib: depends
+ [ "$(ALLDLL)" ] || { $(call FAIL,no exec to proceed); test; } && $(MAKE) $(ALLDLL:%=%.a)
+
purge: clean
$(call TITLE, "Purging")
touch purge
- rm -f purge $(ALLEXE:%=%.exe)
+ rm -f purge $(ALLEXE:%=%.exe) $(ALLDLL:%=%.a)
$(call PASS, SUCCESS)
valgrinds:
$(CC) $(LDFLAGS) $< $(shell $(call GETCOMMENTS,$(LDOPT), ${<:.o=.c})) $(LDLIBS) -o $@
$(call PASS, SUCCESS)
+lib%.a: %.o %.d
+ $(call TITLE, "Building $@")
+ $(AR) qc $@ $< $(shell $(call GETCOMMENTS,$(AROPT), ${<:.o=.c}))
+ $(RANLIB) $@
+ $(call PASS, SUCCESS)
+
+## install rules
+
+install_lib%: lib%.a
+ $(call TITLE, "Install $<")
+ $(call INSTALL, $(shell $(call GETCOMMENTS,include, `echo $< | sed 's/^lib//;s/\.a$$/.c/'`)), $(INCDIR)/`echo $< | sed 's/^lib//;s/\.a$$//'`)
+ $(call INSTALL, $<, $(LIBDIR))
+ $(call PASS, SUCCESS)
+
+install_%: %.exe
+ $(call TITLE, "Install $<")
+ $(call INSTALL, $<, $(BINDIR))
+ $(call PASS, SUCCESS)
+
+install_lib:
+ make $(addprefix install_,$(ALLDLL))
+
+install_exe:
+ make $(addprefix install_,$(ALLEXE))
+
## Phony
.PHONY: all analyze clean count depends documentation gcovs purge tests