#  Copyright (C) 2008, 2009 Jiri Olsa <olsajiri@gmail.com>
#
#  This file is part of the latrace.
#
#  The latrace is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  The latrace is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with the latrace (file COPYING).  If not, see 
#  <http://www.gnu.org/licenses/>.


include src/autoconf.make

confdir := $(sysconfdir)/latrace.d

ifneq ($(findstring $(MAKEFLAGS),w),w)
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

# nice output definition
# Mostly copied from kernel and git makefiles.

ifndef V
	QUIET_CC          = @echo "  CC" $@;
	QUIET_LD          = @echo "  LD" $@;
	QUIET_LEX         = @echo "  LE" $@;
	QUIET_YACC        = @echo "  YA" $@;
	QUIET_DEP         = @echo "  DEP" $@;
	QUIET_TAGS        = @echo "  TAGS" $@;

define install
	@echo -n "  INSTALL " `echo $(ROOTDIR)$2/$(notdir $1) | sed 's:[/]\+:/:g'` ; \
	mkdir -p $(ROOTDIR)$2; \
	install -m "ugo+$3" $1 $(ROOTDIR)$2; echo
endef
define remove
	@echo "  CLEAN  " $1; $(RM) -rf $1
endef
else
define remove
	$(RM) -rf $1
endef
define install
	mkdir -p $(ROOTDIR)$2; \
	install -m "ugo+$3" $1 $(ROOTDIR)$2; echo
endef
endif


.PHONY: all clean tags install

all::

install:: all
	$(call install,doc/latrace.1,$(mandir)/man1,"r")
	$(call install,etc/latrace.d/ctype.conf,$(confdir),"r")
	$(call install,etc/latrace.d/inet.conf,$(confdir),"r")
	$(call install,etc/latrace.d/misc.conf,$(confdir),"r")
	$(call install,etc/latrace.d/typedefs.conf,$(confdir),"r")
	$(call install,etc/latrace.d/stdlib.conf,$(confdir),"r")
	$(call install,etc/latrace.d/string.conf,$(confdir),"r")
	$(call install,etc/latrace.d/ctype.conf,$(confdir),"r")
	$(call install,etc/latrace.d/ncurses.conf,$(confdir),"r")
	$(call install,etc/latrace.d/stdio.conf,$(confdir),"r")
	$(call install,etc/latrace.d/dirent.conf,$(confdir),"r")
	$(call install,etc/latrace.d/unistd.conf,$(confdir),"r")
	$(call install,etc/latrace.d/libintl.conf,$(confdir),"r")
	$(call install,etc/latrace.d/dlfcn.conf,$(confdir),"r")
	$(call install,etc/latrace.d/fcntl.conf,$(confdir),"r")
	$(call install,etc/latrace.d/getopt.conf,$(confdir),"r")
	$(call install,etc/latrace.d/signal.conf,$(confdir),"r")
	$(call install,etc/latrace.d/ioctl.conf,$(confdir),"r")
	$(call install,etc/latrace.d/socket.conf,$(confdir),"r")
	$(call install,etc/latrace.d/netdb.conf,$(confdir),"r")
	$(call install,etc/latrace.d/stat.conf,$(confdir),"r")
	$(call install,etc/latrace.d/wait.conf,$(confdir),"r")
	$(call install,etc/latrace.d/utmp.conf,$(confdir),"r")
	$(call install,etc/latrace.d/time.conf,$(confdir),"r")
	$(call install,etc/latrace.d/termios.conf,$(confdir),"r")
	$(call install,etc/latrace.d/term.conf,$(confdir),"r")
	$(call install,etc/latrace.d/syslog.conf,$(confdir),"r")
	$(call install,etc/latrace.d/pwd.conf,$(confdir),"r")
	$(call install,etc/latrace.d/libio.conf,$(confdir),"r")
	$(call install,etc/latrace.d/locale.conf,$(confdir),"r")
	$(call install,etc/latrace.d/pthread.conf,$(confdir),"r")
	$(call install,etc/latrace.conf,$(sysconfdir),"r")

ifneq ($(MAKECMDGOALS),clean)
-include deps.make
endif

# main building schema
# Module subdir (src,libsf) are supposed to fill PROGRAMS and
# OBJS variables, and rule to link the module. The top makefile
# will do the rest.

PROGRAMS=
OBJS=

include src/Makefile

INCLUDES= -Isrc -Isrc/sysdeps/$(CONFIG_SYSDEP_DIR)
ALL_CFLAGS=$(CPPFLAGS) $(CFLAGS) -O2 -fPIC -Wall $(INCLUDES) -D_GNU_SOURCE


%.o: %.c
	$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<

.SECONDARY:

%.c: %.l
	$(QUIET_LEX)$(LEX) -t $< > $(basename $<).c

%.c: %.y
	$(QUIET_YACC)$(YACC) -v $< -d -o $(basename $<).c


all:: $(PROGRAMS)

clean::
	$(call remove, $(OBJS) $(PROGRAMS))
	$(call remove, src/args-bison.c src/args-flex.c src/args-bison.h src/args-bison.output)
	$(call remove, lib bin share deps.make)

mrproper:: clean
	$(call remove, src/autoconf.h src/autoconf.make tags deps.make \
		       config.log config.status configure autom4te.cache doc/latrace.1)

# dependencies
# The gcc -M depedencies generation needs to repaired to include
# subdirectory name within the target.. at least I haven't find any
# gcc option to do that.
#  - no dependency for flex and bison definitions
DEPS_OBJS=$(filter-out src/args-flex.o src/args-bison.o,$(OBJS))

deps.make:
	$(QUIET_DEP)$(RM) -f deps.make; \
	(for obj in $(DEPS_OBJS); do \
	src=`echo $$obj | sed "s/\.o/.c/"`; \
	$(CC) $(ALL_CFLAGS) -M -MT$$obj $$src;  \
	done) > deps.make


# utilities
tags:
	$(QUIET_TAGS)$(RM) -f tags; \
	ctags -R *
