# This file is part of imunal
# Copyright 2013  Guillaume Quintin, Olivier Ruatta, Philippe Gaborit
# 
# This program 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 2 of the License, or
# (at your option) any later version.
# 
# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

.POSIX:
.DEFAULT:
.SUFFIXES:




############################################################
#
# Installation directories
#
############################################################

LIB_DIR     = /usr/lib
BIN_DIR     = /usr/bin
INCLUDE_DIR = /usr/include
MAN_DIR     = /usr/share/man




############################################################
#
#      !!! FROM HERE DO NOT MODIFY ANYTHING !!!
#
############################################################

VERSION      = 0.1
CC           = cc
UNUSED       = __attribute__((unused))
C89_FLAGS    = -ansi -Wall -Wextra -pedantic-errors
OFLAGS       = -O3
CFLAGS       = $(C89_FLAGS) $(OFLAGS) -I. '-DUNUSED=$(UNUSED)'
LDFLAGS      = 
BIN          = imunal
SOURCES      = imunal.c imunal.h libimunal.c monomial.c bool_func.c \
               memory.c majority_function.c hwbf_function.c \
               naive_version/naive_version.c \
               naive_version/matrix.c \
               naive_version/newton.c \
               naive_version/algo.c \
               greedy_version/greedy_version.c \
               greedy_version/matrix.c \
               greedy_version/newton.c \
               greedy_version/algo.c \
               noswap_version/noswap_version.c \
               noswap_version/matrix.c \
               noswap_version/newton.c \
               noswap_version/algo.c
PREFIX       = static
WORD         = int
TESTS_DIR    = tests
TESTS        = $(TESTS_DIR)/tests
DOC_DIR      = documentation
FILES        = $(SOURCES) wrapper.c imunal-in.h Makefile ram.c ram.h \
               README COPYING libimunal-in.c \
               $(DOC_DIR)/build.html \
               $(DOC_DIR)/build.man \
               $(DOC_DIR)/calculator.html \
               $(DOC_DIR)/head.html \
               $(DOC_DIR)/imunal.1 \
               $(DOC_DIR)/imunal.h.3 \
               $(DOC_DIR)/imunal.h.html \
               $(DOC_DIR)/imunal.h.man \
               $(DOC_DIR)/imunal.html \
               $(DOC_DIR)/imunal.man \
               $(DOC_DIR)/index.html \
               $(DOC_DIR)/result.php \
               $(DOC_DIR)/style.css \
               $(DOC_DIR)/tail.html \
               $(DOC_DIR)/licences/gpl_man.txt \
               $(TESTS_DIR)/func1 \
               $(TESTS_DIR)/func10 \
               $(TESTS_DIR)/func11 \
               $(TESTS_DIR)/func12 \
               $(TESTS_DIR)/func13 \
               $(TESTS_DIR)/func14 \
               $(TESTS_DIR)/func15 \
               $(TESTS_DIR)/func16 \
               $(TESTS_DIR)/func17 \
               $(TESTS_DIR)/func18 \
               $(TESTS_DIR)/func19 \
               $(TESTS_DIR)/func2 \
               $(TESTS_DIR)/func20 \
               $(TESTS_DIR)/func21 \
               $(TESTS_DIR)/func3 \
               $(TESTS_DIR)/func4 \
               $(TESTS_DIR)/func5 \
               $(TESTS_DIR)/func6 \
               $(TESTS_DIR)/func7 \
               $(TESTS_DIR)/func8 \
               $(TESTS_DIR)/func9 \
               $(TESTS_DIR)/func_io \
               $(TESTS_DIR)/grlex \
               $(TESTS_DIR)/tests.c
VOMITPAGE    = vomitpage
EXC          = exc
WWW_DIR      = ~/.webdir/imunal/doc

############################################################
#                Library and executable
############################################################

.SILENT: all lib$(BIN).c lib$(BIN).a $(BIN) $(BIN).h ram.o

all: lib$(BIN).a $(BIN)
	echo ">>  make successfull: $@ built"
	echo ">>  It is recommanded that you run 'make check'"

ram.o: Makefile ram.c
	echo ">>  Building $@"
	$(CC) -c $(CFLAGS) -O2 ram.c -o $@

$(BIN).h: Makefile $(BIN)-in.h
	echo ">>  Building $@"
	sed s/WORD/$(WORD)/g $(BIN)-in.h > $@

lib$(BIN).c: Makefile lib$(BIN)-in.c
	echo ">>  Building $@"
	sed s/WORD/$(WORD)/g lib$(BIN)-in.c > $@

lib$(BIN).a: Makefile $(SOURCES) ram.o
	echo ">>  Building $@"
	$(CC) $(CFLAGS) -DPREFIX=$(PREFIX) \
	  -c lib$(BIN).c $(LDFLAGS) -o lib$(BIN).o
	rm -f $@
	ar rcs $@ lib$(BIN).o ram.o

$(BIN): Makefile $(SOURCES)
	echo ">>  Building $@"
	$(CC) $(CFLAGS) $(BIN).c $(LDFLAGS) -L. -limunal -o $@

wrapper: Makefile wrapper.c
	$(CC) $(C89_FLAGS) -O2 wrapper.c -o $@

############################################################
#                        Tests
############################################################

.SILENT: $(TESTS) $(TESTS)-check-run check

$(TESTS): Makefile imunal.h $(TESTS).c lib$(BIN).a
	echo ">>  Building $@"
	$(CC) $(CFLAGS) $(TESTS).c $(LDFLAGS) -L. -limunal -o $@

$(TESTS)-check-run: Makefile $(TESTS)
	echo ">>  Running tests..."
	$(TESTS) bool_func_ai
	touch $@

check: $(TESTS)-check-run
	echo ">>  All tests PASSED: All OK"

############################################################
#                    Documentation
############################################################

$(DOC_DIR)/$(BIN).1: Makefile $(DOC_DIR)/$(BIN).man
	sed s/YEAR/`date +%Y`/ $(DOC_DIR)/licences/gpl_man.txt > $@
	echo ".TH imunal 1" >> $@
	$(VOMITPAGE) --man $(DOC_DIR)/$(BIN).man >> $@

$(DOC_DIR)/$(BIN).html: Makefile $(DOC_DIR)/$(BIN).man
	cat $(DOC_DIR)/head.html > $@
	echo "<h1>THE IMUNAL EXECUTABLE FOR USERS</h1>" >> $@
	$(VOMITPAGE) --html $(DOC_DIR)/$(BIN).man >> $@
	tail -n +19 $(DOC_DIR)/tail.html >> $@

$(DOC_DIR)/$(BIN).h.3: Makefile $(DOC_DIR)/$(BIN).h.man
	sed s/YEAR/`date +%Y`/ $(DOC_DIR)/licences/gpl_man.txt > $@
	echo ".TH imunal.h 3" >> $@
	$(VOMITPAGE) --man $(DOC_DIR)/$(BIN).h.man >> $@

$(DOC_DIR)/$(BIN).h.html: Makefile $(DOC_DIR)/$(BIN).h.man
	cat $(DOC_DIR)/head.html > $@
	echo "<h1>THE IMUNAL API FOR DEVELOPERS</h1>" >> $@
	$(VOMITPAGE) --html $(DOC_DIR)/$(BIN).h.man >> $@
	tail -n +19 $(DOC_DIR)/tail.html >> $@

$(DOC_DIR)/build.html: Makefile $(DOC_DIR)/build.man
	cat $(DOC_DIR)/head.html > $@
	echo "<h1>BUILD AND INSTALL IMUNAL</h1>" >> $@
	$(VOMITPAGE) --html $(DOC_DIR)/build.man >> $@
	tail -n +19 $(DOC_DIR)/tail.html >> $@

doc: $(DOC_DIR)/$(BIN).1 $(DOC_DIR)/$(BIN).html \
     $(DOC_DIR)/$(BIN).h.3 $(DOC_DIR)/$(BIN).h.html \
     $(DOC_DIR)/build.html

www-install: $(DOC_DIR)/$(BIN).html $(DOC_DIR)/$(BIN).h.html \
             $(DOC_DIR)/build.html $(BIN) wrapper
	cp $(DOC_DIR)/$(BIN).html $(WWW_DIR)
	cp $(DOC_DIR)/$(BIN).h.html $(WWW_DIR)
	cp $(DOC_DIR)/build.html $(WWW_DIR)
	cp $(DOC_DIR)/calculator.html $(WWW_DIR)
	cp $(DOC_DIR)/result.php $(WWW_DIR)
	cp $(DOC_DIR)/index.html $(WWW_DIR)
	cp $(BIN) $(WWW_DIR)
	cp wrapper $(WWW_DIR)

############################################################
#                        Misc
############################################################

clean:
	rm -f *.o

maintainer-clean: clean
	rm -rf $(LIBA) $(BIN) *~ *.tar.bz2 pre_dist/

install:
	mkdir -p $(LIB_DIR) $(BIN_DIR)
	cp lib$(BIN).a $(LIB_DIR)/lib$(BIN).a
	cp $(BIN) $(BIN_DIR)/$(BIN)
	mkdir -p $(INCLUDE_DIR)
	cp $(BIN).h $(INCLUDE_DIR)
	mkdir -p $(MAN_DIR)/man1 $(MAN_DIR)/man3
	cp $(BIN).1 $(MAN_DIR)/man1
	cp $(BIN).h.1 $(MAN_DIR)/man3

uninstall:
	rm -f $(LIB_DIR)/lib$(BIN).a
	rm -f $(BIN_DIR)/$(BIN)
	rm -rf $(INCLUDE_DIR)/$(BIN).h
	rm -f $(MAN_DIR)/man1/$(BIN).1
	rm -f $(MAN_DIR)/man3/$(BIN).h.1

prepare-dist:
	mkdir -p pre_dist
	rm -rf pre_dist/*
	for i in $(FILES); do \
	  d=`echo $${i} | sed 's/\/[^\/]*$$//g'`; \
	  if [ "$${d}" != "$${i}" ]; then \
	    if [ ! -d pre_dist/$${d} ]; then \
	      mkdir -p pre_dist/$${d}; \
	    fi; \
	  fi; \
	  cp $${i} pre_dist/$${i}; \
	done

dist: maintainer-clean prepare-dist
	mv pre_dist $(BIN)-$(VERSION)
	tar cvf $(BIN)-$(VERSION).tar $(BIN)-$(VERSION)/
	bzip2 -f $(BIN)-$(VERSION).tar
	rm -rf $(BIN)-$(VERSION)

