xref: /xnu-11215.61.5/SETUP/config/mkmakefile.c (revision 4f1223e81cd707a65cc109d0b8ad6653699da3c4)
1*4f1223e8SApple OSS Distributions /*
2*4f1223e8SApple OSS Distributions  * Copyright (c) 1999-2016 Apple Inc. All rights reserved.
3*4f1223e8SApple OSS Distributions  *
4*4f1223e8SApple OSS Distributions  * @APPLE_LICENSE_HEADER_START@
5*4f1223e8SApple OSS Distributions  *
6*4f1223e8SApple OSS Distributions  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
7*4f1223e8SApple OSS Distributions  * Reserved.  This file contains Original Code and/or Modifications of
8*4f1223e8SApple OSS Distributions  * Original Code as defined in and that are subject to the Apple Public
9*4f1223e8SApple OSS Distributions  * Source License Version 1.0 (the 'License').  You may not use this file
10*4f1223e8SApple OSS Distributions  * except in compliance with the License.  Please obtain a copy of the
11*4f1223e8SApple OSS Distributions  * License at http://www.apple.com/publicsource and read it before using
12*4f1223e8SApple OSS Distributions  * this file.
13*4f1223e8SApple OSS Distributions  *
14*4f1223e8SApple OSS Distributions  * The Original Code and all software distributed under the License are
15*4f1223e8SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16*4f1223e8SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17*4f1223e8SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18*4f1223e8SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
19*4f1223e8SApple OSS Distributions  * License for the specific language governing rights and limitations
20*4f1223e8SApple OSS Distributions  * under the License."
21*4f1223e8SApple OSS Distributions  *
22*4f1223e8SApple OSS Distributions  * @APPLE_LICENSE_HEADER_END@
23*4f1223e8SApple OSS Distributions  */
24*4f1223e8SApple OSS Distributions /*
25*4f1223e8SApple OSS Distributions  * Mach Operating System
26*4f1223e8SApple OSS Distributions  * Copyright (c) 1990 Carnegie-Mellon University
27*4f1223e8SApple OSS Distributions  * Copyright (c) 1989 Carnegie-Mellon University
28*4f1223e8SApple OSS Distributions  * Copyright (c) 1988 Carnegie-Mellon University
29*4f1223e8SApple OSS Distributions  * Copyright (c) 1987 Carnegie-Mellon University
30*4f1223e8SApple OSS Distributions  * All rights reserved.  The CMU software License Agreement specifies
31*4f1223e8SApple OSS Distributions  * the terms and conditions for use and redistribution.
32*4f1223e8SApple OSS Distributions  */
33*4f1223e8SApple OSS Distributions 
34*4f1223e8SApple OSS Distributions /*
35*4f1223e8SApple OSS Distributions  * Copyright (c) 1980 Regents of the University of California.
36*4f1223e8SApple OSS Distributions  * All rights reserved.
37*4f1223e8SApple OSS Distributions  *
38*4f1223e8SApple OSS Distributions  * Redistribution and use in source and binary forms are permitted
39*4f1223e8SApple OSS Distributions  * provided that the above copyright notice and this paragraph are
40*4f1223e8SApple OSS Distributions  * duplicated in all such forms and that any documentation,
41*4f1223e8SApple OSS Distributions  * advertising materials, and other materials related to such
42*4f1223e8SApple OSS Distributions  * distribution and use acknowledge that the software was developed
43*4f1223e8SApple OSS Distributions  * by the University of California, Berkeley.  The name of the
44*4f1223e8SApple OSS Distributions  * University may not be used to endorse or promote products derived
45*4f1223e8SApple OSS Distributions  * from this software without specific prior written permission.
46*4f1223e8SApple OSS Distributions  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
47*4f1223e8SApple OSS Distributions  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
48*4f1223e8SApple OSS Distributions  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
49*4f1223e8SApple OSS Distributions  */
50*4f1223e8SApple OSS Distributions 
51*4f1223e8SApple OSS Distributions #ifndef lint
52*4f1223e8SApple OSS Distributions static char sccsid[] __attribute__((used)) = "@(#)mkmakefile.c	5.21 (Berkeley) 6/18/88";
53*4f1223e8SApple OSS Distributions #endif /* not lint */
54*4f1223e8SApple OSS Distributions 
55*4f1223e8SApple OSS Distributions /*
56*4f1223e8SApple OSS Distributions  * Build the makefile for the system, from
57*4f1223e8SApple OSS Distributions  * the information in the files files and the
58*4f1223e8SApple OSS Distributions  * additional files for the machine being compiled to.
59*4f1223e8SApple OSS Distributions  */
60*4f1223e8SApple OSS Distributions 
61*4f1223e8SApple OSS Distributions #include <stdio.h>
62*4f1223e8SApple OSS Distributions #include <unistd.h>     /* for unlink */
63*4f1223e8SApple OSS Distributions #include <ctype.h>
64*4f1223e8SApple OSS Distributions #include "parser.h"
65*4f1223e8SApple OSS Distributions #include "config.h"
66*4f1223e8SApple OSS Distributions 
67*4f1223e8SApple OSS Distributions void    read_files(void);
68*4f1223e8SApple OSS Distributions void    do_objs(FILE *fp, const char *msg, int ext, int flags);
69*4f1223e8SApple OSS Distributions void    do_files(FILE *fp, const char *msg, char ext);
70*4f1223e8SApple OSS Distributions void    do_machdep(FILE *ofp);
71*4f1223e8SApple OSS Distributions void    do_rules(FILE *f);
72*4f1223e8SApple OSS Distributions void    copy_dependencies(FILE *makin, FILE *makout);
73*4f1223e8SApple OSS Distributions 
74*4f1223e8SApple OSS Distributions struct file_list *fl_lookup(char *file);
75*4f1223e8SApple OSS Distributions struct file_list *fltail_lookup(char *file);
76*4f1223e8SApple OSS Distributions struct file_list *new_fent(void);
77*4f1223e8SApple OSS Distributions 
78*4f1223e8SApple OSS Distributions void    put_source_file_name(FILE *fp, struct file_list *tp);
79*4f1223e8SApple OSS Distributions 
80*4f1223e8SApple OSS Distributions 
81*4f1223e8SApple OSS Distributions #define next_word(fp, wd) \
82*4f1223e8SApple OSS Distributions 	{ const char *word = get_word(fp); \
83*4f1223e8SApple OSS Distributions 	  if (word == (char *)EOF) \
84*4f1223e8SApple OSS Distributions 	        return; \
85*4f1223e8SApple OSS Distributions 	  else \
86*4f1223e8SApple OSS Distributions 	        wd = word; \
87*4f1223e8SApple OSS Distributions 	}
88*4f1223e8SApple OSS Distributions 
89*4f1223e8SApple OSS Distributions static  struct file_list *fcur;
90*4f1223e8SApple OSS Distributions const char *tail(const char *fn);
91*4f1223e8SApple OSS Distributions char *allCaps(char *str);
92*4f1223e8SApple OSS Distributions 
93*4f1223e8SApple OSS Distributions /*
94*4f1223e8SApple OSS Distributions  * Lookup a file, by name.
95*4f1223e8SApple OSS Distributions  */
96*4f1223e8SApple OSS Distributions struct file_list *
fl_lookup(char * file)97*4f1223e8SApple OSS Distributions fl_lookup(char *file)
98*4f1223e8SApple OSS Distributions {
99*4f1223e8SApple OSS Distributions 	struct file_list *fp;
100*4f1223e8SApple OSS Distributions 
101*4f1223e8SApple OSS Distributions 	for (fp = ftab; fp != 0; fp = fp->f_next) {
102*4f1223e8SApple OSS Distributions 		if (eq(fp->f_fn, file)) {
103*4f1223e8SApple OSS Distributions 			return fp;
104*4f1223e8SApple OSS Distributions 		}
105*4f1223e8SApple OSS Distributions 	}
106*4f1223e8SApple OSS Distributions 	return 0;
107*4f1223e8SApple OSS Distributions }
108*4f1223e8SApple OSS Distributions 
109*4f1223e8SApple OSS Distributions /*
110*4f1223e8SApple OSS Distributions  * Lookup a file, by final component name.
111*4f1223e8SApple OSS Distributions  */
112*4f1223e8SApple OSS Distributions struct file_list *
fltail_lookup(char * file)113*4f1223e8SApple OSS Distributions fltail_lookup(char *file)
114*4f1223e8SApple OSS Distributions {
115*4f1223e8SApple OSS Distributions 	struct file_list *fp;
116*4f1223e8SApple OSS Distributions 
117*4f1223e8SApple OSS Distributions 	for (fp = ftab; fp != 0; fp = fp->f_next) {
118*4f1223e8SApple OSS Distributions 		if (eq(tail(fp->f_fn), tail(file))) {
119*4f1223e8SApple OSS Distributions 			return fp;
120*4f1223e8SApple OSS Distributions 		}
121*4f1223e8SApple OSS Distributions 	}
122*4f1223e8SApple OSS Distributions 	return 0;
123*4f1223e8SApple OSS Distributions }
124*4f1223e8SApple OSS Distributions 
125*4f1223e8SApple OSS Distributions /*
126*4f1223e8SApple OSS Distributions  * Make a new file list entry
127*4f1223e8SApple OSS Distributions  */
128*4f1223e8SApple OSS Distributions struct file_list *
new_fent(void)129*4f1223e8SApple OSS Distributions new_fent(void)
130*4f1223e8SApple OSS Distributions {
131*4f1223e8SApple OSS Distributions 	struct file_list *fp;
132*4f1223e8SApple OSS Distributions 
133*4f1223e8SApple OSS Distributions 	fp = (struct file_list *) malloc(sizeof *fp);
134*4f1223e8SApple OSS Distributions 	fp->f_needs = 0;
135*4f1223e8SApple OSS Distributions 	fp->f_next = 0;
136*4f1223e8SApple OSS Distributions 	fp->f_flags = 0;
137*4f1223e8SApple OSS Distributions 	fp->f_type = 0;
138*4f1223e8SApple OSS Distributions 	fp->f_extra = (char *) 0;
139*4f1223e8SApple OSS Distributions 	if (fcur == 0) {
140*4f1223e8SApple OSS Distributions 		fcur = ftab = fp;
141*4f1223e8SApple OSS Distributions 	} else {
142*4f1223e8SApple OSS Distributions 		fcur->f_next = fp;
143*4f1223e8SApple OSS Distributions 	}
144*4f1223e8SApple OSS Distributions 	fcur = fp;
145*4f1223e8SApple OSS Distributions 	return fp;
146*4f1223e8SApple OSS Distributions }
147*4f1223e8SApple OSS Distributions 
148*4f1223e8SApple OSS Distributions char    *COPTS;
149*4f1223e8SApple OSS Distributions 
150*4f1223e8SApple OSS Distributions const char *
get_VPATH(void)151*4f1223e8SApple OSS Distributions get_VPATH(void)
152*4f1223e8SApple OSS Distributions {
153*4f1223e8SApple OSS Distributions 	static char *vpath = NULL;
154*4f1223e8SApple OSS Distributions 
155*4f1223e8SApple OSS Distributions 	if ((vpath == NULL) &&
156*4f1223e8SApple OSS Distributions 	    ((vpath = getenv("VPATH")) != NULL) &&
157*4f1223e8SApple OSS Distributions 	    (*vpath != ':')) {
158*4f1223e8SApple OSS Distributions 		char *buf = malloc((unsigned)(strlen(vpath) + 2));
159*4f1223e8SApple OSS Distributions 
160*4f1223e8SApple OSS Distributions 		vpath = strcat(strcpy(buf, ":"), vpath);
161*4f1223e8SApple OSS Distributions 	}
162*4f1223e8SApple OSS Distributions 
163*4f1223e8SApple OSS Distributions 	return vpath ? vpath : "";
164*4f1223e8SApple OSS Distributions }
165*4f1223e8SApple OSS Distributions 
166*4f1223e8SApple OSS Distributions 
167*4f1223e8SApple OSS Distributions /*
168*4f1223e8SApple OSS Distributions  * Build the makefile from the skeleton
169*4f1223e8SApple OSS Distributions  */
170*4f1223e8SApple OSS Distributions void
makefile(void)171*4f1223e8SApple OSS Distributions makefile(void)
172*4f1223e8SApple OSS Distributions {
173*4f1223e8SApple OSS Distributions 	FILE *ifp, *ofp;
174*4f1223e8SApple OSS Distributions 	FILE *dfp;
175*4f1223e8SApple OSS Distributions 	char pname[BUFSIZ];
176*4f1223e8SApple OSS Distributions 	char line[BUFSIZ];
177*4f1223e8SApple OSS Distributions 	struct opt *op;
178*4f1223e8SApple OSS Distributions 
179*4f1223e8SApple OSS Distributions 	read_files();
180*4f1223e8SApple OSS Distributions 	(void) sprintf(line, "%s/Makefile.template", config_directory);
181*4f1223e8SApple OSS Distributions 	ifp = fopenp(VPATH, line, pname, "r");
182*4f1223e8SApple OSS Distributions 	if (ifp == 0) {
183*4f1223e8SApple OSS Distributions 		perror(line);
184*4f1223e8SApple OSS Distributions 		exit(1);
185*4f1223e8SApple OSS Distributions 	}
186*4f1223e8SApple OSS Distributions 	dfp = fopen(path("Makefile"), "r");
187*4f1223e8SApple OSS Distributions 	rename(path("Makefile"), path("Makefile.old"));
188*4f1223e8SApple OSS Distributions 	unlink(path("Makefile.old"));
189*4f1223e8SApple OSS Distributions 	ofp = fopen(path("Makefile"), "w");
190*4f1223e8SApple OSS Distributions 	if (ofp == 0) {
191*4f1223e8SApple OSS Distributions 		perror(path("Makefile"));
192*4f1223e8SApple OSS Distributions 		exit(1);
193*4f1223e8SApple OSS Distributions 	}
194*4f1223e8SApple OSS Distributions 	fprintf(ofp, "SOURCE_DIR=%s\n", source_directory);
195*4f1223e8SApple OSS Distributions 
196*4f1223e8SApple OSS Distributions 	fprintf(ofp, "export CONFIG_DEFINES =");
197*4f1223e8SApple OSS Distributions 	if (profiling) {
198*4f1223e8SApple OSS Distributions 		fprintf(ofp, " -DGPROF");
199*4f1223e8SApple OSS Distributions 	}
200*4f1223e8SApple OSS Distributions 
201*4f1223e8SApple OSS Distributions 	for (op = opt; op; op = op->op_next) {
202*4f1223e8SApple OSS Distributions 		if (op->op_value) {
203*4f1223e8SApple OSS Distributions 			fprintf(ofp, " -D%s=\"%s\"", op->op_name, op->op_value);
204*4f1223e8SApple OSS Distributions 		} else {
205*4f1223e8SApple OSS Distributions 			fprintf(ofp, " -D%s", op->op_name);
206*4f1223e8SApple OSS Distributions 		}
207*4f1223e8SApple OSS Distributions 	}
208*4f1223e8SApple OSS Distributions 	fprintf(ofp, "\n");
209*4f1223e8SApple OSS Distributions 	for (op = mkopt; op; op = op->op_next) {
210*4f1223e8SApple OSS Distributions 		if (op->op_value) {
211*4f1223e8SApple OSS Distributions 			fprintf(ofp, "%s=%s\n", op->op_name, op->op_value);
212*4f1223e8SApple OSS Distributions 		} else {
213*4f1223e8SApple OSS Distributions 			fprintf(ofp, "%s\n", op->op_name);
214*4f1223e8SApple OSS Distributions 		}
215*4f1223e8SApple OSS Distributions 	}
216*4f1223e8SApple OSS Distributions 
217*4f1223e8SApple OSS Distributions 	while (fgets(line, BUFSIZ, ifp) != 0) {
218*4f1223e8SApple OSS Distributions 		if (*line == '%') {
219*4f1223e8SApple OSS Distributions 			goto percent;
220*4f1223e8SApple OSS Distributions 		}
221*4f1223e8SApple OSS Distributions 		if (profiling && strncmp(line, "COPTS=", 6) == 0) {
222*4f1223e8SApple OSS Distributions 			char *cp;
223*4f1223e8SApple OSS Distributions 			fprintf(ofp,
224*4f1223e8SApple OSS Distributions 			    "GPROF.EX=$(SOURCE_DIR)/machdep/%s/gmon.ex\n", machinename);
225*4f1223e8SApple OSS Distributions 			cp = index(line, '\n');
226*4f1223e8SApple OSS Distributions 			if (cp) {
227*4f1223e8SApple OSS Distributions 				*cp = 0;
228*4f1223e8SApple OSS Distributions 			}
229*4f1223e8SApple OSS Distributions 			cp = line + 6;
230*4f1223e8SApple OSS Distributions 			while (*cp && (*cp == ' ' || *cp == '\t')) {
231*4f1223e8SApple OSS Distributions 				cp++;
232*4f1223e8SApple OSS Distributions 			}
233*4f1223e8SApple OSS Distributions 			COPTS = malloc((unsigned)(strlen(cp) + 1));
234*4f1223e8SApple OSS Distributions 			if (COPTS == 0) {
235*4f1223e8SApple OSS Distributions 				printf("config: out of memory\n");
236*4f1223e8SApple OSS Distributions 				exit(1);
237*4f1223e8SApple OSS Distributions 			}
238*4f1223e8SApple OSS Distributions 			strcpy(COPTS, cp);
239*4f1223e8SApple OSS Distributions 			fprintf(ofp, "%s -pg\n", line);
240*4f1223e8SApple OSS Distributions 			continue;
241*4f1223e8SApple OSS Distributions 		}
242*4f1223e8SApple OSS Distributions 		fprintf(ofp, "%s", line);
243*4f1223e8SApple OSS Distributions 		continue;
244*4f1223e8SApple OSS Distributions percent:
245*4f1223e8SApple OSS Distributions 		if (eq(line, "%OBJS\n")) {
246*4f1223e8SApple OSS Distributions 			do_objs(ofp, "OBJS=", -1, 0);
247*4f1223e8SApple OSS Distributions 		} else if (eq(line, "%LIBOBJS\n")) {
248*4f1223e8SApple OSS Distributions 			do_objs(ofp, "LIBOBJS=", -1, LIBRARYDEP);
249*4f1223e8SApple OSS Distributions 		} else if (eq(line, "%CFILES\n")) {
250*4f1223e8SApple OSS Distributions 			do_files(ofp, "CFILES=", 'c');
251*4f1223e8SApple OSS Distributions 			do_objs(ofp, "COBJS=", 'c', 0);
252*4f1223e8SApple OSS Distributions 		} else if (eq(line, "%CXXFILES\n")) {
253*4f1223e8SApple OSS Distributions 			do_files(ofp, "CXXFILES=", 'p');
254*4f1223e8SApple OSS Distributions 			do_objs(ofp, "CXXOBJS=", 'p', 0);
255*4f1223e8SApple OSS Distributions 		} else if (eq(line, "%SFILES\n")) {
256*4f1223e8SApple OSS Distributions 			do_files(ofp, "SFILES=", 's');
257*4f1223e8SApple OSS Distributions 			do_objs(ofp, "SOBJS=", 's', 0);
258*4f1223e8SApple OSS Distributions 		} else if (eq(line, "%MACHDEP\n")) {
259*4f1223e8SApple OSS Distributions 			do_machdep(ofp);
260*4f1223e8SApple OSS Distributions 		} else if (eq(line, "%RULES\n")) {
261*4f1223e8SApple OSS Distributions 			do_rules(ofp);
262*4f1223e8SApple OSS Distributions 		} else {
263*4f1223e8SApple OSS Distributions 			fprintf(stderr,
264*4f1223e8SApple OSS Distributions 			    "Unknown %% construct in generic makefile: %s",
265*4f1223e8SApple OSS Distributions 			    line);
266*4f1223e8SApple OSS Distributions 		}
267*4f1223e8SApple OSS Distributions 	}
268*4f1223e8SApple OSS Distributions 	if (dfp != NULL) {
269*4f1223e8SApple OSS Distributions 		copy_dependencies(dfp, ofp);
270*4f1223e8SApple OSS Distributions 		(void) fclose(dfp);
271*4f1223e8SApple OSS Distributions 	}
272*4f1223e8SApple OSS Distributions 	(void) fclose(ifp);
273*4f1223e8SApple OSS Distributions 	(void) fclose(ofp);
274*4f1223e8SApple OSS Distributions }
275*4f1223e8SApple OSS Distributions 
276*4f1223e8SApple OSS Distributions /*
277*4f1223e8SApple OSS Distributions  * Read in the information about files used in making the system.
278*4f1223e8SApple OSS Distributions  * Store it in the ftab linked list.
279*4f1223e8SApple OSS Distributions  */
280*4f1223e8SApple OSS Distributions void
read_files(void)281*4f1223e8SApple OSS Distributions read_files(void)
282*4f1223e8SApple OSS Distributions {
283*4f1223e8SApple OSS Distributions 	FILE *fp;
284*4f1223e8SApple OSS Distributions 	struct file_list *tp, *pf;
285*4f1223e8SApple OSS Distributions 	struct device *dp;
286*4f1223e8SApple OSS Distributions 	struct opt *op;
287*4f1223e8SApple OSS Distributions 	const char *wd;
288*4f1223e8SApple OSS Distributions 	char *this, *needs;
289*4f1223e8SApple OSS Distributions 	const char *devorprof;
290*4f1223e8SApple OSS Distributions 	int options;
291*4f1223e8SApple OSS Distributions 	int not_option;
292*4f1223e8SApple OSS Distributions 	int f_flags;
293*4f1223e8SApple OSS Distributions 	char pname[BUFSIZ];
294*4f1223e8SApple OSS Distributions 	char fname[1024];
295*4f1223e8SApple OSS Distributions 	char *rest = (char *) 0;
296*4f1223e8SApple OSS Distributions 	int nreqs, first = 1, isdup;
297*4f1223e8SApple OSS Distributions 
298*4f1223e8SApple OSS Distributions 	ftab = 0;
299*4f1223e8SApple OSS Distributions 	(void) sprintf(fname, "%s/files", config_directory);
300*4f1223e8SApple OSS Distributions openit:
301*4f1223e8SApple OSS Distributions 	fp = fopenp(VPATH, fname, pname, "r");
302*4f1223e8SApple OSS Distributions 	if (fp == 0) {
303*4f1223e8SApple OSS Distributions 		perror(fname);
304*4f1223e8SApple OSS Distributions 		exit(1);
305*4f1223e8SApple OSS Distributions 	}
306*4f1223e8SApple OSS Distributions next:
307*4f1223e8SApple OSS Distributions 	options = 0;
308*4f1223e8SApple OSS Distributions 	rest = (char *) 0;
309*4f1223e8SApple OSS Distributions 	/*
310*4f1223e8SApple OSS Distributions 	 * filename	[ standard | optional ]
311*4f1223e8SApple OSS Distributions 	 *	[ dev* | profiling-routine ] [ device-driver]
312*4f1223e8SApple OSS Distributions 	 */
313*4f1223e8SApple OSS Distributions 	wd = get_word(fp);
314*4f1223e8SApple OSS Distributions 	if (wd == (char *)EOF) {
315*4f1223e8SApple OSS Distributions 		(void) fclose(fp);
316*4f1223e8SApple OSS Distributions 		if (first == 1) {
317*4f1223e8SApple OSS Distributions 			(void) sprintf(fname, "%s/files.%s", config_directory, machinename);
318*4f1223e8SApple OSS Distributions 			first++;
319*4f1223e8SApple OSS Distributions 			goto openit;
320*4f1223e8SApple OSS Distributions 		}
321*4f1223e8SApple OSS Distributions 		return;
322*4f1223e8SApple OSS Distributions 	}
323*4f1223e8SApple OSS Distributions 	if (wd == 0) {
324*4f1223e8SApple OSS Distributions 		goto next;
325*4f1223e8SApple OSS Distributions 	}
326*4f1223e8SApple OSS Distributions 	/*
327*4f1223e8SApple OSS Distributions 	 *  Allow comment lines beginning witha '#' character.
328*4f1223e8SApple OSS Distributions 	 */
329*4f1223e8SApple OSS Distributions 	if (*wd == '#') {
330*4f1223e8SApple OSS Distributions 		while ((wd = get_word(fp)) && wd != (char *)EOF) {
331*4f1223e8SApple OSS Distributions 			;
332*4f1223e8SApple OSS Distributions 		}
333*4f1223e8SApple OSS Distributions 		goto next;
334*4f1223e8SApple OSS Distributions 	}
335*4f1223e8SApple OSS Distributions 
336*4f1223e8SApple OSS Distributions 	this = ns(wd);
337*4f1223e8SApple OSS Distributions 	next_word(fp, wd);
338*4f1223e8SApple OSS Distributions 	if (wd == 0) {
339*4f1223e8SApple OSS Distributions 		printf("%s: No type for %s.\n",
340*4f1223e8SApple OSS Distributions 		    fname, this);
341*4f1223e8SApple OSS Distributions 		exit(1);
342*4f1223e8SApple OSS Distributions 	}
343*4f1223e8SApple OSS Distributions 	if ((pf = fl_lookup(this)) && (pf->f_type != INVISIBLE || pf->f_flags)) {
344*4f1223e8SApple OSS Distributions 		isdup = 1;
345*4f1223e8SApple OSS Distributions 	} else {
346*4f1223e8SApple OSS Distributions 		isdup = 0;
347*4f1223e8SApple OSS Distributions 	}
348*4f1223e8SApple OSS Distributions 	tp = 0;
349*4f1223e8SApple OSS Distributions 	nreqs = 0;
350*4f1223e8SApple OSS Distributions 	devorprof = "";
351*4f1223e8SApple OSS Distributions 	needs = 0;
352*4f1223e8SApple OSS Distributions 	f_flags = 0;
353*4f1223e8SApple OSS Distributions 	if (eq(wd, "standard")) {
354*4f1223e8SApple OSS Distributions 		goto checkdev;
355*4f1223e8SApple OSS Distributions 	}
356*4f1223e8SApple OSS Distributions 	if (!eq(wd, "optional")) {
357*4f1223e8SApple OSS Distributions 		printf("%s: %s must be optional or standard\n", fname, this);
358*4f1223e8SApple OSS Distributions 		exit(1);
359*4f1223e8SApple OSS Distributions 	}
360*4f1223e8SApple OSS Distributions 	if (strncmp(this, "OPTIONS/", 8) == 0) {
361*4f1223e8SApple OSS Distributions 		options++;
362*4f1223e8SApple OSS Distributions 	}
363*4f1223e8SApple OSS Distributions 	not_option = 0;
364*4f1223e8SApple OSS Distributions nextopt:
365*4f1223e8SApple OSS Distributions 	next_word(fp, wd);
366*4f1223e8SApple OSS Distributions 	if (wd == 0) {
367*4f1223e8SApple OSS Distributions 		goto doneopt;
368*4f1223e8SApple OSS Distributions 	}
369*4f1223e8SApple OSS Distributions 	if (eq(wd, "not")) {
370*4f1223e8SApple OSS Distributions 		not_option = !not_option;
371*4f1223e8SApple OSS Distributions 		goto nextopt;
372*4f1223e8SApple OSS Distributions 	}
373*4f1223e8SApple OSS Distributions 	devorprof = wd;
374*4f1223e8SApple OSS Distributions 	if (eq(wd, "device-driver") || eq(wd, "profiling-routine")) {
375*4f1223e8SApple OSS Distributions 		next_word(fp, wd);
376*4f1223e8SApple OSS Distributions 		goto save;
377*4f1223e8SApple OSS Distributions 	}
378*4f1223e8SApple OSS Distributions 	if (eq(wd, "xnu-library")) {
379*4f1223e8SApple OSS Distributions 		f_flags |= LIBRARYDEP;
380*4f1223e8SApple OSS Distributions 		goto nextopt;
381*4f1223e8SApple OSS Distributions 	}
382*4f1223e8SApple OSS Distributions 	if (eq(wd, "bound-checks")) {
383*4f1223e8SApple OSS Distributions 		if (f_flags & BOUND_CHECKS_MASK) {
384*4f1223e8SApple OSS Distributions 			printf("%s: cannot combine bound-checks options\n", fname);
385*4f1223e8SApple OSS Distributions 			exit(1);
386*4f1223e8SApple OSS Distributions 		}
387*4f1223e8SApple OSS Distributions 		f_flags |= BOUND_CHECKS;
388*4f1223e8SApple OSS Distributions 		goto nextopt;
389*4f1223e8SApple OSS Distributions 	}
390*4f1223e8SApple OSS Distributions 	if (eq(wd, "bound-checks-pending")) {
391*4f1223e8SApple OSS Distributions 		if (f_flags & BOUND_CHECKS_MASK) {
392*4f1223e8SApple OSS Distributions 			printf("%s: cannot combine bound-checks options\n", fname);
393*4f1223e8SApple OSS Distributions 			exit(1);
394*4f1223e8SApple OSS Distributions 		}
395*4f1223e8SApple OSS Distributions 		f_flags |= BOUND_CHECKS_PENDING;
396*4f1223e8SApple OSS Distributions 		goto nextopt;
397*4f1223e8SApple OSS Distributions 	}
398*4f1223e8SApple OSS Distributions 	if (eq(wd, "bound-checks-soft")) {
399*4f1223e8SApple OSS Distributions 		if (f_flags & BOUND_CHECKS_MASK) {
400*4f1223e8SApple OSS Distributions 			printf("%s: cannot combine bound-checks options\n", fname);
401*4f1223e8SApple OSS Distributions 			exit(1);
402*4f1223e8SApple OSS Distributions 		}
403*4f1223e8SApple OSS Distributions 		f_flags |= BOUND_CHECKS_SOFT;
404*4f1223e8SApple OSS Distributions 		goto nextopt;
405*4f1223e8SApple OSS Distributions 	}
406*4f1223e8SApple OSS Distributions 	if (eq(wd, "bound-checks-debug")) {
407*4f1223e8SApple OSS Distributions 		if (f_flags & BOUND_CHECKS_MASK) {
408*4f1223e8SApple OSS Distributions 			printf("%s: cannot combine bound-checks options\n", fname);
409*4f1223e8SApple OSS Distributions 			exit(1);
410*4f1223e8SApple OSS Distributions 		}
411*4f1223e8SApple OSS Distributions 		f_flags |= BOUND_CHECKS_DEBUG;
412*4f1223e8SApple OSS Distributions 		goto nextopt;
413*4f1223e8SApple OSS Distributions 	}
414*4f1223e8SApple OSS Distributions 	if (eq(wd, "bound-checks-seed")) {
415*4f1223e8SApple OSS Distributions 		if (f_flags & BOUND_CHECKS_MASK) {
416*4f1223e8SApple OSS Distributions 			printf("%s: cannot combine bound-checks options\n", fname);
417*4f1223e8SApple OSS Distributions 			exit(1);
418*4f1223e8SApple OSS Distributions 		}
419*4f1223e8SApple OSS Distributions 		f_flags |= BOUND_CHECKS_SEED;
420*4f1223e8SApple OSS Distributions 		goto nextopt;
421*4f1223e8SApple OSS Distributions 	}
422*4f1223e8SApple OSS Distributions 	nreqs++;
423*4f1223e8SApple OSS Distributions 	if (needs == 0 && nreqs == 1) {
424*4f1223e8SApple OSS Distributions 		needs = ns(wd);
425*4f1223e8SApple OSS Distributions 	}
426*4f1223e8SApple OSS Distributions 	if (isdup) {
427*4f1223e8SApple OSS Distributions 		goto invis;
428*4f1223e8SApple OSS Distributions 	}
429*4f1223e8SApple OSS Distributions 	if (options) {
430*4f1223e8SApple OSS Distributions 		struct opt *lop = 0;
431*4f1223e8SApple OSS Distributions 		struct device tdev;
432*4f1223e8SApple OSS Distributions 
433*4f1223e8SApple OSS Distributions 		/*
434*4f1223e8SApple OSS Distributions 		 *  Allocate a pseudo-device entry which we will insert into
435*4f1223e8SApple OSS Distributions 		 *  the device list below.  The flags field is set non-zero to
436*4f1223e8SApple OSS Distributions 		 *  indicate an internal entry rather than one generated from
437*4f1223e8SApple OSS Distributions 		 *  the configuration file.  The slave field is set to define
438*4f1223e8SApple OSS Distributions 		 *  the corresponding symbol as 0 should we fail to find the
439*4f1223e8SApple OSS Distributions 		 *  option in the option list.
440*4f1223e8SApple OSS Distributions 		 */
441*4f1223e8SApple OSS Distributions 		init_dev(&tdev);
442*4f1223e8SApple OSS Distributions 		tdev.d_name = ns(wd);
443*4f1223e8SApple OSS Distributions 		tdev.d_type = PSEUDO_DEVICE;
444*4f1223e8SApple OSS Distributions 		tdev.d_flags++;
445*4f1223e8SApple OSS Distributions 		tdev.d_slave = 0;
446*4f1223e8SApple OSS Distributions 
447*4f1223e8SApple OSS Distributions 		for (op = opt; op; lop = op, op = op->op_next) {
448*4f1223e8SApple OSS Distributions 			char *od = allCaps(ns(wd));
449*4f1223e8SApple OSS Distributions 
450*4f1223e8SApple OSS Distributions 			/*
451*4f1223e8SApple OSS Distributions 			 *  Found an option which matches the current device
452*4f1223e8SApple OSS Distributions 			 *  dependency identifier.  Set the slave field to
453*4f1223e8SApple OSS Distributions 			 *  define the option in the header file.
454*4f1223e8SApple OSS Distributions 			 */
455*4f1223e8SApple OSS Distributions 			if (strcmp(op->op_name, od) == 0) {
456*4f1223e8SApple OSS Distributions 				tdev.d_slave = 1;
457*4f1223e8SApple OSS Distributions 				if (lop == 0) {
458*4f1223e8SApple OSS Distributions 					opt = op->op_next;
459*4f1223e8SApple OSS Distributions 				} else {
460*4f1223e8SApple OSS Distributions 					lop->op_next = op->op_next;
461*4f1223e8SApple OSS Distributions 				}
462*4f1223e8SApple OSS Distributions 				free(op);
463*4f1223e8SApple OSS Distributions 				op = 0;
464*4f1223e8SApple OSS Distributions 			}
465*4f1223e8SApple OSS Distributions 			free(od);
466*4f1223e8SApple OSS Distributions 			if (op == 0) {
467*4f1223e8SApple OSS Distributions 				break;
468*4f1223e8SApple OSS Distributions 			}
469*4f1223e8SApple OSS Distributions 		}
470*4f1223e8SApple OSS Distributions 		newdev(&tdev);
471*4f1223e8SApple OSS Distributions 	}
472*4f1223e8SApple OSS Distributions 	for (dp = dtab; dp != 0; dp = dp->d_next) {
473*4f1223e8SApple OSS Distributions 		if (eq(dp->d_name, wd) && (dp->d_type != PSEUDO_DEVICE || dp->d_slave)) {
474*4f1223e8SApple OSS Distributions 			if (not_option) {
475*4f1223e8SApple OSS Distributions 				goto invis;     /* dont want file if option present */
476*4f1223e8SApple OSS Distributions 			} else {
477*4f1223e8SApple OSS Distributions 				goto nextopt;
478*4f1223e8SApple OSS Distributions 			}
479*4f1223e8SApple OSS Distributions 		}
480*4f1223e8SApple OSS Distributions 	}
481*4f1223e8SApple OSS Distributions 	if (not_option) {
482*4f1223e8SApple OSS Distributions 		goto nextopt;           /* want file if option missing */
483*4f1223e8SApple OSS Distributions 	}
484*4f1223e8SApple OSS Distributions 	for (op = opt; op != 0; op = op->op_next) {
485*4f1223e8SApple OSS Distributions 		if (op->op_value == 0 && opteq(op->op_name, wd)) {
486*4f1223e8SApple OSS Distributions 			if (nreqs == 1) {
487*4f1223e8SApple OSS Distributions 				free(needs);
488*4f1223e8SApple OSS Distributions 				needs = 0;
489*4f1223e8SApple OSS Distributions 			}
490*4f1223e8SApple OSS Distributions 			goto nextopt;
491*4f1223e8SApple OSS Distributions 		}
492*4f1223e8SApple OSS Distributions 	}
493*4f1223e8SApple OSS Distributions 
494*4f1223e8SApple OSS Distributions invis:
495*4f1223e8SApple OSS Distributions 	while ((wd = get_word(fp)) != 0) {
496*4f1223e8SApple OSS Distributions 		;
497*4f1223e8SApple OSS Distributions 	}
498*4f1223e8SApple OSS Distributions 	if (tp == 0) {
499*4f1223e8SApple OSS Distributions 		tp = new_fent();
500*4f1223e8SApple OSS Distributions 	}
501*4f1223e8SApple OSS Distributions 	tp->f_fn = this;
502*4f1223e8SApple OSS Distributions 	tp->f_type = INVISIBLE;
503*4f1223e8SApple OSS Distributions 	tp->f_needs = needs;
504*4f1223e8SApple OSS Distributions 	tp->f_flags = isdup;
505*4f1223e8SApple OSS Distributions 	goto next;
506*4f1223e8SApple OSS Distributions 
507*4f1223e8SApple OSS Distributions doneopt:
508*4f1223e8SApple OSS Distributions 	if (nreqs == 0) {
509*4f1223e8SApple OSS Distributions 		printf("%s: what is %s optional on?\n",
510*4f1223e8SApple OSS Distributions 		    fname, this);
511*4f1223e8SApple OSS Distributions 		exit(1);
512*4f1223e8SApple OSS Distributions 	}
513*4f1223e8SApple OSS Distributions 
514*4f1223e8SApple OSS Distributions checkdev:
515*4f1223e8SApple OSS Distributions 	if (wd) {
516*4f1223e8SApple OSS Distributions 		if (*wd == '|') {
517*4f1223e8SApple OSS Distributions 			goto getrest;
518*4f1223e8SApple OSS Distributions 		}
519*4f1223e8SApple OSS Distributions 		next_word(fp, wd);
520*4f1223e8SApple OSS Distributions 		while (wd) {
521*4f1223e8SApple OSS Distributions 			if (eq(wd, "xnu-library")) {
522*4f1223e8SApple OSS Distributions 				f_flags |= LIBRARYDEP;
523*4f1223e8SApple OSS Distributions 				next_word(fp, wd);
524*4f1223e8SApple OSS Distributions 				continue;
525*4f1223e8SApple OSS Distributions 			}
526*4f1223e8SApple OSS Distributions 			if (eq(wd, "bound-checks")) {
527*4f1223e8SApple OSS Distributions 				if (f_flags & BOUND_CHECKS_MASK) {
528*4f1223e8SApple OSS Distributions 					printf("%s: cannot combine bound-checks options\n", fname);
529*4f1223e8SApple OSS Distributions 					exit(1);
530*4f1223e8SApple OSS Distributions 				}
531*4f1223e8SApple OSS Distributions 				f_flags |= BOUND_CHECKS;
532*4f1223e8SApple OSS Distributions 				next_word(fp, wd);
533*4f1223e8SApple OSS Distributions 				continue;
534*4f1223e8SApple OSS Distributions 			}
535*4f1223e8SApple OSS Distributions 			if (eq(wd, "bound-checks-pending")) {
536*4f1223e8SApple OSS Distributions 				if (f_flags & BOUND_CHECKS_MASK) {
537*4f1223e8SApple OSS Distributions 					printf("%s: cannot combine bound-checks options\n", fname);
538*4f1223e8SApple OSS Distributions 					exit(1);
539*4f1223e8SApple OSS Distributions 				}
540*4f1223e8SApple OSS Distributions 				f_flags |= BOUND_CHECKS_PENDING;
541*4f1223e8SApple OSS Distributions 				next_word(fp, wd);
542*4f1223e8SApple OSS Distributions 				continue;
543*4f1223e8SApple OSS Distributions 			}
544*4f1223e8SApple OSS Distributions 			if (eq(wd, "bound-checks-soft")) {
545*4f1223e8SApple OSS Distributions 				if (f_flags & BOUND_CHECKS_MASK) {
546*4f1223e8SApple OSS Distributions 					printf("%s: cannot combine bound-checks options\n", fname);
547*4f1223e8SApple OSS Distributions 					exit(1);
548*4f1223e8SApple OSS Distributions 				}
549*4f1223e8SApple OSS Distributions 				f_flags |= BOUND_CHECKS_SOFT;
550*4f1223e8SApple OSS Distributions 				next_word(fp, wd);
551*4f1223e8SApple OSS Distributions 				continue;
552*4f1223e8SApple OSS Distributions 			}
553*4f1223e8SApple OSS Distributions 			if (eq(wd, "bound-checks-debug")) {
554*4f1223e8SApple OSS Distributions 				if (f_flags & BOUND_CHECKS_MASK) {
555*4f1223e8SApple OSS Distributions 					printf("%s: cannot combine bound-checks options\n", fname);
556*4f1223e8SApple OSS Distributions 					exit(1);
557*4f1223e8SApple OSS Distributions 				}
558*4f1223e8SApple OSS Distributions 				f_flags |= BOUND_CHECKS_DEBUG;
559*4f1223e8SApple OSS Distributions 				next_word(fp, wd);
560*4f1223e8SApple OSS Distributions 				continue;
561*4f1223e8SApple OSS Distributions 			}
562*4f1223e8SApple OSS Distributions 			if (eq(wd, "bound-checks-seed")) {
563*4f1223e8SApple OSS Distributions 				if (f_flags & BOUND_CHECKS_MASK) {
564*4f1223e8SApple OSS Distributions 					printf("%s: cannot combine bound-checks options\n", fname);
565*4f1223e8SApple OSS Distributions 					exit(1);
566*4f1223e8SApple OSS Distributions 				}
567*4f1223e8SApple OSS Distributions 				f_flags |= BOUND_CHECKS_SEED;
568*4f1223e8SApple OSS Distributions 				next_word(fp, wd);
569*4f1223e8SApple OSS Distributions 				continue;
570*4f1223e8SApple OSS Distributions 			}
571*4f1223e8SApple OSS Distributions 
572*4f1223e8SApple OSS Distributions 			devorprof = wd;
573*4f1223e8SApple OSS Distributions 			next_word(fp, wd);
574*4f1223e8SApple OSS Distributions 			break;
575*4f1223e8SApple OSS Distributions 		}
576*4f1223e8SApple OSS Distributions 	}
577*4f1223e8SApple OSS Distributions 
578*4f1223e8SApple OSS Distributions save:
579*4f1223e8SApple OSS Distributions getrest:
580*4f1223e8SApple OSS Distributions 	if (wd) {
581*4f1223e8SApple OSS Distributions 		if (*wd == '|') {
582*4f1223e8SApple OSS Distributions 			rest = ns(get_rest(fp));
583*4f1223e8SApple OSS Distributions 		} else {
584*4f1223e8SApple OSS Distributions 			printf("%s: syntax error describing %s\n",
585*4f1223e8SApple OSS Distributions 			    fname, this);
586*4f1223e8SApple OSS Distributions 			exit(1);
587*4f1223e8SApple OSS Distributions 		}
588*4f1223e8SApple OSS Distributions 	}
589*4f1223e8SApple OSS Distributions 	if (eq(devorprof, "profiling-routine") && profiling == 0) {
590*4f1223e8SApple OSS Distributions 		goto next;
591*4f1223e8SApple OSS Distributions 	}
592*4f1223e8SApple OSS Distributions 	if (tp == 0) {
593*4f1223e8SApple OSS Distributions 		tp = new_fent();
594*4f1223e8SApple OSS Distributions 	}
595*4f1223e8SApple OSS Distributions 	tp->f_fn = this;
596*4f1223e8SApple OSS Distributions 	tp->f_extra = rest;
597*4f1223e8SApple OSS Distributions 	if (options) {
598*4f1223e8SApple OSS Distributions 		tp->f_type = INVISIBLE;
599*4f1223e8SApple OSS Distributions 	} else if (eq(devorprof, "device-driver")) {
600*4f1223e8SApple OSS Distributions 		tp->f_type = DRIVER;
601*4f1223e8SApple OSS Distributions 	} else if (eq(devorprof, "profiling-routine")) {
602*4f1223e8SApple OSS Distributions 		tp->f_type = PROFILING;
603*4f1223e8SApple OSS Distributions 	} else {
604*4f1223e8SApple OSS Distributions 		tp->f_type = NORMAL;
605*4f1223e8SApple OSS Distributions 	}
606*4f1223e8SApple OSS Distributions 	tp->f_flags = f_flags;
607*4f1223e8SApple OSS Distributions 	tp->f_needs = needs;
608*4f1223e8SApple OSS Distributions 	if (pf && pf->f_type == INVISIBLE) {
609*4f1223e8SApple OSS Distributions 		pf->f_flags = 1;                /* mark as duplicate */
610*4f1223e8SApple OSS Distributions 	}
611*4f1223e8SApple OSS Distributions 	goto next;
612*4f1223e8SApple OSS Distributions }
613*4f1223e8SApple OSS Distributions 
614*4f1223e8SApple OSS Distributions int
opteq(const char * cp,const char * dp)615*4f1223e8SApple OSS Distributions opteq(const char *cp, const char *dp)
616*4f1223e8SApple OSS Distributions {
617*4f1223e8SApple OSS Distributions 	char c, d;
618*4f1223e8SApple OSS Distributions 
619*4f1223e8SApple OSS Distributions 	for (;; cp++, dp++) {
620*4f1223e8SApple OSS Distributions 		if (*cp != *dp) {
621*4f1223e8SApple OSS Distributions 			c = isupper(*cp) ? tolower(*cp) : *cp;
622*4f1223e8SApple OSS Distributions 			d = isupper(*dp) ? tolower(*dp) : *dp;
623*4f1223e8SApple OSS Distributions 			if (c != d) {
624*4f1223e8SApple OSS Distributions 				return 0;
625*4f1223e8SApple OSS Distributions 			}
626*4f1223e8SApple OSS Distributions 		}
627*4f1223e8SApple OSS Distributions 		if (*cp == 0) {
628*4f1223e8SApple OSS Distributions 			return 1;
629*4f1223e8SApple OSS Distributions 		}
630*4f1223e8SApple OSS Distributions 	}
631*4f1223e8SApple OSS Distributions }
632*4f1223e8SApple OSS Distributions 
633*4f1223e8SApple OSS Distributions void
put_source_file_name(FILE * fp,struct file_list * tp)634*4f1223e8SApple OSS Distributions put_source_file_name(FILE *fp, struct file_list *tp)
635*4f1223e8SApple OSS Distributions {
636*4f1223e8SApple OSS Distributions 	if ((tp->f_fn[0] == '.') && (tp->f_fn[1] == '/')) {
637*4f1223e8SApple OSS Distributions 		fprintf(fp, "%s ", tp->f_fn);
638*4f1223e8SApple OSS Distributions 	} else {
639*4f1223e8SApple OSS Distributions 		fprintf(fp, "$(SOURCE_DIR)/%s ", tp->f_fn);
640*4f1223e8SApple OSS Distributions 	}
641*4f1223e8SApple OSS Distributions }
642*4f1223e8SApple OSS Distributions 
643*4f1223e8SApple OSS Distributions void
do_objs(FILE * fp,const char * msg,int ext,int flags)644*4f1223e8SApple OSS Distributions do_objs(FILE *fp, const char *msg, int ext, int flags)
645*4f1223e8SApple OSS Distributions {
646*4f1223e8SApple OSS Distributions 	struct file_list *tp;
647*4f1223e8SApple OSS Distributions 	int lpos, len;
648*4f1223e8SApple OSS Distributions 	char *cp;
649*4f1223e8SApple OSS Distributions 	char och;
650*4f1223e8SApple OSS Distributions 	const char *sp;
651*4f1223e8SApple OSS Distributions 
652*4f1223e8SApple OSS Distributions 	fprintf(fp, "%s", msg);
653*4f1223e8SApple OSS Distributions 	lpos = strlen(msg);
654*4f1223e8SApple OSS Distributions 	for (tp = ftab; tp != 0; tp = tp->f_next) {
655*4f1223e8SApple OSS Distributions 		if (tp->f_type == INVISIBLE) {
656*4f1223e8SApple OSS Distributions 			continue;
657*4f1223e8SApple OSS Distributions 		}
658*4f1223e8SApple OSS Distributions 
659*4f1223e8SApple OSS Distributions 		/*
660*4f1223e8SApple OSS Distributions 		 * Check flags (if any)
661*4f1223e8SApple OSS Distributions 		 */
662*4f1223e8SApple OSS Distributions 		if (flags && ((tp->f_flags & flags) != flags)) {
663*4f1223e8SApple OSS Distributions 			continue;
664*4f1223e8SApple OSS Distributions 		}
665*4f1223e8SApple OSS Distributions 
666*4f1223e8SApple OSS Distributions 		/*
667*4f1223e8SApple OSS Distributions 		 *	Check for '.o' file in list
668*4f1223e8SApple OSS Distributions 		 */
669*4f1223e8SApple OSS Distributions 		cp = tp->f_fn + (len = strlen(tp->f_fn)) - 1;
670*4f1223e8SApple OSS Distributions 		if (ext != -1 && *cp != ext) {
671*4f1223e8SApple OSS Distributions 			continue;
672*4f1223e8SApple OSS Distributions 		} else if (*cp == 'o') {
673*4f1223e8SApple OSS Distributions 			if (len + lpos > 72) {
674*4f1223e8SApple OSS Distributions 				lpos = 8;
675*4f1223e8SApple OSS Distributions 				fprintf(fp, "\\\n\t");
676*4f1223e8SApple OSS Distributions 			}
677*4f1223e8SApple OSS Distributions 			put_source_file_name(fp, tp);
678*4f1223e8SApple OSS Distributions 			fprintf(fp, " ");
679*4f1223e8SApple OSS Distributions 			lpos += len + 1;
680*4f1223e8SApple OSS Distributions 			continue;
681*4f1223e8SApple OSS Distributions 		}
682*4f1223e8SApple OSS Distributions 		sp = tail(tp->f_fn);
683*4f1223e8SApple OSS Distributions 		cp = (char *)sp + (len = strlen(sp)) - 1;
684*4f1223e8SApple OSS Distributions 		och = *cp;
685*4f1223e8SApple OSS Distributions 		*cp = 'o';
686*4f1223e8SApple OSS Distributions 		if (len + lpos > 72) {
687*4f1223e8SApple OSS Distributions 			lpos = 8;
688*4f1223e8SApple OSS Distributions 			fprintf(fp, "\\\n\t");
689*4f1223e8SApple OSS Distributions 		}
690*4f1223e8SApple OSS Distributions 		fprintf(fp, "%s ", sp);
691*4f1223e8SApple OSS Distributions 		lpos += len + 1;
692*4f1223e8SApple OSS Distributions 		*cp = och;
693*4f1223e8SApple OSS Distributions 	}
694*4f1223e8SApple OSS Distributions 	putc('\n', fp);
695*4f1223e8SApple OSS Distributions }
696*4f1223e8SApple OSS Distributions 
697*4f1223e8SApple OSS Distributions void
do_files(FILE * fp,const char * msg,char ext)698*4f1223e8SApple OSS Distributions do_files(FILE *fp, const char *msg, char ext)
699*4f1223e8SApple OSS Distributions {
700*4f1223e8SApple OSS Distributions 	struct file_list *tp;
701*4f1223e8SApple OSS Distributions 	int lpos, len = 0; /* dvw: init to 0 */
702*4f1223e8SApple OSS Distributions 
703*4f1223e8SApple OSS Distributions 	fprintf(fp, "%s", msg);
704*4f1223e8SApple OSS Distributions 	lpos = 8;
705*4f1223e8SApple OSS Distributions 	for (tp = ftab; tp != 0; tp = tp->f_next) {
706*4f1223e8SApple OSS Distributions 		if (tp->f_type == INVISIBLE) {
707*4f1223e8SApple OSS Distributions 			continue;
708*4f1223e8SApple OSS Distributions 		}
709*4f1223e8SApple OSS Distributions 		if (tp->f_fn[strlen(tp->f_fn) - 1] != ext) {
710*4f1223e8SApple OSS Distributions 			continue;
711*4f1223e8SApple OSS Distributions 		}
712*4f1223e8SApple OSS Distributions 		/*
713*4f1223e8SApple OSS Distributions 		 * Always generate a newline.
714*4f1223e8SApple OSS Distributions 		 * Our Makefile's aren't readable anyway.
715*4f1223e8SApple OSS Distributions 		 */
716*4f1223e8SApple OSS Distributions 
717*4f1223e8SApple OSS Distributions 		lpos = 8;
718*4f1223e8SApple OSS Distributions 		fprintf(fp, "\\\n\t");
719*4f1223e8SApple OSS Distributions 		put_source_file_name(fp, tp);
720*4f1223e8SApple OSS Distributions 		lpos += len + 1;
721*4f1223e8SApple OSS Distributions 	}
722*4f1223e8SApple OSS Distributions 	putc('\n', fp);
723*4f1223e8SApple OSS Distributions }
724*4f1223e8SApple OSS Distributions 
725*4f1223e8SApple OSS Distributions /*
726*4f1223e8SApple OSS Distributions  *  Include machine dependent makefile in output
727*4f1223e8SApple OSS Distributions  */
728*4f1223e8SApple OSS Distributions 
729*4f1223e8SApple OSS Distributions void
do_machdep(FILE * ofp)730*4f1223e8SApple OSS Distributions do_machdep(FILE *ofp)
731*4f1223e8SApple OSS Distributions {
732*4f1223e8SApple OSS Distributions 	FILE *ifp;
733*4f1223e8SApple OSS Distributions 	char pname[BUFSIZ];
734*4f1223e8SApple OSS Distributions 	char line[BUFSIZ];
735*4f1223e8SApple OSS Distributions 
736*4f1223e8SApple OSS Distributions 	(void) sprintf(line, "%s/Makefile.%s", config_directory, machinename);
737*4f1223e8SApple OSS Distributions 	ifp = fopenp(VPATH, line, pname, "r");
738*4f1223e8SApple OSS Distributions 	if (ifp == 0) {
739*4f1223e8SApple OSS Distributions 		perror(line);
740*4f1223e8SApple OSS Distributions 		exit(1);
741*4f1223e8SApple OSS Distributions 	}
742*4f1223e8SApple OSS Distributions 	while (fgets(line, BUFSIZ, ifp) != 0) {
743*4f1223e8SApple OSS Distributions 		if (profiling && (strncmp(line, "LIBS=", 5) == 0)) {
744*4f1223e8SApple OSS Distributions 			fprintf(ofp, "LIBS=${LIBS_P}\n");
745*4f1223e8SApple OSS Distributions 		} else {
746*4f1223e8SApple OSS Distributions 			fputs(line, ofp);
747*4f1223e8SApple OSS Distributions 		}
748*4f1223e8SApple OSS Distributions 	}
749*4f1223e8SApple OSS Distributions 	fclose(ifp);
750*4f1223e8SApple OSS Distributions }
751*4f1223e8SApple OSS Distributions 
752*4f1223e8SApple OSS Distributions const char *
tail(const char * fn)753*4f1223e8SApple OSS Distributions tail(const char *fn)
754*4f1223e8SApple OSS Distributions {
755*4f1223e8SApple OSS Distributions 	const char *cp;
756*4f1223e8SApple OSS Distributions 
757*4f1223e8SApple OSS Distributions 	cp = rindex(fn, '/');
758*4f1223e8SApple OSS Distributions 	if (cp == 0) {
759*4f1223e8SApple OSS Distributions 		return fn;
760*4f1223e8SApple OSS Distributions 	}
761*4f1223e8SApple OSS Distributions 	return cp + 1;
762*4f1223e8SApple OSS Distributions }
763*4f1223e8SApple OSS Distributions 
764*4f1223e8SApple OSS Distributions /*
765*4f1223e8SApple OSS Distributions  * Create the makerules for each file
766*4f1223e8SApple OSS Distributions  * which is part of the system.
767*4f1223e8SApple OSS Distributions  * Devices are processed with the special c2 option -i
768*4f1223e8SApple OSS Distributions  * which avoids any problem areas with i/o addressing
769*4f1223e8SApple OSS Distributions  * (e.g. for the VAX); assembler files are processed by as.
770*4f1223e8SApple OSS Distributions  */
771*4f1223e8SApple OSS Distributions void
do_rules(FILE * f)772*4f1223e8SApple OSS Distributions do_rules(FILE *f)
773*4f1223e8SApple OSS Distributions {
774*4f1223e8SApple OSS Distributions 	char *cp;
775*4f1223e8SApple OSS Distributions 	char *np, och;
776*4f1223e8SApple OSS Distributions 	const char *tp;
777*4f1223e8SApple OSS Distributions 	struct file_list *ftp;
778*4f1223e8SApple OSS Distributions 	const char *extras = ""; /* dvw: init to "" */
779*4f1223e8SApple OSS Distributions 	char *source_dir;
780*4f1223e8SApple OSS Distributions 	char och_upper;
781*4f1223e8SApple OSS Distributions 	const char *nl = "";
782*4f1223e8SApple OSS Distributions 
783*4f1223e8SApple OSS Distributions 	for (ftp = ftab; ftp != 0; ftp = ftp->f_next) {
784*4f1223e8SApple OSS Distributions 		if (ftp->f_type == INVISIBLE) {
785*4f1223e8SApple OSS Distributions 			continue;
786*4f1223e8SApple OSS Distributions 		}
787*4f1223e8SApple OSS Distributions 		cp = (np = ftp->f_fn) + strlen(ftp->f_fn) - 1;
788*4f1223e8SApple OSS Distributions 		och = *cp;
789*4f1223e8SApple OSS Distributions 		/*
790*4f1223e8SApple OSS Distributions 		 *	Don't compile '.o' files
791*4f1223e8SApple OSS Distributions 		 */
792*4f1223e8SApple OSS Distributions 		if (och == 'o') {
793*4f1223e8SApple OSS Distributions 			continue;
794*4f1223e8SApple OSS Distributions 		}
795*4f1223e8SApple OSS Distributions 		/*
796*4f1223e8SApple OSS Distributions 		 *	Determine where sources should come from
797*4f1223e8SApple OSS Distributions 		 */
798*4f1223e8SApple OSS Distributions 		if ((np[0] == '.') && (np[1] == '/')) {
799*4f1223e8SApple OSS Distributions 			source_dir = "";
800*4f1223e8SApple OSS Distributions 			np += 2;
801*4f1223e8SApple OSS Distributions 		} else {
802*4f1223e8SApple OSS Distributions 			source_dir = "$(SOURCE_DIR)/";
803*4f1223e8SApple OSS Distributions 		}
804*4f1223e8SApple OSS Distributions 		*cp = '\0';
805*4f1223e8SApple OSS Distributions 		tp = tail(np);  /* dvw: init tp before 'if' */
806*4f1223e8SApple OSS Distributions 		fprintf(f, "-include %sd\n", tp);
807*4f1223e8SApple OSS Distributions 		switch (ftp->f_flags & BOUND_CHECKS_MASK) {
808*4f1223e8SApple OSS Distributions 		case BOUND_CHECKS_PENDING:
809*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS_PENDING}\n", tp);
810*4f1223e8SApple OSS Distributions 			break;
811*4f1223e8SApple OSS Distributions 		case BOUND_CHECKS:
812*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS}\n", tp);
813*4f1223e8SApple OSS Distributions 			break;
814*4f1223e8SApple OSS Distributions 		case BOUND_CHECKS_SOFT:
815*4f1223e8SApple OSS Distributions 			fprintf(f, "ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE)\n");
816*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS_PENDING}\n", tp);
817*4f1223e8SApple OSS Distributions 			fprintf(f, "else\n");
818*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS}\n", tp);
819*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS_SOFT}\n", tp);
820*4f1223e8SApple OSS Distributions 			fprintf(f, "endif # CURRENT_KERNEL_CONFIG\n");
821*4f1223e8SApple OSS Distributions 			break;
822*4f1223e8SApple OSS Distributions 		case BOUND_CHECKS_DEBUG:
823*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS}\n", tp);
824*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS_DEBUG}\n", tp);
825*4f1223e8SApple OSS Distributions 			break;
826*4f1223e8SApple OSS Distributions 		case BOUND_CHECKS_SEED:
827*4f1223e8SApple OSS Distributions 			fprintf(f, "ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE)\n");
828*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS}\n", tp);
829*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS_SOFT}\n", tp);
830*4f1223e8SApple OSS Distributions 			fprintf(f, "else\n");
831*4f1223e8SApple OSS Distributions 			fprintf(f, "%so_CFLAGS_ADD += ${CFLAGS_BOUND_CHECKS}\n", tp);
832*4f1223e8SApple OSS Distributions 			fprintf(f, "endif # CURRENT_KERNEL_CONFIG\n");
833*4f1223e8SApple OSS Distributions 			break;
834*4f1223e8SApple OSS Distributions 		}
835*4f1223e8SApple OSS Distributions 		fprintf(f, "%so: %s%s%c\n", tp, source_dir, np, och);
836*4f1223e8SApple OSS Distributions 		if (och == 's') {
837*4f1223e8SApple OSS Distributions 			fprintf(f, "\t${S_RULE_0}\n");
838*4f1223e8SApple OSS Distributions 			fprintf(f, "\t${S_RULE_1A} %s%.*s${S_RULE_1B}%s\n",
839*4f1223e8SApple OSS Distributions 			    source_dir, (int)(tp - np), np, nl);
840*4f1223e8SApple OSS Distributions 			fprintf(f, "\t${S_RULE_2}%s\n", nl);
841*4f1223e8SApple OSS Distributions 			continue;
842*4f1223e8SApple OSS Distributions 		}
843*4f1223e8SApple OSS Distributions 		extras = "";
844*4f1223e8SApple OSS Distributions 		switch (ftp->f_type) {
845*4f1223e8SApple OSS Distributions 		case NORMAL:
846*4f1223e8SApple OSS Distributions 			goto common;
847*4f1223e8SApple OSS Distributions 			break;
848*4f1223e8SApple OSS Distributions 
849*4f1223e8SApple OSS Distributions 		case DRIVER:
850*4f1223e8SApple OSS Distributions 			extras = "_D";
851*4f1223e8SApple OSS Distributions 			goto common;
852*4f1223e8SApple OSS Distributions 			break;
853*4f1223e8SApple OSS Distributions 
854*4f1223e8SApple OSS Distributions 		case PROFILING:
855*4f1223e8SApple OSS Distributions 			if (!profiling) {
856*4f1223e8SApple OSS Distributions 				continue;
857*4f1223e8SApple OSS Distributions 			}
858*4f1223e8SApple OSS Distributions 			if (COPTS == 0) {
859*4f1223e8SApple OSS Distributions 				fprintf(stderr,
860*4f1223e8SApple OSS Distributions 				    "config: COPTS undefined in generic makefile");
861*4f1223e8SApple OSS Distributions 				COPTS = "";
862*4f1223e8SApple OSS Distributions 			}
863*4f1223e8SApple OSS Distributions 			extras = "_P";
864*4f1223e8SApple OSS Distributions 			goto common;
865*4f1223e8SApple OSS Distributions 
866*4f1223e8SApple OSS Distributions common:
867*4f1223e8SApple OSS Distributions 			och_upper = och + 'A' - 'a';
868*4f1223e8SApple OSS Distributions 			fprintf(f, "\t${%c_RULE_0%s}\n", och_upper, extras);
869*4f1223e8SApple OSS Distributions 			fprintf(f, "\t${%c_RULE_1A%s}", och_upper, extras);
870*4f1223e8SApple OSS Distributions 			if (ftp->f_extra) {
871*4f1223e8SApple OSS Distributions 				fprintf(f, "%s", ftp->f_extra);
872*4f1223e8SApple OSS Distributions 			}
873*4f1223e8SApple OSS Distributions 			fprintf(f, " %s%.*s${%c_RULE_1B%s}%s\n",
874*4f1223e8SApple OSS Distributions 			    source_dir, (int)(tp - np), np, och_upper, extras, nl);
875*4f1223e8SApple OSS Distributions 
876*4f1223e8SApple OSS Distributions 			fprintf(f, "\t${%c_RULE_2%s}%s\n", och_upper, extras, nl);
877*4f1223e8SApple OSS Distributions 			fprintf(f, "\t${%c_RULE_3%s}%s\n", och_upper, extras, nl);
878*4f1223e8SApple OSS Distributions 			fprintf(f, "\t${%c_RULE_4%s}%s\n", och_upper, extras, nl);
879*4f1223e8SApple OSS Distributions 			break;
880*4f1223e8SApple OSS Distributions 
881*4f1223e8SApple OSS Distributions 		default:
882*4f1223e8SApple OSS Distributions 			printf("Don't know rules for %s\n", np);
883*4f1223e8SApple OSS Distributions 			break;
884*4f1223e8SApple OSS Distributions 		}
885*4f1223e8SApple OSS Distributions 		*cp = och;
886*4f1223e8SApple OSS Distributions 	}
887*4f1223e8SApple OSS Distributions }
888*4f1223e8SApple OSS Distributions 
889*4f1223e8SApple OSS Distributions char *
allCaps(char * str)890*4f1223e8SApple OSS Distributions allCaps(char *str)
891*4f1223e8SApple OSS Distributions {
892*4f1223e8SApple OSS Distributions 	char *cp = str;
893*4f1223e8SApple OSS Distributions 
894*4f1223e8SApple OSS Distributions 	while (*str) {
895*4f1223e8SApple OSS Distributions 		if (islower(*str)) {
896*4f1223e8SApple OSS Distributions 			*str = toupper(*str);
897*4f1223e8SApple OSS Distributions 		}
898*4f1223e8SApple OSS Distributions 		str++;
899*4f1223e8SApple OSS Distributions 	}
900*4f1223e8SApple OSS Distributions 	return cp;
901*4f1223e8SApple OSS Distributions }
902*4f1223e8SApple OSS Distributions 
903*4f1223e8SApple OSS Distributions #define OLDSALUTATION "# DO NOT DELETE THIS LINE"
904*4f1223e8SApple OSS Distributions 
905*4f1223e8SApple OSS Distributions #define LINESIZE 1024
906*4f1223e8SApple OSS Distributions static char makbuf[LINESIZE];           /* one line buffer for makefile */
907*4f1223e8SApple OSS Distributions 
908*4f1223e8SApple OSS Distributions void
copy_dependencies(FILE * makin,FILE * makout)909*4f1223e8SApple OSS Distributions copy_dependencies(FILE *makin, FILE *makout)
910*4f1223e8SApple OSS Distributions {
911*4f1223e8SApple OSS Distributions 	int oldlen = (sizeof OLDSALUTATION - 1);
912*4f1223e8SApple OSS Distributions 
913*4f1223e8SApple OSS Distributions 	while (fgets(makbuf, LINESIZE, makin) != NULL) {
914*4f1223e8SApple OSS Distributions 		if (!strncmp(makbuf, OLDSALUTATION, oldlen)) {
915*4f1223e8SApple OSS Distributions 			break;
916*4f1223e8SApple OSS Distributions 		}
917*4f1223e8SApple OSS Distributions 	}
918*4f1223e8SApple OSS Distributions 	while (fgets(makbuf, LINESIZE, makin) != NULL) {
919*4f1223e8SApple OSS Distributions 		if (oldlen != 0) {
920*4f1223e8SApple OSS Distributions 			if (makbuf[0] == '\n') {
921*4f1223e8SApple OSS Distributions 				continue;
922*4f1223e8SApple OSS Distributions 			} else {
923*4f1223e8SApple OSS Distributions 				oldlen = 0;
924*4f1223e8SApple OSS Distributions 			}
925*4f1223e8SApple OSS Distributions 		}
926*4f1223e8SApple OSS Distributions 		fputs(makbuf, makout);
927*4f1223e8SApple OSS Distributions 	}
928*4f1223e8SApple OSS Distributions }
929