110d63b7dSRichard Lowe /*
210d63b7dSRichard Lowe * CDDL HEADER START
310d63b7dSRichard Lowe *
410d63b7dSRichard Lowe * The contents of this file are subject to the terms of the
510d63b7dSRichard Lowe * Common Development and Distribution License (the "License").
610d63b7dSRichard Lowe * You may not use this file except in compliance with the License.
710d63b7dSRichard Lowe *
810d63b7dSRichard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910d63b7dSRichard Lowe * or http://www.opensolaris.org/os/licensing.
1010d63b7dSRichard Lowe * See the License for the specific language governing permissions
1110d63b7dSRichard Lowe * and limitations under the License.
1210d63b7dSRichard Lowe *
1310d63b7dSRichard Lowe * When distributing Covered Code, include this CDDL HEADER in each
1410d63b7dSRichard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510d63b7dSRichard Lowe * If applicable, add the following below this CDDL HEADER, with the
1610d63b7dSRichard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
1710d63b7dSRichard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
1810d63b7dSRichard Lowe *
1910d63b7dSRichard Lowe * CDDL HEADER END
2010d63b7dSRichard Lowe */
2110d63b7dSRichard Lowe /*
2210d63b7dSRichard Lowe * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
2310d63b7dSRichard Lowe * Use is subject to license terms.
2436cd0120SRobert Mustacchi *
2536cd0120SRobert Mustacchi * Copyright 2019, Joyent, Inc.
2610d63b7dSRichard Lowe */
2710d63b7dSRichard Lowe
2810d63b7dSRichard Lowe /*
2910d63b7dSRichard Lowe * misc.cc
3010d63b7dSRichard Lowe *
3110d63b7dSRichard Lowe * This file contains various unclassified routines. Some main groups:
3210d63b7dSRichard Lowe * getname
3310d63b7dSRichard Lowe * Memory allocation
3410d63b7dSRichard Lowe * String handling
3510d63b7dSRichard Lowe * Property handling
3610d63b7dSRichard Lowe * Error message handling
3710d63b7dSRichard Lowe * Make internal state dumping
3810d63b7dSRichard Lowe * main routine support
3910d63b7dSRichard Lowe */
4010d63b7dSRichard Lowe
4110d63b7dSRichard Lowe /*
4210d63b7dSRichard Lowe * Included files
4310d63b7dSRichard Lowe */
4410d63b7dSRichard Lowe #include <errno.h>
4510d63b7dSRichard Lowe #include <mk/defs.h>
4610d63b7dSRichard Lowe #include <mksh/macro.h> /* SETVAR() */
4710d63b7dSRichard Lowe #include <mksh/misc.h> /* enable_interrupt() */
4810d63b7dSRichard Lowe #include <stdarg.h> /* va_list, va_start(), va_end() */
4910d63b7dSRichard Lowe #include <vroot/report.h> /* SUNPRO_DEPENDENCIES */
5010d63b7dSRichard Lowe #include <libintl.h>
5110d63b7dSRichard Lowe
5210d63b7dSRichard Lowe extern void job_adjust_fini();
5310d63b7dSRichard Lowe
5410d63b7dSRichard Lowe /*
5510d63b7dSRichard Lowe * Defined macros
5610d63b7dSRichard Lowe */
5710d63b7dSRichard Lowe
5810d63b7dSRichard Lowe /*
5910d63b7dSRichard Lowe * typedefs & structs
6010d63b7dSRichard Lowe */
6110d63b7dSRichard Lowe
6210d63b7dSRichard Lowe /*
6310d63b7dSRichard Lowe * Static variables
6410d63b7dSRichard Lowe */
6510d63b7dSRichard Lowe
6610d63b7dSRichard Lowe /*
6710d63b7dSRichard Lowe * File table of contents
6810d63b7dSRichard Lowe */
69*e7afc443SToomas Soome static void print_rule(Name target);
70*e7afc443SToomas Soome static void print_target_n_deps(Name target);
7110d63b7dSRichard Lowe
7210d63b7dSRichard Lowe /*****************************************
7310d63b7dSRichard Lowe *
7410d63b7dSRichard Lowe * getname
7510d63b7dSRichard Lowe */
7610d63b7dSRichard Lowe
7710d63b7dSRichard Lowe /*****************************************
7810d63b7dSRichard Lowe *
7910d63b7dSRichard Lowe * Memory allocation
8010d63b7dSRichard Lowe */
8110d63b7dSRichard Lowe
8210d63b7dSRichard Lowe /*
8310d63b7dSRichard Lowe * free_chain()
8410d63b7dSRichard Lowe *
8510d63b7dSRichard Lowe * frees a chain of Name_vector's
8610d63b7dSRichard Lowe *
8710d63b7dSRichard Lowe * Parameters:
8810d63b7dSRichard Lowe * ptr Pointer to the first element in the chain
8910d63b7dSRichard Lowe * to be freed.
9010d63b7dSRichard Lowe *
9110d63b7dSRichard Lowe * Global variables used:
9210d63b7dSRichard Lowe */
9310d63b7dSRichard Lowe void
free_chain(Name_vector ptr)9410d63b7dSRichard Lowe free_chain(Name_vector ptr)
9510d63b7dSRichard Lowe {
9610d63b7dSRichard Lowe if (ptr != NULL) {
9710d63b7dSRichard Lowe if (ptr->next != NULL) {
9810d63b7dSRichard Lowe free_chain(ptr->next);
9910d63b7dSRichard Lowe }
10010d63b7dSRichard Lowe free((char *) ptr);
10110d63b7dSRichard Lowe }
10210d63b7dSRichard Lowe }
10310d63b7dSRichard Lowe
10410d63b7dSRichard Lowe /*****************************************
10510d63b7dSRichard Lowe *
10610d63b7dSRichard Lowe * String manipulation
10710d63b7dSRichard Lowe */
10810d63b7dSRichard Lowe
10910d63b7dSRichard Lowe /*****************************************
11010d63b7dSRichard Lowe *
11110d63b7dSRichard Lowe * Nameblock property handling
11210d63b7dSRichard Lowe */
11310d63b7dSRichard Lowe
11410d63b7dSRichard Lowe /*****************************************
11510d63b7dSRichard Lowe *
11610d63b7dSRichard Lowe * Error message handling
11710d63b7dSRichard Lowe */
11810d63b7dSRichard Lowe
11910d63b7dSRichard Lowe /*
12010d63b7dSRichard Lowe * fatal(format, args...)
12110d63b7dSRichard Lowe *
12210d63b7dSRichard Lowe * Print a message and die
12310d63b7dSRichard Lowe *
12410d63b7dSRichard Lowe * Parameters:
12510d63b7dSRichard Lowe * format printf type format string
12610d63b7dSRichard Lowe * args Arguments to match the format
12710d63b7dSRichard Lowe *
12810d63b7dSRichard Lowe * Global variables used:
12910d63b7dSRichard Lowe * fatal_in_progress Indicates if this is a recursive call
13010d63b7dSRichard Lowe * parallel_process_cnt Do we need to wait for anything?
13110d63b7dSRichard Lowe * report_pwd Should we report the current path?
13210d63b7dSRichard Lowe */
13310d63b7dSRichard Lowe /*VARARGS*/
13410d63b7dSRichard Lowe void
fatal(const char * message,...)13510d63b7dSRichard Lowe fatal(const char *message, ...)
13610d63b7dSRichard Lowe {
13710d63b7dSRichard Lowe va_list args;
13810d63b7dSRichard Lowe
13910d63b7dSRichard Lowe va_start(args, message);
14010d63b7dSRichard Lowe (void) fflush(stdout);
14110d63b7dSRichard Lowe (void) fprintf(stderr, gettext("%s: Fatal error: "), getprogname());
14210d63b7dSRichard Lowe (void) vfprintf(stderr, message, args);
14310d63b7dSRichard Lowe (void) fprintf(stderr, "\n");
14410d63b7dSRichard Lowe va_end(args);
14510d63b7dSRichard Lowe if (report_pwd) {
14610d63b7dSRichard Lowe (void) fprintf(stderr,
14710d63b7dSRichard Lowe gettext("Current working directory %s\n"),
14810d63b7dSRichard Lowe get_current_path());
14910d63b7dSRichard Lowe }
15010d63b7dSRichard Lowe (void) fflush(stderr);
15110d63b7dSRichard Lowe if (fatal_in_progress) {
15210d63b7dSRichard Lowe exit_status = 1;
15310d63b7dSRichard Lowe exit(1);
15410d63b7dSRichard Lowe }
15510d63b7dSRichard Lowe fatal_in_progress = true;
15610d63b7dSRichard Lowe /* Let all parallel children finish */
15710d63b7dSRichard Lowe if ((dmake_mode_type == parallel_mode) &&
15810d63b7dSRichard Lowe (parallel_process_cnt > 0)) {
15910d63b7dSRichard Lowe (void) fprintf(stderr,
16010d63b7dSRichard Lowe gettext("Waiting for %d %s to finish\n"),
16110d63b7dSRichard Lowe parallel_process_cnt,
16210d63b7dSRichard Lowe parallel_process_cnt == 1 ?
16310d63b7dSRichard Lowe gettext("job") : gettext("jobs"));
16410d63b7dSRichard Lowe (void) fflush(stderr);
16510d63b7dSRichard Lowe }
16610d63b7dSRichard Lowe
16710d63b7dSRichard Lowe while (parallel_process_cnt > 0) {
16810d63b7dSRichard Lowe await_parallel(true);
16910d63b7dSRichard Lowe finish_children(false);
17010d63b7dSRichard Lowe }
17110d63b7dSRichard Lowe
17210d63b7dSRichard Lowe job_adjust_fini();
17310d63b7dSRichard Lowe
17410d63b7dSRichard Lowe exit_status = 1;
17510d63b7dSRichard Lowe exit(1);
17610d63b7dSRichard Lowe }
17710d63b7dSRichard Lowe
17810d63b7dSRichard Lowe /*
17910d63b7dSRichard Lowe * warning(format, args...)
18010d63b7dSRichard Lowe *
18110d63b7dSRichard Lowe * Print a message and continue.
18210d63b7dSRichard Lowe *
18310d63b7dSRichard Lowe * Parameters:
18410d63b7dSRichard Lowe * format printf type format string
18510d63b7dSRichard Lowe * args Arguments to match the format
18610d63b7dSRichard Lowe *
18710d63b7dSRichard Lowe * Global variables used:
18810d63b7dSRichard Lowe * report_pwd Should we report the current path?
18910d63b7dSRichard Lowe */
19010d63b7dSRichard Lowe /*VARARGS*/
19110d63b7dSRichard Lowe void
warning(char * message,...)19210d63b7dSRichard Lowe warning(char * message, ...)
19310d63b7dSRichard Lowe {
19410d63b7dSRichard Lowe va_list args;
19510d63b7dSRichard Lowe
19610d63b7dSRichard Lowe va_start(args, message);
19710d63b7dSRichard Lowe (void) fflush(stdout);
19810d63b7dSRichard Lowe (void) fprintf(stderr, gettext("%s: Warning: "), getprogname());
19910d63b7dSRichard Lowe (void) vfprintf(stderr, message, args);
20010d63b7dSRichard Lowe (void) fprintf(stderr, "\n");
20110d63b7dSRichard Lowe va_end(args);
20210d63b7dSRichard Lowe if (report_pwd) {
20310d63b7dSRichard Lowe (void) fprintf(stderr,
20410d63b7dSRichard Lowe gettext("Current working directory %s\n"),
20510d63b7dSRichard Lowe get_current_path());
20610d63b7dSRichard Lowe }
20710d63b7dSRichard Lowe (void) fflush(stderr);
20810d63b7dSRichard Lowe }
20910d63b7dSRichard Lowe
21010d63b7dSRichard Lowe /*
21110d63b7dSRichard Lowe * time_to_string(time)
21210d63b7dSRichard Lowe *
21310d63b7dSRichard Lowe * Take a numeric time value and produce
21410d63b7dSRichard Lowe * a proper string representation.
21510d63b7dSRichard Lowe *
21610d63b7dSRichard Lowe * Return value:
21710d63b7dSRichard Lowe * The string representation of the time
21810d63b7dSRichard Lowe *
21910d63b7dSRichard Lowe * Parameters:
22010d63b7dSRichard Lowe * time The time we need to translate
22110d63b7dSRichard Lowe *
22210d63b7dSRichard Lowe * Global variables used:
22310d63b7dSRichard Lowe */
22410d63b7dSRichard Lowe char *
time_to_string(const timestruc_t & time)22510d63b7dSRichard Lowe time_to_string(const timestruc_t &time)
22610d63b7dSRichard Lowe {
22710d63b7dSRichard Lowe struct tm *tm;
22810d63b7dSRichard Lowe char buf[128];
22910d63b7dSRichard Lowe
23010d63b7dSRichard Lowe if (time == file_doesnt_exist) {
23110d63b7dSRichard Lowe return gettext("File does not exist");
23210d63b7dSRichard Lowe }
23310d63b7dSRichard Lowe if (time == file_max_time) {
23410d63b7dSRichard Lowe return gettext("Younger than any file");
23510d63b7dSRichard Lowe }
23610d63b7dSRichard Lowe tm = localtime(&time.tv_sec);
23710d63b7dSRichard Lowe strftime(buf, sizeof (buf), "%c %Z", tm);
23810d63b7dSRichard Lowe buf[127] = (int) nul_char;
23910d63b7dSRichard Lowe return strdup(buf);
24010d63b7dSRichard Lowe }
24110d63b7dSRichard Lowe
24210d63b7dSRichard Lowe /*
24310d63b7dSRichard Lowe * get_current_path()
24410d63b7dSRichard Lowe *
24510d63b7dSRichard Lowe * Stuff current_path with the current path if it isnt there already.
24610d63b7dSRichard Lowe *
24710d63b7dSRichard Lowe * Parameters:
24810d63b7dSRichard Lowe *
24910d63b7dSRichard Lowe * Global variables used:
25010d63b7dSRichard Lowe */
25110d63b7dSRichard Lowe char *
get_current_path(void)25210d63b7dSRichard Lowe get_current_path(void)
25310d63b7dSRichard Lowe {
25410d63b7dSRichard Lowe char pwd[(MAXPATHLEN * MB_LEN_MAX)];
25536cd0120SRobert Mustacchi static char *current_path = NULL;
25610d63b7dSRichard Lowe
25736cd0120SRobert Mustacchi /*
25836cd0120SRobert Mustacchi * When we hit this with path_reset to true, we do not free the older
25936cd0120SRobert Mustacchi * version of current_path at this time, as we don't have confidence
26036cd0120SRobert Mustacchi * that we've properly caught all users of it and they haven't cached
26136cd0120SRobert Mustacchi * the pointer somewhere. As such, since this is only currently set with
26236cd0120SRobert Mustacchi * the -C option is passed in, it seems OK to just let that bit go.
26336cd0120SRobert Mustacchi */
26436cd0120SRobert Mustacchi if (current_path == NULL || path_reset == true) {
26510d63b7dSRichard Lowe getcwd(pwd, sizeof(pwd));
26610d63b7dSRichard Lowe if (pwd[0] == (int) nul_char) {
26710d63b7dSRichard Lowe pwd[0] = (int) slash_char;
26810d63b7dSRichard Lowe pwd[1] = (int) nul_char;
26910d63b7dSRichard Lowe }
27010d63b7dSRichard Lowe current_path = strdup(pwd);
27136cd0120SRobert Mustacchi path_reset = false;
27210d63b7dSRichard Lowe }
27310d63b7dSRichard Lowe return current_path;
27410d63b7dSRichard Lowe }
27510d63b7dSRichard Lowe
27610d63b7dSRichard Lowe /*****************************************
27710d63b7dSRichard Lowe *
27810d63b7dSRichard Lowe * Make internal state dumping
27910d63b7dSRichard Lowe *
28010d63b7dSRichard Lowe * This is a set of routines for dumping the internal make state
28110d63b7dSRichard Lowe * Used for the -p option
28210d63b7dSRichard Lowe */
28310d63b7dSRichard Lowe
28410d63b7dSRichard Lowe /*
28510d63b7dSRichard Lowe * dump_make_state()
28610d63b7dSRichard Lowe *
28710d63b7dSRichard Lowe * Dump make's internal state to stdout
28810d63b7dSRichard Lowe *
28910d63b7dSRichard Lowe * Parameters:
29010d63b7dSRichard Lowe *
29110d63b7dSRichard Lowe * Global variables used:
29210d63b7dSRichard Lowe * svr4 Was ".SVR4" seen in makefile?
29310d63b7dSRichard Lowe * svr4_name The Name ".SVR4", printed
29410d63b7dSRichard Lowe * posix Was ".POSIX" seen in makefile?
29510d63b7dSRichard Lowe * posix_name The Name ".POSIX", printed
29610d63b7dSRichard Lowe * default_rule Points to the .DEFAULT rule
29710d63b7dSRichard Lowe * default_rule_name The Name ".DEFAULT", printed
29810d63b7dSRichard Lowe * default_target_to_build The first target to print
29910d63b7dSRichard Lowe * dot_keep_state The Name ".KEEP_STATE", printed
30010d63b7dSRichard Lowe * dot_keep_state_file The Name ".KEEP_STATE_FILE", printed
30110d63b7dSRichard Lowe * hashtab The make hash table for Name blocks
30210d63b7dSRichard Lowe * ignore_errors Was ".IGNORE" seen in makefile?
30310d63b7dSRichard Lowe * ignore_name The Name ".IGNORE", printed
30410d63b7dSRichard Lowe * keep_state Was ".KEEP_STATE" seen in makefile?
30510d63b7dSRichard Lowe * percent_list The list of % rules
30610d63b7dSRichard Lowe * precious The Name ".PRECIOUS", printed
30710d63b7dSRichard Lowe * sccs_get_name The Name ".SCCS_GET", printed
30810d63b7dSRichard Lowe * sccs_get_posix_name The Name ".SCCS_GET_POSIX", printed
30910d63b7dSRichard Lowe * get_name The Name ".GET", printed
31010d63b7dSRichard Lowe * get_posix_name The Name ".GET_POSIX", printed
31110d63b7dSRichard Lowe * sccs_get_rule Points to the ".SCCS_GET" rule
31210d63b7dSRichard Lowe * silent Was ".SILENT" seen in makefile?
31310d63b7dSRichard Lowe * silent_name The Name ".SILENT", printed
31410d63b7dSRichard Lowe * suffixes The suffix list from ".SUFFIXES"
31510d63b7dSRichard Lowe * suffixes_name The Name ".SUFFIX", printed
31610d63b7dSRichard Lowe */
31710d63b7dSRichard Lowe void
dump_make_state(void)31810d63b7dSRichard Lowe dump_make_state(void)
31910d63b7dSRichard Lowe {
32010d63b7dSRichard Lowe Name_set::iterator p, e;
321*e7afc443SToomas Soome Property prop;
322*e7afc443SToomas Soome Dependency dep;
323*e7afc443SToomas Soome Cmd_line rule;
32410d63b7dSRichard Lowe Percent percent, percent_depe;
32510d63b7dSRichard Lowe
32610d63b7dSRichard Lowe /* Default target */
32710d63b7dSRichard Lowe if (default_target_to_build != NULL) {
32810d63b7dSRichard Lowe print_rule(default_target_to_build);
32910d63b7dSRichard Lowe }
33010d63b7dSRichard Lowe (void) printf("\n");
33110d63b7dSRichard Lowe
33210d63b7dSRichard Lowe /* .POSIX */
33310d63b7dSRichard Lowe if (posix) {
33410d63b7dSRichard Lowe (void) printf("%s:\n", posix_name->string_mb);
33510d63b7dSRichard Lowe }
33610d63b7dSRichard Lowe
33710d63b7dSRichard Lowe /* .DEFAULT */
33810d63b7dSRichard Lowe if (default_rule != NULL) {
33910d63b7dSRichard Lowe (void) printf("%s:\n", default_rule_name->string_mb);
34010d63b7dSRichard Lowe for (rule = default_rule; rule != NULL; rule = rule->next) {
34110d63b7dSRichard Lowe (void) printf("\t%s\n", rule->command_line->string_mb);
34210d63b7dSRichard Lowe }
34310d63b7dSRichard Lowe }
34410d63b7dSRichard Lowe
34510d63b7dSRichard Lowe /* .IGNORE */
34610d63b7dSRichard Lowe if (ignore_errors) {
34710d63b7dSRichard Lowe (void) printf("%s:\n", ignore_name->string_mb);
34810d63b7dSRichard Lowe }
34910d63b7dSRichard Lowe
35010d63b7dSRichard Lowe /* .KEEP_STATE: */
35110d63b7dSRichard Lowe if (keep_state) {
35210d63b7dSRichard Lowe (void) printf("%s:\n\n", dot_keep_state->string_mb);
35310d63b7dSRichard Lowe }
35410d63b7dSRichard Lowe
35510d63b7dSRichard Lowe /* .PRECIOUS */
35610d63b7dSRichard Lowe (void) printf("%s:", precious->string_mb);
35710d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
35810d63b7dSRichard Lowe if ((p->stat.is_precious) || (all_precious)) {
35910d63b7dSRichard Lowe (void) printf(" %s", p->string_mb);
36010d63b7dSRichard Lowe }
36110d63b7dSRichard Lowe }
36210d63b7dSRichard Lowe (void) printf("\n");
36310d63b7dSRichard Lowe
36410d63b7dSRichard Lowe /* .SCCS_GET */
36510d63b7dSRichard Lowe if (sccs_get_rule != NULL) {
36610d63b7dSRichard Lowe (void) printf("%s:\n", sccs_get_name->string_mb);
36710d63b7dSRichard Lowe for (rule = sccs_get_rule; rule != NULL; rule = rule->next) {
36810d63b7dSRichard Lowe (void) printf("\t%s\n", rule->command_line->string_mb);
36910d63b7dSRichard Lowe }
37010d63b7dSRichard Lowe }
37110d63b7dSRichard Lowe
37210d63b7dSRichard Lowe /* .SILENT */
37310d63b7dSRichard Lowe if (silent) {
37410d63b7dSRichard Lowe (void) printf("%s:\n", silent_name->string_mb);
37510d63b7dSRichard Lowe }
37610d63b7dSRichard Lowe
37710d63b7dSRichard Lowe /* .SUFFIXES: */
37810d63b7dSRichard Lowe (void) printf("%s:", suffixes_name->string_mb);
37910d63b7dSRichard Lowe for (dep = suffixes; dep != NULL; dep = dep->next) {
38010d63b7dSRichard Lowe (void) printf(" %s", dep->name->string_mb);
38110d63b7dSRichard Lowe build_suffix_list(dep->name);
38210d63b7dSRichard Lowe }
38310d63b7dSRichard Lowe (void) printf("\n\n");
38410d63b7dSRichard Lowe
38510d63b7dSRichard Lowe /* % rules */
38610d63b7dSRichard Lowe for (percent = percent_list;
38710d63b7dSRichard Lowe percent != NULL;
38810d63b7dSRichard Lowe percent = percent->next) {
38910d63b7dSRichard Lowe (void) printf("%s:",
39010d63b7dSRichard Lowe percent->name->string_mb);
39110d63b7dSRichard Lowe
39210d63b7dSRichard Lowe for (percent_depe = percent->dependencies;
39310d63b7dSRichard Lowe percent_depe != NULL;
39410d63b7dSRichard Lowe percent_depe = percent_depe->next) {
39510d63b7dSRichard Lowe (void) printf(" %s", percent_depe->name->string_mb);
39610d63b7dSRichard Lowe }
39710d63b7dSRichard Lowe
39810d63b7dSRichard Lowe (void) printf("\n");
39910d63b7dSRichard Lowe
40010d63b7dSRichard Lowe for (rule = percent->command_template;
40110d63b7dSRichard Lowe rule != NULL;
40210d63b7dSRichard Lowe rule = rule->next) {
40310d63b7dSRichard Lowe (void) printf("\t%s\n", rule->command_line->string_mb);
40410d63b7dSRichard Lowe }
40510d63b7dSRichard Lowe }
40610d63b7dSRichard Lowe
40710d63b7dSRichard Lowe /* Suffix rules */
40810d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
40910d63b7dSRichard Lowe Wstring wcb(p);
41010d63b7dSRichard Lowe if (wcb.get_string()[0] == (int) period_char) {
41110d63b7dSRichard Lowe print_rule(p);
41210d63b7dSRichard Lowe }
41310d63b7dSRichard Lowe }
41410d63b7dSRichard Lowe
41510d63b7dSRichard Lowe /* Macro assignments */
41610d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
41710d63b7dSRichard Lowe if (((prop = get_prop(p->prop, macro_prop)) != NULL) &&
41810d63b7dSRichard Lowe (prop->body.macro.value != NULL)) {
41910d63b7dSRichard Lowe (void) printf("%s", p->string_mb);
42010d63b7dSRichard Lowe print_value(prop->body.macro.value,
42110d63b7dSRichard Lowe (Daemon) prop->body.macro.daemon);
42210d63b7dSRichard Lowe }
42310d63b7dSRichard Lowe }
42410d63b7dSRichard Lowe (void) printf("\n");
42510d63b7dSRichard Lowe
42610d63b7dSRichard Lowe /* Conditional macro assignments */
42710d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
42810d63b7dSRichard Lowe for (prop = get_prop(p->prop, conditional_prop);
42910d63b7dSRichard Lowe prop != NULL;
43010d63b7dSRichard Lowe prop = get_prop(prop->next, conditional_prop)) {
43110d63b7dSRichard Lowe (void) printf("%s := %s",
43210d63b7dSRichard Lowe p->string_mb,
43310d63b7dSRichard Lowe prop->body.conditional.name->
43410d63b7dSRichard Lowe string_mb);
43510d63b7dSRichard Lowe if (prop->body.conditional.append) {
43610d63b7dSRichard Lowe printf(" +");
43710d63b7dSRichard Lowe }
43810d63b7dSRichard Lowe else {
43910d63b7dSRichard Lowe printf(" ");
44010d63b7dSRichard Lowe }
44110d63b7dSRichard Lowe print_value(prop->body.conditional.value,
44210d63b7dSRichard Lowe no_daemon);
44310d63b7dSRichard Lowe }
44410d63b7dSRichard Lowe }
44510d63b7dSRichard Lowe (void) printf("\n");
44610d63b7dSRichard Lowe
44710d63b7dSRichard Lowe /* All other dependencies */
44810d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
44910d63b7dSRichard Lowe if (p->colons != no_colon) {
45010d63b7dSRichard Lowe print_rule(p);
45110d63b7dSRichard Lowe }
45210d63b7dSRichard Lowe }
45310d63b7dSRichard Lowe (void) printf("\n");
45410d63b7dSRichard Lowe }
45510d63b7dSRichard Lowe
45610d63b7dSRichard Lowe /*
45710d63b7dSRichard Lowe * print_rule(target)
45810d63b7dSRichard Lowe *
45910d63b7dSRichard Lowe * Print the rule for one target
46010d63b7dSRichard Lowe *
46110d63b7dSRichard Lowe * Parameters:
46210d63b7dSRichard Lowe * target Target we print rule for
46310d63b7dSRichard Lowe *
46410d63b7dSRichard Lowe * Global variables used:
46510d63b7dSRichard Lowe */
46610d63b7dSRichard Lowe static void
print_rule(Name target)467*e7afc443SToomas Soome print_rule(Name target)
46810d63b7dSRichard Lowe {
469*e7afc443SToomas Soome Cmd_line rule;
470*e7afc443SToomas Soome Property line;
471*e7afc443SToomas Soome Dependency dependency;
47210d63b7dSRichard Lowe
47310d63b7dSRichard Lowe if (target->dependency_printed ||
47410d63b7dSRichard Lowe ((line = get_prop(target->prop, line_prop)) == NULL) ||
47510d63b7dSRichard Lowe ((line->body.line.command_template == NULL) &&
47610d63b7dSRichard Lowe (line->body.line.dependencies == NULL))) {
47710d63b7dSRichard Lowe return;
47810d63b7dSRichard Lowe }
47910d63b7dSRichard Lowe target->dependency_printed = true;
48010d63b7dSRichard Lowe
48110d63b7dSRichard Lowe (void) printf("%s:", target->string_mb);
48210d63b7dSRichard Lowe
48310d63b7dSRichard Lowe for (dependency = line->body.line.dependencies;
48410d63b7dSRichard Lowe dependency != NULL;
48510d63b7dSRichard Lowe dependency = dependency->next) {
48610d63b7dSRichard Lowe (void) printf(" %s", dependency->name->string_mb);
48710d63b7dSRichard Lowe }
48810d63b7dSRichard Lowe
48910d63b7dSRichard Lowe (void) printf("\n");
49010d63b7dSRichard Lowe
49110d63b7dSRichard Lowe for (rule = line->body.line.command_template;
49210d63b7dSRichard Lowe rule != NULL;
49310d63b7dSRichard Lowe rule = rule->next) {
49410d63b7dSRichard Lowe (void) printf("\t%s\n", rule->command_line->string_mb);
49510d63b7dSRichard Lowe }
49610d63b7dSRichard Lowe }
49710d63b7dSRichard Lowe
49810d63b7dSRichard Lowe void
dump_target_list(void)49910d63b7dSRichard Lowe dump_target_list(void)
50010d63b7dSRichard Lowe {
50110d63b7dSRichard Lowe Name_set::iterator p, e;
50210d63b7dSRichard Lowe Wstring str;
50310d63b7dSRichard Lowe
50410d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
50510d63b7dSRichard Lowe str.init(p);
50610d63b7dSRichard Lowe wchar_t * wcb = str.get_string();
50710d63b7dSRichard Lowe if ((p->colons != no_colon) &&
50810d63b7dSRichard Lowe ((wcb[0] != (int) period_char) ||
50910d63b7dSRichard Lowe ((wcb[0] == (int) period_char) &&
51010d63b7dSRichard Lowe (wcschr(wcb, (int) slash_char))))) {
51110d63b7dSRichard Lowe print_target_n_deps(p);
51210d63b7dSRichard Lowe }
51310d63b7dSRichard Lowe }
51410d63b7dSRichard Lowe }
51510d63b7dSRichard Lowe
51610d63b7dSRichard Lowe static void
print_target_n_deps(Name target)517*e7afc443SToomas Soome print_target_n_deps(Name target)
51810d63b7dSRichard Lowe {
519*e7afc443SToomas Soome Cmd_line rule;
520*e7afc443SToomas Soome Property line;
521*e7afc443SToomas Soome Dependency dependency;
52210d63b7dSRichard Lowe
52310d63b7dSRichard Lowe if (target->dependency_printed) {
52410d63b7dSRichard Lowe return;
52510d63b7dSRichard Lowe }
52610d63b7dSRichard Lowe target->dependency_printed = true;
52710d63b7dSRichard Lowe
52810d63b7dSRichard Lowe (void) printf("%s\n", target->string_mb);
52910d63b7dSRichard Lowe
53010d63b7dSRichard Lowe if ((line = get_prop(target->prop, line_prop)) == NULL) {
53110d63b7dSRichard Lowe return;
53210d63b7dSRichard Lowe }
53310d63b7dSRichard Lowe for (dependency = line->body.line.dependencies;
53410d63b7dSRichard Lowe dependency != NULL;
53510d63b7dSRichard Lowe dependency = dependency->next) {
53610d63b7dSRichard Lowe if (!dependency->automatic) {
53710d63b7dSRichard Lowe print_target_n_deps(dependency->name);
53810d63b7dSRichard Lowe }
53910d63b7dSRichard Lowe }
54010d63b7dSRichard Lowe }
54110d63b7dSRichard Lowe
54210d63b7dSRichard Lowe /*****************************************
54310d63b7dSRichard Lowe *
54410d63b7dSRichard Lowe * main() support
54510d63b7dSRichard Lowe */
54610d63b7dSRichard Lowe
54710d63b7dSRichard Lowe /*
54810d63b7dSRichard Lowe * load_cached_names()
54910d63b7dSRichard Lowe *
55010d63b7dSRichard Lowe * Load the vector of cached names
55110d63b7dSRichard Lowe *
55210d63b7dSRichard Lowe * Parameters:
55310d63b7dSRichard Lowe *
55410d63b7dSRichard Lowe * Global variables used:
55510d63b7dSRichard Lowe * Many many pointers to Name blocks.
55610d63b7dSRichard Lowe */
55710d63b7dSRichard Lowe void
load_cached_names(void)55810d63b7dSRichard Lowe load_cached_names(void)
55910d63b7dSRichard Lowe {
56010d63b7dSRichard Lowe char *cp;
56110d63b7dSRichard Lowe Name dollar;
56210d63b7dSRichard Lowe
56310d63b7dSRichard Lowe /* Load the cached_names struct */
56410d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".BUILT_LAST_MAKE_RUN");
56510d63b7dSRichard Lowe built_last_make_run = GETNAME(wcs_buffer, FIND_LENGTH);
56610d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "@");
56710d63b7dSRichard Lowe c_at = GETNAME(wcs_buffer, FIND_LENGTH);
56810d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, " *conditionals* ");
56910d63b7dSRichard Lowe conditionals = GETNAME(wcs_buffer, FIND_LENGTH);
57010d63b7dSRichard Lowe /*
57110d63b7dSRichard Lowe * A version of make was released with NSE 1.0 that used
57210d63b7dSRichard Lowe * VERSION-1.1 but this version is identical to VERSION-1.0.
57310d63b7dSRichard Lowe * The version mismatch code makes a special case for this
57410d63b7dSRichard Lowe * situation. If the version number is changed from 1.0
57510d63b7dSRichard Lowe * it should go to 1.2.
57610d63b7dSRichard Lowe */
57710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "VERSION-1.0");
57810d63b7dSRichard Lowe current_make_version = GETNAME(wcs_buffer, FIND_LENGTH);
57910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SVR4");
58010d63b7dSRichard Lowe svr4_name = GETNAME(wcs_buffer, FIND_LENGTH);
58110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".POSIX");
58210d63b7dSRichard Lowe posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
58310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".DEFAULT");
58410d63b7dSRichard Lowe default_rule_name = GETNAME(wcs_buffer, FIND_LENGTH);
58510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "$");
58610d63b7dSRichard Lowe dollar = GETNAME(wcs_buffer, FIND_LENGTH);
58710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".DONE");
58810d63b7dSRichard Lowe done = GETNAME(wcs_buffer, FIND_LENGTH);
58910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".");
59010d63b7dSRichard Lowe dot = GETNAME(wcs_buffer, FIND_LENGTH);
59110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".KEEP_STATE");
59210d63b7dSRichard Lowe dot_keep_state = GETNAME(wcs_buffer, FIND_LENGTH);
59310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".KEEP_STATE_FILE");
59410d63b7dSRichard Lowe dot_keep_state_file = GETNAME(wcs_buffer, FIND_LENGTH);
59510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "");
59610d63b7dSRichard Lowe empty_name = GETNAME(wcs_buffer, FIND_LENGTH);
59710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, " FORCE");
59810d63b7dSRichard Lowe force = GETNAME(wcs_buffer, FIND_LENGTH);
59910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "HOST_ARCH");
60010d63b7dSRichard Lowe host_arch = GETNAME(wcs_buffer, FIND_LENGTH);
60110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "HOST_MACH");
60210d63b7dSRichard Lowe host_mach = GETNAME(wcs_buffer, FIND_LENGTH);
60310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".IGNORE");
60410d63b7dSRichard Lowe ignore_name = GETNAME(wcs_buffer, FIND_LENGTH);
60510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".INIT");
60610d63b7dSRichard Lowe init = GETNAME(wcs_buffer, FIND_LENGTH);
60710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".LOCAL");
60810d63b7dSRichard Lowe localhost_name = GETNAME(wcs_buffer, FIND_LENGTH);
60910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".make.state");
61010d63b7dSRichard Lowe make_state = GETNAME(wcs_buffer, FIND_LENGTH);
61110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "MAKEFLAGS");
61210d63b7dSRichard Lowe makeflags = GETNAME(wcs_buffer, FIND_LENGTH);
61310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".MAKE_VERSION");
61410d63b7dSRichard Lowe make_version = GETNAME(wcs_buffer, FIND_LENGTH);
61510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".NO_PARALLEL");
61610d63b7dSRichard Lowe no_parallel_name = GETNAME(wcs_buffer, FIND_LENGTH);
61710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".NOT_AUTO");
61810d63b7dSRichard Lowe not_auto = GETNAME(wcs_buffer, FIND_LENGTH);
61910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".PARALLEL");
62010d63b7dSRichard Lowe parallel_name = GETNAME(wcs_buffer, FIND_LENGTH);
62110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "PATH");
62210d63b7dSRichard Lowe path_name = GETNAME(wcs_buffer, FIND_LENGTH);
62310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "+");
62410d63b7dSRichard Lowe plus = GETNAME(wcs_buffer, FIND_LENGTH);
62510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".PRECIOUS");
62610d63b7dSRichard Lowe precious = GETNAME(wcs_buffer, FIND_LENGTH);
62710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "?");
62810d63b7dSRichard Lowe query = GETNAME(wcs_buffer, FIND_LENGTH);
62910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "^");
63010d63b7dSRichard Lowe hat = GETNAME(wcs_buffer, FIND_LENGTH);
63110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".RECURSIVE");
63210d63b7dSRichard Lowe recursive_name = GETNAME(wcs_buffer, FIND_LENGTH);
63310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SCCS_GET");
63410d63b7dSRichard Lowe sccs_get_name = GETNAME(wcs_buffer, FIND_LENGTH);
63510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SCCS_GET_POSIX");
63610d63b7dSRichard Lowe sccs_get_posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
63710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".GET");
63810d63b7dSRichard Lowe get_name = GETNAME(wcs_buffer, FIND_LENGTH);
63910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".GET_POSIX");
64010d63b7dSRichard Lowe get_posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
64110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "SHELL");
64210d63b7dSRichard Lowe shell_name = GETNAME(wcs_buffer, FIND_LENGTH);
64310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SILENT");
64410d63b7dSRichard Lowe silent_name = GETNAME(wcs_buffer, FIND_LENGTH);
64510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SUFFIXES");
64610d63b7dSRichard Lowe suffixes_name = GETNAME(wcs_buffer, FIND_LENGTH);
64710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, SUNPRO_DEPENDENCIES);
64810d63b7dSRichard Lowe sunpro_dependencies = GETNAME(wcs_buffer, FIND_LENGTH);
64910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "TARGET_ARCH");
65010d63b7dSRichard Lowe target_arch = GETNAME(wcs_buffer, FIND_LENGTH);
65110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "TARGET_MACH");
65210d63b7dSRichard Lowe target_mach = GETNAME(wcs_buffer, FIND_LENGTH);
65310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "VIRTUAL_ROOT");
65410d63b7dSRichard Lowe virtual_root = GETNAME(wcs_buffer, FIND_LENGTH);
65510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "VPATH");
65610d63b7dSRichard Lowe vpath_name = GETNAME(wcs_buffer, FIND_LENGTH);
65710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".WAIT");
65810d63b7dSRichard Lowe wait_name = GETNAME(wcs_buffer, FIND_LENGTH);
65910d63b7dSRichard Lowe
66010d63b7dSRichard Lowe wait_name->state = build_ok;
66110d63b7dSRichard Lowe
66210d63b7dSRichard Lowe /* Mark special targets so that the reader treats them properly */
66310d63b7dSRichard Lowe svr4_name->special_reader = svr4_special;
66410d63b7dSRichard Lowe posix_name->special_reader = posix_special;
66510d63b7dSRichard Lowe built_last_make_run->special_reader = built_last_make_run_special;
66610d63b7dSRichard Lowe default_rule_name->special_reader = default_special;
66710d63b7dSRichard Lowe dot_keep_state->special_reader = keep_state_special;
66810d63b7dSRichard Lowe dot_keep_state_file->special_reader = keep_state_file_special;
66910d63b7dSRichard Lowe ignore_name->special_reader = ignore_special;
67010d63b7dSRichard Lowe make_version->special_reader = make_version_special;
67110d63b7dSRichard Lowe no_parallel_name->special_reader = no_parallel_special;
67210d63b7dSRichard Lowe parallel_name->special_reader = parallel_special;
67310d63b7dSRichard Lowe localhost_name->special_reader = localhost_special;
67410d63b7dSRichard Lowe precious->special_reader = precious_special;
67510d63b7dSRichard Lowe sccs_get_name->special_reader = sccs_get_special;
67610d63b7dSRichard Lowe sccs_get_posix_name->special_reader = sccs_get_posix_special;
67710d63b7dSRichard Lowe get_name->special_reader = get_special;
67810d63b7dSRichard Lowe get_posix_name->special_reader = get_posix_special;
67910d63b7dSRichard Lowe silent_name->special_reader = silent_special;
68010d63b7dSRichard Lowe suffixes_name->special_reader = suffixes_special;
68110d63b7dSRichard Lowe
68210d63b7dSRichard Lowe /* The value of $$ is $ */
68310d63b7dSRichard Lowe (void) SETVAR(dollar, dollar, false);
68410d63b7dSRichard Lowe dollar->dollar = false;
68510d63b7dSRichard Lowe
68610d63b7dSRichard Lowe /* Set the value of $(SHELL) */
68710d63b7dSRichard Lowe if (posix) {
68810d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "/usr/xpg4/bin/sh");
68910d63b7dSRichard Lowe } else {
69010d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "/bin/sh");
69110d63b7dSRichard Lowe }
69210d63b7dSRichard Lowe (void) SETVAR(shell_name, GETNAME(wcs_buffer, FIND_LENGTH), false);
69310d63b7dSRichard Lowe
69410d63b7dSRichard Lowe /*
69510d63b7dSRichard Lowe * Use " FORCE" to simulate a FRC dependency for :: type
69610d63b7dSRichard Lowe * targets with no dependencies.
69710d63b7dSRichard Lowe */
69810d63b7dSRichard Lowe (void) append_prop(force, line_prop);
69910d63b7dSRichard Lowe force->stat.time = file_max_time;
70010d63b7dSRichard Lowe
70110d63b7dSRichard Lowe /* Make sure VPATH is defined before current dir is read */
70210d63b7dSRichard Lowe if ((cp = getenv(vpath_name->string_mb)) != NULL) {
70310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, cp);
70410d63b7dSRichard Lowe (void) SETVAR(vpath_name,
70510d63b7dSRichard Lowe GETNAME(wcs_buffer, FIND_LENGTH),
70610d63b7dSRichard Lowe false);
70710d63b7dSRichard Lowe }
70810d63b7dSRichard Lowe
70910d63b7dSRichard Lowe /* Check if there is NO PATH variable. If not we construct one. */
71010d63b7dSRichard Lowe if (getenv(path_name->string_mb) == NULL) {
71110d63b7dSRichard Lowe vroot_path = NULL;
71210d63b7dSRichard Lowe add_dir_to_path(".", &vroot_path, -1);
71310d63b7dSRichard Lowe add_dir_to_path("/bin", &vroot_path, -1);
71410d63b7dSRichard Lowe add_dir_to_path("/usr/bin", &vroot_path, -1);
71510d63b7dSRichard Lowe }
71610d63b7dSRichard Lowe }
71710d63b7dSRichard Lowe
71810d63b7dSRichard Lowe /*
71910d63b7dSRichard Lowe * iterate on list of conditional macros in np, and place them in
72010d63b7dSRichard Lowe * a String_rec starting with, and separated by the '$' character.
72110d63b7dSRichard Lowe */
72210d63b7dSRichard Lowe void
cond_macros_into_string(Name np,String_rec * buffer)72310d63b7dSRichard Lowe cond_macros_into_string(Name np, String_rec *buffer)
72410d63b7dSRichard Lowe {
72510d63b7dSRichard Lowe Macro_list macro_list;
72610d63b7dSRichard Lowe
72710d63b7dSRichard Lowe /*
72810d63b7dSRichard Lowe * Put the version number at the start of the string
72910d63b7dSRichard Lowe */
73010d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, DEPINFO_FMT_VERSION);
73110d63b7dSRichard Lowe append_string(wcs_buffer, buffer, FIND_LENGTH);
73210d63b7dSRichard Lowe /*
73310d63b7dSRichard Lowe * Add the rest of the conditional macros to the buffer
73410d63b7dSRichard Lowe */
73510d63b7dSRichard Lowe if (np->depends_on_conditional){
73610d63b7dSRichard Lowe for (macro_list = np->conditional_macro_list;
73710d63b7dSRichard Lowe macro_list != NULL; macro_list = macro_list->next){
73810d63b7dSRichard Lowe append_string(macro_list->macro_name, buffer,
73910d63b7dSRichard Lowe FIND_LENGTH);
74010d63b7dSRichard Lowe append_char((int) equal_char, buffer);
74110d63b7dSRichard Lowe append_string(macro_list->value, buffer, FIND_LENGTH);
74210d63b7dSRichard Lowe append_char((int) dollar_char, buffer);
74310d63b7dSRichard Lowe }
74410d63b7dSRichard Lowe }
74510d63b7dSRichard Lowe }
74610d63b7dSRichard Lowe
747