fmake 0.5a

	fmake.ttp est une pr-version d'un gestionnaire de projet (make pour 
les initis).


C Koi ?

	Un make permet de conserver la cohrence d'un ensemble de fichiers. Un 
make est surtout utilis pour compiler les sources d'un projet. Un make se 
base sur une description du projet pour le maintenir : cette description se 
trouve dans le fichier projet ou makefile. Ce fichier dcrit les liens des 
diffrents fichiers qui composent le projet et les commandes qui permettent de 
crer le projet.


Et alors ?

	En gnral les gentils dveloppeurs de compilateurs C intgrent un 
make qui permet de compiler les sources C et assembleurs 680x0 et de les 
linker avec des librairies et d'autres objets.

	Pour dvelopper en C, assembleur 680x0 et assembleur 5600x, il faut 
soit utiliser un make Unix (genre gnu-make + shell Unix genre gnu-bash) ou 
faire l'assemblage DSP  la main et utiliser l'assembleur fournit avec le 
compilateur C, bref vive la liberte.

	Les outils Unix ont parfois des comportements bizarres avec le TOS,
ncessitent pas mal de manipulations et sont d'une installation plus ou moins 
lourde, ce qui m'a pouss  dvelopper fmake qui est sens etre plus simple. 


Comment a marche ?

	Fmake ncessite un makefile, un fichier qui dcrit les composants d'un 
projet, leurs liens et les commandes permettant de le crer. Les makefiles 
Fmake sont suffixs *.fmk. Leur structure est assez simple :

<projet>
{
	<environnement>

	=
	<source1>
	<source2>
	<source3>
	...
}
(
	<dependance1>
	<dependance2>
	...
)

	<projet> est le nom du fichier  produire, `fmake.ttp` par exemple.

	<environnement> est la description des variables d'environnement, des 
commandes, des rpertoires de recherche des sources, des commandes ...

	<source> est le nom d'un fichier source. Le nom peut etre complet : 
`x:\path1\path2\file.ext` ou partiel `file.ext`. Si le nom est partiel le 
source sera recherch dans la liste de rpertoires associe  l'extension du 
source.

	<dependance> est de la meme forme que <source>.
	
	La diffrence entre <source> et <dependance> se situe dans 
l'utilisation de fichier par le projet. <source> est incorpor au projet alors 
que <dependance> est ncessaire mais n'est pas intgr. C'est la meme 
diffrence qu'entre un source C et un header .H.

	Cette structure est rcursive c'est  dire que chaque nom de fichier 
(<source> ou <dependance>) est considr comme un projet. Un fichier de 
dpendance peut etre construit par une commande, et chaque fichier peut avoir 
un environnement particulier dont sa descendance hrite.


INSTALLATION

	Il suffit de le copier sur le disque dur et l'installer comme 
application avec *.fmk comme fichier. Il faut aussi modifier le repertoire 
d'execution et le parametre en : Fenetre et rpertoire.


UTILISATION

	fmake.ttp [makefile[.fmk]] [commande]

Fmake accepte plusieurs commandes :
	[u]pdate : mise  jour du projet.
       
	[a]ll : force la construction de tous les sources.
       
	[c]lean : efface toutes les cibles.
       
	[b]uild file : construit `file` que ce soit un source ou une cible.
       
	[e]rrors [path][basename].ext : redirige les erreurs vers le fichier.
path et basename sont facultatifs. Si basename n'est pas fourni, #target est 
pris par dfaut.

	[s]top + : arrete la construction aprs la premire erreur de construction. 
	[s]top - : ne tient pas compte des erreurs de construction. 

	[h]elp : affiche cette aide.
	      
	L'extension .fmk du makefile n'est pas ncessaire. Si aucun makefile 
n'est fourni sur la ligne de commande Fmake recherche dans le repertoire 
courant un makefile. Si un seul makefile existe, il est analys.


CREATION D'UN MAKEFILE

remarque:
	En cas d'erreur de syntaxe Fmake affiche le mot qu'il ne comprend pas, 
mais la gestion d'erreur est minimale. En fait la version .ttp de Fmake est 
temporaire, la version 1.0 devrait comporter un shell graphique qui permet la 
saisie et la vrification de la syntaxe d'ou un leger manque d'information 
lors de la dtection d'erreurs.


Description de l'environnement

	C'est la partie la plus complexe du makefile. Elle regroupe des 
dclarations de variables, de commandes, de rpertoires de recherche pour les 
sources et les commandes. La fin de cette description est marque par le signe =.


	Dclaration d'une variable

	Les nom de variables sont repres par un `#`. Plusieurs types de 
variables existent : 

		- les variables associes  une extension 
			.ext	#var = valeur
			
		- les variables globales qui seront exportes lors de 
		l'execution d'une commande
			#nom = valeur
			
		- les variables de recherche de fichiers
			#path = x:\path1\path2\
			
		- les variables reserves : 
			#source, corrrespond au nom du source dans la ligne de 
			commande d'une commande

			#target, idem mais pour la cible

			#all, correspdont  tous les fichiers sources d'un 
			niveau

	La valeur d'une variable est normalement constitu d'un seul mot. Si 
la valeur d'une variable doit etre une suite de mots il faut les mettre entre ""

	exemple :
	.c	#flags = "-C -Y -T -2 -K"
declare une variable associe aux fichiers *.c qui  pour valeur `-C -Y -T -2 
-K`. Les "" indiquent au make que la valeur de la varible est constitue de 
plusieurs mots.
	
	.h	#path = e:\pure_c\include\
declare une variable de recherche associe aux fichiers *.h.

	#CC = pcc.ttp
	#LINK= plink.ttp
declare 2 variables globales #CC et #LINK qui seront exportes lors de 
l'excution des commandes.

	#path = e:\src\fmake.tst\
	#path = e:\pure_c\bin\
	#path = e:\pure_c\bin\
declare 3 variables de recherche de fichiers.
	
	
	Utilisation d'une variable
	
	Les variables ne sont utilises que dans les lignes de commandes. La 
valeur de la variable est note de la meme manire que sa dclaration #nom.

	exemple:
	.o	.c	pcc.ttp #flags.c -I#path.h -o#target #source
	
	Les variables associes  une extension sont utilises : #nom.ext 
comme #flags.c dans l'exemple.
	

	Dclaration d'une commande
	
	Une commande sert  construire un objet  partir d'un source. La ligne 
de commande utilise doit aussi etre dcrite. Les commandes sont identifies 
par un couple d'extensions : extension de l'objet et extension du source. La 
dclaration de le commande se fait :

	.out	.in	cmd.tos arg1 arg2 >logfile   <lf cr>

	>logfile permet de rediger les erreurs affiches lors de l'execution 
de la commande dans le fichier logfile. Logfile peut prendre plusieurs formes:

	>#source.ext
	>#target.ext
le nom du fichier d'erreur est construit d'aprs le nom du source ou de la 
cible.
        	
	>x:\path1\path2\file.ext
le nom du fichier d'erreur peut etre complet ou partiel. Toutes les erreurs 
seront ajoutes  ce fichier.

remarque:
	les commandes doivent comporter leur extension complete .tos, .ttp, 
.prg ...

	exemple:
	.o	.s	asm.ttp #source #target
declare que `asm.ttp` transforme un fichier *.s en *.o avec une ligne de 
commande compose du nom du source suivi du nom de l'objet.
	
	.o	.c	pcc.ttp #flags.c -I#path.h -o#target #source
declare que `pcc.ttp` transforme un fichier *.c en *.o avec une ligne de 
commande compose des flags de compilation, du repertoire de recherche des 
header, du nom de l'objet et du nom du source.

	.o	.c	pcc.ttp #flags.c -I#path.h -o#target #source >#target.err
idem que l'exemple prcdent mais les erreurs seront sauves dans un fichier 
(le fichier porte le nom de la cible  suffix par .err).


	Declaration d'un repertoire de recherche
	
	Les repertoires de recherche sont des variables rserves : #path. 
Un rpertoire peut etre associ  une extension de la meme maniere qu'une 
variable. Ces repertoires sont utiliss lors de la recherche d'un fichier : 
source, dependace ou commande. Les repertoires doivent etre termins par un \.

	exemple:
	#path = e:\bin 
n'est pas correct, il faut ecrire 

	#path = e:\bin\


	Strategie de recherche des fichiers
	
	Cette strategie est applique pour les recherches de sources, de 
dependances et de commandes.

	Si le nom de fichier est complet (x:\path\file.ext) fmake verifie 
juste l'existence du fichier.

	Si le nom de fichier est partiel (file.ext) fmake recherche d'abord 
dans le repetoire courant. Si le fichier n'existe pas fmake cherche un 
repertoire de recherche associe  l'extension du fichier. Plusieurs 
rpertoires peuvent etre dfinis, ils seront utiliss dans l'ordre de leur 
dclaration. Si le fichier n'est toujours pas trouv fmake recherche dans les 
repertoires gnraux.


	exemple:
	#path = e:\src\fmake.tst\
	#path = e:\pure_c\bin\
	#path = e:\pure_c\bin\
dclare 3 repertoires gnraux de recherche de fichiers.

	.lib	#path = e:\pure_c\lib\
dclare un repertoire de recherche pour les fichiers *.lib


Description de la liste de fichiers

	Chaque nom de fichier peut etre complet ou partiel et peut etre 
complete par une description de sources et de dpendances.

	fmake.ttp
	{
		<env>
		=
		main.o {= main.c (main.h stdio.h)}
	}
	
	en fait main.o peut etre considere comme un projet comportant un 
source main.c. main.c est lui meme un projet comportant uniquement des 
dependances main.h et stdio.h. On pourrait aussi creer un nouvel environnement 
uniquement pour compiler main.o  partir de main.c. En fait l'environnement de 
fmake.ttp est "herit" par main.o et main.c. 


Description de la liste de dependance

	idem  la liste de fichiers.
	Les fichiers de dpendances sont aussi considres comme des projets.


Exemple complet :


vdspq4.ttp
{
	.o	.c	#CC #flags.c -I#path.h -o#target #source
	
	.c #flags = "-C -Y -T -2 -K"
	.h #path = e:\f030dev\pure_c\include\
	.LIB #path = e:\f030dev\pure_c\lib\

	.o	.s	asm.ttp -l1 -o=#target -p=68030 -x #source
	.cld	.asm	asm56000.ttp -A -B -L #source
	.lod	.cld	cld2lod.ttp #source #target
			
	#LINK #flags.o #all e:\f030dev\pure_c\lib\PCFLTLIB.LIB e:\f030dev\pure_c\lib\PCSTDLIB.LIB e:\f030dev\pure_c\lib\PCEXTLIB.LIB e:\f030dev\pure_c\lib\PCTOSLIB.LIB  -O=#target
	.o #flags = "-G -L -Y"

	#CC = pcc.ttp
	#LINK = plink.ttp

	#path = e:\src\vdspq4\
	#path = e:\f030dev\pure_c\bin\
	#path = e:\braindev\bin\
	#path = e:\braindev\dsp\
		
	=

	e:\f030dev\pure_c\lib\f30start.o
	tcvmode.o	{= tcvmode.c}

	dsptools.o	{= dsptools.s}
	tools.o		{= tools.c    (vector.h)}		
	factor4.o	{= factor4.c  (vector.h)}
	vector.o	{= vector.c   (vector.h ptlist.h)}
	imgf30.o	{= imgf30.c   (vector.h)}
	imgrey.o	{= imgrey.c   (vector.h)}
	iir4.o		{= iir4.c     (vector.h)}
	edge.o		{= edge.c     (vector.h ptlist.h)}
	ptlist.o	{= ptlist.c   (vector.h ptlist.h)}
}
(
	dspcalc3.lod	{= dspcalc3.cld {= dspcalc3.asm}}
)



BUGS ??

	pour le momment a marche  peu prs.
	

A FAIRE

	- ajouter la gestion des commentaires dans le makefile
	- ajouter la gestion du changement de ligne dans le parser
	- amliorer la gestion des erreurs d'analyse
	- commencer le shell GEM qui evite la saisie de l'environnement

