#Prsentation de certaines capacits du make Solucorp

#Solutionne la limitation des lignes de commande DOS
#    Cela indique comment crer un fichier de commandes, comment insrer
#    des caractres de continuation, et comment appeler l'utilitaire.
#    A partir de maintenant cc et lib accepteront des commandes de
#    n'importe quelle longueur.
.indir.cc  = c:\cc.$$$    @c:\cc.$$$
.indir.lib = c:\lib.$$$,& @c:\cc.$$$

#Rsout la limite de 640k slectivement.
#    Cela indique  make qu'il doit librer le maximum de mmoire
#    pour l'excution de la commande cc make proto.
.huge   = cc make proto naperm

#Dfinition de macros
#    La macro SOURCE contiendra la liste de tous les fichiers .c du
#    rpertoire courant  l'exception du fichier main.c
SOURCE  ? *.c -main.c

# Options du compilateur pour tous les fichiers .c
CFLAGS = -O
# Options du compilateur pour certains fichiers .c
# Voir le commentaire dans la rgle .c.$(OBJEXT) plus bas
source2.CFLAGS = -n

#    La macro DIROBJ contiendra un path. Ce path sera un des trois
#    possibles. Le premier qui existe sera choisi.
DIROBJ  | c:\obj d:\obj .

#Controle l'accs.
#    Cela indique o sont situs et o seront produits les fichiers
#    objets (.obj).
.path.obj = $(DIROBJ)

#    Cela indique o sont les fichiers d'inclusion. Requis pour
#    rsoudre les tests de dpendances.
.path.h   = . ..\include \compiler\include

#Voici les rgles gnrales pour rebatir une librairie.
#    Le prprocesseur est utilis pour crer un makefile portable.
!if $d(MSDOS)
OBJEXT  = obj   # Extension des fichiers objets sous MSDOS
LIBEXT  = lib   # Extension des libraries sous MSDOS
!else
OBJEXT  = o     # Extension des fichiers objets sous UNIX
LIBEXT  = a     # Extension des librairies sous UNIX
!endif

#Rgle implicite pour la compilation
.c.$(EXTOBJ):
    # Gnralisition de l'usage des macros: Orient objet
    # $& correspond au nom du module courant
    # $($&.CFLAGS) correspond au options applicable au module courant
    cc -c $($&.CFLAGS) $(CFLAGS) $&.c

#Rgles gnrales
#    lib.? est cr  partir des fichiers objets, et non pas des fichiers .c
#    La macro SOURCE contient une liste de .c. Il faut transformer
#    cette liste en .obj (.o sous UNIX). Une syntaxe permet de rviser
#    temporairement la liste.
#    La macro prdfinie $? permet de mettre  jour la librairie
#    avec seul les fichiers .obj (ou .o) plus rcent qu'elle.
lib.$(LIBEXT): $(SOURCE:%b.$(OBJEXT))
    # Vritable sous-routine, voir !define lib plus bas
    !use lib $< "$?"

#Prparation de la documentation.
#    Voici la squence qui a t utilis pour produire les fichiers
#    prsents dans document.exm.
doc:
    proto -cod -fxsys.nap *.c           # Produit xsys.nap
    naperm xsys.nap xsys.nai xsys.nas xsys.nah
    nadoc xsys.doc xsys.nap xsys.ref    # Produit le manuel de rfrence

#Cration du fichier de dpendance pour les fichiers d'inclusion
#    Le fichier makefile.dep est cr en balayant tous les sources
#    du rpertoire courant. Ce fichier est silencieusement interprt
#    par make  pour tablir les dpendances entre les sources
#    et les fichiers d'inclusion.
dep:
    makedep makefile *.c

# Sous-routine. Cl de la portabilit des makefiles
!define lib libnom objets
    !if $d(MSDOS)
        # Un "-+" est ajout devant chaque .obj
        lib $(libnom) $(objets:-+%s)
    !else
        ar $(libnom) $(objets)#Rvise lib.a sous UNIX
        ranlib $(libnom)
    !endif
!enddef
