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 = ¬_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 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 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 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 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 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 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 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 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 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 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 * 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 * 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 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 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 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 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 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 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 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 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 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 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