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