]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/VfrCompile/Pccts/support/genmk/genmk.c
2 * genmk -- a program to make makefiles for PCCTS
5 * Terence John Parr 1989 - 2000
12 #include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */
16 #define DONE return 1;
19 #define DONE return 0;
23 #define require(expr, err) {if ( !(expr) ) fatal(err);}
27 #define MAX_CFILES 1600
30 #define MAX_CLASSES 50
32 char *RENAME_OBJ_FLAG
="-o",
33 *RENAME_EXE_FLAG
="-o";
35 char *dlg
= "parser.dlg";
37 char *hdr
= "stdpccts.h";
38 char *tok
= "tokens.h";
39 char *mode
= "mode.h";
42 char ATOKENBUFFER_O
[100];
47 char DLEXERBASE_O
[100];
50 static char *project
="t", *files
[MAX_FILES
], *classes
[MAX_CLASSES
];
51 static char *cfiles
[MAX_CFILES
];
52 static char *sfiles
[MAX_SORS
][MAX_SFILES
],*sclasses
[MAX_SORS
];
53 static int num_sfiles
[MAX_SORS
]; /*sorcerer files in group */
54 static int num_sors
= 0; /*sorcerer groups */
55 static int num_files
= 0; /* grammar files */
56 static int num_cfiles
= 0; /* additional C/C++ files */
57 static int num_classes
= 0; /* ANTLR classes */
58 static int user_lexer
= 0;
59 static char *user_token_types
= NULL
;
60 static int gen_CPP
= 0;
61 static char *outdir
=".";
62 static char *dlg_class
= "DLGLexer";
63 static int gen_trees
= 0;
64 static int gen_hoist
= 0;
65 static int nondef_comp
= 0; /* 1=compiler is non default */
66 static char *compilerCCC
="CC";
67 static char *compilerCC
="cc";
68 static char *pccts_path
="/usr/local/pccts";
72 void mk(char *project
, char **files
, int n
, int argc
, char **argv
);
73 void pfiles(char **files
, int n
, char *suffix
);
74 void fatal(char *msg
);
96 static void ProcessArgs(int, char **, Opt
*);
98 static void ProcessArgs();
103 pProj(char *s
, char *t
)
137 pUT( char *s
, char *t
)
144 user_token_types
= t
;
177 require(num_sors
<MAX_SORS
, "exceeded max # of sorcerer groups");
179 pTrees(NULL
); /* silently turn on tree generation */
184 pSFiles( char *s
, char *t
)
194 warn("sorcerer input file before any '-sor' option");
197 require(num_sfiles
[num_sors
-1]<MAX_SFILES
,
198 "exceeded max # of sorcerer input files");
199 sfiles
[num_sors
-1][num_sfiles
[num_sors
-1]++] = t
;
204 pCFiles( char *s
, char *t
)
211 require(num_cfiles
<MAX_CFILES
, "exceeded max # of C/C++ input files");
212 cfiles
[num_cfiles
++] = t
;
217 isKnownSuffix( char *s
)
223 if(s
==NULL
) return 0;
224 if (strcasecmp(s
,".c")==0) return 1;
225 if (strcasecmp(s
,".cc")==0) return 1;
226 if (strcasecmp(s
,".cpp")==0) return 1;
227 if (strcasecmp(s
,".cxx")==0) return 1;
228 if (strcasecmp(s
,CPP_FILE_SUFFIX
)==0) return 1;
229 if (strcasecmp(s
,".sor")==0) return 2;
243 fprintf(stderr
, "invalid option: '%s'; ignored...",s
);
246 switch(isKnownSuffix(strrchr(s
,'.')))
249 pCFiles("-cfiles",s
);
251 case 2: /* sorcerer */
254 default: /* grammar (ANTLR) */
257 require(num_files
<MAX_FILES
, "exceeded max # of input files");
258 files
[num_files
++] = s
;
263 pClass( char *s
, char *t
)
272 require(num_classes
<MAX_CLASSES
, "exceeded max # of grammar classes");
273 classes
[num_classes
++] = t
;
276 sclasses
[num_sors
-1] = t
; /* one class per sorcerer group (last valid) */
282 pDLGClass( char *s
, char *t
)
290 fprintf(stderr
, "-dlg-class makes no sense without C++ mode; ignored...");
297 pOdir( char *s
, char *t
)
309 pHdr( char *s
, char *t
)
321 pCompiler( char *s
, char *t
)
335 ppccts_path( char *s
, char *t
)
346 { "-CC", 0, pCPP
, "Generate C++ output"},
347 { "-class", 1, pClass
, "Name of a grammar class defined in grammar (if C++)"},
348 { "-dlg-class", 1,pDLGClass
,"Name of DLG lexer class (default=DLGLexer) (if C++)"},
349 { "-header", 1,pHdr
, "Name of ANTLR standard header info (default=no file)"},
350 { "-o", 1, pOdir
, "Directory where output files should go (default=\".\")"},
351 { "-project", 1, pProj
, "Name of executable to create (default=t)"},
352 { "-token-types", 1, pUT
, "Token types are in this file (don't use tokens.h)"},
353 { "-trees", 0, pTrees
, "Generate ASTs"},
354 { "-user-lexer", 0, pUL
, "Do not create a DLG-based scanner"},
355 { "-mrhoist",0,pHoist
, "Maintenance release style hoisting"},
356 { "-cfiles",1,pCFiles
, "Additional files in C or C++ to compile"},
357 { "-sor",0,pSor
, "Start of sorcerer group"},
358 { "-pccts_path",1,ppccts_path
,
359 "Path for $PCCTS directory (default is /usr/local/pccts)"},
360 { "-compiler",1,pCompiler
,
361 "Default compiler (default is CC/cc)"},
362 { "*", 0,pFile
, "" }, /* anything else is a file */
363 { NULL
, 0, NULL
, NULL
}
367 extern char *DIR(void);
373 int main(int argc
, char **argv
)
382 if ( argc
== 1 ) { help(); DIE
; }
383 for(i
=0;i
<MAX_SORS
;i
++) num_sfiles
[i
]=0;
385 ProcessArgs(argc
-1, &(argv
[1]), options
);
387 strcpy(ATOKENBUFFER_O
, ATOKENBUFFER_C
);
388 ATOKENBUFFER_O
[strlen(ATOKENBUFFER_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
389 strcat(ATOKENBUFFER_O
, OBJ_FILE_SUFFIX
);
390 strcpy(APARSER_O
, APARSER_C
);
391 APARSER_O
[strlen(APARSER_O
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
392 strcat(APARSER_O
, OBJ_FILE_SUFFIX
);
394 strcpy(ASTBASE_O
, ASTBASE_C
);
395 ASTBASE_O
[strlen(ASTBASE_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
396 strcat(ASTBASE_O
, OBJ_FILE_SUFFIX
);
398 strcpy(PCCTSAST_O
, PCCTSAST_C
);
399 PCCTSAST_O
[strlen(PCCTSAST_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
400 strcat(PCCTSAST_O
, OBJ_FILE_SUFFIX
);
402 strcpy(LIST_O
, LIST_C
);
403 LIST_O
[strlen(LIST_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
404 strcat(LIST_O
, OBJ_FILE_SUFFIX
);
406 strcpy(DLEXERBASE_O
, DLEXERBASE_C
);
407 DLEXERBASE_O
[strlen(DLEXERBASE_C
)-strlen(CPP_FILE_SUFFIX
)] = '\0';
408 strcat(DLEXERBASE_O
, OBJ_FILE_SUFFIX
);
410 if ( num_files
== 0 ) fatal("no grammar files specified; exiting...");
411 if ( !gen_CPP
&& num_classes
>0 ) {
412 warn("can't define classes w/o C++ mode; turning on C++ mode...\n");
415 if (!gen_CPP
&& num_sors
) {
416 warn("can't define sorcerer group in C mode (yet); turning on C++ mode...\n");
419 if ( gen_CPP
&& num_classes
==0 ) {
420 fatal("must define classes >0 grammar classes in C++ mode\n");
423 mk(project
, files
, num_files
, argc
, argv
);
434 static char buf
[1000+1];
436 fprintf(stderr
, "genmk [options] f1.g ... fn.g\n");
437 while ( p
->option
!=NULL
&& *(p
->option
) != '*' )
440 if ( p
->arg
) sprintf(buf
, "%s ___", p
->option
);
441 else strcpy(buf
, p
->option
);
442 fprintf(stderr
, "\t%-16s %s\n", buf
, p
->descr
);
448 void mk(char *project
, char **files
, int n
, int argc
, char **argv
)
450 void mk(project
, files
, n
, argc
, argv
)
461 printf("# PCCTS makefile for: ");
462 pfiles(files
, n
, NULL
);
465 printf("# Created from:");
466 for (i
=0; i
<argc
; i
++) printf(" %s", argv
[i
]);
469 printf("# PCCTS release 1.33MR23\n");
470 printf("# Project: %s\n", project
);
471 if ( gen_CPP
) printf("# C++ output\n");
472 else printf("# C output\n");
473 if ( user_lexer
) printf("# User-defined scanner\n");
474 else printf("# DLG scanner\n");
475 if ( user_token_types
!=NULL
) printf("# User-defined token types in '%s'\n", user_token_types
);
476 else printf("# ANTLR-defined token types\n");
479 printf(".SUFFIXES:\n.SUFFIXES:\t.o .cpp .c .h .g .i .dlg .sor\n");
481 if ( user_token_types
!=NULL
) {
482 printf("# Make sure #tokdefs directive in ANTLR grammar lists this file:\n");
483 printf("TOKENS = %s", user_token_types
);
485 else printf("TOKENS = %stokens.h", DIR());
488 printf("# The following filenames must be consistent with ANTLR/DLG flags\n");
489 printf("DLG_FILE = %s%s\n", DIR(), dlg
);
490 printf("ERR = %serr\n", DIR());
491 if ( strcmp(hdr
,"stdpccts.h")!=0 ) printf("HDR_FILE = %s%s\n", DIR(), hdr
);
492 else printf("HDR_FILE =\n");
493 if ( !gen_CPP
) printf("MOD_FILE = %s%s\n", DIR(), mode
);
494 if ( !gen_CPP
) printf("SCAN = %s\n", scan
);
495 else printf("SCAN = %s%s\n", DIR(), dlg_class
);
497 printf("PCCTS = %s\n",pccts_path
);
498 printf("ANTLR_H = $(PCCTS)%sh\n", DirectorySymbol
);
500 printf("SOR_H = $(PCCTS)%ssorcerer%sh\n", DirectorySymbol
, DirectorySymbol
);
501 printf("SOR_LIB = $(PCCTS)%ssorcerer%slib\n",
502 DirectorySymbol
, DirectorySymbol
);
504 printf("BIN = $(PCCTS)%sbin\n", DirectorySymbol
);
505 printf("ANTLR = $(BIN)%santlr\n", DirectorySymbol
);
506 printf("DLG = $(BIN)%sdlg\n", DirectorySymbol
);
507 if (num_sors
>0) printf("SOR = $(BIN)%ssor\n", DirectorySymbol
);
508 printf("CFLAGS = -I. -I$(ANTLR_H)");
509 if (num_sors
>0) printf(" -I$(SOR_H)");
510 if ( strcmp(outdir
, ".")!=0 ) printf(" -I%s", outdir
);
511 printf(" $(COTHER)");
514 if ( strcmp(outdir
,".")!=0 ) printf(" -o %s", outdir
);
515 if ( user_lexer
) printf(" -gx");
516 if ( gen_CPP
) printf(" -CC");
517 if ( strcmp(hdr
,"stdpccts.h")!=0 ) printf(" -gh %s", hdr
);
518 if ( gen_trees
) printf(" -gt");
520 printf(" -mrhoist on") ;
522 printf(" -mrhoist off");
524 printf(" $(AOTHER)");
526 printf("DFLAGS = -C2 -i");
527 if ( gen_CPP
) printf(" -CC");
528 if ( strcmp(dlg_class
,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class
);
529 if ( strcmp(outdir
,".")!=0 ) printf(" -o %s", outdir
);
530 printf(" $(DOTHER)");
534 printf("SFLAGS = -CPP");
535 if ( strcmp(outdir
,".")!=0 ) printf(" -out-dir %s", outdir
);
536 printf(" $(SOTHER)\n");
539 pfiles(files
, n
, NULL
);
542 if ( gen_CPP
) pfiles(files
, n
, CPP_FILE_SUFFIX_NO_DOT
);
543 else pfiles(files
, n
, "c");
546 pclasses(classes
, num_classes
, CPP_FILE_SUFFIX_NO_DOT
);
548 printf("$(ANTLR_H)%s%s", DirectorySymbol
, APARSER_C
);
549 if ( !user_lexer
) printf(" $(ANTLR_H)%s%s", DirectorySymbol
, DLEXERBASE_C
);
552 printf("$(ANTLR_H)%s%s", DirectorySymbol
, ASTBASE_C
);
553 printf(" $(ANTLR_H)%s%s", DirectorySymbol
, PCCTSAST_C
);
554 /* printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */
557 printf(" $(ANTLR_H)%s%s", DirectorySymbol
, ATOKENBUFFER_C
);
560 if ( gen_CPP
) printf(" $(SCAN)%s", CPP_FILE_SUFFIX
);
561 else printf(" %s$(SCAN).c", DIR());
563 if ( !gen_CPP
) printf(" $(ERR).c");
564 for (i
=0;i
<num_sors
;i
++)
567 pclasses(&sclasses
[i
],1,CPP_FILE_SUFFIX_NO_DOT
);
569 pfiles(&sfiles
[i
][0],num_sfiles
[i
],CPP_FILE_SUFFIX_NO_DOT
);
572 printf(" \\\n\t$(SOR_LIB)%sSTreeParser.cpp", DirectorySymbol
);
576 pfiles(cfiles
,num_cfiles
,NULL
);
580 pfiles(files
, n
, "o");
583 pclasses(classes
, num_classes
, "o");
585 printf("%s%s", DIR(), APARSER_O
);
587 printf(" %s%s", DIR(), DLEXERBASE_O
);
591 printf("%s%s", DIR(), ASTBASE_O
);
592 printf(" %s%s", DIR(), PCCTSAST_O
);
593 /* printf(" %s%s", DIR(), LIST_O); */
596 printf(" %s%s", DIR(), ATOKENBUFFER_O
);
599 if ( gen_CPP
) printf(" $(SCAN)%s", OBJ_FILE_SUFFIX
);
600 else printf(" %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX
);
602 if ( !gen_CPP
) printf(" $(ERR)%s", OBJ_FILE_SUFFIX
);
603 for (i
=0;i
<num_sors
;i
++)
606 pclasses(&sclasses
[i
],1,"o");
608 pfiles(&sfiles
[i
][0],num_sfiles
[i
],"o");
610 if(num_sors
>0) printf(" \\\n\tSTreeParser.o");
614 pfiles(cfiles
,num_cfiles
,"o");
618 printf("ANTLR_SPAWN = ");
619 if ( gen_CPP
) pfiles(files
, n
, CPP_FILE_SUFFIX_NO_DOT
);
620 else pfiles(files
, n
, "c");
623 pclasses(classes
, num_classes
, CPP_FILE_SUFFIX_NO_DOT
);
625 pclasses(classes
, num_classes
, "h");
626 if ( strcmp(hdr
,"stdpccts.h")!=0 ) {
628 printf("$(HDR_FILE) stdpccts.h");
632 if ( !user_token_types
) printf(" $(TOKENS)");
635 printf(" $(DLG_FILE)");
636 if ( !user_token_types
) printf(" $(TOKENS)");
638 if ( !gen_CPP
) printf(" $(ERR).c");
642 if ( gen_CPP
) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX
);
643 else printf("DLG_SPAWN = %s$(SCAN).c", DIR());
644 if ( gen_CPP
) printf(" $(SCAN).h");
645 if ( !gen_CPP
) printf(" $(MOD_FILE)");
651 printf("ifdef CXX\nCCC = $(CXX)\nendif\n\nifndef CCC\n");
652 printf("CCC = %s\n",compilerCCC
);
653 if ( !nondef_comp
) printf("endif\n\n");
657 if ( !nondef_comp
) printf("ifndef CC\n");
658 printf("CC = %s\n",compilerCC
);
659 if ( !nondef_comp
) printf("endif\n\n");
662 /* set up dependencies */
663 printf("\n%s : $(SRC) $(OBJ)\n", project
);
664 printf("\t%s %s %s $(CFLAGS) $(OBJ)\n",
665 gen_CPP
?"$(CCC)":"$(CC)",
673 printf("%%.o : %%.cpp\n\t$(CCC) -c $(CFLAGS) $<\n\n");
675 printf("%%.o : %%.c\n\t%s -c $(CFLAGS) $<\n\n",
676 gen_CPP?"$(CCC)":"$(CC)");
678 /* how to compile parser files */
680 for (i
=0; i
<num_files
; i
++)
682 pfiles(&files
[i
], 1, "o");
684 printf(" : $(TOKENS)");
687 if ( gen_CPP
) printf(" : $(TOKENS) $(SCAN).h");
688 else printf(" : $(MOD_FILE) $(TOKENS)");
691 if ( gen_CPP
) pfiles(&files
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
692 else pfiles(&files
[i
], 1, "c");
693 if ( gen_CPP
&& strcmp(hdr
,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
695 printf("\t%s -c $(CFLAGS) %s ",
696 gen_CPP
?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG
);
697 pfiles(&files
[i
], 1, "o");
699 if ( gen_CPP
) pfiles(&files
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
700 else pfiles(&files
[i
], 1, "c");
704 for (i
=0; i
<num_cfiles
; i
++)
706 pfiles(&cfiles
[i
], 1, "o");
708 pfiles(&cfiles
[i
], 1, NULL
);
709 if ( gen_CPP
&& strcmp(hdr
,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
710 /*** printf(" "); ***/
711 /*** pfiles(&cfiles[i], 1, "h"); ***/
713 printf("\t%s -c $(CFLAGS) %s ",
714 gen_CPP
?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG
);
715 pfiles(&cfiles
[i
], 1, "o");
717 pfiles(&cfiles
[i
], 1, NULL
);
721 * pfiles(&cfiles[i], 1, "h");
722 * printf(" :\ntouch ");
723 * pfiles(&cfiles[i], 1, "h");
728 /* how to compile err.c */
730 printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX
);
731 if ( !user_lexer
) printf(" $(TOKENS)");
733 printf("\t%s -c $(CFLAGS) %s $(ERR)%s $(ERR).c",
734 gen_CPP
?"$(CCC)":"$(CC)",
740 /* how to compile Class.c */
741 for (i
=0; i
<num_classes
; i
++)
743 pclasses(&classes
[i
], 1, "o");
745 printf(" : $(TOKENS)");
748 printf(" : $(TOKENS) $(SCAN).h");
751 pclasses(&classes
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
753 pclasses(&classes
[i
], 1, "h");
754 if ( gen_CPP
&& strcmp(hdr
,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
756 printf("\t%s -c $(CFLAGS) %s ",
757 gen_CPP
?"$(CCC)":"$(CC)",
759 pclasses(&classes
[i
], 1, "o");
761 pclasses(&classes
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
765 /* how to compile scan.c */
767 if ( gen_CPP
) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX
, CPP_FILE_SUFFIX
);
768 else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX
, DIR());
769 if ( !user_lexer
) printf(" $(TOKENS)");
771 if ( gen_CPP
) printf("\t$(CCC) -c $(CFLAGS) %s $(SCAN)%s $(SCAN)%s",
775 else printf("\t$(CC) -c $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",
782 /* how to compile sorcerer classes */
783 for (i
=0;i
<num_sors
;i
++)
785 pclasses(&sclasses
[i
], 1, "o");
787 pclasses(&sclasses
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
789 pclasses(&sclasses
[i
], 1, "h");
790 if ( gen_CPP
&& strcmp(hdr
,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
792 printf("\t%s -c $(CFLAGS) %s ",
793 gen_CPP
?"$(CCC)":"$(CC)",
795 pclasses(&sclasses
[i
], 1, "o");
797 pclasses(&sclasses
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
799 /* how to compile i-th sorcerer's files*/
800 for (j
=0; j
<num_sfiles
[i
]; j
++)
802 pfiles(&sfiles
[i
][j
], 1, "o");
804 if ( gen_CPP
) pfiles(&sfiles
[i
][j
], 1, CPP_FILE_SUFFIX_NO_DOT
);
805 else pfiles(&sfiles
[i
][j
], 1, "c");
806 if ( gen_CPP
&& strcmp(hdr
,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
808 printf("\t%s -c $(CFLAGS) %s ",
809 gen_CPP
?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG
);
810 pfiles(&sfiles
[i
][j
], 1, "o");
812 if ( gen_CPP
) pfiles(&sfiles
[i
][j
], 1, CPP_FILE_SUFFIX_NO_DOT
);
813 else pfiles(&sfiles
[i
][j
], 1, "c");
816 if ( gen_CPP
) pfiles(&sfiles
[i
][0], num_sfiles
[i
], CPP_FILE_SUFFIX_NO_DOT
);
817 else pfiles(&sfiles
[i
][0], num_sfiles
[i
], "c");
821 pclasses(&sclasses
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
823 pclasses(&sclasses
[i
], 1, "h");
824 if ( strcmp(hdr
,"stdpccts.h")!=0 )
827 printf("$(HDR_FILE) stdpccts.h");
831 pfiles(&sfiles
[i
][0],num_sfiles
[i
],NULL
);
832 printf("\n\t$(SOR) $(SFLAGS) ");
833 pfiles(&sfiles
[i
][0],num_sfiles
[i
],NULL
);
838 printf("STreeParser%s : $(SOR_LIB)%sSTreeParser.cpp\n",
839 OBJ_FILE_SUFFIX
,DirectorySymbol
);
840 printf("\t%s -c $(CFLAGS) %s ",
841 gen_CPP
?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG
);
842 printf("STreeParser%s ",OBJ_FILE_SUFFIX
);
843 printf("$(SOR_LIB)%sSTreeParser.cpp\n\n",DirectorySymbol
);
846 printf("$(ANTLR_SPAWN) : $(GRM)\n");
847 printf("\t$(ANTLR) $(AFLAGS) $(GRM)\n");
852 printf("$(DLG_SPAWN) : $(DLG_FILE)\n");
853 if ( gen_CPP
) printf("\t$(DLG) $(DFLAGS) $(DLG_FILE)\n");
854 else printf("\t$(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");
857 /* do the makes for ANTLR/DLG support */
860 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), APARSER_O
, DirectorySymbol
, APARSER_C
);
861 printf("\t%s -c $(CFLAGS) %s ",
862 gen_CPP
?"$(CCC)":"$(CC)",
864 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), APARSER_O
, DirectorySymbol
, APARSER_C
);
866 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O
, DirectorySymbol
, ATOKENBUFFER_C
);
867 printf("\t%s -c $(CFLAGS) %s ",
868 gen_CPP
?"$(CCC)":"$(CC)",
870 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O
, DirectorySymbol
, ATOKENBUFFER_C
);
873 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O
, DirectorySymbol
, DLEXERBASE_C
);
874 printf("\t%s -c $(CFLAGS) %s ",
875 gen_CPP
?"$(CCC)":"$(CC)",
877 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O
, DirectorySymbol
, DLEXERBASE_C
);
881 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O
, DirectorySymbol
, ASTBASE_C
);
882 printf("\t%s -c $(CFLAGS) %s ",
883 gen_CPP
?"$(CCC)":"$(CC)",
885 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O
, DirectorySymbol
, ASTBASE_C
);
887 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O
, DirectorySymbol
, PCCTSAST_C
);
888 printf("\t%s -c $(CFLAGS) %s ",
889 gen_CPP
?"$(CCC)":"$(CC)",
891 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O
, DirectorySymbol
, PCCTSAST_C
);
894 printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
895 printf("\t%s -c $(CFLAGS) %s ",
896 gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
897 printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
902 /* clean and scrub targets */
904 printf("\nclean:\n");
905 printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX
, project
);
906 if ( strcmp(outdir
, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX
);
909 printf("\nscrub: clean\n");
910 /* printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project); */
911 /* if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX); */
912 printf("\trm -f $(ANTLR_SPAWN)");
913 if ( !user_lexer
) printf(" $(DLG_SPAWN)");
914 for (i
=0;i
<num_sors
;i
++)
917 if ( gen_CPP
) pfiles(&sfiles
[i
][0], num_sfiles
[i
], CPP_FILE_SUFFIX_NO_DOT
);
918 else pfiles(&sfiles
[i
][0], num_sfiles
[i
], "c");
922 pclasses(&sclasses
[i
], 1, CPP_FILE_SUFFIX_NO_DOT
);
924 pclasses(&sclasses
[i
], 1, "h");
931 void pfiles(char **files
, int n
, char *suffix
)
933 void pfiles(files
, n
, suffix
)
943 char *p
= &(*files
)[strlen(*files
)-1];
944 if ( !first
) putchar(' ');
946 while ( p
> *files
&& *p
!= '.' ) --p
;
950 "genmk: filenames must be file.suffix format: %s\n",
954 if ( suffix
== NULL
) printf("%s", *files
);
959 if ( strcmp(suffix
, "o")==0 ) printf("%s%s", *files
, OBJ_FILE_SUFFIX
);
960 else printf("%s.%s", *files
, suffix
);
969 pclasses(char **classes
, int n
, char *suffix
)
971 pclasses(classes
, n
, suffix
)
981 if ( !first
) putchar(' ');
983 if ( suffix
== NULL
) printf("%s", *classes
);
986 if ( strcmp(suffix
, "o")==0 ) printf("%s%s", *classes
, OBJ_FILE_SUFFIX
);
987 else printf("%s.%s", *classes
, suffix
);
996 ProcessArgs( int argc
, char **argv
, Opt
*options
)
998 ProcessArgs( argc
, argv
, options
)
1005 require(argv
!=NULL
, "ProcessArgs: command line NULL");
1007 while ( argc
-- > 0 )
1010 while ( p
->option
!= NULL
)
1012 if ( strcmp(p
->option
, "*") == 0 ||
1013 strcmp(p
->option
, *argv
) == 0 )
1017 (*p
->process
)( *argv
, *(argv
+1) );
1022 (*p
->process
)( *argv
);
1032 void fatal( char *err_
)
1038 fprintf(stderr
, "genmk: %s\n", err_
);
1043 void warn( char *err_
)
1049 fprintf(stderr
, "genmk: %s\n", err_
);
1058 static char buf
[200+1];
1060 if ( strcmp(outdir
,TopDirectory
)==0 ) return "";
1061 sprintf(buf
, "%s%s", outdir
, DirectorySymbol
);