####################################################
#
# Makefile pour PAPP (programme d'appariements)
# par Thierry Bousch
#
# $Id: Makefile,v 1.15 1995/04/09 18:21:23 bousch Exp $
#
####################################################

# Le compilateur utilise doit etre ANSI
CC = gcc

# PAPP suppose predefinis les symboles suivants: `atarist' pour l'Atari,
# `__GNUC__' pour le GCC, `__MSDOS__' pour MS-DOS, `__THINK_C__' pour le
# Think-C (macintosh), `linux' pour Linux, `__GO32__' pour le cross-
# compilateur MS-DOS (sous linux).
#
# On peut, par ailleurs, definir les symboles suivants:
#
#----------- Symboles caracterisant le systeme d'exploitation ----------
#
# STR_CASECMP
#	si les fonctions stricmp() et strnicmp() s'appellent chez vous
#	strcasecmp() et strncasecmp() -- ceci concerne divers BSD ainsi
#	que Linux, notamment.
#
# NO_STRICMP
#	si les fonctions stricmp() et strnicmp() ne sont pas disponibles
#	du tout. (Et vous pretendez posseder un compilateur?)
#
# TERMCAP
#	si vous avez la librairie Termcap, sinon les commandes de gestion
#	d'ecran (effacement, etc.) devront etre codees en dur dans le
#	programme. Unix surtout.
#
# NO_TERMCAP_H
#	si vous avez TERMCAP mais pas de fichier d'en-tete <termcap.h>.
#
# UNIX_BSD
#	si vous utilisez un Unix de type BSD, et
#
# UNIX_SYSV
#	si vous utilisez un Unix de type Systeme 5. 
#
# SIGNAUX_POSIX
#	si vous voulez utiliser les fonctions POSIX pour manipuler les
#	signaux (sigaction, sigprogmask, sigemptyset, ...)
#
# NO_RAISE
#	si raise() n'est pas dans les librairies -- c'est pourtant une
#	fonction ANSI.
#
# P_OPEN
#	si votre compilateur connait les fonctions popen()/pclose()
#       et si elles font quelque chose de sense, evidemment.
#	Si ce symbole est defini, il est possible de "piper" le classement
#	des joueurs vers une commande (less, par exemple).
#
#----------- Options de compilation -----------
#
# ENGLISH
#	define this symbol if you want messages and menus in English.
#	The translations are not very good. Note that all key bindings
#	are the same as in the french version (at least for now),
#	except for the yes/no questions. The config file must
#	still be in French (well, not the comments, of course)
#	for compatibility with the french version.
#
# CURSEUR
#	sur certains terminaux (que nous ne nommerons pas), le curseur est
#	invisible, ce qui est incommode pour entrer du texte. Si ce symbole
#	est defini, le curseur sera materialise par une tilde.
#
# VERROU
#	cree un fichier-verrou dans le repertoire courant pour eviter
#	que deux invocations de papp ne modifient le meme fichier __papp__.
#
# DEBUG_PEN
#	Si ce symbole est defini, PAPP affiche les penalites trouvees (ainsi
#	que leur total) dans les appariements optimaux.
#
# SAVE_MATRIX
#	sauve la matrice des penalites dans `matrice.pen' avant de lancer
#	l'algorithme d'Edmonds, sous une forme ou elle peut etre relue par
#	le programme `test'. Peut etre utile pour la mise au point du
#	module edmonds.c. Les resultats de l'optimisation (si on arrive
#	jusque la) seront stockes dans `matrice.out'.
#
# USE_LONG_LONG
#	si vous voulez utiliser des "long long" dans edmonds.c (entiers
#	sur 64 bits) au lieu des "double" (flottants sur 64 bits).
#	Seul le GCC supporte ce type. Peut etre necessaire si la librairie
#	flottante est boguee ou imprecise. (Ce symbole est automatiquement
#	defini si __GO32__ est defini).
#
# EDEBUG
#	affiche enormement de details sur le deroulement de l'algorithme
#	d'Edmonds. N'est utile que pour la mise au point.
#
# MELANGE
#	si vous voulez melanger les joueurs avant toute optimisation,
#	c.a.d. pas uniquement a la premiere ronde. Ceci a pour consequence
#	de rendre les appariements non deterministes.
#
# HUIT_BITS
#	si vous voulez autoriser l'utilisateur a entrer des caracteres
#	huit bits au clavier. A utiliser avec circonspection, parce que
#	cela diminue la portabilite vers d'autres machines. Seules les
#	machines utilisant le jeu ISO-Latin-1 (windows, unix) devraient
#	avoir le droit de definir ce symbole.
#

# Options de compilation pour SunOS
#
#CFLAGS = \
#	-DSIGNAUX_POSIX -DUNIX_BSD -DTERMCAP -DNO_TERMCAP_H \
#	-DNO_RAISE -DP_OPEN \
#	-DDEBUG_PEN -DMELANGE -DVERROU $(EXTRA) \
#	-O2 -pipe
#LDFLAGS = -s
#LIBS = -lm -ltermcap

# Options de compilation pour Linux
#
CFLAGS = \
	-DSIGNAUX_POSIX -DUNIX_SYSV -DTERMCAP \
	-DSTR_CASECMP -DP_OPEN \
	-DDEBUG_PEN -DMELANGE -DVERROU $(EXTRA) \
	-O2 -m486 -fomit-frame-pointer \
	-pipe -Wall -Wstrict-prototypes
LDFLAGS = -s -Wl,-qmagic
LIBS = -lm -ltermcap

# Options de cross-compilation pour Ms-Dos
#
GO32_CFLAGS = \
	-DNO_STRICMP -DDEBUG_PEN -DMELANGE -DVERROU $(EXTRA) \
	-O2 -fomit-frame-pointer -pipe -m486 -Wall
GO32_LDFLAGS = -s
GO32_LIBS = -lm -lpc
GO32_CC = go32gcc
GO32_STUB = /usr/local/go32/lib/stub.exe

#
# Les regles suivantes permettent de verifier le code assembleur
# genere, ainsi que de cross-compiler pour Ms-Dos. Commentez-les si
# elles posent probleme avec votre version de `make'.
#
%.s: %.c
	$(CC) $(CFLAGS) -S $< -o $@
%.oms: %.c
	$(GO32_CC) $(GO32_CFLAGS) -c $< -o $@
%.sms: %.c
	$(GO32_CC) $(GO32_CFLAGS) -S $< -o $@

# D'autres options encore?
EXTRA	= #-DENGLISH

#
# Voici la liste de tous les fichiers sources. Ces fichiers peuvent
# etre sauvegardes avec `make archive'
#
HEADERS = appari.h global.h joueur.h more.h couplage.h version.h

CFILES	= couplage.c edmonds.c edtest.c contest.c elo.c entrejou.c \
	exemple.c geom.c global.c joueur.c main.c more.c penalite.c \
	resultat.c test.c ttrondes.c

SFILES	= Makefile pap.l pap.y
DOCUS	= COPYING papp_doc.tex Bugs A_faire Changes papp.lsm
AUTRES	= pap_tab.h pap_tab.c lexyy.c joueurs stricmp.c strnicmp.c makedist

RCSFILES = $(HEADERS) $(CFILES) $(SFILES) $(DOCUS)
SOURCES = $(RCSFILES) $(AUTRES)

#
# Fichiers objets requis par PAPP
#

OBJETS	= \
	lexyy.o pap_tab.o \
	edmonds.o global.o joueur.o main.o elo.o more.o entrejou.o \
	ttrondes.o couplage.o resultat.o penalite.o

OBJETS_DOS = \
	lexyy.oms pap_tab.oms \
	edmonds.oms global.oms joueur.oms main.oms elo.oms more.oms \
	entrejou.oms ttrondes.oms couplage.oms resultat.oms penalite.oms

#
# Les programmes `exemple' et `geom' produisent des matrices
# d'exemples pour le programme `testp'. Le programme proprement dit
# est `papp', sa documentation est `papp_doc.tex', et `changes' contient
# l'historique des versions.
#

BINAIRES = testp geom exemple edtest contest papp

all: $(BINAIRES)
msdos: edtest.exe papp.exe

testp: edmonds.o test.o
	$(CC) $(LDFLAGS) -o testp $^ $(LIBS) 

edtest: edmonds.o edtest.o
	$(CC) $(LDFLAGS) -o edtest $^ $(LIBS)

contest: edmonds.o contest.o
	$(CC) $(LDFLAGS) -o contest $^ $(LIBS)

papp: $(OBJETS)
	$(CC) $(LDFLAGS) -o papp $^ $(LIBS)

papp.exe: $(OBJETS_DOS)
	$(GO32_CC) $(GO32_LDFLAGS) -o papp.go32 $^ $(GO32_LIBS)
	cat $(GO32_STUB) papp.go32 >papp.exe

edtest.exe: edmonds.oms edtest.oms
	$(GO32_CC) $(GO32_LDFLAGS) -o edtest.go32 $^ $(GO32_LIBS)
	cat $(GO32_STUB) edtest.go32 >edtest.exe

exemple: exemple.c
	$(CC) $(CFLAGS) $(LDFLAGS) exemple.c -o exemple $(LIBS)

geom: geom.c
	$(CC) $(CFLAGS) $(LDFLAGS) geom.c -o geom $(LIBS)

clean:
	rm -f core *.s *.sms *.o *.oms *.bak *.go32
	rm -f papp_doc.log papp_doc.aux papp_doc.toc

veryclean: clean
	rm -f *.exe $(BINAIRES) lexyy.c pap_tab.c pap_tab.h
	rm -f papp_doc.dvi papp_doc.ps

#
# Archivage
#
archive: appari.tgz
	@echo Sauvegarde du dossier RCS
	tar -czf $$HOME/papp_rcs.tgz RCS

appari.tgz: $(SOURCES)
	tar -czf appari.tgz $(SOURCES)

distrib: appari.tgz
	./makedist

#
# Maintenant que la documentation est en LaTeX, nous ajoutons une `cible'
# pour previsualiser le document
#

preview: papp_doc.dvi
	xdvi papp_doc.dvi &

papp_doc.dvi: papp_doc.tex
	latex papp_doc.tex
	latex papp_doc.tex

#
# Dependances pour Lex et Yacc. 
#
lexyy.c: pap.l
	flex -8 pap.l
	mv lex.yy.c lexyy.c

lexyy.o: pap_tab.h

pap_tab.c: pap_tab.h
	touch pap_tab.c

pap_tab.h: pap.y
	@echo "pap.y devrait contenir 2 conflits de type shift/reduce"
	bison -d pap.y
	mv pap.tab.c pap_tab.c
	mv pap.tab.h pap_tab.h

#
# Autres dependances (on n'est jamais trop prudent):
#
$(OBJETS) $(OBJETS_DOS): $(HEADERS)
test.o edtest.o contest.o: appari.h
test.oms edtest.oms contest.oms: appari.h

