xref: /titanic_50/usr/src/cmd/make/bin/misc.cc (revision 10d63b7db37a83b39c7f511cf9426c9d03ea0760)
1*10d63b7dSRichard Lowe /*
2*10d63b7dSRichard Lowe  * CDDL HEADER START
3*10d63b7dSRichard Lowe  *
4*10d63b7dSRichard Lowe  * The contents of this file are subject to the terms of the
5*10d63b7dSRichard Lowe  * Common Development and Distribution License (the "License").
6*10d63b7dSRichard Lowe  * You may not use this file except in compliance with the License.
7*10d63b7dSRichard Lowe  *
8*10d63b7dSRichard Lowe  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10d63b7dSRichard Lowe  * or http://www.opensolaris.org/os/licensing.
10*10d63b7dSRichard Lowe  * See the License for the specific language governing permissions
11*10d63b7dSRichard Lowe  * and limitations under the License.
12*10d63b7dSRichard Lowe  *
13*10d63b7dSRichard Lowe  * When distributing Covered Code, include this CDDL HEADER in each
14*10d63b7dSRichard Lowe  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10d63b7dSRichard Lowe  * If applicable, add the following below this CDDL HEADER, with the
16*10d63b7dSRichard Lowe  * fields enclosed by brackets "[]" replaced with your own identifying
17*10d63b7dSRichard Lowe  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10d63b7dSRichard Lowe  *
19*10d63b7dSRichard Lowe  * CDDL HEADER END
20*10d63b7dSRichard Lowe  */
21*10d63b7dSRichard Lowe /*
22*10d63b7dSRichard Lowe  * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
23*10d63b7dSRichard Lowe  * Use is subject to license terms.
24*10d63b7dSRichard Lowe  */
25*10d63b7dSRichard Lowe 
26*10d63b7dSRichard Lowe /*
27*10d63b7dSRichard Lowe  *	misc.cc
28*10d63b7dSRichard Lowe  *
29*10d63b7dSRichard Lowe  *	This file contains various unclassified routines. Some main groups:
30*10d63b7dSRichard Lowe  *		getname
31*10d63b7dSRichard Lowe  *		Memory allocation
32*10d63b7dSRichard Lowe  *		String handling
33*10d63b7dSRichard Lowe  *		Property handling
34*10d63b7dSRichard Lowe  *		Error message handling
35*10d63b7dSRichard Lowe  *		Make internal state dumping
36*10d63b7dSRichard Lowe  *		main routine support
37*10d63b7dSRichard Lowe  */
38*10d63b7dSRichard Lowe 
39*10d63b7dSRichard Lowe /*
40*10d63b7dSRichard Lowe  * Included files
41*10d63b7dSRichard Lowe  */
42*10d63b7dSRichard Lowe #include <errno.h>
43*10d63b7dSRichard Lowe #include <mk/defs.h>
44*10d63b7dSRichard Lowe #include <mksh/macro.h>		/* SETVAR() */
45*10d63b7dSRichard Lowe #include <mksh/misc.h>		/* enable_interrupt() */
46*10d63b7dSRichard Lowe #include <stdarg.h>		/* va_list, va_start(), va_end() */
47*10d63b7dSRichard Lowe #include <vroot/report.h>	/* SUNPRO_DEPENDENCIES */
48*10d63b7dSRichard Lowe #include <libintl.h>
49*10d63b7dSRichard Lowe 
50*10d63b7dSRichard Lowe extern void job_adjust_fini();
51*10d63b7dSRichard Lowe 
52*10d63b7dSRichard Lowe /*
53*10d63b7dSRichard Lowe  * Defined macros
54*10d63b7dSRichard Lowe  */
55*10d63b7dSRichard Lowe 
56*10d63b7dSRichard Lowe /*
57*10d63b7dSRichard Lowe  * typedefs & structs
58*10d63b7dSRichard Lowe  */
59*10d63b7dSRichard Lowe 
60*10d63b7dSRichard Lowe /*
61*10d63b7dSRichard Lowe  * Static variables
62*10d63b7dSRichard Lowe  */
63*10d63b7dSRichard Lowe 
64*10d63b7dSRichard Lowe /*
65*10d63b7dSRichard Lowe  * File table of contents
66*10d63b7dSRichard Lowe  */
67*10d63b7dSRichard Lowe static	void		print_rule(register Name target);
68*10d63b7dSRichard Lowe static	void		print_target_n_deps(register Name target);
69*10d63b7dSRichard Lowe 
70*10d63b7dSRichard Lowe /*****************************************
71*10d63b7dSRichard Lowe  *
72*10d63b7dSRichard Lowe  *	getname
73*10d63b7dSRichard Lowe  */
74*10d63b7dSRichard Lowe 
75*10d63b7dSRichard Lowe /*****************************************
76*10d63b7dSRichard Lowe  *
77*10d63b7dSRichard Lowe  *	Memory allocation
78*10d63b7dSRichard Lowe  */
79*10d63b7dSRichard Lowe 
80*10d63b7dSRichard Lowe /*
81*10d63b7dSRichard Lowe  *	free_chain()
82*10d63b7dSRichard Lowe  *
83*10d63b7dSRichard Lowe  *	frees a chain of Name_vector's
84*10d63b7dSRichard Lowe  *
85*10d63b7dSRichard Lowe  *	Parameters:
86*10d63b7dSRichard Lowe  *		ptr		Pointer to the first element in the chain
87*10d63b7dSRichard Lowe  *				to be freed.
88*10d63b7dSRichard Lowe  *
89*10d63b7dSRichard Lowe  *	Global variables used:
90*10d63b7dSRichard Lowe  */
91*10d63b7dSRichard Lowe void
free_chain(Name_vector ptr)92*10d63b7dSRichard Lowe free_chain(Name_vector ptr)
93*10d63b7dSRichard Lowe {
94*10d63b7dSRichard Lowe 	if (ptr != NULL) {
95*10d63b7dSRichard Lowe 		if (ptr->next != NULL) {
96*10d63b7dSRichard Lowe 			free_chain(ptr->next);
97*10d63b7dSRichard Lowe 		}
98*10d63b7dSRichard Lowe 		free((char *) ptr);
99*10d63b7dSRichard Lowe 	}
100*10d63b7dSRichard Lowe }
101*10d63b7dSRichard Lowe 
102*10d63b7dSRichard Lowe /*****************************************
103*10d63b7dSRichard Lowe  *
104*10d63b7dSRichard Lowe  *	String manipulation
105*10d63b7dSRichard Lowe  */
106*10d63b7dSRichard Lowe 
107*10d63b7dSRichard Lowe /*****************************************
108*10d63b7dSRichard Lowe  *
109*10d63b7dSRichard Lowe  *	Nameblock property handling
110*10d63b7dSRichard Lowe  */
111*10d63b7dSRichard Lowe 
112*10d63b7dSRichard Lowe /*****************************************
113*10d63b7dSRichard Lowe  *
114*10d63b7dSRichard Lowe  *	Error message handling
115*10d63b7dSRichard Lowe  */
116*10d63b7dSRichard Lowe 
117*10d63b7dSRichard Lowe /*
118*10d63b7dSRichard Lowe  *	fatal(format, args...)
119*10d63b7dSRichard Lowe  *
120*10d63b7dSRichard Lowe  *	Print a message and die
121*10d63b7dSRichard Lowe  *
122*10d63b7dSRichard Lowe  *	Parameters:
123*10d63b7dSRichard Lowe  *		format		printf type format string
124*10d63b7dSRichard Lowe  *		args		Arguments to match the format
125*10d63b7dSRichard Lowe  *
126*10d63b7dSRichard Lowe  *	Global variables used:
127*10d63b7dSRichard Lowe  *		fatal_in_progress Indicates if this is a recursive call
128*10d63b7dSRichard Lowe  *		parallel_process_cnt Do we need to wait for anything?
129*10d63b7dSRichard Lowe  *		report_pwd	Should we report the current path?
130*10d63b7dSRichard Lowe  */
131*10d63b7dSRichard Lowe /*VARARGS*/
132*10d63b7dSRichard Lowe void
fatal(const char * message,...)133*10d63b7dSRichard Lowe fatal(const char *message, ...)
134*10d63b7dSRichard Lowe {
135*10d63b7dSRichard Lowe 	va_list args;
136*10d63b7dSRichard Lowe 
137*10d63b7dSRichard Lowe 	va_start(args, message);
138*10d63b7dSRichard Lowe 	(void) fflush(stdout);
139*10d63b7dSRichard Lowe 	(void) fprintf(stderr, gettext("%s: Fatal error: "), getprogname());
140*10d63b7dSRichard Lowe 	(void) vfprintf(stderr, message, args);
141*10d63b7dSRichard Lowe 	(void) fprintf(stderr, "\n");
142*10d63b7dSRichard Lowe 	va_end(args);
143*10d63b7dSRichard Lowe 	if (report_pwd) {
144*10d63b7dSRichard Lowe 		(void) fprintf(stderr,
145*10d63b7dSRichard Lowe 			       gettext("Current working directory %s\n"),
146*10d63b7dSRichard Lowe 			       get_current_path());
147*10d63b7dSRichard Lowe 	}
148*10d63b7dSRichard Lowe 	(void) fflush(stderr);
149*10d63b7dSRichard Lowe 	if (fatal_in_progress) {
150*10d63b7dSRichard Lowe 		exit_status = 1;
151*10d63b7dSRichard Lowe 		exit(1);
152*10d63b7dSRichard Lowe 	}
153*10d63b7dSRichard Lowe 	fatal_in_progress = true;
154*10d63b7dSRichard Lowe 	/* Let all parallel children finish */
155*10d63b7dSRichard Lowe 	if ((dmake_mode_type == parallel_mode) &&
156*10d63b7dSRichard Lowe 	    (parallel_process_cnt > 0)) {
157*10d63b7dSRichard Lowe 		(void) fprintf(stderr,
158*10d63b7dSRichard Lowe 			       gettext("Waiting for %d %s to finish\n"),
159*10d63b7dSRichard Lowe 			       parallel_process_cnt,
160*10d63b7dSRichard Lowe 			       parallel_process_cnt == 1 ?
161*10d63b7dSRichard Lowe 			       gettext("job") : gettext("jobs"));
162*10d63b7dSRichard Lowe 		(void) fflush(stderr);
163*10d63b7dSRichard Lowe 	}
164*10d63b7dSRichard Lowe 
165*10d63b7dSRichard Lowe 	while (parallel_process_cnt > 0) {
166*10d63b7dSRichard Lowe 		await_parallel(true);
167*10d63b7dSRichard Lowe 		finish_children(false);
168*10d63b7dSRichard Lowe 	}
169*10d63b7dSRichard Lowe 
170*10d63b7dSRichard Lowe 	job_adjust_fini();
171*10d63b7dSRichard Lowe 
172*10d63b7dSRichard Lowe 	exit_status = 1;
173*10d63b7dSRichard Lowe 	exit(1);
174*10d63b7dSRichard Lowe }
175*10d63b7dSRichard Lowe 
176*10d63b7dSRichard Lowe /*
177*10d63b7dSRichard Lowe  *	warning(format, args...)
178*10d63b7dSRichard Lowe  *
179*10d63b7dSRichard Lowe  *	Print a message and continue.
180*10d63b7dSRichard Lowe  *
181*10d63b7dSRichard Lowe  *	Parameters:
182*10d63b7dSRichard Lowe  *		format		printf type format string
183*10d63b7dSRichard Lowe  *		args		Arguments to match the format
184*10d63b7dSRichard Lowe  *
185*10d63b7dSRichard Lowe  *	Global variables used:
186*10d63b7dSRichard Lowe  *		report_pwd	Should we report the current path?
187*10d63b7dSRichard Lowe  */
188*10d63b7dSRichard Lowe /*VARARGS*/
189*10d63b7dSRichard Lowe void
warning(char * message,...)190*10d63b7dSRichard Lowe warning(char * message, ...)
191*10d63b7dSRichard Lowe {
192*10d63b7dSRichard Lowe 	va_list args;
193*10d63b7dSRichard Lowe 
194*10d63b7dSRichard Lowe 	va_start(args, message);
195*10d63b7dSRichard Lowe 	(void) fflush(stdout);
196*10d63b7dSRichard Lowe 	(void) fprintf(stderr, gettext("%s: Warning: "), getprogname());
197*10d63b7dSRichard Lowe 	(void) vfprintf(stderr, message, args);
198*10d63b7dSRichard Lowe 	(void) fprintf(stderr, "\n");
199*10d63b7dSRichard Lowe 	va_end(args);
200*10d63b7dSRichard Lowe 	if (report_pwd) {
201*10d63b7dSRichard Lowe 		(void) fprintf(stderr,
202*10d63b7dSRichard Lowe 			       gettext("Current working directory %s\n"),
203*10d63b7dSRichard Lowe 			       get_current_path());
204*10d63b7dSRichard Lowe 	}
205*10d63b7dSRichard Lowe 	(void) fflush(stderr);
206*10d63b7dSRichard Lowe }
207*10d63b7dSRichard Lowe 
208*10d63b7dSRichard Lowe /*
209*10d63b7dSRichard Lowe  *	time_to_string(time)
210*10d63b7dSRichard Lowe  *
211*10d63b7dSRichard Lowe  *	Take a numeric time value and produce
212*10d63b7dSRichard Lowe  *	a proper string representation.
213*10d63b7dSRichard Lowe  *
214*10d63b7dSRichard Lowe  *	Return value:
215*10d63b7dSRichard Lowe  *				The string representation of the time
216*10d63b7dSRichard Lowe  *
217*10d63b7dSRichard Lowe  *	Parameters:
218*10d63b7dSRichard Lowe  *		time		The time we need to translate
219*10d63b7dSRichard Lowe  *
220*10d63b7dSRichard Lowe  *	Global variables used:
221*10d63b7dSRichard Lowe  */
222*10d63b7dSRichard Lowe char *
time_to_string(const timestruc_t & time)223*10d63b7dSRichard Lowe time_to_string(const timestruc_t &time)
224*10d63b7dSRichard Lowe {
225*10d63b7dSRichard Lowe 	struct tm		*tm;
226*10d63b7dSRichard Lowe 	char			buf[128];
227*10d63b7dSRichard Lowe 
228*10d63b7dSRichard Lowe         if (time == file_doesnt_exist) {
229*10d63b7dSRichard Lowe                 return gettext("File does not exist");
230*10d63b7dSRichard Lowe         }
231*10d63b7dSRichard Lowe         if (time == file_max_time) {
232*10d63b7dSRichard Lowe                 return gettext("Younger than any file");
233*10d63b7dSRichard Lowe         }
234*10d63b7dSRichard Lowe 	tm = localtime(&time.tv_sec);
235*10d63b7dSRichard Lowe 	strftime(buf, sizeof (buf), "%c %Z", tm);
236*10d63b7dSRichard Lowe         buf[127] = (int) nul_char;
237*10d63b7dSRichard Lowe         return strdup(buf);
238*10d63b7dSRichard Lowe }
239*10d63b7dSRichard Lowe 
240*10d63b7dSRichard Lowe /*
241*10d63b7dSRichard Lowe  *	get_current_path()
242*10d63b7dSRichard Lowe  *
243*10d63b7dSRichard Lowe  *	Stuff current_path with the current path if it isnt there already.
244*10d63b7dSRichard Lowe  *
245*10d63b7dSRichard Lowe  *	Parameters:
246*10d63b7dSRichard Lowe  *
247*10d63b7dSRichard Lowe  *	Global variables used:
248*10d63b7dSRichard Lowe  */
249*10d63b7dSRichard Lowe char *
get_current_path(void)250*10d63b7dSRichard Lowe get_current_path(void)
251*10d63b7dSRichard Lowe {
252*10d63b7dSRichard Lowe 	char			pwd[(MAXPATHLEN * MB_LEN_MAX)];
253*10d63b7dSRichard Lowe 	static char		*current_path;
254*10d63b7dSRichard Lowe 
255*10d63b7dSRichard Lowe 	if (current_path == NULL) {
256*10d63b7dSRichard Lowe 		getcwd(pwd, sizeof(pwd));
257*10d63b7dSRichard Lowe 		if (pwd[0] == (int) nul_char) {
258*10d63b7dSRichard Lowe 			pwd[0] = (int) slash_char;
259*10d63b7dSRichard Lowe 			pwd[1] = (int) nul_char;
260*10d63b7dSRichard Lowe 		}
261*10d63b7dSRichard Lowe 		current_path = strdup(pwd);
262*10d63b7dSRichard Lowe 	}
263*10d63b7dSRichard Lowe 	return current_path;
264*10d63b7dSRichard Lowe }
265*10d63b7dSRichard Lowe 
266*10d63b7dSRichard Lowe /*****************************************
267*10d63b7dSRichard Lowe  *
268*10d63b7dSRichard Lowe  *	Make internal state dumping
269*10d63b7dSRichard Lowe  *
270*10d63b7dSRichard Lowe  *	This is a set  of routines for dumping the internal make state
271*10d63b7dSRichard Lowe  *	Used for the -p option
272*10d63b7dSRichard Lowe  */
273*10d63b7dSRichard Lowe 
274*10d63b7dSRichard Lowe /*
275*10d63b7dSRichard Lowe  *	dump_make_state()
276*10d63b7dSRichard Lowe  *
277*10d63b7dSRichard Lowe  *	Dump make's internal state to stdout
278*10d63b7dSRichard Lowe  *
279*10d63b7dSRichard Lowe  *	Parameters:
280*10d63b7dSRichard Lowe  *
281*10d63b7dSRichard Lowe  *	Global variables used:
282*10d63b7dSRichard Lowe  *		svr4 			Was ".SVR4" seen in makefile?
283*10d63b7dSRichard Lowe  *		svr4_name		The Name ".SVR4", printed
284*10d63b7dSRichard Lowe  *		posix			Was ".POSIX" seen in makefile?
285*10d63b7dSRichard Lowe  *		posix_name		The Name ".POSIX", printed
286*10d63b7dSRichard Lowe  *		default_rule		Points to the .DEFAULT rule
287*10d63b7dSRichard Lowe  *		default_rule_name	The Name ".DEFAULT", printed
288*10d63b7dSRichard Lowe  *		default_target_to_build	The first target to print
289*10d63b7dSRichard Lowe  *		dot_keep_state		The Name ".KEEP_STATE", printed
290*10d63b7dSRichard Lowe  *		dot_keep_state_file	The Name ".KEEP_STATE_FILE", printed
291*10d63b7dSRichard Lowe  *		hashtab			The make hash table for Name blocks
292*10d63b7dSRichard Lowe  *		ignore_errors		Was ".IGNORE" seen in makefile?
293*10d63b7dSRichard Lowe  *		ignore_name		The Name ".IGNORE", printed
294*10d63b7dSRichard Lowe  *		keep_state		Was ".KEEP_STATE" seen in makefile?
295*10d63b7dSRichard Lowe  *		percent_list		The list of % rules
296*10d63b7dSRichard Lowe  *		precious		The Name ".PRECIOUS", printed
297*10d63b7dSRichard Lowe  *		sccs_get_name		The Name ".SCCS_GET", printed
298*10d63b7dSRichard Lowe  *		sccs_get_posix_name	The Name ".SCCS_GET_POSIX", printed
299*10d63b7dSRichard Lowe  *		get_name		The Name ".GET", printed
300*10d63b7dSRichard Lowe  *		get_posix_name		The Name ".GET_POSIX", printed
301*10d63b7dSRichard Lowe  *		sccs_get_rule		Points to the ".SCCS_GET" rule
302*10d63b7dSRichard Lowe  *		silent			Was ".SILENT" seen in makefile?
303*10d63b7dSRichard Lowe  *		silent_name		The Name ".SILENT", printed
304*10d63b7dSRichard Lowe  *		suffixes		The suffix list from ".SUFFIXES"
305*10d63b7dSRichard Lowe  *		suffixes_name		The Name ".SUFFIX", printed
306*10d63b7dSRichard Lowe  */
307*10d63b7dSRichard Lowe void
dump_make_state(void)308*10d63b7dSRichard Lowe dump_make_state(void)
309*10d63b7dSRichard Lowe {
310*10d63b7dSRichard Lowe 	Name_set::iterator	p, e;
311*10d63b7dSRichard Lowe 	register Property	prop;
312*10d63b7dSRichard Lowe 	register Dependency	dep;
313*10d63b7dSRichard Lowe 	register Cmd_line	rule;
314*10d63b7dSRichard Lowe 	Percent			percent, percent_depe;
315*10d63b7dSRichard Lowe 
316*10d63b7dSRichard Lowe 	/* Default target */
317*10d63b7dSRichard Lowe 	if (default_target_to_build != NULL) {
318*10d63b7dSRichard Lowe 		print_rule(default_target_to_build);
319*10d63b7dSRichard Lowe 	}
320*10d63b7dSRichard Lowe 	(void) printf("\n");
321*10d63b7dSRichard Lowe 
322*10d63b7dSRichard Lowe 	/* .POSIX */
323*10d63b7dSRichard Lowe 	if (posix) {
324*10d63b7dSRichard Lowe 		(void) printf("%s:\n", posix_name->string_mb);
325*10d63b7dSRichard Lowe 	}
326*10d63b7dSRichard Lowe 
327*10d63b7dSRichard Lowe 	/* .DEFAULT */
328*10d63b7dSRichard Lowe 	if (default_rule != NULL) {
329*10d63b7dSRichard Lowe 		(void) printf("%s:\n", default_rule_name->string_mb);
330*10d63b7dSRichard Lowe 		for (rule = default_rule; rule != NULL; rule = rule->next) {
331*10d63b7dSRichard Lowe 			(void) printf("\t%s\n", rule->command_line->string_mb);
332*10d63b7dSRichard Lowe 		}
333*10d63b7dSRichard Lowe 	}
334*10d63b7dSRichard Lowe 
335*10d63b7dSRichard Lowe 	/* .IGNORE */
336*10d63b7dSRichard Lowe 	if (ignore_errors) {
337*10d63b7dSRichard Lowe 		(void) printf("%s:\n", ignore_name->string_mb);
338*10d63b7dSRichard Lowe 	}
339*10d63b7dSRichard Lowe 
340*10d63b7dSRichard Lowe 	/* .KEEP_STATE: */
341*10d63b7dSRichard Lowe 	if (keep_state) {
342*10d63b7dSRichard Lowe 		(void) printf("%s:\n\n", dot_keep_state->string_mb);
343*10d63b7dSRichard Lowe 	}
344*10d63b7dSRichard Lowe 
345*10d63b7dSRichard Lowe 	/* .PRECIOUS */
346*10d63b7dSRichard Lowe 	(void) printf("%s:", precious->string_mb);
347*10d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
348*10d63b7dSRichard Lowe 			if ((p->stat.is_precious) || (all_precious)) {
349*10d63b7dSRichard Lowe 				(void) printf(" %s", p->string_mb);
350*10d63b7dSRichard Lowe 			}
351*10d63b7dSRichard Lowe 	}
352*10d63b7dSRichard Lowe 	(void) printf("\n");
353*10d63b7dSRichard Lowe 
354*10d63b7dSRichard Lowe 	/* .SCCS_GET */
355*10d63b7dSRichard Lowe 	if (sccs_get_rule != NULL) {
356*10d63b7dSRichard Lowe 		(void) printf("%s:\n", sccs_get_name->string_mb);
357*10d63b7dSRichard Lowe 		for (rule = sccs_get_rule; rule != NULL; rule = rule->next) {
358*10d63b7dSRichard Lowe 			(void) printf("\t%s\n", rule->command_line->string_mb);
359*10d63b7dSRichard Lowe 		}
360*10d63b7dSRichard Lowe 	}
361*10d63b7dSRichard Lowe 
362*10d63b7dSRichard Lowe 	/* .SILENT */
363*10d63b7dSRichard Lowe 	if (silent) {
364*10d63b7dSRichard Lowe 		(void) printf("%s:\n", silent_name->string_mb);
365*10d63b7dSRichard Lowe 	}
366*10d63b7dSRichard Lowe 
367*10d63b7dSRichard Lowe 	/* .SUFFIXES: */
368*10d63b7dSRichard Lowe 	(void) printf("%s:", suffixes_name->string_mb);
369*10d63b7dSRichard Lowe 	for (dep = suffixes; dep != NULL; dep = dep->next) {
370*10d63b7dSRichard Lowe 		(void) printf(" %s", dep->name->string_mb);
371*10d63b7dSRichard Lowe 		build_suffix_list(dep->name);
372*10d63b7dSRichard Lowe 	}
373*10d63b7dSRichard Lowe 	(void) printf("\n\n");
374*10d63b7dSRichard Lowe 
375*10d63b7dSRichard Lowe 	/* % rules */
376*10d63b7dSRichard Lowe 	for (percent = percent_list;
377*10d63b7dSRichard Lowe 	     percent != NULL;
378*10d63b7dSRichard Lowe 	     percent = percent->next) {
379*10d63b7dSRichard Lowe 		(void) printf("%s:",
380*10d63b7dSRichard Lowe 			      percent->name->string_mb);
381*10d63b7dSRichard Lowe 
382*10d63b7dSRichard Lowe 		for (percent_depe = percent->dependencies;
383*10d63b7dSRichard Lowe 		     percent_depe != NULL;
384*10d63b7dSRichard Lowe 		     percent_depe = percent_depe->next) {
385*10d63b7dSRichard Lowe 			(void) printf(" %s", percent_depe->name->string_mb);
386*10d63b7dSRichard Lowe 		}
387*10d63b7dSRichard Lowe 
388*10d63b7dSRichard Lowe 		(void) printf("\n");
389*10d63b7dSRichard Lowe 
390*10d63b7dSRichard Lowe 		for (rule = percent->command_template;
391*10d63b7dSRichard Lowe 		     rule != NULL;
392*10d63b7dSRichard Lowe 		     rule = rule->next) {
393*10d63b7dSRichard Lowe 			(void) printf("\t%s\n", rule->command_line->string_mb);
394*10d63b7dSRichard Lowe 		}
395*10d63b7dSRichard Lowe 	}
396*10d63b7dSRichard Lowe 
397*10d63b7dSRichard Lowe 	/* Suffix rules */
398*10d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
399*10d63b7dSRichard Lowe 			Wstring wcb(p);
400*10d63b7dSRichard Lowe 			if (wcb.get_string()[0] == (int) period_char) {
401*10d63b7dSRichard Lowe 				print_rule(p);
402*10d63b7dSRichard Lowe 			}
403*10d63b7dSRichard Lowe 	}
404*10d63b7dSRichard Lowe 
405*10d63b7dSRichard Lowe 	/* Macro assignments */
406*10d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
407*10d63b7dSRichard Lowe 			if (((prop = get_prop(p->prop, macro_prop)) != NULL) &&
408*10d63b7dSRichard Lowe 			    (prop->body.macro.value != NULL)) {
409*10d63b7dSRichard Lowe 				(void) printf("%s", p->string_mb);
410*10d63b7dSRichard Lowe 				print_value(prop->body.macro.value,
411*10d63b7dSRichard Lowe 					    (Daemon) prop->body.macro.daemon);
412*10d63b7dSRichard Lowe 			}
413*10d63b7dSRichard Lowe 	}
414*10d63b7dSRichard Lowe 	(void) printf("\n");
415*10d63b7dSRichard Lowe 
416*10d63b7dSRichard Lowe 	/* Conditional macro assignments */
417*10d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
418*10d63b7dSRichard Lowe 			for (prop = get_prop(p->prop, conditional_prop);
419*10d63b7dSRichard Lowe 			     prop != NULL;
420*10d63b7dSRichard Lowe 			     prop = get_prop(prop->next, conditional_prop)) {
421*10d63b7dSRichard Lowe 				(void) printf("%s := %s",
422*10d63b7dSRichard Lowe 					      p->string_mb,
423*10d63b7dSRichard Lowe 					      prop->body.conditional.name->
424*10d63b7dSRichard Lowe 					      string_mb);
425*10d63b7dSRichard Lowe 				if (prop->body.conditional.append) {
426*10d63b7dSRichard Lowe 					printf(" +");
427*10d63b7dSRichard Lowe 				}
428*10d63b7dSRichard Lowe 				else {
429*10d63b7dSRichard Lowe 					printf(" ");
430*10d63b7dSRichard Lowe 				}
431*10d63b7dSRichard Lowe 				print_value(prop->body.conditional.value,
432*10d63b7dSRichard Lowe 					    no_daemon);
433*10d63b7dSRichard Lowe 			}
434*10d63b7dSRichard Lowe 	}
435*10d63b7dSRichard Lowe 	(void) printf("\n");
436*10d63b7dSRichard Lowe 
437*10d63b7dSRichard Lowe 	/* All other dependencies */
438*10d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
439*10d63b7dSRichard Lowe 			if (p->colons != no_colon) {
440*10d63b7dSRichard Lowe 				print_rule(p);
441*10d63b7dSRichard Lowe 			}
442*10d63b7dSRichard Lowe 	}
443*10d63b7dSRichard Lowe 	(void) printf("\n");
444*10d63b7dSRichard Lowe }
445*10d63b7dSRichard Lowe 
446*10d63b7dSRichard Lowe /*
447*10d63b7dSRichard Lowe  *	print_rule(target)
448*10d63b7dSRichard Lowe  *
449*10d63b7dSRichard Lowe  *	Print the rule for one target
450*10d63b7dSRichard Lowe  *
451*10d63b7dSRichard Lowe  *	Parameters:
452*10d63b7dSRichard Lowe  *		target		Target we print rule for
453*10d63b7dSRichard Lowe  *
454*10d63b7dSRichard Lowe  *	Global variables used:
455*10d63b7dSRichard Lowe  */
456*10d63b7dSRichard Lowe static void
print_rule(register Name target)457*10d63b7dSRichard Lowe print_rule(register Name target)
458*10d63b7dSRichard Lowe {
459*10d63b7dSRichard Lowe 	register Cmd_line	rule;
460*10d63b7dSRichard Lowe 	register Property	line;
461*10d63b7dSRichard Lowe 	register Dependency	dependency;
462*10d63b7dSRichard Lowe 
463*10d63b7dSRichard Lowe 	if (target->dependency_printed ||
464*10d63b7dSRichard Lowe 	    ((line = get_prop(target->prop, line_prop)) == NULL) ||
465*10d63b7dSRichard Lowe 	    ((line->body.line.command_template == NULL) &&
466*10d63b7dSRichard Lowe 	     (line->body.line.dependencies == NULL))) {
467*10d63b7dSRichard Lowe 		return;
468*10d63b7dSRichard Lowe 	}
469*10d63b7dSRichard Lowe 	target->dependency_printed = true;
470*10d63b7dSRichard Lowe 
471*10d63b7dSRichard Lowe 	(void) printf("%s:", target->string_mb);
472*10d63b7dSRichard Lowe 
473*10d63b7dSRichard Lowe 	for (dependency = line->body.line.dependencies;
474*10d63b7dSRichard Lowe 	     dependency != NULL;
475*10d63b7dSRichard Lowe 	     dependency = dependency->next) {
476*10d63b7dSRichard Lowe 		(void) printf(" %s", dependency->name->string_mb);
477*10d63b7dSRichard Lowe 	}
478*10d63b7dSRichard Lowe 
479*10d63b7dSRichard Lowe 	(void) printf("\n");
480*10d63b7dSRichard Lowe 
481*10d63b7dSRichard Lowe 	for (rule = line->body.line.command_template;
482*10d63b7dSRichard Lowe 	     rule != NULL;
483*10d63b7dSRichard Lowe 	     rule = rule->next) {
484*10d63b7dSRichard Lowe 		(void) printf("\t%s\n", rule->command_line->string_mb);
485*10d63b7dSRichard Lowe 	}
486*10d63b7dSRichard Lowe }
487*10d63b7dSRichard Lowe 
488*10d63b7dSRichard Lowe void
dump_target_list(void)489*10d63b7dSRichard Lowe dump_target_list(void)
490*10d63b7dSRichard Lowe {
491*10d63b7dSRichard Lowe 	Name_set::iterator	p, e;
492*10d63b7dSRichard Lowe 	Wstring	str;
493*10d63b7dSRichard Lowe 
494*10d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
495*10d63b7dSRichard Lowe 			str.init(p);
496*10d63b7dSRichard Lowe 			wchar_t * wcb = str.get_string();
497*10d63b7dSRichard Lowe 			if ((p->colons != no_colon) &&
498*10d63b7dSRichard Lowe 			    ((wcb[0] != (int) period_char) ||
499*10d63b7dSRichard Lowe 			     ((wcb[0] == (int) period_char) &&
500*10d63b7dSRichard Lowe 			      (wcschr(wcb, (int) slash_char))))) {
501*10d63b7dSRichard Lowe 				print_target_n_deps(p);
502*10d63b7dSRichard Lowe 			}
503*10d63b7dSRichard Lowe 	}
504*10d63b7dSRichard Lowe }
505*10d63b7dSRichard Lowe 
506*10d63b7dSRichard Lowe static void
print_target_n_deps(register Name target)507*10d63b7dSRichard Lowe print_target_n_deps(register Name target)
508*10d63b7dSRichard Lowe {
509*10d63b7dSRichard Lowe 	register Cmd_line	rule;
510*10d63b7dSRichard Lowe 	register Property	line;
511*10d63b7dSRichard Lowe 	register Dependency	dependency;
512*10d63b7dSRichard Lowe 
513*10d63b7dSRichard Lowe 	if (target->dependency_printed) {
514*10d63b7dSRichard Lowe 		return;
515*10d63b7dSRichard Lowe 	}
516*10d63b7dSRichard Lowe 	target->dependency_printed = true;
517*10d63b7dSRichard Lowe 
518*10d63b7dSRichard Lowe 	(void) printf("%s\n", target->string_mb);
519*10d63b7dSRichard Lowe 
520*10d63b7dSRichard Lowe 	if ((line = get_prop(target->prop, line_prop)) == NULL) {
521*10d63b7dSRichard Lowe 		return;
522*10d63b7dSRichard Lowe 	}
523*10d63b7dSRichard Lowe 	for (dependency = line->body.line.dependencies;
524*10d63b7dSRichard Lowe 	     dependency != NULL;
525*10d63b7dSRichard Lowe 	     dependency = dependency->next) {
526*10d63b7dSRichard Lowe 		if (!dependency->automatic) {
527*10d63b7dSRichard Lowe 			print_target_n_deps(dependency->name);
528*10d63b7dSRichard Lowe 		}
529*10d63b7dSRichard Lowe 	}
530*10d63b7dSRichard Lowe }
531*10d63b7dSRichard Lowe 
532*10d63b7dSRichard Lowe /*****************************************
533*10d63b7dSRichard Lowe  *
534*10d63b7dSRichard Lowe  *	main() support
535*10d63b7dSRichard Lowe  */
536*10d63b7dSRichard Lowe 
537*10d63b7dSRichard Lowe /*
538*10d63b7dSRichard Lowe  *	load_cached_names()
539*10d63b7dSRichard Lowe  *
540*10d63b7dSRichard Lowe  *	Load the vector of cached names
541*10d63b7dSRichard Lowe  *
542*10d63b7dSRichard Lowe  *	Parameters:
543*10d63b7dSRichard Lowe  *
544*10d63b7dSRichard Lowe  *	Global variables used:
545*10d63b7dSRichard Lowe  *		Many many pointers to Name blocks.
546*10d63b7dSRichard Lowe  */
547*10d63b7dSRichard Lowe void
load_cached_names(void)548*10d63b7dSRichard Lowe load_cached_names(void)
549*10d63b7dSRichard Lowe {
550*10d63b7dSRichard Lowe 	char		*cp;
551*10d63b7dSRichard Lowe 	Name		dollar;
552*10d63b7dSRichard Lowe 
553*10d63b7dSRichard Lowe 	/* Load the cached_names struct */
554*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".BUILT_LAST_MAKE_RUN");
555*10d63b7dSRichard Lowe 	built_last_make_run = GETNAME(wcs_buffer, FIND_LENGTH);
556*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "@");
557*10d63b7dSRichard Lowe 	c_at = GETNAME(wcs_buffer, FIND_LENGTH);
558*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, " *conditionals* ");
559*10d63b7dSRichard Lowe 	conditionals = GETNAME(wcs_buffer, FIND_LENGTH);
560*10d63b7dSRichard Lowe 	/*
561*10d63b7dSRichard Lowe 	 * A version of make was released with NSE 1.0 that used
562*10d63b7dSRichard Lowe 	 * VERSION-1.1 but this version is identical to VERSION-1.0.
563*10d63b7dSRichard Lowe 	 * The version mismatch code makes a special case for this
564*10d63b7dSRichard Lowe 	 * situation.  If the version number is changed from 1.0
565*10d63b7dSRichard Lowe 	 * it should go to 1.2.
566*10d63b7dSRichard Lowe 	 */
567*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "VERSION-1.0");
568*10d63b7dSRichard Lowe 	current_make_version = GETNAME(wcs_buffer, FIND_LENGTH);
569*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SVR4");
570*10d63b7dSRichard Lowe 	svr4_name = GETNAME(wcs_buffer, FIND_LENGTH);
571*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".POSIX");
572*10d63b7dSRichard Lowe 	posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
573*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".DEFAULT");
574*10d63b7dSRichard Lowe 	default_rule_name = GETNAME(wcs_buffer, FIND_LENGTH);
575*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "$");
576*10d63b7dSRichard Lowe 	dollar = GETNAME(wcs_buffer, FIND_LENGTH);
577*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".DONE");
578*10d63b7dSRichard Lowe 	done = GETNAME(wcs_buffer, FIND_LENGTH);
579*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".");
580*10d63b7dSRichard Lowe 	dot = GETNAME(wcs_buffer, FIND_LENGTH);
581*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".KEEP_STATE");
582*10d63b7dSRichard Lowe 	dot_keep_state = GETNAME(wcs_buffer, FIND_LENGTH);
583*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".KEEP_STATE_FILE");
584*10d63b7dSRichard Lowe 	dot_keep_state_file = GETNAME(wcs_buffer, FIND_LENGTH);
585*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "");
586*10d63b7dSRichard Lowe 	empty_name = GETNAME(wcs_buffer, FIND_LENGTH);
587*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, " FORCE");
588*10d63b7dSRichard Lowe 	force = GETNAME(wcs_buffer, FIND_LENGTH);
589*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "HOST_ARCH");
590*10d63b7dSRichard Lowe 	host_arch = GETNAME(wcs_buffer, FIND_LENGTH);
591*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "HOST_MACH");
592*10d63b7dSRichard Lowe 	host_mach = GETNAME(wcs_buffer, FIND_LENGTH);
593*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".IGNORE");
594*10d63b7dSRichard Lowe 	ignore_name = GETNAME(wcs_buffer, FIND_LENGTH);
595*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".INIT");
596*10d63b7dSRichard Lowe 	init = GETNAME(wcs_buffer, FIND_LENGTH);
597*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".LOCAL");
598*10d63b7dSRichard Lowe 	localhost_name = GETNAME(wcs_buffer, FIND_LENGTH);
599*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".make.state");
600*10d63b7dSRichard Lowe 	make_state = GETNAME(wcs_buffer, FIND_LENGTH);
601*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "MAKEFLAGS");
602*10d63b7dSRichard Lowe 	makeflags = GETNAME(wcs_buffer, FIND_LENGTH);
603*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".MAKE_VERSION");
604*10d63b7dSRichard Lowe 	make_version = GETNAME(wcs_buffer, FIND_LENGTH);
605*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".NO_PARALLEL");
606*10d63b7dSRichard Lowe 	no_parallel_name = GETNAME(wcs_buffer, FIND_LENGTH);
607*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".NOT_AUTO");
608*10d63b7dSRichard Lowe 	not_auto = GETNAME(wcs_buffer, FIND_LENGTH);
609*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".PARALLEL");
610*10d63b7dSRichard Lowe 	parallel_name = GETNAME(wcs_buffer, FIND_LENGTH);
611*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "PATH");
612*10d63b7dSRichard Lowe 	path_name = GETNAME(wcs_buffer, FIND_LENGTH);
613*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "+");
614*10d63b7dSRichard Lowe 	plus = GETNAME(wcs_buffer, FIND_LENGTH);
615*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".PRECIOUS");
616*10d63b7dSRichard Lowe 	precious = GETNAME(wcs_buffer, FIND_LENGTH);
617*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "?");
618*10d63b7dSRichard Lowe 	query = GETNAME(wcs_buffer, FIND_LENGTH);
619*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "^");
620*10d63b7dSRichard Lowe 	hat = GETNAME(wcs_buffer, FIND_LENGTH);
621*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".RECURSIVE");
622*10d63b7dSRichard Lowe 	recursive_name = GETNAME(wcs_buffer, FIND_LENGTH);
623*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SCCS_GET");
624*10d63b7dSRichard Lowe 	sccs_get_name = GETNAME(wcs_buffer, FIND_LENGTH);
625*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SCCS_GET_POSIX");
626*10d63b7dSRichard Lowe 	sccs_get_posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
627*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".GET");
628*10d63b7dSRichard Lowe 	get_name = GETNAME(wcs_buffer, FIND_LENGTH);
629*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".GET_POSIX");
630*10d63b7dSRichard Lowe 	get_posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
631*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "SHELL");
632*10d63b7dSRichard Lowe 	shell_name = GETNAME(wcs_buffer, FIND_LENGTH);
633*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SILENT");
634*10d63b7dSRichard Lowe 	silent_name = GETNAME(wcs_buffer, FIND_LENGTH);
635*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SUFFIXES");
636*10d63b7dSRichard Lowe 	suffixes_name = GETNAME(wcs_buffer, FIND_LENGTH);
637*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, SUNPRO_DEPENDENCIES);
638*10d63b7dSRichard Lowe 	sunpro_dependencies = GETNAME(wcs_buffer, FIND_LENGTH);
639*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "TARGET_ARCH");
640*10d63b7dSRichard Lowe 	target_arch = GETNAME(wcs_buffer, FIND_LENGTH);
641*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "TARGET_MACH");
642*10d63b7dSRichard Lowe 	target_mach = GETNAME(wcs_buffer, FIND_LENGTH);
643*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "VIRTUAL_ROOT");
644*10d63b7dSRichard Lowe 	virtual_root = GETNAME(wcs_buffer, FIND_LENGTH);
645*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "VPATH");
646*10d63b7dSRichard Lowe 	vpath_name = GETNAME(wcs_buffer, FIND_LENGTH);
647*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".WAIT");
648*10d63b7dSRichard Lowe 	wait_name = GETNAME(wcs_buffer, FIND_LENGTH);
649*10d63b7dSRichard Lowe 
650*10d63b7dSRichard Lowe 	wait_name->state = build_ok;
651*10d63b7dSRichard Lowe 
652*10d63b7dSRichard Lowe 	/* Mark special targets so that the reader treats them properly */
653*10d63b7dSRichard Lowe 	svr4_name->special_reader = svr4_special;
654*10d63b7dSRichard Lowe 	posix_name->special_reader = posix_special;
655*10d63b7dSRichard Lowe 	built_last_make_run->special_reader = built_last_make_run_special;
656*10d63b7dSRichard Lowe 	default_rule_name->special_reader = default_special;
657*10d63b7dSRichard Lowe 	dot_keep_state->special_reader = keep_state_special;
658*10d63b7dSRichard Lowe 	dot_keep_state_file->special_reader = keep_state_file_special;
659*10d63b7dSRichard Lowe 	ignore_name->special_reader = ignore_special;
660*10d63b7dSRichard Lowe 	make_version->special_reader = make_version_special;
661*10d63b7dSRichard Lowe 	no_parallel_name->special_reader = no_parallel_special;
662*10d63b7dSRichard Lowe 	parallel_name->special_reader = parallel_special;
663*10d63b7dSRichard Lowe 	localhost_name->special_reader = localhost_special;
664*10d63b7dSRichard Lowe 	precious->special_reader = precious_special;
665*10d63b7dSRichard Lowe 	sccs_get_name->special_reader = sccs_get_special;
666*10d63b7dSRichard Lowe 	sccs_get_posix_name->special_reader = sccs_get_posix_special;
667*10d63b7dSRichard Lowe 	get_name->special_reader = get_special;
668*10d63b7dSRichard Lowe 	get_posix_name->special_reader = get_posix_special;
669*10d63b7dSRichard Lowe 	silent_name->special_reader = silent_special;
670*10d63b7dSRichard Lowe 	suffixes_name->special_reader = suffixes_special;
671*10d63b7dSRichard Lowe 
672*10d63b7dSRichard Lowe 	/* The value of $$ is $ */
673*10d63b7dSRichard Lowe 	(void) SETVAR(dollar, dollar, false);
674*10d63b7dSRichard Lowe 	dollar->dollar = false;
675*10d63b7dSRichard Lowe 
676*10d63b7dSRichard Lowe 	/* Set the value of $(SHELL) */
677*10d63b7dSRichard Lowe 	if (posix) {
678*10d63b7dSRichard Lowe 	  MBSTOWCS(wcs_buffer, "/usr/xpg4/bin/sh");
679*10d63b7dSRichard Lowe 	} else {
680*10d63b7dSRichard Lowe 	  MBSTOWCS(wcs_buffer, "/bin/sh");
681*10d63b7dSRichard Lowe 	}
682*10d63b7dSRichard Lowe 	(void) SETVAR(shell_name, GETNAME(wcs_buffer, FIND_LENGTH), false);
683*10d63b7dSRichard Lowe 
684*10d63b7dSRichard Lowe 	/*
685*10d63b7dSRichard Lowe 	 * Use " FORCE" to simulate a FRC dependency for :: type
686*10d63b7dSRichard Lowe 	 * targets with no dependencies.
687*10d63b7dSRichard Lowe 	 */
688*10d63b7dSRichard Lowe 	(void) append_prop(force, line_prop);
689*10d63b7dSRichard Lowe 	force->stat.time = file_max_time;
690*10d63b7dSRichard Lowe 
691*10d63b7dSRichard Lowe 	/* Make sure VPATH is defined before current dir is read */
692*10d63b7dSRichard Lowe 	if ((cp = getenv(vpath_name->string_mb)) != NULL) {
693*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, cp);
694*10d63b7dSRichard Lowe 		(void) SETVAR(vpath_name,
695*10d63b7dSRichard Lowe 			      GETNAME(wcs_buffer, FIND_LENGTH),
696*10d63b7dSRichard Lowe 			      false);
697*10d63b7dSRichard Lowe 	}
698*10d63b7dSRichard Lowe 
699*10d63b7dSRichard Lowe 	/* Check if there is NO PATH variable. If not we construct one. */
700*10d63b7dSRichard Lowe 	if (getenv(path_name->string_mb) == NULL) {
701*10d63b7dSRichard Lowe 		vroot_path = NULL;
702*10d63b7dSRichard Lowe 		add_dir_to_path(".", &vroot_path, -1);
703*10d63b7dSRichard Lowe 		add_dir_to_path("/bin", &vroot_path, -1);
704*10d63b7dSRichard Lowe 		add_dir_to_path("/usr/bin", &vroot_path, -1);
705*10d63b7dSRichard Lowe 	}
706*10d63b7dSRichard Lowe }
707*10d63b7dSRichard Lowe 
708*10d63b7dSRichard Lowe /*
709*10d63b7dSRichard Lowe  * iterate on list of conditional macros in np, and place them in
710*10d63b7dSRichard Lowe  * a String_rec starting with, and separated by the '$' character.
711*10d63b7dSRichard Lowe  */
712*10d63b7dSRichard Lowe void
cond_macros_into_string(Name np,String_rec * buffer)713*10d63b7dSRichard Lowe cond_macros_into_string(Name np, String_rec *buffer)
714*10d63b7dSRichard Lowe {
715*10d63b7dSRichard Lowe 	Macro_list	macro_list;
716*10d63b7dSRichard Lowe 
717*10d63b7dSRichard Lowe 	/*
718*10d63b7dSRichard Lowe 	 * Put the version number at the start of the string
719*10d63b7dSRichard Lowe 	 */
720*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, DEPINFO_FMT_VERSION);
721*10d63b7dSRichard Lowe 	append_string(wcs_buffer, buffer, FIND_LENGTH);
722*10d63b7dSRichard Lowe 	/*
723*10d63b7dSRichard Lowe 	 * Add the rest of the conditional macros to the buffer
724*10d63b7dSRichard Lowe 	 */
725*10d63b7dSRichard Lowe 	if (np->depends_on_conditional){
726*10d63b7dSRichard Lowe 		for (macro_list = np->conditional_macro_list;
727*10d63b7dSRichard Lowe 		     macro_list != NULL; macro_list = macro_list->next){
728*10d63b7dSRichard Lowe 			append_string(macro_list->macro_name, buffer,
729*10d63b7dSRichard Lowe 				FIND_LENGTH);
730*10d63b7dSRichard Lowe 			append_char((int) equal_char, buffer);
731*10d63b7dSRichard Lowe 			append_string(macro_list->value, buffer, FIND_LENGTH);
732*10d63b7dSRichard Lowe 			append_char((int) dollar_char, buffer);
733*10d63b7dSRichard Lowe 		}
734*10d63b7dSRichard Lowe 	}
735*10d63b7dSRichard Lowe }
736*10d63b7dSRichard Lowe 
737