xref: /titanic_44/usr/src/cmd/make/bin/rep.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 2003 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  *	rep.c
28*10d63b7dSRichard Lowe  *
29*10d63b7dSRichard Lowe  *	This file handles the .nse_depinfo file
30*10d63b7dSRichard Lowe  */
31*10d63b7dSRichard Lowe 
32*10d63b7dSRichard Lowe /*
33*10d63b7dSRichard Lowe  * Included files
34*10d63b7dSRichard Lowe  */
35*10d63b7dSRichard Lowe #include <mk/defs.h>
36*10d63b7dSRichard Lowe #include <mksh/misc.h>		/* retmem() */
37*10d63b7dSRichard Lowe #include <vroot/report.h>	/* NSE_DEPINFO */
38*10d63b7dSRichard Lowe 
39*10d63b7dSRichard Lowe /*
40*10d63b7dSRichard Lowe  * Static variables
41*10d63b7dSRichard Lowe  */
42*10d63b7dSRichard Lowe static	Recursive_make	recursive_list;
43*10d63b7dSRichard Lowe static	Recursive_make	*bpatch = &recursive_list;
44*10d63b7dSRichard Lowe static	Boolean		changed;
45*10d63b7dSRichard Lowe 
46*10d63b7dSRichard Lowe /*
47*10d63b7dSRichard Lowe  * File table of contents
48*10d63b7dSRichard Lowe  */
49*10d63b7dSRichard Lowe 
50*10d63b7dSRichard Lowe 
51*10d63b7dSRichard Lowe /*
52*10d63b7dSRichard Lowe  *	report_recursive_init()
53*10d63b7dSRichard Lowe  *
54*10d63b7dSRichard Lowe  *	Read the .nse_depinfo file and make a list of all the
55*10d63b7dSRichard Lowe  *	.RECURSIVE entries.
56*10d63b7dSRichard Lowe  *
57*10d63b7dSRichard Lowe  *	Parameters:
58*10d63b7dSRichard Lowe  *
59*10d63b7dSRichard Lowe  *	Static variables used:
60*10d63b7dSRichard Lowe  *		bpatch		Points to slot where next cell should be added
61*10d63b7dSRichard Lowe  *
62*10d63b7dSRichard Lowe  *	Global variables used:
63*10d63b7dSRichard Lowe  *		recursive_name	The Name ".RECURSIVE", compared against
64*10d63b7dSRichard Lowe  */
65*10d63b7dSRichard Lowe 
66*10d63b7dSRichard Lowe void
report_recursive_init(void)67*10d63b7dSRichard Lowe report_recursive_init(void)
68*10d63b7dSRichard Lowe {
69*10d63b7dSRichard Lowe 	char		*search_dir;
70*10d63b7dSRichard Lowe 	char		nse_depinfo[MAXPATHLEN];
71*10d63b7dSRichard Lowe 	FILE		*fp;
72*10d63b7dSRichard Lowe 	int		line_size, line_index;
73*10d63b7dSRichard Lowe 	wchar_t		*line;
74*10d63b7dSRichard Lowe 	wchar_t		*bigger_line;
75*10d63b7dSRichard Lowe 	wchar_t		*colon;
76*10d63b7dSRichard Lowe 	wchar_t		*dollar;
77*10d63b7dSRichard Lowe 	Recursive_make	rp;
78*10d63b7dSRichard Lowe 
79*10d63b7dSRichard Lowe 	/*
80*10d63b7dSRichard Lowe 	 * This routine can be called more than once,  don't do
81*10d63b7dSRichard Lowe 	 * anything after the first time.
82*10d63b7dSRichard Lowe 	 */
83*10d63b7dSRichard Lowe 	if (depinfo_already_read) {
84*10d63b7dSRichard Lowe 		return;
85*10d63b7dSRichard Lowe 	} else {
86*10d63b7dSRichard Lowe 		depinfo_already_read = true;
87*10d63b7dSRichard Lowe 	}
88*10d63b7dSRichard Lowe 
89*10d63b7dSRichard Lowe 	search_dir = getenv("NSE_DEP");
90*10d63b7dSRichard Lowe 	if (search_dir == NULL) {
91*10d63b7dSRichard Lowe 		return;
92*10d63b7dSRichard Lowe 	}
93*10d63b7dSRichard Lowe 	(void) sprintf(nse_depinfo, "%s/%s", search_dir, NSE_DEPINFO);
94*10d63b7dSRichard Lowe 	fp = fopen(nse_depinfo, "r");
95*10d63b7dSRichard Lowe 	if (fp == NULL) {
96*10d63b7dSRichard Lowe 		return;
97*10d63b7dSRichard Lowe 	}
98*10d63b7dSRichard Lowe 	line_size = MAXPATHLEN;
99*10d63b7dSRichard Lowe 	line_index = line_size - 1;
100*10d63b7dSRichard Lowe 	line = ALLOC_WC(line_size);
101*10d63b7dSRichard Lowe 	Wstring rns(recursive_name);
102*10d63b7dSRichard Lowe 	wchar_t * wcb = rns.get_string();
103*10d63b7dSRichard Lowe 	while (fgetws(line, line_size, fp) != NULL) {
104*10d63b7dSRichard Lowe 		while (wcslen(line) == line_index) {
105*10d63b7dSRichard Lowe 			if (line[wcslen(line) - 1] == '\n') {
106*10d63b7dSRichard Lowe 				continue;
107*10d63b7dSRichard Lowe 			}
108*10d63b7dSRichard Lowe 			bigger_line = ALLOC_WC(2 * line_size);
109*10d63b7dSRichard Lowe 			wcscpy(bigger_line, line);
110*10d63b7dSRichard Lowe 			retmem(line);
111*10d63b7dSRichard Lowe 			line = bigger_line;
112*10d63b7dSRichard Lowe 			if (fgetws(&line[line_index], line_size, fp) == NULL)
113*10d63b7dSRichard Lowe 				continue;
114*10d63b7dSRichard Lowe 			line_index = 2 * line_index;
115*10d63b7dSRichard Lowe 			line_size = 2 * line_size;
116*10d63b7dSRichard Lowe 		}
117*10d63b7dSRichard Lowe 
118*10d63b7dSRichard Lowe 		colon = (wchar_t *) wcschr(line, (int) colon_char);
119*10d63b7dSRichard Lowe 		if (colon == NULL) {
120*10d63b7dSRichard Lowe 			continue;
121*10d63b7dSRichard Lowe 		}
122*10d63b7dSRichard Lowe 		dollar = (wchar_t *) wcschr(line, (int) dollar_char);
123*10d63b7dSRichard Lowe 		line[wcslen(line) - 1] = (int) nul_char;
124*10d63b7dSRichard Lowe 		if (IS_WEQUALN(&colon[2], wcb,
125*10d63b7dSRichard Lowe 	            (int) recursive_name->hash.length)) {
126*10d63b7dSRichard Lowe 			/*
127*10d63b7dSRichard Lowe 			 * If this entry is an old entry, ignore it
128*10d63b7dSRichard Lowe 			 */
129*10d63b7dSRichard Lowe 			MBSTOWCS(wcs_buffer, DEPINFO_FMT_VERSION);
130*10d63b7dSRichard Lowe 			if (dollar == NULL ||
131*10d63b7dSRichard Lowe 			    !IS_WEQUALN(wcs_buffer, (dollar+1) - VER_LEN, VER_LEN)){
132*10d63b7dSRichard Lowe 				continue;
133*10d63b7dSRichard Lowe 			    }
134*10d63b7dSRichard Lowe 			rp = ALLOC(Recursive_make);
135*10d63b7dSRichard Lowe 			(void) memset((char *) rp, 0, sizeof (Recursive_make_rec));
136*10d63b7dSRichard Lowe 			/*
137*10d63b7dSRichard Lowe 			 * set conditional_macro_string if string is present
138*10d63b7dSRichard Lowe 			 */
139*10d63b7dSRichard Lowe 			rp->oldline = (wchar_t *) wcsdup(line);
140*10d63b7dSRichard Lowe 			if ( dollar != NULL ){
141*10d63b7dSRichard Lowe 				rp->cond_macrostring =
142*10d63b7dSRichard Lowe 				    (wchar_t *) wcsdup(dollar - VER_LEN + 1);
143*10d63b7dSRichard Lowe 			}
144*10d63b7dSRichard Lowe 			/*
145*10d63b7dSRichard Lowe 			 * get target name into recursive struct
146*10d63b7dSRichard Lowe 			 */
147*10d63b7dSRichard Lowe 			*colon = (int) nul_char;
148*10d63b7dSRichard Lowe 			rp->target = (wchar_t *) wcsdup(line);
149*10d63b7dSRichard Lowe 			*bpatch = rp;
150*10d63b7dSRichard Lowe 			bpatch = &rp->next;
151*10d63b7dSRichard Lowe 		}
152*10d63b7dSRichard Lowe 	}
153*10d63b7dSRichard Lowe 	(void) fclose(fp);
154*10d63b7dSRichard Lowe }
155*10d63b7dSRichard Lowe 
156*10d63b7dSRichard Lowe /*
157*10d63b7dSRichard Lowe  *	report_recursive_dep(target, line)
158*10d63b7dSRichard Lowe  *
159*10d63b7dSRichard Lowe  *	Report a target as recursive.
160*10d63b7dSRichard Lowe  *
161*10d63b7dSRichard Lowe  *	Parameters:
162*10d63b7dSRichard Lowe  *		line		Dependency line reported
163*10d63b7dSRichard Lowe  *
164*10d63b7dSRichard Lowe  *	Static variables used:
165*10d63b7dSRichard Lowe  *		bpatch		Points to slot where next cell should be added
166*10d63b7dSRichard Lowe  *		changed		Written if report set changed
167*10d63b7dSRichard Lowe  */
168*10d63b7dSRichard Lowe void
report_recursive_dep(Name target,wchar_t * line)169*10d63b7dSRichard Lowe report_recursive_dep(Name target, wchar_t *line)
170*10d63b7dSRichard Lowe {
171*10d63b7dSRichard Lowe 	Recursive_make	rp;
172*10d63b7dSRichard Lowe 	wchar_t		rec_buf[STRING_BUFFER_LENGTH];
173*10d63b7dSRichard Lowe 	String_rec	string;
174*10d63b7dSRichard Lowe 
175*10d63b7dSRichard Lowe 	INIT_STRING_FROM_STACK(string, rec_buf);
176*10d63b7dSRichard Lowe 	cond_macros_into_string(target, &string);
177*10d63b7dSRichard Lowe 	/*
178*10d63b7dSRichard Lowe 	 * find an applicable recursive entry, if there isn't one, create it
179*10d63b7dSRichard Lowe 	 */
180*10d63b7dSRichard Lowe 	rp = find_recursive_target(target);
181*10d63b7dSRichard Lowe 	if (rp == NULL) {
182*10d63b7dSRichard Lowe 		rp = ALLOC(Recursive_make);
183*10d63b7dSRichard Lowe 		(void) memset((char *) rp, 0, sizeof (Recursive_make_rec));
184*10d63b7dSRichard Lowe 		wchar_t * wcb = get_wstring(target->string_mb); // XXX Tolik: needs retmem
185*10d63b7dSRichard Lowe                 rp->target = wcb;
186*10d63b7dSRichard Lowe 		rp->newline = (wchar_t *) wcsdup(line);
187*10d63b7dSRichard Lowe 		rp->cond_macrostring = (wchar_t *) wcsdup(rec_buf);
188*10d63b7dSRichard Lowe 		*bpatch = rp;
189*10d63b7dSRichard Lowe 		bpatch = &rp->next;
190*10d63b7dSRichard Lowe 		changed = true;
191*10d63b7dSRichard Lowe 	} else {
192*10d63b7dSRichard Lowe 		if ((rp->oldline != NULL) && !IS_WEQUAL(rp->oldline, line)) {
193*10d63b7dSRichard Lowe 			rp->newline = (wchar_t *) wcsdup(line);
194*10d63b7dSRichard Lowe 			changed = true;
195*10d63b7dSRichard Lowe 		}
196*10d63b7dSRichard Lowe 		rp->removed = false;
197*10d63b7dSRichard Lowe 	}
198*10d63b7dSRichard Lowe }
199*10d63b7dSRichard Lowe 
200*10d63b7dSRichard Lowe /*
201*10d63b7dSRichard Lowe  *	find_recursive_target(target)
202*10d63b7dSRichard Lowe  *
203*10d63b7dSRichard Lowe  *	Search the list for a given target.
204*10d63b7dSRichard Lowe  *
205*10d63b7dSRichard Lowe  *	Return value:
206*10d63b7dSRichard Lowe  *				The target cell
207*10d63b7dSRichard Lowe  *
208*10d63b7dSRichard Lowe  *	Parameters:
209*10d63b7dSRichard Lowe  *		target		The target we need
210*10d63b7dSRichard Lowe  *		top_level_target more info used to determinde the
211*10d63b7dSRichard Lowe  *				 target we need
212*10d63b7dSRichard Lowe  *
213*10d63b7dSRichard Lowe  *	Static variables used:
214*10d63b7dSRichard Lowe  *		recursive_list	The list of targets
215*10d63b7dSRichard Lowe  */
216*10d63b7dSRichard Lowe Recursive_make
find_recursive_target(Name target)217*10d63b7dSRichard Lowe find_recursive_target(Name target)
218*10d63b7dSRichard Lowe {
219*10d63b7dSRichard Lowe 	Recursive_make	rp;
220*10d63b7dSRichard Lowe 	String_rec	string;
221*10d63b7dSRichard Lowe 	wchar_t		rec_buf[STRING_BUFFER_LENGTH];
222*10d63b7dSRichard Lowe 
223*10d63b7dSRichard Lowe 	INIT_STRING_FROM_STACK(string, rec_buf);
224*10d63b7dSRichard Lowe 	cond_macros_into_string(target, &string);
225*10d63b7dSRichard Lowe 
226*10d63b7dSRichard Lowe 	Wstring tstr(target);
227*10d63b7dSRichard Lowe 	wchar_t * wcb = tstr.get_string();
228*10d63b7dSRichard Lowe 	for (rp = recursive_list; rp != NULL; rp = rp->next) {
229*10d63b7dSRichard Lowe 		/*
230*10d63b7dSRichard Lowe 		 * If this entry has already been removed, ignore it.
231*10d63b7dSRichard Lowe 		 */
232*10d63b7dSRichard Lowe 		if (rp->removed)
233*10d63b7dSRichard Lowe 			continue;
234*10d63b7dSRichard Lowe 		/*
235*10d63b7dSRichard Lowe 		 * If this target, and the target on the list are the same
236*10d63b7dSRichard Lowe 		 * and if one of them contains conditional macro info, while
237*10d63b7dSRichard Lowe 		 * the other doesn't,  remove this entry from the list of
238*10d63b7dSRichard Lowe 		 * recursive entries.  This can only happen if the Makefile
239*10d63b7dSRichard Lowe 		 * has changed to no longer contain conditional macros.
240*10d63b7dSRichard Lowe 		 */
241*10d63b7dSRichard Lowe 		if (IS_WEQUAL(rp->target, wcb)) {
242*10d63b7dSRichard Lowe 			if (rp->cond_macrostring[VER_LEN] == '\0' &&
243*10d63b7dSRichard Lowe 			    string.buffer.start[VER_LEN] != '\0'){
244*10d63b7dSRichard Lowe 				rp->removed = true;
245*10d63b7dSRichard Lowe 				continue;
246*10d63b7dSRichard Lowe 			} else if (rp->cond_macrostring[VER_LEN] != '\0' &&
247*10d63b7dSRichard Lowe 			    string.buffer.start[VER_LEN] == '\0'){
248*10d63b7dSRichard Lowe 				rp->removed = true;
249*10d63b7dSRichard Lowe 				continue;
250*10d63b7dSRichard Lowe 			}
251*10d63b7dSRichard Lowe 		}
252*10d63b7dSRichard Lowe 		/*
253*10d63b7dSRichard Lowe 		 * If this is not a VERS2 entry,  only need to match
254*10d63b7dSRichard Lowe 		 * the target name.  toptarg information from VERS1 entries
255*10d63b7dSRichard Lowe 		 * are ignored.
256*10d63b7dSRichard Lowe 		 */
257*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, DEPINFO_FMT_VERSION);
258*10d63b7dSRichard Lowe 		if (IS_WEQUALN(wcs_buffer, string.buffer.start, VER_LEN)) {
259*10d63b7dSRichard Lowe 			if (IS_WEQUAL(rp->cond_macrostring,
260*10d63b7dSRichard Lowe 			    string.buffer.start) &&
261*10d63b7dSRichard Lowe 			    IS_WEQUAL(rp->target, wcb)) {
262*10d63b7dSRichard Lowe 				return rp;
263*10d63b7dSRichard Lowe 			}
264*10d63b7dSRichard Lowe 		} else {
265*10d63b7dSRichard Lowe 			if (IS_WEQUAL(rp->target, wcb)) {
266*10d63b7dSRichard Lowe 				return rp;
267*10d63b7dSRichard Lowe 			}
268*10d63b7dSRichard Lowe 		}
269*10d63b7dSRichard Lowe 	}
270*10d63b7dSRichard Lowe 	return NULL;
271*10d63b7dSRichard Lowe }
272*10d63b7dSRichard Lowe 
273*10d63b7dSRichard Lowe /*
274*10d63b7dSRichard Lowe  *	remove_recursive_dep(target, top_level_target)
275*10d63b7dSRichard Lowe  *
276*10d63b7dSRichard Lowe  *	Mark a target as no longer recursive.
277*10d63b7dSRichard Lowe  *
278*10d63b7dSRichard Lowe  *	Parameters:
279*10d63b7dSRichard Lowe  *		target		The target we want to remove
280*10d63b7dSRichard Lowe  *		top_level_target target we want to remove must be built from
281*10d63b7dSRichard Lowe  *				 the same top level target
282*10d63b7dSRichard Lowe  *
283*10d63b7dSRichard Lowe  *	Static variables used:
284*10d63b7dSRichard Lowe  *		changed		Written if report set changed
285*10d63b7dSRichard Lowe  */
286*10d63b7dSRichard Lowe void
remove_recursive_dep(Name target)287*10d63b7dSRichard Lowe remove_recursive_dep(Name target)
288*10d63b7dSRichard Lowe {
289*10d63b7dSRichard Lowe 	Recursive_make	rp;
290*10d63b7dSRichard Lowe 
291*10d63b7dSRichard Lowe 	rp = find_recursive_target(target);
292*10d63b7dSRichard Lowe 
293*10d63b7dSRichard Lowe 	if ( rp != NULL ) {
294*10d63b7dSRichard Lowe 		rp->removed = true;
295*10d63b7dSRichard Lowe 		changed = true;
296*10d63b7dSRichard Lowe 		if(rp->target) {
297*10d63b7dSRichard Lowe 			retmem(rp->target);
298*10d63b7dSRichard Lowe 			rp->target = NULL;
299*10d63b7dSRichard Lowe 		}
300*10d63b7dSRichard Lowe 		if(rp->newline) {
301*10d63b7dSRichard Lowe 			retmem(rp->newline);
302*10d63b7dSRichard Lowe 			rp->newline = NULL;
303*10d63b7dSRichard Lowe 		}
304*10d63b7dSRichard Lowe 		if(rp->oldline) {
305*10d63b7dSRichard Lowe 			retmem(rp->oldline);
306*10d63b7dSRichard Lowe 			rp->oldline = NULL;
307*10d63b7dSRichard Lowe 		}
308*10d63b7dSRichard Lowe 		if(rp->cond_macrostring) {
309*10d63b7dSRichard Lowe 			retmem(rp->cond_macrostring);
310*10d63b7dSRichard Lowe 			rp->cond_macrostring = NULL;
311*10d63b7dSRichard Lowe 		}
312*10d63b7dSRichard Lowe 	}
313*10d63b7dSRichard Lowe }
314*10d63b7dSRichard Lowe 
315*10d63b7dSRichard Lowe 
316*10d63b7dSRichard Lowe /* gather_recursive_deps()
317*10d63b7dSRichard Lowe  *
318*10d63b7dSRichard Lowe  *	Create or update list of recursive targets.
319*10d63b7dSRichard Lowe  */
320*10d63b7dSRichard Lowe void
gather_recursive_deps(void)321*10d63b7dSRichard Lowe gather_recursive_deps(void)
322*10d63b7dSRichard Lowe {
323*10d63b7dSRichard Lowe 	Name_set::iterator	np, e;
324*10d63b7dSRichard Lowe 	String_rec		rec;
325*10d63b7dSRichard Lowe 	wchar_t			rec_buf[STRING_BUFFER_LENGTH];
326*10d63b7dSRichard Lowe 	register Property	lines;
327*10d63b7dSRichard Lowe 	Boolean			has_recursive;
328*10d63b7dSRichard Lowe 	Dependency		dp;
329*10d63b7dSRichard Lowe 
330*10d63b7dSRichard Lowe 	report_recursive_init();
331*10d63b7dSRichard Lowe 
332*10d63b7dSRichard Lowe 	/* Go thru all targets and dump recursive dependencies */
333*10d63b7dSRichard Lowe 	for (np = hashtab.begin(), e = hashtab.end(); np != e; np++) {
334*10d63b7dSRichard Lowe 		if (np->has_recursive_dependency){
335*10d63b7dSRichard Lowe 			has_recursive = false;
336*10d63b7dSRichard Lowe 			/*
337*10d63b7dSRichard Lowe 			 * start .RECURSIVE line with target:
338*10d63b7dSRichard Lowe 			 */
339*10d63b7dSRichard Lowe 			INIT_STRING_FROM_STACK(rec, rec_buf);
340*10d63b7dSRichard Lowe 			APPEND_NAME(np, &rec, FIND_LENGTH);
341*10d63b7dSRichard Lowe 			append_char((int) colon_char, &rec);
342*10d63b7dSRichard Lowe 			append_char((int) space_char, &rec);
343*10d63b7dSRichard Lowe 
344*10d63b7dSRichard Lowe 			for (lines = get_prop(np->prop,recursive_prop);
345*10d63b7dSRichard Lowe 			    lines != NULL;
346*10d63b7dSRichard Lowe 			    lines = get_prop(lines->next, recursive_prop)) {
347*10d63b7dSRichard Lowe 				/*
348*10d63b7dSRichard Lowe 				 * if entry is already in depinfo
349*10d63b7dSRichard Lowe 				 * file or entry was not built, ignore it
350*10d63b7dSRichard Lowe 				 */
351*10d63b7dSRichard Lowe 				if (lines->body.recursive.in_depinfo)
352*10d63b7dSRichard Lowe 					continue;
353*10d63b7dSRichard Lowe 				if (!lines->body.recursive.has_built)
354*10d63b7dSRichard Lowe 					continue;
355*10d63b7dSRichard Lowe 				has_recursive = true;
356*10d63b7dSRichard Lowe 				lines->body.recursive.in_depinfo=true;
357*10d63b7dSRichard Lowe 
358*10d63b7dSRichard Lowe 				/*
359*10d63b7dSRichard Lowe 				* Write the remainder of the
360*10d63b7dSRichard Lowe 				* .RECURSIVE line
361*10d63b7dSRichard Lowe 				*/
362*10d63b7dSRichard Lowe 				APPEND_NAME(recursive_name, &rec,
363*10d63b7dSRichard Lowe 				    FIND_LENGTH);
364*10d63b7dSRichard Lowe 				append_char((int) space_char, &rec);
365*10d63b7dSRichard Lowe 				APPEND_NAME(lines->body.recursive.directory,
366*10d63b7dSRichard Lowe 					&rec, FIND_LENGTH);
367*10d63b7dSRichard Lowe 				append_char((int) space_char, &rec);
368*10d63b7dSRichard Lowe 				APPEND_NAME(lines->body.recursive.target,
369*10d63b7dSRichard Lowe 					&rec, FIND_LENGTH);
370*10d63b7dSRichard Lowe 				append_char((int) space_char, &rec);
371*10d63b7dSRichard Lowe 
372*10d63b7dSRichard Lowe 				/* Complete list of makefiles used */
373*10d63b7dSRichard Lowe 				for (dp = lines->body.recursive.makefiles;
374*10d63b7dSRichard Lowe 				    dp != NULL;
375*10d63b7dSRichard Lowe 				    dp = dp->next) {
376*10d63b7dSRichard Lowe 					APPEND_NAME(dp->name, &rec,  FIND_LENGTH);
377*10d63b7dSRichard Lowe 					append_char((int) space_char, &rec);
378*10d63b7dSRichard Lowe 				}
379*10d63b7dSRichard Lowe 			}
380*10d63b7dSRichard Lowe 			/*
381*10d63b7dSRichard Lowe 			 * dump list of conditional targets,
382*10d63b7dSRichard Lowe 			 * and report recursive entry, if needed
383*10d63b7dSRichard Lowe 			 */
384*10d63b7dSRichard Lowe 			cond_macros_into_string(np, &rec);
385*10d63b7dSRichard Lowe 			if (has_recursive){
386*10d63b7dSRichard Lowe 				report_recursive_dep(np, rec.buffer.start);
387*10d63b7dSRichard Lowe 			}
388*10d63b7dSRichard Lowe 
389*10d63b7dSRichard Lowe 		} else if ( np->has_built ) {
390*10d63b7dSRichard Lowe 			remove_recursive_dep(np);
391*10d63b7dSRichard Lowe 		}
392*10d63b7dSRichard Lowe 	}
393*10d63b7dSRichard Lowe }
394*10d63b7dSRichard Lowe 
395