# Makefile for Checker
# 
#

# Configuration 

# don't change it
srcdir = .

# The malloc directory
MDIR = $(srcdir)/l-malloc
# Your local language (English/French)
LANG=English

# Your compiler
CC = gcc
AS = as

SHELL = /bin/sh
# Common prefix for installation directories. Must exist
prefix = /usr/local
exec_prefix = $(prefix)
# Where to put the executables: checkergcc, checkerg++
bindir = $(exec_prefix)/bin
libdir = $(exec_prefix)/lib
# Where to put libchecker.a
checkerdir = $(libdir)/checker
# Where to put the Info files.
infodir = $(prefix)/info

INSTALL = install
INSTALL_DATA = $(INSTALL) -m 644
INSTALL_PROGRAMM = $(INSTALL) -m 755

VERSION=0.4
DIST_NAME=Checker-$(VERSION)

# Flags for your compiler.
# Those are for GCC
# -O2 means high optimization and -Wall enables (nearly) all warnings.
# NEVER use -fomit-frame-pointer
CWARNINGS = -Wall -Wstrict-prototypes # -Wmissing-prototypes
CPPFLAGS = -I$(MDIR) -I$(srcdir) -I$(srcdir)/lib
CFLAGS = -O2 -g $(CWARNINGS)

# CFLAGS for 'symctl' and 'genmess', only used to build the lib
# It can also be used for 'checkergcc', 'checkerg++'.
UTILSCFLAGS = -O2 -Wall 

# LIB is the name of the library file
# LIBOBJ is an object file, that contains all the library for safety link.
LIB= libchecker.a
LIBOBJ= libchecker.o
LIBMALLOC = $(MDIR)/libmalloc.o
LIBCHKRLIB = $(srcdir)/lib/libchkrlib.o


OBJS  = parse-args.o error.o find_exec.o machine.o symtab.o \
	addrextract.o chkr-syscall.o errlist.o message.o smalloc.o signal.o

TARGET= premiss $(LIBOBJ)

all: .depend $(TARGET)

find_exec.o: $(srcdir)/find_exec.c
	$(CC) $(subst -O2,,$(CFLAGS)) $(CPPFLAGS) -c $(srcdir)/find_exec.c

$(LIB): $(LIBOBJ)
	$(AR) usvc $(LIB) $(LIBOBJ)
#	ranlib $(LIB)

$(LIBOBJ): .depend $(OBJS) $(LIBMALLOC) $(LIBCHKRLIB) symctl $(srcdir)/checker.symctl alwaysmake
	$(LD) -r -o $(LIBOBJ) $(LIBMALLOC) $(OBJS) $(LIBCHKRLIB) -static
	./symctl $(LIBOBJ) $(srcdir)/checker.symctl

$(LIBMALLOC): alwaysmake
	cd $(MDIR) && $(MAKE)

$(LIBCHKRLIB): alwaysmake
	cd $(srcdir)/lib && $(MAKE)

testsuit: $(LIBOBJ)
	cd $(srcdir)/testsuit && $(MAKE)

symctl.o: $(srcdir)/utils/symctl.c
	$(CC) $(UTILSCFLAGS) -c $<

symctl: symctl.o
	$(CC) -o symctl symctl.o

setchkrfl.o: $(srcdir)/utils/setchkrfl.c
	$(CC) $(UTILSCFLAGS) -c $<

setchkrfl: setchkrfl.o
	$(CC) -o setchkrfl setchkrfl.o

genmess.o: $(srcdir)/utils/genmess.c
	$(CC) $(UTILSCFLAGS) -c $<

genmess: genmess.o
	$(CC) -o genmess genmess.o

premiss: genmess alwaysmake
	./genmess errlist.new.h errlist.new.c $(srcdir)/config/$(LANG)/errlist.m
	-$(srcdir)/move-if-change errlist.new.h errlist.h
	-$(srcdir)/move-if-change errlist.new.c errlist.c
	./genmess message.new.h message.new.c $(srcdir)/config/$(LANG)/message.m
	-$(srcdir)/move-if-change message.new.h message.h
	-$(srcdir)/move-if-change message.new.c message.c
	./genmess dmstrings.new.h /dev/null $(srcdir)/config/$(LANG)/dmstrings.m
	-$(srcdir)/move-if-change dmstrings.new.h dmstrings.h

.depend: Makefile
	@echo "The dependency file is not up to date"	# have a beep
	@echo "Try 'make dep'"

install: $(LIBOBJ) checkergcc checkerg++ setchkrfl
	if test ! -d $(libdir) ; then mkdir $(libdir); fi
	if test ! -d $(checkerdir); then mkdir $(checkerdir); fi
	if test ! -d $(bindir); then mkdir $(bindir); fi
	$(INSTALL_DATA) $(LIBOBJ) $(checkerdir)
	sed s,CHECKER_PATH,$(checkerdir), < $(srcdir)/bin/specs > specs.new
	$(INSTALL_DATA) specs.new $(checkerdir)/specs
	rm specs.new
	$(INSTALL_DATA) $(srcdir)/bin/chkrcrt0.o $(checkerdir)/crt0.o
	./setchkrf $(checkerdir)/crt0.o
	$(INSTALL_PROGRAMM) $(srcdir)/bin/as $(checkerdir)/as
	$(INSTALL_PROGRAMM) $(srcdir)/bin/ld $(checkerdir)/ld
	$(INSTALL_PROGRAMM) checkergcc $(bindir)
	$(INSTALL_PROGRAMM) checkerg++ $(bindir)
	@echo "Don't forget to install Checker-libs !"

update: 
	$(INSTALL_DATA) $(LIBOBJ) $(checkerdir)

uninstall:
	rm -f $(checkerdir)/crt0.o $(checkerdir)/as $(checkerdir)/ld
	rm -f $(bindir)/checkergcc $(bindir)/checkerg++
	rm -f $(checkerdir)/specs $(checkerdir)/libchecker.o

#checkergcc: alwaysmake
#	echo "#!/bin/sh" > checkergcc
#	echo exec gcc -B$(checkerdir)/ $$\* >> checkergcc

checkergcc: $(srcdir)/utils/checkergcc.c Makefile
	$(CC) $(UTILSCFLAGS) -DCHECKER_PATH=\"$(checkerdir)\" \
	 $(srcdir)/utils/checkergcc.c -o checkergcc -s

checkerg++: $(srcdir)/utils/checkerg++.c Makefile
	$(CC) $(UTILSCFLAGS) -DCHECKER_PATH=\"$(checkerdir)\" \
	 $(srcdir)/utils/checkerg++.c -o checkerg++ -s

alwaysmake:

clean:
	cd $(srcdir)/lib && $(MAKE) clean
	cd $(srcdir)/testsuit && $(MAKE) clean
	cd $(srcdir)/b-malloc && $(MAKE) clean
	cd $(srcdir)/l-malloc && $(MAKE) clean
	cd $(srcdir)/insertor && $(MAKE) clean
	cd $(srcdir)/config && $(MAKE) clean
	$(RM) -f core *.o *~ a.out genmess symctl setchkrfl
	$(RM) -f $(LIBMCHECK) $(LIB) checkergcc checkerg++
	$(RM) -f .depend example doc/*~ patches/*~ utils/*~ bin/*~
#	$(RM) -f errlist.h errlist.c

distclean: clean

dist: distclean
	cd ..; tar zcvf $(DIST_NAME).tgz $(DIST_NAME)

dep: premiss
	$(CPP) -M $(srcdir)/*.c $(CPPFLAGS) > .depend
	cd $(srcdir)/lib && $(MAKE) dep
	cd $(MDIR) && $(MAKE) dep

.PHONY: dep dist distclean clean alwaysmake premiss testsuit all

#
# include a dependency file if one exists
#
ifeq (.depend,$(wildcard .depend))
include .depend
endif
