Deleted Added
full compact
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 ---