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