xref: /titanic_50/usr/src/cmd/make/bin/main.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 2006 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  *	main.cc
28*10d63b7dSRichard Lowe  *
29*10d63b7dSRichard Lowe  *	make program main routine plus some helper routines
30*10d63b7dSRichard Lowe  */
31*10d63b7dSRichard Lowe 
32*10d63b7dSRichard Lowe /*
33*10d63b7dSRichard Lowe  * Included files
34*10d63b7dSRichard Lowe  */
35*10d63b7dSRichard Lowe #include <bsd/bsd.h>		/* bsd_signal() */
36*10d63b7dSRichard Lowe 
37*10d63b7dSRichard Lowe 
38*10d63b7dSRichard Lowe #include <locale.h>		/* setlocale() */
39*10d63b7dSRichard Lowe #include <libgen.h>
40*10d63b7dSRichard Lowe #include <mk/defs.h>
41*10d63b7dSRichard Lowe #include <mksh/macro.h>		/* getvar() */
42*10d63b7dSRichard Lowe #include <mksh/misc.h>		/* getmem(), setup_char_semantics() */
43*10d63b7dSRichard Lowe 
44*10d63b7dSRichard Lowe #include <pwd.h>		/* getpwnam() */
45*10d63b7dSRichard Lowe #include <setjmp.h>
46*10d63b7dSRichard Lowe #include <signal.h>
47*10d63b7dSRichard Lowe #include <stdlib.h>
48*10d63b7dSRichard Lowe #include <sys/errno.h>		/* ENOENT */
49*10d63b7dSRichard Lowe #include <sys/stat.h>		/* fstat() */
50*10d63b7dSRichard Lowe #include <fcntl.h>		/* open() */
51*10d63b7dSRichard Lowe 
52*10d63b7dSRichard Lowe #	include <sys/systeminfo.h>	/* sysinfo() */
53*10d63b7dSRichard Lowe 
54*10d63b7dSRichard Lowe #include <sys/types.h>		/* stat() */
55*10d63b7dSRichard Lowe #include <sys/wait.h>		/* wait() */
56*10d63b7dSRichard Lowe #include <unistd.h>		/* execv(), unlink(), access() */
57*10d63b7dSRichard Lowe #include <vroot/report.h>	/* report_dependency(), get_report_file() */
58*10d63b7dSRichard Lowe 
59*10d63b7dSRichard Lowe // From read2.cc
60*10d63b7dSRichard Lowe extern	Name		normalize_name(register wchar_t *name_string, register int length);
61*10d63b7dSRichard Lowe 
62*10d63b7dSRichard Lowe extern void job_adjust_fini();
63*10d63b7dSRichard Lowe 
64*10d63b7dSRichard Lowe 
65*10d63b7dSRichard Lowe /*
66*10d63b7dSRichard Lowe  * Defined macros
67*10d63b7dSRichard Lowe  */
68*10d63b7dSRichard Lowe #define	LD_SUPPORT_ENV_VAR	"SGS_SUPPORT_32"
69*10d63b7dSRichard Lowe #define	LD_SUPPORT_ENV_VAR_32	"SGS_SUPPORT_32"
70*10d63b7dSRichard Lowe #define	LD_SUPPORT_ENV_VAR_64	"SGS_SUPPORT_64"
71*10d63b7dSRichard Lowe #define	LD_SUPPORT_MAKE_LIB	"libmakestate.so.1"
72*10d63b7dSRichard Lowe #ifdef __i386
73*10d63b7dSRichard Lowe #define	LD_SUPPORT_MAKE_ARCH	"i386"
74*10d63b7dSRichard Lowe #elif __sparc
75*10d63b7dSRichard Lowe #define	LD_SUPPORT_MAKE_ARCH	"sparc"
76*10d63b7dSRichard Lowe #else
77*10d63b7dSRichard Lowe #error "Unsupported architecture"
78*10d63b7dSRichard Lowe #endif
79*10d63b7dSRichard Lowe 
80*10d63b7dSRichard Lowe /*
81*10d63b7dSRichard Lowe  * typedefs & structs
82*10d63b7dSRichard Lowe  */
83*10d63b7dSRichard Lowe 
84*10d63b7dSRichard Lowe /*
85*10d63b7dSRichard Lowe  * Static variables
86*10d63b7dSRichard Lowe  */
87*10d63b7dSRichard Lowe static	char		*argv_zero_string;
88*10d63b7dSRichard Lowe static	Boolean		build_failed_ever_seen;
89*10d63b7dSRichard Lowe static	Boolean		continue_after_error_ever_seen;	/* `-k' */
90*10d63b7dSRichard Lowe static	Boolean		dmake_group_specified;		/* `-g' */
91*10d63b7dSRichard Lowe static	Boolean		dmake_max_jobs_specified;	/* `-j' */
92*10d63b7dSRichard Lowe static	Boolean		dmake_mode_specified;		/* `-m' */
93*10d63b7dSRichard Lowe static	Boolean		dmake_add_mode_specified;	/* `-x' */
94*10d63b7dSRichard Lowe static	Boolean		dmake_output_mode_specified;	/* `-x DMAKE_OUTPUT_MODE=' */
95*10d63b7dSRichard Lowe static	Boolean		dmake_compat_mode_specified;	/* `-x SUN_MAKE_COMPAT_MODE=' */
96*10d63b7dSRichard Lowe static	Boolean		dmake_odir_specified;		/* `-o' */
97*10d63b7dSRichard Lowe static	Boolean		dmake_rcfile_specified;		/* `-c' */
98*10d63b7dSRichard Lowe static	Boolean		env_wins;			/* `-e' */
99*10d63b7dSRichard Lowe static	Boolean		ignore_default_mk;		/* `-r' */
100*10d63b7dSRichard Lowe static	Boolean		list_all_targets;		/* `-T' */
101*10d63b7dSRichard Lowe static	int		mf_argc;
102*10d63b7dSRichard Lowe static	char		**mf_argv;
103*10d63b7dSRichard Lowe static	Dependency_rec  not_auto_depen_struct;
104*10d63b7dSRichard Lowe static	Dependency 	not_auto_depen = &not_auto_depen_struct;
105*10d63b7dSRichard Lowe static	Boolean		pmake_cap_r_specified;		/* `-R' */
106*10d63b7dSRichard Lowe static	Boolean		pmake_machinesfile_specified;	/* `-M' */
107*10d63b7dSRichard Lowe static	Boolean		stop_after_error_ever_seen;	/* `-S' */
108*10d63b7dSRichard Lowe static	Boolean		trace_status;			/* `-p' */
109*10d63b7dSRichard Lowe 
110*10d63b7dSRichard Lowe #ifdef DMAKE_STATISTICS
111*10d63b7dSRichard Lowe static	Boolean		getname_stat = false;
112*10d63b7dSRichard Lowe #endif
113*10d63b7dSRichard Lowe 
114*10d63b7dSRichard Lowe 	static	time_t		start_time;
115*10d63b7dSRichard Lowe 	static	int		g_argc;
116*10d63b7dSRichard Lowe 	static	char		**g_argv;
117*10d63b7dSRichard Lowe 
118*10d63b7dSRichard Lowe /*
119*10d63b7dSRichard Lowe  * File table of contents
120*10d63b7dSRichard Lowe  */
121*10d63b7dSRichard Lowe 	extern "C" void		cleanup_after_exit(void);
122*10d63b7dSRichard Lowe 
123*10d63b7dSRichard Lowe extern "C" {
124*10d63b7dSRichard Lowe 	extern	void		dmake_exit_callback(void);
125*10d63b7dSRichard Lowe 	extern	void		dmake_message_callback(char *);
126*10d63b7dSRichard Lowe }
127*10d63b7dSRichard Lowe 
128*10d63b7dSRichard Lowe extern	Name		normalize_name(register wchar_t *name_string, register int length);
129*10d63b7dSRichard Lowe 
130*10d63b7dSRichard Lowe extern	int		main(int, char * []);
131*10d63b7dSRichard Lowe 
132*10d63b7dSRichard Lowe static	void		append_makeflags_string(Name, String);
133*10d63b7dSRichard Lowe static	void		doalarm(int);
134*10d63b7dSRichard Lowe static	void		enter_argv_values(int , char **, ASCII_Dyn_Array *);
135*10d63b7dSRichard Lowe static	void		make_targets(int, char **, Boolean);
136*10d63b7dSRichard Lowe static	int		parse_command_option(char);
137*10d63b7dSRichard Lowe static	void		read_command_options(int, char **);
138*10d63b7dSRichard Lowe static	void		read_environment(Boolean);
139*10d63b7dSRichard Lowe static	void		read_files_and_state(int, char **);
140*10d63b7dSRichard Lowe static	Boolean		read_makefile(Name, Boolean, Boolean, Boolean);
141*10d63b7dSRichard Lowe static	void		report_recursion(Name);
142*10d63b7dSRichard Lowe static	void		set_sgs_support(void);
143*10d63b7dSRichard Lowe static	void		setup_for_projectdir(void);
144*10d63b7dSRichard Lowe static	void		setup_makeflags_argv(void);
145*10d63b7dSRichard Lowe static	void		report_dir_enter_leave(Boolean entering);
146*10d63b7dSRichard Lowe 
147*10d63b7dSRichard Lowe extern void expand_value(Name, register String , Boolean);
148*10d63b7dSRichard Lowe 
149*10d63b7dSRichard Lowe static const char	verstring[] = "illumos make";
150*10d63b7dSRichard Lowe 
151*10d63b7dSRichard Lowe jmp_buf jmpbuffer;
152*10d63b7dSRichard Lowe 
153*10d63b7dSRichard Lowe /*
154*10d63b7dSRichard Lowe  *	main(argc, argv)
155*10d63b7dSRichard Lowe  *
156*10d63b7dSRichard Lowe  *	Parameters:
157*10d63b7dSRichard Lowe  *		argc			You know what this is
158*10d63b7dSRichard Lowe  *		argv			You know what this is
159*10d63b7dSRichard Lowe  *
160*10d63b7dSRichard Lowe  *	Static variables used:
161*10d63b7dSRichard Lowe  *		list_all_targets	make -T seen
162*10d63b7dSRichard Lowe  *		trace_status		make -p seen
163*10d63b7dSRichard Lowe  *
164*10d63b7dSRichard Lowe  *	Global variables used:
165*10d63b7dSRichard Lowe  *		debug_level		Should we trace make actions?
166*10d63b7dSRichard Lowe  *		keep_state		Set if .KEEP_STATE seen
167*10d63b7dSRichard Lowe  *		makeflags		The Name "MAKEFLAGS", used to get macro
168*10d63b7dSRichard Lowe  *		remote_command_name	Name of remote invocation cmd ("on")
169*10d63b7dSRichard Lowe  *		running_list		List of parallel running processes
170*10d63b7dSRichard Lowe  *		stdout_stderr_same	true if stdout and stderr are the same
171*10d63b7dSRichard Lowe  *		auto_dependencies	The Name "SUNPRO_DEPENDENCIES"
172*10d63b7dSRichard Lowe  *		temp_file_directory	Set to the dir where we create tmp file
173*10d63b7dSRichard Lowe  *		trace_reader		Set to reflect tracing status
174*10d63b7dSRichard Lowe  *		working_on_targets	Set when building user targets
175*10d63b7dSRichard Lowe  */
176*10d63b7dSRichard Lowe int
main(int argc,char * argv[])177*10d63b7dSRichard Lowe main(int argc, char *argv[])
178*10d63b7dSRichard Lowe {
179*10d63b7dSRichard Lowe 	/*
180*10d63b7dSRichard Lowe 	 * cp is a -> to the value of the MAKEFLAGS env var,
181*10d63b7dSRichard Lowe 	 * which has to be regular chars.
182*10d63b7dSRichard Lowe 	 */
183*10d63b7dSRichard Lowe 	register char		*cp;
184*10d63b7dSRichard Lowe 	char 			make_state_dir[MAXPATHLEN];
185*10d63b7dSRichard Lowe 	Boolean			parallel_flag = false;
186*10d63b7dSRichard Lowe 	char			*prognameptr;
187*10d63b7dSRichard Lowe 	char 			*slash_ptr;
188*10d63b7dSRichard Lowe 	mode_t			um;
189*10d63b7dSRichard Lowe 	int			i;
190*10d63b7dSRichard Lowe 	struct itimerval	value;
191*10d63b7dSRichard Lowe 	char			def_dmakerc_path[MAXPATHLEN];
192*10d63b7dSRichard Lowe 	Name			dmake_name, dmake_name2;
193*10d63b7dSRichard Lowe 	Name			dmake_value, dmake_value2;
194*10d63b7dSRichard Lowe 	Property		prop, prop2;
195*10d63b7dSRichard Lowe 	struct stat		statbuf;
196*10d63b7dSRichard Lowe 	int			statval;
197*10d63b7dSRichard Lowe 
198*10d63b7dSRichard Lowe 	struct stat		out_stat, err_stat;
199*10d63b7dSRichard Lowe 	hostid = gethostid();
200*10d63b7dSRichard Lowe 	bsd_signals();
201*10d63b7dSRichard Lowe 
202*10d63b7dSRichard Lowe 	(void) setlocale(LC_ALL, "");
203*10d63b7dSRichard Lowe 
204*10d63b7dSRichard Lowe 
205*10d63b7dSRichard Lowe #ifdef DMAKE_STATISTICS
206*10d63b7dSRichard Lowe 	if (getenv("DMAKE_STATISTICS")) {
207*10d63b7dSRichard Lowe 		getname_stat = true;
208*10d63b7dSRichard Lowe 	}
209*10d63b7dSRichard Lowe #endif
210*10d63b7dSRichard Lowe 
211*10d63b7dSRichard Lowe #ifndef TEXT_DOMAIN
212*10d63b7dSRichard Lowe #define	TEXT_DOMAIN	"SYS_TEST"
213*10d63b7dSRichard Lowe #endif
214*10d63b7dSRichard Lowe 	textdomain(TEXT_DOMAIN);
215*10d63b7dSRichard Lowe 
216*10d63b7dSRichard Lowe 	g_argc = argc;
217*10d63b7dSRichard Lowe 	g_argv = (char **) malloc((g_argc + 1) * sizeof(char *));
218*10d63b7dSRichard Lowe 	for (i = 0; i < argc; i++) {
219*10d63b7dSRichard Lowe 		g_argv[i] = argv[i];
220*10d63b7dSRichard Lowe 	}
221*10d63b7dSRichard Lowe 	g_argv[i] = NULL;
222*10d63b7dSRichard Lowe 
223*10d63b7dSRichard Lowe 	/*
224*10d63b7dSRichard Lowe 	 * Set argv_zero_string to some form of argv[0] for
225*10d63b7dSRichard Lowe 	 * recursive MAKE builds.
226*10d63b7dSRichard Lowe 	 */
227*10d63b7dSRichard Lowe 
228*10d63b7dSRichard Lowe 	if (*argv[0] == (int) slash_char) {
229*10d63b7dSRichard Lowe 		/* argv[0] starts with a slash */
230*10d63b7dSRichard Lowe 		argv_zero_string = strdup(argv[0]);
231*10d63b7dSRichard Lowe 	} else if (strchr(argv[0], (int) slash_char) == NULL) {
232*10d63b7dSRichard Lowe 		/* argv[0] contains no slashes */
233*10d63b7dSRichard Lowe 		argv_zero_string = strdup(argv[0]);
234*10d63b7dSRichard Lowe 	} else {
235*10d63b7dSRichard Lowe 		/*
236*10d63b7dSRichard Lowe 		 * argv[0] contains at least one slash,
237*10d63b7dSRichard Lowe 		 * but doesn't start with a slash
238*10d63b7dSRichard Lowe 		 */
239*10d63b7dSRichard Lowe 		char	*tmp_current_path;
240*10d63b7dSRichard Lowe 		char	*tmp_string;
241*10d63b7dSRichard Lowe 
242*10d63b7dSRichard Lowe 		tmp_current_path = get_current_path();
243*10d63b7dSRichard Lowe 		tmp_string = getmem(strlen(tmp_current_path) + 1 +
244*10d63b7dSRichard Lowe 		                    strlen(argv[0]) + 1);
245*10d63b7dSRichard Lowe 		(void) sprintf(tmp_string,
246*10d63b7dSRichard Lowe 		               "%s/%s",
247*10d63b7dSRichard Lowe 		               tmp_current_path,
248*10d63b7dSRichard Lowe 		               argv[0]);
249*10d63b7dSRichard Lowe 		argv_zero_string = strdup(tmp_string);
250*10d63b7dSRichard Lowe 		retmem_mb(tmp_string);
251*10d63b7dSRichard Lowe 	}
252*10d63b7dSRichard Lowe 
253*10d63b7dSRichard Lowe 	/*
254*10d63b7dSRichard Lowe 	 * The following flags are reset if we don't have the
255*10d63b7dSRichard Lowe 	 * (.nse_depinfo or .make.state) files locked and only set
256*10d63b7dSRichard Lowe 	 * AFTER the file has been locked. This ensures that if the user
257*10d63b7dSRichard Lowe 	 * interrupts the program while file_lock() is waiting to lock
258*10d63b7dSRichard Lowe 	 * the file, the interrupt handler doesn't remove a lock
259*10d63b7dSRichard Lowe 	 * that doesn't belong to us.
260*10d63b7dSRichard Lowe 	 */
261*10d63b7dSRichard Lowe 	make_state_lockfile = NULL;
262*10d63b7dSRichard Lowe 	make_state_locked = false;
263*10d63b7dSRichard Lowe 
264*10d63b7dSRichard Lowe 
265*10d63b7dSRichard Lowe 	/*
266*10d63b7dSRichard Lowe 	 * look for last slash char in the path to look at the binary
267*10d63b7dSRichard Lowe 	 * name. This is to resolve the hard link and invoke make
268*10d63b7dSRichard Lowe 	 * in svr4 mode.
269*10d63b7dSRichard Lowe 	 */
270*10d63b7dSRichard Lowe 
271*10d63b7dSRichard Lowe 	/* Sun OS make standart */
272*10d63b7dSRichard Lowe 	svr4 = false;
273*10d63b7dSRichard Lowe 	posix = false;
274*10d63b7dSRichard Lowe 	if(!strcmp(argv_zero_string, "/usr/xpg4/bin/make")) {
275*10d63b7dSRichard Lowe 		svr4 = false;
276*10d63b7dSRichard Lowe 		posix = true;
277*10d63b7dSRichard Lowe 	} else {
278*10d63b7dSRichard Lowe 		prognameptr = strrchr(argv[0], '/');
279*10d63b7dSRichard Lowe 		if(prognameptr) {
280*10d63b7dSRichard Lowe 			prognameptr++;
281*10d63b7dSRichard Lowe 		} else {
282*10d63b7dSRichard Lowe 			prognameptr = argv[0];
283*10d63b7dSRichard Lowe 		}
284*10d63b7dSRichard Lowe 		if(!strcmp(prognameptr, "svr4.make")) {
285*10d63b7dSRichard Lowe 			svr4 = true;
286*10d63b7dSRichard Lowe 			posix = false;
287*10d63b7dSRichard Lowe 		}
288*10d63b7dSRichard Lowe 	}
289*10d63b7dSRichard Lowe 	if (getenv(USE_SVR4_MAKE) || getenv("USE_SVID")){
290*10d63b7dSRichard Lowe 	   svr4 = true;
291*10d63b7dSRichard Lowe 	   posix = false;
292*10d63b7dSRichard Lowe 	}
293*10d63b7dSRichard Lowe 
294*10d63b7dSRichard Lowe 	/*
295*10d63b7dSRichard Lowe 	 * Find the dmake_compat_mode: posix, sun, svr4, or gnu_style, .
296*10d63b7dSRichard Lowe 	 */
297*10d63b7dSRichard Lowe 	char * dmake_compat_mode_var = getenv("SUN_MAKE_COMPAT_MODE");
298*10d63b7dSRichard Lowe 	if (dmake_compat_mode_var != NULL) {
299*10d63b7dSRichard Lowe 		if (0 == strcasecmp(dmake_compat_mode_var, "GNU")) {
300*10d63b7dSRichard Lowe 			gnu_style = true;
301*10d63b7dSRichard Lowe 		}
302*10d63b7dSRichard Lowe 		//svr4 = false;
303*10d63b7dSRichard Lowe 		//posix = false;
304*10d63b7dSRichard Lowe 	}
305*10d63b7dSRichard Lowe 
306*10d63b7dSRichard Lowe 	/*
307*10d63b7dSRichard Lowe 	 * Temporary directory set up.
308*10d63b7dSRichard Lowe 	 */
309*10d63b7dSRichard Lowe 	char * tmpdir_var = getenv("TMPDIR");
310*10d63b7dSRichard Lowe 	if (tmpdir_var != NULL && *tmpdir_var == '/' && strlen(tmpdir_var) < MAXPATHLEN) {
311*10d63b7dSRichard Lowe 		strcpy(mbs_buffer, tmpdir_var);
312*10d63b7dSRichard Lowe 		for (tmpdir_var = mbs_buffer+strlen(mbs_buffer);
313*10d63b7dSRichard Lowe 			*(--tmpdir_var) == '/' && tmpdir_var > mbs_buffer;
314*10d63b7dSRichard Lowe 			*tmpdir_var = '\0');
315*10d63b7dSRichard Lowe 		if (strlen(mbs_buffer) + 32 < MAXPATHLEN) { /* 32 = strlen("/dmake.stdout.%d.%d.XXXXXX") */
316*10d63b7dSRichard Lowe 			sprintf(mbs_buffer2, "%s/dmake.tst.%d.XXXXXX",
317*10d63b7dSRichard Lowe 				mbs_buffer, getpid());
318*10d63b7dSRichard Lowe 			int fd = mkstemp(mbs_buffer2);
319*10d63b7dSRichard Lowe 			if (fd >= 0) {
320*10d63b7dSRichard Lowe 				close(fd);
321*10d63b7dSRichard Lowe 				unlink(mbs_buffer2);
322*10d63b7dSRichard Lowe 				tmpdir = strdup(mbs_buffer);
323*10d63b7dSRichard Lowe 			}
324*10d63b7dSRichard Lowe 		}
325*10d63b7dSRichard Lowe 	}
326*10d63b7dSRichard Lowe 
327*10d63b7dSRichard Lowe 	/* find out if stdout and stderr point to the same place */
328*10d63b7dSRichard Lowe 	if (fstat(1, &out_stat) < 0) {
329*10d63b7dSRichard Lowe 		fatal(gettext("fstat of standard out failed: %s"), errmsg(errno));
330*10d63b7dSRichard Lowe 	}
331*10d63b7dSRichard Lowe 	if (fstat(2, &err_stat) < 0) {
332*10d63b7dSRichard Lowe 		fatal(gettext("fstat of standard error failed: %s"), errmsg(errno));
333*10d63b7dSRichard Lowe 	}
334*10d63b7dSRichard Lowe 	if ((out_stat.st_dev == err_stat.st_dev) &&
335*10d63b7dSRichard Lowe 	    (out_stat.st_ino == err_stat.st_ino)) {
336*10d63b7dSRichard Lowe 		stdout_stderr_same = true;
337*10d63b7dSRichard Lowe 	} else {
338*10d63b7dSRichard Lowe 		stdout_stderr_same = false;
339*10d63b7dSRichard Lowe 	}
340*10d63b7dSRichard Lowe 	/* Make the vroot package scan the path using shell semantics */
341*10d63b7dSRichard Lowe 	set_path_style(0);
342*10d63b7dSRichard Lowe 
343*10d63b7dSRichard Lowe 	setup_char_semantics();
344*10d63b7dSRichard Lowe 
345*10d63b7dSRichard Lowe 	setup_for_projectdir();
346*10d63b7dSRichard Lowe 
347*10d63b7dSRichard Lowe 	/*
348*10d63b7dSRichard Lowe 	 * If running with .KEEP_STATE, curdir will be set with
349*10d63b7dSRichard Lowe 	 * the connected directory.
350*10d63b7dSRichard Lowe 	 */
351*10d63b7dSRichard Lowe 	(void) atexit(cleanup_after_exit);
352*10d63b7dSRichard Lowe 
353*10d63b7dSRichard Lowe 	load_cached_names();
354*10d63b7dSRichard Lowe 
355*10d63b7dSRichard Lowe /*
356*10d63b7dSRichard Lowe  *	Set command line flags
357*10d63b7dSRichard Lowe  */
358*10d63b7dSRichard Lowe 	setup_makeflags_argv();
359*10d63b7dSRichard Lowe 	read_command_options(mf_argc, mf_argv);
360*10d63b7dSRichard Lowe 	read_command_options(argc, argv);
361*10d63b7dSRichard Lowe 	if (debug_level > 0) {
362*10d63b7dSRichard Lowe 		cp = getenv(makeflags->string_mb);
363*10d63b7dSRichard Lowe 		(void) printf(gettext("MAKEFLAGS value: %s\n"), cp == NULL ? "" : cp);
364*10d63b7dSRichard Lowe 	}
365*10d63b7dSRichard Lowe 
366*10d63b7dSRichard Lowe 	setup_interrupt(handle_interrupt);
367*10d63b7dSRichard Lowe 
368*10d63b7dSRichard Lowe 	read_files_and_state(argc, argv);
369*10d63b7dSRichard Lowe 
370*10d63b7dSRichard Lowe 	/*
371*10d63b7dSRichard Lowe 	 * Find the dmake_output_mode: TXT1, TXT2 or HTML1.
372*10d63b7dSRichard Lowe 	 */
373*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "DMAKE_OUTPUT_MODE");
374*10d63b7dSRichard Lowe 	dmake_name2 = GETNAME(wcs_buffer, FIND_LENGTH);
375*10d63b7dSRichard Lowe 	prop2 = get_prop(dmake_name2->prop, macro_prop);
376*10d63b7dSRichard Lowe 	if (prop2 == NULL) {
377*10d63b7dSRichard Lowe 		/* DMAKE_OUTPUT_MODE not defined, default to TXT1 mode */
378*10d63b7dSRichard Lowe 		output_mode = txt1_mode;
379*10d63b7dSRichard Lowe 	} else {
380*10d63b7dSRichard Lowe 		dmake_value2 = prop2->body.macro.value;
381*10d63b7dSRichard Lowe 		if ((dmake_value2 == NULL) ||
382*10d63b7dSRichard Lowe 		    (IS_EQUAL(dmake_value2->string_mb, "TXT1"))) {
383*10d63b7dSRichard Lowe 			output_mode = txt1_mode;
384*10d63b7dSRichard Lowe 		} else if (IS_EQUAL(dmake_value2->string_mb, "TXT2")) {
385*10d63b7dSRichard Lowe 			output_mode = txt2_mode;
386*10d63b7dSRichard Lowe 		} else if (IS_EQUAL(dmake_value2->string_mb, "HTML1")) {
387*10d63b7dSRichard Lowe 			output_mode = html1_mode;
388*10d63b7dSRichard Lowe 		} else {
389*10d63b7dSRichard Lowe 			warning(gettext("Unsupported value `%s' for DMAKE_OUTPUT_MODE after -x flag (ignored)"),
390*10d63b7dSRichard Lowe 			      dmake_value2->string_mb);
391*10d63b7dSRichard Lowe 		}
392*10d63b7dSRichard Lowe 	}
393*10d63b7dSRichard Lowe 	/*
394*10d63b7dSRichard Lowe 	 * Find the dmake_mode: parallel, or serial.
395*10d63b7dSRichard Lowe 	 */
396*10d63b7dSRichard Lowe     if ((!pmake_cap_r_specified) &&
397*10d63b7dSRichard Lowe         (!pmake_machinesfile_specified)) {
398*10d63b7dSRichard Lowe 	char *s, *b;
399*10d63b7dSRichard Lowe 
400*10d63b7dSRichard Lowe 	if ((s = strdup(argv[0])) == NULL)
401*10d63b7dSRichard Lowe 		fatal(gettext("Out of memory"));
402*10d63b7dSRichard Lowe 
403*10d63b7dSRichard Lowe 	b = basename(s);
404*10d63b7dSRichard Lowe 
405*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "DMAKE_MODE");
406*10d63b7dSRichard Lowe 	dmake_name2 = GETNAME(wcs_buffer, FIND_LENGTH);
407*10d63b7dSRichard Lowe 	prop2 = get_prop(dmake_name2->prop, macro_prop);
408*10d63b7dSRichard Lowe 	// If we're invoked as 'make' run serially, regardless of DMAKE_MODE
409*10d63b7dSRichard Lowe 	// If we're invoked as 'make' but passed -j, run parallel
410*10d63b7dSRichard Lowe 	// If we're invoked as 'dmake', without DMAKE_MODE, default parallel
411*10d63b7dSRichard Lowe 	// If we're invoked as 'dmake' and DMAKE_MODE is set, honour it.
412*10d63b7dSRichard Lowe 	if ((strcmp(b, "make") == 0) &&
413*10d63b7dSRichard Lowe 	    !dmake_max_jobs_specified) {
414*10d63b7dSRichard Lowe 		dmake_mode_type = serial_mode;
415*10d63b7dSRichard Lowe 		no_parallel = true;
416*10d63b7dSRichard Lowe 	} else if (prop2 == NULL) {
417*10d63b7dSRichard Lowe 		/* DMAKE_MODE not defined, default based on our name */
418*10d63b7dSRichard Lowe 		if (strcmp(b, "dmake") == 0) {
419*10d63b7dSRichard Lowe 			dmake_mode_type = parallel_mode;
420*10d63b7dSRichard Lowe 			no_parallel = false;
421*10d63b7dSRichard Lowe 		}
422*10d63b7dSRichard Lowe 	} else {
423*10d63b7dSRichard Lowe 		dmake_value2 = prop2->body.macro.value;
424*10d63b7dSRichard Lowe 		if (IS_EQUAL(dmake_value2->string_mb, "parallel")) {
425*10d63b7dSRichard Lowe 			dmake_mode_type = parallel_mode;
426*10d63b7dSRichard Lowe 			no_parallel = false;
427*10d63b7dSRichard Lowe 		} else if (IS_EQUAL(dmake_value2->string_mb, "serial")) {
428*10d63b7dSRichard Lowe 			dmake_mode_type = serial_mode;
429*10d63b7dSRichard Lowe 			no_parallel = true;
430*10d63b7dSRichard Lowe 		} else {
431*10d63b7dSRichard Lowe 			fatal(gettext("Unknown dmake mode argument `%s' after -m flag"), dmake_value2->string_mb);
432*10d63b7dSRichard Lowe 		}
433*10d63b7dSRichard Lowe 	}
434*10d63b7dSRichard Lowe 	free(s);
435*10d63b7dSRichard Lowe     }
436*10d63b7dSRichard Lowe 
437*10d63b7dSRichard Lowe 	parallel_flag = true;
438*10d63b7dSRichard Lowe 	putenv(strdup("DMAKE_CHILD=TRUE"));
439*10d63b7dSRichard Lowe 
440*10d63b7dSRichard Lowe //
441*10d63b7dSRichard Lowe // If dmake is running with -t option, set dmake_mode_type to serial.
442*10d63b7dSRichard Lowe // This is done because doname() calls touch_command() that runs serially.
443*10d63b7dSRichard Lowe // If we do not do that, maketool will have problems.
444*10d63b7dSRichard Lowe //
445*10d63b7dSRichard Lowe 	if(touch) {
446*10d63b7dSRichard Lowe 		dmake_mode_type = serial_mode;
447*10d63b7dSRichard Lowe 		no_parallel = true;
448*10d63b7dSRichard Lowe 	}
449*10d63b7dSRichard Lowe 
450*10d63b7dSRichard Lowe 	/*
451*10d63b7dSRichard Lowe 	 * Check whether stdout and stderr are physically same.
452*10d63b7dSRichard Lowe 	 * This is in order to decide whether we need to redirect
453*10d63b7dSRichard Lowe 	 * stderr separately from stdout.
454*10d63b7dSRichard Lowe 	 * This check is performed only if __DMAKE_SEPARATE_STDERR
455*10d63b7dSRichard Lowe 	 * is not set. This variable may be used in order to preserve
456*10d63b7dSRichard Lowe 	 * the 'old' behaviour.
457*10d63b7dSRichard Lowe 	 */
458*10d63b7dSRichard Lowe 	out_err_same = true;
459*10d63b7dSRichard Lowe 	char * dmake_sep_var = getenv("__DMAKE_SEPARATE_STDERR");
460*10d63b7dSRichard Lowe 	if (dmake_sep_var == NULL || (0 != strcasecmp(dmake_sep_var, "NO"))) {
461*10d63b7dSRichard Lowe 		struct stat stdout_stat;
462*10d63b7dSRichard Lowe 		struct stat stderr_stat;
463*10d63b7dSRichard Lowe 		if( (fstat(1, &stdout_stat) == 0)
464*10d63b7dSRichard Lowe 		 && (fstat(2, &stderr_stat) == 0) )
465*10d63b7dSRichard Lowe 		{
466*10d63b7dSRichard Lowe 			if( (stdout_stat.st_dev != stderr_stat.st_dev)
467*10d63b7dSRichard Lowe 			 || (stdout_stat.st_ino != stderr_stat.st_ino) )
468*10d63b7dSRichard Lowe 			{
469*10d63b7dSRichard Lowe 				out_err_same = false;
470*10d63b7dSRichard Lowe 			}
471*10d63b7dSRichard Lowe 		}
472*10d63b7dSRichard Lowe 	}
473*10d63b7dSRichard Lowe 
474*10d63b7dSRichard Lowe 
475*10d63b7dSRichard Lowe /*
476*10d63b7dSRichard Lowe  *	Enable interrupt handler for alarms
477*10d63b7dSRichard Lowe  */
478*10d63b7dSRichard Lowe         (void) bsd_signal(SIGALRM, (SIG_PF)doalarm);
479*10d63b7dSRichard Lowe 
480*10d63b7dSRichard Lowe /*
481*10d63b7dSRichard Lowe  *	Check if make should report
482*10d63b7dSRichard Lowe  */
483*10d63b7dSRichard Lowe 	if (getenv(sunpro_dependencies->string_mb) != NULL) {
484*10d63b7dSRichard Lowe 		FILE	*report_file;
485*10d63b7dSRichard Lowe 
486*10d63b7dSRichard Lowe 		report_dependency("");
487*10d63b7dSRichard Lowe 		report_file = get_report_file();
488*10d63b7dSRichard Lowe 		if ((report_file != NULL) && (report_file != (FILE*)-1)) {
489*10d63b7dSRichard Lowe 			(void) fprintf(report_file, "\n");
490*10d63b7dSRichard Lowe 		}
491*10d63b7dSRichard Lowe 	}
492*10d63b7dSRichard Lowe 
493*10d63b7dSRichard Lowe /*
494*10d63b7dSRichard Lowe  *	Make sure SUNPRO_DEPENDENCIES is exported (or not) properly.
495*10d63b7dSRichard Lowe  */
496*10d63b7dSRichard Lowe 	if (keep_state) {
497*10d63b7dSRichard Lowe 		maybe_append_prop(sunpro_dependencies, macro_prop)->
498*10d63b7dSRichard Lowe 		  body.macro.exported = true;
499*10d63b7dSRichard Lowe 	} else {
500*10d63b7dSRichard Lowe 		maybe_append_prop(sunpro_dependencies, macro_prop)->
501*10d63b7dSRichard Lowe 		  body.macro.exported = false;
502*10d63b7dSRichard Lowe 	}
503*10d63b7dSRichard Lowe 
504*10d63b7dSRichard Lowe 	working_on_targets = true;
505*10d63b7dSRichard Lowe 	if (trace_status) {
506*10d63b7dSRichard Lowe 		dump_make_state();
507*10d63b7dSRichard Lowe 		fclose(stdout);
508*10d63b7dSRichard Lowe 		fclose(stderr);
509*10d63b7dSRichard Lowe 		exit_status = 0;
510*10d63b7dSRichard Lowe 		exit(0);
511*10d63b7dSRichard Lowe 	}
512*10d63b7dSRichard Lowe 	if (list_all_targets) {
513*10d63b7dSRichard Lowe 		dump_target_list();
514*10d63b7dSRichard Lowe 		fclose(stdout);
515*10d63b7dSRichard Lowe 		fclose(stderr);
516*10d63b7dSRichard Lowe 		exit_status = 0;
517*10d63b7dSRichard Lowe 		exit(0);
518*10d63b7dSRichard Lowe 	}
519*10d63b7dSRichard Lowe 	trace_reader = false;
520*10d63b7dSRichard Lowe 
521*10d63b7dSRichard Lowe  	/*
522*10d63b7dSRichard Lowe  	 * Set temp_file_directory to the directory the .make.state
523*10d63b7dSRichard Lowe  	 * file is written to.
524*10d63b7dSRichard Lowe  	 */
525*10d63b7dSRichard Lowe  	if ((slash_ptr = strrchr(make_state->string_mb, (int) slash_char)) == NULL) {
526*10d63b7dSRichard Lowe  		temp_file_directory = strdup(get_current_path());
527*10d63b7dSRichard Lowe  	} else {
528*10d63b7dSRichard Lowe  		*slash_ptr = (int) nul_char;
529*10d63b7dSRichard Lowe  		(void) strcpy(make_state_dir, make_state->string_mb);
530*10d63b7dSRichard Lowe  		*slash_ptr = (int) slash_char;
531*10d63b7dSRichard Lowe 		   /* when there is only one slash and it's the first
532*10d63b7dSRichard Lowe 		   ** character, make_state_dir should point to '/'.
533*10d63b7dSRichard Lowe 		   */
534*10d63b7dSRichard Lowe 		if(make_state_dir[0] == '\0') {
535*10d63b7dSRichard Lowe 		   make_state_dir[0] = '/';
536*10d63b7dSRichard Lowe 		   make_state_dir[1] = '\0';
537*10d63b7dSRichard Lowe 		}
538*10d63b7dSRichard Lowe  		if (make_state_dir[0] == (int) slash_char) {
539*10d63b7dSRichard Lowe  			temp_file_directory = strdup(make_state_dir);
540*10d63b7dSRichard Lowe  		} else {
541*10d63b7dSRichard Lowe  			char	tmp_current_path2[MAXPATHLEN];
542*10d63b7dSRichard Lowe 
543*10d63b7dSRichard Lowe  			(void) sprintf(tmp_current_path2,
544*10d63b7dSRichard Lowe  			               "%s/%s",
545*10d63b7dSRichard Lowe  			               get_current_path(),
546*10d63b7dSRichard Lowe  			               make_state_dir);
547*10d63b7dSRichard Lowe  			temp_file_directory = strdup(tmp_current_path2);
548*10d63b7dSRichard Lowe  		}
549*10d63b7dSRichard Lowe  	}
550*10d63b7dSRichard Lowe 
551*10d63b7dSRichard Lowe 
552*10d63b7dSRichard Lowe 	report_dir_enter_leave(true);
553*10d63b7dSRichard Lowe 
554*10d63b7dSRichard Lowe 	make_targets(argc, argv, parallel_flag);
555*10d63b7dSRichard Lowe 
556*10d63b7dSRichard Lowe 	report_dir_enter_leave(false);
557*10d63b7dSRichard Lowe 
558*10d63b7dSRichard Lowe 	if (build_failed_ever_seen) {
559*10d63b7dSRichard Lowe 		if (posix) {
560*10d63b7dSRichard Lowe 			exit_status = 1;
561*10d63b7dSRichard Lowe 		}
562*10d63b7dSRichard Lowe 		exit(1);
563*10d63b7dSRichard Lowe 	}
564*10d63b7dSRichard Lowe 	exit_status = 0;
565*10d63b7dSRichard Lowe 	exit(0);
566*10d63b7dSRichard Lowe 	/* NOTREACHED */
567*10d63b7dSRichard Lowe }
568*10d63b7dSRichard Lowe 
569*10d63b7dSRichard Lowe /*
570*10d63b7dSRichard Lowe  *	cleanup_after_exit()
571*10d63b7dSRichard Lowe  *
572*10d63b7dSRichard Lowe  *	Called from exit(), performs cleanup actions.
573*10d63b7dSRichard Lowe  *
574*10d63b7dSRichard Lowe  *	Parameters:
575*10d63b7dSRichard Lowe  *		status		The argument exit() was called with
576*10d63b7dSRichard Lowe  *		arg		Address of an argument vector to
577*10d63b7dSRichard Lowe  *				cleanup_after_exit()
578*10d63b7dSRichard Lowe  *
579*10d63b7dSRichard Lowe  *	Global variables used:
580*10d63b7dSRichard Lowe  *		command_changed	Set if we think .make.state should be rewritten
581*10d63b7dSRichard Lowe  *		current_line	Is set we set commands_changed
582*10d63b7dSRichard Lowe  *		do_not_exec_rule
583*10d63b7dSRichard Lowe  *				True if -n flag on
584*10d63b7dSRichard Lowe  *		done		The Name ".DONE", rule we run
585*10d63b7dSRichard Lowe  *		keep_state	Set if .KEEP_STATE seen
586*10d63b7dSRichard Lowe  *		parallel	True if building in parallel
587*10d63b7dSRichard Lowe  *		quest		If -q is on we do not run .DONE
588*10d63b7dSRichard Lowe  *		report_dependencies
589*10d63b7dSRichard Lowe  *				True if -P flag on
590*10d63b7dSRichard Lowe  *		running_list	List of parallel running processes
591*10d63b7dSRichard Lowe  *		temp_file_name	The temp file is removed, if any
592*10d63b7dSRichard Lowe  */
593*10d63b7dSRichard Lowe extern "C" void
cleanup_after_exit(void)594*10d63b7dSRichard Lowe cleanup_after_exit(void)
595*10d63b7dSRichard Lowe {
596*10d63b7dSRichard Lowe 	Running		rp;
597*10d63b7dSRichard Lowe 
598*10d63b7dSRichard Lowe extern long	getname_bytes_count;
599*10d63b7dSRichard Lowe extern long	getname_names_count;
600*10d63b7dSRichard Lowe extern long	getname_struct_count;
601*10d63b7dSRichard Lowe extern long	freename_bytes_count;
602*10d63b7dSRichard Lowe extern long	freename_names_count;
603*10d63b7dSRichard Lowe extern long	freename_struct_count;
604*10d63b7dSRichard Lowe extern long	other_alloc;
605*10d63b7dSRichard Lowe 
606*10d63b7dSRichard Lowe extern long	env_alloc_num;
607*10d63b7dSRichard Lowe extern long	env_alloc_bytes;
608*10d63b7dSRichard Lowe 
609*10d63b7dSRichard Lowe 
610*10d63b7dSRichard Lowe #ifdef DMAKE_STATISTICS
611*10d63b7dSRichard Lowe if(getname_stat) {
612*10d63b7dSRichard Lowe 	printf(">>> Getname statistics:\n");
613*10d63b7dSRichard Lowe 	printf("  Allocated:\n");
614*10d63b7dSRichard Lowe 	printf("        Names: %ld\n", getname_names_count);
615*10d63b7dSRichard Lowe 	printf("      Strings: %ld Kb (%ld bytes)\n", getname_bytes_count/1000, getname_bytes_count);
616*10d63b7dSRichard Lowe 	printf("      Structs: %ld Kb (%ld bytes)\n", getname_struct_count/1000, getname_struct_count);
617*10d63b7dSRichard Lowe 	printf("  Total bytes: %ld Kb (%ld bytes)\n", getname_struct_count/1000 + getname_bytes_count/1000, getname_struct_count + getname_bytes_count);
618*10d63b7dSRichard Lowe 
619*10d63b7dSRichard Lowe 	printf("\n  Unallocated: %ld\n", freename_names_count);
620*10d63b7dSRichard Lowe 	printf("        Names: %ld\n", freename_names_count);
621*10d63b7dSRichard Lowe 	printf("      Strings: %ld Kb (%ld bytes)\n", freename_bytes_count/1000, freename_bytes_count);
622*10d63b7dSRichard Lowe 	printf("      Structs: %ld Kb (%ld bytes)\n", freename_struct_count/1000, freename_struct_count);
623*10d63b7dSRichard Lowe 	printf("  Total bytes: %ld Kb (%ld bytes)\n", freename_struct_count/1000 + freename_bytes_count/1000, freename_struct_count + freename_bytes_count);
624*10d63b7dSRichard Lowe 
625*10d63b7dSRichard Lowe 	printf("\n  Total used: %ld Kb (%ld bytes)\n", (getname_struct_count/1000 + getname_bytes_count/1000) - (freename_struct_count/1000 + freename_bytes_count/1000), (getname_struct_count + getname_bytes_count) - (freename_struct_count + freename_bytes_count));
626*10d63b7dSRichard Lowe 
627*10d63b7dSRichard Lowe 	printf("\n>>> Other:\n");
628*10d63b7dSRichard Lowe 	printf(
629*10d63b7dSRichard Lowe 		"       Env (%ld): %ld Kb (%ld bytes)\n",
630*10d63b7dSRichard Lowe 		env_alloc_num,
631*10d63b7dSRichard Lowe 		env_alloc_bytes/1000,
632*10d63b7dSRichard Lowe 		env_alloc_bytes
633*10d63b7dSRichard Lowe 	);
634*10d63b7dSRichard Lowe 
635*10d63b7dSRichard Lowe }
636*10d63b7dSRichard Lowe #endif
637*10d63b7dSRichard Lowe 
638*10d63b7dSRichard Lowe 	parallel = false;
639*10d63b7dSRichard Lowe 	/* If we used the SVR4_MAKE, don't build .DONE or .FAILED */
640*10d63b7dSRichard Lowe 	if (!getenv(USE_SVR4_MAKE)){
641*10d63b7dSRichard Lowe 	    /* Build the target .DONE or .FAILED if we caught an error */
642*10d63b7dSRichard Lowe 	    if (!quest && !list_all_targets) {
643*10d63b7dSRichard Lowe 		Name		failed_name;
644*10d63b7dSRichard Lowe 
645*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, ".FAILED");
646*10d63b7dSRichard Lowe 		failed_name = GETNAME(wcs_buffer, FIND_LENGTH);
647*10d63b7dSRichard Lowe 		if ((exit_status != 0) && (failed_name->prop != NULL)) {
648*10d63b7dSRichard Lowe 			/*
649*10d63b7dSRichard Lowe 			 * [tolik] switch DMake to serial mode
650*10d63b7dSRichard Lowe 			 */
651*10d63b7dSRichard Lowe 			dmake_mode_type = serial_mode;
652*10d63b7dSRichard Lowe 			no_parallel = true;
653*10d63b7dSRichard Lowe 			(void) doname(failed_name, false, true);
654*10d63b7dSRichard Lowe 		} else {
655*10d63b7dSRichard Lowe 		    if (!trace_status) {
656*10d63b7dSRichard Lowe 			/*
657*10d63b7dSRichard Lowe 			 * Switch DMake to serial mode
658*10d63b7dSRichard Lowe 			 */
659*10d63b7dSRichard Lowe 			dmake_mode_type = serial_mode;
660*10d63b7dSRichard Lowe 			no_parallel = true;
661*10d63b7dSRichard Lowe 			(void) doname(done, false, true);
662*10d63b7dSRichard Lowe 		    }
663*10d63b7dSRichard Lowe 		}
664*10d63b7dSRichard Lowe 	    }
665*10d63b7dSRichard Lowe 	}
666*10d63b7dSRichard Lowe 	/*
667*10d63b7dSRichard Lowe 	 * Remove the temp file utilities report dependencies thru if it
668*10d63b7dSRichard Lowe 	 * is still around
669*10d63b7dSRichard Lowe 	 */
670*10d63b7dSRichard Lowe 	if (temp_file_name != NULL) {
671*10d63b7dSRichard Lowe 		(void) unlink(temp_file_name->string_mb);
672*10d63b7dSRichard Lowe 	}
673*10d63b7dSRichard Lowe 	/*
674*10d63b7dSRichard Lowe 	 * Do not save the current command in .make.state if make
675*10d63b7dSRichard Lowe 	 * was interrupted.
676*10d63b7dSRichard Lowe 	 */
677*10d63b7dSRichard Lowe 	if (current_line != NULL) {
678*10d63b7dSRichard Lowe 		command_changed = true;
679*10d63b7dSRichard Lowe 		current_line->body.line.command_used = NULL;
680*10d63b7dSRichard Lowe 	}
681*10d63b7dSRichard Lowe 	/*
682*10d63b7dSRichard Lowe 	 * For each parallel build process running, remove the temp files
683*10d63b7dSRichard Lowe 	 * and zap the command line so it won't be put in .make.state
684*10d63b7dSRichard Lowe 	 */
685*10d63b7dSRichard Lowe 	for (rp = running_list; rp != NULL; rp = rp->next) {
686*10d63b7dSRichard Lowe 		if (rp->temp_file != NULL) {
687*10d63b7dSRichard Lowe 			(void) unlink(rp->temp_file->string_mb);
688*10d63b7dSRichard Lowe 		}
689*10d63b7dSRichard Lowe 		if (rp->stdout_file != NULL) {
690*10d63b7dSRichard Lowe 			(void) unlink(rp->stdout_file);
691*10d63b7dSRichard Lowe 			retmem_mb(rp->stdout_file);
692*10d63b7dSRichard Lowe 			rp->stdout_file = NULL;
693*10d63b7dSRichard Lowe 		}
694*10d63b7dSRichard Lowe 		if (rp->stderr_file != NULL) {
695*10d63b7dSRichard Lowe 			(void) unlink(rp->stderr_file);
696*10d63b7dSRichard Lowe 			retmem_mb(rp->stderr_file);
697*10d63b7dSRichard Lowe 			rp->stderr_file = NULL;
698*10d63b7dSRichard Lowe 		}
699*10d63b7dSRichard Lowe 		command_changed = true;
700*10d63b7dSRichard Lowe /*
701*10d63b7dSRichard Lowe 		line = get_prop(rp->target->prop, line_prop);
702*10d63b7dSRichard Lowe 		if (line != NULL) {
703*10d63b7dSRichard Lowe 			line->body.line.command_used = NULL;
704*10d63b7dSRichard Lowe 		}
705*10d63b7dSRichard Lowe  */
706*10d63b7dSRichard Lowe 	}
707*10d63b7dSRichard Lowe 	/* Remove the statefile lock file if the file has been locked */
708*10d63b7dSRichard Lowe 	if ((make_state_lockfile != NULL) && (make_state_locked)) {
709*10d63b7dSRichard Lowe 		(void) unlink(make_state_lockfile);
710*10d63b7dSRichard Lowe 		make_state_lockfile = NULL;
711*10d63b7dSRichard Lowe 		make_state_locked = false;
712*10d63b7dSRichard Lowe 	}
713*10d63b7dSRichard Lowe 	/* Write .make.state */
714*10d63b7dSRichard Lowe 	write_state_file(1, (Boolean) 1);
715*10d63b7dSRichard Lowe 
716*10d63b7dSRichard Lowe 	job_adjust_fini();
717*10d63b7dSRichard Lowe }
718*10d63b7dSRichard Lowe 
719*10d63b7dSRichard Lowe /*
720*10d63b7dSRichard Lowe  *	handle_interrupt()
721*10d63b7dSRichard Lowe  *
722*10d63b7dSRichard Lowe  *	This is where C-C traps are caught.
723*10d63b7dSRichard Lowe  *
724*10d63b7dSRichard Lowe  *	Parameters:
725*10d63b7dSRichard Lowe  *
726*10d63b7dSRichard Lowe  *	Global variables used (except DMake 1.0):
727*10d63b7dSRichard Lowe  *		current_target		Sometimes the current target is removed
728*10d63b7dSRichard Lowe  *		do_not_exec_rule	But not if -n is on
729*10d63b7dSRichard Lowe  *		quest			or -q
730*10d63b7dSRichard Lowe  *		running_list		List of parallel running processes
731*10d63b7dSRichard Lowe  *		touch			Current target is not removed if -t on
732*10d63b7dSRichard Lowe  */
733*10d63b7dSRichard Lowe void
handle_interrupt(int)734*10d63b7dSRichard Lowe handle_interrupt(int)
735*10d63b7dSRichard Lowe {
736*10d63b7dSRichard Lowe 	Property		member;
737*10d63b7dSRichard Lowe 	Running			rp;
738*10d63b7dSRichard Lowe 
739*10d63b7dSRichard Lowe 	(void) fflush(stdout);
740*10d63b7dSRichard Lowe 	if (childPid > 0) {
741*10d63b7dSRichard Lowe 		kill(childPid, SIGTERM);
742*10d63b7dSRichard Lowe 		childPid = -1;
743*10d63b7dSRichard Lowe 	}
744*10d63b7dSRichard Lowe 	for (rp = running_list; rp != NULL; rp = rp->next) {
745*10d63b7dSRichard Lowe 		if (rp->state != build_running) {
746*10d63b7dSRichard Lowe 			continue;
747*10d63b7dSRichard Lowe 		}
748*10d63b7dSRichard Lowe 		if (rp->pid > 0) {
749*10d63b7dSRichard Lowe 			kill(rp->pid, SIGTERM);
750*10d63b7dSRichard Lowe 			rp->pid = -1;
751*10d63b7dSRichard Lowe 		}
752*10d63b7dSRichard Lowe 	}
753*10d63b7dSRichard Lowe 	if (getpid() == getpgrp()) {
754*10d63b7dSRichard Lowe 		bsd_signal(SIGTERM, SIG_IGN);
755*10d63b7dSRichard Lowe 		kill (-getpid(), SIGTERM);
756*10d63b7dSRichard Lowe 	}
757*10d63b7dSRichard Lowe 	/* Clean up all parallel children already finished */
758*10d63b7dSRichard Lowe         finish_children(false);
759*10d63b7dSRichard Lowe 
760*10d63b7dSRichard Lowe 	/* Make sure the processes running under us terminate first */
761*10d63b7dSRichard Lowe 
762*10d63b7dSRichard Lowe 	while (wait((int *) NULL) != -1);
763*10d63b7dSRichard Lowe 	/* Delete the current targets unless they are precious */
764*10d63b7dSRichard Lowe 	if ((current_target != NULL) &&
765*10d63b7dSRichard Lowe 	    current_target->is_member &&
766*10d63b7dSRichard Lowe 	    ((member = get_prop(current_target->prop, member_prop)) != NULL)) {
767*10d63b7dSRichard Lowe 		current_target = member->body.member.library;
768*10d63b7dSRichard Lowe 	}
769*10d63b7dSRichard Lowe 	if (!do_not_exec_rule &&
770*10d63b7dSRichard Lowe 	    !touch &&
771*10d63b7dSRichard Lowe 	    !quest &&
772*10d63b7dSRichard Lowe 	    (current_target != NULL) &&
773*10d63b7dSRichard Lowe 	    !(current_target->stat.is_precious || all_precious)) {
774*10d63b7dSRichard Lowe 
775*10d63b7dSRichard Lowe /* BID_1030811 */
776*10d63b7dSRichard Lowe /* azv 16 Oct 95 */
777*10d63b7dSRichard Lowe 		current_target->stat.time = file_no_time;
778*10d63b7dSRichard Lowe 
779*10d63b7dSRichard Lowe 		if (exists(current_target) != file_doesnt_exist) {
780*10d63b7dSRichard Lowe 			(void) fprintf(stderr,
781*10d63b7dSRichard Lowe 				       "\n*** %s ",
782*10d63b7dSRichard Lowe 				       current_target->string_mb);
783*10d63b7dSRichard Lowe 			if (current_target->stat.is_dir) {
784*10d63b7dSRichard Lowe 				(void) fprintf(stderr,
785*10d63b7dSRichard Lowe 					       gettext("not removed.\n"),
786*10d63b7dSRichard Lowe 					       current_target->string_mb);
787*10d63b7dSRichard Lowe 			} else if (unlink(current_target->string_mb) == 0) {
788*10d63b7dSRichard Lowe 				(void) fprintf(stderr,
789*10d63b7dSRichard Lowe 					       gettext("removed.\n"),
790*10d63b7dSRichard Lowe 					       current_target->string_mb);
791*10d63b7dSRichard Lowe 			} else {
792*10d63b7dSRichard Lowe 				(void) fprintf(stderr,
793*10d63b7dSRichard Lowe 					       gettext("could not be removed: %s.\n"),
794*10d63b7dSRichard Lowe 					       current_target->string_mb,
795*10d63b7dSRichard Lowe 					       errmsg(errno));
796*10d63b7dSRichard Lowe 			}
797*10d63b7dSRichard Lowe 		}
798*10d63b7dSRichard Lowe 	}
799*10d63b7dSRichard Lowe 	for (rp = running_list; rp != NULL; rp = rp->next) {
800*10d63b7dSRichard Lowe 		if (rp->state != build_running) {
801*10d63b7dSRichard Lowe 			continue;
802*10d63b7dSRichard Lowe 		}
803*10d63b7dSRichard Lowe 		if (rp->target->is_member &&
804*10d63b7dSRichard Lowe 		    ((member = get_prop(rp->target->prop, member_prop)) !=
805*10d63b7dSRichard Lowe 		     NULL)) {
806*10d63b7dSRichard Lowe 			rp->target = member->body.member.library;
807*10d63b7dSRichard Lowe 		}
808*10d63b7dSRichard Lowe 		if (!do_not_exec_rule &&
809*10d63b7dSRichard Lowe 		    !touch &&
810*10d63b7dSRichard Lowe 		    !quest &&
811*10d63b7dSRichard Lowe 		    !(rp->target->stat.is_precious || all_precious)) {
812*10d63b7dSRichard Lowe 
813*10d63b7dSRichard Lowe 			rp->target->stat.time = file_no_time;
814*10d63b7dSRichard Lowe 			if (exists(rp->target) != file_doesnt_exist) {
815*10d63b7dSRichard Lowe 				(void) fprintf(stderr,
816*10d63b7dSRichard Lowe 					       "\n*** %s ",
817*10d63b7dSRichard Lowe 					       rp->target->string_mb);
818*10d63b7dSRichard Lowe 				if (rp->target->stat.is_dir) {
819*10d63b7dSRichard Lowe 					(void) fprintf(stderr,
820*10d63b7dSRichard Lowe 						       gettext("not removed.\n"),
821*10d63b7dSRichard Lowe 						       rp->target->string_mb);
822*10d63b7dSRichard Lowe 				} else if (unlink(rp->target->string_mb) == 0) {
823*10d63b7dSRichard Lowe 					(void) fprintf(stderr,
824*10d63b7dSRichard Lowe 						       gettext("removed.\n"),
825*10d63b7dSRichard Lowe 						       rp->target->string_mb);
826*10d63b7dSRichard Lowe 				} else {
827*10d63b7dSRichard Lowe 					(void) fprintf(stderr,
828*10d63b7dSRichard Lowe 						       gettext("could not be removed: %s.\n"),
829*10d63b7dSRichard Lowe 						       rp->target->string_mb,
830*10d63b7dSRichard Lowe 						       errmsg(errno));
831*10d63b7dSRichard Lowe 				}
832*10d63b7dSRichard Lowe 			}
833*10d63b7dSRichard Lowe 		}
834*10d63b7dSRichard Lowe 	}
835*10d63b7dSRichard Lowe 
836*10d63b7dSRichard Lowe 
837*10d63b7dSRichard Lowe 	/* Have we locked .make.state or .nse_depinfo? */
838*10d63b7dSRichard Lowe 	if ((make_state_lockfile != NULL) && (make_state_locked)) {
839*10d63b7dSRichard Lowe 		unlink(make_state_lockfile);
840*10d63b7dSRichard Lowe 		make_state_lockfile = NULL;
841*10d63b7dSRichard Lowe 		make_state_locked = false;
842*10d63b7dSRichard Lowe 	}
843*10d63b7dSRichard Lowe 	/*
844*10d63b7dSRichard Lowe 	 * Re-read .make.state file (it might be changed by recursive make)
845*10d63b7dSRichard Lowe 	 */
846*10d63b7dSRichard Lowe 	check_state(NULL);
847*10d63b7dSRichard Lowe 
848*10d63b7dSRichard Lowe 	report_dir_enter_leave(false);
849*10d63b7dSRichard Lowe 
850*10d63b7dSRichard Lowe 	exit_status = 2;
851*10d63b7dSRichard Lowe 	exit(2);
852*10d63b7dSRichard Lowe }
853*10d63b7dSRichard Lowe 
854*10d63b7dSRichard Lowe /*
855*10d63b7dSRichard Lowe  *	doalarm(sig, ...)
856*10d63b7dSRichard Lowe  *
857*10d63b7dSRichard Lowe  *	Handle the alarm interrupt but do nothing.  Side effect is to
858*10d63b7dSRichard Lowe  *	cause return from wait3.
859*10d63b7dSRichard Lowe  *
860*10d63b7dSRichard Lowe  *	Parameters:
861*10d63b7dSRichard Lowe  *		sig
862*10d63b7dSRichard Lowe  *
863*10d63b7dSRichard Lowe  *	Global variables used:
864*10d63b7dSRichard Lowe  */
865*10d63b7dSRichard Lowe /*ARGSUSED*/
866*10d63b7dSRichard Lowe static void
doalarm(int)867*10d63b7dSRichard Lowe doalarm(int)
868*10d63b7dSRichard Lowe {
869*10d63b7dSRichard Lowe 	return;
870*10d63b7dSRichard Lowe }
871*10d63b7dSRichard Lowe 
872*10d63b7dSRichard Lowe 
873*10d63b7dSRichard Lowe /*
874*10d63b7dSRichard Lowe  *	read_command_options(argc, argv)
875*10d63b7dSRichard Lowe  *
876*10d63b7dSRichard Lowe  *	Scan the cmd line options and process the ones that start with "-"
877*10d63b7dSRichard Lowe  *
878*10d63b7dSRichard Lowe  *	Return value:
879*10d63b7dSRichard Lowe  *				-M argument, if any
880*10d63b7dSRichard Lowe  *
881*10d63b7dSRichard Lowe  *	Parameters:
882*10d63b7dSRichard Lowe  *		argc		You know what this is
883*10d63b7dSRichard Lowe  *		argv		You know what this is
884*10d63b7dSRichard Lowe  *
885*10d63b7dSRichard Lowe  *	Global variables used:
886*10d63b7dSRichard Lowe  */
887*10d63b7dSRichard Lowe static void
read_command_options(register int argc,register char ** argv)888*10d63b7dSRichard Lowe read_command_options(register int argc, register char **argv)
889*10d63b7dSRichard Lowe {
890*10d63b7dSRichard Lowe 	register int		ch;
891*10d63b7dSRichard Lowe 	int			current_optind = 1;
892*10d63b7dSRichard Lowe 	int			last_optind_with_double_hyphen = 0;
893*10d63b7dSRichard Lowe 	int			last_optind;
894*10d63b7dSRichard Lowe 	int			last_current_optind;
895*10d63b7dSRichard Lowe 	register int		i;
896*10d63b7dSRichard Lowe 	register int		j;
897*10d63b7dSRichard Lowe 	register int		k;
898*10d63b7dSRichard Lowe 	register int		makefile_next = 0; /*
899*10d63b7dSRichard Lowe 						    * flag to note options:
900*10d63b7dSRichard Lowe 						    * -c, f, g, j, m, o
901*10d63b7dSRichard Lowe 						    */
902*10d63b7dSRichard Lowe 	const char		*tptr;
903*10d63b7dSRichard Lowe 	const char		*CMD_OPTS;
904*10d63b7dSRichard Lowe 
905*10d63b7dSRichard Lowe 	extern char		*optarg;
906*10d63b7dSRichard Lowe 	extern int		optind, opterr, optopt;
907*10d63b7dSRichard Lowe 
908*10d63b7dSRichard Lowe #define SUNPRO_CMD_OPTS	"-~Bbc:Ddef:g:ij:K:kM:m:NnO:o:PpqRrSsTtuVvwx:"
909*10d63b7dSRichard Lowe 
910*10d63b7dSRichard Lowe #	define SVR4_CMD_OPTS   "-c:ef:g:ij:km:nO:o:pqrsTtVv"
911*10d63b7dSRichard Lowe 
912*10d63b7dSRichard Lowe 	/*
913*10d63b7dSRichard Lowe 	 * Added V in SVR4_CMD_OPTS also, which is going to be a hidden
914*10d63b7dSRichard Lowe 	 * option, just to make sure that the getopt doesn't fail when some
915*10d63b7dSRichard Lowe 	 * users leave their USE_SVR4_MAKE set and try to use the makefiles
916*10d63b7dSRichard Lowe 	 * that are designed to issue commands like $(MAKE) -V. Anyway it
917*10d63b7dSRichard Lowe 	 * sets the same flag but ensures that getopt doesn't fail.
918*10d63b7dSRichard Lowe 	 */
919*10d63b7dSRichard Lowe 
920*10d63b7dSRichard Lowe 	opterr = 0;
921*10d63b7dSRichard Lowe 	optind = 1;
922*10d63b7dSRichard Lowe 	while (1) {
923*10d63b7dSRichard Lowe 		last_optind=optind;			/* Save optind and current_optind values */
924*10d63b7dSRichard Lowe 		last_current_optind=current_optind;	/* in case we have to repeat this round. */
925*10d63b7dSRichard Lowe 		if (svr4) {
926*10d63b7dSRichard Lowe 			CMD_OPTS=SVR4_CMD_OPTS;
927*10d63b7dSRichard Lowe 			ch = getopt(argc, argv, SVR4_CMD_OPTS);
928*10d63b7dSRichard Lowe 		} else {
929*10d63b7dSRichard Lowe 			CMD_OPTS=SUNPRO_CMD_OPTS;
930*10d63b7dSRichard Lowe 			ch = getopt(argc, argv, SUNPRO_CMD_OPTS);
931*10d63b7dSRichard Lowe 		}
932*10d63b7dSRichard Lowe 		if (ch == EOF) {
933*10d63b7dSRichard Lowe 			if(optind < argc) {
934*10d63b7dSRichard Lowe 				/*
935*10d63b7dSRichard Lowe 				 * Fixing bug 4102537:
936*10d63b7dSRichard Lowe 				 *    Strange behaviour of command make using -- option.
937*10d63b7dSRichard Lowe 				 * Not all argv have been processed
938*10d63b7dSRichard Lowe 				 * Skip non-flag argv and continue processing.
939*10d63b7dSRichard Lowe 				 */
940*10d63b7dSRichard Lowe 				optind++;
941*10d63b7dSRichard Lowe 				current_optind++;
942*10d63b7dSRichard Lowe 				continue;
943*10d63b7dSRichard Lowe 			} else {
944*10d63b7dSRichard Lowe 				break;
945*10d63b7dSRichard Lowe 			}
946*10d63b7dSRichard Lowe 
947*10d63b7dSRichard Lowe 		}
948*10d63b7dSRichard Lowe 		if (ch == '?') {
949*10d63b7dSRichard Lowe 		 	if (optopt == '-') {
950*10d63b7dSRichard Lowe 				/* Bug 5060758: getopt() changed behavior (s10_60),
951*10d63b7dSRichard Lowe 				 * and now we have to deal with cases when options
952*10d63b7dSRichard Lowe 				 * with double hyphen appear here, from -$(MAKEFLAGS)
953*10d63b7dSRichard Lowe 				 */
954*10d63b7dSRichard Lowe 				i = current_optind;
955*10d63b7dSRichard Lowe 				if (argv[i][0] == '-') {
956*10d63b7dSRichard Lowe 				  if (argv[i][1] == '-') {
957*10d63b7dSRichard Lowe 				    if (argv[i][2] != '\0') {
958*10d63b7dSRichard Lowe 				      /* Check if this option is allowed */
959*10d63b7dSRichard Lowe 				      tptr = strchr(CMD_OPTS, argv[i][2]);
960*10d63b7dSRichard Lowe 				      if (tptr) {
961*10d63b7dSRichard Lowe 				        if (last_optind_with_double_hyphen != current_optind) {
962*10d63b7dSRichard Lowe 				          /* This is first time we are trying to fix "--"
963*10d63b7dSRichard Lowe 				           * problem with this option. If we come here second
964*10d63b7dSRichard Lowe 				           * time, we will go to fatal error.
965*10d63b7dSRichard Lowe 				           */
966*10d63b7dSRichard Lowe 				          last_optind_with_double_hyphen = current_optind;
967*10d63b7dSRichard Lowe 
968*10d63b7dSRichard Lowe 				          /* Eliminate first hyphen character */
969*10d63b7dSRichard Lowe 				          for (j=0; argv[i][j] != '\0'; j++) {
970*10d63b7dSRichard Lowe 				            argv[i][j] = argv[i][j+1];
971*10d63b7dSRichard Lowe 				          }
972*10d63b7dSRichard Lowe 
973*10d63b7dSRichard Lowe 				          /* Repeat the processing of this argument */
974*10d63b7dSRichard Lowe 				          optind=last_optind;
975*10d63b7dSRichard Lowe 				          current_optind=last_current_optind;
976*10d63b7dSRichard Lowe 				          continue;
977*10d63b7dSRichard Lowe 				        }
978*10d63b7dSRichard Lowe 				      }
979*10d63b7dSRichard Lowe 				    }
980*10d63b7dSRichard Lowe 				  }
981*10d63b7dSRichard Lowe 				}
982*10d63b7dSRichard Lowe 			}
983*10d63b7dSRichard Lowe 		}
984*10d63b7dSRichard Lowe 
985*10d63b7dSRichard Lowe 		if (ch == '?') {
986*10d63b7dSRichard Lowe 			if (svr4) {
987*10d63b7dSRichard Lowe 				fprintf(stderr,
988*10d63b7dSRichard Lowe 					gettext("Usage : dmake [ -f makefile ][ -c dmake_rcfile ][ -g dmake_group ]\n"));
989*10d63b7dSRichard Lowe 				fprintf(stderr,
990*10d63b7dSRichard Lowe 					gettext("              [ -j dmake_max_jobs ][ -m dmake_mode ][ -o dmake_odir ]...\n"));
991*10d63b7dSRichard Lowe 				fprintf(stderr,
992*10d63b7dSRichard Lowe 					gettext("              [ -e ][ -i ][ -k ][ -n ][ -p ][ -q ][ -r ][ -s ][ -t ][ -v ]\n"));
993*10d63b7dSRichard Lowe 				tptr = strchr(SVR4_CMD_OPTS, optopt);
994*10d63b7dSRichard Lowe 			} else {
995*10d63b7dSRichard Lowe 				fprintf(stderr,
996*10d63b7dSRichard Lowe 					gettext("Usage : dmake [ -f makefile ][ -c dmake_rcfile ][ -g dmake_group ]\n"));
997*10d63b7dSRichard Lowe 				fprintf(stderr,
998*10d63b7dSRichard Lowe 					gettext("              [ -j dmake_max_jobs ][ -K statefile ][ -m dmake_mode ][ -x MODE_NAME=VALUE ][ -o dmake_odir ]...\n"));
999*10d63b7dSRichard Lowe 				fprintf(stderr,
1000*10d63b7dSRichard Lowe 					gettext("              [ -d ][ -dd ][ -D ][ -DD ][ -e ][ -i ][ -k ][ -n ][ -p ][ -P ][ -u ][ -w ]\n"));
1001*10d63b7dSRichard Lowe 				fprintf(stderr,
1002*10d63b7dSRichard Lowe 					gettext("              [ -q ][ -r ][ -s ][ -S ][ -t ][ -v ][ -V ][ target... ][ macro=value... ][ \"macro +=value\"... ]\n"));
1003*10d63b7dSRichard Lowe 				tptr = strchr(SUNPRO_CMD_OPTS, optopt);
1004*10d63b7dSRichard Lowe 			}
1005*10d63b7dSRichard Lowe 			if (!tptr) {
1006*10d63b7dSRichard Lowe 				fatal(gettext("Unknown option `-%c'"), optopt);
1007*10d63b7dSRichard Lowe 			} else {
1008*10d63b7dSRichard Lowe 				fatal(gettext("Missing argument after `-%c'"), optopt);
1009*10d63b7dSRichard Lowe 			}
1010*10d63b7dSRichard Lowe 		}
1011*10d63b7dSRichard Lowe 
1012*10d63b7dSRichard Lowe 
1013*10d63b7dSRichard Lowe 
1014*10d63b7dSRichard Lowe 		makefile_next |= parse_command_option(ch);
1015*10d63b7dSRichard Lowe 		/*
1016*10d63b7dSRichard Lowe 		 * If we're done processing all of the options of
1017*10d63b7dSRichard Lowe 		 * ONE argument string...
1018*10d63b7dSRichard Lowe 		 */
1019*10d63b7dSRichard Lowe 		if (current_optind < optind) {
1020*10d63b7dSRichard Lowe 			i = current_optind;
1021*10d63b7dSRichard Lowe 			k = 0;
1022*10d63b7dSRichard Lowe 			/* If there's an argument for an option... */
1023*10d63b7dSRichard Lowe 			if ((optind - current_optind) > 1) {
1024*10d63b7dSRichard Lowe 				k = i + 1;
1025*10d63b7dSRichard Lowe 			}
1026*10d63b7dSRichard Lowe 			switch (makefile_next) {
1027*10d63b7dSRichard Lowe 			case 0:
1028*10d63b7dSRichard Lowe 				argv[i] = NULL;
1029*10d63b7dSRichard Lowe 				/* This shouldn't happen */
1030*10d63b7dSRichard Lowe 				if (k) {
1031*10d63b7dSRichard Lowe 					argv[k] = NULL;
1032*10d63b7dSRichard Lowe 				}
1033*10d63b7dSRichard Lowe 				break;
1034*10d63b7dSRichard Lowe 			case 1:	/* -f seen */
1035*10d63b7dSRichard Lowe 				argv[i] = (char *)"-f";
1036*10d63b7dSRichard Lowe 				break;
1037*10d63b7dSRichard Lowe 			case 2:	/* -c seen */
1038*10d63b7dSRichard Lowe 				argv[i] = (char *)"-c";
1039*10d63b7dSRichard Lowe 				break;
1040*10d63b7dSRichard Lowe 			case 4:	/* -g seen */
1041*10d63b7dSRichard Lowe 				argv[i] = (char *)"-g";
1042*10d63b7dSRichard Lowe 				break;
1043*10d63b7dSRichard Lowe 			case 8:	/* -j seen */
1044*10d63b7dSRichard Lowe 				argv[i] = (char *)"-j";
1045*10d63b7dSRichard Lowe 				break;
1046*10d63b7dSRichard Lowe 			case 16: /* -M seen */
1047*10d63b7dSRichard Lowe 				argv[i] = (char *)"-M";
1048*10d63b7dSRichard Lowe 				break;
1049*10d63b7dSRichard Lowe 			case 32: /* -m seen */
1050*10d63b7dSRichard Lowe 				argv[i] = (char *)"-m";
1051*10d63b7dSRichard Lowe 				break;
1052*10d63b7dSRichard Lowe 			case 128: /* -O seen */
1053*10d63b7dSRichard Lowe 				argv[i] = (char *)"-O";
1054*10d63b7dSRichard Lowe 				break;
1055*10d63b7dSRichard Lowe 			case 256: /* -K seen */
1056*10d63b7dSRichard Lowe 				argv[i] = (char *)"-K";
1057*10d63b7dSRichard Lowe 			        break;
1058*10d63b7dSRichard Lowe 			case 512:	/* -o seen */
1059*10d63b7dSRichard Lowe 				argv[i] = (char *)"-o";
1060*10d63b7dSRichard Lowe 				break;
1061*10d63b7dSRichard Lowe 			case 1024: /* -x seen */
1062*10d63b7dSRichard Lowe 				argv[i] = (char *)"-x";
1063*10d63b7dSRichard Lowe 				break;
1064*10d63b7dSRichard Lowe 			default: /* > 1 of -c, f, g, j, K, M, m, O, o, x seen */
1065*10d63b7dSRichard Lowe 				fatal(gettext("Illegal command line. More than one option requiring\nan argument given in the same argument group"));
1066*10d63b7dSRichard Lowe 			}
1067*10d63b7dSRichard Lowe 
1068*10d63b7dSRichard Lowe 			makefile_next = 0;
1069*10d63b7dSRichard Lowe 			current_optind = optind;
1070*10d63b7dSRichard Lowe 		}
1071*10d63b7dSRichard Lowe 	}
1072*10d63b7dSRichard Lowe }
1073*10d63b7dSRichard Lowe 
1074*10d63b7dSRichard Lowe static void
quote_str(char * str,char * qstr)1075*10d63b7dSRichard Lowe quote_str(char *str, char *qstr)
1076*10d63b7dSRichard Lowe {
1077*10d63b7dSRichard Lowe 	char		*to;
1078*10d63b7dSRichard Lowe 	char		*from;
1079*10d63b7dSRichard Lowe 
1080*10d63b7dSRichard Lowe 	to = qstr;
1081*10d63b7dSRichard Lowe 	for (from = str; *from; from++) {
1082*10d63b7dSRichard Lowe 		switch (*from) {
1083*10d63b7dSRichard Lowe 		case ';':	/* End of command */
1084*10d63b7dSRichard Lowe 		case '(':	/* Start group */
1085*10d63b7dSRichard Lowe 		case ')':	/* End group */
1086*10d63b7dSRichard Lowe 		case '{':	/* Start group */
1087*10d63b7dSRichard Lowe 		case '}':	/* End group */
1088*10d63b7dSRichard Lowe 		case '[':	/* Reg expr - any of a set of chars */
1089*10d63b7dSRichard Lowe 		case ']':	/* End of set of chars */
1090*10d63b7dSRichard Lowe 		case '|':	/* Pipe or logical-or */
1091*10d63b7dSRichard Lowe 		case '^':	/* Old-fashioned pipe */
1092*10d63b7dSRichard Lowe 		case '&':	/* Background or logical-and */
1093*10d63b7dSRichard Lowe 		case '<':	/* Redirect stdin */
1094*10d63b7dSRichard Lowe 		case '>':	/* Redirect stdout */
1095*10d63b7dSRichard Lowe 		case '*':	/* Reg expr - any sequence of chars */
1096*10d63b7dSRichard Lowe 		case '?':	/* Reg expr - any single char */
1097*10d63b7dSRichard Lowe 		case '$':	/* Variable substitution */
1098*10d63b7dSRichard Lowe 		case '\'':	/* Singe quote - turn off all magic */
1099*10d63b7dSRichard Lowe 		case '"':	/* Double quote - span whitespace */
1100*10d63b7dSRichard Lowe 		case '`':	/* Backquote - run a command */
1101*10d63b7dSRichard Lowe 		case '#':	/* Comment */
1102*10d63b7dSRichard Lowe 		case ' ':	/* Space (for MACRO=value1 value2  */
1103*10d63b7dSRichard Lowe 		case '\\':	/* Escape char - turn off magic of next char */
1104*10d63b7dSRichard Lowe 			*to++ = '\\';
1105*10d63b7dSRichard Lowe 			break;
1106*10d63b7dSRichard Lowe 
1107*10d63b7dSRichard Lowe 		default:
1108*10d63b7dSRichard Lowe 			break;
1109*10d63b7dSRichard Lowe 		}
1110*10d63b7dSRichard Lowe 		*to++ = *from;
1111*10d63b7dSRichard Lowe 	}
1112*10d63b7dSRichard Lowe 	*to = '\0';
1113*10d63b7dSRichard Lowe }
1114*10d63b7dSRichard Lowe 
1115*10d63b7dSRichard Lowe static void
unquote_str(char * str,char * qstr)1116*10d63b7dSRichard Lowe unquote_str(char *str, char *qstr)
1117*10d63b7dSRichard Lowe {
1118*10d63b7dSRichard Lowe 	char		*to;
1119*10d63b7dSRichard Lowe 	char		*from;
1120*10d63b7dSRichard Lowe 
1121*10d63b7dSRichard Lowe 	to = qstr;
1122*10d63b7dSRichard Lowe 	for (from = str; *from; from++) {
1123*10d63b7dSRichard Lowe 		if (*from == '\\') {
1124*10d63b7dSRichard Lowe 			from++;
1125*10d63b7dSRichard Lowe 		}
1126*10d63b7dSRichard Lowe 		*to++ = *from;
1127*10d63b7dSRichard Lowe 	}
1128*10d63b7dSRichard Lowe 	*to = '\0';
1129*10d63b7dSRichard Lowe }
1130*10d63b7dSRichard Lowe 
1131*10d63b7dSRichard Lowe /*
1132*10d63b7dSRichard Lowe  * Convert the MAKEFLAGS string value into a vector of char *, similar
1133*10d63b7dSRichard Lowe  * to argv.
1134*10d63b7dSRichard Lowe  */
1135*10d63b7dSRichard Lowe static void
setup_makeflags_argv()1136*10d63b7dSRichard Lowe setup_makeflags_argv()
1137*10d63b7dSRichard Lowe {
1138*10d63b7dSRichard Lowe 	char		*cp;
1139*10d63b7dSRichard Lowe 	char		*cp1;
1140*10d63b7dSRichard Lowe 	char		*cp2;
1141*10d63b7dSRichard Lowe 	char		*cp3;
1142*10d63b7dSRichard Lowe 	char		*cp_orig;
1143*10d63b7dSRichard Lowe 	Boolean		add_hyphen;
1144*10d63b7dSRichard Lowe 	int		i;
1145*10d63b7dSRichard Lowe 	char		tmp_char;
1146*10d63b7dSRichard Lowe 
1147*10d63b7dSRichard Lowe 	mf_argc = 1;
1148*10d63b7dSRichard Lowe 	cp = getenv(makeflags->string_mb);
1149*10d63b7dSRichard Lowe 	cp_orig = cp;
1150*10d63b7dSRichard Lowe 
1151*10d63b7dSRichard Lowe 	if (cp) {
1152*10d63b7dSRichard Lowe 		/*
1153*10d63b7dSRichard Lowe 		 * If new MAKEFLAGS format, no need to add hyphen.
1154*10d63b7dSRichard Lowe 		 * If old MAKEFLAGS format, add hyphen before flags.
1155*10d63b7dSRichard Lowe 		 */
1156*10d63b7dSRichard Lowe 
1157*10d63b7dSRichard Lowe 		if ((strchr(cp, (int) hyphen_char) != NULL) ||
1158*10d63b7dSRichard Lowe 		    (strchr(cp, (int) equal_char) != NULL)) {
1159*10d63b7dSRichard Lowe 
1160*10d63b7dSRichard Lowe 			/* New MAKEFLAGS format */
1161*10d63b7dSRichard Lowe 
1162*10d63b7dSRichard Lowe 			add_hyphen = false;
1163*10d63b7dSRichard Lowe 
1164*10d63b7dSRichard Lowe 			/* Check if MAKEFLAGS value begins with multiple
1165*10d63b7dSRichard Lowe 			 * hyphen characters, and remove all duplicates.
1166*10d63b7dSRichard Lowe 			 * Usually it happens when the next command is
1167*10d63b7dSRichard Lowe 			 * used: $(MAKE) -$(MAKEFLAGS)
1168*10d63b7dSRichard Lowe 			 *
1169*10d63b7dSRichard Lowe 			 * This was a workaround for BugID 5060758, but
1170*10d63b7dSRichard Lowe 			 * appears to have survived as a fix in make.
1171*10d63b7dSRichard Lowe 			 */
1172*10d63b7dSRichard Lowe 			while (*cp) {
1173*10d63b7dSRichard Lowe 				if (*cp != (int) hyphen_char) {
1174*10d63b7dSRichard Lowe 					break;
1175*10d63b7dSRichard Lowe 				}
1176*10d63b7dSRichard Lowe 				cp++;
1177*10d63b7dSRichard Lowe 				if (*cp == (int) hyphen_char) {
1178*10d63b7dSRichard Lowe 					/* There are two hyphens. Skip one */
1179*10d63b7dSRichard Lowe 					cp_orig = cp;
1180*10d63b7dSRichard Lowe 					cp++;
1181*10d63b7dSRichard Lowe 				}
1182*10d63b7dSRichard Lowe 				if (!(*cp)) {
1183*10d63b7dSRichard Lowe 					/* There are hyphens only. Skip all */
1184*10d63b7dSRichard Lowe 					cp_orig = cp;
1185*10d63b7dSRichard Lowe 					break;
1186*10d63b7dSRichard Lowe 				}
1187*10d63b7dSRichard Lowe 			}
1188*10d63b7dSRichard Lowe 		} else {
1189*10d63b7dSRichard Lowe 
1190*10d63b7dSRichard Lowe 			/* Old MAKEFLAGS format */
1191*10d63b7dSRichard Lowe 
1192*10d63b7dSRichard Lowe 			add_hyphen = true;
1193*10d63b7dSRichard Lowe 		}
1194*10d63b7dSRichard Lowe 	}
1195*10d63b7dSRichard Lowe 
1196*10d63b7dSRichard Lowe 	/* Find the number of arguments in MAKEFLAGS */
1197*10d63b7dSRichard Lowe 	while (cp && *cp) {
1198*10d63b7dSRichard Lowe 		/* Skip white spaces */
1199*10d63b7dSRichard Lowe 		while (cp && *cp && isspace(*cp)) {
1200*10d63b7dSRichard Lowe 			cp++;
1201*10d63b7dSRichard Lowe 		}
1202*10d63b7dSRichard Lowe 		if (cp && *cp) {
1203*10d63b7dSRichard Lowe 			/* Increment arg count */
1204*10d63b7dSRichard Lowe 			mf_argc++;
1205*10d63b7dSRichard Lowe 			/* Go to next white space */
1206*10d63b7dSRichard Lowe 			while (cp && *cp && !isspace(*cp)) {
1207*10d63b7dSRichard Lowe 				if(*cp == (int) backslash_char) {
1208*10d63b7dSRichard Lowe 					cp++;
1209*10d63b7dSRichard Lowe 				}
1210*10d63b7dSRichard Lowe 				cp++;
1211*10d63b7dSRichard Lowe 			}
1212*10d63b7dSRichard Lowe 		}
1213*10d63b7dSRichard Lowe 	}
1214*10d63b7dSRichard Lowe 	/* Allocate memory for the new MAKEFLAGS argv */
1215*10d63b7dSRichard Lowe 	mf_argv = (char **) malloc((mf_argc + 1) * sizeof(char *));
1216*10d63b7dSRichard Lowe 	mf_argv[0] = (char *)"MAKEFLAGS";
1217*10d63b7dSRichard Lowe 	/*
1218*10d63b7dSRichard Lowe 	 * Convert the MAKEFLAGS string value into a vector of char *,
1219*10d63b7dSRichard Lowe 	 * similar to argv.
1220*10d63b7dSRichard Lowe 	 */
1221*10d63b7dSRichard Lowe 	cp = cp_orig;
1222*10d63b7dSRichard Lowe 	for (i = 1; i < mf_argc; i++) {
1223*10d63b7dSRichard Lowe 		/* Skip white spaces */
1224*10d63b7dSRichard Lowe 		while (cp && *cp && isspace(*cp)) {
1225*10d63b7dSRichard Lowe 			cp++;
1226*10d63b7dSRichard Lowe 		}
1227*10d63b7dSRichard Lowe 		if (cp && *cp) {
1228*10d63b7dSRichard Lowe 			cp_orig = cp;
1229*10d63b7dSRichard Lowe 			/* Go to next white space */
1230*10d63b7dSRichard Lowe 			while (cp && *cp && !isspace(*cp)) {
1231*10d63b7dSRichard Lowe 				if(*cp == (int) backslash_char) {
1232*10d63b7dSRichard Lowe 					cp++;
1233*10d63b7dSRichard Lowe 				}
1234*10d63b7dSRichard Lowe 				cp++;
1235*10d63b7dSRichard Lowe 			}
1236*10d63b7dSRichard Lowe 			tmp_char = *cp;
1237*10d63b7dSRichard Lowe 			*cp = (int) nul_char;
1238*10d63b7dSRichard Lowe 			if (add_hyphen) {
1239*10d63b7dSRichard Lowe 				mf_argv[i] = getmem(2 + strlen(cp_orig));
1240*10d63b7dSRichard Lowe 				mf_argv[i][0] = '\0';
1241*10d63b7dSRichard Lowe 				(void) strcat(mf_argv[i], "-");
1242*10d63b7dSRichard Lowe 				// (void) strcat(mf_argv[i], cp_orig);
1243*10d63b7dSRichard Lowe 				unquote_str(cp_orig, mf_argv[i]+1);
1244*10d63b7dSRichard Lowe 			} else {
1245*10d63b7dSRichard Lowe 				mf_argv[i] = getmem(2 + strlen(cp_orig));
1246*10d63b7dSRichard Lowe 				//mf_argv[i] = strdup(cp_orig);
1247*10d63b7dSRichard Lowe 				unquote_str(cp_orig, mf_argv[i]);
1248*10d63b7dSRichard Lowe 			}
1249*10d63b7dSRichard Lowe 			*cp = tmp_char;
1250*10d63b7dSRichard Lowe 		}
1251*10d63b7dSRichard Lowe 	}
1252*10d63b7dSRichard Lowe 	mf_argv[i] = NULL;
1253*10d63b7dSRichard Lowe }
1254*10d63b7dSRichard Lowe 
1255*10d63b7dSRichard Lowe /*
1256*10d63b7dSRichard Lowe  *	parse_command_option(ch)
1257*10d63b7dSRichard Lowe  *
1258*10d63b7dSRichard Lowe  *	Parse make command line options.
1259*10d63b7dSRichard Lowe  *
1260*10d63b7dSRichard Lowe  *	Return value:
1261*10d63b7dSRichard Lowe  *				Indicates if any -f -c or -M were seen
1262*10d63b7dSRichard Lowe  *
1263*10d63b7dSRichard Lowe  *	Parameters:
1264*10d63b7dSRichard Lowe  *		ch		The character to parse
1265*10d63b7dSRichard Lowe  *
1266*10d63b7dSRichard Lowe  *	Static variables used:
1267*10d63b7dSRichard Lowe  *		dmake_group_specified	Set for make -g
1268*10d63b7dSRichard Lowe  *		dmake_max_jobs_specified	Set for make -j
1269*10d63b7dSRichard Lowe  *		dmake_mode_specified	Set for make -m
1270*10d63b7dSRichard Lowe  *		dmake_add_mode_specified	Set for make -x
1271*10d63b7dSRichard Lowe  *		dmake_compat_mode_specified	Set for make -x SUN_MAKE_COMPAT_MODE=
1272*10d63b7dSRichard Lowe  *		dmake_output_mode_specified	Set for make -x DMAKE_OUTPUT_MODE=
1273*10d63b7dSRichard Lowe  *		dmake_odir_specified	Set for make -o
1274*10d63b7dSRichard Lowe  *		dmake_rcfile_specified	Set for make -c
1275*10d63b7dSRichard Lowe  *		env_wins		Set for make -e
1276*10d63b7dSRichard Lowe  *		ignore_default_mk	Set for make -r
1277*10d63b7dSRichard Lowe  *		trace_status		Set for make -p
1278*10d63b7dSRichard Lowe  *
1279*10d63b7dSRichard Lowe  *	Global variables used:
1280*10d63b7dSRichard Lowe  *		.make.state path & name set for make -K
1281*10d63b7dSRichard Lowe  *		continue_after_error	Set for make -k
1282*10d63b7dSRichard Lowe  *		debug_level		Set for make -d
1283*10d63b7dSRichard Lowe  *		do_not_exec_rule	Set for make -n
1284*10d63b7dSRichard Lowe  *		filter_stderr		Set for make -X
1285*10d63b7dSRichard Lowe  *		ignore_errors_all	Set for make -i
1286*10d63b7dSRichard Lowe  *		no_parallel		Set for make -R
1287*10d63b7dSRichard Lowe  *		quest			Set for make -q
1288*10d63b7dSRichard Lowe  *		read_trace_level	Set for make -D
1289*10d63b7dSRichard Lowe  *		report_dependencies	Set for make -P
1290*10d63b7dSRichard Lowe  *		silent_all		Set for make -s
1291*10d63b7dSRichard Lowe  *		touch			Set for make -t
1292*10d63b7dSRichard Lowe  */
1293*10d63b7dSRichard Lowe static int
parse_command_option(register char ch)1294*10d63b7dSRichard Lowe parse_command_option(register char ch)
1295*10d63b7dSRichard Lowe {
1296*10d63b7dSRichard Lowe 	static int		invert_next = 0;
1297*10d63b7dSRichard Lowe 	int			invert_this = invert_next;
1298*10d63b7dSRichard Lowe 
1299*10d63b7dSRichard Lowe 	invert_next = 0;
1300*10d63b7dSRichard Lowe 	switch (ch) {
1301*10d63b7dSRichard Lowe 	case '-':			 /* Ignore "--" */
1302*10d63b7dSRichard Lowe 		return 0;
1303*10d63b7dSRichard Lowe 	case '~':			 /* Invert next option */
1304*10d63b7dSRichard Lowe 		invert_next = 1;
1305*10d63b7dSRichard Lowe 		return 0;
1306*10d63b7dSRichard Lowe 	case 'B':			 /* Obsolete */
1307*10d63b7dSRichard Lowe 		return 0;
1308*10d63b7dSRichard Lowe 	case 'b':			 /* Obsolete */
1309*10d63b7dSRichard Lowe 		return 0;
1310*10d63b7dSRichard Lowe 	case 'c':			 /* Read alternative dmakerc file */
1311*10d63b7dSRichard Lowe 		if (invert_this) {
1312*10d63b7dSRichard Lowe 			dmake_rcfile_specified = false;
1313*10d63b7dSRichard Lowe 		} else {
1314*10d63b7dSRichard Lowe 			dmake_rcfile_specified = true;
1315*10d63b7dSRichard Lowe 		}
1316*10d63b7dSRichard Lowe 		return 2;
1317*10d63b7dSRichard Lowe 	case 'D':			 /* Show lines read */
1318*10d63b7dSRichard Lowe 		if (invert_this) {
1319*10d63b7dSRichard Lowe 			read_trace_level--;
1320*10d63b7dSRichard Lowe 		} else {
1321*10d63b7dSRichard Lowe 			read_trace_level++;
1322*10d63b7dSRichard Lowe 		}
1323*10d63b7dSRichard Lowe 		return 0;
1324*10d63b7dSRichard Lowe 	case 'd':			 /* Debug flag */
1325*10d63b7dSRichard Lowe 		if (invert_this) {
1326*10d63b7dSRichard Lowe 			debug_level--;
1327*10d63b7dSRichard Lowe 		} else {
1328*10d63b7dSRichard Lowe 			debug_level++;
1329*10d63b7dSRichard Lowe 		}
1330*10d63b7dSRichard Lowe 		return 0;
1331*10d63b7dSRichard Lowe 	case 'e':			 /* Environment override flag */
1332*10d63b7dSRichard Lowe 		if (invert_this) {
1333*10d63b7dSRichard Lowe 			env_wins = false;
1334*10d63b7dSRichard Lowe 		} else {
1335*10d63b7dSRichard Lowe 			env_wins = true;
1336*10d63b7dSRichard Lowe 		}
1337*10d63b7dSRichard Lowe 		return 0;
1338*10d63b7dSRichard Lowe 	case 'f':			 /* Read alternative makefile(s) */
1339*10d63b7dSRichard Lowe 		return 1;
1340*10d63b7dSRichard Lowe 	case 'g':			 /* Use alternative DMake group */
1341*10d63b7dSRichard Lowe 		if (invert_this) {
1342*10d63b7dSRichard Lowe 			dmake_group_specified = false;
1343*10d63b7dSRichard Lowe 		} else {
1344*10d63b7dSRichard Lowe 			dmake_group_specified = true;
1345*10d63b7dSRichard Lowe 		}
1346*10d63b7dSRichard Lowe 		return 4;
1347*10d63b7dSRichard Lowe 	case 'i':			 /* Ignore errors */
1348*10d63b7dSRichard Lowe 		if (invert_this) {
1349*10d63b7dSRichard Lowe 			ignore_errors_all = false;
1350*10d63b7dSRichard Lowe 		} else {
1351*10d63b7dSRichard Lowe 			ignore_errors_all = true;
1352*10d63b7dSRichard Lowe 		}
1353*10d63b7dSRichard Lowe 		return 0;
1354*10d63b7dSRichard Lowe 	case 'j':			 /* Use alternative DMake max jobs */
1355*10d63b7dSRichard Lowe 		if (invert_this) {
1356*10d63b7dSRichard Lowe 			dmake_max_jobs_specified = false;
1357*10d63b7dSRichard Lowe 		} else {
1358*10d63b7dSRichard Lowe 			dmake_mode_type = parallel_mode;
1359*10d63b7dSRichard Lowe 			no_parallel = false;
1360*10d63b7dSRichard Lowe 			dmake_max_jobs_specified = true;
1361*10d63b7dSRichard Lowe 		}
1362*10d63b7dSRichard Lowe 		return 8;
1363*10d63b7dSRichard Lowe 	case 'K':			 /* Read alternative .make.state */
1364*10d63b7dSRichard Lowe 		return 256;
1365*10d63b7dSRichard Lowe 	case 'k':			 /* Keep making even after errors */
1366*10d63b7dSRichard Lowe 		if (invert_this) {
1367*10d63b7dSRichard Lowe 			continue_after_error = false;
1368*10d63b7dSRichard Lowe 		} else {
1369*10d63b7dSRichard Lowe 			continue_after_error = true;
1370*10d63b7dSRichard Lowe 			continue_after_error_ever_seen = true;
1371*10d63b7dSRichard Lowe 		}
1372*10d63b7dSRichard Lowe 		return 0;
1373*10d63b7dSRichard Lowe 	case 'M':			 /* Read alternative make.machines file */
1374*10d63b7dSRichard Lowe 		if (invert_this) {
1375*10d63b7dSRichard Lowe 			pmake_machinesfile_specified = false;
1376*10d63b7dSRichard Lowe 		} else {
1377*10d63b7dSRichard Lowe 			pmake_machinesfile_specified = true;
1378*10d63b7dSRichard Lowe 			dmake_mode_type = parallel_mode;
1379*10d63b7dSRichard Lowe 			no_parallel = false;
1380*10d63b7dSRichard Lowe 		}
1381*10d63b7dSRichard Lowe 		return 16;
1382*10d63b7dSRichard Lowe 	case 'm':			 /* Use alternative DMake build mode */
1383*10d63b7dSRichard Lowe 		if (invert_this) {
1384*10d63b7dSRichard Lowe 			dmake_mode_specified = false;
1385*10d63b7dSRichard Lowe 		} else {
1386*10d63b7dSRichard Lowe 			dmake_mode_specified = true;
1387*10d63b7dSRichard Lowe 		}
1388*10d63b7dSRichard Lowe 		return 32;
1389*10d63b7dSRichard Lowe 	case 'x':			 /* Use alternative DMake mode */
1390*10d63b7dSRichard Lowe 		if (invert_this) {
1391*10d63b7dSRichard Lowe 			dmake_add_mode_specified = false;
1392*10d63b7dSRichard Lowe 		} else {
1393*10d63b7dSRichard Lowe 			dmake_add_mode_specified = true;
1394*10d63b7dSRichard Lowe 		}
1395*10d63b7dSRichard Lowe 		return 1024;
1396*10d63b7dSRichard Lowe 	case 'N':			 /* Reverse -n */
1397*10d63b7dSRichard Lowe 		if (invert_this) {
1398*10d63b7dSRichard Lowe 			do_not_exec_rule = true;
1399*10d63b7dSRichard Lowe 		} else {
1400*10d63b7dSRichard Lowe 			do_not_exec_rule = false;
1401*10d63b7dSRichard Lowe 		}
1402*10d63b7dSRichard Lowe 		return 0;
1403*10d63b7dSRichard Lowe 	case 'n':			 /* Print, not exec commands */
1404*10d63b7dSRichard Lowe 		if (invert_this) {
1405*10d63b7dSRichard Lowe 			do_not_exec_rule = false;
1406*10d63b7dSRichard Lowe 		} else {
1407*10d63b7dSRichard Lowe 			do_not_exec_rule = true;
1408*10d63b7dSRichard Lowe 		}
1409*10d63b7dSRichard Lowe 		return 0;
1410*10d63b7dSRichard Lowe 	case 'O':			 /* Integrate with maketool, obsolete */
1411*10d63b7dSRichard Lowe 		return 0;
1412*10d63b7dSRichard Lowe 	case 'o':			 /* Use alternative dmake output dir */
1413*10d63b7dSRichard Lowe 		if (invert_this) {
1414*10d63b7dSRichard Lowe 			dmake_odir_specified = false;
1415*10d63b7dSRichard Lowe 		} else {
1416*10d63b7dSRichard Lowe 			dmake_odir_specified = true;
1417*10d63b7dSRichard Lowe 		}
1418*10d63b7dSRichard Lowe 		return 512;
1419*10d63b7dSRichard Lowe 	case 'P':			 /* Print for selected targets */
1420*10d63b7dSRichard Lowe 		if (invert_this) {
1421*10d63b7dSRichard Lowe 			report_dependencies_level--;
1422*10d63b7dSRichard Lowe 		} else {
1423*10d63b7dSRichard Lowe 			report_dependencies_level++;
1424*10d63b7dSRichard Lowe 		}
1425*10d63b7dSRichard Lowe 		return 0;
1426*10d63b7dSRichard Lowe 	case 'p':			 /* Print description */
1427*10d63b7dSRichard Lowe 		if (invert_this) {
1428*10d63b7dSRichard Lowe 			trace_status = false;
1429*10d63b7dSRichard Lowe 			do_not_exec_rule = false;
1430*10d63b7dSRichard Lowe 		} else {
1431*10d63b7dSRichard Lowe 			trace_status = true;
1432*10d63b7dSRichard Lowe 			do_not_exec_rule = true;
1433*10d63b7dSRichard Lowe 		}
1434*10d63b7dSRichard Lowe 		return 0;
1435*10d63b7dSRichard Lowe 	case 'q':			 /* Question flag */
1436*10d63b7dSRichard Lowe 		if (invert_this) {
1437*10d63b7dSRichard Lowe 			quest = false;
1438*10d63b7dSRichard Lowe 		} else {
1439*10d63b7dSRichard Lowe 			quest = true;
1440*10d63b7dSRichard Lowe 		}
1441*10d63b7dSRichard Lowe 		return 0;
1442*10d63b7dSRichard Lowe 	case 'R':			 /* Don't run in parallel */
1443*10d63b7dSRichard Lowe 		if (invert_this) {
1444*10d63b7dSRichard Lowe 			pmake_cap_r_specified = false;
1445*10d63b7dSRichard Lowe 			no_parallel = false;
1446*10d63b7dSRichard Lowe 		} else {
1447*10d63b7dSRichard Lowe 			pmake_cap_r_specified = true;
1448*10d63b7dSRichard Lowe 			dmake_mode_type = serial_mode;
1449*10d63b7dSRichard Lowe 			no_parallel = true;
1450*10d63b7dSRichard Lowe 		}
1451*10d63b7dSRichard Lowe 		return 0;
1452*10d63b7dSRichard Lowe 	case 'r':			 /* Turn off internal rules */
1453*10d63b7dSRichard Lowe 		if (invert_this) {
1454*10d63b7dSRichard Lowe 			ignore_default_mk = false;
1455*10d63b7dSRichard Lowe 		} else {
1456*10d63b7dSRichard Lowe 			ignore_default_mk = true;
1457*10d63b7dSRichard Lowe 		}
1458*10d63b7dSRichard Lowe 		return 0;
1459*10d63b7dSRichard Lowe 	case 'S':			 /* Reverse -k */
1460*10d63b7dSRichard Lowe 		if (invert_this) {
1461*10d63b7dSRichard Lowe 			continue_after_error = true;
1462*10d63b7dSRichard Lowe 		} else {
1463*10d63b7dSRichard Lowe 			continue_after_error = false;
1464*10d63b7dSRichard Lowe 			stop_after_error_ever_seen = true;
1465*10d63b7dSRichard Lowe 		}
1466*10d63b7dSRichard Lowe 		return 0;
1467*10d63b7dSRichard Lowe 	case 's':			 /* Silent flag */
1468*10d63b7dSRichard Lowe 		if (invert_this) {
1469*10d63b7dSRichard Lowe 			silent_all = false;
1470*10d63b7dSRichard Lowe 		} else {
1471*10d63b7dSRichard Lowe 			silent_all = true;
1472*10d63b7dSRichard Lowe 		}
1473*10d63b7dSRichard Lowe 		return 0;
1474*10d63b7dSRichard Lowe 	case 'T':			 /* Print target list */
1475*10d63b7dSRichard Lowe 		if (invert_this) {
1476*10d63b7dSRichard Lowe 			list_all_targets = false;
1477*10d63b7dSRichard Lowe 			do_not_exec_rule = false;
1478*10d63b7dSRichard Lowe 		} else {
1479*10d63b7dSRichard Lowe 			list_all_targets = true;
1480*10d63b7dSRichard Lowe 			do_not_exec_rule = true;
1481*10d63b7dSRichard Lowe 		}
1482*10d63b7dSRichard Lowe 		return 0;
1483*10d63b7dSRichard Lowe 	case 't':			 /* Touch flag */
1484*10d63b7dSRichard Lowe 		if (invert_this) {
1485*10d63b7dSRichard Lowe 			touch = false;
1486*10d63b7dSRichard Lowe 		} else {
1487*10d63b7dSRichard Lowe 			touch = true;
1488*10d63b7dSRichard Lowe 		}
1489*10d63b7dSRichard Lowe 		return 0;
1490*10d63b7dSRichard Lowe 	case 'u':			 /* Unconditional flag */
1491*10d63b7dSRichard Lowe 		if (invert_this) {
1492*10d63b7dSRichard Lowe 			build_unconditional = false;
1493*10d63b7dSRichard Lowe 		} else {
1494*10d63b7dSRichard Lowe 			build_unconditional = true;
1495*10d63b7dSRichard Lowe 		}
1496*10d63b7dSRichard Lowe 		return 0;
1497*10d63b7dSRichard Lowe 	case 'V':			/* SVR4 mode */
1498*10d63b7dSRichard Lowe 		svr4 = true;
1499*10d63b7dSRichard Lowe 		return 0;
1500*10d63b7dSRichard Lowe 	case 'v':			/* Version flag */
1501*10d63b7dSRichard Lowe 		if (invert_this) {
1502*10d63b7dSRichard Lowe 		} else {
1503*10d63b7dSRichard Lowe 			fprintf(stdout, "%s: %s\n", getprogname(), verstring);
1504*10d63b7dSRichard Lowe 			exit_status = 0;
1505*10d63b7dSRichard Lowe 			exit(0);
1506*10d63b7dSRichard Lowe 		}
1507*10d63b7dSRichard Lowe 		return 0;
1508*10d63b7dSRichard Lowe 	case 'w':			 /* Unconditional flag */
1509*10d63b7dSRichard Lowe 		if (invert_this) {
1510*10d63b7dSRichard Lowe 			report_cwd = false;
1511*10d63b7dSRichard Lowe 		} else {
1512*10d63b7dSRichard Lowe 			report_cwd = true;
1513*10d63b7dSRichard Lowe 		}
1514*10d63b7dSRichard Lowe 		return 0;
1515*10d63b7dSRichard Lowe #if 0
1516*10d63b7dSRichard Lowe 	case 'X':			/* Filter stdout */
1517*10d63b7dSRichard Lowe 		if (invert_this) {
1518*10d63b7dSRichard Lowe 			filter_stderr = false;
1519*10d63b7dSRichard Lowe 		} else {
1520*10d63b7dSRichard Lowe 			filter_stderr = true;
1521*10d63b7dSRichard Lowe 		}
1522*10d63b7dSRichard Lowe 		return 0;
1523*10d63b7dSRichard Lowe #endif
1524*10d63b7dSRichard Lowe 	default:
1525*10d63b7dSRichard Lowe 		break;
1526*10d63b7dSRichard Lowe 	}
1527*10d63b7dSRichard Lowe 	return 0;
1528*10d63b7dSRichard Lowe }
1529*10d63b7dSRichard Lowe 
1530*10d63b7dSRichard Lowe /*
1531*10d63b7dSRichard Lowe  *	setup_for_projectdir()
1532*10d63b7dSRichard Lowe  *
1533*10d63b7dSRichard Lowe  *	Read the PROJECTDIR variable, if defined, and set the sccs path
1534*10d63b7dSRichard Lowe  *
1535*10d63b7dSRichard Lowe  *	Parameters:
1536*10d63b7dSRichard Lowe  *
1537*10d63b7dSRichard Lowe  *	Global variables used:
1538*10d63b7dSRichard Lowe  *		sccs_dir_path	Set to point to SCCS dir to use
1539*10d63b7dSRichard Lowe  */
1540*10d63b7dSRichard Lowe static void
setup_for_projectdir(void)1541*10d63b7dSRichard Lowe setup_for_projectdir(void)
1542*10d63b7dSRichard Lowe {
1543*10d63b7dSRichard Lowe static char	path[MAXPATHLEN];
1544*10d63b7dSRichard Lowe char		cwdpath[MAXPATHLEN];
1545*10d63b7dSRichard Lowe uid_t uid;
1546*10d63b7dSRichard Lowe int   done=0;
1547*10d63b7dSRichard Lowe 
1548*10d63b7dSRichard Lowe 	/* Check if we should use PROJECTDIR when reading the SCCS dir. */
1549*10d63b7dSRichard Lowe 	sccs_dir_path = getenv("PROJECTDIR");
1550*10d63b7dSRichard Lowe 	if ((sccs_dir_path != NULL) &&
1551*10d63b7dSRichard Lowe 	    (sccs_dir_path[0] != (int) slash_char)) {
1552*10d63b7dSRichard Lowe 		struct passwd *pwent;
1553*10d63b7dSRichard Lowe 
1554*10d63b7dSRichard Lowe 	     {
1555*10d63b7dSRichard Lowe 		uid = getuid();
1556*10d63b7dSRichard Lowe 		pwent = getpwuid(uid);
1557*10d63b7dSRichard Lowe 		if (pwent == NULL) {
1558*10d63b7dSRichard Lowe 		   fatal(gettext("Bogus USERID "));
1559*10d63b7dSRichard Lowe 		}
1560*10d63b7dSRichard Lowe 		if ((pwent = getpwnam(sccs_dir_path)) == NULL) {
1561*10d63b7dSRichard Lowe 			/*empty block : it'll go & check cwd  */
1562*10d63b7dSRichard Lowe 		}
1563*10d63b7dSRichard Lowe 		else {
1564*10d63b7dSRichard Lowe 		  (void) sprintf(path, "%s/src", pwent->pw_dir);
1565*10d63b7dSRichard Lowe 		  if (access(path, F_OK) == 0) {
1566*10d63b7dSRichard Lowe 			sccs_dir_path = path;
1567*10d63b7dSRichard Lowe 			done = 1;
1568*10d63b7dSRichard Lowe 		  } else {
1569*10d63b7dSRichard Lowe 			(void) sprintf(path, "%s/source", pwent->pw_dir);
1570*10d63b7dSRichard Lowe 			if (access(path, F_OK) == 0) {
1571*10d63b7dSRichard Lowe 				sccs_dir_path = path;
1572*10d63b7dSRichard Lowe 				done = 1;
1573*10d63b7dSRichard Lowe 			}
1574*10d63b7dSRichard Lowe 		     }
1575*10d63b7dSRichard Lowe 		}
1576*10d63b7dSRichard Lowe 		if (!done) {
1577*10d63b7dSRichard Lowe 		    if (getcwd(cwdpath, MAXPATHLEN - 1 )) {
1578*10d63b7dSRichard Lowe 
1579*10d63b7dSRichard Lowe 		       (void) sprintf(path, "%s/%s", cwdpath,sccs_dir_path);
1580*10d63b7dSRichard Lowe 		       if (access(path, F_OK) == 0) {
1581*10d63b7dSRichard Lowe 		        	sccs_dir_path = path;
1582*10d63b7dSRichard Lowe 				done = 1;
1583*10d63b7dSRichard Lowe 		        } else {
1584*10d63b7dSRichard Lowe 		  	       	fatal(gettext("Bogus PROJECTDIR '%s'"), sccs_dir_path);
1585*10d63b7dSRichard Lowe 		        }
1586*10d63b7dSRichard Lowe 		    }
1587*10d63b7dSRichard Lowe 		}
1588*10d63b7dSRichard Lowe 	   }
1589*10d63b7dSRichard Lowe 	}
1590*10d63b7dSRichard Lowe }
1591*10d63b7dSRichard Lowe 
1592*10d63b7dSRichard Lowe char *
make_install_prefix(void)1593*10d63b7dSRichard Lowe make_install_prefix(void)
1594*10d63b7dSRichard Lowe {
1595*10d63b7dSRichard Lowe 	int ret;
1596*10d63b7dSRichard Lowe 	char origin[PATH_MAX];
1597*10d63b7dSRichard Lowe 	char *dir;
1598*10d63b7dSRichard Lowe 
1599*10d63b7dSRichard Lowe 	if ((ret = readlink("/proc/self/path/a.out", origin,
1600*10d63b7dSRichard Lowe 	    PATH_MAX - 1)) < 0)
1601*10d63b7dSRichard Lowe 		fatal("failed to read origin from /proc\n");
1602*10d63b7dSRichard Lowe 
1603*10d63b7dSRichard Lowe 
1604*10d63b7dSRichard Lowe 	origin[ret] = '\0';
1605*10d63b7dSRichard Lowe 	return strdup(dirname(origin));
1606*10d63b7dSRichard Lowe }
1607*10d63b7dSRichard Lowe 
1608*10d63b7dSRichard Lowe static char *
add_to_env(const char * var,const char * value,const char * fallback)1609*10d63b7dSRichard Lowe add_to_env(const char *var, const char *value, const char *fallback)
1610*10d63b7dSRichard Lowe {
1611*10d63b7dSRichard Lowe 	const char *oldpath;
1612*10d63b7dSRichard Lowe 	char *newpath;
1613*10d63b7dSRichard Lowe 
1614*10d63b7dSRichard Lowe 	oldpath = getenv(var);
1615*10d63b7dSRichard Lowe 	if (oldpath == NULL) {
1616*10d63b7dSRichard Lowe 		if (value != NULL) {
1617*10d63b7dSRichard Lowe 			asprintf(&newpath, "%s=%s",
1618*10d63b7dSRichard Lowe 			    var, value);
1619*10d63b7dSRichard Lowe 		} else {
1620*10d63b7dSRichard Lowe 			asprintf(&newpath, "%s=%s",
1621*10d63b7dSRichard Lowe 			    var, fallback);
1622*10d63b7dSRichard Lowe 		}
1623*10d63b7dSRichard Lowe 	} else {
1624*10d63b7dSRichard Lowe 		if (value != NULL) {
1625*10d63b7dSRichard Lowe 			asprintf(&newpath, "%s=%s:%s",
1626*10d63b7dSRichard Lowe 			    var, oldpath, value);
1627*10d63b7dSRichard Lowe 		} else {
1628*10d63b7dSRichard Lowe 			asprintf(&newpath, "%s=%s:%s",
1629*10d63b7dSRichard Lowe 			    var, oldpath, fallback);
1630*10d63b7dSRichard Lowe 		}
1631*10d63b7dSRichard Lowe 	}
1632*10d63b7dSRichard Lowe 
1633*10d63b7dSRichard Lowe 	return (newpath);
1634*10d63b7dSRichard Lowe }
1635*10d63b7dSRichard Lowe 
1636*10d63b7dSRichard Lowe /*
1637*10d63b7dSRichard Lowe  *	set_sgs_support()
1638*10d63b7dSRichard Lowe  *
1639*10d63b7dSRichard Lowe  *	Add the libmakestate.so.1 lib to the env var SGS_SUPPORT
1640*10d63b7dSRichard Lowe  *	  if it's not already in there.
1641*10d63b7dSRichard Lowe  *	The SGS_SUPPORT env var and libmakestate.so.1 is used by
1642*10d63b7dSRichard Lowe  *	  the linker ld to report .make.state info back to make.
1643*10d63b7dSRichard Lowe  *
1644*10d63b7dSRichard Lowe  * In the new world we always will set the 32-bit and 64-bit versions of this
1645*10d63b7dSRichard Lowe  * variable explicitly so that we can take into account the correct isa and our
1646*10d63b7dSRichard Lowe  * prefix. So say that the prefix was /opt/local. Then we would want to search
1647*10d63b7dSRichard Lowe  * /opt/local/lib/libmakestate.so.1:libmakestate.so.1. We still want to search
1648*10d63b7dSRichard Lowe  * the original location just as a safety measure.
1649*10d63b7dSRichard Lowe  */
1650*10d63b7dSRichard Lowe static void
set_sgs_support()1651*10d63b7dSRichard Lowe set_sgs_support()
1652*10d63b7dSRichard Lowe {
1653*10d63b7dSRichard Lowe 	int		len;
1654*10d63b7dSRichard Lowe 	char		*newpath, *newpath64;
1655*10d63b7dSRichard Lowe 	char 		*lib32, *lib64;
1656*10d63b7dSRichard Lowe 	static char	*prev_path, *prev_path64;
1657*10d63b7dSRichard Lowe 	char		*origin = make_install_prefix();
1658*10d63b7dSRichard Lowe 	struct stat st;
1659*10d63b7dSRichard Lowe 
1660*10d63b7dSRichard Lowe 	asprintf(&lib32, "%s/%s/%s", origin, "../lib",
1661*10d63b7dSRichard Lowe 	    LD_SUPPORT_MAKE_LIB);
1662*10d63b7dSRichard Lowe 
1663*10d63b7dSRichard Lowe 	if (stat(lib32, &st) != 0) {
1664*10d63b7dSRichard Lowe 		free(lib32);
1665*10d63b7dSRichard Lowe 		// Try the tools path
1666*10d63b7dSRichard Lowe 		asprintf(&lib32, "%s/%s/%s/%s", origin, "../../lib/",
1667*10d63b7dSRichard Lowe 		    LD_SUPPORT_MAKE_ARCH, LD_SUPPORT_MAKE_LIB);
1668*10d63b7dSRichard Lowe 
1669*10d63b7dSRichard Lowe 		if (stat(lib32, &st) != 0) {
1670*10d63b7dSRichard Lowe 			free(lib32);
1671*10d63b7dSRichard Lowe 			lib32 = NULL;
1672*10d63b7dSRichard Lowe 		}
1673*10d63b7dSRichard Lowe 	}
1674*10d63b7dSRichard Lowe 
1675*10d63b7dSRichard Lowe 	asprintf(&lib64, "%s/%s/64/%s", origin, "../lib",
1676*10d63b7dSRichard Lowe 	    LD_SUPPORT_MAKE_LIB);
1677*10d63b7dSRichard Lowe 
1678*10d63b7dSRichard Lowe 	if (stat(lib64, &st) != 0) {
1679*10d63b7dSRichard Lowe 		free(lib64);
1680*10d63b7dSRichard Lowe 		// Try the tools path
1681*10d63b7dSRichard Lowe 		asprintf(&lib64, "%s/%s/%s/64/%s", origin, "../../lib/",
1682*10d63b7dSRichard Lowe 		    LD_SUPPORT_MAKE_ARCH, LD_SUPPORT_MAKE_LIB);
1683*10d63b7dSRichard Lowe 
1684*10d63b7dSRichard Lowe 		if (stat(lib64, &st) != 0) {
1685*10d63b7dSRichard Lowe 			free(lib64);
1686*10d63b7dSRichard Lowe 			lib64 = NULL;
1687*10d63b7dSRichard Lowe 		}
1688*10d63b7dSRichard Lowe 	}
1689*10d63b7dSRichard Lowe 
1690*10d63b7dSRichard Lowe 	newpath = add_to_env(LD_SUPPORT_ENV_VAR_32, lib32, LD_SUPPORT_MAKE_LIB);
1691*10d63b7dSRichard Lowe 	newpath64 = add_to_env(LD_SUPPORT_ENV_VAR_64, lib64, LD_SUPPORT_MAKE_LIB);
1692*10d63b7dSRichard Lowe 
1693*10d63b7dSRichard Lowe 	putenv(newpath);
1694*10d63b7dSRichard Lowe 	if (prev_path) {
1695*10d63b7dSRichard Lowe 		free(prev_path);
1696*10d63b7dSRichard Lowe 	}
1697*10d63b7dSRichard Lowe 	prev_path = newpath;
1698*10d63b7dSRichard Lowe 
1699*10d63b7dSRichard Lowe 	putenv(newpath64);
1700*10d63b7dSRichard Lowe 	if (prev_path64) {
1701*10d63b7dSRichard Lowe 		free(prev_path64);
1702*10d63b7dSRichard Lowe 	}
1703*10d63b7dSRichard Lowe 	prev_path64 = newpath64;
1704*10d63b7dSRichard Lowe 	free(lib32);
1705*10d63b7dSRichard Lowe 	free(lib64);
1706*10d63b7dSRichard Lowe 	free(origin);
1707*10d63b7dSRichard Lowe }
1708*10d63b7dSRichard Lowe 
1709*10d63b7dSRichard Lowe /*
1710*10d63b7dSRichard Lowe  *	read_files_and_state(argc, argv)
1711*10d63b7dSRichard Lowe  *
1712*10d63b7dSRichard Lowe  *	Read the makefiles we care about and the environment
1713*10d63b7dSRichard Lowe  *	Also read the = style command line options
1714*10d63b7dSRichard Lowe  *
1715*10d63b7dSRichard Lowe  *	Parameters:
1716*10d63b7dSRichard Lowe  *		argc		You know what this is
1717*10d63b7dSRichard Lowe  *		argv		You know what this is
1718*10d63b7dSRichard Lowe  *
1719*10d63b7dSRichard Lowe  *	Static variables used:
1720*10d63b7dSRichard Lowe  *		env_wins	make -e, determines if env vars are RO
1721*10d63b7dSRichard Lowe  *		ignore_default_mk make -r, determines if make.rules is read
1722*10d63b7dSRichard Lowe  *		not_auto_depen	dwight
1723*10d63b7dSRichard Lowe  *
1724*10d63b7dSRichard Lowe  *	Global variables used:
1725*10d63b7dSRichard Lowe  *		default_target_to_build	Set to first proper target from file
1726*10d63b7dSRichard Lowe  *		do_not_exec_rule Set to false when makfile is made
1727*10d63b7dSRichard Lowe  *		dot		The Name ".", used to read current dir
1728*10d63b7dSRichard Lowe  *		empty_name	The Name "", use as macro value
1729*10d63b7dSRichard Lowe  *		keep_state	Set if KEEP_STATE is in environment
1730*10d63b7dSRichard Lowe  *		make_state	The Name ".make.state", used to read file
1731*10d63b7dSRichard Lowe  *		makefile_type	Set to type of file being read
1732*10d63b7dSRichard Lowe  *		makeflags	The Name "MAKEFLAGS", used to set macro value
1733*10d63b7dSRichard Lowe  *		not_auto	dwight
1734*10d63b7dSRichard Lowe  *		read_trace_level Checked to se if the reader should trace
1735*10d63b7dSRichard Lowe  *		report_dependencies If -P is on we do not read .make.state
1736*10d63b7dSRichard Lowe  *		trace_reader	Set if reader should trace
1737*10d63b7dSRichard Lowe  *		virtual_root	The Name "VIRTUAL_ROOT", used to check value
1738*10d63b7dSRichard Lowe  */
1739*10d63b7dSRichard Lowe static void
read_files_and_state(int argc,char ** argv)1740*10d63b7dSRichard Lowe read_files_and_state(int argc, char **argv)
1741*10d63b7dSRichard Lowe {
1742*10d63b7dSRichard Lowe 	wchar_t			buffer[1000];
1743*10d63b7dSRichard Lowe 	wchar_t			buffer_posix[1000];
1744*10d63b7dSRichard Lowe 	register char		ch;
1745*10d63b7dSRichard Lowe 	register char		*cp;
1746*10d63b7dSRichard Lowe 	Property		def_make_macro = NULL;
1747*10d63b7dSRichard Lowe 	Name			def_make_name;
1748*10d63b7dSRichard Lowe 	Name			default_makefile;
1749*10d63b7dSRichard Lowe 	String_rec		dest;
1750*10d63b7dSRichard Lowe 	wchar_t			destbuffer[STRING_BUFFER_LENGTH];
1751*10d63b7dSRichard Lowe 	register int		i;
1752*10d63b7dSRichard Lowe 	register int		j;
1753*10d63b7dSRichard Lowe 	Name			keep_state_name;
1754*10d63b7dSRichard Lowe 	int			length;
1755*10d63b7dSRichard Lowe 	Name			Makefile;
1756*10d63b7dSRichard Lowe 	register Property	macro;
1757*10d63b7dSRichard Lowe 	struct stat		make_state_stat;
1758*10d63b7dSRichard Lowe 	Name			makefile_name;
1759*10d63b7dSRichard Lowe         register int		makefile_next = 0;
1760*10d63b7dSRichard Lowe 	register Boolean	makefile_read = false;
1761*10d63b7dSRichard Lowe 	String_rec		makeflags_string;
1762*10d63b7dSRichard Lowe 	String_rec		makeflags_string_posix;
1763*10d63b7dSRichard Lowe 	String_rec *		makeflags_string_current;
1764*10d63b7dSRichard Lowe 	Name			makeflags_value_saved;
1765*10d63b7dSRichard Lowe 	register Name		name;
1766*10d63b7dSRichard Lowe 	Name			new_make_value;
1767*10d63b7dSRichard Lowe 	Boolean			save_do_not_exec_rule;
1768*10d63b7dSRichard Lowe 	Name			sdotMakefile;
1769*10d63b7dSRichard Lowe 	Name			sdotmakefile_name;
1770*10d63b7dSRichard Lowe 	static wchar_t		state_file_str;
1771*10d63b7dSRichard Lowe 	static char		state_file_str_mb[MAXPATHLEN];
1772*10d63b7dSRichard Lowe 	static struct _Name	state_filename;
1773*10d63b7dSRichard Lowe 	Boolean			temp;
1774*10d63b7dSRichard Lowe 	char			tmp_char;
1775*10d63b7dSRichard Lowe 	wchar_t			*tmp_wcs_buffer;
1776*10d63b7dSRichard Lowe 	register Name		value;
1777*10d63b7dSRichard Lowe 	ASCII_Dyn_Array		makeflags_and_macro;
1778*10d63b7dSRichard Lowe 	Boolean			is_xpg4;
1779*10d63b7dSRichard Lowe 
1780*10d63b7dSRichard Lowe /*
1781*10d63b7dSRichard Lowe  *	Remember current mode. It may be changed after reading makefile
1782*10d63b7dSRichard Lowe  *	and we will have to correct MAKEFLAGS variable.
1783*10d63b7dSRichard Lowe  */
1784*10d63b7dSRichard Lowe 	is_xpg4 = posix;
1785*10d63b7dSRichard Lowe 
1786*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "KEEP_STATE");
1787*10d63b7dSRichard Lowe 	keep_state_name = GETNAME(wcs_buffer, FIND_LENGTH);
1788*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "Makefile");
1789*10d63b7dSRichard Lowe 	Makefile = GETNAME(wcs_buffer, FIND_LENGTH);
1790*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "makefile");
1791*10d63b7dSRichard Lowe 	makefile_name = GETNAME(wcs_buffer, FIND_LENGTH);
1792*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "s.makefile");
1793*10d63b7dSRichard Lowe 	sdotmakefile_name = GETNAME(wcs_buffer, FIND_LENGTH);
1794*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "s.Makefile");
1795*10d63b7dSRichard Lowe 	sdotMakefile = GETNAME(wcs_buffer, FIND_LENGTH);
1796*10d63b7dSRichard Lowe 
1797*10d63b7dSRichard Lowe /*
1798*10d63b7dSRichard Lowe  *	initialize global dependency entry for .NOT_AUTO
1799*10d63b7dSRichard Lowe  */
1800*10d63b7dSRichard Lowe 	not_auto_depen->next = NULL;
1801*10d63b7dSRichard Lowe 	not_auto_depen->name = not_auto;
1802*10d63b7dSRichard Lowe 	not_auto_depen->automatic = not_auto_depen->stale = false;
1803*10d63b7dSRichard Lowe 
1804*10d63b7dSRichard Lowe /*
1805*10d63b7dSRichard Lowe  *	Read internal definitions and rules.
1806*10d63b7dSRichard Lowe  */
1807*10d63b7dSRichard Lowe 	if (read_trace_level > 1) {
1808*10d63b7dSRichard Lowe 		trace_reader = true;
1809*10d63b7dSRichard Lowe 	}
1810*10d63b7dSRichard Lowe 	if (!ignore_default_mk) {
1811*10d63b7dSRichard Lowe 		if (svr4) {
1812*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, "svr4.make.rules");
1813*10d63b7dSRichard Lowe 			default_makefile = GETNAME(wcs_buffer, FIND_LENGTH);
1814*10d63b7dSRichard Lowe 		} else {
1815*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, "make.rules");
1816*10d63b7dSRichard Lowe 			default_makefile = GETNAME(wcs_buffer, FIND_LENGTH);
1817*10d63b7dSRichard Lowe 		}
1818*10d63b7dSRichard Lowe 		default_makefile->stat.is_file = true;
1819*10d63b7dSRichard Lowe 
1820*10d63b7dSRichard Lowe 		(void) read_makefile(default_makefile,
1821*10d63b7dSRichard Lowe 				     true,
1822*10d63b7dSRichard Lowe 				     false,
1823*10d63b7dSRichard Lowe 				     true);
1824*10d63b7dSRichard Lowe 	}
1825*10d63b7dSRichard Lowe 
1826*10d63b7dSRichard Lowe 	/*
1827*10d63b7dSRichard Lowe 	 * If the user did not redefine the MAKE macro in the
1828*10d63b7dSRichard Lowe 	 * default makefile (make.rules), then we'd like to
1829*10d63b7dSRichard Lowe 	 * change the macro value of MAKE to be some form
1830*10d63b7dSRichard Lowe 	 * of argv[0] for recursive MAKE builds.
1831*10d63b7dSRichard Lowe 	 */
1832*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, "MAKE");
1833*10d63b7dSRichard Lowe 	def_make_name = GETNAME(wcs_buffer, wcslen(wcs_buffer));
1834*10d63b7dSRichard Lowe 	def_make_macro = get_prop(def_make_name->prop, macro_prop);
1835*10d63b7dSRichard Lowe 	if ((def_make_macro != NULL) &&
1836*10d63b7dSRichard Lowe 	    (IS_EQUAL(def_make_macro->body.macro.value->string_mb,
1837*10d63b7dSRichard Lowe 	              "make"))) {
1838*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, argv_zero_string);
1839*10d63b7dSRichard Lowe 		new_make_value = GETNAME(wcs_buffer, wcslen(wcs_buffer));
1840*10d63b7dSRichard Lowe 		(void) SETVAR(def_make_name,
1841*10d63b7dSRichard Lowe 		              new_make_value,
1842*10d63b7dSRichard Lowe 		              false);
1843*10d63b7dSRichard Lowe 	}
1844*10d63b7dSRichard Lowe 
1845*10d63b7dSRichard Lowe 	default_target_to_build = NULL;
1846*10d63b7dSRichard Lowe 	trace_reader = false;
1847*10d63b7dSRichard Lowe 
1848*10d63b7dSRichard Lowe /*
1849*10d63b7dSRichard Lowe  *	Read environment args. Let file args which follow override unless
1850*10d63b7dSRichard Lowe  *	-e option seen. If -e option is not mentioned.
1851*10d63b7dSRichard Lowe  */
1852*10d63b7dSRichard Lowe 	read_environment(env_wins);
1853*10d63b7dSRichard Lowe 	if (getvar(virtual_root)->hash.length == 0) {
1854*10d63b7dSRichard Lowe 		maybe_append_prop(virtual_root, macro_prop)
1855*10d63b7dSRichard Lowe 		  ->body.macro.exported = true;
1856*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "/");
1857*10d63b7dSRichard Lowe 		(void) SETVAR(virtual_root,
1858*10d63b7dSRichard Lowe 			      GETNAME(wcs_buffer, FIND_LENGTH),
1859*10d63b7dSRichard Lowe 			      false);
1860*10d63b7dSRichard Lowe 	}
1861*10d63b7dSRichard Lowe 
1862*10d63b7dSRichard Lowe /*
1863*10d63b7dSRichard Lowe  * We now scan mf_argv and argv to see if we need to set
1864*10d63b7dSRichard Lowe  * any of the DMake-added options/variables in MAKEFLAGS.
1865*10d63b7dSRichard Lowe  */
1866*10d63b7dSRichard Lowe 
1867*10d63b7dSRichard Lowe 	makeflags_and_macro.start = 0;
1868*10d63b7dSRichard Lowe 	makeflags_and_macro.size = 0;
1869*10d63b7dSRichard Lowe 	enter_argv_values(mf_argc, mf_argv, &makeflags_and_macro);
1870*10d63b7dSRichard Lowe 	enter_argv_values(argc, argv, &makeflags_and_macro);
1871*10d63b7dSRichard Lowe 
1872*10d63b7dSRichard Lowe /*
1873*10d63b7dSRichard Lowe  *	Set MFLAGS and MAKEFLAGS
1874*10d63b7dSRichard Lowe  *
1875*10d63b7dSRichard Lowe  *	Before reading makefile we do not know exactly which mode
1876*10d63b7dSRichard Lowe  *	(posix or not) is used. So prepare two MAKEFLAGS strings
1877*10d63b7dSRichard Lowe  *	for both posix and solaris modes because they are different.
1878*10d63b7dSRichard Lowe  */
1879*10d63b7dSRichard Lowe 	INIT_STRING_FROM_STACK(makeflags_string, buffer);
1880*10d63b7dSRichard Lowe 	INIT_STRING_FROM_STACK(makeflags_string_posix, buffer_posix);
1881*10d63b7dSRichard Lowe 	append_char((int) hyphen_char, &makeflags_string);
1882*10d63b7dSRichard Lowe 	append_char((int) hyphen_char, &makeflags_string_posix);
1883*10d63b7dSRichard Lowe 
1884*10d63b7dSRichard Lowe 	switch (read_trace_level) {
1885*10d63b7dSRichard Lowe 	case 2:
1886*10d63b7dSRichard Lowe 		append_char('D', &makeflags_string);
1887*10d63b7dSRichard Lowe 		append_char('D', &makeflags_string_posix);
1888*10d63b7dSRichard Lowe 	case 1:
1889*10d63b7dSRichard Lowe 		append_char('D', &makeflags_string);
1890*10d63b7dSRichard Lowe 		append_char('D', &makeflags_string_posix);
1891*10d63b7dSRichard Lowe 	}
1892*10d63b7dSRichard Lowe 	switch (debug_level) {
1893*10d63b7dSRichard Lowe 	case 2:
1894*10d63b7dSRichard Lowe 		append_char('d', &makeflags_string);
1895*10d63b7dSRichard Lowe 		append_char('d', &makeflags_string_posix);
1896*10d63b7dSRichard Lowe 	case 1:
1897*10d63b7dSRichard Lowe 		append_char('d', &makeflags_string);
1898*10d63b7dSRichard Lowe 		append_char('d', &makeflags_string_posix);
1899*10d63b7dSRichard Lowe 	}
1900*10d63b7dSRichard Lowe 	if (env_wins) {
1901*10d63b7dSRichard Lowe 		append_char('e', &makeflags_string);
1902*10d63b7dSRichard Lowe 		append_char('e', &makeflags_string_posix);
1903*10d63b7dSRichard Lowe 	}
1904*10d63b7dSRichard Lowe 	if (ignore_errors_all) {
1905*10d63b7dSRichard Lowe 		append_char('i', &makeflags_string);
1906*10d63b7dSRichard Lowe 		append_char('i', &makeflags_string_posix);
1907*10d63b7dSRichard Lowe 	}
1908*10d63b7dSRichard Lowe 	if (continue_after_error) {
1909*10d63b7dSRichard Lowe 		if (stop_after_error_ever_seen) {
1910*10d63b7dSRichard Lowe 			append_char('S', &makeflags_string_posix);
1911*10d63b7dSRichard Lowe 			append_char((int) space_char, &makeflags_string_posix);
1912*10d63b7dSRichard Lowe 			append_char((int) hyphen_char, &makeflags_string_posix);
1913*10d63b7dSRichard Lowe 		}
1914*10d63b7dSRichard Lowe 		append_char('k', &makeflags_string);
1915*10d63b7dSRichard Lowe 		append_char('k', &makeflags_string_posix);
1916*10d63b7dSRichard Lowe 	} else {
1917*10d63b7dSRichard Lowe 		if (stop_after_error_ever_seen
1918*10d63b7dSRichard Lowe 		    && continue_after_error_ever_seen) {
1919*10d63b7dSRichard Lowe 			append_char('k', &makeflags_string_posix);
1920*10d63b7dSRichard Lowe 			append_char((int) space_char, &makeflags_string_posix);
1921*10d63b7dSRichard Lowe 			append_char((int) hyphen_char, &makeflags_string_posix);
1922*10d63b7dSRichard Lowe 			append_char('S', &makeflags_string_posix);
1923*10d63b7dSRichard Lowe 		}
1924*10d63b7dSRichard Lowe 	}
1925*10d63b7dSRichard Lowe 	if (do_not_exec_rule) {
1926*10d63b7dSRichard Lowe 		append_char('n', &makeflags_string);
1927*10d63b7dSRichard Lowe 		append_char('n', &makeflags_string_posix);
1928*10d63b7dSRichard Lowe 	}
1929*10d63b7dSRichard Lowe 	switch (report_dependencies_level) {
1930*10d63b7dSRichard Lowe 	case 4:
1931*10d63b7dSRichard Lowe 		append_char('P', &makeflags_string);
1932*10d63b7dSRichard Lowe 		append_char('P', &makeflags_string_posix);
1933*10d63b7dSRichard Lowe 	case 3:
1934*10d63b7dSRichard Lowe 		append_char('P', &makeflags_string);
1935*10d63b7dSRichard Lowe 		append_char('P', &makeflags_string_posix);
1936*10d63b7dSRichard Lowe 	case 2:
1937*10d63b7dSRichard Lowe 		append_char('P', &makeflags_string);
1938*10d63b7dSRichard Lowe 		append_char('P', &makeflags_string_posix);
1939*10d63b7dSRichard Lowe 	case 1:
1940*10d63b7dSRichard Lowe 		append_char('P', &makeflags_string);
1941*10d63b7dSRichard Lowe 		append_char('P', &makeflags_string_posix);
1942*10d63b7dSRichard Lowe 	}
1943*10d63b7dSRichard Lowe 	if (trace_status) {
1944*10d63b7dSRichard Lowe 		append_char('p', &makeflags_string);
1945*10d63b7dSRichard Lowe 		append_char('p', &makeflags_string_posix);
1946*10d63b7dSRichard Lowe 	}
1947*10d63b7dSRichard Lowe 	if (quest) {
1948*10d63b7dSRichard Lowe 		append_char('q', &makeflags_string);
1949*10d63b7dSRichard Lowe 		append_char('q', &makeflags_string_posix);
1950*10d63b7dSRichard Lowe 	}
1951*10d63b7dSRichard Lowe 	if (silent_all) {
1952*10d63b7dSRichard Lowe 		append_char('s', &makeflags_string);
1953*10d63b7dSRichard Lowe 		append_char('s', &makeflags_string_posix);
1954*10d63b7dSRichard Lowe 	}
1955*10d63b7dSRichard Lowe 	if (touch) {
1956*10d63b7dSRichard Lowe 		append_char('t', &makeflags_string);
1957*10d63b7dSRichard Lowe 		append_char('t', &makeflags_string_posix);
1958*10d63b7dSRichard Lowe 	}
1959*10d63b7dSRichard Lowe 	if (build_unconditional) {
1960*10d63b7dSRichard Lowe 		append_char('u', &makeflags_string);
1961*10d63b7dSRichard Lowe 		append_char('u', &makeflags_string_posix);
1962*10d63b7dSRichard Lowe 	}
1963*10d63b7dSRichard Lowe 	if (report_cwd) {
1964*10d63b7dSRichard Lowe 		append_char('w', &makeflags_string);
1965*10d63b7dSRichard Lowe 		append_char('w', &makeflags_string_posix);
1966*10d63b7dSRichard Lowe 	}
1967*10d63b7dSRichard Lowe 	/* -c dmake_rcfile */
1968*10d63b7dSRichard Lowe 	if (dmake_rcfile_specified) {
1969*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "DMAKE_RCFILE");
1970*10d63b7dSRichard Lowe 		dmake_rcfile = GETNAME(wcs_buffer, FIND_LENGTH);
1971*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_rcfile, &makeflags_string);
1972*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_rcfile, &makeflags_string_posix);
1973*10d63b7dSRichard Lowe 	}
1974*10d63b7dSRichard Lowe 	/* -g dmake_group */
1975*10d63b7dSRichard Lowe 	if (dmake_group_specified) {
1976*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "DMAKE_GROUP");
1977*10d63b7dSRichard Lowe 		dmake_group = GETNAME(wcs_buffer, FIND_LENGTH);
1978*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_group, &makeflags_string);
1979*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_group, &makeflags_string_posix);
1980*10d63b7dSRichard Lowe 	}
1981*10d63b7dSRichard Lowe 	/* -j dmake_max_jobs */
1982*10d63b7dSRichard Lowe 	if (dmake_max_jobs_specified) {
1983*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "DMAKE_MAX_JOBS");
1984*10d63b7dSRichard Lowe 		dmake_max_jobs = GETNAME(wcs_buffer, FIND_LENGTH);
1985*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_max_jobs, &makeflags_string);
1986*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_max_jobs, &makeflags_string_posix);
1987*10d63b7dSRichard Lowe 	}
1988*10d63b7dSRichard Lowe 	/* -m dmake_mode */
1989*10d63b7dSRichard Lowe 	if (dmake_mode_specified) {
1990*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "DMAKE_MODE");
1991*10d63b7dSRichard Lowe 		dmake_mode = GETNAME(wcs_buffer, FIND_LENGTH);
1992*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_mode, &makeflags_string);
1993*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_mode, &makeflags_string_posix);
1994*10d63b7dSRichard Lowe 	}
1995*10d63b7dSRichard Lowe 	/* -x dmake_compat_mode */
1996*10d63b7dSRichard Lowe //	if (dmake_compat_mode_specified) {
1997*10d63b7dSRichard Lowe //		MBSTOWCS(wcs_buffer, "SUN_MAKE_COMPAT_MODE");
1998*10d63b7dSRichard Lowe //		dmake_compat_mode = GETNAME(wcs_buffer, FIND_LENGTH);
1999*10d63b7dSRichard Lowe //		append_makeflags_string(dmake_compat_mode, &makeflags_string);
2000*10d63b7dSRichard Lowe //		append_makeflags_string(dmake_compat_mode, &makeflags_string_posix);
2001*10d63b7dSRichard Lowe //	}
2002*10d63b7dSRichard Lowe 	/* -x dmake_output_mode */
2003*10d63b7dSRichard Lowe 	if (dmake_output_mode_specified) {
2004*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "DMAKE_OUTPUT_MODE");
2005*10d63b7dSRichard Lowe 		dmake_output_mode = GETNAME(wcs_buffer, FIND_LENGTH);
2006*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_output_mode, &makeflags_string);
2007*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_output_mode, &makeflags_string_posix);
2008*10d63b7dSRichard Lowe 	}
2009*10d63b7dSRichard Lowe 	/* -o dmake_odir */
2010*10d63b7dSRichard Lowe 	if (dmake_odir_specified) {
2011*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "DMAKE_ODIR");
2012*10d63b7dSRichard Lowe 		dmake_odir = GETNAME(wcs_buffer, FIND_LENGTH);
2013*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_odir, &makeflags_string);
2014*10d63b7dSRichard Lowe 		append_makeflags_string(dmake_odir, &makeflags_string_posix);
2015*10d63b7dSRichard Lowe 	}
2016*10d63b7dSRichard Lowe 	/* -M pmake_machinesfile */
2017*10d63b7dSRichard Lowe 	if (pmake_machinesfile_specified) {
2018*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "PMAKE_MACHINESFILE");
2019*10d63b7dSRichard Lowe 		pmake_machinesfile = GETNAME(wcs_buffer, FIND_LENGTH);
2020*10d63b7dSRichard Lowe 		append_makeflags_string(pmake_machinesfile, &makeflags_string);
2021*10d63b7dSRichard Lowe 		append_makeflags_string(pmake_machinesfile, &makeflags_string_posix);
2022*10d63b7dSRichard Lowe 	}
2023*10d63b7dSRichard Lowe 	/* -R */
2024*10d63b7dSRichard Lowe 	if (pmake_cap_r_specified) {
2025*10d63b7dSRichard Lowe 		append_char((int) space_char, &makeflags_string);
2026*10d63b7dSRichard Lowe 		append_char((int) hyphen_char, &makeflags_string);
2027*10d63b7dSRichard Lowe 		append_char('R', &makeflags_string);
2028*10d63b7dSRichard Lowe 		append_char((int) space_char, &makeflags_string_posix);
2029*10d63b7dSRichard Lowe 		append_char((int) hyphen_char, &makeflags_string_posix);
2030*10d63b7dSRichard Lowe 		append_char('R', &makeflags_string_posix);
2031*10d63b7dSRichard Lowe 	}
2032*10d63b7dSRichard Lowe 
2033*10d63b7dSRichard Lowe /*
2034*10d63b7dSRichard Lowe  *	Make sure MAKEFLAGS is exported
2035*10d63b7dSRichard Lowe  */
2036*10d63b7dSRichard Lowe 	maybe_append_prop(makeflags, macro_prop)->
2037*10d63b7dSRichard Lowe 	  body.macro.exported = true;
2038*10d63b7dSRichard Lowe 
2039*10d63b7dSRichard Lowe 	if (makeflags_string.buffer.start[1] != (int) nul_char) {
2040*10d63b7dSRichard Lowe 		if (makeflags_string.buffer.start[1] != (int) space_char) {
2041*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, "MFLAGS");
2042*10d63b7dSRichard Lowe 			(void) SETVAR(GETNAME(wcs_buffer, FIND_LENGTH),
2043*10d63b7dSRichard Lowe 				      GETNAME(makeflags_string.buffer.start,
2044*10d63b7dSRichard Lowe 					      FIND_LENGTH),
2045*10d63b7dSRichard Lowe 				      false);
2046*10d63b7dSRichard Lowe 		} else {
2047*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, "MFLAGS");
2048*10d63b7dSRichard Lowe 			(void) SETVAR(GETNAME(wcs_buffer, FIND_LENGTH),
2049*10d63b7dSRichard Lowe 				      GETNAME(makeflags_string.buffer.start + 2,
2050*10d63b7dSRichard Lowe 					      FIND_LENGTH),
2051*10d63b7dSRichard Lowe 				      false);
2052*10d63b7dSRichard Lowe 		}
2053*10d63b7dSRichard Lowe 	}
2054*10d63b7dSRichard Lowe 
2055*10d63b7dSRichard Lowe /*
2056*10d63b7dSRichard Lowe  *	Add command line macro to POSIX makeflags_string
2057*10d63b7dSRichard Lowe  */
2058*10d63b7dSRichard Lowe 	if (makeflags_and_macro.start) {
2059*10d63b7dSRichard Lowe 		tmp_char = (char) space_char;
2060*10d63b7dSRichard Lowe 		cp = makeflags_and_macro.start;
2061*10d63b7dSRichard Lowe 		do {
2062*10d63b7dSRichard Lowe 			append_char(tmp_char, &makeflags_string_posix);
2063*10d63b7dSRichard Lowe 		} while ( tmp_char = *cp++ );
2064*10d63b7dSRichard Lowe 		retmem_mb(makeflags_and_macro.start);
2065*10d63b7dSRichard Lowe 	}
2066*10d63b7dSRichard Lowe 
2067*10d63b7dSRichard Lowe /*
2068*10d63b7dSRichard Lowe  *	Now set the value of MAKEFLAGS macro in accordance
2069*10d63b7dSRichard Lowe  *	with current mode.
2070*10d63b7dSRichard Lowe  */
2071*10d63b7dSRichard Lowe 	macro = maybe_append_prop(makeflags, macro_prop);
2072*10d63b7dSRichard Lowe 	temp = (Boolean) macro->body.macro.read_only;
2073*10d63b7dSRichard Lowe 	macro->body.macro.read_only = false;
2074*10d63b7dSRichard Lowe 	if(posix || gnu_style) {
2075*10d63b7dSRichard Lowe 		makeflags_string_current = &makeflags_string_posix;
2076*10d63b7dSRichard Lowe 	} else {
2077*10d63b7dSRichard Lowe 		makeflags_string_current = &makeflags_string;
2078*10d63b7dSRichard Lowe 	}
2079*10d63b7dSRichard Lowe 	if (makeflags_string_current->buffer.start[1] == (int) nul_char) {
2080*10d63b7dSRichard Lowe 		makeflags_value_saved =
2081*10d63b7dSRichard Lowe 			GETNAME( makeflags_string_current->buffer.start + 1
2082*10d63b7dSRichard Lowe 			       , FIND_LENGTH
2083*10d63b7dSRichard Lowe 			       );
2084*10d63b7dSRichard Lowe 	} else {
2085*10d63b7dSRichard Lowe 		if (makeflags_string_current->buffer.start[1] != (int) space_char) {
2086*10d63b7dSRichard Lowe 			makeflags_value_saved =
2087*10d63b7dSRichard Lowe 				GETNAME( makeflags_string_current->buffer.start
2088*10d63b7dSRichard Lowe 				       , FIND_LENGTH
2089*10d63b7dSRichard Lowe 				       );
2090*10d63b7dSRichard Lowe 		} else {
2091*10d63b7dSRichard Lowe 			makeflags_value_saved =
2092*10d63b7dSRichard Lowe 				GETNAME( makeflags_string_current->buffer.start + 2
2093*10d63b7dSRichard Lowe 				       , FIND_LENGTH
2094*10d63b7dSRichard Lowe 				       );
2095*10d63b7dSRichard Lowe 		}
2096*10d63b7dSRichard Lowe 	}
2097*10d63b7dSRichard Lowe 	(void) SETVAR( makeflags
2098*10d63b7dSRichard Lowe 	             , makeflags_value_saved
2099*10d63b7dSRichard Lowe 	             , false
2100*10d63b7dSRichard Lowe 	             );
2101*10d63b7dSRichard Lowe 	macro->body.macro.read_only = temp;
2102*10d63b7dSRichard Lowe 
2103*10d63b7dSRichard Lowe /*
2104*10d63b7dSRichard Lowe  *	Read command line "-f" arguments and ignore -c, g, j, K, M, m, O and o args.
2105*10d63b7dSRichard Lowe  */
2106*10d63b7dSRichard Lowe 	save_do_not_exec_rule = do_not_exec_rule;
2107*10d63b7dSRichard Lowe 	do_not_exec_rule = false;
2108*10d63b7dSRichard Lowe 	if (read_trace_level > 0) {
2109*10d63b7dSRichard Lowe 		trace_reader = true;
2110*10d63b7dSRichard Lowe 	}
2111*10d63b7dSRichard Lowe 
2112*10d63b7dSRichard Lowe 	for (i = 1; i < argc; i++) {
2113*10d63b7dSRichard Lowe 		if (argv[i] &&
2114*10d63b7dSRichard Lowe 		    (argv[i][0] == (int) hyphen_char) &&
2115*10d63b7dSRichard Lowe 		    (argv[i][1] == 'f') &&
2116*10d63b7dSRichard Lowe 		    (argv[i][2] == (int) nul_char)) {
2117*10d63b7dSRichard Lowe 			argv[i] = NULL;		/* Remove -f */
2118*10d63b7dSRichard Lowe 			if (i >= argc - 1) {
2119*10d63b7dSRichard Lowe 				fatal(gettext("No filename argument after -f flag"));
2120*10d63b7dSRichard Lowe 			}
2121*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, argv[++i]);
2122*10d63b7dSRichard Lowe 			primary_makefile = GETNAME(wcs_buffer, FIND_LENGTH);
2123*10d63b7dSRichard Lowe 			(void) read_makefile(primary_makefile, true, true, true);
2124*10d63b7dSRichard Lowe 			argv[i] = NULL;		/* Remove filename */
2125*10d63b7dSRichard Lowe 			makefile_read = true;
2126*10d63b7dSRichard Lowe 		} else if (argv[i] &&
2127*10d63b7dSRichard Lowe 			   (argv[i][0] == (int) hyphen_char) &&
2128*10d63b7dSRichard Lowe 			   (argv[i][1] == 'c' ||
2129*10d63b7dSRichard Lowe 			    argv[i][1] == 'g' ||
2130*10d63b7dSRichard Lowe 			    argv[i][1] == 'j' ||
2131*10d63b7dSRichard Lowe 			    argv[i][1] == 'K' ||
2132*10d63b7dSRichard Lowe 			    argv[i][1] == 'M' ||
2133*10d63b7dSRichard Lowe 			    argv[i][1] == 'm' ||
2134*10d63b7dSRichard Lowe 			    argv[i][1] == 'O' ||
2135*10d63b7dSRichard Lowe 			    argv[i][1] == 'o') &&
2136*10d63b7dSRichard Lowe 			   (argv[i][2] == (int) nul_char)) {
2137*10d63b7dSRichard Lowe 			argv[i] = NULL;
2138*10d63b7dSRichard Lowe 			argv[++i] = NULL;
2139*10d63b7dSRichard Lowe 		}
2140*10d63b7dSRichard Lowe 	}
2141*10d63b7dSRichard Lowe 
2142*10d63b7dSRichard Lowe /*
2143*10d63b7dSRichard Lowe  *	If no command line "-f" args then look for "makefile", and then for
2144*10d63b7dSRichard Lowe  *	"Makefile" if "makefile" isn't found.
2145*10d63b7dSRichard Lowe  */
2146*10d63b7dSRichard Lowe 	if (!makefile_read) {
2147*10d63b7dSRichard Lowe 		(void) read_dir(dot,
2148*10d63b7dSRichard Lowe 				(wchar_t *) NULL,
2149*10d63b7dSRichard Lowe 				(Property) NULL,
2150*10d63b7dSRichard Lowe 				(wchar_t *) NULL);
2151*10d63b7dSRichard Lowe 	    if (!posix) {
2152*10d63b7dSRichard Lowe 		if (makefile_name->stat.is_file) {
2153*10d63b7dSRichard Lowe 			if (Makefile->stat.is_file) {
2154*10d63b7dSRichard Lowe 				warning(gettext("Both `makefile' and `Makefile' exist"));
2155*10d63b7dSRichard Lowe 			}
2156*10d63b7dSRichard Lowe 			primary_makefile = makefile_name;
2157*10d63b7dSRichard Lowe 			makefile_read = read_makefile(makefile_name,
2158*10d63b7dSRichard Lowe 						      false,
2159*10d63b7dSRichard Lowe 						      false,
2160*10d63b7dSRichard Lowe 						      true);
2161*10d63b7dSRichard Lowe 		}
2162*10d63b7dSRichard Lowe 		if (!makefile_read &&
2163*10d63b7dSRichard Lowe 		    Makefile->stat.is_file) {
2164*10d63b7dSRichard Lowe 			primary_makefile = Makefile;
2165*10d63b7dSRichard Lowe 			makefile_read = read_makefile(Makefile,
2166*10d63b7dSRichard Lowe 						      false,
2167*10d63b7dSRichard Lowe 						      false,
2168*10d63b7dSRichard Lowe 						      true);
2169*10d63b7dSRichard Lowe 		}
2170*10d63b7dSRichard Lowe 	    } else {
2171*10d63b7dSRichard Lowe 
2172*10d63b7dSRichard Lowe 		enum sccs_stat save_m_has_sccs = NO_SCCS;
2173*10d63b7dSRichard Lowe 		enum sccs_stat save_M_has_sccs = NO_SCCS;
2174*10d63b7dSRichard Lowe 
2175*10d63b7dSRichard Lowe 		if (makefile_name->stat.is_file) {
2176*10d63b7dSRichard Lowe 			if (Makefile->stat.is_file) {
2177*10d63b7dSRichard Lowe 				warning(gettext("Both `makefile' and `Makefile' exist"));
2178*10d63b7dSRichard Lowe 			}
2179*10d63b7dSRichard Lowe 		}
2180*10d63b7dSRichard Lowe 		if (makefile_name->stat.is_file) {
2181*10d63b7dSRichard Lowe 			if (makefile_name->stat.has_sccs == NO_SCCS) {
2182*10d63b7dSRichard Lowe 			   primary_makefile = makefile_name;
2183*10d63b7dSRichard Lowe 			   makefile_read = read_makefile(makefile_name,
2184*10d63b7dSRichard Lowe 						      false,
2185*10d63b7dSRichard Lowe 						      false,
2186*10d63b7dSRichard Lowe 						      true);
2187*10d63b7dSRichard Lowe 			} else {
2188*10d63b7dSRichard Lowe 			  save_m_has_sccs = makefile_name->stat.has_sccs;
2189*10d63b7dSRichard Lowe 			  makefile_name->stat.has_sccs = NO_SCCS;
2190*10d63b7dSRichard Lowe 			  primary_makefile = makefile_name;
2191*10d63b7dSRichard Lowe 			  makefile_read = read_makefile(makefile_name,
2192*10d63b7dSRichard Lowe 						      false,
2193*10d63b7dSRichard Lowe 						      false,
2194*10d63b7dSRichard Lowe 						      true);
2195*10d63b7dSRichard Lowe 			}
2196*10d63b7dSRichard Lowe 		}
2197*10d63b7dSRichard Lowe 		if (!makefile_read &&
2198*10d63b7dSRichard Lowe 		    Makefile->stat.is_file) {
2199*10d63b7dSRichard Lowe 			if (Makefile->stat.has_sccs == NO_SCCS) {
2200*10d63b7dSRichard Lowe 			   primary_makefile = Makefile;
2201*10d63b7dSRichard Lowe 			   makefile_read = read_makefile(Makefile,
2202*10d63b7dSRichard Lowe 						      false,
2203*10d63b7dSRichard Lowe 						      false,
2204*10d63b7dSRichard Lowe 						      true);
2205*10d63b7dSRichard Lowe 			} else {
2206*10d63b7dSRichard Lowe 			  save_M_has_sccs = Makefile->stat.has_sccs;
2207*10d63b7dSRichard Lowe 			  Makefile->stat.has_sccs = NO_SCCS;
2208*10d63b7dSRichard Lowe 			  primary_makefile = Makefile;
2209*10d63b7dSRichard Lowe 			  makefile_read = read_makefile(Makefile,
2210*10d63b7dSRichard Lowe 						      false,
2211*10d63b7dSRichard Lowe 						      false,
2212*10d63b7dSRichard Lowe 						      true);
2213*10d63b7dSRichard Lowe 			}
2214*10d63b7dSRichard Lowe 		}
2215*10d63b7dSRichard Lowe 		if (!makefile_read &&
2216*10d63b7dSRichard Lowe 		        makefile_name->stat.is_file) {
2217*10d63b7dSRichard Lowe 			   makefile_name->stat.has_sccs = save_m_has_sccs;
2218*10d63b7dSRichard Lowe 			   primary_makefile = makefile_name;
2219*10d63b7dSRichard Lowe 			   makefile_read = read_makefile(makefile_name,
2220*10d63b7dSRichard Lowe 						      false,
2221*10d63b7dSRichard Lowe 						      false,
2222*10d63b7dSRichard Lowe 						      true);
2223*10d63b7dSRichard Lowe 		}
2224*10d63b7dSRichard Lowe 		if (!makefile_read &&
2225*10d63b7dSRichard Lowe 		    Makefile->stat.is_file) {
2226*10d63b7dSRichard Lowe 			   Makefile->stat.has_sccs = save_M_has_sccs;
2227*10d63b7dSRichard Lowe 			   primary_makefile = Makefile;
2228*10d63b7dSRichard Lowe 			   makefile_read = read_makefile(Makefile,
2229*10d63b7dSRichard Lowe 						      false,
2230*10d63b7dSRichard Lowe 						      false,
2231*10d63b7dSRichard Lowe 						      true);
2232*10d63b7dSRichard Lowe 		}
2233*10d63b7dSRichard Lowe 	    }
2234*10d63b7dSRichard Lowe 	}
2235*10d63b7dSRichard Lowe 	do_not_exec_rule = save_do_not_exec_rule;
2236*10d63b7dSRichard Lowe 	allrules_read = makefile_read;
2237*10d63b7dSRichard Lowe 	trace_reader = false;
2238*10d63b7dSRichard Lowe 
2239*10d63b7dSRichard Lowe /*
2240*10d63b7dSRichard Lowe  *	Now get current value of MAKEFLAGS and compare it with
2241*10d63b7dSRichard Lowe  *	the saved value we set before reading makefile.
2242*10d63b7dSRichard Lowe  *	If they are different then MAKEFLAGS is subsequently set by
2243*10d63b7dSRichard Lowe  *	makefile, just leave it there. Otherwise, if make mode
2244*10d63b7dSRichard Lowe  *	is changed by using .POSIX target in makefile we need
2245*10d63b7dSRichard Lowe  *	to correct MAKEFLAGS value.
2246*10d63b7dSRichard Lowe  */
2247*10d63b7dSRichard Lowe 	Name mf_val = getvar(makeflags);
2248*10d63b7dSRichard Lowe 	if( (posix != is_xpg4)
2249*10d63b7dSRichard Lowe 	 && (!strcmp(mf_val->string_mb, makeflags_value_saved->string_mb)))
2250*10d63b7dSRichard Lowe 	{
2251*10d63b7dSRichard Lowe 		if (makeflags_string_posix.buffer.start[1] == (int) nul_char) {
2252*10d63b7dSRichard Lowe 			(void) SETVAR(makeflags,
2253*10d63b7dSRichard Lowe 				      GETNAME(makeflags_string_posix.buffer.start + 1,
2254*10d63b7dSRichard Lowe 					      FIND_LENGTH),
2255*10d63b7dSRichard Lowe 				      false);
2256*10d63b7dSRichard Lowe 		} else {
2257*10d63b7dSRichard Lowe 			if (makeflags_string_posix.buffer.start[1] != (int) space_char) {
2258*10d63b7dSRichard Lowe 				(void) SETVAR(makeflags,
2259*10d63b7dSRichard Lowe 					      GETNAME(makeflags_string_posix.buffer.start,
2260*10d63b7dSRichard Lowe 						      FIND_LENGTH),
2261*10d63b7dSRichard Lowe 					      false);
2262*10d63b7dSRichard Lowe 			} else {
2263*10d63b7dSRichard Lowe 				(void) SETVAR(makeflags,
2264*10d63b7dSRichard Lowe 					      GETNAME(makeflags_string_posix.buffer.start + 2,
2265*10d63b7dSRichard Lowe 						      FIND_LENGTH),
2266*10d63b7dSRichard Lowe 					      false);
2267*10d63b7dSRichard Lowe 			}
2268*10d63b7dSRichard Lowe 		}
2269*10d63b7dSRichard Lowe 	}
2270*10d63b7dSRichard Lowe 
2271*10d63b7dSRichard Lowe 	if (makeflags_string.free_after_use) {
2272*10d63b7dSRichard Lowe 		retmem(makeflags_string.buffer.start);
2273*10d63b7dSRichard Lowe 	}
2274*10d63b7dSRichard Lowe 	if (makeflags_string_posix.free_after_use) {
2275*10d63b7dSRichard Lowe 		retmem(makeflags_string_posix.buffer.start);
2276*10d63b7dSRichard Lowe 	}
2277*10d63b7dSRichard Lowe 	makeflags_string.buffer.start = NULL;
2278*10d63b7dSRichard Lowe 	makeflags_string_posix.buffer.start = NULL;
2279*10d63b7dSRichard Lowe 
2280*10d63b7dSRichard Lowe 	if (posix) {
2281*10d63b7dSRichard Lowe 		/*
2282*10d63b7dSRichard Lowe 		 * If the user did not redefine the ARFLAGS macro in the
2283*10d63b7dSRichard Lowe 		 * default makefile (make.rules), then we'd like to
2284*10d63b7dSRichard Lowe 		 * change the macro value of ARFLAGS to be in accordance
2285*10d63b7dSRichard Lowe 		 * with "POSIX" requirements.
2286*10d63b7dSRichard Lowe 		 */
2287*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "ARFLAGS");
2288*10d63b7dSRichard Lowe 		name = GETNAME(wcs_buffer, wcslen(wcs_buffer));
2289*10d63b7dSRichard Lowe 		macro = get_prop(name->prop, macro_prop);
2290*10d63b7dSRichard Lowe 		if ((macro != NULL) && /* Maybe (macro == NULL) || ? */
2291*10d63b7dSRichard Lowe 		    (IS_EQUAL(macro->body.macro.value->string_mb,
2292*10d63b7dSRichard Lowe 		              "rv"))) {
2293*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, "-rv");
2294*10d63b7dSRichard Lowe 			value = GETNAME(wcs_buffer, wcslen(wcs_buffer));
2295*10d63b7dSRichard Lowe 			(void) SETVAR(name,
2296*10d63b7dSRichard Lowe 			              value,
2297*10d63b7dSRichard Lowe 			              false);
2298*10d63b7dSRichard Lowe 		}
2299*10d63b7dSRichard Lowe 	}
2300*10d63b7dSRichard Lowe 
2301*10d63b7dSRichard Lowe 	if (!posix && !svr4) {
2302*10d63b7dSRichard Lowe 		set_sgs_support();
2303*10d63b7dSRichard Lowe 	}
2304*10d63b7dSRichard Lowe 
2305*10d63b7dSRichard Lowe 
2306*10d63b7dSRichard Lowe /*
2307*10d63b7dSRichard Lowe  *	Make sure KEEP_STATE is in the environment if KEEP_STATE is on.
2308*10d63b7dSRichard Lowe  */
2309*10d63b7dSRichard Lowe 	macro = get_prop(keep_state_name->prop, macro_prop);
2310*10d63b7dSRichard Lowe 	if ((macro != NULL) &&
2311*10d63b7dSRichard Lowe 	    macro->body.macro.exported) {
2312*10d63b7dSRichard Lowe 		keep_state = true;
2313*10d63b7dSRichard Lowe 	}
2314*10d63b7dSRichard Lowe 	if (keep_state) {
2315*10d63b7dSRichard Lowe 		if (macro == NULL) {
2316*10d63b7dSRichard Lowe 			macro = maybe_append_prop(keep_state_name,
2317*10d63b7dSRichard Lowe 						  macro_prop);
2318*10d63b7dSRichard Lowe 		}
2319*10d63b7dSRichard Lowe 		macro->body.macro.exported = true;
2320*10d63b7dSRichard Lowe 		(void) SETVAR(keep_state_name,
2321*10d63b7dSRichard Lowe 			      empty_name,
2322*10d63b7dSRichard Lowe 			      false);
2323*10d63b7dSRichard Lowe 
2324*10d63b7dSRichard Lowe 		/*
2325*10d63b7dSRichard Lowe 		 *	Read state file
2326*10d63b7dSRichard Lowe 		 */
2327*10d63b7dSRichard Lowe 
2328*10d63b7dSRichard Lowe 		/* Before we read state, let's make sure we have
2329*10d63b7dSRichard Lowe 		** right state file.
2330*10d63b7dSRichard Lowe 		*/
2331*10d63b7dSRichard Lowe 		/* just in case macro references are used in make_state file
2332*10d63b7dSRichard Lowe 		** name, we better expand them at this stage using expand_value.
2333*10d63b7dSRichard Lowe 		*/
2334*10d63b7dSRichard Lowe 		INIT_STRING_FROM_STACK(dest, destbuffer);
2335*10d63b7dSRichard Lowe 		expand_value(make_state, &dest, false);
2336*10d63b7dSRichard Lowe 
2337*10d63b7dSRichard Lowe 		make_state = GETNAME(dest.buffer.start, FIND_LENGTH);
2338*10d63b7dSRichard Lowe 
2339*10d63b7dSRichard Lowe 		if(!stat(make_state->string_mb, &make_state_stat)) {
2340*10d63b7dSRichard Lowe 		   if(!(make_state_stat.st_mode & S_IFREG) ) {
2341*10d63b7dSRichard Lowe 			/* copy the make_state structure to the other
2342*10d63b7dSRichard Lowe 			** and then let make_state point to the new
2343*10d63b7dSRichard Lowe 			** one.
2344*10d63b7dSRichard Lowe 			*/
2345*10d63b7dSRichard Lowe 		      memcpy(&state_filename, make_state,sizeof(state_filename));
2346*10d63b7dSRichard Lowe 		      state_filename.string_mb = state_file_str_mb;
2347*10d63b7dSRichard Lowe 		/* Just a kludge to avoid two slashes back to back */
2348*10d63b7dSRichard Lowe 		      if((make_state->hash.length == 1)&&
2349*10d63b7dSRichard Lowe 			        (make_state->string_mb[0] == '/')) {
2350*10d63b7dSRichard Lowe 			 make_state->hash.length = 0;
2351*10d63b7dSRichard Lowe 			 make_state->string_mb[0] = '\0';
2352*10d63b7dSRichard Lowe 		      }
2353*10d63b7dSRichard Lowe 	   	      sprintf(state_file_str_mb,"%s%s",
2354*10d63b7dSRichard Lowe 		       make_state->string_mb,"/.make.state");
2355*10d63b7dSRichard Lowe 		      make_state = &state_filename;
2356*10d63b7dSRichard Lowe 			/* adjust the length to reflect the appended string */
2357*10d63b7dSRichard Lowe 		      make_state->hash.length += 12;
2358*10d63b7dSRichard Lowe 		   }
2359*10d63b7dSRichard Lowe 		} else { /* the file doesn't exist or no permission */
2360*10d63b7dSRichard Lowe 		   char tmp_path[MAXPATHLEN];
2361*10d63b7dSRichard Lowe 		   char *slashp;
2362*10d63b7dSRichard Lowe 
2363*10d63b7dSRichard Lowe 		   if (slashp = strrchr(make_state->string_mb, '/')) {
2364*10d63b7dSRichard Lowe 		      strncpy(tmp_path, make_state->string_mb,
2365*10d63b7dSRichard Lowe 				(slashp - make_state->string_mb));
2366*10d63b7dSRichard Lowe 			tmp_path[slashp - make_state->string_mb]=0;
2367*10d63b7dSRichard Lowe 		      if(strlen(tmp_path)) {
2368*10d63b7dSRichard Lowe 		        if(stat(tmp_path, &make_state_stat)) {
2369*10d63b7dSRichard Lowe 			  warning(gettext("directory %s for .KEEP_STATE_FILE does not exist"),tmp_path);
2370*10d63b7dSRichard Lowe 		        }
2371*10d63b7dSRichard Lowe 		        if (access(tmp_path, F_OK) != 0) {
2372*10d63b7dSRichard Lowe 			  warning(gettext("can't access dir %s"),tmp_path);
2373*10d63b7dSRichard Lowe 		        }
2374*10d63b7dSRichard Lowe 		      }
2375*10d63b7dSRichard Lowe 		   }
2376*10d63b7dSRichard Lowe 		}
2377*10d63b7dSRichard Lowe 		if (report_dependencies_level != 1) {
2378*10d63b7dSRichard Lowe 			Makefile_type	makefile_type_temp = makefile_type;
2379*10d63b7dSRichard Lowe 			makefile_type = reading_statefile;
2380*10d63b7dSRichard Lowe 			if (read_trace_level > 1) {
2381*10d63b7dSRichard Lowe 				trace_reader = true;
2382*10d63b7dSRichard Lowe 			}
2383*10d63b7dSRichard Lowe 			(void) read_simple_file(make_state,
2384*10d63b7dSRichard Lowe 						false,
2385*10d63b7dSRichard Lowe 						false,
2386*10d63b7dSRichard Lowe 						false,
2387*10d63b7dSRichard Lowe 						false,
2388*10d63b7dSRichard Lowe 						false,
2389*10d63b7dSRichard Lowe 						true);
2390*10d63b7dSRichard Lowe 			trace_reader = false;
2391*10d63b7dSRichard Lowe 			makefile_type = makefile_type_temp;
2392*10d63b7dSRichard Lowe 		}
2393*10d63b7dSRichard Lowe 	}
2394*10d63b7dSRichard Lowe }
2395*10d63b7dSRichard Lowe 
2396*10d63b7dSRichard Lowe /*
2397*10d63b7dSRichard Lowe  * Scan the argv for options and "=" type args and make them readonly.
2398*10d63b7dSRichard Lowe  */
2399*10d63b7dSRichard Lowe static void
enter_argv_values(int argc,char * argv[],ASCII_Dyn_Array * makeflags_and_macro)2400*10d63b7dSRichard Lowe enter_argv_values(int argc, char *argv[], ASCII_Dyn_Array *makeflags_and_macro)
2401*10d63b7dSRichard Lowe {
2402*10d63b7dSRichard Lowe 	register char		*cp;
2403*10d63b7dSRichard Lowe 	register int		i;
2404*10d63b7dSRichard Lowe 	int			length;
2405*10d63b7dSRichard Lowe 	register Name		name;
2406*10d63b7dSRichard Lowe 	int			opt_separator = argc;
2407*10d63b7dSRichard Lowe 	char			tmp_char;
2408*10d63b7dSRichard Lowe 	wchar_t			*tmp_wcs_buffer;
2409*10d63b7dSRichard Lowe 	register Name		value;
2410*10d63b7dSRichard Lowe 	Boolean			append = false;
2411*10d63b7dSRichard Lowe 	Property		macro;
2412*10d63b7dSRichard Lowe 	struct stat		statbuf;
2413*10d63b7dSRichard Lowe 
2414*10d63b7dSRichard Lowe 
2415*10d63b7dSRichard Lowe 	/* Read argv options and "=" type args and make them readonly. */
2416*10d63b7dSRichard Lowe 	makefile_type = reading_nothing;
2417*10d63b7dSRichard Lowe 	for (i = 1; i < argc; ++i) {
2418*10d63b7dSRichard Lowe 		append = false;
2419*10d63b7dSRichard Lowe 		if (argv[i] == NULL) {
2420*10d63b7dSRichard Lowe 			continue;
2421*10d63b7dSRichard Lowe 		} else if (((argv[i][0] == '-') && (argv[i][1] == '-')) ||
2422*10d63b7dSRichard Lowe 			   ((argv[i][0] == (int) ' ') &&
2423*10d63b7dSRichard Lowe 			    (argv[i][1] == (int) '-') &&
2424*10d63b7dSRichard Lowe 			    (argv[i][2] == (int) ' ') &&
2425*10d63b7dSRichard Lowe 			    (argv[i][3] == (int) '-'))) {
2426*10d63b7dSRichard Lowe 			argv[i] = NULL;
2427*10d63b7dSRichard Lowe 			opt_separator = i;
2428*10d63b7dSRichard Lowe 			continue;
2429*10d63b7dSRichard Lowe 		} else if ((i < opt_separator) && (argv[i][0] == (int) hyphen_char)) {
2430*10d63b7dSRichard Lowe 			switch (parse_command_option(argv[i][1])) {
2431*10d63b7dSRichard Lowe 			case 1:	/* -f seen */
2432*10d63b7dSRichard Lowe 				++i;
2433*10d63b7dSRichard Lowe 				continue;
2434*10d63b7dSRichard Lowe 			case 2:	/* -c seen */
2435*10d63b7dSRichard Lowe 				if (argv[i+1] == NULL) {
2436*10d63b7dSRichard Lowe 					fatal(gettext("No dmake rcfile argument after -c flag"));
2437*10d63b7dSRichard Lowe 				}
2438*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, "DMAKE_RCFILE");
2439*10d63b7dSRichard Lowe 				name = GETNAME(wcs_buffer, FIND_LENGTH);
2440*10d63b7dSRichard Lowe 				break;
2441*10d63b7dSRichard Lowe 			case 4:	/* -g seen */
2442*10d63b7dSRichard Lowe 				if (argv[i+1] == NULL) {
2443*10d63b7dSRichard Lowe 					fatal(gettext("No dmake group argument after -g flag"));
2444*10d63b7dSRichard Lowe 				}
2445*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, "DMAKE_GROUP");
2446*10d63b7dSRichard Lowe 				name = GETNAME(wcs_buffer, FIND_LENGTH);
2447*10d63b7dSRichard Lowe 				break;
2448*10d63b7dSRichard Lowe 			case 8:	/* -j seen */
2449*10d63b7dSRichard Lowe 				if (argv[i+1] == NULL) {
2450*10d63b7dSRichard Lowe 					fatal(gettext("No dmake max jobs argument after -j flag"));
2451*10d63b7dSRichard Lowe 				}
2452*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, "DMAKE_MAX_JOBS");
2453*10d63b7dSRichard Lowe 				name = GETNAME(wcs_buffer, FIND_LENGTH);
2454*10d63b7dSRichard Lowe 				break;
2455*10d63b7dSRichard Lowe 			case 16: /* -M seen */
2456*10d63b7dSRichard Lowe 				if (argv[i+1] == NULL) {
2457*10d63b7dSRichard Lowe 					fatal(gettext("No pmake machinesfile argument after -M flag"));
2458*10d63b7dSRichard Lowe 				}
2459*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, "PMAKE_MACHINESFILE");
2460*10d63b7dSRichard Lowe 				name = GETNAME(wcs_buffer, FIND_LENGTH);
2461*10d63b7dSRichard Lowe 				break;
2462*10d63b7dSRichard Lowe 			case 32: /* -m seen */
2463*10d63b7dSRichard Lowe 				if (argv[i+1] == NULL) {
2464*10d63b7dSRichard Lowe 					fatal(gettext("No dmake mode argument after -m flag"));
2465*10d63b7dSRichard Lowe 				}
2466*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, "DMAKE_MODE");
2467*10d63b7dSRichard Lowe 				name = GETNAME(wcs_buffer, FIND_LENGTH);
2468*10d63b7dSRichard Lowe 				break;
2469*10d63b7dSRichard Lowe 			case 256: /* -K seen */
2470*10d63b7dSRichard Lowe 				if (argv[i+1] == NULL) {
2471*10d63b7dSRichard Lowe 					fatal(gettext("No makestate filename argument after -K flag"));
2472*10d63b7dSRichard Lowe 				}
2473*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, argv[i+1]);
2474*10d63b7dSRichard Lowe 				make_state = GETNAME(wcs_buffer, FIND_LENGTH);
2475*10d63b7dSRichard Lowe 				keep_state = true;
2476*10d63b7dSRichard Lowe 				argv[i] = NULL;
2477*10d63b7dSRichard Lowe 				argv[i+1] = NULL;
2478*10d63b7dSRichard Lowe 				continue;
2479*10d63b7dSRichard Lowe 			case 512:	/* -o seen */
2480*10d63b7dSRichard Lowe 				if (argv[i+1] == NULL) {
2481*10d63b7dSRichard Lowe 					fatal(gettext("No dmake output dir argument after -o flag"));
2482*10d63b7dSRichard Lowe 				}
2483*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, "DMAKE_ODIR");
2484*10d63b7dSRichard Lowe 				name = GETNAME(wcs_buffer, FIND_LENGTH);
2485*10d63b7dSRichard Lowe 				break;
2486*10d63b7dSRichard Lowe 			case 1024: /* -x seen */
2487*10d63b7dSRichard Lowe 				if (argv[i+1] == NULL) {
2488*10d63b7dSRichard Lowe 					fatal(gettext("No argument after -x flag"));
2489*10d63b7dSRichard Lowe 				}
2490*10d63b7dSRichard Lowe 				length = strlen( "SUN_MAKE_COMPAT_MODE=");
2491*10d63b7dSRichard Lowe 				if (strncmp(argv[i+1], "SUN_MAKE_COMPAT_MODE=", length) == 0) {
2492*10d63b7dSRichard Lowe 					argv[i+1] = &argv[i+1][length];
2493*10d63b7dSRichard Lowe 					MBSTOWCS(wcs_buffer, "SUN_MAKE_COMPAT_MODE");
2494*10d63b7dSRichard Lowe 					name = GETNAME(wcs_buffer, FIND_LENGTH);
2495*10d63b7dSRichard Lowe 					dmake_compat_mode_specified = dmake_add_mode_specified;
2496*10d63b7dSRichard Lowe 					break;
2497*10d63b7dSRichard Lowe 				}
2498*10d63b7dSRichard Lowe 				length = strlen( "DMAKE_OUTPUT_MODE=");
2499*10d63b7dSRichard Lowe 				if (strncmp(argv[i+1], "DMAKE_OUTPUT_MODE=", length) == 0) {
2500*10d63b7dSRichard Lowe 					argv[i+1] = &argv[i+1][length];
2501*10d63b7dSRichard Lowe 					MBSTOWCS(wcs_buffer, "DMAKE_OUTPUT_MODE");
2502*10d63b7dSRichard Lowe 					name = GETNAME(wcs_buffer, FIND_LENGTH);
2503*10d63b7dSRichard Lowe 					dmake_output_mode_specified = dmake_add_mode_specified;
2504*10d63b7dSRichard Lowe 				} else {
2505*10d63b7dSRichard Lowe 					warning(gettext("Unknown argument `%s' after -x flag (ignored)"),
2506*10d63b7dSRichard Lowe 					      argv[i+1]);
2507*10d63b7dSRichard Lowe 					argv[i] = argv[i + 1] = NULL;
2508*10d63b7dSRichard Lowe 					continue;
2509*10d63b7dSRichard Lowe 				}
2510*10d63b7dSRichard Lowe 				break;
2511*10d63b7dSRichard Lowe 			default: /* Shouldn't reach here */
2512*10d63b7dSRichard Lowe 				argv[i] = NULL;
2513*10d63b7dSRichard Lowe 				continue;
2514*10d63b7dSRichard Lowe 			}
2515*10d63b7dSRichard Lowe 			argv[i] = NULL;
2516*10d63b7dSRichard Lowe 			if (i == (argc - 1)) {
2517*10d63b7dSRichard Lowe 				break;
2518*10d63b7dSRichard Lowe 			}
2519*10d63b7dSRichard Lowe 			if ((length = strlen(argv[i+1])) >= MAXPATHLEN) {
2520*10d63b7dSRichard Lowe 				tmp_wcs_buffer = ALLOC_WC(length + 1);
2521*10d63b7dSRichard Lowe 				(void) mbstowcs(tmp_wcs_buffer, argv[i+1], length + 1);
2522*10d63b7dSRichard Lowe 				value = GETNAME(tmp_wcs_buffer, FIND_LENGTH);
2523*10d63b7dSRichard Lowe 				retmem(tmp_wcs_buffer);
2524*10d63b7dSRichard Lowe 			} else {
2525*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, argv[i+1]);
2526*10d63b7dSRichard Lowe 				value = GETNAME(wcs_buffer, FIND_LENGTH);
2527*10d63b7dSRichard Lowe 			}
2528*10d63b7dSRichard Lowe 			argv[i+1] = NULL;
2529*10d63b7dSRichard Lowe 		} else if ((cp = strchr(argv[i], (int) equal_char)) != NULL) {
2530*10d63b7dSRichard Lowe /*
2531*10d63b7dSRichard Lowe  * Combine all macro in dynamic array
2532*10d63b7dSRichard Lowe  */
2533*10d63b7dSRichard Lowe 			if(*(cp-1) == (int) plus_char)
2534*10d63b7dSRichard Lowe 			{
2535*10d63b7dSRichard Lowe 				if(isspace(*(cp-2))) {
2536*10d63b7dSRichard Lowe 					append = true;
2537*10d63b7dSRichard Lowe 					cp--;
2538*10d63b7dSRichard Lowe 				}
2539*10d63b7dSRichard Lowe 			}
2540*10d63b7dSRichard Lowe 			if(!append)
2541*10d63b7dSRichard Lowe 				append_or_replace_macro_in_dyn_array(makeflags_and_macro, argv[i]);
2542*10d63b7dSRichard Lowe 
2543*10d63b7dSRichard Lowe 			while (isspace(*(cp-1))) {
2544*10d63b7dSRichard Lowe 				cp--;
2545*10d63b7dSRichard Lowe 			}
2546*10d63b7dSRichard Lowe 			tmp_char = *cp;
2547*10d63b7dSRichard Lowe 			*cp = (int) nul_char;
2548*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, argv[i]);
2549*10d63b7dSRichard Lowe 			*cp = tmp_char;
2550*10d63b7dSRichard Lowe 			name = GETNAME(wcs_buffer, wcslen(wcs_buffer));
2551*10d63b7dSRichard Lowe 			while (*cp != (int) equal_char) {
2552*10d63b7dSRichard Lowe 				cp++;
2553*10d63b7dSRichard Lowe 			}
2554*10d63b7dSRichard Lowe 			cp++;
2555*10d63b7dSRichard Lowe 			while (isspace(*cp) && (*cp != (int) nul_char)) {
2556*10d63b7dSRichard Lowe 				cp++;
2557*10d63b7dSRichard Lowe 			}
2558*10d63b7dSRichard Lowe 			if ((length = strlen(cp)) >= MAXPATHLEN) {
2559*10d63b7dSRichard Lowe 				tmp_wcs_buffer = ALLOC_WC(length + 1);
2560*10d63b7dSRichard Lowe 				(void) mbstowcs(tmp_wcs_buffer, cp, length + 1);
2561*10d63b7dSRichard Lowe 				value = GETNAME(tmp_wcs_buffer, FIND_LENGTH);
2562*10d63b7dSRichard Lowe 				retmem(tmp_wcs_buffer);
2563*10d63b7dSRichard Lowe 			} else {
2564*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, cp);
2565*10d63b7dSRichard Lowe 				value = GETNAME(wcs_buffer, FIND_LENGTH);
2566*10d63b7dSRichard Lowe 			}
2567*10d63b7dSRichard Lowe 			argv[i] = NULL;
2568*10d63b7dSRichard Lowe 		} else {
2569*10d63b7dSRichard Lowe 			/* Illegal MAKEFLAGS argument */
2570*10d63b7dSRichard Lowe 			continue;
2571*10d63b7dSRichard Lowe 		}
2572*10d63b7dSRichard Lowe 		if(append) {
2573*10d63b7dSRichard Lowe 			setvar_append(name, value);
2574*10d63b7dSRichard Lowe 			append = false;
2575*10d63b7dSRichard Lowe 		} else {
2576*10d63b7dSRichard Lowe 			macro = maybe_append_prop(name, macro_prop);
2577*10d63b7dSRichard Lowe 			macro->body.macro.exported = true;
2578*10d63b7dSRichard Lowe 			SETVAR(name, value, false)->body.macro.read_only = true;
2579*10d63b7dSRichard Lowe 		}
2580*10d63b7dSRichard Lowe 	}
2581*10d63b7dSRichard Lowe }
2582*10d63b7dSRichard Lowe 
2583*10d63b7dSRichard Lowe /*
2584*10d63b7dSRichard Lowe  * Append the DMake option and value to the MAKEFLAGS string.
2585*10d63b7dSRichard Lowe  */
2586*10d63b7dSRichard Lowe static void
append_makeflags_string(Name name,register String makeflags_string)2587*10d63b7dSRichard Lowe append_makeflags_string(Name name, register String makeflags_string)
2588*10d63b7dSRichard Lowe {
2589*10d63b7dSRichard Lowe 	const char	*option;
2590*10d63b7dSRichard Lowe 
2591*10d63b7dSRichard Lowe 	if (strcmp(name->string_mb, "DMAKE_GROUP") == 0) {
2592*10d63b7dSRichard Lowe 		option = " -g ";
2593*10d63b7dSRichard Lowe 	} else if (strcmp(name->string_mb, "DMAKE_MAX_JOBS") == 0) {
2594*10d63b7dSRichard Lowe 		option = " -j ";
2595*10d63b7dSRichard Lowe 	} else if (strcmp(name->string_mb, "DMAKE_MODE") == 0) {
2596*10d63b7dSRichard Lowe 		option = " -m ";
2597*10d63b7dSRichard Lowe 	} else if (strcmp(name->string_mb, "DMAKE_ODIR") == 0) {
2598*10d63b7dSRichard Lowe 		option = " -o ";
2599*10d63b7dSRichard Lowe 	} else if (strcmp(name->string_mb, "DMAKE_RCFILE") == 0) {
2600*10d63b7dSRichard Lowe 		option = " -c ";
2601*10d63b7dSRichard Lowe 	} else if (strcmp(name->string_mb, "PMAKE_MACHINESFILE") == 0) {
2602*10d63b7dSRichard Lowe 		option = " -M ";
2603*10d63b7dSRichard Lowe 	} else if (strcmp(name->string_mb, "DMAKE_OUTPUT_MODE") == 0) {
2604*10d63b7dSRichard Lowe 		option = " -x DMAKE_OUTPUT_MODE=";
2605*10d63b7dSRichard Lowe 	} else if (strcmp(name->string_mb, "SUN_MAKE_COMPAT_MODE") == 0) {
2606*10d63b7dSRichard Lowe 		option = " -x SUN_MAKE_COMPAT_MODE=";
2607*10d63b7dSRichard Lowe 	} else {
2608*10d63b7dSRichard Lowe 		fatal(gettext("Internal error: name not recognized in append_makeflags_string()"));
2609*10d63b7dSRichard Lowe 	}
2610*10d63b7dSRichard Lowe 	Property prop = maybe_append_prop(name, macro_prop);
2611*10d63b7dSRichard Lowe 	if( prop == 0 || prop->body.macro.value == 0 ||
2612*10d63b7dSRichard Lowe 	    prop->body.macro.value->string_mb == 0 ) {
2613*10d63b7dSRichard Lowe 		return;
2614*10d63b7dSRichard Lowe 	}
2615*10d63b7dSRichard Lowe 	char mbs_value[MAXPATHLEN + 100];
2616*10d63b7dSRichard Lowe 	strcpy(mbs_value, option);
2617*10d63b7dSRichard Lowe 	strcat(mbs_value, prop->body.macro.value->string_mb);
2618*10d63b7dSRichard Lowe 	MBSTOWCS(wcs_buffer, mbs_value);
2619*10d63b7dSRichard Lowe 	append_string(wcs_buffer, makeflags_string, FIND_LENGTH);
2620*10d63b7dSRichard Lowe }
2621*10d63b7dSRichard Lowe 
2622*10d63b7dSRichard Lowe /*
2623*10d63b7dSRichard Lowe  *	read_environment(read_only)
2624*10d63b7dSRichard Lowe  *
2625*10d63b7dSRichard Lowe  *	This routine reads the process environment when make starts and enters
2626*10d63b7dSRichard Lowe  *	it as make macros. The environment variable SHELL is ignored.
2627*10d63b7dSRichard Lowe  *
2628*10d63b7dSRichard Lowe  *	Parameters:
2629*10d63b7dSRichard Lowe  *		read_only	Should we make env vars read only?
2630*10d63b7dSRichard Lowe  *
2631*10d63b7dSRichard Lowe  *	Global variables used:
2632*10d63b7dSRichard Lowe  *		report_pwd	Set if this make was started by other make
2633*10d63b7dSRichard Lowe  */
2634*10d63b7dSRichard Lowe static void
read_environment(Boolean read_only)2635*10d63b7dSRichard Lowe read_environment(Boolean read_only)
2636*10d63b7dSRichard Lowe {
2637*10d63b7dSRichard Lowe 	register char		**environment;
2638*10d63b7dSRichard Lowe 	int			length;
2639*10d63b7dSRichard Lowe 	wchar_t			*tmp_wcs_buffer;
2640*10d63b7dSRichard Lowe 	Boolean			alloced_tmp_wcs_buffer = false;
2641*10d63b7dSRichard Lowe 	register wchar_t	*name;
2642*10d63b7dSRichard Lowe 	register wchar_t	*value;
2643*10d63b7dSRichard Lowe 	register Name		macro;
2644*10d63b7dSRichard Lowe 	Property		val;
2645*10d63b7dSRichard Lowe 	Boolean			read_only_saved;
2646*10d63b7dSRichard Lowe 
2647*10d63b7dSRichard Lowe 	reading_environment = true;
2648*10d63b7dSRichard Lowe 	environment = environ;
2649*10d63b7dSRichard Lowe 	for (; *environment; environment++) {
2650*10d63b7dSRichard Lowe 		read_only_saved = read_only;
2651*10d63b7dSRichard Lowe 		if ((length = strlen(*environment)) >= MAXPATHLEN) {
2652*10d63b7dSRichard Lowe 			tmp_wcs_buffer = ALLOC_WC(length + 1);
2653*10d63b7dSRichard Lowe 			alloced_tmp_wcs_buffer = true;
2654*10d63b7dSRichard Lowe 			(void) mbstowcs(tmp_wcs_buffer, *environment, length + 1);
2655*10d63b7dSRichard Lowe 			name = tmp_wcs_buffer;
2656*10d63b7dSRichard Lowe 		} else {
2657*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, *environment);
2658*10d63b7dSRichard Lowe 			name = wcs_buffer;
2659*10d63b7dSRichard Lowe 		}
2660*10d63b7dSRichard Lowe 		value = (wchar_t *) wcschr(name, (int) equal_char);
2661*10d63b7dSRichard Lowe 
2662*10d63b7dSRichard Lowe 		/*
2663*10d63b7dSRichard Lowe 		 * Looks like there's a bug in the system, but sometimes
2664*10d63b7dSRichard Lowe 		 * you can get blank lines in *environment.
2665*10d63b7dSRichard Lowe 		 */
2666*10d63b7dSRichard Lowe 		if (!value) {
2667*10d63b7dSRichard Lowe 			continue;
2668*10d63b7dSRichard Lowe 		}
2669*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer2, "SHELL=");
2670*10d63b7dSRichard Lowe 		if (IS_WEQUALN(name, wcs_buffer2, wcslen(wcs_buffer2))) {
2671*10d63b7dSRichard Lowe 			continue;
2672*10d63b7dSRichard Lowe 		}
2673*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer2, "MAKEFLAGS=");
2674*10d63b7dSRichard Lowe 		if (IS_WEQUALN(name, wcs_buffer2, wcslen(wcs_buffer2))) {
2675*10d63b7dSRichard Lowe 			report_pwd = true;
2676*10d63b7dSRichard Lowe 			/*
2677*10d63b7dSRichard Lowe 			 * In POSIX mode we do not want MAKEFLAGS to be readonly.
2678*10d63b7dSRichard Lowe 			 * If the MAKEFLAGS macro is subsequently set by the makefile,
2679*10d63b7dSRichard Lowe 			 * it replaces the MAKEFLAGS variable currently found in the
2680*10d63b7dSRichard Lowe 			 * environment.
2681*10d63b7dSRichard Lowe 			 * See Assertion 50 in section 6.2.5.3 of standard P1003.3.2/D8.
2682*10d63b7dSRichard Lowe 			 */
2683*10d63b7dSRichard Lowe 			if(posix) {
2684*10d63b7dSRichard Lowe 				read_only_saved = false;
2685*10d63b7dSRichard Lowe 			}
2686*10d63b7dSRichard Lowe 		}
2687*10d63b7dSRichard Lowe 
2688*10d63b7dSRichard Lowe 		/*
2689*10d63b7dSRichard Lowe 		 * We ignore SUNPRO_DEPENDENCIES. This environment variable is
2690*10d63b7dSRichard Lowe 		 * set by make and read by cpp which then writes info to
2691*10d63b7dSRichard Lowe 		 * .make.dependency.xxx.  When make is invoked by another make
2692*10d63b7dSRichard Lowe 		 * (recursive make), we don't want to read this because then
2693*10d63b7dSRichard Lowe 		 * the child make will end up writing to the parent
2694*10d63b7dSRichard Lowe 		 * directory's .make.state and clobbering them.
2695*10d63b7dSRichard Lowe 		 */
2696*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer2, "SUNPRO_DEPENDENCIES");
2697*10d63b7dSRichard Lowe 		if (IS_WEQUALN(name, wcs_buffer2, wcslen(wcs_buffer2))) {
2698*10d63b7dSRichard Lowe 			continue;
2699*10d63b7dSRichard Lowe 		}
2700*10d63b7dSRichard Lowe 
2701*10d63b7dSRichard Lowe 		macro = GETNAME(name, value - name);
2702*10d63b7dSRichard Lowe 		maybe_append_prop(macro, macro_prop)->body.macro.exported =
2703*10d63b7dSRichard Lowe 		  true;
2704*10d63b7dSRichard Lowe 		if ((value == NULL) || ((value + 1)[0] == (int) nul_char)) {
2705*10d63b7dSRichard Lowe 			val = setvar_daemon(macro,
2706*10d63b7dSRichard Lowe 					    (Name) NULL,
2707*10d63b7dSRichard Lowe 					    false, no_daemon, false, debug_level);
2708*10d63b7dSRichard Lowe 		} else {
2709*10d63b7dSRichard Lowe 			val = setvar_daemon(macro,
2710*10d63b7dSRichard Lowe 					    GETNAME(value + 1, FIND_LENGTH),
2711*10d63b7dSRichard Lowe 					    false, no_daemon, false, debug_level);
2712*10d63b7dSRichard Lowe 		}
2713*10d63b7dSRichard Lowe 		val->body.macro.read_only = read_only_saved;
2714*10d63b7dSRichard Lowe 		if (alloced_tmp_wcs_buffer) {
2715*10d63b7dSRichard Lowe 			retmem(tmp_wcs_buffer);
2716*10d63b7dSRichard Lowe 			alloced_tmp_wcs_buffer = false;
2717*10d63b7dSRichard Lowe 		}
2718*10d63b7dSRichard Lowe 	}
2719*10d63b7dSRichard Lowe 	reading_environment = false;
2720*10d63b7dSRichard Lowe }
2721*10d63b7dSRichard Lowe 
2722*10d63b7dSRichard Lowe /*
2723*10d63b7dSRichard Lowe  *	read_makefile(makefile, complain, must_exist, report_file)
2724*10d63b7dSRichard Lowe  *
2725*10d63b7dSRichard Lowe  *	Read one makefile and check the result
2726*10d63b7dSRichard Lowe  *
2727*10d63b7dSRichard Lowe  *	Return value:
2728*10d63b7dSRichard Lowe  *				false is the read failed
2729*10d63b7dSRichard Lowe  *
2730*10d63b7dSRichard Lowe  *	Parameters:
2731*10d63b7dSRichard Lowe  *		makefile	The file to read
2732*10d63b7dSRichard Lowe  *		complain	Passed thru to read_simple_file()
2733*10d63b7dSRichard Lowe  *		must_exist	Passed thru to read_simple_file()
2734*10d63b7dSRichard Lowe  *		report_file	Passed thru to read_simple_file()
2735*10d63b7dSRichard Lowe  *
2736*10d63b7dSRichard Lowe  *	Global variables used:
2737*10d63b7dSRichard Lowe  *		makefile_type	Set to indicate we are reading main file
2738*10d63b7dSRichard Lowe  *		recursion_level	Initialized
2739*10d63b7dSRichard Lowe  */
2740*10d63b7dSRichard Lowe static Boolean
read_makefile(register Name makefile,Boolean complain,Boolean must_exist,Boolean report_file)2741*10d63b7dSRichard Lowe read_makefile(register Name makefile, Boolean complain, Boolean must_exist, Boolean report_file)
2742*10d63b7dSRichard Lowe {
2743*10d63b7dSRichard Lowe 	Boolean			b;
2744*10d63b7dSRichard Lowe 
2745*10d63b7dSRichard Lowe 	makefile_type = reading_makefile;
2746*10d63b7dSRichard Lowe 	recursion_level = 0;
2747*10d63b7dSRichard Lowe 	reading_dependencies = true;
2748*10d63b7dSRichard Lowe 	b = read_simple_file(makefile, true, true, complain,
2749*10d63b7dSRichard Lowe 			     must_exist, report_file, false);
2750*10d63b7dSRichard Lowe 	reading_dependencies = false;
2751*10d63b7dSRichard Lowe 	return b;
2752*10d63b7dSRichard Lowe }
2753*10d63b7dSRichard Lowe 
2754*10d63b7dSRichard Lowe /*
2755*10d63b7dSRichard Lowe  *	make_targets(argc, argv, parallel_flag)
2756*10d63b7dSRichard Lowe  *
2757*10d63b7dSRichard Lowe  *	Call doname on the specified targets
2758*10d63b7dSRichard Lowe  *
2759*10d63b7dSRichard Lowe  *	Parameters:
2760*10d63b7dSRichard Lowe  *		argc		You know what this is
2761*10d63b7dSRichard Lowe  *		argv		You know what this is
2762*10d63b7dSRichard Lowe  *		parallel_flag	True if building in parallel
2763*10d63b7dSRichard Lowe  *
2764*10d63b7dSRichard Lowe  *	Global variables used:
2765*10d63b7dSRichard Lowe  *		build_failed_seen Used to generated message after failed -k
2766*10d63b7dSRichard Lowe  *		commands_done	Used to generate message "Up to date"
2767*10d63b7dSRichard Lowe  *		default_target_to_build	First proper target in makefile
2768*10d63b7dSRichard Lowe  *		init		The Name ".INIT", use to run command
2769*10d63b7dSRichard Lowe  *		parallel	Global parallel building flag
2770*10d63b7dSRichard Lowe  *		quest		make -q, suppresses messages
2771*10d63b7dSRichard Lowe  *		recursion_level	Initialized, used for tracing
2772*10d63b7dSRichard Lowe  *		report_dependencies make -P, regroves whole process
2773*10d63b7dSRichard Lowe  */
2774*10d63b7dSRichard Lowe static void
make_targets(int argc,char ** argv,Boolean parallel_flag)2775*10d63b7dSRichard Lowe make_targets(int argc, char **argv, Boolean parallel_flag)
2776*10d63b7dSRichard Lowe {
2777*10d63b7dSRichard Lowe 	int			i;
2778*10d63b7dSRichard Lowe 	char			*cp;
2779*10d63b7dSRichard Lowe 	Doname			result;
2780*10d63b7dSRichard Lowe 	register Boolean	target_to_make_found = false;
2781*10d63b7dSRichard Lowe 
2782*10d63b7dSRichard Lowe 	(void) doname(init, true, true);
2783*10d63b7dSRichard Lowe 	recursion_level = 1;
2784*10d63b7dSRichard Lowe 	parallel = parallel_flag;
2785*10d63b7dSRichard Lowe /*
2786*10d63b7dSRichard Lowe  *	make remaining args
2787*10d63b7dSRichard Lowe  */
2788*10d63b7dSRichard Lowe /*
2789*10d63b7dSRichard Lowe 	if ((report_dependencies_level == 0) && parallel) {
2790*10d63b7dSRichard Lowe  */
2791*10d63b7dSRichard Lowe 	if (parallel) {
2792*10d63b7dSRichard Lowe 		/*
2793*10d63b7dSRichard Lowe 		 * If building targets in parallel, start all of the
2794*10d63b7dSRichard Lowe 		 * remaining args to build in parallel.
2795*10d63b7dSRichard Lowe 		 */
2796*10d63b7dSRichard Lowe 		for (i = 1; i < argc; i++) {
2797*10d63b7dSRichard Lowe 			if ((cp = argv[i]) != NULL) {
2798*10d63b7dSRichard Lowe 				commands_done = false;
2799*10d63b7dSRichard Lowe 				if ((cp[0] == (int) period_char) &&
2800*10d63b7dSRichard Lowe 				    (cp[1] == (int) slash_char)) {
2801*10d63b7dSRichard Lowe 					cp += 2;
2802*10d63b7dSRichard Lowe 				}
2803*10d63b7dSRichard Lowe 				 if((cp[0] == (int) ' ') &&
2804*10d63b7dSRichard Lowe 				    (cp[1] == (int) '-') &&
2805*10d63b7dSRichard Lowe 				    (cp[2] == (int) ' ') &&
2806*10d63b7dSRichard Lowe 				    (cp[3] == (int) '-')) {
2807*10d63b7dSRichard Lowe 			            argv[i] = NULL;
2808*10d63b7dSRichard Lowe 					continue;
2809*10d63b7dSRichard Lowe 				}
2810*10d63b7dSRichard Lowe 				MBSTOWCS(wcs_buffer, cp);
2811*10d63b7dSRichard Lowe 				//default_target_to_build = GETNAME(wcs_buffer,
2812*10d63b7dSRichard Lowe 				//				  FIND_LENGTH);
2813*10d63b7dSRichard Lowe 				default_target_to_build = normalize_name(wcs_buffer,
2814*10d63b7dSRichard Lowe 								  wcslen(wcs_buffer));
2815*10d63b7dSRichard Lowe 				if (default_target_to_build == wait_name) {
2816*10d63b7dSRichard Lowe 					if (parallel_process_cnt > 0) {
2817*10d63b7dSRichard Lowe 						finish_running();
2818*10d63b7dSRichard Lowe 					}
2819*10d63b7dSRichard Lowe 					continue;
2820*10d63b7dSRichard Lowe 				}
2821*10d63b7dSRichard Lowe 				top_level_target = get_wstring(default_target_to_build->string_mb);
2822*10d63b7dSRichard Lowe 				/*
2823*10d63b7dSRichard Lowe 				 * If we can't execute the current target in
2824*10d63b7dSRichard Lowe 				 * parallel, hold off the target processing
2825*10d63b7dSRichard Lowe 				 * to preserve the order of the targets as they appeared
2826*10d63b7dSRichard Lowe 				 * in command line.
2827*10d63b7dSRichard Lowe 				 */
2828*10d63b7dSRichard Lowe 				if (!parallel_ok(default_target_to_build, false)
2829*10d63b7dSRichard Lowe 						&& parallel_process_cnt > 0) {
2830*10d63b7dSRichard Lowe 					finish_running();
2831*10d63b7dSRichard Lowe 				}
2832*10d63b7dSRichard Lowe 				result = doname_check(default_target_to_build,
2833*10d63b7dSRichard Lowe 						      true,
2834*10d63b7dSRichard Lowe 						      false,
2835*10d63b7dSRichard Lowe 						      false);
2836*10d63b7dSRichard Lowe 				gather_recursive_deps();
2837*10d63b7dSRichard Lowe 				if (/* !commands_done && */
2838*10d63b7dSRichard Lowe 				    (result == build_ok) &&
2839*10d63b7dSRichard Lowe 				    !quest &&
2840*10d63b7dSRichard Lowe 				    (report_dependencies_level == 0) /*  &&
2841*10d63b7dSRichard Lowe 				    (exists(default_target_to_build) > file_doesnt_exist)  */) {
2842*10d63b7dSRichard Lowe 					if (posix) {
2843*10d63b7dSRichard Lowe 						if (!commands_done) {
2844*10d63b7dSRichard Lowe 							(void) printf(gettext("`%s' is updated.\n"),
2845*10d63b7dSRichard Lowe 						 		      default_target_to_build->string_mb);
2846*10d63b7dSRichard Lowe 						} else {
2847*10d63b7dSRichard Lowe 							if (no_action_was_taken) {
2848*10d63b7dSRichard Lowe 								(void) printf(gettext("`%s': no action was taken.\n"),
2849*10d63b7dSRichard Lowe 						 			      default_target_to_build->string_mb);
2850*10d63b7dSRichard Lowe 							}
2851*10d63b7dSRichard Lowe 						}
2852*10d63b7dSRichard Lowe 					} else {
2853*10d63b7dSRichard Lowe 						default_target_to_build->stat.time = file_no_time;
2854*10d63b7dSRichard Lowe 						if (!commands_done &&
2855*10d63b7dSRichard Lowe 						    (exists(default_target_to_build) > file_doesnt_exist)) {
2856*10d63b7dSRichard Lowe 							(void) printf(gettext("`%s' is up to date.\n"),
2857*10d63b7dSRichard Lowe 								      default_target_to_build->string_mb);
2858*10d63b7dSRichard Lowe 						}
2859*10d63b7dSRichard Lowe 					}
2860*10d63b7dSRichard Lowe 				}
2861*10d63b7dSRichard Lowe 			}
2862*10d63b7dSRichard Lowe 		}
2863*10d63b7dSRichard Lowe 		/* Now wait for all of the targets to finish running */
2864*10d63b7dSRichard Lowe 		finish_running();
2865*10d63b7dSRichard Lowe 		//		setjmp(jmpbuffer);
2866*10d63b7dSRichard Lowe 
2867*10d63b7dSRichard Lowe 	}
2868*10d63b7dSRichard Lowe 	for (i = 1; i < argc; i++) {
2869*10d63b7dSRichard Lowe 		if ((cp = argv[i]) != NULL) {
2870*10d63b7dSRichard Lowe 			target_to_make_found = true;
2871*10d63b7dSRichard Lowe 			if ((cp[0] == (int) period_char) &&
2872*10d63b7dSRichard Lowe 			    (cp[1] == (int) slash_char)) {
2873*10d63b7dSRichard Lowe 				cp += 2;
2874*10d63b7dSRichard Lowe 			}
2875*10d63b7dSRichard Lowe 				 if((cp[0] == (int) ' ') &&
2876*10d63b7dSRichard Lowe 				    (cp[1] == (int) '-') &&
2877*10d63b7dSRichard Lowe 				    (cp[2] == (int) ' ') &&
2878*10d63b7dSRichard Lowe 				    (cp[3] == (int) '-')) {
2879*10d63b7dSRichard Lowe 			            argv[i] = NULL;
2880*10d63b7dSRichard Lowe 					continue;
2881*10d63b7dSRichard Lowe 				}
2882*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, cp);
2883*10d63b7dSRichard Lowe 			default_target_to_build = normalize_name(wcs_buffer, wcslen(wcs_buffer));
2884*10d63b7dSRichard Lowe 			top_level_target = get_wstring(default_target_to_build->string_mb);
2885*10d63b7dSRichard Lowe 			report_recursion(default_target_to_build);
2886*10d63b7dSRichard Lowe 			commands_done = false;
2887*10d63b7dSRichard Lowe 			if (parallel) {
2888*10d63b7dSRichard Lowe 				result = (Doname) default_target_to_build->state;
2889*10d63b7dSRichard Lowe 			} else {
2890*10d63b7dSRichard Lowe 				result = doname_check(default_target_to_build,
2891*10d63b7dSRichard Lowe 						      true,
2892*10d63b7dSRichard Lowe 						      false,
2893*10d63b7dSRichard Lowe 						      false);
2894*10d63b7dSRichard Lowe 			}
2895*10d63b7dSRichard Lowe 			gather_recursive_deps();
2896*10d63b7dSRichard Lowe 			if (build_failed_seen) {
2897*10d63b7dSRichard Lowe 				build_failed_ever_seen = true;
2898*10d63b7dSRichard Lowe 				warning(gettext("Target `%s' not remade because of errors"),
2899*10d63b7dSRichard Lowe 					default_target_to_build->string_mb);
2900*10d63b7dSRichard Lowe 			}
2901*10d63b7dSRichard Lowe 			build_failed_seen = false;
2902*10d63b7dSRichard Lowe 			if (report_dependencies_level > 0) {
2903*10d63b7dSRichard Lowe 				print_dependencies(default_target_to_build,
2904*10d63b7dSRichard Lowe 						   get_prop(default_target_to_build->prop,
2905*10d63b7dSRichard Lowe 							    line_prop));
2906*10d63b7dSRichard Lowe 			}
2907*10d63b7dSRichard Lowe 			default_target_to_build->stat.time =
2908*10d63b7dSRichard Lowe 			  file_no_time;
2909*10d63b7dSRichard Lowe 			if (default_target_to_build->colon_splits > 0) {
2910*10d63b7dSRichard Lowe 				default_target_to_build->state =
2911*10d63b7dSRichard Lowe 				  build_dont_know;
2912*10d63b7dSRichard Lowe 			}
2913*10d63b7dSRichard Lowe 			if (!parallel &&
2914*10d63b7dSRichard Lowe 			    /* !commands_done && */
2915*10d63b7dSRichard Lowe 			    (result == build_ok) &&
2916*10d63b7dSRichard Lowe 			    !quest &&
2917*10d63b7dSRichard Lowe 			    (report_dependencies_level == 0) /*  &&
2918*10d63b7dSRichard Lowe 			    (exists(default_target_to_build) > file_doesnt_exist)  */) {
2919*10d63b7dSRichard Lowe 				if (posix) {
2920*10d63b7dSRichard Lowe 					if (!commands_done) {
2921*10d63b7dSRichard Lowe 						(void) printf(gettext("`%s' is updated.\n"),
2922*10d63b7dSRichard Lowe 					 		      default_target_to_build->string_mb);
2923*10d63b7dSRichard Lowe 					} else {
2924*10d63b7dSRichard Lowe 						if (no_action_was_taken) {
2925*10d63b7dSRichard Lowe 							(void) printf(gettext("`%s': no action was taken.\n"),
2926*10d63b7dSRichard Lowe 					 			      default_target_to_build->string_mb);
2927*10d63b7dSRichard Lowe 						}
2928*10d63b7dSRichard Lowe 					}
2929*10d63b7dSRichard Lowe 				} else {
2930*10d63b7dSRichard Lowe 					if (!commands_done &&
2931*10d63b7dSRichard Lowe 					    (exists(default_target_to_build) > file_doesnt_exist)) {
2932*10d63b7dSRichard Lowe 						(void) printf(gettext("`%s' is up to date.\n"),
2933*10d63b7dSRichard Lowe 							      default_target_to_build->string_mb);
2934*10d63b7dSRichard Lowe 					}
2935*10d63b7dSRichard Lowe 				}
2936*10d63b7dSRichard Lowe 			}
2937*10d63b7dSRichard Lowe 		}
2938*10d63b7dSRichard Lowe 	}
2939*10d63b7dSRichard Lowe 
2940*10d63b7dSRichard Lowe /*
2941*10d63b7dSRichard Lowe  *	If no file arguments have been encountered,
2942*10d63b7dSRichard Lowe  *	make the first name encountered that doesnt start with a dot
2943*10d63b7dSRichard Lowe  */
2944*10d63b7dSRichard Lowe 	if (!target_to_make_found) {
2945*10d63b7dSRichard Lowe 		if (default_target_to_build == NULL) {
2946*10d63b7dSRichard Lowe 			fatal(gettext("No arguments to build"));
2947*10d63b7dSRichard Lowe 		}
2948*10d63b7dSRichard Lowe 		commands_done = false;
2949*10d63b7dSRichard Lowe 		top_level_target = get_wstring(default_target_to_build->string_mb);
2950*10d63b7dSRichard Lowe 		report_recursion(default_target_to_build);
2951*10d63b7dSRichard Lowe 
2952*10d63b7dSRichard Lowe 
2953*10d63b7dSRichard Lowe 		if (getenv("SPRO_EXPAND_ERRORS")){
2954*10d63b7dSRichard Lowe 			(void) printf("::(%s)\n",
2955*10d63b7dSRichard Lowe 				      default_target_to_build->string_mb);
2956*10d63b7dSRichard Lowe 		}
2957*10d63b7dSRichard Lowe 
2958*10d63b7dSRichard Lowe 
2959*10d63b7dSRichard Lowe 		result = doname_parallel(default_target_to_build, true, false);
2960*10d63b7dSRichard Lowe 		gather_recursive_deps();
2961*10d63b7dSRichard Lowe 		if (build_failed_seen) {
2962*10d63b7dSRichard Lowe 			build_failed_ever_seen = true;
2963*10d63b7dSRichard Lowe 			warning(gettext("Target `%s' not remade because of errors"),
2964*10d63b7dSRichard Lowe 				default_target_to_build->string_mb);
2965*10d63b7dSRichard Lowe 		}
2966*10d63b7dSRichard Lowe 		build_failed_seen = false;
2967*10d63b7dSRichard Lowe 		if (report_dependencies_level > 0) {
2968*10d63b7dSRichard Lowe 			print_dependencies(default_target_to_build,
2969*10d63b7dSRichard Lowe 					   get_prop(default_target_to_build->
2970*10d63b7dSRichard Lowe 						    prop,
2971*10d63b7dSRichard Lowe 						    line_prop));
2972*10d63b7dSRichard Lowe 		}
2973*10d63b7dSRichard Lowe 		default_target_to_build->stat.time = file_no_time;
2974*10d63b7dSRichard Lowe 		if (default_target_to_build->colon_splits > 0) {
2975*10d63b7dSRichard Lowe 			default_target_to_build->state = build_dont_know;
2976*10d63b7dSRichard Lowe 		}
2977*10d63b7dSRichard Lowe 		if (/* !commands_done && */
2978*10d63b7dSRichard Lowe 		    (result == build_ok) &&
2979*10d63b7dSRichard Lowe 		    !quest &&
2980*10d63b7dSRichard Lowe 		    (report_dependencies_level == 0) /*  &&
2981*10d63b7dSRichard Lowe 		    (exists(default_target_to_build) > file_doesnt_exist)  */) {
2982*10d63b7dSRichard Lowe 			if (posix) {
2983*10d63b7dSRichard Lowe 				if (!commands_done) {
2984*10d63b7dSRichard Lowe 					(void) printf(gettext("`%s' is updated.\n"),
2985*10d63b7dSRichard Lowe 				 		      default_target_to_build->string_mb);
2986*10d63b7dSRichard Lowe 				} else {
2987*10d63b7dSRichard Lowe 					if (no_action_was_taken) {
2988*10d63b7dSRichard Lowe 						(void) printf(gettext("`%s': no action was taken.\n"),
2989*10d63b7dSRichard Lowe 							      default_target_to_build->string_mb);
2990*10d63b7dSRichard Lowe 					}
2991*10d63b7dSRichard Lowe 				}
2992*10d63b7dSRichard Lowe 			} else {
2993*10d63b7dSRichard Lowe 				if (!commands_done &&
2994*10d63b7dSRichard Lowe 				    (exists(default_target_to_build) > file_doesnt_exist)) {
2995*10d63b7dSRichard Lowe 					(void) printf(gettext("`%s' is up to date.\n"),
2996*10d63b7dSRichard Lowe 						      default_target_to_build->string_mb);
2997*10d63b7dSRichard Lowe 				}
2998*10d63b7dSRichard Lowe 			}
2999*10d63b7dSRichard Lowe 		}
3000*10d63b7dSRichard Lowe 	}
3001*10d63b7dSRichard Lowe }
3002*10d63b7dSRichard Lowe 
3003*10d63b7dSRichard Lowe /*
3004*10d63b7dSRichard Lowe  *	report_recursion(target)
3005*10d63b7dSRichard Lowe  *
3006*10d63b7dSRichard Lowe  *	If this is a recursive make and the parent make has KEEP_STATE on
3007*10d63b7dSRichard Lowe  *	this routine reports the dependency to the parent make
3008*10d63b7dSRichard Lowe  *
3009*10d63b7dSRichard Lowe  *	Parameters:
3010*10d63b7dSRichard Lowe  *		target		Target to report
3011*10d63b7dSRichard Lowe  *
3012*10d63b7dSRichard Lowe  *	Global variables used:
3013*10d63b7dSRichard Lowe  *		makefiles_used		List of makefiles read
3014*10d63b7dSRichard Lowe  *		recursive_name		The Name ".RECURSIVE", printed
3015*10d63b7dSRichard Lowe  *		report_dependency	dwight
3016*10d63b7dSRichard Lowe  */
3017*10d63b7dSRichard Lowe static void
report_recursion(register Name target)3018*10d63b7dSRichard Lowe report_recursion(register Name target)
3019*10d63b7dSRichard Lowe {
3020*10d63b7dSRichard Lowe 	register FILE		*report_file = get_report_file();
3021*10d63b7dSRichard Lowe 
3022*10d63b7dSRichard Lowe 	if ((report_file == NULL) || (report_file == (FILE*)-1)) {
3023*10d63b7dSRichard Lowe 		return;
3024*10d63b7dSRichard Lowe 	}
3025*10d63b7dSRichard Lowe 	if (primary_makefile == NULL) {
3026*10d63b7dSRichard Lowe 		/*
3027*10d63b7dSRichard Lowe 		 * This can happen when there is no makefile and
3028*10d63b7dSRichard Lowe 		 * only implicit rules are being used.
3029*10d63b7dSRichard Lowe 		 */
3030*10d63b7dSRichard Lowe 		return;
3031*10d63b7dSRichard Lowe 	}
3032*10d63b7dSRichard Lowe 	(void) fprintf(report_file,
3033*10d63b7dSRichard Lowe 		       "%s: %s ",
3034*10d63b7dSRichard Lowe 		       get_target_being_reported_for(),
3035*10d63b7dSRichard Lowe 		       recursive_name->string_mb);
3036*10d63b7dSRichard Lowe 	report_dependency(get_current_path());
3037*10d63b7dSRichard Lowe 	report_dependency(target->string_mb);
3038*10d63b7dSRichard Lowe 	report_dependency(primary_makefile->string_mb);
3039*10d63b7dSRichard Lowe 	(void) fprintf(report_file, "\n");
3040*10d63b7dSRichard Lowe }
3041*10d63b7dSRichard Lowe 
3042*10d63b7dSRichard Lowe /* Next function "append_or_replace_macro_in_dyn_array" must be in "misc.cc". */
3043*10d63b7dSRichard Lowe /* NIKMOL */
3044*10d63b7dSRichard Lowe extern void
append_or_replace_macro_in_dyn_array(ASCII_Dyn_Array * Ar,char * macro)3045*10d63b7dSRichard Lowe append_or_replace_macro_in_dyn_array(ASCII_Dyn_Array *Ar, char *macro)
3046*10d63b7dSRichard Lowe {
3047*10d63b7dSRichard Lowe 	register char	*cp0;	/* work pointer in macro */
3048*10d63b7dSRichard Lowe 	register char	*cp1;	/* work pointer in array */
3049*10d63b7dSRichard Lowe 	register char	*cp2;	/* work pointer in array */
3050*10d63b7dSRichard Lowe 	register char	*cp3;	/* work pointer in array */
3051*10d63b7dSRichard Lowe 	register char	*name;	/* macro name */
3052*10d63b7dSRichard Lowe 	register char	*value;	/* macro value */
3053*10d63b7dSRichard Lowe 	register int 	len_array;
3054*10d63b7dSRichard Lowe 	register int 	len_macro;
3055*10d63b7dSRichard Lowe 
3056*10d63b7dSRichard Lowe 	char * esc_value = NULL;
3057*10d63b7dSRichard Lowe 	int esc_len;
3058*10d63b7dSRichard Lowe 
3059*10d63b7dSRichard Lowe 	if (!(len_macro = strlen(macro))) return;
3060*10d63b7dSRichard Lowe 	name = macro;
3061*10d63b7dSRichard Lowe 	while (isspace(*(name))) {
3062*10d63b7dSRichard Lowe 		name++;
3063*10d63b7dSRichard Lowe 	}
3064*10d63b7dSRichard Lowe 	if (!(value = strchr(name, (int) equal_char))) {
3065*10d63b7dSRichard Lowe 		/* no '=' in macro */
3066*10d63b7dSRichard Lowe 		goto ERROR_MACRO;
3067*10d63b7dSRichard Lowe 	}
3068*10d63b7dSRichard Lowe 	cp0 = value;
3069*10d63b7dSRichard Lowe 	value++;
3070*10d63b7dSRichard Lowe 	while (isspace(*(value))) {
3071*10d63b7dSRichard Lowe 		value++;
3072*10d63b7dSRichard Lowe 	}
3073*10d63b7dSRichard Lowe 	while (isspace(*(cp0-1))) {
3074*10d63b7dSRichard Lowe 		cp0--;
3075*10d63b7dSRichard Lowe 	}
3076*10d63b7dSRichard Lowe 	if (cp0 <= name) goto ERROR_MACRO; /* no name */
3077*10d63b7dSRichard Lowe 	if (!(Ar->size)) goto ALLOC_ARRAY;
3078*10d63b7dSRichard Lowe 	cp1 = Ar->start;
3079*10d63b7dSRichard Lowe 
3080*10d63b7dSRichard Lowe LOOK_FOR_NAME:
3081*10d63b7dSRichard Lowe 	if (!(cp1 = strchr(cp1, name[0]))) goto APPEND_MACRO;
3082*10d63b7dSRichard Lowe 	if (!(cp2 = strchr(cp1, (int) equal_char))) goto APPEND_MACRO;
3083*10d63b7dSRichard Lowe 	if (strncmp(cp1, name, (size_t)(cp0-name))) {
3084*10d63b7dSRichard Lowe 		/* another name */
3085*10d63b7dSRichard Lowe 		cp1++;
3086*10d63b7dSRichard Lowe 		goto LOOK_FOR_NAME;
3087*10d63b7dSRichard Lowe 	}
3088*10d63b7dSRichard Lowe 	if (cp1 != Ar->start) {
3089*10d63b7dSRichard Lowe 		if (!isspace(*(cp1-1))) {
3090*10d63b7dSRichard Lowe 			/* another name */
3091*10d63b7dSRichard Lowe 			cp1++;
3092*10d63b7dSRichard Lowe 			goto LOOK_FOR_NAME;
3093*10d63b7dSRichard Lowe 		}
3094*10d63b7dSRichard Lowe 	}
3095*10d63b7dSRichard Lowe 	for (cp3 = cp1 + (cp0-name); cp3 < cp2; cp3++) {
3096*10d63b7dSRichard Lowe 		if (isspace(*cp3)) continue;
3097*10d63b7dSRichard Lowe 		/* else: another name */
3098*10d63b7dSRichard Lowe 		cp1++;
3099*10d63b7dSRichard Lowe 		goto LOOK_FOR_NAME;
3100*10d63b7dSRichard Lowe 	}
3101*10d63b7dSRichard Lowe 	/* Look for the next macro name in array */
3102*10d63b7dSRichard Lowe 	cp3 = cp2+1;
3103*10d63b7dSRichard Lowe 	if (*cp3 != (int) doublequote_char) {
3104*10d63b7dSRichard Lowe 		/* internal error */
3105*10d63b7dSRichard Lowe 		goto ERROR_MACRO;
3106*10d63b7dSRichard Lowe 	}
3107*10d63b7dSRichard Lowe 	if (!(cp3 = strchr(cp3+1, (int) doublequote_char))) {
3108*10d63b7dSRichard Lowe 		/* internal error */
3109*10d63b7dSRichard Lowe 		goto ERROR_MACRO;
3110*10d63b7dSRichard Lowe 	}
3111*10d63b7dSRichard Lowe 	cp3++;
3112*10d63b7dSRichard Lowe 	while (isspace(*cp3)) {
3113*10d63b7dSRichard Lowe 		cp3++;
3114*10d63b7dSRichard Lowe 	}
3115*10d63b7dSRichard Lowe 
3116*10d63b7dSRichard Lowe 	cp2 = cp1;  /* remove old macro */
3117*10d63b7dSRichard Lowe 	if ((*cp3) && (cp3 < Ar->start + Ar->size)) {
3118*10d63b7dSRichard Lowe 		for (; cp3 < Ar->start + Ar->size; cp3++) {
3119*10d63b7dSRichard Lowe 			*cp2++ = *cp3;
3120*10d63b7dSRichard Lowe 		}
3121*10d63b7dSRichard Lowe 	}
3122*10d63b7dSRichard Lowe 	for (; cp2 < Ar->start + Ar->size; cp2++) {
3123*10d63b7dSRichard Lowe 		*cp2 = 0;
3124*10d63b7dSRichard Lowe 	}
3125*10d63b7dSRichard Lowe 	if (*cp1) {
3126*10d63b7dSRichard Lowe 		/* check next name */
3127*10d63b7dSRichard Lowe 		goto LOOK_FOR_NAME;
3128*10d63b7dSRichard Lowe 	}
3129*10d63b7dSRichard Lowe 	goto APPEND_MACRO;
3130*10d63b7dSRichard Lowe 
3131*10d63b7dSRichard Lowe ALLOC_ARRAY:
3132*10d63b7dSRichard Lowe 	if (Ar->size) {
3133*10d63b7dSRichard Lowe 		cp1 = Ar->start;
3134*10d63b7dSRichard Lowe 	} else {
3135*10d63b7dSRichard Lowe 		cp1 = 0;
3136*10d63b7dSRichard Lowe 	}
3137*10d63b7dSRichard Lowe 	Ar->size += 128;
3138*10d63b7dSRichard Lowe 	Ar->start = getmem(Ar->size);
3139*10d63b7dSRichard Lowe 	for (len_array=0; len_array < Ar->size; len_array++) {
3140*10d63b7dSRichard Lowe 		Ar->start[len_array] = 0;
3141*10d63b7dSRichard Lowe 	}
3142*10d63b7dSRichard Lowe 	if (cp1) {
3143*10d63b7dSRichard Lowe 		strcpy(Ar->start, cp1);
3144*10d63b7dSRichard Lowe 		retmem((wchar_t *) cp1);
3145*10d63b7dSRichard Lowe 	}
3146*10d63b7dSRichard Lowe 
3147*10d63b7dSRichard Lowe APPEND_MACRO:
3148*10d63b7dSRichard Lowe 	len_array = strlen(Ar->start);
3149*10d63b7dSRichard Lowe 	esc_value = (char*)malloc(strlen(value)*2 + 1);
3150*10d63b7dSRichard Lowe 	quote_str(value, esc_value);
3151*10d63b7dSRichard Lowe 	esc_len = strlen(esc_value) - strlen(value);
3152*10d63b7dSRichard Lowe 	if (len_array + len_macro + esc_len + 5 >= Ar->size) goto  ALLOC_ARRAY;
3153*10d63b7dSRichard Lowe 	strcat(Ar->start, " ");
3154*10d63b7dSRichard Lowe 	strncat(Ar->start, name, cp0-name);
3155*10d63b7dSRichard Lowe 	strcat(Ar->start, "=");
3156*10d63b7dSRichard Lowe 	strncat(Ar->start, esc_value, strlen(esc_value));
3157*10d63b7dSRichard Lowe 	free(esc_value);
3158*10d63b7dSRichard Lowe 	return;
3159*10d63b7dSRichard Lowe ERROR_MACRO:
3160*10d63b7dSRichard Lowe 	/* Macro without '=' or with invalid left/right part */
3161*10d63b7dSRichard Lowe 	return;
3162*10d63b7dSRichard Lowe }
3163*10d63b7dSRichard Lowe 
3164*10d63b7dSRichard Lowe static void
report_dir_enter_leave(Boolean entering)3165*10d63b7dSRichard Lowe report_dir_enter_leave(Boolean entering)
3166*10d63b7dSRichard Lowe {
3167*10d63b7dSRichard Lowe 	char	rcwd[MAXPATHLEN];
3168*10d63b7dSRichard Lowe static	char *	mlev = NULL;
3169*10d63b7dSRichard Lowe 	char *	make_level_str = NULL;
3170*10d63b7dSRichard Lowe 	int	make_level_val = 0;
3171*10d63b7dSRichard Lowe 
3172*10d63b7dSRichard Lowe 	make_level_str = getenv("MAKELEVEL");
3173*10d63b7dSRichard Lowe 	if(make_level_str) {
3174*10d63b7dSRichard Lowe 		make_level_val = atoi(make_level_str);
3175*10d63b7dSRichard Lowe 	}
3176*10d63b7dSRichard Lowe 	if(mlev == NULL) {
3177*10d63b7dSRichard Lowe 		mlev = (char*) malloc(MAXPATHLEN);
3178*10d63b7dSRichard Lowe 	}
3179*10d63b7dSRichard Lowe 	if(entering) {
3180*10d63b7dSRichard Lowe 		sprintf(mlev, "MAKELEVEL=%d", make_level_val + 1);
3181*10d63b7dSRichard Lowe 	} else {
3182*10d63b7dSRichard Lowe 		make_level_val--;
3183*10d63b7dSRichard Lowe 		sprintf(mlev, "MAKELEVEL=%d", make_level_val);
3184*10d63b7dSRichard Lowe 	}
3185*10d63b7dSRichard Lowe 	putenv(mlev);
3186*10d63b7dSRichard Lowe 
3187*10d63b7dSRichard Lowe 	if(report_cwd) {
3188*10d63b7dSRichard Lowe 		if(make_level_val <= 0) {
3189*10d63b7dSRichard Lowe 			if(entering) {
3190*10d63b7dSRichard Lowe 				sprintf(rcwd,
3191*10d63b7dSRichard Lowe 				    gettext("%s: Entering directory `%s'\n"),
3192*10d63b7dSRichard Lowe 				    getprogname(),
3193*10d63b7dSRichard Lowe 				    get_current_path());
3194*10d63b7dSRichard Lowe 			} else {
3195*10d63b7dSRichard Lowe 				sprintf(rcwd,
3196*10d63b7dSRichard Lowe 				    gettext("%s: Leaving directory `%s'\n"),
3197*10d63b7dSRichard Lowe 				    getprogname(),
3198*10d63b7dSRichard Lowe 				    get_current_path());
3199*10d63b7dSRichard Lowe 			}
3200*10d63b7dSRichard Lowe 		} else {
3201*10d63b7dSRichard Lowe 			if(entering) {
3202*10d63b7dSRichard Lowe 				sprintf(rcwd,
3203*10d63b7dSRichard Lowe 				    gettext("%s[%d]: Entering directory `%s'\n"),
3204*10d63b7dSRichard Lowe 				    getprogname(),
3205*10d63b7dSRichard Lowe 				    make_level_val, get_current_path());
3206*10d63b7dSRichard Lowe 			} else {
3207*10d63b7dSRichard Lowe 				sprintf(rcwd,
3208*10d63b7dSRichard Lowe 				    gettext("%s[%d]: Leaving directory `%s'\n"),
3209*10d63b7dSRichard Lowe 				    getprogname(),
3210*10d63b7dSRichard Lowe 				    make_level_val, get_current_path());
3211*10d63b7dSRichard Lowe 			}
3212*10d63b7dSRichard Lowe 		}
3213*10d63b7dSRichard Lowe 		printf("%s", rcwd);
3214*10d63b7dSRichard Lowe 	}
3215*10d63b7dSRichard Lowe }
3216