1 /* $NetBSD: main.c,v 1.257 2017/02/08 17:47:36 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1988, 1989, 1990, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Adam de Boor. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35 /* 36 * Copyright (c) 1989 by Berkeley Softworks 37 * All rights reserved. 38 * 39 * This code is derived from software contributed to Berkeley by 40 * Adam de Boor. 41 * 42 * Redistribution and use in source and binary forms, with or without 43 * modification, are permitted provided that the following conditions 44 * are met: 45 * 1. Redistributions of source code must retain the above copyright 46 * notice, this list of conditions and the following disclaimer. 47 * 2. Redistributions in binary form must reproduce the above copyright 48 * notice, this list of conditions and the following disclaimer in the 49 * documentation and/or other materials provided with the distribution. 50 * 3. All advertising materials mentioning features or use of this software 51 * must display the following acknowledgement: 52 * This product includes software developed by the University of 53 * California, Berkeley and its contributors. 54 * 4. Neither the name of the University nor the names of its contributors 55 * may be used to endorse or promote products derived from this software 56 * without specific prior written permission. 57 * 58 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 59 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 60 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 61 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 62 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 63 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 64 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 65 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 66 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 67 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 68 * SUCH DAMAGE. 69 */ 70 71 #ifndef MAKE_NATIVE 72 static char rcsid[] = "$NetBSD: main.c,v 1.257 2017/02/08 17:47:36 christos Exp $"; 73 #else 74 #include <sys/cdefs.h> 75 #ifndef lint 76 __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993\ 77 The Regents of the University of California. All rights reserved."); 78 #endif /* not lint */ 79 80 #ifndef lint 81 #if 0 82 static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 3/19/94"; 83 #else 84 __RCSID("$NetBSD: main.c,v 1.257 2017/02/08 17:47:36 christos Exp $"); 85 #endif 86 #endif /* not lint */ 87 #endif 88 89 /*- 90 * main.c -- 91 * The main file for this entire program. Exit routines etc 92 * reside here. 93 * 94 * Utility functions defined in this file: 95 * Main_ParseArgLine Takes a line of arguments, breaks them and 96 * treats them as if they were given when first 97 * invoked. Used by the parse module to implement 98 * the .MFLAGS target. 99 * 100 * Error Print a tagged error message. The global 101 * MAKE variable must have been defined. This 102 * takes a format string and optional arguments 103 * for it. 104 * 105 * Fatal Print an error message and exit. Also takes 106 * a format string and arguments for it. 107 * 108 * Punt Aborts all jobs and exits with a message. Also 109 * takes a format string and arguments for it. 110 * 111 * Finish Finish things up by printing the number of 112 * errors which occurred, as passed to it, and 113 * exiting. 114 */ 115 116 #include <sys/types.h> 117 #include <sys/time.h> 118 #include <sys/param.h> 119 #include <sys/resource.h> 120 #include <sys/stat.h> 121 #ifdef MAKE_NATIVE 122 #include <sys/sysctl.h> 123 #endif 124 #include <sys/utsname.h> 125 #include <sys/wait.h> 126 127 #include <errno.h> 128 #include <signal.h> 129 #include <stdarg.h> 130 #include <stdio.h> 131 #include <stdlib.h> 132 #include <time.h> 133 #include <ctype.h> 134 135 #include "make.h" 136 #include "hash.h" 137 #include "dir.h" 138 #include "job.h" 139 #include "pathnames.h" 140 #include "trace.h" 141 142 #ifdef USE_IOVEC 143 #include <sys/uio.h> 144 #endif 145 146 #ifndef DEFMAXLOCAL 147 #define DEFMAXLOCAL DEFMAXJOBS 148 #endif /* DEFMAXLOCAL */ 149 150 Lst create; /* Targets to be made */ 151 time_t now; /* Time at start of make */ 152 GNode *DEFAULT; /* .DEFAULT node */ 153 Boolean allPrecious; /* .PRECIOUS given on line by itself */ 154 Boolean deleteOnError; /* .DELETE_ON_ERROR: set */ 155 156 static Boolean noBuiltins; /* -r flag */ 157 static Lst makefiles; /* ordered list of makefiles to read */ 158 static Boolean printVars; /* print value of one or more vars */ 159 static Lst variables; /* list of variables to print */ 160 int maxJobs; /* -j argument */ 161 static int maxJobTokens; /* -j argument */ 162 Boolean compatMake; /* -B argument */ 163 int debug; /* -d argument */ 164 Boolean debugVflag; /* -dV */ 165 Boolean noExecute; /* -n flag */ 166 Boolean noRecursiveExecute; /* -N flag */ 167 Boolean keepgoing; /* -k flag */ 168 Boolean queryFlag; /* -q flag */ 169 Boolean touchFlag; /* -t flag */ 170 Boolean enterFlag; /* -w flag */ 171 Boolean enterFlagObj; /* -w and objdir != srcdir */ 172 Boolean ignoreErrors; /* -i flag */ 173 Boolean beSilent; /* -s flag */ 174 Boolean oldVars; /* variable substitution style */ 175 Boolean checkEnvFirst; /* -e flag */ 176 Boolean parseWarnFatal; /* -W flag */ 177 Boolean jobServer; /* -J flag */ 178 static int jp_0 = -1, jp_1 = -1; /* ends of parent job pipe */ 179 Boolean varNoExportEnv; /* -X flag */ 180 Boolean doing_depend; /* Set while reading .depend */ 181 static Boolean jobsRunning; /* TRUE if the jobs might be running */ 182 static const char * tracefile; 183 static void MainParseArgs(int, char **); 184 static int ReadMakefile(const void *, const void *); 185 static void usage(void) MAKE_ATTR_DEAD; 186 187 static Boolean ignorePWD; /* if we use -C, PWD is meaningless */ 188 static char objdir[MAXPATHLEN + 1]; /* where we chdir'ed to */ 189 char curdir[MAXPATHLEN + 1]; /* Startup directory */ 190 char *progname; /* the program name */ 191 char *makeDependfile; 192 pid_t myPid; 193 int makelevel; 194 195 Boolean forceJobs = FALSE; 196 197 extern Lst parseIncPath; 198 199 /* 200 * For compatibility with the POSIX version of MAKEFLAGS that includes 201 * all the options with out -, convert flags to -f -l -a -g -s. 202 */ 203 static char * 204 explode(const char *flags) 205 { 206 size_t len; 207 char *nf, *st; 208 const char *f; 209 210 if (flags == NULL) 211 return NULL; 212 213 for (f = flags; *f; f++) 214 if (!isalpha((unsigned char)*f)) 215 break; 216 217 if (*f) 218 return bmake_strdup(flags); 219 220 len = strlen(flags); 221 st = nf = bmake_malloc(len * 3 + 1); 222 while (*flags) { 223 *nf++ = '-'; 224 *nf++ = *flags++; 225 *nf++ = ' '; 226 } 227 *nf = '\0'; 228 return st; 229 } 230 231 static void 232 parse_debug_options(const char *argvalue) 233 { 234 const char *modules; 235 const char *mode; 236 char *fname; 237 int len; 238 239 for (modules = argvalue; *modules; ++modules) { 240 switch (*modules) { 241 case 'A': 242 debug = ~0; 243 break; 244 case 'a': 245 debug |= DEBUG_ARCH; 246 break; 247 case 'C': 248 debug |= DEBUG_CWD; 249 break; 250 case 'c': 251 debug |= DEBUG_COND; 252 break; 253 case 'd': 254 debug |= DEBUG_DIR; 255 break; 256 case 'e': 257 debug |= DEBUG_ERROR; 258 break; 259 case 'f': 260 debug |= DEBUG_FOR; 261 break; 262 case 'g': 263 if (modules[1] == '1') { 264 debug |= DEBUG_GRAPH1; 265 ++modules; 266 } 267 else if (modules[1] == '2') { 268 debug |= DEBUG_GRAPH2; 269 ++modules; 270 } 271 else if (modules[1] == '3') { 272 debug |= DEBUG_GRAPH3; 273 ++modules; 274 } 275 break; 276 case 'j': 277 debug |= DEBUG_JOB; 278 break; 279 case 'l': 280 debug |= DEBUG_LOUD; 281 break; 282 case 'M': 283 debug |= DEBUG_META; 284 break; 285 case 'm': 286 debug |= DEBUG_MAKE; 287 break; 288 case 'n': 289 debug |= DEBUG_SCRIPT; 290 break; 291 case 'p': 292 debug |= DEBUG_PARSE; 293 break; 294 case 's': 295 debug |= DEBUG_SUFF; 296 break; 297 case 't': 298 debug |= DEBUG_TARG; 299 break; 300 case 'V': 301 debugVflag = TRUE; 302 break; 303 case 'v': 304 debug |= DEBUG_VAR; 305 break; 306 case 'x': 307 debug |= DEBUG_SHELL; 308 break; 309 case 'F': 310 if (debug_file != stdout && debug_file != stderr) 311 fclose(debug_file); 312 if (*++modules == '+') { 313 modules++; 314 mode = "a"; 315 } else 316 mode = "w"; 317 if (strcmp(modules, "stdout") == 0) { 318 debug_file = stdout; 319 goto debug_setbuf; 320 } 321 if (strcmp(modules, "stderr") == 0) { 322 debug_file = stderr; 323 goto debug_setbuf; 324 } 325 len = strlen(modules); 326 fname = malloc(len + 20); 327 memcpy(fname, modules, len + 1); 328 /* Let the filename be modified by the pid */ 329 if (strcmp(fname + len - 3, ".%d") == 0) 330 snprintf(fname + len - 2, 20, "%d", getpid()); 331 debug_file = fopen(fname, mode); 332 if (!debug_file) { 333 fprintf(stderr, "Cannot open debug file %s\n", 334 fname); 335 usage(); 336 } 337 free(fname); 338 goto debug_setbuf; 339 default: 340 (void)fprintf(stderr, 341 "%s: illegal argument to d option -- %c\n", 342 progname, *modules); 343 usage(); 344 } 345 } 346 debug_setbuf: 347 /* 348 * Make the debug_file unbuffered, and make 349 * stdout line buffered (unless debugfile == stdout). 350 */ 351 setvbuf(debug_file, NULL, _IONBF, 0); 352 if (debug_file != stdout) { 353 setvbuf(stdout, NULL, _IOLBF, 0); 354 } 355 } 356 357 /*- 358 * MainParseArgs -- 359 * Parse a given argument vector. Called from main() and from 360 * Main_ParseArgLine() when the .MAKEFLAGS target is used. 361 * 362 * XXX: Deal with command line overriding .MAKEFLAGS in makefile 363 * 364 * Results: 365 * None 366 * 367 * Side Effects: 368 * Various global and local flags will be set depending on the flags 369 * given 370 */ 371 static void 372 MainParseArgs(int argc, char **argv) 373 { 374 char *p; 375 int c = '?'; 376 int arginc; 377 char *argvalue; 378 const char *getopt_def; 379 struct stat sa, sb; 380 char *optscan; 381 Boolean inOption, dashDash = FALSE; 382 char found_path[MAXPATHLEN + 1]; /* for searching for sys.mk */ 383 384 #define OPTFLAGS "BC:D:I:J:NST:V:WXd:ef:ij:km:nqrstw" 385 /* Can't actually use getopt(3) because rescanning is not portable */ 386 387 getopt_def = OPTFLAGS; 388 rearg: 389 inOption = FALSE; 390 optscan = NULL; 391 while(argc > 1) { 392 char *getopt_spec; 393 if(!inOption) 394 optscan = argv[1]; 395 c = *optscan++; 396 arginc = 0; 397 if(inOption) { 398 if(c == '\0') { 399 ++argv; 400 --argc; 401 inOption = FALSE; 402 continue; 403 } 404 } else { 405 if (c != '-' || dashDash) 406 break; 407 inOption = TRUE; 408 c = *optscan++; 409 } 410 /* '-' found at some earlier point */ 411 getopt_spec = strchr(getopt_def, c); 412 if(c != '\0' && getopt_spec != NULL && getopt_spec[1] == ':') { 413 /* -<something> found, and <something> should have an arg */ 414 inOption = FALSE; 415 arginc = 1; 416 argvalue = optscan; 417 if(*argvalue == '\0') { 418 if (argc < 3) 419 goto noarg; 420 argvalue = argv[2]; 421 arginc = 2; 422 } 423 } else { 424 argvalue = NULL; 425 } 426 switch(c) { 427 case '\0': 428 arginc = 1; 429 inOption = FALSE; 430 break; 431 case 'B': 432 compatMake = TRUE; 433 Var_Append(MAKEFLAGS, "-B", VAR_GLOBAL); 434 Var_Set(MAKE_MODE, "compat", VAR_GLOBAL, 0); 435 break; 436 case 'C': 437 if (chdir(argvalue) == -1) { 438 (void)fprintf(stderr, 439 "%s: chdir %s: %s\n", 440 progname, argvalue, 441 strerror(errno)); 442 exit(1); 443 } 444 if (getcwd(curdir, MAXPATHLEN) == NULL) { 445 (void)fprintf(stderr, "%s: %s.\n", progname, strerror(errno)); 446 exit(2); 447 } 448 if (stat(argvalue, &sa) != -1 && 449 stat(curdir, &sb) != -1 && 450 sa.st_ino == sb.st_ino && 451 sa.st_dev == sb.st_dev) 452 strncpy(curdir, argvalue, MAXPATHLEN); 453 ignorePWD = TRUE; 454 break; 455 case 'D': 456 if (argvalue == NULL || argvalue[0] == 0) goto noarg; 457 Var_Set(argvalue, "1", VAR_GLOBAL, 0); 458 Var_Append(MAKEFLAGS, "-D", VAR_GLOBAL); 459 Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL); 460 break; 461 case 'I': 462 if (argvalue == NULL) goto noarg; 463 Parse_AddIncludeDir(argvalue); 464 Var_Append(MAKEFLAGS, "-I", VAR_GLOBAL); 465 Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL); 466 break; 467 case 'J': 468 if (argvalue == NULL) goto noarg; 469 if (sscanf(argvalue, "%d,%d", &jp_0, &jp_1) != 2) { 470 (void)fprintf(stderr, 471 "%s: internal error -- J option malformed (%s)\n", 472 progname, argvalue); 473 usage(); 474 } 475 if ((fcntl(jp_0, F_GETFD, 0) < 0) || 476 (fcntl(jp_1, F_GETFD, 0) < 0)) { 477 #if 0 478 (void)fprintf(stderr, 479 "%s: ###### warning -- J descriptors were closed!\n", 480 progname); 481 exit(2); 482 #endif 483 jp_0 = -1; 484 jp_1 = -1; 485 compatMake = TRUE; 486 } else { 487 Var_Append(MAKEFLAGS, "-J", VAR_GLOBAL); 488 Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL); 489 jobServer = TRUE; 490 } 491 break; 492 case 'N': 493 noExecute = TRUE; 494 noRecursiveExecute = TRUE; 495 Var_Append(MAKEFLAGS, "-N", VAR_GLOBAL); 496 break; 497 case 'S': 498 keepgoing = FALSE; 499 Var_Append(MAKEFLAGS, "-S", VAR_GLOBAL); 500 break; 501 case 'T': 502 if (argvalue == NULL) goto noarg; 503 tracefile = bmake_strdup(argvalue); 504 Var_Append(MAKEFLAGS, "-T", VAR_GLOBAL); 505 Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL); 506 break; 507 case 'V': 508 if (argvalue == NULL) goto noarg; 509 printVars = TRUE; 510 (void)Lst_AtEnd(variables, argvalue); 511 Var_Append(MAKEFLAGS, "-V", VAR_GLOBAL); 512 Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL); 513 break; 514 case 'W': 515 parseWarnFatal = TRUE; 516 break; 517 case 'X': 518 varNoExportEnv = TRUE; 519 Var_Append(MAKEFLAGS, "-X", VAR_GLOBAL); 520 break; 521 case 'd': 522 if (argvalue == NULL) goto noarg; 523 /* If '-d-opts' don't pass to children */ 524 if (argvalue[0] == '-') 525 argvalue++; 526 else { 527 Var_Append(MAKEFLAGS, "-d", VAR_GLOBAL); 528 Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL); 529 } 530 parse_debug_options(argvalue); 531 break; 532 case 'e': 533 checkEnvFirst = TRUE; 534 Var_Append(MAKEFLAGS, "-e", VAR_GLOBAL); 535 break; 536 case 'f': 537 if (argvalue == NULL) goto noarg; 538 (void)Lst_AtEnd(makefiles, argvalue); 539 break; 540 case 'i': 541 ignoreErrors = TRUE; 542 Var_Append(MAKEFLAGS, "-i", VAR_GLOBAL); 543 break; 544 case 'j': 545 if (argvalue == NULL) goto noarg; 546 forceJobs = TRUE; 547 maxJobs = strtol(argvalue, &p, 0); 548 if (*p != '\0' || maxJobs < 1) { 549 (void)fprintf(stderr, "%s: illegal argument to -j -- must be positive integer!\n", 550 progname); 551 exit(1); 552 } 553 Var_Append(MAKEFLAGS, "-j", VAR_GLOBAL); 554 Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL); 555 Var_Set(".MAKE.JOBS", argvalue, VAR_GLOBAL, 0); 556 maxJobTokens = maxJobs; 557 break; 558 case 'k': 559 keepgoing = TRUE; 560 Var_Append(MAKEFLAGS, "-k", VAR_GLOBAL); 561 break; 562 case 'm': 563 if (argvalue == NULL) goto noarg; 564 /* look for magic parent directory search string */ 565 if (strncmp(".../", argvalue, 4) == 0) { 566 if (!Dir_FindHereOrAbove(curdir, argvalue+4, 567 found_path, sizeof(found_path))) 568 break; /* nothing doing */ 569 (void)Dir_AddDir(sysIncPath, found_path); 570 } else { 571 (void)Dir_AddDir(sysIncPath, argvalue); 572 } 573 Var_Append(MAKEFLAGS, "-m", VAR_GLOBAL); 574 Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL); 575 break; 576 case 'n': 577 noExecute = TRUE; 578 Var_Append(MAKEFLAGS, "-n", VAR_GLOBAL); 579 break; 580 case 'q': 581 queryFlag = TRUE; 582 /* Kind of nonsensical, wot? */ 583 Var_Append(MAKEFLAGS, "-q", VAR_GLOBAL); 584 break; 585 case 'r': 586 noBuiltins = TRUE; 587 Var_Append(MAKEFLAGS, "-r", VAR_GLOBAL); 588 break; 589 case 's': 590 beSilent = TRUE; 591 Var_Append(MAKEFLAGS, "-s", VAR_GLOBAL); 592 break; 593 case 't': 594 touchFlag = TRUE; 595 Var_Append(MAKEFLAGS, "-t", VAR_GLOBAL); 596 break; 597 case 'w': 598 enterFlag = TRUE; 599 Var_Append(MAKEFLAGS, "-w", VAR_GLOBAL); 600 break; 601 case '-': 602 dashDash = TRUE; 603 break; 604 default: 605 case '?': 606 usage(); 607 } 608 argv += arginc; 609 argc -= arginc; 610 } 611 612 oldVars = TRUE; 613 614 /* 615 * See if the rest of the arguments are variable assignments and 616 * perform them if so. Else take them to be targets and stuff them 617 * on the end of the "create" list. 618 */ 619 for (; argc > 1; ++argv, --argc) 620 if (Parse_IsVar(argv[1])) { 621 Parse_DoVar(argv[1], VAR_CMD); 622 } else { 623 if (!*argv[1]) 624 Punt("illegal (null) argument."); 625 if (*argv[1] == '-' && !dashDash) 626 goto rearg; 627 (void)Lst_AtEnd(create, bmake_strdup(argv[1])); 628 } 629 630 return; 631 noarg: 632 (void)fprintf(stderr, "%s: option requires an argument -- %c\n", 633 progname, c); 634 usage(); 635 } 636 637 /*- 638 * Main_ParseArgLine -- 639 * Used by the parse module when a .MFLAGS or .MAKEFLAGS target 640 * is encountered and by main() when reading the .MAKEFLAGS envariable. 641 * Takes a line of arguments and breaks it into its 642 * component words and passes those words and the number of them to the 643 * MainParseArgs function. 644 * The line should have all its leading whitespace removed. 645 * 646 * Input: 647 * line Line to fracture 648 * 649 * Results: 650 * None 651 * 652 * Side Effects: 653 * Only those that come from the various arguments. 654 */ 655 void 656 Main_ParseArgLine(const char *line) 657 { 658 char **argv; /* Manufactured argument vector */ 659 int argc; /* Number of arguments in argv */ 660 char *args; /* Space used by the args */ 661 char *buf, *p1; 662 char *argv0 = Var_Value(".MAKE", VAR_GLOBAL, &p1); 663 size_t len; 664 665 if (line == NULL) 666 return; 667 for (; *line == ' '; ++line) 668 continue; 669 if (!*line) 670 return; 671 672 buf = bmake_malloc(len = strlen(line) + strlen(argv0) + 2); 673 (void)snprintf(buf, len, "%s %s", argv0, line); 674 free(p1); 675 676 argv = brk_string(buf, &argc, TRUE, &args); 677 if (argv == NULL) { 678 Error("Unterminated quoted string [%s]", buf); 679 free(buf); 680 return; 681 } 682 free(buf); 683 MainParseArgs(argc, argv); 684 685 free(args); 686 free(argv); 687 } 688 689 Boolean 690 Main_SetObjdir(const char *fmt, ...) 691 { 692 struct stat sb; 693 char *p, *path; 694 char buf[MAXPATHLEN + 1], pbuf[MAXPATHLEN + 1]; 695 Boolean rc = FALSE; 696 va_list ap; 697 698 va_start(ap, fmt); 699 vsnprintf(path = pbuf, MAXPATHLEN, fmt, ap); 700 va_end(ap); 701 702 /* expand variable substitutions */ 703 if (strchr(path, '$') != 0) { 704 snprintf(buf, MAXPATHLEN, "%s", path); 705 path = p = Var_Subst(NULL, buf, VAR_GLOBAL, VARF_WANTRES); 706 } else 707 p = NULL; 708 709 if (path[0] != '/') { 710 snprintf(buf, MAXPATHLEN, "%s/%s", curdir, path); 711 path = buf; 712 } 713 714 /* look for the directory and try to chdir there */ 715 if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)) { 716 if (chdir(path)) { 717 (void)fprintf(stderr, "make warning: %s: %s.\n", 718 path, strerror(errno)); 719 } else { 720 strncpy(objdir, path, MAXPATHLEN); 721 Var_Set(".OBJDIR", objdir, VAR_GLOBAL, 0); 722 setenv("PWD", objdir, 1); 723 Dir_InitDot(); 724 rc = TRUE; 725 if (enterFlag && strcmp(objdir, curdir) != 0) 726 enterFlagObj = TRUE; 727 } 728 } 729 730 free(p); 731 return rc; 732 } 733 734 static Boolean 735 Main_SetVarObjdir(const char *var, const char *suffix) 736 { 737 char *p1, *path; 738 if ((path = Var_Value(var, VAR_CMD, &p1)) == NULL) 739 return FALSE; 740 741 (void)Main_SetObjdir("%s%s", path, suffix); 742 free(p1); 743 return TRUE; 744 } 745 746 /*- 747 * ReadAllMakefiles -- 748 * wrapper around ReadMakefile() to read all. 749 * 750 * Results: 751 * TRUE if ok, FALSE on error 752 */ 753 static int 754 ReadAllMakefiles(const void *p, const void *q) 755 { 756 return (ReadMakefile(p, q) == 0); 757 } 758 759 int 760 str2Lst_Append(Lst lp, char *str, const char *sep) 761 { 762 char *cp; 763 int n; 764 765 if (!sep) 766 sep = " \t"; 767 768 for (n = 0, cp = strtok(str, sep); cp; cp = strtok(NULL, sep)) { 769 (void)Lst_AtEnd(lp, cp); 770 n++; 771 } 772 return (n); 773 } 774 775 #ifdef SIGINFO 776 /*ARGSUSED*/ 777 static void 778 siginfo(int signo MAKE_ATTR_UNUSED) 779 { 780 char dir[MAXPATHLEN]; 781 char str[2 * MAXPATHLEN]; 782 int len; 783 if (getcwd(dir, sizeof(dir)) == NULL) 784 return; 785 len = snprintf(str, sizeof(str), "%s: Working in: %s\n", progname, dir); 786 if (len > 0) 787 (void)write(STDERR_FILENO, str, (size_t)len); 788 } 789 #endif 790 791 /* 792 * Allow makefiles some control over the mode we run in. 793 */ 794 void 795 MakeMode(const char *mode) 796 { 797 char *mp = NULL; 798 799 if (!mode) 800 mode = mp = Var_Subst(NULL, "${" MAKE_MODE ":tl}", 801 VAR_GLOBAL, VARF_WANTRES); 802 803 if (mode && *mode) { 804 if (strstr(mode, "compat")) { 805 compatMake = TRUE; 806 forceJobs = FALSE; 807 } 808 #if USE_META 809 if (strstr(mode, "meta")) 810 meta_mode_init(mode); 811 #endif 812 } 813 814 free(mp); 815 } 816 817 /*- 818 * main -- 819 * The main function, for obvious reasons. Initializes variables 820 * and a few modules, then parses the arguments give it in the 821 * environment and on the command line. Reads the system makefile 822 * followed by either Makefile, makefile or the file given by the 823 * -f argument. Sets the .MAKEFLAGS PMake variable based on all the 824 * flags it has received by then uses either the Make or the Compat 825 * module to create the initial list of targets. 826 * 827 * Results: 828 * If -q was given, exits -1 if anything was out-of-date. Else it exits 829 * 0. 830 * 831 * Side Effects: 832 * The program exits when done. Targets are created. etc. etc. etc. 833 */ 834 int 835 main(int argc, char **argv) 836 { 837 Lst targs; /* target nodes to create -- passed to Make_Init */ 838 Boolean outOfDate = FALSE; /* FALSE if all targets up to date */ 839 struct stat sb, sa; 840 char *p1, *path; 841 char mdpath[MAXPATHLEN]; 842 const char *machine = getenv("MACHINE"); 843 const char *machine_arch = getenv("MACHINE_ARCH"); 844 char *syspath = getenv("MAKESYSPATH"); 845 Lst sysMkPath; /* Path of sys.mk */ 846 char *cp = NULL, *start; 847 /* avoid faults on read-only strings */ 848 static char defsyspath[] = _PATH_DEFSYSPATH; 849 char found_path[MAXPATHLEN + 1]; /* for searching for sys.mk */ 850 struct timeval rightnow; /* to initialize random seed */ 851 struct utsname utsname; 852 853 /* default to writing debug to stderr */ 854 debug_file = stderr; 855 856 #ifdef SIGINFO 857 (void)bmake_signal(SIGINFO, siginfo); 858 #endif 859 /* 860 * Set the seed to produce a different random sequence 861 * on each program execution. 862 */ 863 gettimeofday(&rightnow, NULL); 864 srandom(rightnow.tv_sec + rightnow.tv_usec); 865 866 if ((progname = strrchr(argv[0], '/')) != NULL) 867 progname++; 868 else 869 progname = argv[0]; 870 #if defined(MAKE_NATIVE) || (defined(HAVE_SETRLIMIT) && defined(RLIMIT_NOFILE)) 871 /* 872 * get rid of resource limit on file descriptors 873 */ 874 { 875 struct rlimit rl; 876 if (getrlimit(RLIMIT_NOFILE, &rl) != -1 && 877 rl.rlim_cur != rl.rlim_max) { 878 rl.rlim_cur = rl.rlim_max; 879 (void)setrlimit(RLIMIT_NOFILE, &rl); 880 } 881 } 882 #endif 883 884 if (uname(&utsname) == -1) { 885 (void)fprintf(stderr, "%s: uname failed (%s).\n", progname, 886 strerror(errno)); 887 exit(2); 888 } 889 890 /* 891 * Get the name of this type of MACHINE from utsname 892 * so we can share an executable for similar machines. 893 * (i.e. m68k: amiga hp300, mac68k, sun3, ...) 894 * 895 * Note that both MACHINE and MACHINE_ARCH are decided at 896 * run-time. 897 */ 898 if (!machine) { 899 #ifdef MAKE_NATIVE 900 machine = utsname.machine; 901 #else 902 #ifdef MAKE_MACHINE 903 machine = MAKE_MACHINE; 904 #else 905 machine = "unknown"; 906 #endif 907 #endif 908 } 909 910 if (!machine_arch) { 911 #ifdef MAKE_NATIVE 912 static char machine_arch_buf[sizeof(utsname.machine)]; 913 const int mib[2] = { CTL_HW, HW_MACHINE_ARCH }; 914 size_t len = sizeof(machine_arch_buf); 915 916 if (sysctl(mib, __arraycount(mib), machine_arch_buf, 917 &len, NULL, 0) < 0) { 918 (void)fprintf(stderr, "%s: sysctl failed (%s).\n", progname, 919 strerror(errno)); 920 exit(2); 921 } 922 923 machine_arch = machine_arch_buf; 924 #else 925 #ifndef MACHINE_ARCH 926 #ifdef MAKE_MACHINE_ARCH 927 machine_arch = MAKE_MACHINE_ARCH; 928 #else 929 machine_arch = "unknown"; 930 #endif 931 #else 932 machine_arch = MACHINE_ARCH; 933 #endif 934 #endif 935 } 936 937 myPid = getpid(); /* remember this for vFork() */ 938 939 /* 940 * Just in case MAKEOBJDIR wants us to do something tricky. 941 */ 942 Var_Init(); /* Initialize the lists of variables for 943 * parsing arguments */ 944 Var_Set(".MAKE.OS", utsname.sysname, VAR_GLOBAL, 0); 945 Var_Set("MACHINE", machine, VAR_GLOBAL, 0); 946 Var_Set("MACHINE_ARCH", machine_arch, VAR_GLOBAL, 0); 947 #ifdef MAKE_VERSION 948 Var_Set("MAKE_VERSION", MAKE_VERSION, VAR_GLOBAL, 0); 949 #endif 950 Var_Set(".newline", "\n", VAR_GLOBAL, 0); /* handy for :@ loops */ 951 /* 952 * This is the traditional preference for makefiles. 953 */ 954 #ifndef MAKEFILE_PREFERENCE_LIST 955 # define MAKEFILE_PREFERENCE_LIST "makefile Makefile" 956 #endif 957 Var_Set(MAKEFILE_PREFERENCE, MAKEFILE_PREFERENCE_LIST, 958 VAR_GLOBAL, 0); 959 Var_Set(MAKE_DEPENDFILE, ".depend", VAR_GLOBAL, 0); 960 961 create = Lst_Init(FALSE); 962 makefiles = Lst_Init(FALSE); 963 printVars = FALSE; 964 debugVflag = FALSE; 965 variables = Lst_Init(FALSE); 966 beSilent = FALSE; /* Print commands as executed */ 967 ignoreErrors = FALSE; /* Pay attention to non-zero returns */ 968 noExecute = FALSE; /* Execute all commands */ 969 noRecursiveExecute = FALSE; /* Execute all .MAKE targets */ 970 keepgoing = FALSE; /* Stop on error */ 971 allPrecious = FALSE; /* Remove targets when interrupted */ 972 deleteOnError = FALSE; /* Historical default behavior */ 973 queryFlag = FALSE; /* This is not just a check-run */ 974 noBuiltins = FALSE; /* Read the built-in rules */ 975 touchFlag = FALSE; /* Actually update targets */ 976 debug = 0; /* No debug verbosity, please. */ 977 jobsRunning = FALSE; 978 979 maxJobs = DEFMAXLOCAL; /* Set default local max concurrency */ 980 maxJobTokens = maxJobs; 981 compatMake = FALSE; /* No compat mode */ 982 ignorePWD = FALSE; 983 984 /* 985 * Initialize the parsing, directory and variable modules to prepare 986 * for the reading of inclusion paths and variable settings on the 987 * command line 988 */ 989 990 /* 991 * Initialize various variables. 992 * MAKE also gets this name, for compatibility 993 * .MAKEFLAGS gets set to the empty string just in case. 994 * MFLAGS also gets initialized empty, for compatibility. 995 */ 996 Parse_Init(); 997 if (argv[0][0] == '/' || strchr(argv[0], '/') == NULL) { 998 /* 999 * Leave alone if it is an absolute path, or if it does 1000 * not contain a '/' in which case we need to find it in 1001 * the path, like execvp(3) and the shells do. 1002 */ 1003 p1 = argv[0]; 1004 } else { 1005 /* 1006 * A relative path, canonicalize it. 1007 */ 1008 p1 = cached_realpath(argv[0], mdpath); 1009 if (!p1 || *p1 != '/' || stat(p1, &sb) < 0) { 1010 p1 = argv[0]; /* realpath failed */ 1011 } 1012 } 1013 Var_Set("MAKE", p1, VAR_GLOBAL, 0); 1014 Var_Set(".MAKE", p1, VAR_GLOBAL, 0); 1015 Var_Set(MAKEFLAGS, "", VAR_GLOBAL, 0); 1016 Var_Set(MAKEOVERRIDES, "", VAR_GLOBAL, 0); 1017 Var_Set("MFLAGS", "", VAR_GLOBAL, 0); 1018 Var_Set(".ALLTARGETS", "", VAR_GLOBAL, 0); 1019 /* some makefiles need to know this */ 1020 Var_Set(MAKE_LEVEL ".ENV", MAKE_LEVEL_ENV, VAR_CMD, 0); 1021 1022 /* 1023 * Set some other useful macros 1024 */ 1025 { 1026 char tmp[64], *ep; 1027 1028 makelevel = ((ep = getenv(MAKE_LEVEL_ENV)) && *ep) ? atoi(ep) : 0; 1029 if (makelevel < 0) 1030 makelevel = 0; 1031 snprintf(tmp, sizeof(tmp), "%d", makelevel); 1032 Var_Set(MAKE_LEVEL, tmp, VAR_GLOBAL, 0); 1033 snprintf(tmp, sizeof(tmp), "%u", myPid); 1034 Var_Set(".MAKE.PID", tmp, VAR_GLOBAL, 0); 1035 snprintf(tmp, sizeof(tmp), "%u", getppid()); 1036 Var_Set(".MAKE.PPID", tmp, VAR_GLOBAL, 0); 1037 } 1038 if (makelevel > 0) { 1039 char pn[1024]; 1040 snprintf(pn, sizeof(pn), "%s[%d]", progname, makelevel); 1041 progname = bmake_strdup(pn); 1042 } 1043 1044 #ifdef USE_META 1045 meta_init(); 1046 #endif 1047 Dir_Init(NULL); /* Dir_* safe to call from MainParseArgs */ 1048 1049 /* 1050 * First snag any flags out of the MAKE environment variable. 1051 * (Note this is *not* MAKEFLAGS since /bin/make uses that and it's 1052 * in a different format). 1053 */ 1054 #ifdef POSIX 1055 p1 = explode(getenv("MAKEFLAGS")); 1056 Main_ParseArgLine(p1); 1057 free(p1); 1058 #else 1059 Main_ParseArgLine(getenv("MAKE")); 1060 #endif 1061 1062 /* 1063 * Find where we are (now). 1064 * We take care of PWD for the automounter below... 1065 */ 1066 if (getcwd(curdir, MAXPATHLEN) == NULL) { 1067 (void)fprintf(stderr, "%s: getcwd: %s.\n", 1068 progname, strerror(errno)); 1069 exit(2); 1070 } 1071 1072 MainParseArgs(argc, argv); 1073 1074 if (enterFlag) 1075 printf("%s: Entering directory `%s'\n", progname, curdir); 1076 1077 /* 1078 * Verify that cwd is sane. 1079 */ 1080 if (stat(curdir, &sa) == -1) { 1081 (void)fprintf(stderr, "%s: %s: %s.\n", 1082 progname, curdir, strerror(errno)); 1083 exit(2); 1084 } 1085 1086 /* 1087 * All this code is so that we know where we are when we start up 1088 * on a different machine with pmake. 1089 * Overriding getcwd() with $PWD totally breaks MAKEOBJDIRPREFIX 1090 * since the value of curdir can vary depending on how we got 1091 * here. Ie sitting at a shell prompt (shell that provides $PWD) 1092 * or via subdir.mk in which case its likely a shell which does 1093 * not provide it. 1094 * So, to stop it breaking this case only, we ignore PWD if 1095 * MAKEOBJDIRPREFIX is set or MAKEOBJDIR contains a transform. 1096 */ 1097 #ifndef NO_PWD_OVERRIDE 1098 if (!ignorePWD) { 1099 char *pwd, *ptmp1 = NULL, *ptmp2 = NULL; 1100 1101 if ((pwd = getenv("PWD")) != NULL && 1102 Var_Value("MAKEOBJDIRPREFIX", VAR_CMD, &ptmp1) == NULL) { 1103 const char *makeobjdir = Var_Value("MAKEOBJDIR", 1104 VAR_CMD, &ptmp2); 1105 1106 if (makeobjdir == NULL || !strchr(makeobjdir, '$')) { 1107 if (stat(pwd, &sb) == 0 && 1108 sa.st_ino == sb.st_ino && 1109 sa.st_dev == sb.st_dev) 1110 (void)strncpy(curdir, pwd, MAXPATHLEN); 1111 } 1112 } 1113 free(ptmp1); 1114 free(ptmp2); 1115 } 1116 #endif 1117 Var_Set(".CURDIR", curdir, VAR_GLOBAL, 0); 1118 1119 /* 1120 * Find the .OBJDIR. If MAKEOBJDIRPREFIX, or failing that, 1121 * MAKEOBJDIR is set in the environment, try only that value 1122 * and fall back to .CURDIR if it does not exist. 1123 * 1124 * Otherwise, try _PATH_OBJDIR.MACHINE-MACHINE_ARCH, _PATH_OBJDIR.MACHINE, 1125 * and * finally _PATH_OBJDIRPREFIX`pwd`, in that order. If none 1126 * of these paths exist, just use .CURDIR. 1127 */ 1128 Dir_Init(curdir); 1129 (void)Main_SetObjdir("%s", curdir); 1130 1131 if (!Main_SetVarObjdir("MAKEOBJDIRPREFIX", curdir) && 1132 !Main_SetVarObjdir("MAKEOBJDIR", "") && 1133 !Main_SetObjdir("%s.%s-%s", _PATH_OBJDIR, machine, machine_arch) && 1134 !Main_SetObjdir("%s.%s", _PATH_OBJDIR, machine) && 1135 !Main_SetObjdir("%s", _PATH_OBJDIR)) 1136 (void)Main_SetObjdir("%s%s", _PATH_OBJDIRPREFIX, curdir); 1137 1138 /* 1139 * Initialize archive, target and suffix modules in preparation for 1140 * parsing the makefile(s) 1141 */ 1142 Arch_Init(); 1143 Targ_Init(); 1144 Suff_Init(); 1145 Trace_Init(tracefile); 1146 1147 DEFAULT = NULL; 1148 (void)time(&now); 1149 1150 Trace_Log(MAKESTART, NULL); 1151 1152 /* 1153 * Set up the .TARGETS variable to contain the list of targets to be 1154 * created. If none specified, make the variable empty -- the parser 1155 * will fill the thing in with the default or .MAIN target. 1156 */ 1157 if (!Lst_IsEmpty(create)) { 1158 LstNode ln; 1159 1160 for (ln = Lst_First(create); ln != NULL; 1161 ln = Lst_Succ(ln)) { 1162 char *name = (char *)Lst_Datum(ln); 1163 1164 Var_Append(".TARGETS", name, VAR_GLOBAL); 1165 } 1166 } else 1167 Var_Set(".TARGETS", "", VAR_GLOBAL, 0); 1168 1169 1170 /* 1171 * If no user-supplied system path was given (through the -m option) 1172 * add the directories from the DEFSYSPATH (more than one may be given 1173 * as dir1:...:dirn) to the system include path. 1174 */ 1175 if (syspath == NULL || *syspath == '\0') 1176 syspath = defsyspath; 1177 else 1178 syspath = bmake_strdup(syspath); 1179 1180 for (start = syspath; *start != '\0'; start = cp) { 1181 for (cp = start; *cp != '\0' && *cp != ':'; cp++) 1182 continue; 1183 if (*cp == ':') { 1184 *cp++ = '\0'; 1185 } 1186 /* look for magic parent directory search string */ 1187 if (strncmp(".../", start, 4) != 0) { 1188 (void)Dir_AddDir(defIncPath, start); 1189 } else { 1190 if (Dir_FindHereOrAbove(curdir, start+4, 1191 found_path, sizeof(found_path))) { 1192 (void)Dir_AddDir(defIncPath, found_path); 1193 } 1194 } 1195 } 1196 if (syspath != defsyspath) 1197 free(syspath); 1198 1199 /* 1200 * Read in the built-in rules first, followed by the specified 1201 * makefile, if it was (makefile != NULL), or the default 1202 * makefile and Makefile, in that order, if it wasn't. 1203 */ 1204 if (!noBuiltins) { 1205 LstNode ln; 1206 1207 sysMkPath = Lst_Init(FALSE); 1208 Dir_Expand(_PATH_DEFSYSMK, 1209 Lst_IsEmpty(sysIncPath) ? defIncPath : sysIncPath, 1210 sysMkPath); 1211 if (Lst_IsEmpty(sysMkPath)) 1212 Fatal("%s: no system rules (%s).", progname, 1213 _PATH_DEFSYSMK); 1214 ln = Lst_Find(sysMkPath, NULL, ReadMakefile); 1215 if (ln == NULL) 1216 Fatal("%s: cannot open %s.", progname, 1217 (char *)Lst_Datum(ln)); 1218 } 1219 1220 if (!Lst_IsEmpty(makefiles)) { 1221 LstNode ln; 1222 1223 ln = Lst_Find(makefiles, NULL, ReadAllMakefiles); 1224 if (ln != NULL) 1225 Fatal("%s: cannot open %s.", progname, 1226 (char *)Lst_Datum(ln)); 1227 } else { 1228 p1 = Var_Subst(NULL, "${" MAKEFILE_PREFERENCE "}", 1229 VAR_CMD, VARF_WANTRES); 1230 if (p1) { 1231 (void)str2Lst_Append(makefiles, p1, NULL); 1232 (void)Lst_Find(makefiles, NULL, ReadMakefile); 1233 free(p1); 1234 } 1235 } 1236 1237 /* In particular suppress .depend for '-r -V .OBJDIR -f /dev/null' */ 1238 if (!noBuiltins || !printVars) { 1239 makeDependfile = Var_Subst(NULL, "${.MAKE.DEPENDFILE:T}", 1240 VAR_CMD, VARF_WANTRES); 1241 doing_depend = TRUE; 1242 (void)ReadMakefile(makeDependfile, NULL); 1243 doing_depend = FALSE; 1244 } 1245 1246 if (enterFlagObj) 1247 printf("%s: Entering directory `%s'\n", progname, objdir); 1248 1249 MakeMode(NULL); 1250 1251 Var_Append("MFLAGS", Var_Value(MAKEFLAGS, VAR_GLOBAL, &p1), VAR_GLOBAL); 1252 free(p1); 1253 1254 if (!forceJobs && !compatMake && 1255 Var_Exists(".MAKE.JOBS", VAR_GLOBAL)) { 1256 char *value; 1257 int n; 1258 1259 value = Var_Subst(NULL, "${.MAKE.JOBS}", VAR_GLOBAL, VARF_WANTRES); 1260 n = strtol(value, NULL, 0); 1261 if (n < 1) { 1262 (void)fprintf(stderr, "%s: illegal value for .MAKE.JOBS -- must be positive integer!\n", 1263 progname); 1264 exit(1); 1265 } 1266 if (n != maxJobs) { 1267 Var_Append(MAKEFLAGS, "-j", VAR_GLOBAL); 1268 Var_Append(MAKEFLAGS, value, VAR_GLOBAL); 1269 } 1270 maxJobs = n; 1271 maxJobTokens = maxJobs; 1272 forceJobs = TRUE; 1273 free(value); 1274 } 1275 1276 /* 1277 * Be compatible if user did not specify -j and did not explicitly 1278 * turned compatibility on 1279 */ 1280 if (!compatMake && !forceJobs) { 1281 compatMake = TRUE; 1282 } 1283 1284 if (!compatMake) 1285 Job_ServerStart(maxJobTokens, jp_0, jp_1); 1286 if (DEBUG(JOB)) 1287 fprintf(debug_file, "job_pipe %d %d, maxjobs %d, tokens %d, compat %d\n", 1288 jp_0, jp_1, maxJobs, maxJobTokens, compatMake); 1289 1290 if (!printVars) 1291 Main_ExportMAKEFLAGS(TRUE); /* initial export */ 1292 1293 1294 /* 1295 * For compatibility, look at the directories in the VPATH variable 1296 * and add them to the search path, if the variable is defined. The 1297 * variable's value is in the same format as the PATH envariable, i.e. 1298 * <directory>:<directory>:<directory>... 1299 */ 1300 if (Var_Exists("VPATH", VAR_CMD)) { 1301 char *vpath, savec; 1302 /* 1303 * GCC stores string constants in read-only memory, but 1304 * Var_Subst will want to write this thing, so store it 1305 * in an array 1306 */ 1307 static char VPATH[] = "${VPATH}"; 1308 1309 vpath = Var_Subst(NULL, VPATH, VAR_CMD, VARF_WANTRES); 1310 path = vpath; 1311 do { 1312 /* skip to end of directory */ 1313 for (cp = path; *cp != ':' && *cp != '\0'; cp++) 1314 continue; 1315 /* Save terminator character so know when to stop */ 1316 savec = *cp; 1317 *cp = '\0'; 1318 /* Add directory to search path */ 1319 (void)Dir_AddDir(dirSearchPath, path); 1320 *cp = savec; 1321 path = cp + 1; 1322 } while (savec == ':'); 1323 free(vpath); 1324 } 1325 1326 /* 1327 * Now that all search paths have been read for suffixes et al, it's 1328 * time to add the default search path to their lists... 1329 */ 1330 Suff_DoPaths(); 1331 1332 /* 1333 * Propagate attributes through :: dependency lists. 1334 */ 1335 Targ_Propagate(); 1336 1337 /* print the initial graph, if the user requested it */ 1338 if (DEBUG(GRAPH1)) 1339 Targ_PrintGraph(1); 1340 1341 /* print the values of any variables requested by the user */ 1342 if (printVars) { 1343 LstNode ln; 1344 Boolean expandVars; 1345 1346 if (debugVflag) 1347 expandVars = FALSE; 1348 else 1349 expandVars = getBoolean(".MAKE.EXPAND_VARIABLES", FALSE); 1350 for (ln = Lst_First(variables); ln != NULL; 1351 ln = Lst_Succ(ln)) { 1352 char *var = (char *)Lst_Datum(ln); 1353 char *value; 1354 1355 if (strchr(var, '$')) { 1356 value = p1 = Var_Subst(NULL, var, VAR_GLOBAL, 1357 VARF_WANTRES); 1358 } else if (expandVars) { 1359 char tmp[128]; 1360 1361 if (snprintf(tmp, sizeof(tmp), "${%s}", var) >= (int)(sizeof(tmp))) 1362 Fatal("%s: variable name too big: %s", 1363 progname, var); 1364 value = p1 = Var_Subst(NULL, tmp, VAR_GLOBAL, 1365 VARF_WANTRES); 1366 } else { 1367 value = Var_Value(var, VAR_GLOBAL, &p1); 1368 } 1369 printf("%s\n", value ? value : ""); 1370 free(p1); 1371 } 1372 } else { 1373 /* 1374 * Have now read the entire graph and need to make a list of 1375 * targets to create. If none was given on the command line, 1376 * we consult the parsing module to find the main target(s) 1377 * to create. 1378 */ 1379 if (Lst_IsEmpty(create)) 1380 targs = Parse_MainName(); 1381 else 1382 targs = Targ_FindList(create, TARG_CREATE); 1383 1384 if (!compatMake) { 1385 /* 1386 * Initialize job module before traversing the graph 1387 * now that any .BEGIN and .END targets have been read. 1388 * This is done only if the -q flag wasn't given 1389 * (to prevent the .BEGIN from being executed should 1390 * it exist). 1391 */ 1392 if (!queryFlag) { 1393 Job_Init(); 1394 jobsRunning = TRUE; 1395 } 1396 1397 /* Traverse the graph, checking on all the targets */ 1398 outOfDate = Make_Run(targs); 1399 } else { 1400 /* 1401 * Compat_Init will take care of creating all the 1402 * targets as well as initializing the module. 1403 */ 1404 Compat_Run(targs); 1405 } 1406 } 1407 1408 #ifdef CLEANUP 1409 Lst_Destroy(targs, NULL); 1410 Lst_Destroy(variables, NULL); 1411 Lst_Destroy(makefiles, NULL); 1412 Lst_Destroy(create, (FreeProc *)free); 1413 #endif 1414 1415 /* print the graph now it's been processed if the user requested it */ 1416 if (DEBUG(GRAPH2)) 1417 Targ_PrintGraph(2); 1418 1419 Trace_Log(MAKEEND, 0); 1420 1421 if (enterFlagObj) 1422 printf("%s: Leaving directory `%s'\n", progname, objdir); 1423 if (enterFlag) 1424 printf("%s: Leaving directory `%s'\n", progname, curdir); 1425 1426 #ifdef USE_META 1427 meta_finish(); 1428 #endif 1429 Suff_End(); 1430 Targ_End(); 1431 Arch_End(); 1432 Var_End(); 1433 Parse_End(); 1434 Dir_End(); 1435 Job_End(); 1436 Trace_End(); 1437 1438 return outOfDate ? 1 : 0; 1439 } 1440 1441 /*- 1442 * ReadMakefile -- 1443 * Open and parse the given makefile. 1444 * 1445 * Results: 1446 * 0 if ok. -1 if couldn't open file. 1447 * 1448 * Side Effects: 1449 * lots 1450 */ 1451 static int 1452 ReadMakefile(const void *p, const void *q MAKE_ATTR_UNUSED) 1453 { 1454 const char *fname = p; /* makefile to read */ 1455 int fd; 1456 size_t len = MAXPATHLEN; 1457 char *name, *path = bmake_malloc(len); 1458 1459 if (!strcmp(fname, "-")) { 1460 Parse_File(NULL /*stdin*/, -1); 1461 Var_Set("MAKEFILE", "", VAR_INTERNAL, 0); 1462 } else { 1463 /* if we've chdir'd, rebuild the path name */ 1464 if (strcmp(curdir, objdir) && *fname != '/') { 1465 size_t plen = strlen(curdir) + strlen(fname) + 2; 1466 if (len < plen) 1467 path = bmake_realloc(path, len = 2 * plen); 1468 1469 (void)snprintf(path, len, "%s/%s", curdir, fname); 1470 fd = open(path, O_RDONLY); 1471 if (fd != -1) { 1472 fname = path; 1473 goto found; 1474 } 1475 1476 /* If curdir failed, try objdir (ala .depend) */ 1477 plen = strlen(objdir) + strlen(fname) + 2; 1478 if (len < plen) 1479 path = bmake_realloc(path, len = 2 * plen); 1480 (void)snprintf(path, len, "%s/%s", objdir, fname); 1481 fd = open(path, O_RDONLY); 1482 if (fd != -1) { 1483 fname = path; 1484 goto found; 1485 } 1486 } else { 1487 fd = open(fname, O_RDONLY); 1488 if (fd != -1) 1489 goto found; 1490 } 1491 /* look in -I and system include directories. */ 1492 name = Dir_FindFile(fname, parseIncPath); 1493 if (!name) 1494 name = Dir_FindFile(fname, 1495 Lst_IsEmpty(sysIncPath) ? defIncPath : sysIncPath); 1496 if (!name || (fd = open(name, O_RDONLY)) == -1) { 1497 free(name); 1498 free(path); 1499 return(-1); 1500 } 1501 fname = name; 1502 /* 1503 * set the MAKEFILE variable desired by System V fans -- the 1504 * placement of the setting here means it gets set to the last 1505 * makefile specified, as it is set by SysV make. 1506 */ 1507 found: 1508 if (!doing_depend) 1509 Var_Set("MAKEFILE", fname, VAR_INTERNAL, 0); 1510 Parse_File(fname, fd); 1511 } 1512 free(path); 1513 return(0); 1514 } 1515 1516 1517 1518 /*- 1519 * Cmd_Exec -- 1520 * Execute the command in cmd, and return the output of that command 1521 * in a string. 1522 * 1523 * Results: 1524 * A string containing the output of the command, or the empty string 1525 * If errnum is not NULL, it contains the reason for the command failure 1526 * 1527 * Side Effects: 1528 * The string must be freed by the caller. 1529 */ 1530 char * 1531 Cmd_Exec(const char *cmd, const char **errnum) 1532 { 1533 const char *args[4]; /* Args for invoking the shell */ 1534 int fds[2]; /* Pipe streams */ 1535 int cpid; /* Child PID */ 1536 int pid; /* PID from wait() */ 1537 char *res; /* result */ 1538 int status; /* command exit status */ 1539 Buffer buf; /* buffer to store the result */ 1540 char *cp; 1541 int cc; /* bytes read, or -1 */ 1542 int savederr; /* saved errno */ 1543 1544 1545 *errnum = NULL; 1546 1547 if (!shellName) 1548 Shell_Init(); 1549 /* 1550 * Set up arguments for shell 1551 */ 1552 args[0] = shellName; 1553 args[1] = "-c"; 1554 args[2] = cmd; 1555 args[3] = NULL; 1556 1557 /* 1558 * Open a pipe for fetching its output 1559 */ 1560 if (pipe(fds) == -1) { 1561 *errnum = "Couldn't create pipe for \"%s\""; 1562 goto bad; 1563 } 1564 1565 /* 1566 * Fork 1567 */ 1568 switch (cpid = vFork()) { 1569 case 0: 1570 /* 1571 * Close input side of pipe 1572 */ 1573 (void)close(fds[0]); 1574 1575 /* 1576 * Duplicate the output stream to the shell's output, then 1577 * shut the extra thing down. Note we don't fetch the error 1578 * stream...why not? Why? 1579 */ 1580 (void)dup2(fds[1], 1); 1581 (void)close(fds[1]); 1582 1583 Var_ExportVars(); 1584 1585 (void)execv(shellPath, UNCONST(args)); 1586 _exit(1); 1587 /*NOTREACHED*/ 1588 1589 case -1: 1590 *errnum = "Couldn't exec \"%s\""; 1591 goto bad; 1592 1593 default: 1594 /* 1595 * No need for the writing half 1596 */ 1597 (void)close(fds[1]); 1598 1599 savederr = 0; 1600 Buf_Init(&buf, 0); 1601 1602 do { 1603 char result[BUFSIZ]; 1604 cc = read(fds[0], result, sizeof(result)); 1605 if (cc > 0) 1606 Buf_AddBytes(&buf, cc, result); 1607 } 1608 while (cc > 0 || (cc == -1 && errno == EINTR)); 1609 if (cc == -1) 1610 savederr = errno; 1611 1612 /* 1613 * Close the input side of the pipe. 1614 */ 1615 (void)close(fds[0]); 1616 1617 /* 1618 * Wait for the process to exit. 1619 */ 1620 while(((pid = waitpid(cpid, &status, 0)) != cpid) && (pid >= 0)) { 1621 JobReapChild(pid, status, FALSE); 1622 continue; 1623 } 1624 cc = Buf_Size(&buf); 1625 res = Buf_Destroy(&buf, FALSE); 1626 1627 if (savederr != 0) 1628 *errnum = "Couldn't read shell's output for \"%s\""; 1629 1630 if (WIFSIGNALED(status)) 1631 *errnum = "\"%s\" exited on a signal"; 1632 else if (WEXITSTATUS(status) != 0) 1633 *errnum = "\"%s\" returned non-zero status"; 1634 1635 /* 1636 * Null-terminate the result, convert newlines to spaces and 1637 * install it in the variable. 1638 */ 1639 res[cc] = '\0'; 1640 cp = &res[cc]; 1641 1642 if (cc > 0 && *--cp == '\n') { 1643 /* 1644 * A final newline is just stripped 1645 */ 1646 *cp-- = '\0'; 1647 } 1648 while (cp >= res) { 1649 if (*cp == '\n') { 1650 *cp = ' '; 1651 } 1652 cp--; 1653 } 1654 break; 1655 } 1656 return res; 1657 bad: 1658 res = bmake_malloc(1); 1659 *res = '\0'; 1660 return res; 1661 } 1662 1663 /*- 1664 * Error -- 1665 * Print an error message given its format. 1666 * 1667 * Results: 1668 * None. 1669 * 1670 * Side Effects: 1671 * The message is printed. 1672 */ 1673 /* VARARGS */ 1674 void 1675 Error(const char *fmt, ...) 1676 { 1677 va_list ap; 1678 FILE *err_file; 1679 1680 err_file = debug_file; 1681 if (err_file == stdout) 1682 err_file = stderr; 1683 (void)fflush(stdout); 1684 for (;;) { 1685 va_start(ap, fmt); 1686 fprintf(err_file, "%s: ", progname); 1687 (void)vfprintf(err_file, fmt, ap); 1688 va_end(ap); 1689 (void)fprintf(err_file, "\n"); 1690 (void)fflush(err_file); 1691 if (err_file == stderr) 1692 break; 1693 err_file = stderr; 1694 } 1695 } 1696 1697 /*- 1698 * Fatal -- 1699 * Produce a Fatal error message. If jobs are running, waits for them 1700 * to finish. 1701 * 1702 * Results: 1703 * None 1704 * 1705 * Side Effects: 1706 * The program exits 1707 */ 1708 /* VARARGS */ 1709 void 1710 Fatal(const char *fmt, ...) 1711 { 1712 va_list ap; 1713 1714 va_start(ap, fmt); 1715 if (jobsRunning) 1716 Job_Wait(); 1717 1718 (void)fflush(stdout); 1719 (void)vfprintf(stderr, fmt, ap); 1720 va_end(ap); 1721 (void)fprintf(stderr, "\n"); 1722 (void)fflush(stderr); 1723 1724 PrintOnError(NULL, NULL); 1725 1726 if (DEBUG(GRAPH2) || DEBUG(GRAPH3)) 1727 Targ_PrintGraph(2); 1728 Trace_Log(MAKEERROR, 0); 1729 exit(2); /* Not 1 so -q can distinguish error */ 1730 } 1731 1732 /* 1733 * Punt -- 1734 * Major exception once jobs are being created. Kills all jobs, prints 1735 * a message and exits. 1736 * 1737 * Results: 1738 * None 1739 * 1740 * Side Effects: 1741 * All children are killed indiscriminately and the program Lib_Exits 1742 */ 1743 /* VARARGS */ 1744 void 1745 Punt(const char *fmt, ...) 1746 { 1747 va_list ap; 1748 1749 va_start(ap, fmt); 1750 (void)fflush(stdout); 1751 (void)fprintf(stderr, "%s: ", progname); 1752 (void)vfprintf(stderr, fmt, ap); 1753 va_end(ap); 1754 (void)fprintf(stderr, "\n"); 1755 (void)fflush(stderr); 1756 1757 PrintOnError(NULL, NULL); 1758 1759 DieHorribly(); 1760 } 1761 1762 /*- 1763 * DieHorribly -- 1764 * Exit without giving a message. 1765 * 1766 * Results: 1767 * None 1768 * 1769 * Side Effects: 1770 * A big one... 1771 */ 1772 void 1773 DieHorribly(void) 1774 { 1775 if (jobsRunning) 1776 Job_AbortAll(); 1777 if (DEBUG(GRAPH2)) 1778 Targ_PrintGraph(2); 1779 Trace_Log(MAKEERROR, 0); 1780 exit(2); /* Not 1, so -q can distinguish error */ 1781 } 1782 1783 /* 1784 * Finish -- 1785 * Called when aborting due to errors in child shell to signal 1786 * abnormal exit. 1787 * 1788 * Results: 1789 * None 1790 * 1791 * Side Effects: 1792 * The program exits 1793 */ 1794 void 1795 Finish(int errors) 1796 /* number of errors encountered in Make_Make */ 1797 { 1798 Fatal("%d error%s", errors, errors == 1 ? "" : "s"); 1799 } 1800 1801 /* 1802 * eunlink -- 1803 * Remove a file carefully, avoiding directories. 1804 */ 1805 int 1806 eunlink(const char *file) 1807 { 1808 struct stat st; 1809 1810 if (lstat(file, &st) == -1) 1811 return -1; 1812 1813 if (S_ISDIR(st.st_mode)) { 1814 errno = EISDIR; 1815 return -1; 1816 } 1817 return unlink(file); 1818 } 1819 1820 /* 1821 * execError -- 1822 * Print why exec failed, avoiding stdio. 1823 */ 1824 void 1825 execError(const char *af, const char *av) 1826 { 1827 #ifdef USE_IOVEC 1828 int i = 0; 1829 struct iovec iov[8]; 1830 #define IOADD(s) \ 1831 (void)(iov[i].iov_base = UNCONST(s), \ 1832 iov[i].iov_len = strlen(iov[i].iov_base), \ 1833 i++) 1834 #else 1835 #define IOADD(void)write(2, s, strlen(s)) 1836 #endif 1837 1838 IOADD(progname); 1839 IOADD(": "); 1840 IOADD(af); 1841 IOADD("("); 1842 IOADD(av); 1843 IOADD(") failed ("); 1844 IOADD(strerror(errno)); 1845 IOADD(")\n"); 1846 1847 #ifdef USE_IOVEC 1848 while (writev(2, iov, 8) == -1 && errno == EAGAIN) 1849 continue; 1850 #endif 1851 } 1852 1853 /* 1854 * usage -- 1855 * exit with usage message 1856 */ 1857 static void 1858 usage(void) 1859 { 1860 char *p; 1861 if ((p = strchr(progname, '[')) != NULL) 1862 *p = '\0'; 1863 1864 (void)fprintf(stderr, 1865 "usage: %s [-BeikNnqrstWwX] \n\ 1866 [-C directory] [-D variable] [-d flags] [-f makefile]\n\ 1867 [-I directory] [-J private] [-j max_jobs] [-m directory] [-T file]\n\ 1868 [-V variable] [variable=value] [target ...]\n", progname); 1869 exit(2); 1870 } 1871 1872 1873 /* 1874 * realpath(3) can get expensive, cache results... 1875 */ 1876 char * 1877 cached_realpath(const char *pathname, char *resolved) 1878 { 1879 static GNode *cache; 1880 char *rp, *cp; 1881 1882 if (!pathname || !pathname[0]) 1883 return NULL; 1884 1885 if (!cache) { 1886 cache = Targ_NewGN("Realpath"); 1887 #ifndef DEBUG_REALPATH_CACHE 1888 cache->flags = INTERNAL; 1889 #endif 1890 } 1891 1892 if ((rp = Var_Value(pathname, cache, &cp)) != NULL) { 1893 /* a hit */ 1894 strncpy(resolved, rp, MAXPATHLEN); 1895 resolved[MAXPATHLEN - 1] = '\0'; 1896 } else if ((rp = realpath(pathname, resolved)) != NULL) { 1897 Var_Set(pathname, rp, cache, 0); 1898 } /* else should we negative-cache? */ 1899 1900 free(cp); 1901 return rp ? resolved : NULL; 1902 } 1903 1904 int 1905 PrintAddr(void *a, void *b) 1906 { 1907 printf("%lx ", (unsigned long) a); 1908 return b ? 0 : 0; 1909 } 1910 1911 1912 static int 1913 addErrorCMD(void *cmdp, void *gnp) 1914 { 1915 if (cmdp == NULL) 1916 return 1; /* stop */ 1917 Var_Append(".ERROR_CMD", cmdp, VAR_GLOBAL); 1918 return 0; 1919 } 1920 1921 void 1922 PrintOnError(GNode *gn, const char *s) 1923 { 1924 static GNode *en = NULL; 1925 char tmp[64]; 1926 char *cp; 1927 1928 if (s) 1929 printf("%s", s); 1930 1931 printf("\n%s: stopped in %s\n", progname, curdir); 1932 1933 if (en) 1934 return; /* we've been here! */ 1935 if (gn) { 1936 /* 1937 * We can print this even if there is no .ERROR target. 1938 */ 1939 Var_Set(".ERROR_TARGET", gn->name, VAR_GLOBAL, 0); 1940 Var_Delete(".ERROR_CMD", VAR_GLOBAL); 1941 Lst_ForEach(gn->commands, addErrorCMD, gn); 1942 } 1943 strncpy(tmp, "${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'\n@}", 1944 sizeof(tmp) - 1); 1945 cp = Var_Subst(NULL, tmp, VAR_GLOBAL, VARF_WANTRES); 1946 if (cp) { 1947 if (*cp) 1948 printf("%s", cp); 1949 free(cp); 1950 } 1951 fflush(stdout); 1952 1953 /* 1954 * Finally, see if there is a .ERROR target, and run it if so. 1955 */ 1956 en = Targ_FindNode(".ERROR", TARG_NOCREATE); 1957 if (en) { 1958 en->type |= OP_SPECIAL; 1959 Compat_Make(en, en); 1960 } 1961 } 1962 1963 void 1964 Main_ExportMAKEFLAGS(Boolean first) 1965 { 1966 static int once = 1; 1967 char tmp[64]; 1968 char *s; 1969 1970 if (once != first) 1971 return; 1972 once = 0; 1973 1974 strncpy(tmp, "${.MAKEFLAGS} ${.MAKEOVERRIDES:O:u:@v@$v=${$v:Q}@}", 1975 sizeof(tmp)); 1976 s = Var_Subst(NULL, tmp, VAR_CMD, VARF_WANTRES); 1977 if (s && *s) { 1978 #ifdef POSIX 1979 setenv("MAKEFLAGS", s, 1); 1980 #else 1981 setenv("MAKE", s, 1); 1982 #endif 1983 } 1984 } 1985 1986 char * 1987 getTmpdir(void) 1988 { 1989 static char *tmpdir = NULL; 1990 1991 if (!tmpdir) { 1992 struct stat st; 1993 1994 /* 1995 * Honor $TMPDIR but only if it is valid. 1996 * Ensure it ends with /. 1997 */ 1998 tmpdir = Var_Subst(NULL, "${TMPDIR:tA:U" _PATH_TMP "}/", VAR_GLOBAL, 1999 VARF_WANTRES); 2000 if (stat(tmpdir, &st) < 0 || !S_ISDIR(st.st_mode)) { 2001 free(tmpdir); 2002 tmpdir = bmake_strdup(_PATH_TMP); 2003 } 2004 } 2005 return tmpdir; 2006 } 2007 2008 /* 2009 * Create and open a temp file using "pattern". 2010 * If "fnamep" is provided set it to a copy of the filename created. 2011 * Otherwise unlink the file once open. 2012 */ 2013 int 2014 mkTempFile(const char *pattern, char **fnamep) 2015 { 2016 static char *tmpdir = NULL; 2017 char tfile[MAXPATHLEN]; 2018 int fd; 2019 2020 if (!pattern) 2021 pattern = TMPPAT; 2022 if (!tmpdir) 2023 tmpdir = getTmpdir(); 2024 if (pattern[0] == '/') { 2025 snprintf(tfile, sizeof(tfile), "%s", pattern); 2026 } else { 2027 snprintf(tfile, sizeof(tfile), "%s%s", tmpdir, pattern); 2028 } 2029 if ((fd = mkstemp(tfile)) < 0) 2030 Punt("Could not create temporary file %s: %s", tfile, strerror(errno)); 2031 if (fnamep) { 2032 *fnamep = bmake_strdup(tfile); 2033 } else { 2034 unlink(tfile); /* we just want the descriptor */ 2035 } 2036 return fd; 2037 } 2038 2039 /* 2040 * Convert a string representation of a boolean. 2041 * Anything that looks like "No", "False", "Off", "0" etc, 2042 * is FALSE, otherwise TRUE. 2043 */ 2044 Boolean 2045 s2Boolean(const char *s, Boolean bf) 2046 { 2047 if (s) { 2048 switch(*s) { 2049 case '\0': /* not set - the default wins */ 2050 break; 2051 case '0': 2052 case 'F': 2053 case 'f': 2054 case 'N': 2055 case 'n': 2056 bf = FALSE; 2057 break; 2058 case 'O': 2059 case 'o': 2060 switch (s[1]) { 2061 case 'F': 2062 case 'f': 2063 bf = FALSE; 2064 break; 2065 default: 2066 bf = TRUE; 2067 break; 2068 } 2069 break; 2070 default: 2071 bf = TRUE; 2072 break; 2073 } 2074 } 2075 return (bf); 2076 } 2077 2078 /* 2079 * Return a Boolean based on setting of a knob. 2080 * 2081 * If the knob is not set, the supplied default is the return value. 2082 * If set, anything that looks or smells like "No", "False", "Off", "0" etc, 2083 * is FALSE, otherwise TRUE. 2084 */ 2085 Boolean 2086 getBoolean(const char *name, Boolean bf) 2087 { 2088 char tmp[64]; 2089 char *cp; 2090 2091 if (snprintf(tmp, sizeof(tmp), "${%s:U:tl}", name) < (int)(sizeof(tmp))) { 2092 cp = Var_Subst(NULL, tmp, VAR_GLOBAL, VARF_WANTRES); 2093 2094 if (cp) { 2095 bf = s2Boolean(cp, bf); 2096 free(cp); 2097 } 2098 } 2099 return (bf); 2100 } 2101