]>
git.proxmox.com Git - mirror_edk2.git/blob - Tools/CodeTools/Source/Pccts/support/genmk/genmk_old.c
2 * genmk -- a program to make makefiles for PCCTS
5 * Terence John Parr 1989 - 1998
11 #include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */
15 #define DONE return 1;
18 #define DONE return 0;
22 #define require(expr, err) {if ( !(expr) ) fatal(err);}
26 #define MAX_CLASSES 50
28 char *RENAME_OBJ_FLAG
="-o",
29 *RENAME_EXE_FLAG
="-o";
31 char *dlg
= "parser.dlg";
33 char *hdr
= "stdpccts.h";
34 char *tok
= "tokens.h";
35 char *mode
= "mode.h";
38 char ATOKENBUFFER_O
[100];
43 char DLEXERBASE_O
[100];
46 static char *project
="t", *files
[MAX_FILES
], *classes
[MAX_CLASSES
];
47 static int num_files
= 0;
48 static int num_classes
= 0;
49 static int user_lexer
= 0;
50 static char *user_token_types
= NULL
;
51 static int gen_CPP
= 0;
52 static char *outdir
=".";
53 static char *dlg_class
= "DLGLexer";
54 static int gen_trees
= 0;
55 static int gen_hoist
= 0;
56 static char cfiles
[1600]="";
57 static char *compilerCCC
="CC";
58 static char *compilerCC
="cc";
59 static char *pccts_path
="/usr/local/pccts";
80 static void ProcessArgs(int, char **, Opt
*);
82 static void ProcessArgs();
112 user_token_types
= t
;
139 fprintf(stderr
, "invalid option: '%s'; ignored...",s
);
143 require(num_files
<MAX_FILES
, "exceeded max # of input files");
144 files
[num_files
++] = s
;
149 pClass( char *s
, char *t
)
156 require(num_classes
<MAX_CLASSES
, "exceeded max # of grammar classes");
157 classes
[num_classes
++] = t
;
162 pDLGClass( char *s
, char *t
)
170 fprintf(stderr
, "-dlg-class makes no sense without C++ mode; ignored...");
177 pOdir( char *s
, char *t
)
189 pHdr( char *s
, char *t
)
201 pCFiles( char *s
, char *t
)
208 strcat(strcat(cfiles
," "), t
);
213 pCompiler( char *s
, char *t
)
226 ppccts_path( char *s
, char *t
)
237 { "-CC", 0, pCPP
, "Generate C++ output"},
238 { "-class", 1, pClass
, "Name of a grammar class defined in grammar (if C++)"},
239 { "-dlg-class", 1,pDLGClass
,"Name of DLG lexer class (default=DLGLexer) (if C++)"},
240 { "-header", 1,pHdr
, "Name of ANTLR standard header info (default=no file)"},
241 { "-o", 1, pOdir
, "Directory where output files should go (default=\".\")"},
242 { "-project", 1, pProj
, "Name of executable to create (default=t)"},
243 { "-token-types", 1, pUT
, "Token types are in this file (don't use tokens.h)"},
244 { "-trees", 0, pTrees
, "Generate ASTs"},
245 { "-user-lexer", 0, pUL
, "Do not create a DLG-based scanner"},
246 { "-mrhoist",0,pHoist
, "Maintenance release style hoisting"},
247 { "-cfiles",1,pCFiles
, "Additional files in C or C++ to compile"},
248 { "-pccts_path",1,ppccts_path
,
249 "Path for $PCCTS directory (default is /usr/local/pccts)"},
250 { "-compiler",1,pCompiler
,
251 "Default compiler (default is CC/cc)"},
252 { "*", 0,pFile
, "" }, /* anything else is a file */
253 { NULL
, 0, NULL
, NULL
}
262 if ( argc
== 1 ) { help(); DIE
; }
263 ProcessArgs(argc
-1, &(argv
[1]), options
);
265 strcpy(ATOKENBUFFER_O
, ATOKENBUFFER_C
);
266 ATOKENBUFFER_O
[strlen(ATOKENBUFFER_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
267 strcat(ATOKENBUFFER_O
, OBJ_FILE_SUFFIX
);
268 strcpy(APARSER_O
, APARSER_C
);
269 APARSER_O
[strlen(APARSER_O
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
270 strcat(APARSER_O
, OBJ_FILE_SUFFIX
);
272 strcpy(ASTBASE_O
, ASTBASE_C
);
273 ASTBASE_O
[strlen(ASTBASE_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
274 strcat(ASTBASE_O
, OBJ_FILE_SUFFIX
);
276 strcpy(PCCTSAST_O
, PCCTSAST_C
);
277 PCCTSAST_O
[strlen(PCCTSAST_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
278 strcat(PCCTSAST_O
, OBJ_FILE_SUFFIX
);
280 strcpy(LIST_O
, LIST_C
);
281 LIST_O
[strlen(LIST_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
282 strcat(LIST_O
, OBJ_FILE_SUFFIX
);
284 strcpy(DLEXERBASE_O
, DLEXERBASE_C
);
285 DLEXERBASE_O
[strlen(DLEXERBASE_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
286 strcat(DLEXERBASE_O
, OBJ_FILE_SUFFIX
);
288 if ( num_files
== 0 ) fatal("no grammar files specified; exiting...");
289 if ( !gen_CPP
&& num_classes
>0 ) {
290 warn("can't define classes w/o C++ mode; turning on C++ mode...\n");
293 if ( gen_CPP
&& num_classes
==0 ) {
294 fatal("must define classes >0 grammar classes in C++ mode\n");
297 mk(project
, files
, num_files
, argc
, argv
);
304 static char buf
[1000+1];
306 fprintf(stderr
, "genmk [options] f1.g ... fn.g\n");
307 while ( p
->option
!=NULL
&& *(p
->option
) != '*' )
310 if ( p
->arg
) sprintf(buf
, "%s ___", p
->option
);
311 else strcpy(buf
, p
->option
);
312 fprintf(stderr
, "\t%-16s %s\n", buf
, p
->descr
);
317 void mk(project
, files
, n
, argc
, argv
)
327 printf("# PCCTS makefile for: ");
328 pfiles(files
, n
, NULL
);
331 printf("# Created from:");
332 for (i
=0; i
<argc
; i
++) printf(" %s", argv
[i
]);
335 printf("# PCCTS release 1.33MR21\n");
336 printf("# Project: %s\n", project
);
337 if ( gen_CPP
) printf("# C++ output\n");
338 else printf("# C output\n");
339 if ( user_lexer
) printf("# User-defined scanner\n");
340 else printf("# DLG scanner\n");
341 if ( user_token_types
!=NULL
) printf("# User-defined token types in '%s'\n", user_token_types
);
342 else printf("# ANTLR-defined token types\n");
344 printf(".SUFFIXES:\n.SUFFIXES: .o .cpp .c .h .g .i .dlg\n");
345 if ( user_token_types
!=NULL
) {
346 printf("# Make sure #tokdefs directive in ANTLR grammar lists this file:\n");
347 printf("TOKENS = %s", user_token_types
);
349 else printf("TOKENS = %stokens.h", DIR());
352 printf("# The following filenames must be consistent with ANTLR/DLG flags\n");
353 printf("DLG_FILE = %s%s\n", DIR(), dlg
);
354 printf("ERR = %serr\n", DIR());
355 if ( strcmp(hdr
,"stdpccts.h")!=0 ) printf("HDR_FILE = %s%s\n", DIR(), hdr
);
356 else printf("HDR_FILE =\n");
357 if ( !gen_CPP
) printf("MOD_FILE = %s%s\n", DIR(), mode
);
358 if ( !gen_CPP
) printf("SCAN = %s\n", scan
);
359 else printf("SCAN = %s%s\n", DIR(), dlg_class
);
361 printf("PCCTS = %s\n",pccts_path
);
362 printf("ANTLR_H = $(PCCTS)%sh\n", DirectorySymbol
);
363 printf("BIN = $(PCCTS)%sbin\n", DirectorySymbol
);
364 printf("ANTLR = $(BIN)%santlr\n", DirectorySymbol
);
365 printf("DLG = $(BIN)%sdlg\n", DirectorySymbol
);
366 printf("CFLAGS = -I. -I$(ANTLR_H)");
367 if ( strcmp(outdir
, ".")!=0 ) printf(" -I%s", outdir
);
368 printf(" $(COTHER)");
371 if ( strcmp(outdir
,".")!=0 ) printf(" -o %s", outdir
);
372 if ( user_lexer
) printf(" -gx");
373 if ( gen_CPP
) printf(" -CC");
374 if ( strcmp(hdr
,"stdpccts.h")!=0 ) printf(" -gh %s", hdr
);
375 if ( gen_trees
) printf(" -gt");
377 printf(" -mrhoist on") ;
379 printf(" -mrhoist off");
381 printf(" $(AOTHER)");
383 printf("DFLAGS = -C2 -i");
384 if ( gen_CPP
) printf(" -CC");
385 if ( strcmp(dlg_class
,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class
);
386 if ( strcmp(outdir
,".")!=0 ) printf(" -o %s", outdir
);
387 printf(" $(DOTHER)");
390 pfiles(files
, n
, NULL
);
392 printf("MYFILES = %s\n",cfiles
);
394 if ( gen_CPP
) pfiles(files
, n
, CPP_FILE_SUFFIX_NO_DOT
);
395 else pfiles(files
, n
, "c");
399 pclasses(classes
, num_classes
, CPP_FILE_SUFFIX_NO_DOT
);
401 printf("$(ANTLR_H)%s%s", DirectorySymbol
, APARSER_C
);
402 if ( !user_lexer
) printf(" $(ANTLR_H)%s%s", DirectorySymbol
, DLEXERBASE_C
);
405 printf("$(ANTLR_H)%s%s", DirectorySymbol
, ASTBASE_C
);
406 printf(" $(ANTLR_H)%s%s", DirectorySymbol
, PCCTSAST_C
);
407 /* printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */
410 printf(" $(ANTLR_H)%s%s", DirectorySymbol
, ATOKENBUFFER_C
);
413 if ( gen_CPP
) printf(" $(SCAN)%s", CPP_FILE_SUFFIX
);
414 else printf(" %s$(SCAN).c", DIR());
416 if ( !gen_CPP
) printf(" $(ERR).c");
417 printf("\\\n $(MYFILES)\n");
419 pfiles(files
, n
, "o");
423 pclasses(classes
, num_classes
, "o");
425 printf(" %s%s", DIR(), APARSER_O
);
427 printf(" %s%s", DIR(), DLEXERBASE_O
);
431 printf("%s%s", DIR(), ASTBASE_O
);
432 printf(" %s%s", DIR(), PCCTSAST_O
);
433 /* printf(" %s%s", DIR(), LIST_O); */
436 printf(" %s%s", DIR(), ATOKENBUFFER_O
);
439 if ( gen_CPP
) printf(" $(SCAN)%s", OBJ_FILE_SUFFIX
);
440 else printf(" %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX
);
442 if ( !gen_CPP
) printf(" $(ERR)%s", OBJ_FILE_SUFFIX
);
443 printf("\\\n $(MYFILES:.cpp=.o)\n");
445 printf("ANTLR_SPAWN = ");
446 if ( gen_CPP
) pfiles(files
, n
, CPP_FILE_SUFFIX_NO_DOT
);
447 else pfiles(files
, n
, "c");
450 pclasses(classes
, num_classes
, CPP_FILE_SUFFIX_NO_DOT
);
452 pclasses(classes
, num_classes
, "h");
453 if ( strcmp(hdr
,"stdpccts.h")!=0 ) {
455 printf("$(HDR_FILE) stdpccts.h");
459 if ( !user_token_types
) printf(" $(TOKENS)");
462 printf(" $(DLG_FILE)");
463 if ( !user_token_types
) printf(" $(TOKENS)");
465 if ( !gen_CPP
) printf(" $(ERR).c");
469 if ( gen_CPP
) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX
);
470 else printf("DLG_SPAWN = %s$(SCAN).c", DIR());
471 if ( gen_CPP
) printf(" $(SCAN).h");
472 if ( !gen_CPP
) printf(" $(MOD_FILE)");
477 printf("CCC = %s\n",compilerCCC
);
479 else printf("CC = %s\n",compilerCC
);
481 /* set up dependencies */
482 printf("\n%s : $(OBJ) $(SRC)\n", project
);
483 printf(" %s %s %s $(CFLAGS) $(OBJ)\n",
484 gen_CPP
?"$(CCC)":"$(CC)",
492 printf("%%.o : %%.cpp\n\t$(CCC) -c $(CFLAGS) $<\n\n");
494 printf("%%.o : %%.c\n\t%s -c $(CFLAGS) $<\n\n",
495 gen_CPP
?"$(CCC)":"$(CC)");
497 /* how to compile parser files */
499 for (i
=0; i
<num_files
; i
++)
501 pfiles(&files
[i
], 1, "o");
503 printf(" : $(TOKENS)");
506 if ( gen_CPP
) printf(" : $(TOKENS) $(SCAN).h");
507 else printf(" : $(MOD_FILE) $(TOKENS)");
510 if ( gen_CPP
) pfiles(&files
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
511 else pfiles(&files
[i
], 1, "c");
512 if ( gen_CPP
&& strcmp(hdr
,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
514 printf(" %s -c $(CFLAGS) %s ",
515 gen_CPP
?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG
);
516 pfiles(&files
[i
], 1, "o");
518 if ( gen_CPP
) pfiles(&files
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
519 else pfiles(&files
[i
], 1, "c");
523 /* how to compile err.c */
525 printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX
);
526 if ( !user_lexer
) printf(" $(TOKENS)");
528 printf(" %s -c $(CFLAGS) %s $(ERR)%s $(ERR).c",
529 gen_CPP
?"$(CCC)":"$(CC)",
535 /* how to compile Class.c */
536 for (i
=0; i
<num_classes
; i
++)
538 pclasses(&classes
[i
], 1, "o");
540 printf(" : $(TOKENS)");
543 printf(" : $(TOKENS) $(SCAN).h");
546 pclasses(&classes
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
548 pclasses(&classes
[i
], 1, "h");
549 if ( gen_CPP
&& strcmp(hdr
,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
551 printf(" %s -c $(CFLAGS) %s ",
552 gen_CPP
?"$(CCC)":"$(CC)",
554 pclasses(&classes
[i
], 1, "o");
556 pclasses(&classes
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
560 /* how to compile scan.c */
562 if ( gen_CPP
) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX
, CPP_FILE_SUFFIX
);
563 else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX
, DIR());
564 if ( !user_lexer
) printf(" $(TOKENS)");
566 if ( gen_CPP
) printf(" $(CCC) -c $(CFLAGS) %s $(SCAN)%s $(SCAN)%s",
570 else printf(" $(CC) -c $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",
578 printf("$(ANTLR_SPAWN) : $(GRM)\n");
579 printf(" $(ANTLR) $(AFLAGS) $(GRM)\n");
584 printf("$(DLG_SPAWN) : $(DLG_FILE)\n");
585 if ( gen_CPP
) printf(" $(DLG) $(DFLAGS) $(DLG_FILE)\n");
586 else printf(" $(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");
589 /* do the makes for ANTLR/DLG support */
592 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), APARSER_O
, DirectorySymbol
, APARSER_C
);
593 printf(" %s -c $(CFLAGS) %s ",
594 gen_CPP
?"$(CCC)":"$(CC)",
596 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), APARSER_O
, DirectorySymbol
, APARSER_C
);
598 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O
, DirectorySymbol
, ATOKENBUFFER_C
);
599 printf(" %s -c $(CFLAGS) %s ",
600 gen_CPP
?"$(CCC)":"$(CC)",
602 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O
, DirectorySymbol
, ATOKENBUFFER_C
);
605 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O
, DirectorySymbol
, DLEXERBASE_C
);
606 printf(" %s -c $(CFLAGS) %s ",
607 gen_CPP
?"$(CCC)":"$(CC)",
609 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O
, DirectorySymbol
, DLEXERBASE_C
);
613 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O
, DirectorySymbol
, ASTBASE_C
);
614 printf(" %s -c $(CFLAGS) %s ",
615 gen_CPP
?"$(CCC)":"$(CC)",
617 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O
, DirectorySymbol
, ASTBASE_C
);
619 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O
, DirectorySymbol
, PCCTSAST_C
);
620 printf(" %s -c $(CFLAGS) %s ",
621 gen_CPP
?"$(CCC)":"$(CC)",
623 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O
, DirectorySymbol
, PCCTSAST_C
);
626 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
627 printf(" %s -c $(CFLAGS) %s ",
628 gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
629 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
634 /* clean and scrub targets */
636 printf("\nclean:\n");
637 printf(" rm -f *%s core %s", OBJ_FILE_SUFFIX
, project
);
638 if ( strcmp(outdir
, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX
);
641 printf("\nscrub:\n");
642 printf(" rm -f *%s core %s", OBJ_FILE_SUFFIX
, project
);
643 if ( strcmp(outdir
, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX
);
644 printf(" $(ANTLR_SPAWN)");
645 if ( !user_lexer
) printf(" $(DLG_SPAWN)");
649 void pfiles(files
, n
, suffix
)
658 char *p
= &(*files
)[strlen(*files
)-1];
659 if ( !first
) putchar(' ');
661 while ( p
> *files
&& *p
!= '.' ) --p
;
665 "genmk: filenames must be file.suffix format: %s\n",
669 if ( suffix
== NULL
) printf("%s", *files
);
674 if ( strcmp(suffix
, "o")==0 ) printf("%s%s", *files
, OBJ_FILE_SUFFIX
);
675 else printf("%s.%s", *files
, suffix
);
683 void pclasses(classes
, n
, suffix
)
692 if ( !first
) putchar(' ');
694 if ( suffix
== NULL
) printf("%s", *classes
);
697 if ( strcmp(suffix
, "o")==0 ) printf("%s%s", *classes
, OBJ_FILE_SUFFIX
);
698 else printf("%s.%s", *classes
, suffix
);
707 ProcessArgs( int argc
, char **argv
, Opt
*options
)
709 ProcessArgs( argc
, argv
, options
)
716 require(argv
!=NULL
, "ProcessArgs: command line NULL");
721 while ( p
->option
!= NULL
)
723 if ( strcmp(p
->option
, "*") == 0 ||
724 strcmp(p
->option
, *argv
) == 0 )
728 (*p
->process
)( *argv
, *(argv
+1) );
733 (*p
->process
)( *argv
);
745 fprintf(stderr
, "genmk: %s\n", err_
);
752 fprintf(stderr
, "genmk: %s\n", err_
);
757 static char buf
[200+1];
759 if ( strcmp(outdir
,TopDirectory
)==0 ) return "";
760 sprintf(buf
, "%s%s", outdir
, DirectorySymbol
);