crunchgen.c (6696) | crunchgen.c (8857) |
---|---|
1/* 2 * Copyright (c) 1994 University of Maryland 3 * All Rights Reserved. 4 * 5 * Permission to use, copy, modify, distribute, and sell this software and its 6 * documentation for any purpose is hereby granted without fee, provided that 7 * the above copyright notice appear in all copies and that both that 8 * copyright notice and this permission notice appear in supporting --- 14 unchanged lines hidden (view full) --- 23 * Computer Science Department 24 * University of Maryland at College Park 25 */ 26/* 27 * ======================================================================== 28 * crunchgen.c 29 * 30 * Generates a Makefile and main C file for a crunched executable, | 1/* 2 * Copyright (c) 1994 University of Maryland 3 * All Rights Reserved. 4 * 5 * Permission to use, copy, modify, distribute, and sell this software and its 6 * documentation for any purpose is hereby granted without fee, provided that 7 * the above copyright notice appear in all copies and that both that 8 * copyright notice and this permission notice appear in supporting --- 14 unchanged lines hidden (view full) --- 23 * Computer Science Department 24 * University of Maryland at College Park 25 */ 26/* 27 * ======================================================================== 28 * crunchgen.c 29 * 30 * Generates a Makefile and main C file for a crunched executable, |
31 * from specs given in a .conf file. | 31 * from specs given in a .conf file. |
32 */ 33#include <stdlib.h> 34#include <unistd.h> 35#include <stdio.h> 36#include <ctype.h> 37#include <string.h> 38 39#include <sys/types.h> --- 53 unchanged lines hidden (view full) --- 93void status(char *str); 94void out_of_memory(void); 95void add_string(strlst_t **listp, char *str); 96int is_dir(char *pathname); 97int is_nonempty_file(char *pathname); 98 99/* helper routines for main() */ 100 | 32 */ 33#include <stdlib.h> 34#include <unistd.h> 35#include <stdio.h> 36#include <ctype.h> 37#include <string.h> 38 39#include <sys/types.h> --- 53 unchanged lines hidden (view full) --- 93void status(char *str); 94void out_of_memory(void); 95void add_string(strlst_t **listp, char *str); 96int is_dir(char *pathname); 97int is_nonempty_file(char *pathname); 98 99/* helper routines for main() */ 100 |
101void usage(void); | 101void usage(void); |
102void parse_conf_file(void); 103void gen_outputs(void); 104 105 106int main(int argc, char **argv) 107{ 108 char *p; 109 int optc; 110 extern int optind; 111 extern char *optarg; 112 113 verbose = 1; 114 readcache = 1; 115 *outmkname = *outcfname = *execfname = '\0'; | 102void parse_conf_file(void); 103void gen_outputs(void); 104 105 106int main(int argc, char **argv) 107{ 108 char *p; 109 int optc; 110 extern int optind; 111 extern char *optarg; 112 113 verbose = 1; 114 readcache = 1; 115 *outmkname = *outcfname = *execfname = '\0'; |
116 | 116 |
117 if(argc > 0) pname = argv[0]; 118 119 while((optc = getopt(argc, argv, "lm:c:e:fq")) != -1) { 120 switch(optc) { 121 case 'f': readcache = 0; break; 122 case 'q': verbose = 0; break; 123 124 case 'm': strcpy(outmkname, optarg); break; --- 6 unchanged lines hidden (view full) --- 131 } 132 } 133 134 argc -= optind; 135 argv += optind; 136 137 if(argc != 1) usage(); 138 | 117 if(argc > 0) pname = argv[0]; 118 119 while((optc = getopt(argc, argv, "lm:c:e:fq")) != -1) { 120 switch(optc) { 121 case 'f': readcache = 0; break; 122 case 'q': verbose = 0; break; 123 124 case 'm': strcpy(outmkname, optarg); break; --- 6 unchanged lines hidden (view full) --- 131 } 132 } 133 134 argc -= optind; 135 argv += optind; 136 137 if(argc != 1) usage(); 138 |
139 /* | 139 /* |
140 * generate filenames 141 */ 142 143 strcpy(infilename, argv[0]); 144 145 /* confname = `basename infilename .conf` */ 146 147 if((p=strrchr(infilename, '/')) != NULL) strcpy(confname, p+1); --- 18 unchanged lines hidden (view full) --- 166 gen_outputs(); 167 168 exit(goterror); 169} 170 171 172void usage(void) 173{ | 140 * generate filenames 141 */ 142 143 strcpy(infilename, argv[0]); 144 145 /* confname = `basename infilename .conf` */ 146 147 if((p=strrchr(infilename, '/')) != NULL) strcpy(confname, p+1); --- 18 unchanged lines hidden (view full) --- 166 gen_outputs(); 167 168 exit(goterror); 169} 170 171 172void usage(void) 173{ |
174 fprintf(stderr, | 174 fprintf(stderr, |
175 "%s [-fq] [-m <makefile>] [-c <c file>] [-e <exec file>] <conffile>\n", 176 pname); 177 exit(1); 178} 179 180 181/* 182 * ======================================================================== 183 * parse_conf_file subsystem 184 * 185 */ 186 187/* helper routines for parse_conf_file */ 188 189void parse_one_file(char *filename); | 175 "%s [-fq] [-m <makefile>] [-c <c file>] [-e <exec file>] <conffile>\n", 176 pname); 177 exit(1); 178} 179 180 181/* 182 * ======================================================================== 183 * parse_conf_file subsystem 184 * 185 */ 186 187/* helper routines for parse_conf_file */ 188 189void parse_one_file(char *filename); |
190void parse_line(char *line, int *fc, char **fv, int nf); | 190void parse_line(char *line, int *fc, char **fv, int nf); |
191void add_srcdirs(int argc, char **argv); 192void add_progs(int argc, char **argv); 193void add_link(int argc, char **argv); 194void add_libs(int argc, char **argv); 195void add_special(int argc, char **argv); 196 197prog_t *find_prog(char *str); 198void add_prog(char *progname); --- 43 unchanged lines hidden (view full) --- 242 else if(!strcmp(fieldv[0], "special")) f = add_special; 243 else { 244 fprintf(stderr, "%s:%d: skipping unknown command `%s'.\n", 245 curfilename, linenum, fieldv[0]); 246 goterror = 1; 247 continue; 248 } 249 if(fieldc < 2) { | 191void add_srcdirs(int argc, char **argv); 192void add_progs(int argc, char **argv); 193void add_link(int argc, char **argv); 194void add_libs(int argc, char **argv); 195void add_special(int argc, char **argv); 196 197prog_t *find_prog(char *str); 198void add_prog(char *progname); --- 43 unchanged lines hidden (view full) --- 242 else if(!strcmp(fieldv[0], "special")) f = add_special; 243 else { 244 fprintf(stderr, "%s:%d: skipping unknown command `%s'.\n", 245 curfilename, linenum, fieldv[0]); 246 goterror = 1; 247 continue; 248 } 249 if(fieldc < 2) { |
250 fprintf(stderr, | 250 fprintf(stderr, |
251 "%s:%d: %s command needs at least 1 argument, skipping.\n", 252 curfilename, linenum, fieldv[0]); 253 goterror = 1; 254 continue; 255 } 256 f(fieldc, fieldv); 257 } 258 --- 27 unchanged lines hidden (view full) --- 286void add_srcdirs(int argc, char **argv) 287{ 288 int i; 289 290 for(i=1;i<argc;i++) { 291 if(is_dir(argv[i])) 292 add_string(&srcdirs, argv[i]); 293 else { | 251 "%s:%d: %s command needs at least 1 argument, skipping.\n", 252 curfilename, linenum, fieldv[0]); 253 goterror = 1; 254 continue; 255 } 256 f(fieldc, fieldv); 257 } 258 --- 27 unchanged lines hidden (view full) --- 286void add_srcdirs(int argc, char **argv) 287{ 288 int i; 289 290 for(i=1;i<argc;i++) { 291 if(is_dir(argv[i])) 292 add_string(&srcdirs, argv[i]); 293 else { |
294 fprintf(stderr, "%s:%d: `%s' is not a directory, skipping it.\n", | 294 fprintf(stderr, "%s:%d: `%s' is not a directory, skipping it.\n", |
295 curfilename, linenum, argv[i]); 296 goterror = 1; 297 } 298 } 299} 300 301 302void add_progs(int argc, char **argv) --- 11 unchanged lines hidden (view full) --- 314 315 /* add to end, but be smart about dups */ 316 317 for(p1 = NULL, p2 = progs; p2 != NULL; p1 = p2, p2 = p2->next) 318 if(!strcmp(p2->name, progname)) return; 319 320 p2 = malloc(sizeof(prog_t)); 321 if(p2) p2->name = strdup(progname); | 295 curfilename, linenum, argv[i]); 296 goterror = 1; 297 } 298 } 299} 300 301 302void add_progs(int argc, char **argv) --- 11 unchanged lines hidden (view full) --- 314 315 /* add to end, but be smart about dups */ 316 317 for(p1 = NULL, p2 = progs; p2 != NULL; p1 = p2, p2 = p2->next) 318 if(!strcmp(p2->name, progname)) return; 319 320 p2 = malloc(sizeof(prog_t)); 321 if(p2) p2->name = strdup(progname); |
322 if(!p2 || !p2->name) | 322 if(!p2 || !p2->name) |
323 out_of_memory(); 324 325 p2->next = NULL; 326 if(p1 == NULL) progs = p2; 327 else p1->next = p2; 328 329 p2->ident = p2->srcdir = p2->objdir = NULL; 330 p2->links = p2->objs = NULL; --- 4 unchanged lines hidden (view full) --- 335 336 337void add_link(int argc, char **argv) 338{ 339 int i; 340 prog_t *p = find_prog(argv[1]); 341 342 if(p == NULL) { | 323 out_of_memory(); 324 325 p2->next = NULL; 326 if(p1 == NULL) progs = p2; 327 else p1->next = p2; 328 329 p2->ident = p2->srcdir = p2->objdir = NULL; 330 p2->links = p2->objs = NULL; --- 4 unchanged lines hidden (view full) --- 335 336 337void add_link(int argc, char **argv) 338{ 339 int i; 340 prog_t *p = find_prog(argv[1]); 341 342 if(p == NULL) { |
343 fprintf(stderr, | 343 fprintf(stderr, |
344 "%s:%d: no prog %s previously declared, skipping link.\n", 345 curfilename, linenum, argv[1]); 346 goterror = 1; 347 return; 348 } 349 for(i=2;i<argc;i++) { 350 if (list_mode) 351 printf("%s\n",argv[i]); --- 13 unchanged lines hidden (view full) --- 365 366void add_special(int argc, char **argv) 367{ 368 int i; 369 prog_t *p = find_prog(argv[1]); 370 371 if(p == NULL) { 372 if(reading_cache) return; | 344 "%s:%d: no prog %s previously declared, skipping link.\n", 345 curfilename, linenum, argv[1]); 346 goterror = 1; 347 return; 348 } 349 for(i=2;i<argc;i++) { 350 if (list_mode) 351 printf("%s\n",argv[i]); --- 13 unchanged lines hidden (view full) --- 365 366void add_special(int argc, char **argv) 367{ 368 int i; 369 prog_t *p = find_prog(argv[1]); 370 371 if(p == NULL) { 372 if(reading_cache) return; |
373 fprintf(stderr, | 373 fprintf(stderr, |
374 "%s:%d: no prog %s previously declared, skipping special.\n", 375 curfilename, linenum, argv[1]); 376 goterror = 1; 377 return; 378 } 379 380 if(!strcmp(argv[2], "ident")) { 381 if(argc != 4) goto argcount; --- 24 unchanged lines hidden (view full) --- 406 fprintf(stderr, "%s:%d: bad parameter name `%s', skipping line.\n", 407 curfilename, linenum, argv[2]); 408 goterror = 1; 409 } 410 return; 411 412 413 argcount: | 374 "%s:%d: no prog %s previously declared, skipping special.\n", 375 curfilename, linenum, argv[1]); 376 goterror = 1; 377 return; 378 } 379 380 if(!strcmp(argv[2], "ident")) { 381 if(argc != 4) goto argcount; --- 24 unchanged lines hidden (view full) --- 406 fprintf(stderr, "%s:%d: bad parameter name `%s', skipping line.\n", 407 curfilename, linenum, argv[2]); 408 goterror = 1; 409 } 410 return; 411 412 413 argcount: |
414 fprintf(stderr, | 414 fprintf(stderr, |
415 "%s:%d: too %s arguments, expected \"special %s %s <string>\".\n", 416 curfilename, linenum, argc < 4? "few" : "many", argv[1], argv[2]); 417 goterror = 1; 418} 419 420 421prog_t *find_prog(char *str) 422{ --- 35 unchanged lines hidden (view full) --- 458 for(p = progs; p != NULL; p = p->next) 459 fillin_program(p); 460 461 remove_error_progs(); 462 gen_specials_cache(); 463 gen_output_cfile(); 464 gen_output_makefile(); 465 status(""); | 415 "%s:%d: too %s arguments, expected \"special %s %s <string>\".\n", 416 curfilename, linenum, argc < 4? "few" : "many", argv[1], argv[2]); 417 goterror = 1; 418} 419 420 421prog_t *find_prog(char *str) 422{ --- 35 unchanged lines hidden (view full) --- 458 for(p = progs; p != NULL; p = p->next) 459 fillin_program(p); 460 461 remove_error_progs(); 462 gen_specials_cache(); 463 gen_output_cfile(); 464 gen_output_makefile(); 465 status(""); |
466 fprintf(stderr, | 466 fprintf(stderr, |
467 "Run \"make -f %s objs exe\" to build crunched binary.\n", 468 outmkname); 469} 470 471 472void fillin_program(prog_t *p) 473{ 474 char path[MAXPATHLEN]; 475 char *srcparent; 476 strlst_t *s; 477 478 sprintf(line, "filling in parms for %s", p->name); 479 status(line); 480 | 467 "Run \"make -f %s objs exe\" to build crunched binary.\n", 468 outmkname); 469} 470 471 472void fillin_program(prog_t *p) 473{ 474 char path[MAXPATHLEN]; 475 char *srcparent; 476 strlst_t *s; 477 478 sprintf(line, "filling in parms for %s", p->name); 479 status(line); 480 |
481 if(!p->ident) | 481 if(!p->ident) |
482 p->ident = genident(p->name); 483 if(!p->srcdir) { 484 srcparent = dir_search(p->name); 485 if(srcparent) 486 sprintf(path, "%s/%s", srcparent, p->name); 487 if(is_dir(path)) 488 p->srcdir = strdup(path); 489 } --- 14 unchanged lines hidden (view full) --- 504 sprintf(line, "%s/%s", p->objdir, s->str); 505 add_string(&p->objpaths, line); 506 } 507 508 if(!p->srcdir && verbose) 509 fprintf(stderr, "%s: %s: warning: could not find source directory.\n", 510 infilename, p->name); 511 if(!p->objs && verbose) | 482 p->ident = genident(p->name); 483 if(!p->srcdir) { 484 srcparent = dir_search(p->name); 485 if(srcparent) 486 sprintf(path, "%s/%s", srcparent, p->name); 487 if(is_dir(path)) 488 p->srcdir = strdup(path); 489 } --- 14 unchanged lines hidden (view full) --- 504 sprintf(line, "%s/%s", p->objdir, s->str); 505 add_string(&p->objpaths, line); 506 } 507 508 if(!p->srcdir && verbose) 509 fprintf(stderr, "%s: %s: warning: could not find source directory.\n", 510 infilename, p->name); 511 if(!p->objs && verbose) |
512 fprintf(stderr, "%s: %s: warning: could not find any .o files.\n", | 512 fprintf(stderr, "%s: %s: warning: could not find any .o files.\n", |
513 infilename, p->name); 514 515 if(!p->objpaths) { | 513 infilename, p->name); 514 515 if(!p->objpaths) { |
516 fprintf(stderr, | 516 fprintf(stderr, |
517 "%s: %s: error: no objpaths specified or calculated.\n", 518 infilename, p->name); 519 p->goterror = goterror = 1; 520 } 521} 522 523void fillin_program_objs(prog_t *p, char *path) 524{ 525 char *obj, *cp; 526 int rc; 527 FILE *f; 528 529 /* discover the objs from the srcdir Makefile */ 530 531 if((f = fopen(tempfname, "w")) == NULL) { 532 perror(tempfname); 533 goterror = 1; 534 return; 535 } | 517 "%s: %s: error: no objpaths specified or calculated.\n", 518 infilename, p->name); 519 p->goterror = goterror = 1; 520 } 521} 522 523void fillin_program_objs(prog_t *p, char *path) 524{ 525 char *obj, *cp; 526 int rc; 527 FILE *f; 528 529 /* discover the objs from the srcdir Makefile */ 530 531 if((f = fopen(tempfname, "w")) == NULL) { 532 perror(tempfname); 533 goterror = 1; 534 return; 535 } |
536 | 536 |
537 fprintf(f, ".include \"%s\"\n", path); 538 fprintf(f, ".if defined(PROG) && !defined(OBJS)\n"); 539 fprintf(f, "OBJS=${PROG}.o\n"); 540 fprintf(f, ".endif\n"); 541 fprintf(f, "crunchgen_objs:\n\t@echo 'OBJS= '${OBJS}\n"); 542 fclose(f); 543 544 sprintf(line, "make -f %s crunchgen_objs 2>&1", tempfname); 545 if((f = popen(line, "r")) == NULL) { 546 perror("submake pipe"); 547 goterror = 1; 548 return; 549 } 550 551 while(fgets(line, MAXLINELEN, f)) { 552 if(strncmp(line, "OBJS= ", 6)) { 553 fprintf(stderr, "make error: %s", line); | 537 fprintf(f, ".include \"%s\"\n", path); 538 fprintf(f, ".if defined(PROG) && !defined(OBJS)\n"); 539 fprintf(f, "OBJS=${PROG}.o\n"); 540 fprintf(f, ".endif\n"); 541 fprintf(f, "crunchgen_objs:\n\t@echo 'OBJS= '${OBJS}\n"); 542 fclose(f); 543 544 sprintf(line, "make -f %s crunchgen_objs 2>&1", tempfname); 545 if((f = popen(line, "r")) == NULL) { 546 perror("submake pipe"); 547 goterror = 1; 548 return; 549 } 550 551 while(fgets(line, MAXLINELEN, f)) { 552 if(strncmp(line, "OBJS= ", 6)) { 553 fprintf(stderr, "make error: %s", line); |
554 goterror = 1; | 554 goterror = 1; |
555 continue; 556 } 557 cp = line + 6; 558 while(isspace(*cp)) cp++; 559 while(*cp) { 560 obj = cp; 561 while(*cp && !isspace(*cp)) cp++; 562 if(*cp) *cp++ = '\0'; --- 7 unchanged lines hidden (view full) --- 570 } 571 unlink(tempfname); 572} 573 574void remove_error_progs(void) 575{ 576 prog_t *p1, *p2; 577 | 555 continue; 556 } 557 cp = line + 6; 558 while(isspace(*cp)) cp++; 559 while(*cp) { 560 obj = cp; 561 while(*cp && !isspace(*cp)) cp++; 562 if(*cp) *cp++ = '\0'; --- 7 unchanged lines hidden (view full) --- 570 } 571 unlink(tempfname); 572} 573 574void remove_error_progs(void) 575{ 576 prog_t *p1, *p2; 577 |
578 p1 = NULL; p2 = progs; 579 while(p2 != NULL) { | 578 p1 = NULL; p2 = progs; 579 while(p2 != NULL) { |
580 if(!p2->goterror) 581 p1 = p2, p2 = p2->next; 582 else { 583 /* delete it from linked list */ 584 fprintf(stderr, "%s: %s: ignoring program because of errors.\n", 585 infilename, p2->name); 586 if(p1) p1->next = p2->next; 587 else progs = p2->next; --- 51 unchanged lines hidden (view full) --- 639 } 640 641 fprintf(outmk, "# %s - generated from %s by crunchgen %s\n\n", 642 outmkname, infilename, CRUNCH_VERSION); 643 644 top_makefile_rules(outmk); 645 646 for(p = progs; p != NULL; p = p->next) | 580 if(!p2->goterror) 581 p1 = p2, p2 = p2->next; 582 else { 583 /* delete it from linked list */ 584 fprintf(stderr, "%s: %s: ignoring program because of errors.\n", 585 infilename, p2->name); 586 if(p1) p1->next = p2->next; 587 else progs = p2->next; --- 51 unchanged lines hidden (view full) --- 639 } 640 641 fprintf(outmk, "# %s - generated from %s by crunchgen %s\n\n", 642 outmkname, infilename, CRUNCH_VERSION); 643 644 top_makefile_rules(outmk); 645 646 for(p = progs; p != NULL; p = p->next) |
647 prog_makefile_rules(outmk, p); | 647 prog_makefile_rules(outmk, p); |
648 649 fprintf(outmk, "\n# ========\n"); 650 fclose(outmk); 651} 652 653 654void gen_output_cfile(void) 655{ --- 7 unchanged lines hidden (view full) --- 663 status(line); 664 665 if((outcf = fopen(outcfname, "w")) == NULL) { 666 perror(outcfname); 667 goterror = 1; 668 return; 669 } 670 | 648 649 fprintf(outmk, "\n# ========\n"); 650 fclose(outmk); 651} 652 653 654void gen_output_cfile(void) 655{ --- 7 unchanged lines hidden (view full) --- 663 status(line); 664 665 if((outcf = fopen(outcfname, "w")) == NULL) { 666 perror(outcfname); 667 goterror = 1; 668 return; 669 } 670 |
671 fprintf(outcf, | 671 fprintf(outcf, |
672 "/* %s - generated from %s by crunchgen %s */\n", 673 outcfname, infilename, CRUNCH_VERSION); 674 675 fprintf(outcf, "#define EXECNAME \"%s\"\n", execfname); 676 for(cp = crunched_skel; *cp != NULL; cp++) 677 fprintf(outcf, "%s\n", *cp); 678 679 for(p = progs; p != NULL; p = p->next) 680 fprintf(outcf, "extern int _crunched_%s_stub();\n", p->ident); 681 682 fprintf(outcf, "\nstruct stub entry_points[] = {\n"); 683 for(p = progs; p != NULL; p = p->next) { 684 fprintf(outcf, "\t{ \"%s\", _crunched_%s_stub },\n", 685 p->name, p->ident); 686 for(s = p->links; s != NULL; s = s->next) 687 fprintf(outcf, "\t{ \"%s\", _crunched_%s_stub },\n", 688 s->str, p->ident); 689 } | 672 "/* %s - generated from %s by crunchgen %s */\n", 673 outcfname, infilename, CRUNCH_VERSION); 674 675 fprintf(outcf, "#define EXECNAME \"%s\"\n", execfname); 676 for(cp = crunched_skel; *cp != NULL; cp++) 677 fprintf(outcf, "%s\n", *cp); 678 679 for(p = progs; p != NULL; p = p->next) 680 fprintf(outcf, "extern int _crunched_%s_stub();\n", p->ident); 681 682 fprintf(outcf, "\nstruct stub entry_points[] = {\n"); 683 for(p = progs; p != NULL; p = p->next) { 684 fprintf(outcf, "\t{ \"%s\", _crunched_%s_stub },\n", 685 p->name, p->ident); 686 for(s = p->links; s != NULL; s = s->next) 687 fprintf(outcf, "\t{ \"%s\", _crunched_%s_stub },\n", 688 s->str, p->ident); 689 } |
690 | 690 |
691 fprintf(outcf, "\t{ EXECNAME, crunched_main },\n"); 692 fprintf(outcf, "\t{ NULL, NULL }\n};\n"); 693 fclose(outcf); 694} 695 696 697char *genident(char *str) 698{ --- 41 unchanged lines hidden (view full) --- 740 fprintf(outmk, " %s.lo", p->name); 741 fprintf(outmk, "\n"); 742 743 fprintf(outmk, "SUBMAKE_TARGETS="); 744 for(p = progs; p != NULL; p = p->next) 745 fprintf(outmk, " %s_make", p->ident); 746 fprintf(outmk, "\n\n"); 747 | 691 fprintf(outcf, "\t{ EXECNAME, crunched_main },\n"); 692 fprintf(outcf, "\t{ NULL, NULL }\n};\n"); 693 fclose(outcf); 694} 695 696 697char *genident(char *str) 698{ --- 41 unchanged lines hidden (view full) --- 740 fprintf(outmk, " %s.lo", p->name); 741 fprintf(outmk, "\n"); 742 743 fprintf(outmk, "SUBMAKE_TARGETS="); 744 for(p = progs; p != NULL; p = p->next) 745 fprintf(outmk, " %s_make", p->ident); 746 fprintf(outmk, "\n\n"); 747 |
748 fprintf(outmk, "%s: %s.o $(CRUNCHED_OBJS)\n", | 748 fprintf(outmk, "%s: %s.o $(CRUNCHED_OBJS)\n", |
749 execfname, execfname); 750 fprintf(outmk, "\t$(CC) -static -o %s %s.o $(CRUNCHED_OBJS) $(LIBS)\n", 751 execfname, execfname); 752 fprintf(outmk, "\tstrip %s\n", execfname); 753 fprintf(outmk, "all: objs exe\nobjs: $(SUBMAKE_TARGETS)\n"); 754 fprintf(outmk, "exe: %s\n", execfname); 755 fprintf(outmk, "clean:\n\trm -f %s *.lo *.o *_stub.c\n", 756 execfname); --- 4 unchanged lines hidden (view full) --- 761{ 762 fprintf(outmk, "\n# -------- %s\n\n", p->name); 763 764 if(p->srcdir && p->objs) { 765 fprintf(outmk, "%s_SRCDIR=%s\n", p->ident, p->srcdir); 766 fprintf(outmk, "%s_OBJS=", p->ident); 767 output_strlst(outmk, p->objs); 768 fprintf(outmk, "%s_make:\n", p->ident); | 749 execfname, execfname); 750 fprintf(outmk, "\t$(CC) -static -o %s %s.o $(CRUNCHED_OBJS) $(LIBS)\n", 751 execfname, execfname); 752 fprintf(outmk, "\tstrip %s\n", execfname); 753 fprintf(outmk, "all: objs exe\nobjs: $(SUBMAKE_TARGETS)\n"); 754 fprintf(outmk, "exe: %s\n", execfname); 755 fprintf(outmk, "clean:\n\trm -f %s *.lo *.o *_stub.c\n", 756 execfname); --- 4 unchanged lines hidden (view full) --- 761{ 762 fprintf(outmk, "\n# -------- %s\n\n", p->name); 763 764 if(p->srcdir && p->objs) { 765 fprintf(outmk, "%s_SRCDIR=%s\n", p->ident, p->srcdir); 766 fprintf(outmk, "%s_OBJS=", p->ident); 767 output_strlst(outmk, p->objs); 768 fprintf(outmk, "%s_make:\n", p->ident); |
769 fprintf(outmk, "\t(cd $(%s_SRCDIR); make $(%s_OBJS))\n\n", | 769 fprintf(outmk, "\t(cd $(%s_SRCDIR); make $(%s_OBJS))\n\n", |
770 p->ident, p->ident); 771 } 772 else | 770 p->ident, p->ident); 771 } 772 else |
773 fprintf(outmk, "%s_make:\n\t@echo \"** cannot make objs for %s\"\n\n", | 773 fprintf(outmk, "%s_make:\n\t@echo \"** cannot make objs for %s\"\n\n", |
774 p->ident, p->name); 775 776 fprintf(outmk, "%s_OBJPATHS=", p->ident); 777 output_strlst(outmk, p->objpaths); 778 779 fprintf(outmk, "%s_stub.c:\n", p->name); 780 fprintf(outmk, "\techo \"" 781 "int _crunched_%s_stub(int argc, char **argv, char **envp)" 782 "{return main(argc,argv,envp);}\" >%s_stub.c\n", 783 p->ident, p->name); 784 fprintf(outmk, "%s.lo: %s_stub.o $(%s_OBJPATHS)\n", 785 p->name, p->name, p->ident); | 774 p->ident, p->name); 775 776 fprintf(outmk, "%s_OBJPATHS=", p->ident); 777 output_strlst(outmk, p->objpaths); 778 779 fprintf(outmk, "%s_stub.c:\n", p->name); 780 fprintf(outmk, "\techo \"" 781 "int _crunched_%s_stub(int argc, char **argv, char **envp)" 782 "{return main(argc,argv,envp);}\" >%s_stub.c\n", 783 p->ident, p->name); 784 fprintf(outmk, "%s.lo: %s_stub.o $(%s_OBJPATHS)\n", 785 p->name, p->name, p->ident); |
786 fprintf(outmk, "\tld -dc -r -o %s.lo %s_stub.o $(%s_OBJPATHS)\n", | 786 fprintf(outmk, "\tld -dc -r -o %s.lo %s_stub.o $(%s_OBJPATHS)\n", |
787 p->name, p->name, p->ident); | 787 p->name, p->name, p->ident); |
788 fprintf(outmk, "\tcrunchide -k __crunched_%s_stub %s.lo\n", | 788 fprintf(outmk, "\tcrunchide -k __crunched_%s_stub %s.lo\n", |
789 p->ident, p->name); 790} 791 792void output_strlst(FILE *outf, strlst_t *lst) 793{ 794 for(; lst != NULL; lst = lst->next) 795 fprintf(outf, " %s", lst->str); 796 fprintf(outf, "\n"); --- 71 unchanged lines hidden --- | 789 p->ident, p->name); 790} 791 792void output_strlst(FILE *outf, strlst_t *lst) 793{ 794 for(; lst != NULL; lst = lst->next) 795 fprintf(outf, " %s", lst->str); 796 fprintf(outf, "\n"); --- 71 unchanged lines hidden --- |