]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/CodeTools/Source/Pccts/support/genmk/genmk.c
More renames for Tool Packages
[mirror_edk2.git] / Tools / CodeTools / Source / Pccts / support / genmk / genmk.c
CommitLineData
878ddf1f 1/*\r
2 * genmk -- a program to make makefiles for PCCTS\r
3 *\r
4 * ANTLR 1.33MR23\r
5 * Terence John Parr 1989 - 2000\r
6 * Purdue University\r
7 * U of MN\r
8 */\r
9\r
10#include <stdio.h>\r
11#include <string.h>\r
12#include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */\r
13\r
14#ifdef VAXC\r
15#define DIE return 0;\r
16#define DONE return 1;\r
17#else\r
18#define DIE return 1;\r
19#define DONE return 0;\r
20#endif\r
21\r
22#ifndef require\r
23#define require(expr, err) {if ( !(expr) ) fatal(err);}\r
24#endif\r
25\r
26#define MAX_FILES 50\r
27#define MAX_CFILES 1600\r
28#define MAX_SFILES 50\r
29#define MAX_SORS 50\r
30#define MAX_CLASSES 50\r
31\r
32char *RENAME_OBJ_FLAG="-o",\r
33 *RENAME_EXE_FLAG="-o";\r
34\r
35char *dlg = "parser.dlg";\r
36char *err = "err.c";\r
37char *hdr = "stdpccts.h";\r
38char *tok = "tokens.h";\r
39char *mode = "mode.h";\r
40char *scan = "scan";\r
41\r
42char ATOKENBUFFER_O[100];\r
43char APARSER_O[100];\r
44char ASTBASE_O[100];\r
45char PCCTSAST_O[100];\r
46char LIST_O[100];\r
47char DLEXERBASE_O[100];\r
48\r
49/* Option flags */\r
50static char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES];\r
51static char *cfiles[MAX_CFILES];\r
52static char *sfiles[MAX_SORS][MAX_SFILES],*sclasses[MAX_SORS];\r
53static int num_sfiles[MAX_SORS]; /*sorcerer files in group */\r
54static int num_sors = 0; /*sorcerer groups */\r
55static int num_files = 0; /* grammar files */\r
56static int num_cfiles = 0; /* additional C/C++ files */\r
57static int num_classes = 0; /* ANTLR classes */\r
58static int user_lexer = 0;\r
59static char *user_token_types = NULL;\r
60static int gen_CPP = 0;\r
61static char *outdir=".";\r
62static char *dlg_class = "DLGLexer";\r
63static int gen_trees = 0;\r
64static int gen_hoist = 0;\r
65static int nondef_comp = 0; /* 1=compiler is non default */\r
66static char *compilerCCC="CC";\r
67static char *compilerCC="cc";\r
68static char *pccts_path="/usr/local/pccts";\r
69\r
70#ifdef __STDC__\r
71void help(void);\r
72void mk(char *project, char **files, int n, int argc, char **argv);\r
73void pfiles(char **files, int n, char *suffix);\r
74void fatal(char *msg);\r
75void warn(char *msg);\r
76#else\r
77void help();\r
78void mk();\r
79void pfiles();\r
80void fatal();\r
81void warn();\r
82#endif\r
83\r
84typedef struct _Opt {\r
85 char *option;\r
86 int arg;\r
87#ifdef __cplusplus\r
88 void (*process)(...);\r
89#else\r
90 void (*process)();\r
91#endif\r
92 char *descr;\r
93 } Opt;\r
94\r
95#ifdef __STDC__\r
96static void ProcessArgs(int, char **, Opt *);\r
97#else\r
98static void ProcessArgs();\r
99#endif\r
100\r
101static void\r
102#ifdef __STDC__\r
103pProj(char *s, char *t )\r
104#else\r
105pProj( s, t )\r
106char *s;\r
107char *t;\r
108#endif\r
109{\r
110 project = t;\r
111}\r
112\r
113static void\r
114#ifdef __STDC__\r
115pUL( char *s )\r
116#else\r
117pUL( s )\r
118char *s;\r
119#endif\r
120{\r
121 user_lexer = 1;\r
122}\r
123\r
124static void\r
125#ifdef __STDC__\r
126pCPP( char *s )\r
127#else\r
128pCPP( s )\r
129char *s;\r
130#endif\r
131{\r
132 gen_CPP = 1;\r
133}\r
134\r
135static void\r
136#ifdef __STDC__\r
137pUT( char *s, char *t )\r
138#else\r
139pUT( s, t )\r
140char *s;\r
141char *t;\r
142#endif\r
143{\r
144 user_token_types = t;\r
145}\r
146\r
147static void\r
148#ifdef __STDC__\r
149pTrees( char *s )\r
150#else\r
151pTrees( s )\r
152char *s;\r
153#endif\r
154{\r
155 gen_trees = 1;\r
156}\r
157\r
158static void\r
159#ifdef __STDC__\r
160pHoist( char *s )\r
161#else\r
162pHoist( s )\r
163char *s;\r
164#endif\r
165{\r
166 gen_hoist = 1;\r
167}\r
168\r
169static void\r
170#ifdef __STDC__\r
171pSor( char *s )\r
172#else\r
173pSor( s )\r
174char *s;\r
175#endif\r
176{\r
177 require(num_sors<MAX_SORS, "exceeded max # of sorcerer groups");\r
178 num_sors++;\r
179 pTrees(NULL); /* silently turn on tree generation */\r
180}\r
181\r
182static void\r
183#ifdef __STDC__\r
184pSFiles( char *s, char *t )\r
185#else\r
186pSFiles( s, t )\r
187char *s;\r
188char *t;\r
189#endif\r
190{\r
191 if (num_sors==0)\r
192 {\r
193 pSor(NULL);\r
194 warn("sorcerer input file before any '-sor' option");\r
195 }\r
196 \r
197 require(num_sfiles[num_sors-1]<MAX_SFILES,\r
198 "exceeded max # of sorcerer input files");\r
199 sfiles[num_sors-1][num_sfiles[num_sors-1]++] = t;\r
200}\r
201\r
202static void\r
203#ifdef __STDC__\r
204pCFiles( char *s, char *t )\r
205#else\r
206pCFiles( s, t )\r
207char *s;\r
208char *t;\r
209#endif\r
210{\r
211 require(num_cfiles<MAX_CFILES, "exceeded max # of C/C++ input files");\r
212 cfiles[num_cfiles++] = t;\r
213}\r
214\r
215int\r
216#ifdef __STDC__\r
217isKnownSuffix( char *s )\r
218#else\r
219isKnownSuffix( s )\r
220 char *s;\r
221#endif\r
222{\r
223 if(s==NULL) return 0;\r
224 if (strcasecmp(s,".c")==0) return 1;\r
225 if (strcasecmp(s,".cc")==0) return 1;\r
226 if (strcasecmp(s,".cpp")==0) return 1;\r
227 if (strcasecmp(s,".cxx")==0) return 1;\r
228 if (strcasecmp(s,CPP_FILE_SUFFIX)==0) return 1;\r
229 if (strcasecmp(s,".sor")==0) return 2;\r
230 return 0;\r
231}\r
232\r
233static void\r
234#ifdef __STDC__\r
235pFile( char *s )\r
236#else\r
237pFile( s )\r
238char *s;\r
239#endif\r
240{\r
241 if ( *s=='-' )\r
242 {\r
243 fprintf(stderr, "invalid option: '%s'; ignored...",s);\r
244 return;\r
245 }\r
246 switch(isKnownSuffix(strrchr(s,'.')))\r
247 {\r
248 case 1: /* c/c++ */\r
249 pCFiles("-cfiles",s);\r
250 return;\r
251 case 2: /* sorcerer */\r
252 pSFiles("",s);\r
253 return;\r
254 default: /* grammar (ANTLR) */\r
255 break;\r
256 }\r
257 require(num_files<MAX_FILES, "exceeded max # of input files");\r
258 files[num_files++] = s;\r
259}\r
260\r
261static void\r
262#ifdef __STDC__\r
263pClass( char *s, char *t )\r
264#else\r
265pClass( s, t )\r
266char *s;\r
267char *t;\r
268#endif\r
269{\r
270 if (num_sors==0)\r
271 {\r
272 require(num_classes<MAX_CLASSES, "exceeded max # of grammar classes");\r
273 classes[num_classes++] = t;\r
274 } else\r
275 {\r
276 sclasses[num_sors-1] = t; /* one class per sorcerer group (last valid) */\r
277 }\r
278}\r
279\r
280static void\r
281#ifdef __STDC__\r
282pDLGClass( char *s, char *t )\r
283#else\r
284pDLGClass( s, t )\r
285char *s;\r
286char *t;\r
287#endif\r
288{\r
289 if ( !gen_CPP ) {\r
290 fprintf(stderr, "-dlg-class makes no sense without C++ mode; ignored...");\r
291 }\r
292 else dlg_class = t;\r
293}\r
294\r
295static void\r
296#ifdef __STDC__\r
297pOdir( char *s, char *t )\r
298#else\r
299pOdir( s, t )\r
300char *s;\r
301char *t;\r
302#endif\r
303{\r
304 outdir = t;\r
305}\r
306\r
307static void\r
308#ifdef __STDC__\r
309pHdr( char *s, char *t )\r
310#else\r
311pHdr( s, t )\r
312char *s;\r
313char *t;\r
314#endif\r
315{\r
316 hdr = t;\r
317}\r
318\r
319static void\r
320#ifdef __STDC__\r
321pCompiler( char *s, char *t )\r
322#else\r
323pCompiler( s, t )\r
324char *s;\r
325char *t;\r
326#endif\r
327{\r
328 compilerCCC = t;\r
329 compilerCC = t;\r
330 nondef_comp = 1;\r
331}\r
332\r
333static void\r
334#ifdef __STDC__\r
335ppccts_path( char *s, char *t )\r
336#else\r
337ppccts_path( s, t )\r
338char *s;\r
339char *t;\r
340#endif\r
341{\r
342 pccts_path = t;\r
343}\r
344\r
345Opt options[] = {\r
346 { "-CC", 0, pCPP, "Generate C++ output"},\r
347 { "-class", 1, pClass, "Name of a grammar class defined in grammar (if C++)"},\r
348 { "-dlg-class", 1,pDLGClass,"Name of DLG lexer class (default=DLGLexer) (if C++)"},\r
349 { "-header", 1,pHdr, "Name of ANTLR standard header info (default=no file)"},\r
350 { "-o", 1, pOdir, "Directory where output files should go (default=\".\")"},\r
351 { "-project", 1, pProj, "Name of executable to create (default=t)"},\r
352 { "-token-types", 1, pUT, "Token types are in this file (don't use tokens.h)"},\r
353 { "-trees", 0, pTrees, "Generate ASTs"},\r
354 { "-user-lexer", 0, pUL, "Do not create a DLG-based scanner"},\r
355 { "-mrhoist",0,pHoist, "Maintenance release style hoisting"},\r
356 { "-cfiles",1,pCFiles, "Additional files in C or C++ to compile"},\r
357 { "-sor",0,pSor, "Start of sorcerer group"},\r
358 { "-pccts_path",1,ppccts_path,\r
359 "Path for $PCCTS directory (default is /usr/local/pccts)"},\r
360 { "-compiler",1,pCompiler,\r
361 "Default compiler (default is CC/cc)"},\r
362 { "*", 0,pFile, "" }, /* anything else is a file */\r
363 { NULL, 0, NULL, NULL }\r
364};\r
365\r
366#ifdef __STDC__\r
367extern char *DIR(void);\r
368#else\r
369extern char *DIR();\r
370#endif\r
371\r
372#ifdef __STDC__\r
373int main(int argc, char **argv)\r
374#else\r
375int main(argc, argv)\r
376int argc;\r
377char **argv;\r
378#endif\r
379{\r
380 int i;\r
381 \r
382 if ( argc == 1 ) { help(); DIE; }\r
383 for(i=0;i<MAX_SORS;i++) num_sfiles[i]=0;\r
384 \r
385 ProcessArgs(argc-1, &(argv[1]), options);\r
386\r
387 strcpy(ATOKENBUFFER_O, ATOKENBUFFER_C);\r
388 ATOKENBUFFER_O[strlen(ATOKENBUFFER_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
389 strcat(ATOKENBUFFER_O, OBJ_FILE_SUFFIX);\r
390 strcpy(APARSER_O, APARSER_C);\r
391 APARSER_O[strlen(APARSER_O)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
392 strcat(APARSER_O, OBJ_FILE_SUFFIX);\r
393\r
394 strcpy(ASTBASE_O, ASTBASE_C);\r
395 ASTBASE_O[strlen(ASTBASE_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
396 strcat(ASTBASE_O, OBJ_FILE_SUFFIX);\r
397\r
398 strcpy(PCCTSAST_O, PCCTSAST_C);\r
399 PCCTSAST_O[strlen(PCCTSAST_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
400 strcat(PCCTSAST_O, OBJ_FILE_SUFFIX);\r
401\r
402 strcpy(LIST_O, LIST_C);\r
403 LIST_O[strlen(LIST_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
404 strcat(LIST_O, OBJ_FILE_SUFFIX);\r
405\r
406 strcpy(DLEXERBASE_O, DLEXERBASE_C);\r
407 DLEXERBASE_O[strlen(DLEXERBASE_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
408 strcat(DLEXERBASE_O, OBJ_FILE_SUFFIX);\r
409\r
410 if ( num_files == 0 ) fatal("no grammar files specified; exiting...");\r
411 if ( !gen_CPP && num_classes>0 ) {\r
412 warn("can't define classes w/o C++ mode; turning on C++ mode...\n");\r
413 gen_CPP=1;\r
414 }\r
415 if (!gen_CPP && num_sors) {\r
416 warn("can't define sorcerer group in C mode (yet); turning on C++ mode...\n");\r
417 gen_CPP=1;\r
418 }\r
419 if ( gen_CPP && num_classes==0 ) {\r
420 fatal("must define classes >0 grammar classes in C++ mode\n");\r
421 }\r
422\r
423 mk(project, files, num_files, argc, argv);\r
424 DONE;\r
425}\r
426\r
427#ifdef __STDC__\r
428void help(void)\r
429#else\r
430void help()\r
431#endif\r
432{\r
433 Opt *p = options;\r
434 static char buf[1000+1];\r
435\r
436 fprintf(stderr, "genmk [options] f1.g ... fn.g\n");\r
437 while ( p->option!=NULL && *(p->option) != '*' )\r
438 {\r
439 buf[0]='\0';\r
440 if ( p->arg ) sprintf(buf, "%s ___", p->option);\r
441 else strcpy(buf, p->option);\r
442 fprintf(stderr, "\t%-16s %s\n", buf, p->descr);\r
443 p++;\r
444 }\r
445}\r
446\r
447#ifdef __STDC__\r
448void mk(char *project, char **files, int n, int argc, char **argv)\r
449#else\r
450void mk(project, files, n, argc, argv)\r
451char *project;\r
452char **files;\r
453int n;\r
454int argc;\r
455char **argv;\r
456#endif\r
457{\r
458 int i,j;\r
459\r
460 printf("#\n");\r
461 printf("# PCCTS makefile for: ");\r
462 pfiles(files, n, NULL);\r
463 printf("\n");\r
464 printf("#\n");\r
465 printf("# Created from:");\r
466 for (i=0; i<argc; i++) printf(" %s", argv[i]);\r
467 printf("\n");\r
468 printf("#\n");\r
469 printf("# PCCTS release 1.33MR23\n");\r
470 printf("# Project: %s\n", project);\r
471 if ( gen_CPP ) printf("# C++ output\n");\r
472 else printf("# C output\n");\r
473 if ( user_lexer ) printf("# User-defined scanner\n");\r
474 else printf("# DLG scanner\n");\r
475 if ( user_token_types!=NULL ) printf("# User-defined token types in '%s'\n", user_token_types);\r
476 else printf("# ANTLR-defined token types\n");\r
477 printf("#\n");\r
478/***********\r
479 printf(".SUFFIXES:\n.SUFFIXES:\t.o .cpp .c .h .g .i .dlg .sor\n"); \r
480 ***********/\r
481 if ( user_token_types!=NULL ) {\r
482 printf("# Make sure #tokdefs directive in ANTLR grammar lists this file:\n");\r
483 printf("TOKENS = %s", user_token_types);\r
484 }\r
485 else printf("TOKENS = %stokens.h", DIR());\r
486 printf("\n");\r
487 printf("#\n");\r
488 printf("# The following filenames must be consistent with ANTLR/DLG flags\n");\r
489 printf("DLG_FILE = %s%s\n", DIR(), dlg);\r
490 printf("ERR = %serr\n", DIR());\r
491 if ( strcmp(hdr,"stdpccts.h")!=0 ) printf("HDR_FILE = %s%s\n", DIR(), hdr);\r
492 else printf("HDR_FILE =\n");\r
493 if ( !gen_CPP ) printf("MOD_FILE = %s%s\n", DIR(), mode);\r
494 if ( !gen_CPP ) printf("SCAN = %s\n", scan);\r
495 else printf("SCAN = %s%s\n", DIR(), dlg_class);\r
496\r
497 printf("PCCTS = %s\n",pccts_path);\r
498 printf("ANTLR_H = $(PCCTS)%sh\n", DirectorySymbol);\r
499 if (num_sors>0) {\r
500 printf("SOR_H = $(PCCTS)%ssorcerer%sh\n", DirectorySymbol, DirectorySymbol);\r
501 printf("SOR_LIB = $(PCCTS)%ssorcerer%slib\n",\r
502 DirectorySymbol, DirectorySymbol);\r
503 }\r
504 printf("BIN = $(PCCTS)%sbin\n", DirectorySymbol);\r
505 printf("ANTLR = $(BIN)%santlr\n", DirectorySymbol);\r
506 printf("DLG = $(BIN)%sdlg\n", DirectorySymbol);\r
507 if (num_sors>0) printf("SOR = $(BIN)%ssor\n", DirectorySymbol);\r
508 printf("CFLAGS = -I. -I$(ANTLR_H)");\r
509 if (num_sors>0) printf(" -I$(SOR_H)");\r
510 if ( strcmp(outdir, ".")!=0 ) printf(" -I%s", outdir);\r
511 printf(" $(COTHER)");\r
512 printf("\n");\r
513 printf("AFLAGS =");\r
514 if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);\r
515 if ( user_lexer ) printf(" -gx");\r
516 if ( gen_CPP ) printf(" -CC");\r
517 if ( strcmp(hdr,"stdpccts.h")!=0 ) printf(" -gh %s", hdr);\r
518 if ( gen_trees ) printf(" -gt");\r
519 if ( gen_hoist ) {\r
520 printf(" -mrhoist on") ;\r
521 } else {\r
522 printf(" -mrhoist off");\r
523 };\r
524 printf(" $(AOTHER)");\r
525 printf("\n");\r
526 printf("DFLAGS = -C2 -i");\r
527 if ( gen_CPP ) printf(" -CC");\r
528 if ( strcmp(dlg_class,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class);\r
529 if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);\r
530 printf(" $(DOTHER)");\r
531 printf("\n");\r
532 if (num_sors>0)\r
533 {\r
534 printf("SFLAGS = -CPP");\r
535 if ( strcmp(outdir,".")!=0 ) printf(" -out-dir %s", outdir);\r
536 printf(" $(SOTHER)\n");\r
537 }\r
538 printf("GRM = ");\r
539 pfiles(files, n, NULL);\r
540 printf("\n");\r
541 printf("SRC = ");\r
542 if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);\r
543 else pfiles(files, n, "c");\r
544 if ( gen_CPP ) {\r
545 printf(" \\\n\t");\r
546 pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);\r
547 printf(" \\\n\t");\r
548 printf("$(ANTLR_H)%s%s", DirectorySymbol, APARSER_C);\r
549 if ( !user_lexer ) printf(" $(ANTLR_H)%s%s", DirectorySymbol, DLEXERBASE_C);\r
550 if ( gen_trees ) {\r
551 printf(" \\\n\t");\r
552 printf("$(ANTLR_H)%s%s", DirectorySymbol, ASTBASE_C);\r
553 printf(" $(ANTLR_H)%s%s", DirectorySymbol, PCCTSAST_C);\r
554/* printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */\r
555 printf(" \\\n\t");\r
556 }\r
557 printf(" $(ANTLR_H)%s%s", DirectorySymbol, ATOKENBUFFER_C);\r
558 }\r
559 if ( !user_lexer ) {\r
560 if ( gen_CPP ) printf(" $(SCAN)%s", CPP_FILE_SUFFIX);\r
561 else printf(" %s$(SCAN).c", DIR());\r
562 }\r
563 if ( !gen_CPP ) printf(" $(ERR).c");\r
564 for (i=0;i<num_sors;i++)\r
565 {\r
566 printf(" \\\n\t");\r
567 pclasses(&sclasses[i],1,CPP_FILE_SUFFIX_NO_DOT);\r
568 printf(" ");\r
569 pfiles(&sfiles[i][0],num_sfiles[i],CPP_FILE_SUFFIX_NO_DOT);\r
570 }\r
571 if(num_sors>0)\r
572 printf(" \\\n\t$(SOR_LIB)%sSTreeParser.cpp", DirectorySymbol);\r
573 if (num_cfiles>0)\r
574 {\r
575 printf(" \\\n\t");\r
576 pfiles(cfiles,num_cfiles,NULL);\r
577 }\r
578 printf("\n\n");\r
579 printf("OBJ = ");\r
580 pfiles(files, n, "o");\r
581 if ( gen_CPP ) {\r
582 printf(" \\\n\t");\r
583 pclasses(classes, num_classes, "o");\r
584 printf(" \\\n\t");\r
585 printf("%s%s", DIR(), APARSER_O);\r
586 if ( !user_lexer ) {\r
587 printf(" %s%s", DIR(), DLEXERBASE_O);\r
588 }\r
589 if ( gen_trees ) {\r
590 printf(" \\\n\t");\r
591 printf("%s%s", DIR(), ASTBASE_O);\r
592 printf(" %s%s", DIR(), PCCTSAST_O);\r
593/* printf(" %s%s", DIR(), LIST_O); */\r
594 printf(" \\\n\t");\r
595 }\r
596 printf(" %s%s", DIR(), ATOKENBUFFER_O);\r
597 }\r
598 if ( !user_lexer ) {\r
599 if ( gen_CPP ) printf(" $(SCAN)%s", OBJ_FILE_SUFFIX);\r
600 else printf(" %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX);\r
601 }\r
602 if ( !gen_CPP ) printf(" $(ERR)%s", OBJ_FILE_SUFFIX);\r
603 for (i=0;i<num_sors;i++)\r
604 {\r
605 printf(" \\\n\t");\r
606 pclasses(&sclasses[i],1,"o");\r
607 printf(" ");\r
608 pfiles(&sfiles[i][0],num_sfiles[i],"o");\r
609 }\r
610 if(num_sors>0) printf(" \\\n\tSTreeParser.o");\r
611 if (num_cfiles>0)\r
612 {\r
613 printf(" \\\n\t");\r
614 pfiles(cfiles,num_cfiles,"o");\r
615 }\r
616 printf("\n\n");\r
617\r
618 printf("ANTLR_SPAWN = ");\r
619 if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);\r
620 else pfiles(files, n, "c");\r
621 if ( gen_CPP ) {\r
622 printf(" ");\r
623 pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);\r
624 printf(" \\\n\t\t");\r
625 pclasses(classes, num_classes, "h");\r
626 if ( strcmp(hdr,"stdpccts.h")!=0 ) {\r
627 printf(" \\\n\t\t");\r
628 printf("$(HDR_FILE) stdpccts.h");\r
629 }\r
630 }\r
631 if ( user_lexer ) {\r
632 if ( !user_token_types ) printf(" $(TOKENS)");\r
633 }\r
634 else {\r
635 printf(" $(DLG_FILE)");\r
636 if ( !user_token_types ) printf(" $(TOKENS)");\r
637 }\r
638 if ( !gen_CPP ) printf(" $(ERR).c");\r
639 printf("\n");\r
640\r
641 if ( !user_lexer ) {\r
642 if ( gen_CPP ) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX);\r
643 else printf("DLG_SPAWN = %s$(SCAN).c", DIR());\r
644 if ( gen_CPP ) printf(" $(SCAN).h");\r
645 if ( !gen_CPP ) printf(" $(MOD_FILE)");\r
646 printf("\n");\r
647 }\r
648\r
649 if ( gen_CPP ) {\r
650 if ( !nondef_comp )\r
651 printf("ifdef CXX\nCCC = $(CXX)\nendif\n\nifndef CCC\n");\r
652 printf("CCC = %s\n",compilerCCC);\r
653 if ( !nondef_comp ) printf("endif\n\n");\r
654 }\r
655 else\r
656 {\r
657 if ( !nondef_comp ) printf("ifndef CC\n");\r
658 printf("CC = %s\n",compilerCC);\r
659 if ( !nondef_comp ) printf("endif\n\n");\r
660 }\r
661\r
662 /* set up dependencies */\r
663 printf("\n%s : $(SRC) $(OBJ)\n", project);\r
664 printf("\t%s %s %s $(CFLAGS) $(OBJ)\n",\r
665 gen_CPP?"$(CCC)":"$(CC)",\r
666 RENAME_EXE_FLAG,\r
667 project);\r
668 printf("\n");\r
669\r
670 /* implicit rules */\r
671\r
672/* if(gen_CPP)\r
673 printf("%%.o : %%.cpp\n\t$(CCC) -c $(CFLAGS) $<\n\n");\r
674\r
675 printf("%%.o : %%.c\n\t%s -c $(CFLAGS) $<\n\n",\r
676 gen_CPP?"$(CCC)":"$(CC)");\r
677*/\r
678 /* how to compile parser files */\r
679\r
680 for (i=0; i<num_files; i++)\r
681 {\r
682 pfiles(&files[i], 1, "o");\r
683 if ( user_lexer ) {\r
684 printf(" : $(TOKENS)");\r
685 }\r
686 else {\r
687 if ( gen_CPP ) printf(" : $(TOKENS) $(SCAN).h");\r
688 else printf(" : $(MOD_FILE) $(TOKENS)");\r
689 }\r
690 printf(" ");\r
691 if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
692 else pfiles(&files[i], 1, "c");\r
693 if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
694 printf("\n");\r
695 printf("\t%s -c $(CFLAGS) %s ",\r
696 gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
697 pfiles(&files[i], 1, "o");\r
698 printf(" ");\r
699 if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
700 else pfiles(&files[i], 1, "c");\r
701 printf("\n\n");\r
702 }\r
703\r
704 for (i=0; i<num_cfiles; i++)\r
705 {\r
706 pfiles(&cfiles[i], 1, "o");\r
707 printf(" : ");\r
708 pfiles(&cfiles[i], 1, NULL);\r
709 if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
710/*** printf(" "); ***/\r
711/*** pfiles(&cfiles[i], 1, "h"); ***/\r
712 printf("\n");\r
713 printf("\t%s -c $(CFLAGS) %s ",\r
714 gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
715 pfiles(&cfiles[i], 1, "o");\r
716 printf(" ");\r
717 pfiles(&cfiles[i], 1, NULL);\r
718 printf("\n\n");\r
719\r
720/*\r
721 * pfiles(&cfiles[i], 1, "h");\r
722 * printf(" :\ntouch ");\r
723 * pfiles(&cfiles[i], 1, "h");\r
724 * printf("\n\n");\r
725 */\r
726 }\r
727\r
728 /* how to compile err.c */\r
729 if ( !gen_CPP ) {\r
730 printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX);\r
731 if ( !user_lexer ) printf(" $(TOKENS)");\r
732 printf("\n");\r
733 printf("\t%s -c $(CFLAGS) %s $(ERR)%s $(ERR).c",\r
734 gen_CPP?"$(CCC)":"$(CC)",\r
735 RENAME_OBJ_FLAG,\r
736 OBJ_FILE_SUFFIX);\r
737 printf("\n\n");\r
738 }\r
739\r
740 /* how to compile Class.c */\r
741 for (i=0; i<num_classes; i++)\r
742 {\r
743 pclasses(&classes[i], 1, "o");\r
744 if ( user_lexer ) {\r
745 printf(" : $(TOKENS)");\r
746 }\r
747 else {\r
748 printf(" : $(TOKENS) $(SCAN).h");\r
749 }\r
750 printf(" ");\r
751 pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
752 printf(" ");\r
753 pclasses(&classes[i], 1, "h");\r
754 if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
755 printf("\n");\r
756 printf("\t%s -c $(CFLAGS) %s ",\r
757 gen_CPP?"$(CCC)":"$(CC)",\r
758 RENAME_OBJ_FLAG);\r
759 pclasses(&classes[i], 1, "o");\r
760 printf(" ");\r
761 pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
762 printf("\n\n");\r
763 }\r
764\r
765 /* how to compile scan.c */\r
766 if ( !user_lexer ) {\r
767 if ( gen_CPP ) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX, CPP_FILE_SUFFIX);\r
768 else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX, DIR());\r
769 if ( !user_lexer ) printf(" $(TOKENS)");\r
770 printf("\n");\r
771 if ( gen_CPP ) printf("\t$(CCC) -c $(CFLAGS) %s $(SCAN)%s $(SCAN)%s",\r
772 RENAME_OBJ_FLAG,\r
773 OBJ_FILE_SUFFIX,\r
774 CPP_FILE_SUFFIX);\r
775 else printf("\t$(CC) -c $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",\r
776 RENAME_OBJ_FLAG,\r
777 DIR(),\r
778 OBJ_FILE_SUFFIX,\r
779 DIR());\r
780 printf("\n\n");\r
781 }\r
782/* how to compile sorcerer classes */\r
783 for (i=0;i<num_sors;i++)\r
784 {\r
785 pclasses(&sclasses[i], 1, "o");\r
786 printf(" : ");\r
787 pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
788 printf(" ");\r
789 pclasses(&sclasses[i], 1, "h");\r
790 if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
791 printf("\n");\r
792 printf("\t%s -c $(CFLAGS) %s ",\r
793 gen_CPP?"$(CCC)":"$(CC)",\r
794 RENAME_OBJ_FLAG);\r
795 pclasses(&sclasses[i], 1, "o");\r
796 printf(" ");\r
797 pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
798 printf("\n\n");\r
799/* how to compile i-th sorcerer's files*/\r
800 for (j=0; j<num_sfiles[i]; j++)\r
801 {\r
802 pfiles(&sfiles[i][j], 1, "o");\r
803 printf(" : ");\r
804 if ( gen_CPP ) pfiles(&sfiles[i][j], 1, CPP_FILE_SUFFIX_NO_DOT);\r
805 else pfiles(&sfiles[i][j], 1, "c");\r
806 if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
807 printf("\n");\r
808 printf("\t%s -c $(CFLAGS) %s ",\r
809 gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
810 pfiles(&sfiles[i][j], 1, "o");\r
811 printf(" ");\r
812 if ( gen_CPP ) pfiles(&sfiles[i][j], 1, CPP_FILE_SUFFIX_NO_DOT);\r
813 else pfiles(&sfiles[i][j], 1, "c");\r
814 printf("\n\n");\r
815 }\r
816 if ( gen_CPP ) pfiles(&sfiles[i][0], num_sfiles[i], CPP_FILE_SUFFIX_NO_DOT);\r
817 else pfiles(&sfiles[i][0], num_sfiles[i], "c");\r
818 if ( gen_CPP )\r
819 {\r
820 printf(" ");\r
821 pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
822 printf(" ");\r
823 pclasses(&sclasses[i], 1, "h");\r
824 if ( strcmp(hdr,"stdpccts.h")!=0 ) \r
825 {\r
826 printf(" ");\r
827 printf("$(HDR_FILE) stdpccts.h");\r
828 }\r
829 }\r
830 printf(" : ");\r
831 pfiles(&sfiles[i][0],num_sfiles[i],NULL);\r
832 printf("\n\t$(SOR) $(SFLAGS) ");\r
833 pfiles(&sfiles[i][0],num_sfiles[i],NULL);\r
834 printf("\n\n");\r
835 }\r
836 if(num_sors>0)\r
837 {\r
838 printf("STreeParser%s : $(SOR_LIB)%sSTreeParser.cpp\n",\r
839 OBJ_FILE_SUFFIX,DirectorySymbol);\r
840 printf("\t%s -c $(CFLAGS) %s ",\r
841 gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
842 printf("STreeParser%s ",OBJ_FILE_SUFFIX);\r
843 printf("$(SOR_LIB)%sSTreeParser.cpp\n\n",DirectorySymbol);\r
844 }\r
845 \r
846 printf("$(ANTLR_SPAWN) : $(GRM)\n");\r
847 printf("\t$(ANTLR) $(AFLAGS) $(GRM)\n");\r
848\r
849 if ( !user_lexer )\r
850 {\r
851 printf("\n");\r
852 printf("$(DLG_SPAWN) : $(DLG_FILE)\n");\r
853 if ( gen_CPP ) printf("\t$(DLG) $(DFLAGS) $(DLG_FILE)\n");\r
854 else printf("\t$(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");\r
855 }\r
856\r
857 /* do the makes for ANTLR/DLG support */\r
858 if ( gen_CPP ) {\r
859 printf("\n");\r
860 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C);\r
861 printf("\t%s -c $(CFLAGS) %s ",\r
862 gen_CPP?"$(CCC)":"$(CC)",\r
863 RENAME_OBJ_FLAG);\r
864 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C);\r
865 printf("\n");\r
866 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C);\r
867 printf("\t%s -c $(CFLAGS) %s ",\r
868 gen_CPP?"$(CCC)":"$(CC)",\r
869 RENAME_OBJ_FLAG);\r
870 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C);\r
871 if ( !user_lexer ) {\r
872 printf("\n");\r
873 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C);\r
874 printf("\t%s -c $(CFLAGS) %s ",\r
875 gen_CPP?"$(CCC)":"$(CC)",\r
876 RENAME_OBJ_FLAG);\r
877 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C);\r
878 }\r
879 if ( gen_trees ) {\r
880 printf("\n");\r
881 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C);\r
882 printf("\t%s -c $(CFLAGS) %s ",\r
883 gen_CPP?"$(CCC)":"$(CC)",\r
884 RENAME_OBJ_FLAG);\r
885 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C);\r
886 printf("\n");\r
887 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C);\r
888 printf("\t%s -c $(CFLAGS) %s ",\r
889 gen_CPP?"$(CCC)":"$(CC)",\r
890 RENAME_OBJ_FLAG);\r
891 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C);\r
892 printf("\n");\r
893/*\r
894 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);\r
895 printf("\t%s -c $(CFLAGS) %s ",\r
896 gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
897 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);\r
898*/\r
899 }\r
900 }\r
901\r
902 /* clean and scrub targets */\r
903\r
904 printf("\nclean:\n");\r
905 printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project);\r
906 if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX);\r
907 printf("\n");\r
908\r
909 printf("\nscrub: clean\n");\r
910/* printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project); */\r
911/* if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX); */\r
912 printf("\trm -f $(ANTLR_SPAWN)");\r
913 if ( !user_lexer ) printf(" $(DLG_SPAWN)");\r
914 for (i=0;i<num_sors;i++)\r
915 {\r
916 printf(" ");\r
917 if ( gen_CPP ) pfiles(&sfiles[i][0], num_sfiles[i], CPP_FILE_SUFFIX_NO_DOT);\r
918 else pfiles(&sfiles[i][0], num_sfiles[i], "c");\r
919 if ( gen_CPP )\r
920 {\r
921 printf(" ");\r
922 pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
923 printf(" ");\r
924 pclasses(&sclasses[i], 1, "h");\r
925 }\r
926 }\r
927 printf("\n\n");\r
928}\r
929\r
930#ifdef __STDC__\r
931void pfiles(char **files, int n, char *suffix)\r
932#else\r
933void pfiles(files, n, suffix)\r
934char **files;\r
935int n;\r
936char *suffix;\r
937#endif\r
938{\r
939 int first=1;\r
940\r
941 while ( n>0 )\r
942 {\r
943 char *p = &(*files)[strlen(*files)-1];\r
944 if ( !first ) putchar(' ');\r
945 first=0;\r
946 while ( p > *files && *p != '.' ) --p;\r
947 if ( p == *files )\r
948 {\r
949 fprintf(stderr,\r
950 "genmk: filenames must be file.suffix format: %s\n",\r
951 *files);\r
952 exit(-1);\r
953 }\r
954 if ( suffix == NULL ) printf("%s", *files);\r
955 else\r
956 {\r
957 *p = '\0';\r
958 printf("%s", DIR());\r
959 if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX);\r
960 else printf("%s.%s", *files, suffix);\r
961 *p = '.';\r
962 }\r
963 files++;\r
964 --n;\r
965 }\r
966}\r
967\r
968#ifdef __STDC__\r
969pclasses(char **classes, int n, char *suffix)\r
970#else\r
971pclasses(classes, n, suffix)\r
972char **classes;\r
973int n;\r
974char *suffix;\r
975#endif\r
976{\r
977 int first=1;\r
978\r
979 while ( n>0 )\r
980 {\r
981 if ( !first ) putchar(' ');\r
982 first=0;\r
983 if ( suffix == NULL ) printf("%s", *classes);\r
984 else {\r
985 printf("%s", DIR());\r
986 if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX);\r
987 else printf("%s.%s", *classes, suffix);\r
988 }\r
989 classes++;\r
990 --n;\r
991 }\r
992}\r
993\r
994static void\r
995#ifdef __STDC__\r
996ProcessArgs( int argc, char **argv, Opt *options )\r
997#else\r
998ProcessArgs( argc, argv, options )\r
999int argc;\r
1000char **argv;\r
1001Opt *options;\r
1002#endif\r
1003{\r
1004 Opt *p;\r
1005 require(argv!=NULL, "ProcessArgs: command line NULL");\r
1006\r
1007 while ( argc-- > 0 )\r
1008 {\r
1009 p = options;\r
1010 while ( p->option != NULL )\r
1011 {\r
1012 if ( strcmp(p->option, "*") == 0 ||\r
1013 strcmp(p->option, *argv) == 0 )\r
1014 {\r
1015 if ( p->arg )\r
1016 {\r
1017 (*p->process)( *argv, *(argv+1) );\r
1018 argv++;\r
1019 argc--;\r
1020 }\r
1021 else\r
1022 (*p->process)( *argv );\r
1023 break;\r
1024 }\r
1025 p++;\r
1026 }\r
1027 argv++;\r
1028 }\r
1029}\r
1030\r
1031#ifdef __STDC__\r
1032void fatal( char *err_)\r
1033#else\r
1034void fatal( err_)\r
1035char *err_;\r
1036#endif\r
1037{\r
1038 fprintf(stderr, "genmk: %s\n", err_);\r
1039 exit(1);\r
1040}\r
1041\r
1042#ifdef __STDC__\r
1043void warn( char *err_)\r
1044#else\r
1045void warn( err_)\r
1046char *err_;\r
1047#endif\r
1048{\r
1049 fprintf(stderr, "genmk: %s\n", err_);\r
1050}\r
1051\r
1052#ifdef __STDC__\r
1053char *DIR(void)\r
1054#else\r
1055char *DIR()\r
1056#endif\r
1057{\r
1058 static char buf[200+1];\r
1059 \r
1060 if ( strcmp(outdir,TopDirectory)==0 ) return "";\r
1061 sprintf(buf, "%s%s", outdir, DirectorySymbol);\r
1062 return buf;\r
1063}\r