xref: /illumos-gate/usr/src/cmd/make/bin/misc.cc (revision e7afc443)
110d63b7dSRichard Lowe /*
210d63b7dSRichard Lowe  * CDDL HEADER START
310d63b7dSRichard Lowe  *
410d63b7dSRichard Lowe  * The contents of this file are subject to the terms of the
510d63b7dSRichard Lowe  * Common Development and Distribution License (the "License").
610d63b7dSRichard Lowe  * You may not use this file except in compliance with the License.
710d63b7dSRichard Lowe  *
810d63b7dSRichard Lowe  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910d63b7dSRichard Lowe  * or http://www.opensolaris.org/os/licensing.
1010d63b7dSRichard Lowe  * See the License for the specific language governing permissions
1110d63b7dSRichard Lowe  * and limitations under the License.
1210d63b7dSRichard Lowe  *
1310d63b7dSRichard Lowe  * When distributing Covered Code, include this CDDL HEADER in each
1410d63b7dSRichard Lowe  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510d63b7dSRichard Lowe  * If applicable, add the following below this CDDL HEADER, with the
1610d63b7dSRichard Lowe  * fields enclosed by brackets "[]" replaced with your own identifying
1710d63b7dSRichard Lowe  * information: Portions Copyright [yyyy] [name of copyright owner]
1810d63b7dSRichard Lowe  *
1910d63b7dSRichard Lowe  * CDDL HEADER END
2010d63b7dSRichard Lowe  */
2110d63b7dSRichard Lowe /*
2210d63b7dSRichard Lowe  * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
2310d63b7dSRichard Lowe  * Use is subject to license terms.
2436cd0120SRobert Mustacchi  *
2536cd0120SRobert Mustacchi  * Copyright 2019, Joyent, Inc.
2610d63b7dSRichard Lowe  */
2710d63b7dSRichard Lowe 
2810d63b7dSRichard Lowe /*
2910d63b7dSRichard Lowe  *	misc.cc
3010d63b7dSRichard Lowe  *
3110d63b7dSRichard Lowe  *	This file contains various unclassified routines. Some main groups:
3210d63b7dSRichard Lowe  *		getname
3310d63b7dSRichard Lowe  *		Memory allocation
3410d63b7dSRichard Lowe  *		String handling
3510d63b7dSRichard Lowe  *		Property handling
3610d63b7dSRichard Lowe  *		Error message handling
3710d63b7dSRichard Lowe  *		Make internal state dumping
3810d63b7dSRichard Lowe  *		main routine support
3910d63b7dSRichard Lowe  */
4010d63b7dSRichard Lowe 
4110d63b7dSRichard Lowe /*
4210d63b7dSRichard Lowe  * Included files
4310d63b7dSRichard Lowe  */
4410d63b7dSRichard Lowe #include <errno.h>
4510d63b7dSRichard Lowe #include <mk/defs.h>
4610d63b7dSRichard Lowe #include <mksh/macro.h>		/* SETVAR() */
4710d63b7dSRichard Lowe #include <mksh/misc.h>		/* enable_interrupt() */
4810d63b7dSRichard Lowe #include <stdarg.h>		/* va_list, va_start(), va_end() */
4910d63b7dSRichard Lowe #include <vroot/report.h>	/* SUNPRO_DEPENDENCIES */
5010d63b7dSRichard Lowe #include <libintl.h>
5110d63b7dSRichard Lowe 
5210d63b7dSRichard Lowe extern void job_adjust_fini();
5310d63b7dSRichard Lowe 
5410d63b7dSRichard Lowe /*
5510d63b7dSRichard Lowe  * Defined macros
5610d63b7dSRichard Lowe  */
5710d63b7dSRichard Lowe 
5810d63b7dSRichard Lowe /*
5910d63b7dSRichard Lowe  * typedefs & structs
6010d63b7dSRichard Lowe  */
6110d63b7dSRichard Lowe 
6210d63b7dSRichard Lowe /*
6310d63b7dSRichard Lowe  * Static variables
6410d63b7dSRichard Lowe  */
6510d63b7dSRichard Lowe 
6610d63b7dSRichard Lowe /*
6710d63b7dSRichard Lowe  * File table of contents
6810d63b7dSRichard Lowe  */
69*e7afc443SToomas Soome static	void		print_rule(Name target);
70*e7afc443SToomas Soome static	void		print_target_n_deps(Name target);
7110d63b7dSRichard Lowe 
7210d63b7dSRichard Lowe /*****************************************
7310d63b7dSRichard Lowe  *
7410d63b7dSRichard Lowe  *	getname
7510d63b7dSRichard Lowe  */
7610d63b7dSRichard Lowe 
7710d63b7dSRichard Lowe /*****************************************
7810d63b7dSRichard Lowe  *
7910d63b7dSRichard Lowe  *	Memory allocation
8010d63b7dSRichard Lowe  */
8110d63b7dSRichard Lowe 
8210d63b7dSRichard Lowe /*
8310d63b7dSRichard Lowe  *	free_chain()
8410d63b7dSRichard Lowe  *
8510d63b7dSRichard Lowe  *	frees a chain of Name_vector's
8610d63b7dSRichard Lowe  *
8710d63b7dSRichard Lowe  *	Parameters:
8810d63b7dSRichard Lowe  *		ptr		Pointer to the first element in the chain
8910d63b7dSRichard Lowe  *				to be freed.
9010d63b7dSRichard Lowe  *
9110d63b7dSRichard Lowe  *	Global variables used:
9210d63b7dSRichard Lowe  */
93ae389aa9SAndy Fiddaman void
free_chain(Name_vector ptr)9410d63b7dSRichard Lowe free_chain(Name_vector ptr)
9510d63b7dSRichard Lowe {
9610d63b7dSRichard Lowe 	if (ptr != NULL) {
9710d63b7dSRichard Lowe 		if (ptr->next != NULL) {
9810d63b7dSRichard Lowe 			free_chain(ptr->next);
9910d63b7dSRichard Lowe 		}
10010d63b7dSRichard Lowe 		free((char *) ptr);
10110d63b7dSRichard Lowe 	}
10210d63b7dSRichard Lowe }
10310d63b7dSRichard Lowe 
10410d63b7dSRichard Lowe /*****************************************
10510d63b7dSRichard Lowe  *
10610d63b7dSRichard Lowe  *	String manipulation
10710d63b7dSRichard Lowe  */
10810d63b7dSRichard Lowe 
10910d63b7dSRichard Lowe /*****************************************
11010d63b7dSRichard Lowe  *
11110d63b7dSRichard Lowe  *	Nameblock property handling
11210d63b7dSRichard Lowe  */
11310d63b7dSRichard Lowe 
11410d63b7dSRichard Lowe /*****************************************
11510d63b7dSRichard Lowe  *
11610d63b7dSRichard Lowe  *	Error message handling
11710d63b7dSRichard Lowe  */
11810d63b7dSRichard Lowe 
11910d63b7dSRichard Lowe /*
12010d63b7dSRichard Lowe  *	fatal(format, args...)
12110d63b7dSRichard Lowe  *
12210d63b7dSRichard Lowe  *	Print a message and die
12310d63b7dSRichard Lowe  *
12410d63b7dSRichard Lowe  *	Parameters:
12510d63b7dSRichard Lowe  *		format		printf type format string
12610d63b7dSRichard Lowe  *		args		Arguments to match the format
12710d63b7dSRichard Lowe  *
12810d63b7dSRichard Lowe  *	Global variables used:
12910d63b7dSRichard Lowe  *		fatal_in_progress Indicates if this is a recursive call
13010d63b7dSRichard Lowe  *		parallel_process_cnt Do we need to wait for anything?
13110d63b7dSRichard Lowe  *		report_pwd	Should we report the current path?
13210d63b7dSRichard Lowe  */
13310d63b7dSRichard Lowe /*VARARGS*/
13410d63b7dSRichard Lowe void
fatal(const char * message,...)13510d63b7dSRichard Lowe fatal(const char *message, ...)
13610d63b7dSRichard Lowe {
13710d63b7dSRichard Lowe 	va_list args;
13810d63b7dSRichard Lowe 
13910d63b7dSRichard Lowe 	va_start(args, message);
14010d63b7dSRichard Lowe 	(void) fflush(stdout);
14110d63b7dSRichard Lowe 	(void) fprintf(stderr, gettext("%s: Fatal error: "), getprogname());
14210d63b7dSRichard Lowe 	(void) vfprintf(stderr, message, args);
14310d63b7dSRichard Lowe 	(void) fprintf(stderr, "\n");
14410d63b7dSRichard Lowe 	va_end(args);
14510d63b7dSRichard Lowe 	if (report_pwd) {
14610d63b7dSRichard Lowe 		(void) fprintf(stderr,
14710d63b7dSRichard Lowe 			       gettext("Current working directory %s\n"),
14810d63b7dSRichard Lowe 			       get_current_path());
14910d63b7dSRichard Lowe 	}
15010d63b7dSRichard Lowe 	(void) fflush(stderr);
15110d63b7dSRichard Lowe 	if (fatal_in_progress) {
15210d63b7dSRichard Lowe 		exit_status = 1;
15310d63b7dSRichard Lowe 		exit(1);
15410d63b7dSRichard Lowe 	}
15510d63b7dSRichard Lowe 	fatal_in_progress = true;
15610d63b7dSRichard Lowe 	/* Let all parallel children finish */
15710d63b7dSRichard Lowe 	if ((dmake_mode_type == parallel_mode) &&
15810d63b7dSRichard Lowe 	    (parallel_process_cnt > 0)) {
15910d63b7dSRichard Lowe 		(void) fprintf(stderr,
16010d63b7dSRichard Lowe 			       gettext("Waiting for %d %s to finish\n"),
16110d63b7dSRichard Lowe 			       parallel_process_cnt,
16210d63b7dSRichard Lowe 			       parallel_process_cnt == 1 ?
16310d63b7dSRichard Lowe 			       gettext("job") : gettext("jobs"));
16410d63b7dSRichard Lowe 		(void) fflush(stderr);
16510d63b7dSRichard Lowe 	}
16610d63b7dSRichard Lowe 
16710d63b7dSRichard Lowe 	while (parallel_process_cnt > 0) {
16810d63b7dSRichard Lowe 		await_parallel(true);
16910d63b7dSRichard Lowe 		finish_children(false);
17010d63b7dSRichard Lowe 	}
17110d63b7dSRichard Lowe 
17210d63b7dSRichard Lowe 	job_adjust_fini();
17310d63b7dSRichard Lowe 
17410d63b7dSRichard Lowe 	exit_status = 1;
17510d63b7dSRichard Lowe 	exit(1);
17610d63b7dSRichard Lowe }
17710d63b7dSRichard Lowe 
17810d63b7dSRichard Lowe /*
17910d63b7dSRichard Lowe  *	warning(format, args...)
18010d63b7dSRichard Lowe  *
18110d63b7dSRichard Lowe  *	Print a message and continue.
18210d63b7dSRichard Lowe  *
18310d63b7dSRichard Lowe  *	Parameters:
18410d63b7dSRichard Lowe  *		format		printf type format string
18510d63b7dSRichard Lowe  *		args		Arguments to match the format
18610d63b7dSRichard Lowe  *
18710d63b7dSRichard Lowe  *	Global variables used:
18810d63b7dSRichard Lowe  *		report_pwd	Should we report the current path?
18910d63b7dSRichard Lowe  */
19010d63b7dSRichard Lowe /*VARARGS*/
19110d63b7dSRichard Lowe void
warning(char * message,...)19210d63b7dSRichard Lowe warning(char * message, ...)
19310d63b7dSRichard Lowe {
19410d63b7dSRichard Lowe 	va_list args;
19510d63b7dSRichard Lowe 
19610d63b7dSRichard Lowe 	va_start(args, message);
19710d63b7dSRichard Lowe 	(void) fflush(stdout);
19810d63b7dSRichard Lowe 	(void) fprintf(stderr, gettext("%s: Warning: "), getprogname());
19910d63b7dSRichard Lowe 	(void) vfprintf(stderr, message, args);
20010d63b7dSRichard Lowe 	(void) fprintf(stderr, "\n");
20110d63b7dSRichard Lowe 	va_end(args);
20210d63b7dSRichard Lowe 	if (report_pwd) {
20310d63b7dSRichard Lowe 		(void) fprintf(stderr,
20410d63b7dSRichard Lowe 			       gettext("Current working directory %s\n"),
20510d63b7dSRichard Lowe 			       get_current_path());
20610d63b7dSRichard Lowe 	}
20710d63b7dSRichard Lowe 	(void) fflush(stderr);
20810d63b7dSRichard Lowe }
20910d63b7dSRichard Lowe 
21010d63b7dSRichard Lowe /*
21110d63b7dSRichard Lowe  *	time_to_string(time)
21210d63b7dSRichard Lowe  *
21310d63b7dSRichard Lowe  *	Take a numeric time value and produce
21410d63b7dSRichard Lowe  *	a proper string representation.
21510d63b7dSRichard Lowe  *
21610d63b7dSRichard Lowe  *	Return value:
21710d63b7dSRichard Lowe  *				The string representation of the time
21810d63b7dSRichard Lowe  *
21910d63b7dSRichard Lowe  *	Parameters:
22010d63b7dSRichard Lowe  *		time		The time we need to translate
22110d63b7dSRichard Lowe  *
22210d63b7dSRichard Lowe  *	Global variables used:
22310d63b7dSRichard Lowe  */
22410d63b7dSRichard Lowe char *
time_to_string(const timestruc_t & time)22510d63b7dSRichard Lowe time_to_string(const timestruc_t &time)
22610d63b7dSRichard Lowe {
22710d63b7dSRichard Lowe 	struct tm		*tm;
22810d63b7dSRichard Lowe 	char			buf[128];
22910d63b7dSRichard Lowe 
23010d63b7dSRichard Lowe         if (time == file_doesnt_exist) {
23110d63b7dSRichard Lowe                 return gettext("File does not exist");
23210d63b7dSRichard Lowe         }
23310d63b7dSRichard Lowe         if (time == file_max_time) {
23410d63b7dSRichard Lowe                 return gettext("Younger than any file");
23510d63b7dSRichard Lowe         }
23610d63b7dSRichard Lowe 	tm = localtime(&time.tv_sec);
23710d63b7dSRichard Lowe 	strftime(buf, sizeof (buf), "%c %Z", tm);
23810d63b7dSRichard Lowe         buf[127] = (int) nul_char;
23910d63b7dSRichard Lowe         return strdup(buf);
24010d63b7dSRichard Lowe }
24110d63b7dSRichard Lowe 
24210d63b7dSRichard Lowe /*
24310d63b7dSRichard Lowe  *	get_current_path()
24410d63b7dSRichard Lowe  *
24510d63b7dSRichard Lowe  *	Stuff current_path with the current path if it isnt there already.
24610d63b7dSRichard Lowe  *
24710d63b7dSRichard Lowe  *	Parameters:
24810d63b7dSRichard Lowe  *
24910d63b7dSRichard Lowe  *	Global variables used:
25010d63b7dSRichard Lowe  */
25110d63b7dSRichard Lowe char *
get_current_path(void)25210d63b7dSRichard Lowe get_current_path(void)
25310d63b7dSRichard Lowe {
25410d63b7dSRichard Lowe 	char			pwd[(MAXPATHLEN * MB_LEN_MAX)];
25536cd0120SRobert Mustacchi 	static char		*current_path = NULL;
25610d63b7dSRichard Lowe 
25736cd0120SRobert Mustacchi 	/*
25836cd0120SRobert Mustacchi 	 * When we hit this with path_reset to true, we do not free the older
25936cd0120SRobert Mustacchi 	 * version of current_path at this time, as we don't have confidence
26036cd0120SRobert Mustacchi 	 * that we've properly caught all users of it and they haven't cached
26136cd0120SRobert Mustacchi 	 * the pointer somewhere. As such, since this is only currently set with
26236cd0120SRobert Mustacchi 	 * the -C option is passed in, it seems OK to just let that bit go.
26336cd0120SRobert Mustacchi 	 */
26436cd0120SRobert Mustacchi 	if (current_path == NULL || path_reset == true) {
26510d63b7dSRichard Lowe 		getcwd(pwd, sizeof(pwd));
26610d63b7dSRichard Lowe 		if (pwd[0] == (int) nul_char) {
26710d63b7dSRichard Lowe 			pwd[0] = (int) slash_char;
26810d63b7dSRichard Lowe 			pwd[1] = (int) nul_char;
26910d63b7dSRichard Lowe 		}
27010d63b7dSRichard Lowe 		current_path = strdup(pwd);
27136cd0120SRobert Mustacchi 		path_reset = false;
27210d63b7dSRichard Lowe 	}
27310d63b7dSRichard Lowe 	return current_path;
27410d63b7dSRichard Lowe }
27510d63b7dSRichard Lowe 
27610d63b7dSRichard Lowe /*****************************************
27710d63b7dSRichard Lowe  *
27810d63b7dSRichard Lowe  *	Make internal state dumping
27910d63b7dSRichard Lowe  *
28010d63b7dSRichard Lowe  *	This is a set  of routines for dumping the internal make state
28110d63b7dSRichard Lowe  *	Used for the -p option
28210d63b7dSRichard Lowe  */
28310d63b7dSRichard Lowe 
28410d63b7dSRichard Lowe /*
28510d63b7dSRichard Lowe  *	dump_make_state()
28610d63b7dSRichard Lowe  *
28710d63b7dSRichard Lowe  *	Dump make's internal state to stdout
28810d63b7dSRichard Lowe  *
28910d63b7dSRichard Lowe  *	Parameters:
29010d63b7dSRichard Lowe  *
29110d63b7dSRichard Lowe  *	Global variables used:
292ae389aa9SAndy Fiddaman  *		svr4			Was ".SVR4" seen in makefile?
29310d63b7dSRichard Lowe  *		svr4_name		The Name ".SVR4", printed
29410d63b7dSRichard Lowe  *		posix			Was ".POSIX" seen in makefile?
29510d63b7dSRichard Lowe  *		posix_name		The Name ".POSIX", printed
29610d63b7dSRichard Lowe  *		default_rule		Points to the .DEFAULT rule
29710d63b7dSRichard Lowe  *		default_rule_name	The Name ".DEFAULT", printed
29810d63b7dSRichard Lowe  *		default_target_to_build	The first target to print
29910d63b7dSRichard Lowe  *		dot_keep_state		The Name ".KEEP_STATE", printed
30010d63b7dSRichard Lowe  *		dot_keep_state_file	The Name ".KEEP_STATE_FILE", printed
30110d63b7dSRichard Lowe  *		hashtab			The make hash table for Name blocks
30210d63b7dSRichard Lowe  *		ignore_errors		Was ".IGNORE" seen in makefile?
30310d63b7dSRichard Lowe  *		ignore_name		The Name ".IGNORE", printed
30410d63b7dSRichard Lowe  *		keep_state		Was ".KEEP_STATE" seen in makefile?
30510d63b7dSRichard Lowe  *		percent_list		The list of % rules
30610d63b7dSRichard Lowe  *		precious		The Name ".PRECIOUS", printed
30710d63b7dSRichard Lowe  *		sccs_get_name		The Name ".SCCS_GET", printed
30810d63b7dSRichard Lowe  *		sccs_get_posix_name	The Name ".SCCS_GET_POSIX", printed
30910d63b7dSRichard Lowe  *		get_name		The Name ".GET", printed
31010d63b7dSRichard Lowe  *		get_posix_name		The Name ".GET_POSIX", printed
31110d63b7dSRichard Lowe  *		sccs_get_rule		Points to the ".SCCS_GET" rule
31210d63b7dSRichard Lowe  *		silent			Was ".SILENT" seen in makefile?
31310d63b7dSRichard Lowe  *		silent_name		The Name ".SILENT", printed
31410d63b7dSRichard Lowe  *		suffixes		The suffix list from ".SUFFIXES"
31510d63b7dSRichard Lowe  *		suffixes_name		The Name ".SUFFIX", printed
31610d63b7dSRichard Lowe  */
31710d63b7dSRichard Lowe void
dump_make_state(void)31810d63b7dSRichard Lowe dump_make_state(void)
31910d63b7dSRichard Lowe {
32010d63b7dSRichard Lowe 	Name_set::iterator	p, e;
321*e7afc443SToomas Soome 	Property	prop;
322*e7afc443SToomas Soome 	Dependency	dep;
323*e7afc443SToomas Soome 	Cmd_line	rule;
32410d63b7dSRichard Lowe 	Percent			percent, percent_depe;
32510d63b7dSRichard Lowe 
32610d63b7dSRichard Lowe 	/* Default target */
32710d63b7dSRichard Lowe 	if (default_target_to_build != NULL) {
32810d63b7dSRichard Lowe 		print_rule(default_target_to_build);
32910d63b7dSRichard Lowe 	}
33010d63b7dSRichard Lowe 	(void) printf("\n");
33110d63b7dSRichard Lowe 
33210d63b7dSRichard Lowe 	/* .POSIX */
33310d63b7dSRichard Lowe 	if (posix) {
33410d63b7dSRichard Lowe 		(void) printf("%s:\n", posix_name->string_mb);
33510d63b7dSRichard Lowe 	}
33610d63b7dSRichard Lowe 
33710d63b7dSRichard Lowe 	/* .DEFAULT */
33810d63b7dSRichard Lowe 	if (default_rule != NULL) {
33910d63b7dSRichard Lowe 		(void) printf("%s:\n", default_rule_name->string_mb);
34010d63b7dSRichard Lowe 		for (rule = default_rule; rule != NULL; rule = rule->next) {
34110d63b7dSRichard Lowe 			(void) printf("\t%s\n", rule->command_line->string_mb);
34210d63b7dSRichard Lowe 		}
34310d63b7dSRichard Lowe 	}
34410d63b7dSRichard Lowe 
34510d63b7dSRichard Lowe 	/* .IGNORE */
34610d63b7dSRichard Lowe 	if (ignore_errors) {
34710d63b7dSRichard Lowe 		(void) printf("%s:\n", ignore_name->string_mb);
34810d63b7dSRichard Lowe 	}
34910d63b7dSRichard Lowe 
35010d63b7dSRichard Lowe 	/* .KEEP_STATE: */
35110d63b7dSRichard Lowe 	if (keep_state) {
35210d63b7dSRichard Lowe 		(void) printf("%s:\n\n", dot_keep_state->string_mb);
35310d63b7dSRichard Lowe 	}
35410d63b7dSRichard Lowe 
35510d63b7dSRichard Lowe 	/* .PRECIOUS */
35610d63b7dSRichard Lowe 	(void) printf("%s:", precious->string_mb);
35710d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
35810d63b7dSRichard Lowe 			if ((p->stat.is_precious) || (all_precious)) {
35910d63b7dSRichard Lowe 				(void) printf(" %s", p->string_mb);
36010d63b7dSRichard Lowe 			}
36110d63b7dSRichard Lowe 	}
36210d63b7dSRichard Lowe 	(void) printf("\n");
36310d63b7dSRichard Lowe 
36410d63b7dSRichard Lowe 	/* .SCCS_GET */
36510d63b7dSRichard Lowe 	if (sccs_get_rule != NULL) {
36610d63b7dSRichard Lowe 		(void) printf("%s:\n", sccs_get_name->string_mb);
36710d63b7dSRichard Lowe 		for (rule = sccs_get_rule; rule != NULL; rule = rule->next) {
36810d63b7dSRichard Lowe 			(void) printf("\t%s\n", rule->command_line->string_mb);
36910d63b7dSRichard Lowe 		}
37010d63b7dSRichard Lowe 	}
37110d63b7dSRichard Lowe 
37210d63b7dSRichard Lowe 	/* .SILENT */
37310d63b7dSRichard Lowe 	if (silent) {
37410d63b7dSRichard Lowe 		(void) printf("%s:\n", silent_name->string_mb);
37510d63b7dSRichard Lowe 	}
37610d63b7dSRichard Lowe 
37710d63b7dSRichard Lowe 	/* .SUFFIXES: */
37810d63b7dSRichard Lowe 	(void) printf("%s:", suffixes_name->string_mb);
37910d63b7dSRichard Lowe 	for (dep = suffixes; dep != NULL; dep = dep->next) {
38010d63b7dSRichard Lowe 		(void) printf(" %s", dep->name->string_mb);
38110d63b7dSRichard Lowe 		build_suffix_list(dep->name);
38210d63b7dSRichard Lowe 	}
38310d63b7dSRichard Lowe 	(void) printf("\n\n");
38410d63b7dSRichard Lowe 
38510d63b7dSRichard Lowe 	/* % rules */
38610d63b7dSRichard Lowe 	for (percent = percent_list;
38710d63b7dSRichard Lowe 	     percent != NULL;
38810d63b7dSRichard Lowe 	     percent = percent->next) {
38910d63b7dSRichard Lowe 		(void) printf("%s:",
39010d63b7dSRichard Lowe 			      percent->name->string_mb);
391ae389aa9SAndy Fiddaman 
39210d63b7dSRichard Lowe 		for (percent_depe = percent->dependencies;
39310d63b7dSRichard Lowe 		     percent_depe != NULL;
39410d63b7dSRichard Lowe 		     percent_depe = percent_depe->next) {
39510d63b7dSRichard Lowe 			(void) printf(" %s", percent_depe->name->string_mb);
39610d63b7dSRichard Lowe 		}
397ae389aa9SAndy Fiddaman 
39810d63b7dSRichard Lowe 		(void) printf("\n");
39910d63b7dSRichard Lowe 
40010d63b7dSRichard Lowe 		for (rule = percent->command_template;
40110d63b7dSRichard Lowe 		     rule != NULL;
40210d63b7dSRichard Lowe 		     rule = rule->next) {
40310d63b7dSRichard Lowe 			(void) printf("\t%s\n", rule->command_line->string_mb);
40410d63b7dSRichard Lowe 		}
40510d63b7dSRichard Lowe 	}
40610d63b7dSRichard Lowe 
40710d63b7dSRichard Lowe 	/* Suffix rules */
40810d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
40910d63b7dSRichard Lowe 			Wstring wcb(p);
41010d63b7dSRichard Lowe 			if (wcb.get_string()[0] == (int) period_char) {
41110d63b7dSRichard Lowe 				print_rule(p);
41210d63b7dSRichard Lowe 			}
41310d63b7dSRichard Lowe 	}
41410d63b7dSRichard Lowe 
41510d63b7dSRichard Lowe 	/* Macro assignments */
41610d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
41710d63b7dSRichard Lowe 			if (((prop = get_prop(p->prop, macro_prop)) != NULL) &&
41810d63b7dSRichard Lowe 			    (prop->body.macro.value != NULL)) {
41910d63b7dSRichard Lowe 				(void) printf("%s", p->string_mb);
42010d63b7dSRichard Lowe 				print_value(prop->body.macro.value,
42110d63b7dSRichard Lowe 					    (Daemon) prop->body.macro.daemon);
42210d63b7dSRichard Lowe 			}
42310d63b7dSRichard Lowe 	}
42410d63b7dSRichard Lowe 	(void) printf("\n");
42510d63b7dSRichard Lowe 
42610d63b7dSRichard Lowe 	/* Conditional macro assignments */
42710d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
42810d63b7dSRichard Lowe 			for (prop = get_prop(p->prop, conditional_prop);
42910d63b7dSRichard Lowe 			     prop != NULL;
43010d63b7dSRichard Lowe 			     prop = get_prop(prop->next, conditional_prop)) {
43110d63b7dSRichard Lowe 				(void) printf("%s := %s",
43210d63b7dSRichard Lowe 					      p->string_mb,
43310d63b7dSRichard Lowe 					      prop->body.conditional.name->
43410d63b7dSRichard Lowe 					      string_mb);
43510d63b7dSRichard Lowe 				if (prop->body.conditional.append) {
43610d63b7dSRichard Lowe 					printf(" +");
43710d63b7dSRichard Lowe 				}
43810d63b7dSRichard Lowe 				else {
43910d63b7dSRichard Lowe 					printf(" ");
44010d63b7dSRichard Lowe 				}
44110d63b7dSRichard Lowe 				print_value(prop->body.conditional.value,
44210d63b7dSRichard Lowe 					    no_daemon);
44310d63b7dSRichard Lowe 			}
44410d63b7dSRichard Lowe 	}
44510d63b7dSRichard Lowe 	(void) printf("\n");
44610d63b7dSRichard Lowe 
44710d63b7dSRichard Lowe 	/* All other dependencies */
44810d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
44910d63b7dSRichard Lowe 			if (p->colons != no_colon) {
45010d63b7dSRichard Lowe 				print_rule(p);
45110d63b7dSRichard Lowe 			}
45210d63b7dSRichard Lowe 	}
45310d63b7dSRichard Lowe 	(void) printf("\n");
45410d63b7dSRichard Lowe }
45510d63b7dSRichard Lowe 
45610d63b7dSRichard Lowe /*
45710d63b7dSRichard Lowe  *	print_rule(target)
45810d63b7dSRichard Lowe  *
45910d63b7dSRichard Lowe  *	Print the rule for one target
46010d63b7dSRichard Lowe  *
46110d63b7dSRichard Lowe  *	Parameters:
46210d63b7dSRichard Lowe  *		target		Target we print rule for
46310d63b7dSRichard Lowe  *
46410d63b7dSRichard Lowe  *	Global variables used:
46510d63b7dSRichard Lowe  */
46610d63b7dSRichard Lowe static void
print_rule(Name target)467*e7afc443SToomas Soome print_rule(Name target)
46810d63b7dSRichard Lowe {
469*e7afc443SToomas Soome 	Cmd_line	rule;
470*e7afc443SToomas Soome 	Property	line;
471*e7afc443SToomas Soome 	Dependency	dependency;
47210d63b7dSRichard Lowe 
47310d63b7dSRichard Lowe 	if (target->dependency_printed ||
47410d63b7dSRichard Lowe 	    ((line = get_prop(target->prop, line_prop)) == NULL) ||
47510d63b7dSRichard Lowe 	    ((line->body.line.command_template == NULL) &&
47610d63b7dSRichard Lowe 	     (line->body.line.dependencies == NULL))) {
47710d63b7dSRichard Lowe 		return;
47810d63b7dSRichard Lowe 	}
47910d63b7dSRichard Lowe 	target->dependency_printed = true;
48010d63b7dSRichard Lowe 
48110d63b7dSRichard Lowe 	(void) printf("%s:", target->string_mb);
48210d63b7dSRichard Lowe 
48310d63b7dSRichard Lowe 	for (dependency = line->body.line.dependencies;
48410d63b7dSRichard Lowe 	     dependency != NULL;
48510d63b7dSRichard Lowe 	     dependency = dependency->next) {
48610d63b7dSRichard Lowe 		(void) printf(" %s", dependency->name->string_mb);
48710d63b7dSRichard Lowe 	}
48810d63b7dSRichard Lowe 
48910d63b7dSRichard Lowe 	(void) printf("\n");
49010d63b7dSRichard Lowe 
49110d63b7dSRichard Lowe 	for (rule = line->body.line.command_template;
49210d63b7dSRichard Lowe 	     rule != NULL;
49310d63b7dSRichard Lowe 	     rule = rule->next) {
49410d63b7dSRichard Lowe 		(void) printf("\t%s\n", rule->command_line->string_mb);
49510d63b7dSRichard Lowe 	}
49610d63b7dSRichard Lowe }
49710d63b7dSRichard Lowe 
49810d63b7dSRichard Lowe void
dump_target_list(void)49910d63b7dSRichard Lowe dump_target_list(void)
50010d63b7dSRichard Lowe {
50110d63b7dSRichard Lowe 	Name_set::iterator	p, e;
50210d63b7dSRichard Lowe 	Wstring	str;
50310d63b7dSRichard Lowe 
50410d63b7dSRichard Lowe 	for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
50510d63b7dSRichard Lowe 			str.init(p);
50610d63b7dSRichard Lowe 			wchar_t * wcb = str.get_string();
50710d63b7dSRichard Lowe 			if ((p->colons != no_colon) &&
50810d63b7dSRichard Lowe 			    ((wcb[0] != (int) period_char) ||
50910d63b7dSRichard Lowe 			     ((wcb[0] == (int) period_char) &&
51010d63b7dSRichard Lowe 			      (wcschr(wcb, (int) slash_char))))) {
51110d63b7dSRichard Lowe 				print_target_n_deps(p);
51210d63b7dSRichard Lowe 			}
51310d63b7dSRichard Lowe 	}
51410d63b7dSRichard Lowe }
51510d63b7dSRichard Lowe 
51610d63b7dSRichard Lowe static void
print_target_n_deps(Name target)517*e7afc443SToomas Soome print_target_n_deps(Name target)
51810d63b7dSRichard Lowe {
519*e7afc443SToomas Soome 	Cmd_line	rule;
520*e7afc443SToomas Soome 	Property	line;
521*e7afc443SToomas Soome 	Dependency	dependency;
52210d63b7dSRichard Lowe 
52310d63b7dSRichard Lowe 	if (target->dependency_printed) {
52410d63b7dSRichard Lowe 		return;
52510d63b7dSRichard Lowe 	}
52610d63b7dSRichard Lowe 	target->dependency_printed = true;
52710d63b7dSRichard Lowe 
52810d63b7dSRichard Lowe 	(void) printf("%s\n", target->string_mb);
52910d63b7dSRichard Lowe 
53010d63b7dSRichard Lowe 	if ((line = get_prop(target->prop, line_prop)) == NULL) {
53110d63b7dSRichard Lowe 		return;
53210d63b7dSRichard Lowe 	}
53310d63b7dSRichard Lowe 	for (dependency = line->body.line.dependencies;
53410d63b7dSRichard Lowe 	     dependency != NULL;
53510d63b7dSRichard Lowe 	     dependency = dependency->next) {
53610d63b7dSRichard Lowe 		if (!dependency->automatic) {
53710d63b7dSRichard Lowe 			print_target_n_deps(dependency->name);
53810d63b7dSRichard Lowe 		}
53910d63b7dSRichard Lowe 	}
54010d63b7dSRichard Lowe }
54110d63b7dSRichard Lowe 
54210d63b7dSRichard Lowe /*****************************************
54310d63b7dSRichard Lowe  *
54410d63b7dSRichard Lowe  *	main() support
54510d63b7dSRichard Lowe  */
54610d63b7dSRichard Lowe 
54710d63b7dSRichard Lowe /*
54810d63b7dSRichard Lowe  *	load_cached_names()
54910d63b7dSRichard Lowe  *
55010d63b7dSRichard Lowe  *	Load the vector of cached names
55110d63b7dSRichard Lowe  *
55210d63b7dSRichard Lowe  *	Parameters:
55310d63b7dSRichard Lowe  *
55410d63b7dSRichard Lowe  *	Global variables used:
55510d63b7dSRichard Lowe  *		Many many pointers to Name blocks.
55610d63b7dSRichard Lowe  */
55710d63b7dSRichard Lowe void
load_cached_names(void)55810d63b7dSRichard Lowe load_cached_names(void)
55910d63b7dSRichard Lowe {
56010d63b7dSRichard Lowe 	char		*cp;
56110d63b7dSRichard Lowe 	Name		dollar;
56210d63b7dSRichard Lowe 
56310d63b7dSRichard Lowe 	/* Load the cached_names struct */
56410d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".BUILT_LAST_MAKE_RUN");
56510d63b7dSRichard Lowe 	built_last_make_run = GETNAME(wcs_buffer, FIND_LENGTH);
56610d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "@");
56710d63b7dSRichard Lowe 	c_at = GETNAME(wcs_buffer, FIND_LENGTH);
56810d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, " *conditionals* ");
56910d63b7dSRichard Lowe 	conditionals = GETNAME(wcs_buffer, FIND_LENGTH);
57010d63b7dSRichard Lowe 	/*
57110d63b7dSRichard Lowe 	 * A version of make was released with NSE 1.0 that used
57210d63b7dSRichard Lowe 	 * VERSION-1.1 but this version is identical to VERSION-1.0.
57310d63b7dSRichard Lowe 	 * The version mismatch code makes a special case for this
57410d63b7dSRichard Lowe 	 * situation.  If the version number is changed from 1.0
57510d63b7dSRichard Lowe 	 * it should go to 1.2.
57610d63b7dSRichard Lowe 	 */
57710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "VERSION-1.0");
57810d63b7dSRichard Lowe 	current_make_version = GETNAME(wcs_buffer, FIND_LENGTH);
57910d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SVR4");
58010d63b7dSRichard Lowe 	svr4_name = GETNAME(wcs_buffer, FIND_LENGTH);
58110d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".POSIX");
58210d63b7dSRichard Lowe 	posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
58310d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".DEFAULT");
58410d63b7dSRichard Lowe 	default_rule_name = GETNAME(wcs_buffer, FIND_LENGTH);
58510d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "$");
58610d63b7dSRichard Lowe 	dollar = GETNAME(wcs_buffer, FIND_LENGTH);
58710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".DONE");
58810d63b7dSRichard Lowe 	done = GETNAME(wcs_buffer, FIND_LENGTH);
58910d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".");
59010d63b7dSRichard Lowe 	dot = GETNAME(wcs_buffer, FIND_LENGTH);
59110d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".KEEP_STATE");
59210d63b7dSRichard Lowe 	dot_keep_state = GETNAME(wcs_buffer, FIND_LENGTH);
59310d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".KEEP_STATE_FILE");
59410d63b7dSRichard Lowe 	dot_keep_state_file = GETNAME(wcs_buffer, FIND_LENGTH);
59510d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "");
59610d63b7dSRichard Lowe 	empty_name = GETNAME(wcs_buffer, FIND_LENGTH);
59710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, " FORCE");
59810d63b7dSRichard Lowe 	force = GETNAME(wcs_buffer, FIND_LENGTH);
59910d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "HOST_ARCH");
60010d63b7dSRichard Lowe 	host_arch = GETNAME(wcs_buffer, FIND_LENGTH);
60110d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "HOST_MACH");
60210d63b7dSRichard Lowe 	host_mach = GETNAME(wcs_buffer, FIND_LENGTH);
60310d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".IGNORE");
60410d63b7dSRichard Lowe 	ignore_name = GETNAME(wcs_buffer, FIND_LENGTH);
60510d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".INIT");
60610d63b7dSRichard Lowe 	init = GETNAME(wcs_buffer, FIND_LENGTH);
60710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".LOCAL");
60810d63b7dSRichard Lowe 	localhost_name = GETNAME(wcs_buffer, FIND_LENGTH);
60910d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".make.state");
61010d63b7dSRichard Lowe 	make_state = GETNAME(wcs_buffer, FIND_LENGTH);
61110d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "MAKEFLAGS");
61210d63b7dSRichard Lowe 	makeflags = GETNAME(wcs_buffer, FIND_LENGTH);
61310d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".MAKE_VERSION");
61410d63b7dSRichard Lowe 	make_version = GETNAME(wcs_buffer, FIND_LENGTH);
61510d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".NO_PARALLEL");
61610d63b7dSRichard Lowe 	no_parallel_name = GETNAME(wcs_buffer, FIND_LENGTH);
61710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".NOT_AUTO");
61810d63b7dSRichard Lowe 	not_auto = GETNAME(wcs_buffer, FIND_LENGTH);
61910d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".PARALLEL");
62010d63b7dSRichard Lowe 	parallel_name = GETNAME(wcs_buffer, FIND_LENGTH);
62110d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "PATH");
62210d63b7dSRichard Lowe 	path_name = GETNAME(wcs_buffer, FIND_LENGTH);
62310d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "+");
62410d63b7dSRichard Lowe 	plus = GETNAME(wcs_buffer, FIND_LENGTH);
62510d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".PRECIOUS");
62610d63b7dSRichard Lowe 	precious = GETNAME(wcs_buffer, FIND_LENGTH);
62710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "?");
62810d63b7dSRichard Lowe 	query = GETNAME(wcs_buffer, FIND_LENGTH);
62910d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "^");
63010d63b7dSRichard Lowe 	hat = GETNAME(wcs_buffer, FIND_LENGTH);
63110d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".RECURSIVE");
63210d63b7dSRichard Lowe 	recursive_name = GETNAME(wcs_buffer, FIND_LENGTH);
63310d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SCCS_GET");
63410d63b7dSRichard Lowe 	sccs_get_name = GETNAME(wcs_buffer, FIND_LENGTH);
63510d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SCCS_GET_POSIX");
63610d63b7dSRichard Lowe 	sccs_get_posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
63710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".GET");
63810d63b7dSRichard Lowe 	get_name = GETNAME(wcs_buffer, FIND_LENGTH);
63910d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".GET_POSIX");
64010d63b7dSRichard Lowe 	get_posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
64110d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "SHELL");
64210d63b7dSRichard Lowe 	shell_name = GETNAME(wcs_buffer, FIND_LENGTH);
64310d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SILENT");
64410d63b7dSRichard Lowe 	silent_name = GETNAME(wcs_buffer, FIND_LENGTH);
64510d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".SUFFIXES");
64610d63b7dSRichard Lowe 	suffixes_name = GETNAME(wcs_buffer, FIND_LENGTH);
64710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, SUNPRO_DEPENDENCIES);
64810d63b7dSRichard Lowe 	sunpro_dependencies = GETNAME(wcs_buffer, FIND_LENGTH);
64910d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "TARGET_ARCH");
65010d63b7dSRichard Lowe 	target_arch = GETNAME(wcs_buffer, FIND_LENGTH);
65110d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "TARGET_MACH");
65210d63b7dSRichard Lowe 	target_mach = GETNAME(wcs_buffer, FIND_LENGTH);
65310d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "VIRTUAL_ROOT");
65410d63b7dSRichard Lowe 	virtual_root = GETNAME(wcs_buffer, FIND_LENGTH);
65510d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "VPATH");
65610d63b7dSRichard Lowe 	vpath_name = GETNAME(wcs_buffer, FIND_LENGTH);
65710d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, ".WAIT");
65810d63b7dSRichard Lowe 	wait_name = GETNAME(wcs_buffer, FIND_LENGTH);
65910d63b7dSRichard Lowe 
66010d63b7dSRichard Lowe 	wait_name->state = build_ok;
66110d63b7dSRichard Lowe 
66210d63b7dSRichard Lowe 	/* Mark special targets so that the reader treats them properly */
66310d63b7dSRichard Lowe 	svr4_name->special_reader = svr4_special;
66410d63b7dSRichard Lowe 	posix_name->special_reader = posix_special;
66510d63b7dSRichard Lowe 	built_last_make_run->special_reader = built_last_make_run_special;
66610d63b7dSRichard Lowe 	default_rule_name->special_reader = default_special;
66710d63b7dSRichard Lowe 	dot_keep_state->special_reader = keep_state_special;
66810d63b7dSRichard Lowe 	dot_keep_state_file->special_reader = keep_state_file_special;
66910d63b7dSRichard Lowe 	ignore_name->special_reader = ignore_special;
67010d63b7dSRichard Lowe 	make_version->special_reader = make_version_special;
67110d63b7dSRichard Lowe 	no_parallel_name->special_reader = no_parallel_special;
67210d63b7dSRichard Lowe 	parallel_name->special_reader = parallel_special;
67310d63b7dSRichard Lowe 	localhost_name->special_reader = localhost_special;
67410d63b7dSRichard Lowe 	precious->special_reader = precious_special;
67510d63b7dSRichard Lowe 	sccs_get_name->special_reader = sccs_get_special;
67610d63b7dSRichard Lowe 	sccs_get_posix_name->special_reader = sccs_get_posix_special;
67710d63b7dSRichard Lowe 	get_name->special_reader = get_special;
67810d63b7dSRichard Lowe 	get_posix_name->special_reader = get_posix_special;
67910d63b7dSRichard Lowe 	silent_name->special_reader = silent_special;
68010d63b7dSRichard Lowe 	suffixes_name->special_reader = suffixes_special;
68110d63b7dSRichard Lowe 
68210d63b7dSRichard Lowe 	/* The value of $$ is $ */
68310d63b7dSRichard Lowe 	(void) SETVAR(dollar, dollar, false);
68410d63b7dSRichard Lowe 	dollar->dollar = false;
68510d63b7dSRichard Lowe 
68610d63b7dSRichard Lowe 	/* Set the value of $(SHELL) */
68710d63b7dSRichard Lowe 	if (posix) {
68810d63b7dSRichard Lowe 	  MBSTOWCS(wcs_buffer, "/usr/xpg4/bin/sh");
68910d63b7dSRichard Lowe 	} else {
69010d63b7dSRichard Lowe 	  MBSTOWCS(wcs_buffer, "/bin/sh");
69110d63b7dSRichard Lowe 	}
69210d63b7dSRichard Lowe 	(void) SETVAR(shell_name, GETNAME(wcs_buffer, FIND_LENGTH), false);
69310d63b7dSRichard Lowe 
69410d63b7dSRichard Lowe 	/*
69510d63b7dSRichard Lowe 	 * Use " FORCE" to simulate a FRC dependency for :: type
69610d63b7dSRichard Lowe 	 * targets with no dependencies.
69710d63b7dSRichard Lowe 	 */
69810d63b7dSRichard Lowe 	(void) append_prop(force, line_prop);
69910d63b7dSRichard Lowe 	force->stat.time = file_max_time;
70010d63b7dSRichard Lowe 
70110d63b7dSRichard Lowe 	/* Make sure VPATH is defined before current dir is read */
70210d63b7dSRichard Lowe 	if ((cp = getenv(vpath_name->string_mb)) != NULL) {
70310d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, cp);
70410d63b7dSRichard Lowe 		(void) SETVAR(vpath_name,
70510d63b7dSRichard Lowe 			      GETNAME(wcs_buffer, FIND_LENGTH),
70610d63b7dSRichard Lowe 			      false);
70710d63b7dSRichard Lowe 	}
70810d63b7dSRichard Lowe 
70910d63b7dSRichard Lowe 	/* Check if there is NO PATH variable. If not we construct one. */
71010d63b7dSRichard Lowe 	if (getenv(path_name->string_mb) == NULL) {
71110d63b7dSRichard Lowe 		vroot_path = NULL;
71210d63b7dSRichard Lowe 		add_dir_to_path(".", &vroot_path, -1);
71310d63b7dSRichard Lowe 		add_dir_to_path("/bin", &vroot_path, -1);
71410d63b7dSRichard Lowe 		add_dir_to_path("/usr/bin", &vroot_path, -1);
71510d63b7dSRichard Lowe 	}
71610d63b7dSRichard Lowe }
71710d63b7dSRichard Lowe 
718ae389aa9SAndy Fiddaman /*
719ae389aa9SAndy Fiddaman  * iterate on list of conditional macros in np, and place them in
72010d63b7dSRichard Lowe  * a String_rec starting with, and separated by the '$' character.
72110d63b7dSRichard Lowe  */
72210d63b7dSRichard Lowe void
cond_macros_into_string(Name np,String_rec * buffer)72310d63b7dSRichard Lowe cond_macros_into_string(Name np, String_rec *buffer)
72410d63b7dSRichard Lowe {
72510d63b7dSRichard Lowe 	Macro_list	macro_list;
72610d63b7dSRichard Lowe 
727ae389aa9SAndy Fiddaman 	/*
72810d63b7dSRichard Lowe 	 * Put the version number at the start of the string
72910d63b7dSRichard Lowe 	 */
73010d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, DEPINFO_FMT_VERSION);
73110d63b7dSRichard Lowe 	append_string(wcs_buffer, buffer, FIND_LENGTH);
732ae389aa9SAndy Fiddaman 	/*
73310d63b7dSRichard Lowe 	 * Add the rest of the conditional macros to the buffer
73410d63b7dSRichard Lowe 	 */
73510d63b7dSRichard Lowe 	if (np->depends_on_conditional){
736ae389aa9SAndy Fiddaman 		for (macro_list = np->conditional_macro_list;
73710d63b7dSRichard Lowe 		     macro_list != NULL; macro_list = macro_list->next){
738ae389aa9SAndy Fiddaman 			append_string(macro_list->macro_name, buffer,
73910d63b7dSRichard Lowe 				FIND_LENGTH);
74010d63b7dSRichard Lowe 			append_char((int) equal_char, buffer);
74110d63b7dSRichard Lowe 			append_string(macro_list->value, buffer, FIND_LENGTH);
74210d63b7dSRichard Lowe 			append_char((int) dollar_char, buffer);
74310d63b7dSRichard Lowe 		}
74410d63b7dSRichard Lowe 	}
74510d63b7dSRichard Lowe }
74610d63b7dSRichard Lowe 
747