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 2006 Sun Microsystems, Inc. All rights reserved.
2310d63b7dSRichard Lowe * Use is subject to license terms.
2436cd0120SRobert Mustacchi *
2536cd0120SRobert Mustacchi * Copyright 2019, Joyent, Inc.
268e0c8248SAndrew Stormont * Copyright 2019 RackTop Systems.
27ae389aa9SAndy Fiddaman * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
2810d63b7dSRichard Lowe */
2910d63b7dSRichard Lowe
3010d63b7dSRichard Lowe /*
3110d63b7dSRichard Lowe * main.cc
3210d63b7dSRichard Lowe *
3310d63b7dSRichard Lowe * make program main routine plus some helper routines
3410d63b7dSRichard Lowe */
35ae389aa9SAndy Fiddaman
3610d63b7dSRichard Lowe /*
3710d63b7dSRichard Lowe * Included files
3810d63b7dSRichard Lowe */
3910d63b7dSRichard Lowe #include <bsd/bsd.h> /* bsd_signal() */
4010d63b7dSRichard Lowe
4110d63b7dSRichard Lowe
4210d63b7dSRichard Lowe #include <locale.h> /* setlocale() */
4310d63b7dSRichard Lowe #include <libgen.h>
4410d63b7dSRichard Lowe #include <mk/defs.h>
4510d63b7dSRichard Lowe #include <mksh/macro.h> /* getvar() */
4610d63b7dSRichard Lowe #include <mksh/misc.h> /* getmem(), setup_char_semantics() */
4710d63b7dSRichard Lowe
4810d63b7dSRichard Lowe #include <pwd.h> /* getpwnam() */
4910d63b7dSRichard Lowe #include <setjmp.h>
5010d63b7dSRichard Lowe #include <signal.h>
5110d63b7dSRichard Lowe #include <stdlib.h>
5210d63b7dSRichard Lowe #include <sys/errno.h> /* ENOENT */
5310d63b7dSRichard Lowe #include <sys/stat.h> /* fstat() */
5410d63b7dSRichard Lowe #include <fcntl.h> /* open() */
5510d63b7dSRichard Lowe
5610d63b7dSRichard Lowe # include <sys/systeminfo.h> /* sysinfo() */
5710d63b7dSRichard Lowe
5810d63b7dSRichard Lowe #include <sys/types.h> /* stat() */
5910d63b7dSRichard Lowe #include <sys/wait.h> /* wait() */
6010d63b7dSRichard Lowe #include <unistd.h> /* execv(), unlink(), access() */
6110d63b7dSRichard Lowe #include <vroot/report.h> /* report_dependency(), get_report_file() */
6210d63b7dSRichard Lowe
6310d63b7dSRichard Lowe // From read2.cc
64*e7afc443SToomas Soome extern Name normalize_name(wchar_t *name_string, int length);
6510d63b7dSRichard Lowe
6610d63b7dSRichard Lowe extern void job_adjust_fini();
6710d63b7dSRichard Lowe
6810d63b7dSRichard Lowe
6910d63b7dSRichard Lowe /*
7010d63b7dSRichard Lowe * Defined macros
7110d63b7dSRichard Lowe */
7210d63b7dSRichard Lowe #define LD_SUPPORT_ENV_VAR "SGS_SUPPORT_32"
7310d63b7dSRichard Lowe #define LD_SUPPORT_ENV_VAR_32 "SGS_SUPPORT_32"
7410d63b7dSRichard Lowe #define LD_SUPPORT_ENV_VAR_64 "SGS_SUPPORT_64"
7510d63b7dSRichard Lowe #define LD_SUPPORT_MAKE_LIB "libmakestate.so.1"
76356ba08cSToomas Soome #ifdef __x86
7710d63b7dSRichard Lowe #define LD_SUPPORT_MAKE_ARCH "i386"
7810d63b7dSRichard Lowe #elif __sparc
7910d63b7dSRichard Lowe #define LD_SUPPORT_MAKE_ARCH "sparc"
8010d63b7dSRichard Lowe #else
8110d63b7dSRichard Lowe #error "Unsupported architecture"
8210d63b7dSRichard Lowe #endif
8310d63b7dSRichard Lowe
8410d63b7dSRichard Lowe /*
8510d63b7dSRichard Lowe * typedefs & structs
8610d63b7dSRichard Lowe */
8710d63b7dSRichard Lowe
8810d63b7dSRichard Lowe /*
8910d63b7dSRichard Lowe * Static variables
9010d63b7dSRichard Lowe */
9110d63b7dSRichard Lowe static char *argv_zero_string;
9210d63b7dSRichard Lowe static Boolean build_failed_ever_seen;
9310d63b7dSRichard Lowe static Boolean continue_after_error_ever_seen; /* `-k' */
9410d63b7dSRichard Lowe static Boolean dmake_group_specified; /* `-g' */
9510d63b7dSRichard Lowe static Boolean dmake_max_jobs_specified; /* `-j' */
9610d63b7dSRichard Lowe static Boolean dmake_mode_specified; /* `-m' */
9710d63b7dSRichard Lowe static Boolean dmake_add_mode_specified; /* `-x' */
9810d63b7dSRichard Lowe static Boolean dmake_output_mode_specified; /* `-x DMAKE_OUTPUT_MODE=' */
9910d63b7dSRichard Lowe static Boolean dmake_compat_mode_specified; /* `-x SUN_MAKE_COMPAT_MODE=' */
10010d63b7dSRichard Lowe static Boolean dmake_odir_specified; /* `-o' */
10110d63b7dSRichard Lowe static Boolean dmake_rcfile_specified; /* `-c' */
10210d63b7dSRichard Lowe static Boolean env_wins; /* `-e' */
10310d63b7dSRichard Lowe static Boolean ignore_default_mk; /* `-r' */
10410d63b7dSRichard Lowe static Boolean list_all_targets; /* `-T' */
10510d63b7dSRichard Lowe static int mf_argc;
10610d63b7dSRichard Lowe static char **mf_argv;
10710d63b7dSRichard Lowe static Dependency_rec not_auto_depen_struct;
108ae389aa9SAndy Fiddaman static Dependency not_auto_depen = ¬_auto_depen_struct;
10910d63b7dSRichard Lowe static Boolean pmake_cap_r_specified; /* `-R' */
11010d63b7dSRichard Lowe static Boolean pmake_machinesfile_specified; /* `-M' */
11110d63b7dSRichard Lowe static Boolean stop_after_error_ever_seen; /* `-S' */
11210d63b7dSRichard Lowe static Boolean trace_status; /* `-p' */
11310d63b7dSRichard Lowe
11410d63b7dSRichard Lowe #ifdef DMAKE_STATISTICS
11510d63b7dSRichard Lowe static Boolean getname_stat = false;
11610d63b7dSRichard Lowe #endif
11710d63b7dSRichard Lowe
11810d63b7dSRichard Lowe static time_t start_time;
11910d63b7dSRichard Lowe static int g_argc;
12010d63b7dSRichard Lowe static char **g_argv;
12110d63b7dSRichard Lowe
12210d63b7dSRichard Lowe /*
12310d63b7dSRichard Lowe * File table of contents
12410d63b7dSRichard Lowe */
12510d63b7dSRichard Lowe extern "C" void cleanup_after_exit(void);
12610d63b7dSRichard Lowe
12710d63b7dSRichard Lowe extern "C" {
12810d63b7dSRichard Lowe extern void dmake_exit_callback(void);
12910d63b7dSRichard Lowe extern void dmake_message_callback(char *);
13010d63b7dSRichard Lowe }
13110d63b7dSRichard Lowe
132*e7afc443SToomas Soome extern Name normalize_name(wchar_t *name_string, int length);
13310d63b7dSRichard Lowe
13410d63b7dSRichard Lowe extern int main(int, char * []);
13510d63b7dSRichard Lowe
13610d63b7dSRichard Lowe static void append_makeflags_string(Name, String);
13710d63b7dSRichard Lowe static void doalarm(int);
13810d63b7dSRichard Lowe static void enter_argv_values(int , char **, ASCII_Dyn_Array *);
13910d63b7dSRichard Lowe static void make_targets(int, char **, Boolean);
14010d63b7dSRichard Lowe static int parse_command_option(char);
14110d63b7dSRichard Lowe static void read_command_options(int, char **);
14210d63b7dSRichard Lowe static void read_environment(Boolean);
14310d63b7dSRichard Lowe static void read_files_and_state(int, char **);
14410d63b7dSRichard Lowe static Boolean read_makefile(Name, Boolean, Boolean, Boolean);
14510d63b7dSRichard Lowe static void report_recursion(Name);
14610d63b7dSRichard Lowe static void set_sgs_support(void);
14710d63b7dSRichard Lowe static void setup_for_projectdir(void);
14810d63b7dSRichard Lowe static void setup_makeflags_argv(void);
14910d63b7dSRichard Lowe static void report_dir_enter_leave(Boolean entering);
15010d63b7dSRichard Lowe
151*e7afc443SToomas Soome extern void expand_value(Name, String , Boolean);
15210d63b7dSRichard Lowe
15310d63b7dSRichard Lowe static const char verstring[] = "illumos make";
15410d63b7dSRichard Lowe
15510d63b7dSRichard Lowe jmp_buf jmpbuffer;
15610d63b7dSRichard Lowe
15710d63b7dSRichard Lowe /*
15810d63b7dSRichard Lowe * main(argc, argv)
15910d63b7dSRichard Lowe *
16010d63b7dSRichard Lowe * Parameters:
16110d63b7dSRichard Lowe * argc You know what this is
16210d63b7dSRichard Lowe * argv You know what this is
16310d63b7dSRichard Lowe *
16410d63b7dSRichard Lowe * Static variables used:
16510d63b7dSRichard Lowe * list_all_targets make -T seen
16610d63b7dSRichard Lowe * trace_status make -p seen
16710d63b7dSRichard Lowe *
16810d63b7dSRichard Lowe * Global variables used:
16910d63b7dSRichard Lowe * debug_level Should we trace make actions?
17010d63b7dSRichard Lowe * keep_state Set if .KEEP_STATE seen
17110d63b7dSRichard Lowe * makeflags The Name "MAKEFLAGS", used to get macro
17210d63b7dSRichard Lowe * remote_command_name Name of remote invocation cmd ("on")
17310d63b7dSRichard Lowe * running_list List of parallel running processes
17410d63b7dSRichard Lowe * stdout_stderr_same true if stdout and stderr are the same
17510d63b7dSRichard Lowe * auto_dependencies The Name "SUNPRO_DEPENDENCIES"
17610d63b7dSRichard Lowe * temp_file_directory Set to the dir where we create tmp file
17710d63b7dSRichard Lowe * trace_reader Set to reflect tracing status
17810d63b7dSRichard Lowe * working_on_targets Set when building user targets
17910d63b7dSRichard Lowe */
18010d63b7dSRichard Lowe int
main(int argc,char * argv[])18110d63b7dSRichard Lowe main(int argc, char *argv[])
18210d63b7dSRichard Lowe {
18310d63b7dSRichard Lowe /*
18410d63b7dSRichard Lowe * cp is a -> to the value of the MAKEFLAGS env var,
18510d63b7dSRichard Lowe * which has to be regular chars.
18610d63b7dSRichard Lowe */
187*e7afc443SToomas Soome char *cp;
188ae389aa9SAndy Fiddaman char make_state_dir[MAXPATHLEN];
18910d63b7dSRichard Lowe Boolean parallel_flag = false;
19036cd0120SRobert Mustacchi Boolean argv_zero_relative = false;
19110d63b7dSRichard Lowe char *prognameptr;
192ae389aa9SAndy Fiddaman char *slash_ptr;
19310d63b7dSRichard Lowe mode_t um;
19410d63b7dSRichard Lowe int i;
19510d63b7dSRichard Lowe struct itimerval value;
19610d63b7dSRichard Lowe char def_dmakerc_path[MAXPATHLEN];
19710d63b7dSRichard Lowe Name dmake_name, dmake_name2;
19810d63b7dSRichard Lowe Name dmake_value, dmake_value2;
19910d63b7dSRichard Lowe Property prop, prop2;
20010d63b7dSRichard Lowe struct stat statbuf;
20110d63b7dSRichard Lowe int statval;
20210d63b7dSRichard Lowe
20310d63b7dSRichard Lowe struct stat out_stat, err_stat;
20410d63b7dSRichard Lowe hostid = gethostid();
20510d63b7dSRichard Lowe bsd_signals();
20610d63b7dSRichard Lowe
20710d63b7dSRichard Lowe (void) setlocale(LC_ALL, "");
20810d63b7dSRichard Lowe
20910d63b7dSRichard Lowe
21010d63b7dSRichard Lowe #ifdef DMAKE_STATISTICS
21110d63b7dSRichard Lowe if (getenv("DMAKE_STATISTICS")) {
21210d63b7dSRichard Lowe getname_stat = true;
21310d63b7dSRichard Lowe }
21410d63b7dSRichard Lowe #endif
21510d63b7dSRichard Lowe
21610d63b7dSRichard Lowe #ifndef TEXT_DOMAIN
217ae389aa9SAndy Fiddaman #define TEXT_DOMAIN "SYS_TEST"
21810d63b7dSRichard Lowe #endif
21910d63b7dSRichard Lowe textdomain(TEXT_DOMAIN);
22010d63b7dSRichard Lowe
22110d63b7dSRichard Lowe g_argc = argc;
22210d63b7dSRichard Lowe g_argv = (char **) malloc((g_argc + 1) * sizeof(char *));
22310d63b7dSRichard Lowe for (i = 0; i < argc; i++) {
22410d63b7dSRichard Lowe g_argv[i] = argv[i];
22510d63b7dSRichard Lowe }
22610d63b7dSRichard Lowe g_argv[i] = NULL;
22710d63b7dSRichard Lowe
22810d63b7dSRichard Lowe /*
22910d63b7dSRichard Lowe * Set argv_zero_string to some form of argv[0] for
23010d63b7dSRichard Lowe * recursive MAKE builds.
23110d63b7dSRichard Lowe */
23210d63b7dSRichard Lowe
23310d63b7dSRichard Lowe if (*argv[0] == (int) slash_char) {
23410d63b7dSRichard Lowe /* argv[0] starts with a slash */
23510d63b7dSRichard Lowe argv_zero_string = strdup(argv[0]);
23610d63b7dSRichard Lowe } else if (strchr(argv[0], (int) slash_char) == NULL) {
23710d63b7dSRichard Lowe /* argv[0] contains no slashes */
23810d63b7dSRichard Lowe argv_zero_string = strdup(argv[0]);
23910d63b7dSRichard Lowe } else {
24010d63b7dSRichard Lowe /*
24110d63b7dSRichard Lowe * argv[0] contains at least one slash,
24210d63b7dSRichard Lowe * but doesn't start with a slash
24310d63b7dSRichard Lowe */
24410d63b7dSRichard Lowe char *tmp_current_path;
24510d63b7dSRichard Lowe char *tmp_string;
24610d63b7dSRichard Lowe
24710d63b7dSRichard Lowe tmp_current_path = get_current_path();
24810d63b7dSRichard Lowe tmp_string = getmem(strlen(tmp_current_path) + 1 +
24910d63b7dSRichard Lowe strlen(argv[0]) + 1);
25010d63b7dSRichard Lowe (void) sprintf(tmp_string,
25110d63b7dSRichard Lowe "%s/%s",
25210d63b7dSRichard Lowe tmp_current_path,
25310d63b7dSRichard Lowe argv[0]);
25410d63b7dSRichard Lowe argv_zero_string = strdup(tmp_string);
25510d63b7dSRichard Lowe retmem_mb(tmp_string);
25636cd0120SRobert Mustacchi argv_zero_relative = true;
25710d63b7dSRichard Lowe }
25810d63b7dSRichard Lowe
259ae389aa9SAndy Fiddaman /*
260ae389aa9SAndy Fiddaman * The following flags are reset if we don't have the
261ae389aa9SAndy Fiddaman * (.nse_depinfo or .make.state) files locked and only set
26210d63b7dSRichard Lowe * AFTER the file has been locked. This ensures that if the user
26310d63b7dSRichard Lowe * interrupts the program while file_lock() is waiting to lock
264ae389aa9SAndy Fiddaman * the file, the interrupt handler doesn't remove a lock
26510d63b7dSRichard Lowe * that doesn't belong to us.
26610d63b7dSRichard Lowe */
26710d63b7dSRichard Lowe make_state_lockfile = NULL;
26810d63b7dSRichard Lowe make_state_locked = false;
26910d63b7dSRichard Lowe
27010d63b7dSRichard Lowe
27110d63b7dSRichard Lowe /*
272ae389aa9SAndy Fiddaman * look for last slash char in the path to look at the binary
27310d63b7dSRichard Lowe * name. This is to resolve the hard link and invoke make
27410d63b7dSRichard Lowe * in svr4 mode.
27510d63b7dSRichard Lowe */
27610d63b7dSRichard Lowe
277ae389aa9SAndy Fiddaman /* Sun OS make standard */
278ae389aa9SAndy Fiddaman svr4 = false;
27910d63b7dSRichard Lowe posix = false;
28010d63b7dSRichard Lowe if(!strcmp(argv_zero_string, "/usr/xpg4/bin/make")) {
28110d63b7dSRichard Lowe svr4 = false;
28210d63b7dSRichard Lowe posix = true;
28310d63b7dSRichard Lowe } else {
28410d63b7dSRichard Lowe prognameptr = strrchr(argv[0], '/');
28510d63b7dSRichard Lowe if(prognameptr) {
28610d63b7dSRichard Lowe prognameptr++;
28710d63b7dSRichard Lowe } else {
28810d63b7dSRichard Lowe prognameptr = argv[0];
28910d63b7dSRichard Lowe }
29010d63b7dSRichard Lowe if(!strcmp(prognameptr, "svr4.make")) {
29110d63b7dSRichard Lowe svr4 = true;
29210d63b7dSRichard Lowe posix = false;
29310d63b7dSRichard Lowe }
29410d63b7dSRichard Lowe }
29510d63b7dSRichard Lowe if (getenv(USE_SVR4_MAKE) || getenv("USE_SVID")){
29610d63b7dSRichard Lowe svr4 = true;
29710d63b7dSRichard Lowe posix = false;
29810d63b7dSRichard Lowe }
29910d63b7dSRichard Lowe
30010d63b7dSRichard Lowe /*
30110d63b7dSRichard Lowe * Find the dmake_compat_mode: posix, sun, svr4, or gnu_style, .
30210d63b7dSRichard Lowe */
30310d63b7dSRichard Lowe char * dmake_compat_mode_var = getenv("SUN_MAKE_COMPAT_MODE");
30410d63b7dSRichard Lowe if (dmake_compat_mode_var != NULL) {
30510d63b7dSRichard Lowe if (0 == strcasecmp(dmake_compat_mode_var, "GNU")) {
30610d63b7dSRichard Lowe gnu_style = true;
30710d63b7dSRichard Lowe }
30810d63b7dSRichard Lowe //svr4 = false;
30910d63b7dSRichard Lowe //posix = false;
31010d63b7dSRichard Lowe }
31110d63b7dSRichard Lowe
31210d63b7dSRichard Lowe /*
31310d63b7dSRichard Lowe * Temporary directory set up.
31410d63b7dSRichard Lowe */
31510d63b7dSRichard Lowe char * tmpdir_var = getenv("TMPDIR");
31610d63b7dSRichard Lowe if (tmpdir_var != NULL && *tmpdir_var == '/' && strlen(tmpdir_var) < MAXPATHLEN) {
31710d63b7dSRichard Lowe strcpy(mbs_buffer, tmpdir_var);
31810d63b7dSRichard Lowe for (tmpdir_var = mbs_buffer+strlen(mbs_buffer);
31910d63b7dSRichard Lowe *(--tmpdir_var) == '/' && tmpdir_var > mbs_buffer;
32010d63b7dSRichard Lowe *tmpdir_var = '\0');
32110d63b7dSRichard Lowe if (strlen(mbs_buffer) + 32 < MAXPATHLEN) { /* 32 = strlen("/dmake.stdout.%d.%d.XXXXXX") */
32210d63b7dSRichard Lowe sprintf(mbs_buffer2, "%s/dmake.tst.%d.XXXXXX",
32310d63b7dSRichard Lowe mbs_buffer, getpid());
32410d63b7dSRichard Lowe int fd = mkstemp(mbs_buffer2);
32510d63b7dSRichard Lowe if (fd >= 0) {
32610d63b7dSRichard Lowe close(fd);
32710d63b7dSRichard Lowe unlink(mbs_buffer2);
32810d63b7dSRichard Lowe tmpdir = strdup(mbs_buffer);
32910d63b7dSRichard Lowe }
33010d63b7dSRichard Lowe }
33110d63b7dSRichard Lowe }
33210d63b7dSRichard Lowe
33310d63b7dSRichard Lowe /* find out if stdout and stderr point to the same place */
33410d63b7dSRichard Lowe if (fstat(1, &out_stat) < 0) {
33510d63b7dSRichard Lowe fatal(gettext("fstat of standard out failed: %s"), errmsg(errno));
33610d63b7dSRichard Lowe }
33710d63b7dSRichard Lowe if (fstat(2, &err_stat) < 0) {
33810d63b7dSRichard Lowe fatal(gettext("fstat of standard error failed: %s"), errmsg(errno));
33910d63b7dSRichard Lowe }
34010d63b7dSRichard Lowe if ((out_stat.st_dev == err_stat.st_dev) &&
34110d63b7dSRichard Lowe (out_stat.st_ino == err_stat.st_ino)) {
34210d63b7dSRichard Lowe stdout_stderr_same = true;
34310d63b7dSRichard Lowe } else {
34410d63b7dSRichard Lowe stdout_stderr_same = false;
34510d63b7dSRichard Lowe }
34610d63b7dSRichard Lowe /* Make the vroot package scan the path using shell semantics */
34710d63b7dSRichard Lowe set_path_style(0);
34810d63b7dSRichard Lowe
34910d63b7dSRichard Lowe setup_char_semantics();
35010d63b7dSRichard Lowe
35110d63b7dSRichard Lowe /*
35210d63b7dSRichard Lowe * If running with .KEEP_STATE, curdir will be set with
35310d63b7dSRichard Lowe * the connected directory.
35410d63b7dSRichard Lowe */
35510d63b7dSRichard Lowe (void) atexit(cleanup_after_exit);
35610d63b7dSRichard Lowe
35710d63b7dSRichard Lowe load_cached_names();
35810d63b7dSRichard Lowe
35910d63b7dSRichard Lowe /*
36010d63b7dSRichard Lowe * Set command line flags
36110d63b7dSRichard Lowe */
36210d63b7dSRichard Lowe setup_makeflags_argv();
36310d63b7dSRichard Lowe read_command_options(mf_argc, mf_argv);
36410d63b7dSRichard Lowe read_command_options(argc, argv);
36510d63b7dSRichard Lowe if (debug_level > 0) {
36610d63b7dSRichard Lowe cp = getenv(makeflags->string_mb);
36710d63b7dSRichard Lowe (void) printf(gettext("MAKEFLAGS value: %s\n"), cp == NULL ? "" : cp);
36810d63b7dSRichard Lowe }
36910d63b7dSRichard Lowe
37036cd0120SRobert Mustacchi /*
37136cd0120SRobert Mustacchi * Reset argv_zero_string if it was built from a relative path and the
37236cd0120SRobert Mustacchi * -C option was specified.
37336cd0120SRobert Mustacchi */
37436cd0120SRobert Mustacchi if (argv_zero_relative && rebuild_arg0) {
37536cd0120SRobert Mustacchi char *tmp_current_path;
37636cd0120SRobert Mustacchi char *tmp_string;
37736cd0120SRobert Mustacchi
37836cd0120SRobert Mustacchi free(argv_zero_string);
37936cd0120SRobert Mustacchi tmp_current_path = get_current_path();
38036cd0120SRobert Mustacchi tmp_string = getmem(strlen(tmp_current_path) + 1 +
38136cd0120SRobert Mustacchi strlen(argv[0]) + 1);
38236cd0120SRobert Mustacchi (void) sprintf(tmp_string,
38336cd0120SRobert Mustacchi "%s/%s",
38436cd0120SRobert Mustacchi tmp_current_path,
38536cd0120SRobert Mustacchi argv[0]);
38636cd0120SRobert Mustacchi argv_zero_string = strdup(tmp_string);
38736cd0120SRobert Mustacchi retmem_mb(tmp_string);
38836cd0120SRobert Mustacchi }
38936cd0120SRobert Mustacchi
39036cd0120SRobert Mustacchi setup_for_projectdir();
39136cd0120SRobert Mustacchi
39210d63b7dSRichard Lowe setup_interrupt(handle_interrupt);
39310d63b7dSRichard Lowe
39410d63b7dSRichard Lowe read_files_and_state(argc, argv);
39510d63b7dSRichard Lowe
39610d63b7dSRichard Lowe /*
39710d63b7dSRichard Lowe * Find the dmake_output_mode: TXT1, TXT2 or HTML1.
39810d63b7dSRichard Lowe */
39910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_OUTPUT_MODE");
40010d63b7dSRichard Lowe dmake_name2 = GETNAME(wcs_buffer, FIND_LENGTH);
40110d63b7dSRichard Lowe prop2 = get_prop(dmake_name2->prop, macro_prop);
40210d63b7dSRichard Lowe if (prop2 == NULL) {
40310d63b7dSRichard Lowe /* DMAKE_OUTPUT_MODE not defined, default to TXT1 mode */
40410d63b7dSRichard Lowe output_mode = txt1_mode;
40510d63b7dSRichard Lowe } else {
40610d63b7dSRichard Lowe dmake_value2 = prop2->body.macro.value;
40710d63b7dSRichard Lowe if ((dmake_value2 == NULL) ||
40810d63b7dSRichard Lowe (IS_EQUAL(dmake_value2->string_mb, "TXT1"))) {
40910d63b7dSRichard Lowe output_mode = txt1_mode;
41010d63b7dSRichard Lowe } else if (IS_EQUAL(dmake_value2->string_mb, "TXT2")) {
41110d63b7dSRichard Lowe output_mode = txt2_mode;
41210d63b7dSRichard Lowe } else if (IS_EQUAL(dmake_value2->string_mb, "HTML1")) {
41310d63b7dSRichard Lowe output_mode = html1_mode;
41410d63b7dSRichard Lowe } else {
41510d63b7dSRichard Lowe warning(gettext("Unsupported value `%s' for DMAKE_OUTPUT_MODE after -x flag (ignored)"),
41610d63b7dSRichard Lowe dmake_value2->string_mb);
41710d63b7dSRichard Lowe }
41810d63b7dSRichard Lowe }
41910d63b7dSRichard Lowe /*
42010d63b7dSRichard Lowe * Find the dmake_mode: parallel, or serial.
42110d63b7dSRichard Lowe */
42210d63b7dSRichard Lowe if ((!pmake_cap_r_specified) &&
42310d63b7dSRichard Lowe (!pmake_machinesfile_specified)) {
42410d63b7dSRichard Lowe char *s, *b;
42510d63b7dSRichard Lowe
42610d63b7dSRichard Lowe if ((s = strdup(argv[0])) == NULL)
42710d63b7dSRichard Lowe fatal(gettext("Out of memory"));
42810d63b7dSRichard Lowe
42910d63b7dSRichard Lowe b = basename(s);
43010d63b7dSRichard Lowe
43110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_MODE");
43210d63b7dSRichard Lowe dmake_name2 = GETNAME(wcs_buffer, FIND_LENGTH);
43310d63b7dSRichard Lowe prop2 = get_prop(dmake_name2->prop, macro_prop);
43410d63b7dSRichard Lowe // If we're invoked as 'make' run serially, regardless of DMAKE_MODE
43510d63b7dSRichard Lowe // If we're invoked as 'make' but passed -j, run parallel
43610d63b7dSRichard Lowe // If we're invoked as 'dmake', without DMAKE_MODE, default parallel
43710d63b7dSRichard Lowe // If we're invoked as 'dmake' and DMAKE_MODE is set, honour it.
43810d63b7dSRichard Lowe if ((strcmp(b, "make") == 0) &&
43910d63b7dSRichard Lowe !dmake_max_jobs_specified) {
44010d63b7dSRichard Lowe dmake_mode_type = serial_mode;
44110d63b7dSRichard Lowe no_parallel = true;
44210d63b7dSRichard Lowe } else if (prop2 == NULL) {
44310d63b7dSRichard Lowe /* DMAKE_MODE not defined, default based on our name */
44410d63b7dSRichard Lowe if (strcmp(b, "dmake") == 0) {
44510d63b7dSRichard Lowe dmake_mode_type = parallel_mode;
44610d63b7dSRichard Lowe no_parallel = false;
44710d63b7dSRichard Lowe }
44810d63b7dSRichard Lowe } else {
44910d63b7dSRichard Lowe dmake_value2 = prop2->body.macro.value;
45010d63b7dSRichard Lowe if (IS_EQUAL(dmake_value2->string_mb, "parallel")) {
45110d63b7dSRichard Lowe dmake_mode_type = parallel_mode;
45210d63b7dSRichard Lowe no_parallel = false;
45310d63b7dSRichard Lowe } else if (IS_EQUAL(dmake_value2->string_mb, "serial")) {
45410d63b7dSRichard Lowe dmake_mode_type = serial_mode;
45510d63b7dSRichard Lowe no_parallel = true;
45610d63b7dSRichard Lowe } else {
45710d63b7dSRichard Lowe fatal(gettext("Unknown dmake mode argument `%s' after -m flag"), dmake_value2->string_mb);
45810d63b7dSRichard Lowe }
45910d63b7dSRichard Lowe }
46010d63b7dSRichard Lowe free(s);
46110d63b7dSRichard Lowe }
46210d63b7dSRichard Lowe
46310d63b7dSRichard Lowe parallel_flag = true;
46410d63b7dSRichard Lowe putenv(strdup("DMAKE_CHILD=TRUE"));
46510d63b7dSRichard Lowe
46610d63b7dSRichard Lowe //
46710d63b7dSRichard Lowe // If dmake is running with -t option, set dmake_mode_type to serial.
46810d63b7dSRichard Lowe // This is done because doname() calls touch_command() that runs serially.
469ae389aa9SAndy Fiddaman // If we do not do that, maketool will have problems.
47010d63b7dSRichard Lowe //
47110d63b7dSRichard Lowe if(touch) {
47210d63b7dSRichard Lowe dmake_mode_type = serial_mode;
47310d63b7dSRichard Lowe no_parallel = true;
47410d63b7dSRichard Lowe }
47510d63b7dSRichard Lowe
47610d63b7dSRichard Lowe /*
47710d63b7dSRichard Lowe * Check whether stdout and stderr are physically same.
47810d63b7dSRichard Lowe * This is in order to decide whether we need to redirect
47910d63b7dSRichard Lowe * stderr separately from stdout.
48010d63b7dSRichard Lowe * This check is performed only if __DMAKE_SEPARATE_STDERR
48110d63b7dSRichard Lowe * is not set. This variable may be used in order to preserve
48210d63b7dSRichard Lowe * the 'old' behaviour.
48310d63b7dSRichard Lowe */
48410d63b7dSRichard Lowe out_err_same = true;
48510d63b7dSRichard Lowe char * dmake_sep_var = getenv("__DMAKE_SEPARATE_STDERR");
48610d63b7dSRichard Lowe if (dmake_sep_var == NULL || (0 != strcasecmp(dmake_sep_var, "NO"))) {
48710d63b7dSRichard Lowe struct stat stdout_stat;
48810d63b7dSRichard Lowe struct stat stderr_stat;
48910d63b7dSRichard Lowe if( (fstat(1, &stdout_stat) == 0)
49010d63b7dSRichard Lowe && (fstat(2, &stderr_stat) == 0) )
49110d63b7dSRichard Lowe {
49210d63b7dSRichard Lowe if( (stdout_stat.st_dev != stderr_stat.st_dev)
49310d63b7dSRichard Lowe || (stdout_stat.st_ino != stderr_stat.st_ino) )
49410d63b7dSRichard Lowe {
49510d63b7dSRichard Lowe out_err_same = false;
49610d63b7dSRichard Lowe }
49710d63b7dSRichard Lowe }
49810d63b7dSRichard Lowe }
49910d63b7dSRichard Lowe
500ae389aa9SAndy Fiddaman
50110d63b7dSRichard Lowe /*
50210d63b7dSRichard Lowe * Enable interrupt handler for alarms
50310d63b7dSRichard Lowe */
50410d63b7dSRichard Lowe (void) bsd_signal(SIGALRM, (SIG_PF)doalarm);
50510d63b7dSRichard Lowe
50610d63b7dSRichard Lowe /*
50710d63b7dSRichard Lowe * Check if make should report
50810d63b7dSRichard Lowe */
50910d63b7dSRichard Lowe if (getenv(sunpro_dependencies->string_mb) != NULL) {
51010d63b7dSRichard Lowe FILE *report_file;
51110d63b7dSRichard Lowe
51210d63b7dSRichard Lowe report_dependency("");
51310d63b7dSRichard Lowe report_file = get_report_file();
51410d63b7dSRichard Lowe if ((report_file != NULL) && (report_file != (FILE*)-1)) {
51510d63b7dSRichard Lowe (void) fprintf(report_file, "\n");
51610d63b7dSRichard Lowe }
51710d63b7dSRichard Lowe }
51810d63b7dSRichard Lowe
51910d63b7dSRichard Lowe /*
52010d63b7dSRichard Lowe * Make sure SUNPRO_DEPENDENCIES is exported (or not) properly.
52110d63b7dSRichard Lowe */
52210d63b7dSRichard Lowe if (keep_state) {
52310d63b7dSRichard Lowe maybe_append_prop(sunpro_dependencies, macro_prop)->
52410d63b7dSRichard Lowe body.macro.exported = true;
52510d63b7dSRichard Lowe } else {
52610d63b7dSRichard Lowe maybe_append_prop(sunpro_dependencies, macro_prop)->
52710d63b7dSRichard Lowe body.macro.exported = false;
52810d63b7dSRichard Lowe }
52910d63b7dSRichard Lowe
53010d63b7dSRichard Lowe working_on_targets = true;
53110d63b7dSRichard Lowe if (trace_status) {
53210d63b7dSRichard Lowe dump_make_state();
53310d63b7dSRichard Lowe fclose(stdout);
53410d63b7dSRichard Lowe fclose(stderr);
53510d63b7dSRichard Lowe exit_status = 0;
53610d63b7dSRichard Lowe exit(0);
53710d63b7dSRichard Lowe }
53810d63b7dSRichard Lowe if (list_all_targets) {
53910d63b7dSRichard Lowe dump_target_list();
54010d63b7dSRichard Lowe fclose(stdout);
54110d63b7dSRichard Lowe fclose(stderr);
54210d63b7dSRichard Lowe exit_status = 0;
54310d63b7dSRichard Lowe exit(0);
54410d63b7dSRichard Lowe }
54510d63b7dSRichard Lowe trace_reader = false;
54610d63b7dSRichard Lowe
547ae389aa9SAndy Fiddaman /*
548ae389aa9SAndy Fiddaman * Set temp_file_directory to the directory the .make.state
549ae389aa9SAndy Fiddaman * file is written to.
550ae389aa9SAndy Fiddaman */
551ae389aa9SAndy Fiddaman if ((slash_ptr = strrchr(make_state->string_mb, (int) slash_char)) == NULL) {
552ae389aa9SAndy Fiddaman temp_file_directory = strdup(get_current_path());
553ae389aa9SAndy Fiddaman } else {
554ae389aa9SAndy Fiddaman *slash_ptr = (int) nul_char;
555ae389aa9SAndy Fiddaman (void) strcpy(make_state_dir, make_state->string_mb);
556ae389aa9SAndy Fiddaman *slash_ptr = (int) slash_char;
55710d63b7dSRichard Lowe /* when there is only one slash and it's the first
55810d63b7dSRichard Lowe ** character, make_state_dir should point to '/'.
55910d63b7dSRichard Lowe */
56010d63b7dSRichard Lowe if(make_state_dir[0] == '\0') {
56110d63b7dSRichard Lowe make_state_dir[0] = '/';
56210d63b7dSRichard Lowe make_state_dir[1] = '\0';
56310d63b7dSRichard Lowe }
564ae389aa9SAndy Fiddaman if (make_state_dir[0] == (int) slash_char) {
565ae389aa9SAndy Fiddaman temp_file_directory = strdup(make_state_dir);
566ae389aa9SAndy Fiddaman } else {
567ae389aa9SAndy Fiddaman char tmp_current_path2[MAXPATHLEN];
568ae389aa9SAndy Fiddaman
569ae389aa9SAndy Fiddaman (void) sprintf(tmp_current_path2,
570ae389aa9SAndy Fiddaman "%s/%s",
571ae389aa9SAndy Fiddaman get_current_path(),
572ae389aa9SAndy Fiddaman make_state_dir);
573ae389aa9SAndy Fiddaman temp_file_directory = strdup(tmp_current_path2);
574ae389aa9SAndy Fiddaman }
575ae389aa9SAndy Fiddaman }
57610d63b7dSRichard Lowe
57710d63b7dSRichard Lowe
57810d63b7dSRichard Lowe report_dir_enter_leave(true);
57910d63b7dSRichard Lowe
58010d63b7dSRichard Lowe make_targets(argc, argv, parallel_flag);
58110d63b7dSRichard Lowe
58210d63b7dSRichard Lowe report_dir_enter_leave(false);
58310d63b7dSRichard Lowe
58410d63b7dSRichard Lowe if (build_failed_ever_seen) {
58510d63b7dSRichard Lowe if (posix) {
58610d63b7dSRichard Lowe exit_status = 1;
58710d63b7dSRichard Lowe }
58810d63b7dSRichard Lowe exit(1);
58910d63b7dSRichard Lowe }
59010d63b7dSRichard Lowe exit_status = 0;
59110d63b7dSRichard Lowe exit(0);
59210d63b7dSRichard Lowe /* NOTREACHED */
59310d63b7dSRichard Lowe }
59410d63b7dSRichard Lowe
59510d63b7dSRichard Lowe /*
59610d63b7dSRichard Lowe * cleanup_after_exit()
59710d63b7dSRichard Lowe *
59810d63b7dSRichard Lowe * Called from exit(), performs cleanup actions.
59910d63b7dSRichard Lowe *
60010d63b7dSRichard Lowe * Parameters:
60110d63b7dSRichard Lowe * status The argument exit() was called with
60210d63b7dSRichard Lowe * arg Address of an argument vector to
60310d63b7dSRichard Lowe * cleanup_after_exit()
60410d63b7dSRichard Lowe *
60510d63b7dSRichard Lowe * Global variables used:
60610d63b7dSRichard Lowe * command_changed Set if we think .make.state should be rewritten
60710d63b7dSRichard Lowe * current_line Is set we set commands_changed
60810d63b7dSRichard Lowe * do_not_exec_rule
60910d63b7dSRichard Lowe * True if -n flag on
61010d63b7dSRichard Lowe * done The Name ".DONE", rule we run
61110d63b7dSRichard Lowe * keep_state Set if .KEEP_STATE seen
61210d63b7dSRichard Lowe * parallel True if building in parallel
61310d63b7dSRichard Lowe * quest If -q is on we do not run .DONE
61410d63b7dSRichard Lowe * report_dependencies
61510d63b7dSRichard Lowe * True if -P flag on
61610d63b7dSRichard Lowe * running_list List of parallel running processes
61710d63b7dSRichard Lowe * temp_file_name The temp file is removed, if any
61810d63b7dSRichard Lowe */
61910d63b7dSRichard Lowe extern "C" void
cleanup_after_exit(void)62010d63b7dSRichard Lowe cleanup_after_exit(void)
62110d63b7dSRichard Lowe {
62210d63b7dSRichard Lowe Running rp;
62310d63b7dSRichard Lowe
62410d63b7dSRichard Lowe extern long getname_bytes_count;
62510d63b7dSRichard Lowe extern long getname_names_count;
62610d63b7dSRichard Lowe extern long getname_struct_count;
62710d63b7dSRichard Lowe extern long freename_bytes_count;
62810d63b7dSRichard Lowe extern long freename_names_count;
62910d63b7dSRichard Lowe extern long freename_struct_count;
63010d63b7dSRichard Lowe extern long other_alloc;
63110d63b7dSRichard Lowe
63210d63b7dSRichard Lowe extern long env_alloc_num;
63310d63b7dSRichard Lowe extern long env_alloc_bytes;
63410d63b7dSRichard Lowe
63510d63b7dSRichard Lowe
63610d63b7dSRichard Lowe #ifdef DMAKE_STATISTICS
63710d63b7dSRichard Lowe if(getname_stat) {
63810d63b7dSRichard Lowe printf(">>> Getname statistics:\n");
63910d63b7dSRichard Lowe printf(" Allocated:\n");
64010d63b7dSRichard Lowe printf(" Names: %ld\n", getname_names_count);
64110d63b7dSRichard Lowe printf(" Strings: %ld Kb (%ld bytes)\n", getname_bytes_count/1000, getname_bytes_count);
64210d63b7dSRichard Lowe printf(" Structs: %ld Kb (%ld bytes)\n", getname_struct_count/1000, getname_struct_count);
64310d63b7dSRichard Lowe printf(" Total bytes: %ld Kb (%ld bytes)\n", getname_struct_count/1000 + getname_bytes_count/1000, getname_struct_count + getname_bytes_count);
64410d63b7dSRichard Lowe
64510d63b7dSRichard Lowe printf("\n Unallocated: %ld\n", freename_names_count);
64610d63b7dSRichard Lowe printf(" Names: %ld\n", freename_names_count);
64710d63b7dSRichard Lowe printf(" Strings: %ld Kb (%ld bytes)\n", freename_bytes_count/1000, freename_bytes_count);
64810d63b7dSRichard Lowe printf(" Structs: %ld Kb (%ld bytes)\n", freename_struct_count/1000, freename_struct_count);
64910d63b7dSRichard Lowe printf(" Total bytes: %ld Kb (%ld bytes)\n", freename_struct_count/1000 + freename_bytes_count/1000, freename_struct_count + freename_bytes_count);
65010d63b7dSRichard Lowe
65110d63b7dSRichard Lowe printf("\n Total used: %ld Kb (%ld bytes)\n", (getname_struct_count/1000 + getname_bytes_count/1000) - (freename_struct_count/1000 + freename_bytes_count/1000), (getname_struct_count + getname_bytes_count) - (freename_struct_count + freename_bytes_count));
65210d63b7dSRichard Lowe
65310d63b7dSRichard Lowe printf("\n>>> Other:\n");
65410d63b7dSRichard Lowe printf(
65510d63b7dSRichard Lowe " Env (%ld): %ld Kb (%ld bytes)\n",
65610d63b7dSRichard Lowe env_alloc_num,
65710d63b7dSRichard Lowe env_alloc_bytes/1000,
65810d63b7dSRichard Lowe env_alloc_bytes
65910d63b7dSRichard Lowe );
66010d63b7dSRichard Lowe
66110d63b7dSRichard Lowe }
66210d63b7dSRichard Lowe #endif
66310d63b7dSRichard Lowe
66410d63b7dSRichard Lowe parallel = false;
66510d63b7dSRichard Lowe /* If we used the SVR4_MAKE, don't build .DONE or .FAILED */
66610d63b7dSRichard Lowe if (!getenv(USE_SVR4_MAKE)){
66710d63b7dSRichard Lowe /* Build the target .DONE or .FAILED if we caught an error */
66810d63b7dSRichard Lowe if (!quest && !list_all_targets) {
66910d63b7dSRichard Lowe Name failed_name;
67010d63b7dSRichard Lowe
67110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".FAILED");
67210d63b7dSRichard Lowe failed_name = GETNAME(wcs_buffer, FIND_LENGTH);
67310d63b7dSRichard Lowe if ((exit_status != 0) && (failed_name->prop != NULL)) {
67410d63b7dSRichard Lowe /*
67510d63b7dSRichard Lowe * [tolik] switch DMake to serial mode
67610d63b7dSRichard Lowe */
67710d63b7dSRichard Lowe dmake_mode_type = serial_mode;
67810d63b7dSRichard Lowe no_parallel = true;
67910d63b7dSRichard Lowe (void) doname(failed_name, false, true);
68010d63b7dSRichard Lowe } else {
68110d63b7dSRichard Lowe if (!trace_status) {
68210d63b7dSRichard Lowe /*
68310d63b7dSRichard Lowe * Switch DMake to serial mode
68410d63b7dSRichard Lowe */
68510d63b7dSRichard Lowe dmake_mode_type = serial_mode;
68610d63b7dSRichard Lowe no_parallel = true;
68710d63b7dSRichard Lowe (void) doname(done, false, true);
68810d63b7dSRichard Lowe }
68910d63b7dSRichard Lowe }
69010d63b7dSRichard Lowe }
69110d63b7dSRichard Lowe }
69210d63b7dSRichard Lowe /*
69310d63b7dSRichard Lowe * Remove the temp file utilities report dependencies thru if it
69410d63b7dSRichard Lowe * is still around
69510d63b7dSRichard Lowe */
69610d63b7dSRichard Lowe if (temp_file_name != NULL) {
69710d63b7dSRichard Lowe (void) unlink(temp_file_name->string_mb);
69810d63b7dSRichard Lowe }
69910d63b7dSRichard Lowe /*
70010d63b7dSRichard Lowe * Do not save the current command in .make.state if make
70110d63b7dSRichard Lowe * was interrupted.
70210d63b7dSRichard Lowe */
70310d63b7dSRichard Lowe if (current_line != NULL) {
70410d63b7dSRichard Lowe command_changed = true;
70510d63b7dSRichard Lowe current_line->body.line.command_used = NULL;
70610d63b7dSRichard Lowe }
70710d63b7dSRichard Lowe /*
70810d63b7dSRichard Lowe * For each parallel build process running, remove the temp files
70910d63b7dSRichard Lowe * and zap the command line so it won't be put in .make.state
71010d63b7dSRichard Lowe */
71110d63b7dSRichard Lowe for (rp = running_list; rp != NULL; rp = rp->next) {
71210d63b7dSRichard Lowe if (rp->temp_file != NULL) {
71310d63b7dSRichard Lowe (void) unlink(rp->temp_file->string_mb);
71410d63b7dSRichard Lowe }
71510d63b7dSRichard Lowe if (rp->stdout_file != NULL) {
71610d63b7dSRichard Lowe (void) unlink(rp->stdout_file);
71710d63b7dSRichard Lowe retmem_mb(rp->stdout_file);
71810d63b7dSRichard Lowe rp->stdout_file = NULL;
71910d63b7dSRichard Lowe }
72010d63b7dSRichard Lowe if (rp->stderr_file != NULL) {
72110d63b7dSRichard Lowe (void) unlink(rp->stderr_file);
72210d63b7dSRichard Lowe retmem_mb(rp->stderr_file);
72310d63b7dSRichard Lowe rp->stderr_file = NULL;
72410d63b7dSRichard Lowe }
72510d63b7dSRichard Lowe command_changed = true;
72610d63b7dSRichard Lowe /*
72710d63b7dSRichard Lowe line = get_prop(rp->target->prop, line_prop);
72810d63b7dSRichard Lowe if (line != NULL) {
72910d63b7dSRichard Lowe line->body.line.command_used = NULL;
73010d63b7dSRichard Lowe }
73110d63b7dSRichard Lowe */
73210d63b7dSRichard Lowe }
73310d63b7dSRichard Lowe /* Remove the statefile lock file if the file has been locked */
73410d63b7dSRichard Lowe if ((make_state_lockfile != NULL) && (make_state_locked)) {
73510d63b7dSRichard Lowe (void) unlink(make_state_lockfile);
73610d63b7dSRichard Lowe make_state_lockfile = NULL;
73710d63b7dSRichard Lowe make_state_locked = false;
73810d63b7dSRichard Lowe }
73910d63b7dSRichard Lowe /* Write .make.state */
74010d63b7dSRichard Lowe write_state_file(1, (Boolean) 1);
74110d63b7dSRichard Lowe
74210d63b7dSRichard Lowe job_adjust_fini();
74310d63b7dSRichard Lowe }
74410d63b7dSRichard Lowe
74510d63b7dSRichard Lowe /*
74610d63b7dSRichard Lowe * handle_interrupt()
74710d63b7dSRichard Lowe *
74810d63b7dSRichard Lowe * This is where C-C traps are caught.
74910d63b7dSRichard Lowe *
75010d63b7dSRichard Lowe * Parameters:
75110d63b7dSRichard Lowe *
75210d63b7dSRichard Lowe * Global variables used (except DMake 1.0):
75310d63b7dSRichard Lowe * current_target Sometimes the current target is removed
75410d63b7dSRichard Lowe * do_not_exec_rule But not if -n is on
75510d63b7dSRichard Lowe * quest or -q
75610d63b7dSRichard Lowe * running_list List of parallel running processes
75710d63b7dSRichard Lowe * touch Current target is not removed if -t on
75810d63b7dSRichard Lowe */
75910d63b7dSRichard Lowe void
handle_interrupt(int)76010d63b7dSRichard Lowe handle_interrupt(int)
76110d63b7dSRichard Lowe {
76210d63b7dSRichard Lowe Property member;
76310d63b7dSRichard Lowe Running rp;
76410d63b7dSRichard Lowe
76510d63b7dSRichard Lowe (void) fflush(stdout);
76610d63b7dSRichard Lowe if (childPid > 0) {
76710d63b7dSRichard Lowe kill(childPid, SIGTERM);
76810d63b7dSRichard Lowe childPid = -1;
76910d63b7dSRichard Lowe }
77010d63b7dSRichard Lowe for (rp = running_list; rp != NULL; rp = rp->next) {
77110d63b7dSRichard Lowe if (rp->state != build_running) {
77210d63b7dSRichard Lowe continue;
77310d63b7dSRichard Lowe }
77410d63b7dSRichard Lowe if (rp->pid > 0) {
77510d63b7dSRichard Lowe kill(rp->pid, SIGTERM);
77610d63b7dSRichard Lowe rp->pid = -1;
77710d63b7dSRichard Lowe }
77810d63b7dSRichard Lowe }
77910d63b7dSRichard Lowe if (getpid() == getpgrp()) {
78010d63b7dSRichard Lowe bsd_signal(SIGTERM, SIG_IGN);
78110d63b7dSRichard Lowe kill (-getpid(), SIGTERM);
78210d63b7dSRichard Lowe }
78310d63b7dSRichard Lowe /* Clean up all parallel children already finished */
78410d63b7dSRichard Lowe finish_children(false);
78510d63b7dSRichard Lowe
78610d63b7dSRichard Lowe /* Make sure the processes running under us terminate first */
78710d63b7dSRichard Lowe
78810d63b7dSRichard Lowe while (wait((int *) NULL) != -1);
78910d63b7dSRichard Lowe /* Delete the current targets unless they are precious */
79010d63b7dSRichard Lowe if ((current_target != NULL) &&
79110d63b7dSRichard Lowe current_target->is_member &&
79210d63b7dSRichard Lowe ((member = get_prop(current_target->prop, member_prop)) != NULL)) {
79310d63b7dSRichard Lowe current_target = member->body.member.library;
79410d63b7dSRichard Lowe }
79510d63b7dSRichard Lowe if (!do_not_exec_rule &&
79610d63b7dSRichard Lowe !touch &&
79710d63b7dSRichard Lowe !quest &&
79810d63b7dSRichard Lowe (current_target != NULL) &&
79910d63b7dSRichard Lowe !(current_target->stat.is_precious || all_precious)) {
80010d63b7dSRichard Lowe
80110d63b7dSRichard Lowe /* BID_1030811 */
80210d63b7dSRichard Lowe /* azv 16 Oct 95 */
803ae389aa9SAndy Fiddaman current_target->stat.time = file_no_time;
80410d63b7dSRichard Lowe
80510d63b7dSRichard Lowe if (exists(current_target) != file_doesnt_exist) {
80610d63b7dSRichard Lowe (void) fprintf(stderr,
80710d63b7dSRichard Lowe "\n*** %s ",
80810d63b7dSRichard Lowe current_target->string_mb);
80910d63b7dSRichard Lowe if (current_target->stat.is_dir) {
81010d63b7dSRichard Lowe (void) fprintf(stderr,
81110d63b7dSRichard Lowe gettext("not removed.\n"),
81210d63b7dSRichard Lowe current_target->string_mb);
81310d63b7dSRichard Lowe } else if (unlink(current_target->string_mb) == 0) {
81410d63b7dSRichard Lowe (void) fprintf(stderr,
81510d63b7dSRichard Lowe gettext("removed.\n"),
81610d63b7dSRichard Lowe current_target->string_mb);
81710d63b7dSRichard Lowe } else {
81810d63b7dSRichard Lowe (void) fprintf(stderr,
81910d63b7dSRichard Lowe gettext("could not be removed: %s.\n"),
82010d63b7dSRichard Lowe current_target->string_mb,
82110d63b7dSRichard Lowe errmsg(errno));
82210d63b7dSRichard Lowe }
82310d63b7dSRichard Lowe }
82410d63b7dSRichard Lowe }
82510d63b7dSRichard Lowe for (rp = running_list; rp != NULL; rp = rp->next) {
82610d63b7dSRichard Lowe if (rp->state != build_running) {
82710d63b7dSRichard Lowe continue;
82810d63b7dSRichard Lowe }
82910d63b7dSRichard Lowe if (rp->target->is_member &&
83010d63b7dSRichard Lowe ((member = get_prop(rp->target->prop, member_prop)) !=
83110d63b7dSRichard Lowe NULL)) {
83210d63b7dSRichard Lowe rp->target = member->body.member.library;
83310d63b7dSRichard Lowe }
83410d63b7dSRichard Lowe if (!do_not_exec_rule &&
83510d63b7dSRichard Lowe !touch &&
83610d63b7dSRichard Lowe !quest &&
83710d63b7dSRichard Lowe !(rp->target->stat.is_precious || all_precious)) {
83810d63b7dSRichard Lowe
839ae389aa9SAndy Fiddaman rp->target->stat.time = file_no_time;
84010d63b7dSRichard Lowe if (exists(rp->target) != file_doesnt_exist) {
84110d63b7dSRichard Lowe (void) fprintf(stderr,
84210d63b7dSRichard Lowe "\n*** %s ",
84310d63b7dSRichard Lowe rp->target->string_mb);
84410d63b7dSRichard Lowe if (rp->target->stat.is_dir) {
84510d63b7dSRichard Lowe (void) fprintf(stderr,
84610d63b7dSRichard Lowe gettext("not removed.\n"),
84710d63b7dSRichard Lowe rp->target->string_mb);
84810d63b7dSRichard Lowe } else if (unlink(rp->target->string_mb) == 0) {
84910d63b7dSRichard Lowe (void) fprintf(stderr,
85010d63b7dSRichard Lowe gettext("removed.\n"),
85110d63b7dSRichard Lowe rp->target->string_mb);
85210d63b7dSRichard Lowe } else {
85310d63b7dSRichard Lowe (void) fprintf(stderr,
85410d63b7dSRichard Lowe gettext("could not be removed: %s.\n"),
85510d63b7dSRichard Lowe rp->target->string_mb,
85610d63b7dSRichard Lowe errmsg(errno));
85710d63b7dSRichard Lowe }
85810d63b7dSRichard Lowe }
85910d63b7dSRichard Lowe }
86010d63b7dSRichard Lowe }
86110d63b7dSRichard Lowe
86210d63b7dSRichard Lowe
86310d63b7dSRichard Lowe /* Have we locked .make.state or .nse_depinfo? */
86410d63b7dSRichard Lowe if ((make_state_lockfile != NULL) && (make_state_locked)) {
86510d63b7dSRichard Lowe unlink(make_state_lockfile);
86610d63b7dSRichard Lowe make_state_lockfile = NULL;
86710d63b7dSRichard Lowe make_state_locked = false;
86810d63b7dSRichard Lowe }
86910d63b7dSRichard Lowe /*
87010d63b7dSRichard Lowe * Re-read .make.state file (it might be changed by recursive make)
87110d63b7dSRichard Lowe */
87210d63b7dSRichard Lowe check_state(NULL);
87310d63b7dSRichard Lowe
87410d63b7dSRichard Lowe report_dir_enter_leave(false);
87510d63b7dSRichard Lowe
87610d63b7dSRichard Lowe exit_status = 2;
87710d63b7dSRichard Lowe exit(2);
87810d63b7dSRichard Lowe }
87910d63b7dSRichard Lowe
88010d63b7dSRichard Lowe /*
88110d63b7dSRichard Lowe * doalarm(sig, ...)
88210d63b7dSRichard Lowe *
88310d63b7dSRichard Lowe * Handle the alarm interrupt but do nothing. Side effect is to
88410d63b7dSRichard Lowe * cause return from wait3.
88510d63b7dSRichard Lowe *
88610d63b7dSRichard Lowe * Parameters:
88710d63b7dSRichard Lowe * sig
88810d63b7dSRichard Lowe *
88910d63b7dSRichard Lowe * Global variables used:
89010d63b7dSRichard Lowe */
89110d63b7dSRichard Lowe static void
doalarm(int sig)892ae389aa9SAndy Fiddaman doalarm(int sig __attribute__((unused)))
89310d63b7dSRichard Lowe {
89410d63b7dSRichard Lowe return;
89510d63b7dSRichard Lowe }
89610d63b7dSRichard Lowe
89710d63b7dSRichard Lowe
89810d63b7dSRichard Lowe /*
89910d63b7dSRichard Lowe * read_command_options(argc, argv)
90010d63b7dSRichard Lowe *
90110d63b7dSRichard Lowe * Scan the cmd line options and process the ones that start with "-"
90210d63b7dSRichard Lowe *
90310d63b7dSRichard Lowe * Return value:
90410d63b7dSRichard Lowe * -M argument, if any
90510d63b7dSRichard Lowe *
90610d63b7dSRichard Lowe * Parameters:
90710d63b7dSRichard Lowe * argc You know what this is
90810d63b7dSRichard Lowe * argv You know what this is
90910d63b7dSRichard Lowe *
91010d63b7dSRichard Lowe * Global variables used:
91110d63b7dSRichard Lowe */
91210d63b7dSRichard Lowe static void
read_command_options(int argc,char ** argv)913*e7afc443SToomas Soome read_command_options(int argc, char **argv)
91410d63b7dSRichard Lowe {
915*e7afc443SToomas Soome int ch;
91610d63b7dSRichard Lowe int current_optind = 1;
91710d63b7dSRichard Lowe int last_optind_with_double_hyphen = 0;
91810d63b7dSRichard Lowe int last_optind;
91910d63b7dSRichard Lowe int last_current_optind;
920*e7afc443SToomas Soome int i;
921*e7afc443SToomas Soome int j;
922*e7afc443SToomas Soome int k;
923*e7afc443SToomas Soome int makefile_next = 0; /*
92410d63b7dSRichard Lowe * flag to note options:
92510d63b7dSRichard Lowe * -c, f, g, j, m, o
92610d63b7dSRichard Lowe */
92710d63b7dSRichard Lowe const char *tptr;
92810d63b7dSRichard Lowe const char *CMD_OPTS;
92910d63b7dSRichard Lowe
93010d63b7dSRichard Lowe extern char *optarg;
93110d63b7dSRichard Lowe extern int optind, opterr, optopt;
93210d63b7dSRichard Lowe
93336cd0120SRobert Mustacchi #define SUNPRO_CMD_OPTS "-~Bbc:C:Ddef:g:ij:K:kM:m:NnO:o:PpqRrSsTtuVvwx:"
93410d63b7dSRichard Lowe
93536cd0120SRobert Mustacchi # define SVR4_CMD_OPTS "-c:C:ef:g:ij:km:nO:o:pqrsTtVv"
93610d63b7dSRichard Lowe
93710d63b7dSRichard Lowe /*
93810d63b7dSRichard Lowe * Added V in SVR4_CMD_OPTS also, which is going to be a hidden
93910d63b7dSRichard Lowe * option, just to make sure that the getopt doesn't fail when some
94010d63b7dSRichard Lowe * users leave their USE_SVR4_MAKE set and try to use the makefiles
94110d63b7dSRichard Lowe * that are designed to issue commands like $(MAKE) -V. Anyway it
94210d63b7dSRichard Lowe * sets the same flag but ensures that getopt doesn't fail.
94310d63b7dSRichard Lowe */
94410d63b7dSRichard Lowe
94510d63b7dSRichard Lowe opterr = 0;
94610d63b7dSRichard Lowe optind = 1;
94710d63b7dSRichard Lowe while (1) {
94810d63b7dSRichard Lowe last_optind=optind; /* Save optind and current_optind values */
94910d63b7dSRichard Lowe last_current_optind=current_optind; /* in case we have to repeat this round. */
95010d63b7dSRichard Lowe if (svr4) {
95110d63b7dSRichard Lowe CMD_OPTS=SVR4_CMD_OPTS;
95210d63b7dSRichard Lowe ch = getopt(argc, argv, SVR4_CMD_OPTS);
95310d63b7dSRichard Lowe } else {
95410d63b7dSRichard Lowe CMD_OPTS=SUNPRO_CMD_OPTS;
95510d63b7dSRichard Lowe ch = getopt(argc, argv, SUNPRO_CMD_OPTS);
95610d63b7dSRichard Lowe }
95710d63b7dSRichard Lowe if (ch == EOF) {
95810d63b7dSRichard Lowe if(optind < argc) {
95910d63b7dSRichard Lowe /*
96010d63b7dSRichard Lowe * Fixing bug 4102537:
96110d63b7dSRichard Lowe * Strange behaviour of command make using -- option.
96210d63b7dSRichard Lowe * Not all argv have been processed
96310d63b7dSRichard Lowe * Skip non-flag argv and continue processing.
96410d63b7dSRichard Lowe */
96510d63b7dSRichard Lowe optind++;
96610d63b7dSRichard Lowe current_optind++;
96710d63b7dSRichard Lowe continue;
96810d63b7dSRichard Lowe } else {
96910d63b7dSRichard Lowe break;
97010d63b7dSRichard Lowe }
97110d63b7dSRichard Lowe
97210d63b7dSRichard Lowe }
97310d63b7dSRichard Lowe if (ch == '?') {
974ae389aa9SAndy Fiddaman if (optopt == '-') {
97510d63b7dSRichard Lowe /* Bug 5060758: getopt() changed behavior (s10_60),
97610d63b7dSRichard Lowe * and now we have to deal with cases when options
97710d63b7dSRichard Lowe * with double hyphen appear here, from -$(MAKEFLAGS)
97810d63b7dSRichard Lowe */
97910d63b7dSRichard Lowe i = current_optind;
98010d63b7dSRichard Lowe if (argv[i][0] == '-') {
98110d63b7dSRichard Lowe if (argv[i][1] == '-') {
98210d63b7dSRichard Lowe if (argv[i][2] != '\0') {
98310d63b7dSRichard Lowe /* Check if this option is allowed */
98410d63b7dSRichard Lowe tptr = strchr(CMD_OPTS, argv[i][2]);
98510d63b7dSRichard Lowe if (tptr) {
98610d63b7dSRichard Lowe if (last_optind_with_double_hyphen != current_optind) {
98710d63b7dSRichard Lowe /* This is first time we are trying to fix "--"
988ae389aa9SAndy Fiddaman * problem with this option. If we come here second
98910d63b7dSRichard Lowe * time, we will go to fatal error.
99010d63b7dSRichard Lowe */
99110d63b7dSRichard Lowe last_optind_with_double_hyphen = current_optind;
992ae389aa9SAndy Fiddaman
99310d63b7dSRichard Lowe /* Eliminate first hyphen character */
99410d63b7dSRichard Lowe for (j=0; argv[i][j] != '\0'; j++) {
99510d63b7dSRichard Lowe argv[i][j] = argv[i][j+1];
99610d63b7dSRichard Lowe }
997ae389aa9SAndy Fiddaman
99810d63b7dSRichard Lowe /* Repeat the processing of this argument */
99910d63b7dSRichard Lowe optind=last_optind;
100010d63b7dSRichard Lowe current_optind=last_current_optind;
100110d63b7dSRichard Lowe continue;
100210d63b7dSRichard Lowe }
100310d63b7dSRichard Lowe }
100410d63b7dSRichard Lowe }
100510d63b7dSRichard Lowe }
100610d63b7dSRichard Lowe }
100710d63b7dSRichard Lowe }
100810d63b7dSRichard Lowe }
100910d63b7dSRichard Lowe
101010d63b7dSRichard Lowe if (ch == '?') {
101110d63b7dSRichard Lowe if (svr4) {
101210d63b7dSRichard Lowe fprintf(stderr,
101336cd0120SRobert Mustacchi gettext("Usage : dmake [ -f makefile ][ -c dmake_rcfile ][ -g dmake_group ][-C directory]\n"));
101410d63b7dSRichard Lowe fprintf(stderr,
101510d63b7dSRichard Lowe gettext(" [ -j dmake_max_jobs ][ -m dmake_mode ][ -o dmake_odir ]...\n"));
101610d63b7dSRichard Lowe fprintf(stderr,
101710d63b7dSRichard Lowe gettext(" [ -e ][ -i ][ -k ][ -n ][ -p ][ -q ][ -r ][ -s ][ -t ][ -v ]\n"));
101810d63b7dSRichard Lowe tptr = strchr(SVR4_CMD_OPTS, optopt);
101910d63b7dSRichard Lowe } else {
102010d63b7dSRichard Lowe fprintf(stderr,
102136cd0120SRobert Mustacchi gettext("Usage : dmake [ -f makefile ][ -c dmake_rcfile ][ -g dmake_group ][-C directory]\n"));
102210d63b7dSRichard Lowe fprintf(stderr,
102310d63b7dSRichard Lowe gettext(" [ -j dmake_max_jobs ][ -K statefile ][ -m dmake_mode ][ -x MODE_NAME=VALUE ][ -o dmake_odir ]...\n"));
102410d63b7dSRichard Lowe fprintf(stderr,
102510d63b7dSRichard Lowe gettext(" [ -d ][ -dd ][ -D ][ -DD ][ -e ][ -i ][ -k ][ -n ][ -p ][ -P ][ -u ][ -w ]\n"));
102610d63b7dSRichard Lowe fprintf(stderr,
102710d63b7dSRichard Lowe gettext(" [ -q ][ -r ][ -s ][ -S ][ -t ][ -v ][ -V ][ target... ][ macro=value... ][ \"macro +=value\"... ]\n"));
102810d63b7dSRichard Lowe tptr = strchr(SUNPRO_CMD_OPTS, optopt);
102910d63b7dSRichard Lowe }
103010d63b7dSRichard Lowe if (!tptr) {
103110d63b7dSRichard Lowe fatal(gettext("Unknown option `-%c'"), optopt);
103210d63b7dSRichard Lowe } else {
103310d63b7dSRichard Lowe fatal(gettext("Missing argument after `-%c'"), optopt);
103410d63b7dSRichard Lowe }
103510d63b7dSRichard Lowe }
103610d63b7dSRichard Lowe
103710d63b7dSRichard Lowe
103810d63b7dSRichard Lowe
103910d63b7dSRichard Lowe makefile_next |= parse_command_option(ch);
104010d63b7dSRichard Lowe /*
104110d63b7dSRichard Lowe * If we're done processing all of the options of
104210d63b7dSRichard Lowe * ONE argument string...
104310d63b7dSRichard Lowe */
104410d63b7dSRichard Lowe if (current_optind < optind) {
104510d63b7dSRichard Lowe i = current_optind;
104610d63b7dSRichard Lowe k = 0;
104710d63b7dSRichard Lowe /* If there's an argument for an option... */
104810d63b7dSRichard Lowe if ((optind - current_optind) > 1) {
104910d63b7dSRichard Lowe k = i + 1;
105010d63b7dSRichard Lowe }
105110d63b7dSRichard Lowe switch (makefile_next) {
105210d63b7dSRichard Lowe case 0:
105310d63b7dSRichard Lowe argv[i] = NULL;
105410d63b7dSRichard Lowe /* This shouldn't happen */
105510d63b7dSRichard Lowe if (k) {
105610d63b7dSRichard Lowe argv[k] = NULL;
105710d63b7dSRichard Lowe }
105810d63b7dSRichard Lowe break;
105910d63b7dSRichard Lowe case 1: /* -f seen */
106010d63b7dSRichard Lowe argv[i] = (char *)"-f";
106110d63b7dSRichard Lowe break;
106210d63b7dSRichard Lowe case 2: /* -c seen */
106310d63b7dSRichard Lowe argv[i] = (char *)"-c";
106410d63b7dSRichard Lowe break;
106510d63b7dSRichard Lowe case 4: /* -g seen */
106610d63b7dSRichard Lowe argv[i] = (char *)"-g";
106710d63b7dSRichard Lowe break;
106810d63b7dSRichard Lowe case 8: /* -j seen */
106910d63b7dSRichard Lowe argv[i] = (char *)"-j";
107010d63b7dSRichard Lowe break;
107110d63b7dSRichard Lowe case 16: /* -M seen */
107210d63b7dSRichard Lowe argv[i] = (char *)"-M";
107310d63b7dSRichard Lowe break;
107410d63b7dSRichard Lowe case 32: /* -m seen */
107510d63b7dSRichard Lowe argv[i] = (char *)"-m";
107610d63b7dSRichard Lowe break;
107710d63b7dSRichard Lowe case 128: /* -O seen */
107810d63b7dSRichard Lowe argv[i] = (char *)"-O";
107910d63b7dSRichard Lowe break;
108010d63b7dSRichard Lowe case 256: /* -K seen */
108110d63b7dSRichard Lowe argv[i] = (char *)"-K";
108210d63b7dSRichard Lowe break;
108310d63b7dSRichard Lowe case 512: /* -o seen */
108410d63b7dSRichard Lowe argv[i] = (char *)"-o";
108510d63b7dSRichard Lowe break;
108610d63b7dSRichard Lowe case 1024: /* -x seen */
108710d63b7dSRichard Lowe argv[i] = (char *)"-x";
108810d63b7dSRichard Lowe break;
108936cd0120SRobert Mustacchi case 2048:
109036cd0120SRobert Mustacchi argv[i] = (char *)"-C";
1091ae389aa9SAndy Fiddaman if (chdir(argv[k]) != 0) {
1092ae389aa9SAndy Fiddaman fatal(gettext("failed to change to directory %s: %s"),
1093ae389aa9SAndy Fiddaman argv[k], strerror(errno));
1094ae389aa9SAndy Fiddaman }
1095ae389aa9SAndy Fiddaman path_reset = true;
1096ae389aa9SAndy Fiddaman rebuild_arg0 = true;
1097ae389aa9SAndy Fiddaman (void) get_current_path();
109836cd0120SRobert Mustacchi break;
109910d63b7dSRichard Lowe default: /* > 1 of -c, f, g, j, K, M, m, O, o, x seen */
110010d63b7dSRichard Lowe fatal(gettext("Illegal command line. More than one option requiring\nan argument given in the same argument group"));
110110d63b7dSRichard Lowe }
110210d63b7dSRichard Lowe
110310d63b7dSRichard Lowe makefile_next = 0;
110410d63b7dSRichard Lowe current_optind = optind;
110510d63b7dSRichard Lowe }
110610d63b7dSRichard Lowe }
110710d63b7dSRichard Lowe }
110810d63b7dSRichard Lowe
110910d63b7dSRichard Lowe static void
quote_str(char * str,char * qstr)111010d63b7dSRichard Lowe quote_str(char *str, char *qstr)
111110d63b7dSRichard Lowe {
111210d63b7dSRichard Lowe char *to;
111310d63b7dSRichard Lowe char *from;
111410d63b7dSRichard Lowe
111510d63b7dSRichard Lowe to = qstr;
111610d63b7dSRichard Lowe for (from = str; *from; from++) {
111710d63b7dSRichard Lowe switch (*from) {
111810d63b7dSRichard Lowe case ';': /* End of command */
111910d63b7dSRichard Lowe case '(': /* Start group */
112010d63b7dSRichard Lowe case ')': /* End group */
112110d63b7dSRichard Lowe case '{': /* Start group */
112210d63b7dSRichard Lowe case '}': /* End group */
112310d63b7dSRichard Lowe case '[': /* Reg expr - any of a set of chars */
112410d63b7dSRichard Lowe case ']': /* End of set of chars */
112510d63b7dSRichard Lowe case '|': /* Pipe or logical-or */
112610d63b7dSRichard Lowe case '^': /* Old-fashioned pipe */
112710d63b7dSRichard Lowe case '&': /* Background or logical-and */
112810d63b7dSRichard Lowe case '<': /* Redirect stdin */
112910d63b7dSRichard Lowe case '>': /* Redirect stdout */
113010d63b7dSRichard Lowe case '*': /* Reg expr - any sequence of chars */
113110d63b7dSRichard Lowe case '?': /* Reg expr - any single char */
113210d63b7dSRichard Lowe case '$': /* Variable substitution */
113310d63b7dSRichard Lowe case '\'': /* Singe quote - turn off all magic */
113410d63b7dSRichard Lowe case '"': /* Double quote - span whitespace */
113510d63b7dSRichard Lowe case '`': /* Backquote - run a command */
113610d63b7dSRichard Lowe case '#': /* Comment */
113710d63b7dSRichard Lowe case ' ': /* Space (for MACRO=value1 value2 */
113810d63b7dSRichard Lowe case '\\': /* Escape char - turn off magic of next char */
113910d63b7dSRichard Lowe *to++ = '\\';
114010d63b7dSRichard Lowe break;
114110d63b7dSRichard Lowe
114210d63b7dSRichard Lowe default:
114310d63b7dSRichard Lowe break;
114410d63b7dSRichard Lowe }
114510d63b7dSRichard Lowe *to++ = *from;
114610d63b7dSRichard Lowe }
114710d63b7dSRichard Lowe *to = '\0';
114810d63b7dSRichard Lowe }
114910d63b7dSRichard Lowe
115010d63b7dSRichard Lowe static void
unquote_str(char * str,char * qstr)115110d63b7dSRichard Lowe unquote_str(char *str, char *qstr)
115210d63b7dSRichard Lowe {
115310d63b7dSRichard Lowe char *to;
115410d63b7dSRichard Lowe char *from;
115510d63b7dSRichard Lowe
115610d63b7dSRichard Lowe to = qstr;
115710d63b7dSRichard Lowe for (from = str; *from; from++) {
115810d63b7dSRichard Lowe if (*from == '\\') {
115910d63b7dSRichard Lowe from++;
116010d63b7dSRichard Lowe }
116110d63b7dSRichard Lowe *to++ = *from;
116210d63b7dSRichard Lowe }
116310d63b7dSRichard Lowe *to = '\0';
116410d63b7dSRichard Lowe }
116510d63b7dSRichard Lowe
116610d63b7dSRichard Lowe /*
116710d63b7dSRichard Lowe * Convert the MAKEFLAGS string value into a vector of char *, similar
116810d63b7dSRichard Lowe * to argv.
116910d63b7dSRichard Lowe */
117010d63b7dSRichard Lowe static void
setup_makeflags_argv()117110d63b7dSRichard Lowe setup_makeflags_argv()
117210d63b7dSRichard Lowe {
117310d63b7dSRichard Lowe char *cp;
117410d63b7dSRichard Lowe char *cp1;
117510d63b7dSRichard Lowe char *cp2;
117610d63b7dSRichard Lowe char *cp3;
117710d63b7dSRichard Lowe char *cp_orig;
117810d63b7dSRichard Lowe Boolean add_hyphen;
117910d63b7dSRichard Lowe int i;
118010d63b7dSRichard Lowe char tmp_char;
118110d63b7dSRichard Lowe
118210d63b7dSRichard Lowe mf_argc = 1;
118310d63b7dSRichard Lowe cp = getenv(makeflags->string_mb);
118410d63b7dSRichard Lowe cp_orig = cp;
118510d63b7dSRichard Lowe
118610d63b7dSRichard Lowe if (cp) {
118710d63b7dSRichard Lowe /*
118810d63b7dSRichard Lowe * If new MAKEFLAGS format, no need to add hyphen.
118910d63b7dSRichard Lowe * If old MAKEFLAGS format, add hyphen before flags.
119010d63b7dSRichard Lowe */
119110d63b7dSRichard Lowe
119210d63b7dSRichard Lowe if ((strchr(cp, (int) hyphen_char) != NULL) ||
119310d63b7dSRichard Lowe (strchr(cp, (int) equal_char) != NULL)) {
119410d63b7dSRichard Lowe
119510d63b7dSRichard Lowe /* New MAKEFLAGS format */
119610d63b7dSRichard Lowe
119710d63b7dSRichard Lowe add_hyphen = false;
119810d63b7dSRichard Lowe
119910d63b7dSRichard Lowe /* Check if MAKEFLAGS value begins with multiple
120010d63b7dSRichard Lowe * hyphen characters, and remove all duplicates.
120110d63b7dSRichard Lowe * Usually it happens when the next command is
120210d63b7dSRichard Lowe * used: $(MAKE) -$(MAKEFLAGS)
1203ae389aa9SAndy Fiddaman *
120410d63b7dSRichard Lowe * This was a workaround for BugID 5060758, but
120510d63b7dSRichard Lowe * appears to have survived as a fix in make.
120610d63b7dSRichard Lowe */
120710d63b7dSRichard Lowe while (*cp) {
120810d63b7dSRichard Lowe if (*cp != (int) hyphen_char) {
120910d63b7dSRichard Lowe break;
121010d63b7dSRichard Lowe }
121110d63b7dSRichard Lowe cp++;
121210d63b7dSRichard Lowe if (*cp == (int) hyphen_char) {
121310d63b7dSRichard Lowe /* There are two hyphens. Skip one */
121410d63b7dSRichard Lowe cp_orig = cp;
121510d63b7dSRichard Lowe cp++;
121610d63b7dSRichard Lowe }
121710d63b7dSRichard Lowe if (!(*cp)) {
121810d63b7dSRichard Lowe /* There are hyphens only. Skip all */
121910d63b7dSRichard Lowe cp_orig = cp;
122010d63b7dSRichard Lowe break;
122110d63b7dSRichard Lowe }
122210d63b7dSRichard Lowe }
122310d63b7dSRichard Lowe } else {
122410d63b7dSRichard Lowe
122510d63b7dSRichard Lowe /* Old MAKEFLAGS format */
122610d63b7dSRichard Lowe
122710d63b7dSRichard Lowe add_hyphen = true;
122810d63b7dSRichard Lowe }
122910d63b7dSRichard Lowe }
123010d63b7dSRichard Lowe
123110d63b7dSRichard Lowe /* Find the number of arguments in MAKEFLAGS */
123210d63b7dSRichard Lowe while (cp && *cp) {
123310d63b7dSRichard Lowe /* Skip white spaces */
123410d63b7dSRichard Lowe while (cp && *cp && isspace(*cp)) {
123510d63b7dSRichard Lowe cp++;
123610d63b7dSRichard Lowe }
123710d63b7dSRichard Lowe if (cp && *cp) {
123810d63b7dSRichard Lowe /* Increment arg count */
123910d63b7dSRichard Lowe mf_argc++;
124010d63b7dSRichard Lowe /* Go to next white space */
124110d63b7dSRichard Lowe while (cp && *cp && !isspace(*cp)) {
124210d63b7dSRichard Lowe if(*cp == (int) backslash_char) {
124310d63b7dSRichard Lowe cp++;
124410d63b7dSRichard Lowe }
124510d63b7dSRichard Lowe cp++;
124610d63b7dSRichard Lowe }
124710d63b7dSRichard Lowe }
124810d63b7dSRichard Lowe }
124910d63b7dSRichard Lowe /* Allocate memory for the new MAKEFLAGS argv */
125010d63b7dSRichard Lowe mf_argv = (char **) malloc((mf_argc + 1) * sizeof(char *));
125110d63b7dSRichard Lowe mf_argv[0] = (char *)"MAKEFLAGS";
125210d63b7dSRichard Lowe /*
125310d63b7dSRichard Lowe * Convert the MAKEFLAGS string value into a vector of char *,
125410d63b7dSRichard Lowe * similar to argv.
125510d63b7dSRichard Lowe */
125610d63b7dSRichard Lowe cp = cp_orig;
125710d63b7dSRichard Lowe for (i = 1; i < mf_argc; i++) {
125810d63b7dSRichard Lowe /* Skip white spaces */
125910d63b7dSRichard Lowe while (cp && *cp && isspace(*cp)) {
126010d63b7dSRichard Lowe cp++;
126110d63b7dSRichard Lowe }
126210d63b7dSRichard Lowe if (cp && *cp) {
126310d63b7dSRichard Lowe cp_orig = cp;
126410d63b7dSRichard Lowe /* Go to next white space */
126510d63b7dSRichard Lowe while (cp && *cp && !isspace(*cp)) {
126610d63b7dSRichard Lowe if(*cp == (int) backslash_char) {
126710d63b7dSRichard Lowe cp++;
126810d63b7dSRichard Lowe }
126910d63b7dSRichard Lowe cp++;
127010d63b7dSRichard Lowe }
127110d63b7dSRichard Lowe tmp_char = *cp;
127210d63b7dSRichard Lowe *cp = (int) nul_char;
127310d63b7dSRichard Lowe if (add_hyphen) {
127410d63b7dSRichard Lowe mf_argv[i] = getmem(2 + strlen(cp_orig));
127510d63b7dSRichard Lowe mf_argv[i][0] = '\0';
127610d63b7dSRichard Lowe (void) strcat(mf_argv[i], "-");
127710d63b7dSRichard Lowe // (void) strcat(mf_argv[i], cp_orig);
127810d63b7dSRichard Lowe unquote_str(cp_orig, mf_argv[i]+1);
127910d63b7dSRichard Lowe } else {
128010d63b7dSRichard Lowe mf_argv[i] = getmem(2 + strlen(cp_orig));
128110d63b7dSRichard Lowe //mf_argv[i] = strdup(cp_orig);
128210d63b7dSRichard Lowe unquote_str(cp_orig, mf_argv[i]);
128310d63b7dSRichard Lowe }
128410d63b7dSRichard Lowe *cp = tmp_char;
128510d63b7dSRichard Lowe }
128610d63b7dSRichard Lowe }
128710d63b7dSRichard Lowe mf_argv[i] = NULL;
128810d63b7dSRichard Lowe }
128910d63b7dSRichard Lowe
129010d63b7dSRichard Lowe /*
129110d63b7dSRichard Lowe * parse_command_option(ch)
129210d63b7dSRichard Lowe *
129310d63b7dSRichard Lowe * Parse make command line options.
129410d63b7dSRichard Lowe *
129510d63b7dSRichard Lowe * Return value:
129610d63b7dSRichard Lowe * Indicates if any -f -c or -M were seen
129710d63b7dSRichard Lowe *
129810d63b7dSRichard Lowe * Parameters:
129910d63b7dSRichard Lowe * ch The character to parse
130010d63b7dSRichard Lowe *
130110d63b7dSRichard Lowe * Static variables used:
130210d63b7dSRichard Lowe * dmake_group_specified Set for make -g
130310d63b7dSRichard Lowe * dmake_max_jobs_specified Set for make -j
130410d63b7dSRichard Lowe * dmake_mode_specified Set for make -m
130510d63b7dSRichard Lowe * dmake_add_mode_specified Set for make -x
130610d63b7dSRichard Lowe * dmake_compat_mode_specified Set for make -x SUN_MAKE_COMPAT_MODE=
130710d63b7dSRichard Lowe * dmake_output_mode_specified Set for make -x DMAKE_OUTPUT_MODE=
130810d63b7dSRichard Lowe * dmake_odir_specified Set for make -o
130910d63b7dSRichard Lowe * dmake_rcfile_specified Set for make -c
131010d63b7dSRichard Lowe * env_wins Set for make -e
131110d63b7dSRichard Lowe * ignore_default_mk Set for make -r
131210d63b7dSRichard Lowe * trace_status Set for make -p
131310d63b7dSRichard Lowe *
131410d63b7dSRichard Lowe * Global variables used:
131510d63b7dSRichard Lowe * .make.state path & name set for make -K
131610d63b7dSRichard Lowe * continue_after_error Set for make -k
131710d63b7dSRichard Lowe * debug_level Set for make -d
131810d63b7dSRichard Lowe * do_not_exec_rule Set for make -n
131910d63b7dSRichard Lowe * filter_stderr Set for make -X
132010d63b7dSRichard Lowe * ignore_errors_all Set for make -i
132110d63b7dSRichard Lowe * no_parallel Set for make -R
132210d63b7dSRichard Lowe * quest Set for make -q
132310d63b7dSRichard Lowe * read_trace_level Set for make -D
132410d63b7dSRichard Lowe * report_dependencies Set for make -P
132510d63b7dSRichard Lowe * silent_all Set for make -s
132610d63b7dSRichard Lowe * touch Set for make -t
132710d63b7dSRichard Lowe */
132810d63b7dSRichard Lowe static int
parse_command_option(char ch)1329*e7afc443SToomas Soome parse_command_option(char ch)
133010d63b7dSRichard Lowe {
133110d63b7dSRichard Lowe static int invert_next = 0;
133210d63b7dSRichard Lowe int invert_this = invert_next;
133310d63b7dSRichard Lowe
133410d63b7dSRichard Lowe invert_next = 0;
133510d63b7dSRichard Lowe switch (ch) {
133610d63b7dSRichard Lowe case '-': /* Ignore "--" */
133710d63b7dSRichard Lowe return 0;
133810d63b7dSRichard Lowe case '~': /* Invert next option */
133910d63b7dSRichard Lowe invert_next = 1;
134010d63b7dSRichard Lowe return 0;
134110d63b7dSRichard Lowe case 'B': /* Obsolete */
134210d63b7dSRichard Lowe return 0;
134310d63b7dSRichard Lowe case 'b': /* Obsolete */
134410d63b7dSRichard Lowe return 0;
134510d63b7dSRichard Lowe case 'c': /* Read alternative dmakerc file */
134610d63b7dSRichard Lowe if (invert_this) {
134710d63b7dSRichard Lowe dmake_rcfile_specified = false;
134810d63b7dSRichard Lowe } else {
134910d63b7dSRichard Lowe dmake_rcfile_specified = true;
135010d63b7dSRichard Lowe }
135110d63b7dSRichard Lowe return 2;
135236cd0120SRobert Mustacchi case 'C': /* Change directory */
135336cd0120SRobert Mustacchi return 2048;
135410d63b7dSRichard Lowe case 'D': /* Show lines read */
135510d63b7dSRichard Lowe if (invert_this) {
135610d63b7dSRichard Lowe read_trace_level--;
135710d63b7dSRichard Lowe } else {
135810d63b7dSRichard Lowe read_trace_level++;
135910d63b7dSRichard Lowe }
136010d63b7dSRichard Lowe return 0;
136110d63b7dSRichard Lowe case 'd': /* Debug flag */
136210d63b7dSRichard Lowe if (invert_this) {
136310d63b7dSRichard Lowe debug_level--;
136410d63b7dSRichard Lowe } else {
136510d63b7dSRichard Lowe debug_level++;
136610d63b7dSRichard Lowe }
136710d63b7dSRichard Lowe return 0;
136810d63b7dSRichard Lowe case 'e': /* Environment override flag */
136910d63b7dSRichard Lowe if (invert_this) {
137010d63b7dSRichard Lowe env_wins = false;
137110d63b7dSRichard Lowe } else {
137210d63b7dSRichard Lowe env_wins = true;
137310d63b7dSRichard Lowe }
137410d63b7dSRichard Lowe return 0;
137510d63b7dSRichard Lowe case 'f': /* Read alternative makefile(s) */
137610d63b7dSRichard Lowe return 1;
137710d63b7dSRichard Lowe case 'g': /* Use alternative DMake group */
137810d63b7dSRichard Lowe if (invert_this) {
137910d63b7dSRichard Lowe dmake_group_specified = false;
138010d63b7dSRichard Lowe } else {
138110d63b7dSRichard Lowe dmake_group_specified = true;
138210d63b7dSRichard Lowe }
138310d63b7dSRichard Lowe return 4;
138410d63b7dSRichard Lowe case 'i': /* Ignore errors */
138510d63b7dSRichard Lowe if (invert_this) {
138610d63b7dSRichard Lowe ignore_errors_all = false;
138710d63b7dSRichard Lowe } else {
138810d63b7dSRichard Lowe ignore_errors_all = true;
138910d63b7dSRichard Lowe }
139010d63b7dSRichard Lowe return 0;
139110d63b7dSRichard Lowe case 'j': /* Use alternative DMake max jobs */
139210d63b7dSRichard Lowe if (invert_this) {
139310d63b7dSRichard Lowe dmake_max_jobs_specified = false;
139410d63b7dSRichard Lowe } else {
139510d63b7dSRichard Lowe dmake_mode_type = parallel_mode;
139610d63b7dSRichard Lowe no_parallel = false;
139710d63b7dSRichard Lowe dmake_max_jobs_specified = true;
139810d63b7dSRichard Lowe }
139910d63b7dSRichard Lowe return 8;
140010d63b7dSRichard Lowe case 'K': /* Read alternative .make.state */
140110d63b7dSRichard Lowe return 256;
140210d63b7dSRichard Lowe case 'k': /* Keep making even after errors */
140310d63b7dSRichard Lowe if (invert_this) {
140410d63b7dSRichard Lowe continue_after_error = false;
140510d63b7dSRichard Lowe } else {
140610d63b7dSRichard Lowe continue_after_error = true;
140710d63b7dSRichard Lowe continue_after_error_ever_seen = true;
140810d63b7dSRichard Lowe }
140910d63b7dSRichard Lowe return 0;
141010d63b7dSRichard Lowe case 'M': /* Read alternative make.machines file */
141110d63b7dSRichard Lowe if (invert_this) {
141210d63b7dSRichard Lowe pmake_machinesfile_specified = false;
141310d63b7dSRichard Lowe } else {
141410d63b7dSRichard Lowe pmake_machinesfile_specified = true;
141510d63b7dSRichard Lowe dmake_mode_type = parallel_mode;
141610d63b7dSRichard Lowe no_parallel = false;
141710d63b7dSRichard Lowe }
141810d63b7dSRichard Lowe return 16;
141910d63b7dSRichard Lowe case 'm': /* Use alternative DMake build mode */
142010d63b7dSRichard Lowe if (invert_this) {
142110d63b7dSRichard Lowe dmake_mode_specified = false;
142210d63b7dSRichard Lowe } else {
142310d63b7dSRichard Lowe dmake_mode_specified = true;
142410d63b7dSRichard Lowe }
142510d63b7dSRichard Lowe return 32;
142610d63b7dSRichard Lowe case 'x': /* Use alternative DMake mode */
142710d63b7dSRichard Lowe if (invert_this) {
142810d63b7dSRichard Lowe dmake_add_mode_specified = false;
142910d63b7dSRichard Lowe } else {
143010d63b7dSRichard Lowe dmake_add_mode_specified = true;
143110d63b7dSRichard Lowe }
143210d63b7dSRichard Lowe return 1024;
143310d63b7dSRichard Lowe case 'N': /* Reverse -n */
143410d63b7dSRichard Lowe if (invert_this) {
143510d63b7dSRichard Lowe do_not_exec_rule = true;
143610d63b7dSRichard Lowe } else {
143710d63b7dSRichard Lowe do_not_exec_rule = false;
143810d63b7dSRichard Lowe }
143910d63b7dSRichard Lowe return 0;
144010d63b7dSRichard Lowe case 'n': /* Print, not exec commands */
144110d63b7dSRichard Lowe if (invert_this) {
144210d63b7dSRichard Lowe do_not_exec_rule = false;
144310d63b7dSRichard Lowe } else {
144410d63b7dSRichard Lowe do_not_exec_rule = true;
144510d63b7dSRichard Lowe }
144610d63b7dSRichard Lowe return 0;
144710d63b7dSRichard Lowe case 'O': /* Integrate with maketool, obsolete */
144810d63b7dSRichard Lowe return 0;
144910d63b7dSRichard Lowe case 'o': /* Use alternative dmake output dir */
145010d63b7dSRichard Lowe if (invert_this) {
145110d63b7dSRichard Lowe dmake_odir_specified = false;
145210d63b7dSRichard Lowe } else {
145310d63b7dSRichard Lowe dmake_odir_specified = true;
145410d63b7dSRichard Lowe }
145510d63b7dSRichard Lowe return 512;
145610d63b7dSRichard Lowe case 'P': /* Print for selected targets */
145710d63b7dSRichard Lowe if (invert_this) {
145810d63b7dSRichard Lowe report_dependencies_level--;
145910d63b7dSRichard Lowe } else {
146010d63b7dSRichard Lowe report_dependencies_level++;
146110d63b7dSRichard Lowe }
146210d63b7dSRichard Lowe return 0;
146310d63b7dSRichard Lowe case 'p': /* Print description */
146410d63b7dSRichard Lowe if (invert_this) {
146510d63b7dSRichard Lowe trace_status = false;
146610d63b7dSRichard Lowe do_not_exec_rule = false;
146710d63b7dSRichard Lowe } else {
146810d63b7dSRichard Lowe trace_status = true;
146910d63b7dSRichard Lowe do_not_exec_rule = true;
147010d63b7dSRichard Lowe }
147110d63b7dSRichard Lowe return 0;
147210d63b7dSRichard Lowe case 'q': /* Question flag */
147310d63b7dSRichard Lowe if (invert_this) {
147410d63b7dSRichard Lowe quest = false;
147510d63b7dSRichard Lowe } else {
147610d63b7dSRichard Lowe quest = true;
147710d63b7dSRichard Lowe }
147810d63b7dSRichard Lowe return 0;
147910d63b7dSRichard Lowe case 'R': /* Don't run in parallel */
148010d63b7dSRichard Lowe if (invert_this) {
148110d63b7dSRichard Lowe pmake_cap_r_specified = false;
148210d63b7dSRichard Lowe no_parallel = false;
148310d63b7dSRichard Lowe } else {
148410d63b7dSRichard Lowe pmake_cap_r_specified = true;
148510d63b7dSRichard Lowe dmake_mode_type = serial_mode;
148610d63b7dSRichard Lowe no_parallel = true;
148710d63b7dSRichard Lowe }
148810d63b7dSRichard Lowe return 0;
148910d63b7dSRichard Lowe case 'r': /* Turn off internal rules */
149010d63b7dSRichard Lowe if (invert_this) {
149110d63b7dSRichard Lowe ignore_default_mk = false;
149210d63b7dSRichard Lowe } else {
149310d63b7dSRichard Lowe ignore_default_mk = true;
149410d63b7dSRichard Lowe }
149510d63b7dSRichard Lowe return 0;
149610d63b7dSRichard Lowe case 'S': /* Reverse -k */
149710d63b7dSRichard Lowe if (invert_this) {
149810d63b7dSRichard Lowe continue_after_error = true;
149910d63b7dSRichard Lowe } else {
150010d63b7dSRichard Lowe continue_after_error = false;
150110d63b7dSRichard Lowe stop_after_error_ever_seen = true;
150210d63b7dSRichard Lowe }
150310d63b7dSRichard Lowe return 0;
150410d63b7dSRichard Lowe case 's': /* Silent flag */
150510d63b7dSRichard Lowe if (invert_this) {
150610d63b7dSRichard Lowe silent_all = false;
150710d63b7dSRichard Lowe } else {
150810d63b7dSRichard Lowe silent_all = true;
150910d63b7dSRichard Lowe }
151010d63b7dSRichard Lowe return 0;
151110d63b7dSRichard Lowe case 'T': /* Print target list */
151210d63b7dSRichard Lowe if (invert_this) {
151310d63b7dSRichard Lowe list_all_targets = false;
151410d63b7dSRichard Lowe do_not_exec_rule = false;
151510d63b7dSRichard Lowe } else {
151610d63b7dSRichard Lowe list_all_targets = true;
151710d63b7dSRichard Lowe do_not_exec_rule = true;
151810d63b7dSRichard Lowe }
151910d63b7dSRichard Lowe return 0;
152010d63b7dSRichard Lowe case 't': /* Touch flag */
152110d63b7dSRichard Lowe if (invert_this) {
152210d63b7dSRichard Lowe touch = false;
152310d63b7dSRichard Lowe } else {
152410d63b7dSRichard Lowe touch = true;
152510d63b7dSRichard Lowe }
152610d63b7dSRichard Lowe return 0;
152710d63b7dSRichard Lowe case 'u': /* Unconditional flag */
152810d63b7dSRichard Lowe if (invert_this) {
152910d63b7dSRichard Lowe build_unconditional = false;
153010d63b7dSRichard Lowe } else {
153110d63b7dSRichard Lowe build_unconditional = true;
153210d63b7dSRichard Lowe }
153310d63b7dSRichard Lowe return 0;
153410d63b7dSRichard Lowe case 'V': /* SVR4 mode */
153510d63b7dSRichard Lowe svr4 = true;
153610d63b7dSRichard Lowe return 0;
153710d63b7dSRichard Lowe case 'v': /* Version flag */
153810d63b7dSRichard Lowe if (invert_this) {
153910d63b7dSRichard Lowe } else {
154010d63b7dSRichard Lowe fprintf(stdout, "%s: %s\n", getprogname(), verstring);
154110d63b7dSRichard Lowe exit_status = 0;
154210d63b7dSRichard Lowe exit(0);
154310d63b7dSRichard Lowe }
154410d63b7dSRichard Lowe return 0;
154510d63b7dSRichard Lowe case 'w': /* Unconditional flag */
154610d63b7dSRichard Lowe if (invert_this) {
154710d63b7dSRichard Lowe report_cwd = false;
154810d63b7dSRichard Lowe } else {
154910d63b7dSRichard Lowe report_cwd = true;
155010d63b7dSRichard Lowe }
155110d63b7dSRichard Lowe return 0;
155210d63b7dSRichard Lowe #if 0
155310d63b7dSRichard Lowe case 'X': /* Filter stdout */
155410d63b7dSRichard Lowe if (invert_this) {
155510d63b7dSRichard Lowe filter_stderr = false;
155610d63b7dSRichard Lowe } else {
155710d63b7dSRichard Lowe filter_stderr = true;
155810d63b7dSRichard Lowe }
155910d63b7dSRichard Lowe return 0;
156010d63b7dSRichard Lowe #endif
156110d63b7dSRichard Lowe default:
156210d63b7dSRichard Lowe break;
156310d63b7dSRichard Lowe }
156410d63b7dSRichard Lowe return 0;
156510d63b7dSRichard Lowe }
156610d63b7dSRichard Lowe
156710d63b7dSRichard Lowe /*
156810d63b7dSRichard Lowe * setup_for_projectdir()
156910d63b7dSRichard Lowe *
157010d63b7dSRichard Lowe * Read the PROJECTDIR variable, if defined, and set the sccs path
157110d63b7dSRichard Lowe *
157210d63b7dSRichard Lowe * Parameters:
157310d63b7dSRichard Lowe *
157410d63b7dSRichard Lowe * Global variables used:
157510d63b7dSRichard Lowe * sccs_dir_path Set to point to SCCS dir to use
157610d63b7dSRichard Lowe */
157710d63b7dSRichard Lowe static void
setup_for_projectdir(void)157810d63b7dSRichard Lowe setup_for_projectdir(void)
157910d63b7dSRichard Lowe {
158010d63b7dSRichard Lowe static char path[MAXPATHLEN];
158110d63b7dSRichard Lowe char cwdpath[MAXPATHLEN];
158210d63b7dSRichard Lowe uid_t uid;
158310d63b7dSRichard Lowe int done=0;
158410d63b7dSRichard Lowe
158510d63b7dSRichard Lowe /* Check if we should use PROJECTDIR when reading the SCCS dir. */
158610d63b7dSRichard Lowe sccs_dir_path = getenv("PROJECTDIR");
158710d63b7dSRichard Lowe if ((sccs_dir_path != NULL) &&
158810d63b7dSRichard Lowe (sccs_dir_path[0] != (int) slash_char)) {
158910d63b7dSRichard Lowe struct passwd *pwent;
159010d63b7dSRichard Lowe
159110d63b7dSRichard Lowe {
159210d63b7dSRichard Lowe uid = getuid();
159310d63b7dSRichard Lowe pwent = getpwuid(uid);
159410d63b7dSRichard Lowe if (pwent == NULL) {
159510d63b7dSRichard Lowe fatal(gettext("Bogus USERID "));
159610d63b7dSRichard Lowe }
159710d63b7dSRichard Lowe if ((pwent = getpwnam(sccs_dir_path)) == NULL) {
159810d63b7dSRichard Lowe /*empty block : it'll go & check cwd */
159910d63b7dSRichard Lowe }
160010d63b7dSRichard Lowe else {
160110d63b7dSRichard Lowe (void) sprintf(path, "%s/src", pwent->pw_dir);
160210d63b7dSRichard Lowe if (access(path, F_OK) == 0) {
160310d63b7dSRichard Lowe sccs_dir_path = path;
160410d63b7dSRichard Lowe done = 1;
160510d63b7dSRichard Lowe } else {
160610d63b7dSRichard Lowe (void) sprintf(path, "%s/source", pwent->pw_dir);
160710d63b7dSRichard Lowe if (access(path, F_OK) == 0) {
160810d63b7dSRichard Lowe sccs_dir_path = path;
160910d63b7dSRichard Lowe done = 1;
161010d63b7dSRichard Lowe }
161110d63b7dSRichard Lowe }
161210d63b7dSRichard Lowe }
161310d63b7dSRichard Lowe if (!done) {
161410d63b7dSRichard Lowe if (getcwd(cwdpath, MAXPATHLEN - 1 )) {
161510d63b7dSRichard Lowe
161610d63b7dSRichard Lowe (void) sprintf(path, "%s/%s", cwdpath,sccs_dir_path);
161710d63b7dSRichard Lowe if (access(path, F_OK) == 0) {
1618ae389aa9SAndy Fiddaman sccs_dir_path = path;
161910d63b7dSRichard Lowe done = 1;
162010d63b7dSRichard Lowe } else {
1621ae389aa9SAndy Fiddaman fatal(gettext("Bogus PROJECTDIR '%s'"), sccs_dir_path);
162210d63b7dSRichard Lowe }
162310d63b7dSRichard Lowe }
162410d63b7dSRichard Lowe }
162510d63b7dSRichard Lowe }
162610d63b7dSRichard Lowe }
162710d63b7dSRichard Lowe }
162810d63b7dSRichard Lowe
162910d63b7dSRichard Lowe char *
make_install_prefix(void)163010d63b7dSRichard Lowe make_install_prefix(void)
163110d63b7dSRichard Lowe {
163210d63b7dSRichard Lowe int ret;
163310d63b7dSRichard Lowe char origin[PATH_MAX];
163410d63b7dSRichard Lowe char *dir;
163510d63b7dSRichard Lowe
163610d63b7dSRichard Lowe if ((ret = readlink("/proc/self/path/a.out", origin,
163710d63b7dSRichard Lowe PATH_MAX - 1)) < 0)
163810d63b7dSRichard Lowe fatal("failed to read origin from /proc\n");
163910d63b7dSRichard Lowe
1640ae389aa9SAndy Fiddaman
164110d63b7dSRichard Lowe origin[ret] = '\0';
164210d63b7dSRichard Lowe return strdup(dirname(origin));
164310d63b7dSRichard Lowe }
164410d63b7dSRichard Lowe
164510d63b7dSRichard Lowe static char *
add_to_env(const char * var,const char * value,const char * fallback)164610d63b7dSRichard Lowe add_to_env(const char *var, const char *value, const char *fallback)
164710d63b7dSRichard Lowe {
164810d63b7dSRichard Lowe const char *oldpath;
164910d63b7dSRichard Lowe char *newpath;
165010d63b7dSRichard Lowe
165110d63b7dSRichard Lowe oldpath = getenv(var);
165210d63b7dSRichard Lowe if (oldpath == NULL) {
165310d63b7dSRichard Lowe if (value != NULL) {
165410d63b7dSRichard Lowe asprintf(&newpath, "%s=%s",
165510d63b7dSRichard Lowe var, value);
165610d63b7dSRichard Lowe } else {
165710d63b7dSRichard Lowe asprintf(&newpath, "%s=%s",
165810d63b7dSRichard Lowe var, fallback);
165910d63b7dSRichard Lowe }
166010d63b7dSRichard Lowe } else {
166110d63b7dSRichard Lowe if (value != NULL) {
166210d63b7dSRichard Lowe asprintf(&newpath, "%s=%s:%s",
166310d63b7dSRichard Lowe var, oldpath, value);
166410d63b7dSRichard Lowe } else {
166510d63b7dSRichard Lowe asprintf(&newpath, "%s=%s:%s",
1666ae389aa9SAndy Fiddaman var, oldpath, fallback);
166710d63b7dSRichard Lowe }
166810d63b7dSRichard Lowe }
166910d63b7dSRichard Lowe
167010d63b7dSRichard Lowe return (newpath);
167110d63b7dSRichard Lowe }
167210d63b7dSRichard Lowe
167310d63b7dSRichard Lowe /*
167410d63b7dSRichard Lowe * set_sgs_support()
167510d63b7dSRichard Lowe *
167610d63b7dSRichard Lowe * Add the libmakestate.so.1 lib to the env var SGS_SUPPORT
167710d63b7dSRichard Lowe * if it's not already in there.
167810d63b7dSRichard Lowe * The SGS_SUPPORT env var and libmakestate.so.1 is used by
167910d63b7dSRichard Lowe * the linker ld to report .make.state info back to make.
168010d63b7dSRichard Lowe *
168110d63b7dSRichard Lowe * In the new world we always will set the 32-bit and 64-bit versions of this
168210d63b7dSRichard Lowe * variable explicitly so that we can take into account the correct isa and our
168310d63b7dSRichard Lowe * prefix. So say that the prefix was /opt/local. Then we would want to search
168410d63b7dSRichard Lowe * /opt/local/lib/libmakestate.so.1:libmakestate.so.1. We still want to search
168510d63b7dSRichard Lowe * the original location just as a safety measure.
168610d63b7dSRichard Lowe */
168710d63b7dSRichard Lowe static void
set_sgs_support()168810d63b7dSRichard Lowe set_sgs_support()
168910d63b7dSRichard Lowe {
169010d63b7dSRichard Lowe int len;
169110d63b7dSRichard Lowe char *newpath, *newpath64;
1692ae389aa9SAndy Fiddaman char *lib32, *lib64;
169310d63b7dSRichard Lowe static char *prev_path, *prev_path64;
169410d63b7dSRichard Lowe char *origin = make_install_prefix();
169510d63b7dSRichard Lowe struct stat st;
169610d63b7dSRichard Lowe
169710d63b7dSRichard Lowe asprintf(&lib32, "%s/%s/%s", origin, "../lib",
169810d63b7dSRichard Lowe LD_SUPPORT_MAKE_LIB);
169910d63b7dSRichard Lowe
170010d63b7dSRichard Lowe if (stat(lib32, &st) != 0) {
170110d63b7dSRichard Lowe free(lib32);
170210d63b7dSRichard Lowe // Try the tools path
170310d63b7dSRichard Lowe asprintf(&lib32, "%s/%s/%s/%s", origin, "../../lib/",
170410d63b7dSRichard Lowe LD_SUPPORT_MAKE_ARCH, LD_SUPPORT_MAKE_LIB);
170510d63b7dSRichard Lowe
170610d63b7dSRichard Lowe if (stat(lib32, &st) != 0) {
170710d63b7dSRichard Lowe free(lib32);
170810d63b7dSRichard Lowe lib32 = NULL;
170910d63b7dSRichard Lowe }
171010d63b7dSRichard Lowe }
171110d63b7dSRichard Lowe
171210d63b7dSRichard Lowe asprintf(&lib64, "%s/%s/64/%s", origin, "../lib",
171310d63b7dSRichard Lowe LD_SUPPORT_MAKE_LIB);
171410d63b7dSRichard Lowe
171510d63b7dSRichard Lowe if (stat(lib64, &st) != 0) {
171610d63b7dSRichard Lowe free(lib64);
171710d63b7dSRichard Lowe // Try the tools path
171810d63b7dSRichard Lowe asprintf(&lib64, "%s/%s/%s/64/%s", origin, "../../lib/",
171910d63b7dSRichard Lowe LD_SUPPORT_MAKE_ARCH, LD_SUPPORT_MAKE_LIB);
172010d63b7dSRichard Lowe
172110d63b7dSRichard Lowe if (stat(lib64, &st) != 0) {
172210d63b7dSRichard Lowe free(lib64);
172310d63b7dSRichard Lowe lib64 = NULL;
172410d63b7dSRichard Lowe }
172510d63b7dSRichard Lowe }
172610d63b7dSRichard Lowe
172710d63b7dSRichard Lowe newpath = add_to_env(LD_SUPPORT_ENV_VAR_32, lib32, LD_SUPPORT_MAKE_LIB);
172810d63b7dSRichard Lowe newpath64 = add_to_env(LD_SUPPORT_ENV_VAR_64, lib64, LD_SUPPORT_MAKE_LIB);
172910d63b7dSRichard Lowe
173010d63b7dSRichard Lowe putenv(newpath);
173110d63b7dSRichard Lowe if (prev_path) {
173210d63b7dSRichard Lowe free(prev_path);
173310d63b7dSRichard Lowe }
173410d63b7dSRichard Lowe prev_path = newpath;
173510d63b7dSRichard Lowe
173610d63b7dSRichard Lowe putenv(newpath64);
173710d63b7dSRichard Lowe if (prev_path64) {
173810d63b7dSRichard Lowe free(prev_path64);
173910d63b7dSRichard Lowe }
174010d63b7dSRichard Lowe prev_path64 = newpath64;
174110d63b7dSRichard Lowe free(lib32);
174210d63b7dSRichard Lowe free(lib64);
174310d63b7dSRichard Lowe free(origin);
174410d63b7dSRichard Lowe }
174510d63b7dSRichard Lowe
174610d63b7dSRichard Lowe /*
174710d63b7dSRichard Lowe * read_files_and_state(argc, argv)
174810d63b7dSRichard Lowe *
174910d63b7dSRichard Lowe * Read the makefiles we care about and the environment
175010d63b7dSRichard Lowe * Also read the = style command line options
175110d63b7dSRichard Lowe *
175210d63b7dSRichard Lowe * Parameters:
175310d63b7dSRichard Lowe * argc You know what this is
175410d63b7dSRichard Lowe * argv You know what this is
175510d63b7dSRichard Lowe *
175610d63b7dSRichard Lowe * Static variables used:
175710d63b7dSRichard Lowe * env_wins make -e, determines if env vars are RO
175810d63b7dSRichard Lowe * ignore_default_mk make -r, determines if make.rules is read
175910d63b7dSRichard Lowe * not_auto_depen dwight
176010d63b7dSRichard Lowe *
176110d63b7dSRichard Lowe * Global variables used:
176210d63b7dSRichard Lowe * default_target_to_build Set to first proper target from file
176310d63b7dSRichard Lowe * do_not_exec_rule Set to false when makfile is made
176410d63b7dSRichard Lowe * dot The Name ".", used to read current dir
176510d63b7dSRichard Lowe * empty_name The Name "", use as macro value
176610d63b7dSRichard Lowe * keep_state Set if KEEP_STATE is in environment
176710d63b7dSRichard Lowe * make_state The Name ".make.state", used to read file
176810d63b7dSRichard Lowe * makefile_type Set to type of file being read
176910d63b7dSRichard Lowe * makeflags The Name "MAKEFLAGS", used to set macro value
177010d63b7dSRichard Lowe * not_auto dwight
177110d63b7dSRichard Lowe * read_trace_level Checked to se if the reader should trace
177210d63b7dSRichard Lowe * report_dependencies If -P is on we do not read .make.state
177310d63b7dSRichard Lowe * trace_reader Set if reader should trace
177410d63b7dSRichard Lowe * virtual_root The Name "VIRTUAL_ROOT", used to check value
177510d63b7dSRichard Lowe */
177610d63b7dSRichard Lowe static void
read_files_and_state(int argc,char ** argv)177710d63b7dSRichard Lowe read_files_and_state(int argc, char **argv)
177810d63b7dSRichard Lowe {
177910d63b7dSRichard Lowe wchar_t buffer[1000];
178010d63b7dSRichard Lowe wchar_t buffer_posix[1000];
1781*e7afc443SToomas Soome char ch;
1782*e7afc443SToomas Soome char *cp;
178310d63b7dSRichard Lowe Property def_make_macro = NULL;
178410d63b7dSRichard Lowe Name def_make_name;
178510d63b7dSRichard Lowe Name default_makefile;
178610d63b7dSRichard Lowe String_rec dest;
178710d63b7dSRichard Lowe wchar_t destbuffer[STRING_BUFFER_LENGTH];
1788*e7afc443SToomas Soome int i;
1789*e7afc443SToomas Soome int j;
179010d63b7dSRichard Lowe Name keep_state_name;
179110d63b7dSRichard Lowe int length;
179210d63b7dSRichard Lowe Name Makefile;
1793*e7afc443SToomas Soome Property macro;
179410d63b7dSRichard Lowe struct stat make_state_stat;
179510d63b7dSRichard Lowe Name makefile_name;
1796*e7afc443SToomas Soome int makefile_next = 0;
1797*e7afc443SToomas Soome Boolean makefile_read = false;
179810d63b7dSRichard Lowe String_rec makeflags_string;
179910d63b7dSRichard Lowe String_rec makeflags_string_posix;
180010d63b7dSRichard Lowe String_rec * makeflags_string_current;
180110d63b7dSRichard Lowe Name makeflags_value_saved;
1802*e7afc443SToomas Soome Name name;
180310d63b7dSRichard Lowe Name new_make_value;
180410d63b7dSRichard Lowe Boolean save_do_not_exec_rule;
180510d63b7dSRichard Lowe static wchar_t state_file_str;
180610d63b7dSRichard Lowe static char state_file_str_mb[MAXPATHLEN];
180710d63b7dSRichard Lowe static struct _Name state_filename;
180810d63b7dSRichard Lowe Boolean temp;
180910d63b7dSRichard Lowe char tmp_char;
181010d63b7dSRichard Lowe wchar_t *tmp_wcs_buffer;
1811*e7afc443SToomas Soome Name value;
181210d63b7dSRichard Lowe ASCII_Dyn_Array makeflags_and_macro;
181310d63b7dSRichard Lowe Boolean is_xpg4;
181410d63b7dSRichard Lowe
181510d63b7dSRichard Lowe /*
181610d63b7dSRichard Lowe * Remember current mode. It may be changed after reading makefile
181710d63b7dSRichard Lowe * and we will have to correct MAKEFLAGS variable.
181810d63b7dSRichard Lowe */
181910d63b7dSRichard Lowe is_xpg4 = posix;
182010d63b7dSRichard Lowe
182110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "KEEP_STATE");
182210d63b7dSRichard Lowe keep_state_name = GETNAME(wcs_buffer, FIND_LENGTH);
182310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "Makefile");
182410d63b7dSRichard Lowe Makefile = GETNAME(wcs_buffer, FIND_LENGTH);
182510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "makefile");
182610d63b7dSRichard Lowe makefile_name = GETNAME(wcs_buffer, FIND_LENGTH);
182710d63b7dSRichard Lowe
182810d63b7dSRichard Lowe /*
182910d63b7dSRichard Lowe * initialize global dependency entry for .NOT_AUTO
183010d63b7dSRichard Lowe */
183110d63b7dSRichard Lowe not_auto_depen->next = NULL;
183210d63b7dSRichard Lowe not_auto_depen->name = not_auto;
183310d63b7dSRichard Lowe not_auto_depen->automatic = not_auto_depen->stale = false;
183410d63b7dSRichard Lowe
183510d63b7dSRichard Lowe /*
183610d63b7dSRichard Lowe * Read internal definitions and rules.
183710d63b7dSRichard Lowe */
183810d63b7dSRichard Lowe if (read_trace_level > 1) {
183910d63b7dSRichard Lowe trace_reader = true;
184010d63b7dSRichard Lowe }
184110d63b7dSRichard Lowe if (!ignore_default_mk) {
184210d63b7dSRichard Lowe if (svr4) {
184310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "svr4.make.rules");
184410d63b7dSRichard Lowe default_makefile = GETNAME(wcs_buffer, FIND_LENGTH);
184510d63b7dSRichard Lowe } else {
184610d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "make.rules");
184710d63b7dSRichard Lowe default_makefile = GETNAME(wcs_buffer, FIND_LENGTH);
184810d63b7dSRichard Lowe }
184910d63b7dSRichard Lowe default_makefile->stat.is_file = true;
185010d63b7dSRichard Lowe
185110d63b7dSRichard Lowe (void) read_makefile(default_makefile,
185210d63b7dSRichard Lowe true,
185310d63b7dSRichard Lowe false,
185410d63b7dSRichard Lowe true);
185510d63b7dSRichard Lowe }
185610d63b7dSRichard Lowe
185710d63b7dSRichard Lowe /*
185810d63b7dSRichard Lowe * If the user did not redefine the MAKE macro in the
185910d63b7dSRichard Lowe * default makefile (make.rules), then we'd like to
186010d63b7dSRichard Lowe * change the macro value of MAKE to be some form
186110d63b7dSRichard Lowe * of argv[0] for recursive MAKE builds.
186210d63b7dSRichard Lowe */
186310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "MAKE");
186410d63b7dSRichard Lowe def_make_name = GETNAME(wcs_buffer, wcslen(wcs_buffer));
186510d63b7dSRichard Lowe def_make_macro = get_prop(def_make_name->prop, macro_prop);
186610d63b7dSRichard Lowe if ((def_make_macro != NULL) &&
186710d63b7dSRichard Lowe (IS_EQUAL(def_make_macro->body.macro.value->string_mb,
186810d63b7dSRichard Lowe "make"))) {
186910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, argv_zero_string);
187010d63b7dSRichard Lowe new_make_value = GETNAME(wcs_buffer, wcslen(wcs_buffer));
187110d63b7dSRichard Lowe (void) SETVAR(def_make_name,
187210d63b7dSRichard Lowe new_make_value,
187310d63b7dSRichard Lowe false);
187410d63b7dSRichard Lowe }
187510d63b7dSRichard Lowe
187610d63b7dSRichard Lowe default_target_to_build = NULL;
187710d63b7dSRichard Lowe trace_reader = false;
187810d63b7dSRichard Lowe
187910d63b7dSRichard Lowe /*
188010d63b7dSRichard Lowe * Read environment args. Let file args which follow override unless
188110d63b7dSRichard Lowe * -e option seen. If -e option is not mentioned.
188210d63b7dSRichard Lowe */
188310d63b7dSRichard Lowe read_environment(env_wins);
188410d63b7dSRichard Lowe if (getvar(virtual_root)->hash.length == 0) {
188510d63b7dSRichard Lowe maybe_append_prop(virtual_root, macro_prop)
188610d63b7dSRichard Lowe ->body.macro.exported = true;
188710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "/");
188810d63b7dSRichard Lowe (void) SETVAR(virtual_root,
188910d63b7dSRichard Lowe GETNAME(wcs_buffer, FIND_LENGTH),
189010d63b7dSRichard Lowe false);
189110d63b7dSRichard Lowe }
189210d63b7dSRichard Lowe
189310d63b7dSRichard Lowe /*
189410d63b7dSRichard Lowe * We now scan mf_argv and argv to see if we need to set
189510d63b7dSRichard Lowe * any of the DMake-added options/variables in MAKEFLAGS.
189610d63b7dSRichard Lowe */
189710d63b7dSRichard Lowe
189810d63b7dSRichard Lowe makeflags_and_macro.start = 0;
189910d63b7dSRichard Lowe makeflags_and_macro.size = 0;
190010d63b7dSRichard Lowe enter_argv_values(mf_argc, mf_argv, &makeflags_and_macro);
190110d63b7dSRichard Lowe enter_argv_values(argc, argv, &makeflags_and_macro);
190210d63b7dSRichard Lowe
190310d63b7dSRichard Lowe /*
190410d63b7dSRichard Lowe * Set MFLAGS and MAKEFLAGS
1905ae389aa9SAndy Fiddaman *
190610d63b7dSRichard Lowe * Before reading makefile we do not know exactly which mode
190710d63b7dSRichard Lowe * (posix or not) is used. So prepare two MAKEFLAGS strings
190810d63b7dSRichard Lowe * for both posix and solaris modes because they are different.
1909c3d5f7c4SRyan Goodfellow *
1910c3d5f7c4SRyan Goodfellow * Note: cw depends on short flags with no arguments appearing
1911c3d5f7c4SRyan Goodfellow * first in MAKEFLAGS. If this behavior changes, cw will need to
1912c3d5f7c4SRyan Goodfellow * be updated.
191310d63b7dSRichard Lowe */
191410d63b7dSRichard Lowe INIT_STRING_FROM_STACK(makeflags_string, buffer);
191510d63b7dSRichard Lowe INIT_STRING_FROM_STACK(makeflags_string_posix, buffer_posix);
191610d63b7dSRichard Lowe append_char((int) hyphen_char, &makeflags_string);
191710d63b7dSRichard Lowe append_char((int) hyphen_char, &makeflags_string_posix);
191810d63b7dSRichard Lowe
191910d63b7dSRichard Lowe switch (read_trace_level) {
192010d63b7dSRichard Lowe case 2:
192110d63b7dSRichard Lowe append_char('D', &makeflags_string);
192210d63b7dSRichard Lowe append_char('D', &makeflags_string_posix);
19238e0c8248SAndrew Stormont /* FALLTHROUGH */
192410d63b7dSRichard Lowe case 1:
192510d63b7dSRichard Lowe append_char('D', &makeflags_string);
192610d63b7dSRichard Lowe append_char('D', &makeflags_string_posix);
192710d63b7dSRichard Lowe }
192810d63b7dSRichard Lowe switch (debug_level) {
192910d63b7dSRichard Lowe case 2:
193010d63b7dSRichard Lowe append_char('d', &makeflags_string);
193110d63b7dSRichard Lowe append_char('d', &makeflags_string_posix);
19328e0c8248SAndrew Stormont /* FALLTHROUGH */
193310d63b7dSRichard Lowe case 1:
193410d63b7dSRichard Lowe append_char('d', &makeflags_string);
193510d63b7dSRichard Lowe append_char('d', &makeflags_string_posix);
193610d63b7dSRichard Lowe }
193710d63b7dSRichard Lowe if (env_wins) {
193810d63b7dSRichard Lowe append_char('e', &makeflags_string);
193910d63b7dSRichard Lowe append_char('e', &makeflags_string_posix);
194010d63b7dSRichard Lowe }
194110d63b7dSRichard Lowe if (ignore_errors_all) {
194210d63b7dSRichard Lowe append_char('i', &makeflags_string);
194310d63b7dSRichard Lowe append_char('i', &makeflags_string_posix);
194410d63b7dSRichard Lowe }
194510d63b7dSRichard Lowe if (continue_after_error) {
194610d63b7dSRichard Lowe if (stop_after_error_ever_seen) {
194710d63b7dSRichard Lowe append_char('S', &makeflags_string_posix);
194810d63b7dSRichard Lowe append_char((int) space_char, &makeflags_string_posix);
194910d63b7dSRichard Lowe append_char((int) hyphen_char, &makeflags_string_posix);
195010d63b7dSRichard Lowe }
195110d63b7dSRichard Lowe append_char('k', &makeflags_string);
195210d63b7dSRichard Lowe append_char('k', &makeflags_string_posix);
195310d63b7dSRichard Lowe } else {
1954ae389aa9SAndy Fiddaman if (stop_after_error_ever_seen
195510d63b7dSRichard Lowe && continue_after_error_ever_seen) {
195610d63b7dSRichard Lowe append_char('k', &makeflags_string_posix);
195710d63b7dSRichard Lowe append_char((int) space_char, &makeflags_string_posix);
195810d63b7dSRichard Lowe append_char((int) hyphen_char, &makeflags_string_posix);
195910d63b7dSRichard Lowe append_char('S', &makeflags_string_posix);
196010d63b7dSRichard Lowe }
196110d63b7dSRichard Lowe }
196210d63b7dSRichard Lowe if (do_not_exec_rule) {
196310d63b7dSRichard Lowe append_char('n', &makeflags_string);
196410d63b7dSRichard Lowe append_char('n', &makeflags_string_posix);
196510d63b7dSRichard Lowe }
196610d63b7dSRichard Lowe switch (report_dependencies_level) {
196710d63b7dSRichard Lowe case 4:
196810d63b7dSRichard Lowe append_char('P', &makeflags_string);
196910d63b7dSRichard Lowe append_char('P', &makeflags_string_posix);
19708e0c8248SAndrew Stormont /* FALLTHROUGH */
197110d63b7dSRichard Lowe case 3:
197210d63b7dSRichard Lowe append_char('P', &makeflags_string);
197310d63b7dSRichard Lowe append_char('P', &makeflags_string_posix);
19748e0c8248SAndrew Stormont /* FALLTHROUGH */
197510d63b7dSRichard Lowe case 2:
197610d63b7dSRichard Lowe append_char('P', &makeflags_string);
197710d63b7dSRichard Lowe append_char('P', &makeflags_string_posix);
19788e0c8248SAndrew Stormont /* FALLTHROUGH */
197910d63b7dSRichard Lowe case 1:
198010d63b7dSRichard Lowe append_char('P', &makeflags_string);
198110d63b7dSRichard Lowe append_char('P', &makeflags_string_posix);
198210d63b7dSRichard Lowe }
198310d63b7dSRichard Lowe if (trace_status) {
198410d63b7dSRichard Lowe append_char('p', &makeflags_string);
198510d63b7dSRichard Lowe append_char('p', &makeflags_string_posix);
198610d63b7dSRichard Lowe }
198710d63b7dSRichard Lowe if (quest) {
198810d63b7dSRichard Lowe append_char('q', &makeflags_string);
198910d63b7dSRichard Lowe append_char('q', &makeflags_string_posix);
199010d63b7dSRichard Lowe }
199110d63b7dSRichard Lowe if (silent_all) {
199210d63b7dSRichard Lowe append_char('s', &makeflags_string);
199310d63b7dSRichard Lowe append_char('s', &makeflags_string_posix);
199410d63b7dSRichard Lowe }
199510d63b7dSRichard Lowe if (touch) {
199610d63b7dSRichard Lowe append_char('t', &makeflags_string);
199710d63b7dSRichard Lowe append_char('t', &makeflags_string_posix);
199810d63b7dSRichard Lowe }
199910d63b7dSRichard Lowe if (build_unconditional) {
200010d63b7dSRichard Lowe append_char('u', &makeflags_string);
200110d63b7dSRichard Lowe append_char('u', &makeflags_string_posix);
200210d63b7dSRichard Lowe }
200310d63b7dSRichard Lowe if (report_cwd) {
200410d63b7dSRichard Lowe append_char('w', &makeflags_string);
200510d63b7dSRichard Lowe append_char('w', &makeflags_string_posix);
200610d63b7dSRichard Lowe }
200710d63b7dSRichard Lowe /* -c dmake_rcfile */
200810d63b7dSRichard Lowe if (dmake_rcfile_specified) {
200910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_RCFILE");
201010d63b7dSRichard Lowe dmake_rcfile = GETNAME(wcs_buffer, FIND_LENGTH);
201110d63b7dSRichard Lowe append_makeflags_string(dmake_rcfile, &makeflags_string);
201210d63b7dSRichard Lowe append_makeflags_string(dmake_rcfile, &makeflags_string_posix);
201310d63b7dSRichard Lowe }
201410d63b7dSRichard Lowe /* -g dmake_group */
201510d63b7dSRichard Lowe if (dmake_group_specified) {
201610d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_GROUP");
201710d63b7dSRichard Lowe dmake_group = GETNAME(wcs_buffer, FIND_LENGTH);
201810d63b7dSRichard Lowe append_makeflags_string(dmake_group, &makeflags_string);
201910d63b7dSRichard Lowe append_makeflags_string(dmake_group, &makeflags_string_posix);
202010d63b7dSRichard Lowe }
202110d63b7dSRichard Lowe /* -j dmake_max_jobs */
202210d63b7dSRichard Lowe if (dmake_max_jobs_specified) {
202310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_MAX_JOBS");
202410d63b7dSRichard Lowe dmake_max_jobs = GETNAME(wcs_buffer, FIND_LENGTH);
202510d63b7dSRichard Lowe append_makeflags_string(dmake_max_jobs, &makeflags_string);
202610d63b7dSRichard Lowe append_makeflags_string(dmake_max_jobs, &makeflags_string_posix);
202710d63b7dSRichard Lowe }
202810d63b7dSRichard Lowe /* -m dmake_mode */
202910d63b7dSRichard Lowe if (dmake_mode_specified) {
203010d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_MODE");
203110d63b7dSRichard Lowe dmake_mode = GETNAME(wcs_buffer, FIND_LENGTH);
203210d63b7dSRichard Lowe append_makeflags_string(dmake_mode, &makeflags_string);
203310d63b7dSRichard Lowe append_makeflags_string(dmake_mode, &makeflags_string_posix);
203410d63b7dSRichard Lowe }
203510d63b7dSRichard Lowe /* -x dmake_compat_mode */
203610d63b7dSRichard Lowe // if (dmake_compat_mode_specified) {
203710d63b7dSRichard Lowe // MBSTOWCS(wcs_buffer, "SUN_MAKE_COMPAT_MODE");
203810d63b7dSRichard Lowe // dmake_compat_mode = GETNAME(wcs_buffer, FIND_LENGTH);
203910d63b7dSRichard Lowe // append_makeflags_string(dmake_compat_mode, &makeflags_string);
204010d63b7dSRichard Lowe // append_makeflags_string(dmake_compat_mode, &makeflags_string_posix);
204110d63b7dSRichard Lowe // }
204210d63b7dSRichard Lowe /* -x dmake_output_mode */
204310d63b7dSRichard Lowe if (dmake_output_mode_specified) {
204410d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_OUTPUT_MODE");
204510d63b7dSRichard Lowe dmake_output_mode = GETNAME(wcs_buffer, FIND_LENGTH);
204610d63b7dSRichard Lowe append_makeflags_string(dmake_output_mode, &makeflags_string);
204710d63b7dSRichard Lowe append_makeflags_string(dmake_output_mode, &makeflags_string_posix);
204810d63b7dSRichard Lowe }
204910d63b7dSRichard Lowe /* -o dmake_odir */
205010d63b7dSRichard Lowe if (dmake_odir_specified) {
205110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_ODIR");
205210d63b7dSRichard Lowe dmake_odir = GETNAME(wcs_buffer, FIND_LENGTH);
205310d63b7dSRichard Lowe append_makeflags_string(dmake_odir, &makeflags_string);
205410d63b7dSRichard Lowe append_makeflags_string(dmake_odir, &makeflags_string_posix);
205510d63b7dSRichard Lowe }
205610d63b7dSRichard Lowe /* -M pmake_machinesfile */
205710d63b7dSRichard Lowe if (pmake_machinesfile_specified) {
205810d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "PMAKE_MACHINESFILE");
205910d63b7dSRichard Lowe pmake_machinesfile = GETNAME(wcs_buffer, FIND_LENGTH);
206010d63b7dSRichard Lowe append_makeflags_string(pmake_machinesfile, &makeflags_string);
206110d63b7dSRichard Lowe append_makeflags_string(pmake_machinesfile, &makeflags_string_posix);
206210d63b7dSRichard Lowe }
206310d63b7dSRichard Lowe /* -R */
206410d63b7dSRichard Lowe if (pmake_cap_r_specified) {
206510d63b7dSRichard Lowe append_char((int) space_char, &makeflags_string);
206610d63b7dSRichard Lowe append_char((int) hyphen_char, &makeflags_string);
206710d63b7dSRichard Lowe append_char('R', &makeflags_string);
206810d63b7dSRichard Lowe append_char((int) space_char, &makeflags_string_posix);
206910d63b7dSRichard Lowe append_char((int) hyphen_char, &makeflags_string_posix);
207010d63b7dSRichard Lowe append_char('R', &makeflags_string_posix);
207110d63b7dSRichard Lowe }
207210d63b7dSRichard Lowe
207310d63b7dSRichard Lowe /*
207410d63b7dSRichard Lowe * Make sure MAKEFLAGS is exported
207510d63b7dSRichard Lowe */
207610d63b7dSRichard Lowe maybe_append_prop(makeflags, macro_prop)->
207710d63b7dSRichard Lowe body.macro.exported = true;
207810d63b7dSRichard Lowe
207910d63b7dSRichard Lowe if (makeflags_string.buffer.start[1] != (int) nul_char) {
208010d63b7dSRichard Lowe if (makeflags_string.buffer.start[1] != (int) space_char) {
208110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "MFLAGS");
208210d63b7dSRichard Lowe (void) SETVAR(GETNAME(wcs_buffer, FIND_LENGTH),
208310d63b7dSRichard Lowe GETNAME(makeflags_string.buffer.start,
208410d63b7dSRichard Lowe FIND_LENGTH),
208510d63b7dSRichard Lowe false);
208610d63b7dSRichard Lowe } else {
208710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "MFLAGS");
208810d63b7dSRichard Lowe (void) SETVAR(GETNAME(wcs_buffer, FIND_LENGTH),
208910d63b7dSRichard Lowe GETNAME(makeflags_string.buffer.start + 2,
209010d63b7dSRichard Lowe FIND_LENGTH),
209110d63b7dSRichard Lowe false);
209210d63b7dSRichard Lowe }
209310d63b7dSRichard Lowe }
209410d63b7dSRichard Lowe
2095ae389aa9SAndy Fiddaman /*
2096ae389aa9SAndy Fiddaman * Add command line macro to POSIX makeflags_string
209710d63b7dSRichard Lowe */
209810d63b7dSRichard Lowe if (makeflags_and_macro.start) {
209910d63b7dSRichard Lowe tmp_char = (char) space_char;
210010d63b7dSRichard Lowe cp = makeflags_and_macro.start;
210110d63b7dSRichard Lowe do {
210210d63b7dSRichard Lowe append_char(tmp_char, &makeflags_string_posix);
2103ae389aa9SAndy Fiddaman } while ( tmp_char = *cp++ );
210410d63b7dSRichard Lowe retmem_mb(makeflags_and_macro.start);
210510d63b7dSRichard Lowe }
210610d63b7dSRichard Lowe
210710d63b7dSRichard Lowe /*
210810d63b7dSRichard Lowe * Now set the value of MAKEFLAGS macro in accordance
210910d63b7dSRichard Lowe * with current mode.
211010d63b7dSRichard Lowe */
211110d63b7dSRichard Lowe macro = maybe_append_prop(makeflags, macro_prop);
211210d63b7dSRichard Lowe temp = (Boolean) macro->body.macro.read_only;
211310d63b7dSRichard Lowe macro->body.macro.read_only = false;
211410d63b7dSRichard Lowe if(posix || gnu_style) {
211510d63b7dSRichard Lowe makeflags_string_current = &makeflags_string_posix;
211610d63b7dSRichard Lowe } else {
211710d63b7dSRichard Lowe makeflags_string_current = &makeflags_string;
211810d63b7dSRichard Lowe }
211910d63b7dSRichard Lowe if (makeflags_string_current->buffer.start[1] == (int) nul_char) {
212010d63b7dSRichard Lowe makeflags_value_saved =
212110d63b7dSRichard Lowe GETNAME( makeflags_string_current->buffer.start + 1
212210d63b7dSRichard Lowe , FIND_LENGTH
212310d63b7dSRichard Lowe );
212410d63b7dSRichard Lowe } else {
212510d63b7dSRichard Lowe if (makeflags_string_current->buffer.start[1] != (int) space_char) {
212610d63b7dSRichard Lowe makeflags_value_saved =
212710d63b7dSRichard Lowe GETNAME( makeflags_string_current->buffer.start
212810d63b7dSRichard Lowe , FIND_LENGTH
212910d63b7dSRichard Lowe );
213010d63b7dSRichard Lowe } else {
213110d63b7dSRichard Lowe makeflags_value_saved =
213210d63b7dSRichard Lowe GETNAME( makeflags_string_current->buffer.start + 2
213310d63b7dSRichard Lowe , FIND_LENGTH
213410d63b7dSRichard Lowe );
213510d63b7dSRichard Lowe }
213610d63b7dSRichard Lowe }
213710d63b7dSRichard Lowe (void) SETVAR( makeflags
213810d63b7dSRichard Lowe , makeflags_value_saved
213910d63b7dSRichard Lowe , false
214010d63b7dSRichard Lowe );
214110d63b7dSRichard Lowe macro->body.macro.read_only = temp;
214210d63b7dSRichard Lowe
214310d63b7dSRichard Lowe /*
214410d63b7dSRichard Lowe * Read command line "-f" arguments and ignore -c, g, j, K, M, m, O and o args.
214510d63b7dSRichard Lowe */
214610d63b7dSRichard Lowe save_do_not_exec_rule = do_not_exec_rule;
214710d63b7dSRichard Lowe do_not_exec_rule = false;
214810d63b7dSRichard Lowe if (read_trace_level > 0) {
214910d63b7dSRichard Lowe trace_reader = true;
215010d63b7dSRichard Lowe }
215110d63b7dSRichard Lowe
215210d63b7dSRichard Lowe for (i = 1; i < argc; i++) {
215310d63b7dSRichard Lowe if (argv[i] &&
215410d63b7dSRichard Lowe (argv[i][0] == (int) hyphen_char) &&
215510d63b7dSRichard Lowe (argv[i][1] == 'f') &&
215610d63b7dSRichard Lowe (argv[i][2] == (int) nul_char)) {
215710d63b7dSRichard Lowe argv[i] = NULL; /* Remove -f */
215810d63b7dSRichard Lowe if (i >= argc - 1) {
215910d63b7dSRichard Lowe fatal(gettext("No filename argument after -f flag"));
216010d63b7dSRichard Lowe }
216110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, argv[++i]);
216210d63b7dSRichard Lowe primary_makefile = GETNAME(wcs_buffer, FIND_LENGTH);
216310d63b7dSRichard Lowe (void) read_makefile(primary_makefile, true, true, true);
216410d63b7dSRichard Lowe argv[i] = NULL; /* Remove filename */
216510d63b7dSRichard Lowe makefile_read = true;
216610d63b7dSRichard Lowe } else if (argv[i] &&
216710d63b7dSRichard Lowe (argv[i][0] == (int) hyphen_char) &&
216810d63b7dSRichard Lowe (argv[i][1] == 'c' ||
216910d63b7dSRichard Lowe argv[i][1] == 'g' ||
217010d63b7dSRichard Lowe argv[i][1] == 'j' ||
217110d63b7dSRichard Lowe argv[i][1] == 'K' ||
217210d63b7dSRichard Lowe argv[i][1] == 'M' ||
217310d63b7dSRichard Lowe argv[i][1] == 'm' ||
217410d63b7dSRichard Lowe argv[i][1] == 'O' ||
217510d63b7dSRichard Lowe argv[i][1] == 'o') &&
217610d63b7dSRichard Lowe (argv[i][2] == (int) nul_char)) {
217710d63b7dSRichard Lowe argv[i] = NULL;
217810d63b7dSRichard Lowe argv[++i] = NULL;
217910d63b7dSRichard Lowe }
218010d63b7dSRichard Lowe }
218110d63b7dSRichard Lowe
218210d63b7dSRichard Lowe /*
218310d63b7dSRichard Lowe * If no command line "-f" args then look for "makefile", and then for
218410d63b7dSRichard Lowe * "Makefile" if "makefile" isn't found.
218510d63b7dSRichard Lowe */
218610d63b7dSRichard Lowe if (!makefile_read) {
218710d63b7dSRichard Lowe (void) read_dir(dot,
218810d63b7dSRichard Lowe (wchar_t *) NULL,
218910d63b7dSRichard Lowe (Property) NULL,
219010d63b7dSRichard Lowe (wchar_t *) NULL);
219110d63b7dSRichard Lowe if (!posix) {
219210d63b7dSRichard Lowe if (makefile_name->stat.is_file) {
219310d63b7dSRichard Lowe if (Makefile->stat.is_file) {
219410d63b7dSRichard Lowe warning(gettext("Both `makefile' and `Makefile' exist"));
219510d63b7dSRichard Lowe }
219610d63b7dSRichard Lowe primary_makefile = makefile_name;
219710d63b7dSRichard Lowe makefile_read = read_makefile(makefile_name,
219810d63b7dSRichard Lowe false,
219910d63b7dSRichard Lowe false,
220010d63b7dSRichard Lowe true);
220110d63b7dSRichard Lowe }
220210d63b7dSRichard Lowe if (!makefile_read &&
220310d63b7dSRichard Lowe Makefile->stat.is_file) {
220410d63b7dSRichard Lowe primary_makefile = Makefile;
220510d63b7dSRichard Lowe makefile_read = read_makefile(Makefile,
220610d63b7dSRichard Lowe false,
220710d63b7dSRichard Lowe false,
220810d63b7dSRichard Lowe true);
220910d63b7dSRichard Lowe }
221010d63b7dSRichard Lowe } else {
221110d63b7dSRichard Lowe
221210d63b7dSRichard Lowe enum sccs_stat save_m_has_sccs = NO_SCCS;
221310d63b7dSRichard Lowe enum sccs_stat save_M_has_sccs = NO_SCCS;
221410d63b7dSRichard Lowe
221510d63b7dSRichard Lowe if (makefile_name->stat.is_file) {
221610d63b7dSRichard Lowe if (Makefile->stat.is_file) {
221710d63b7dSRichard Lowe warning(gettext("Both `makefile' and `Makefile' exist"));
221810d63b7dSRichard Lowe }
221910d63b7dSRichard Lowe }
222010d63b7dSRichard Lowe if (makefile_name->stat.is_file) {
222110d63b7dSRichard Lowe if (makefile_name->stat.has_sccs == NO_SCCS) {
222210d63b7dSRichard Lowe primary_makefile = makefile_name;
222310d63b7dSRichard Lowe makefile_read = read_makefile(makefile_name,
222410d63b7dSRichard Lowe false,
222510d63b7dSRichard Lowe false,
222610d63b7dSRichard Lowe true);
222710d63b7dSRichard Lowe } else {
222810d63b7dSRichard Lowe save_m_has_sccs = makefile_name->stat.has_sccs;
222910d63b7dSRichard Lowe makefile_name->stat.has_sccs = NO_SCCS;
223010d63b7dSRichard Lowe primary_makefile = makefile_name;
223110d63b7dSRichard Lowe makefile_read = read_makefile(makefile_name,
223210d63b7dSRichard Lowe false,
223310d63b7dSRichard Lowe false,
223410d63b7dSRichard Lowe true);
223510d63b7dSRichard Lowe }
223610d63b7dSRichard Lowe }
223710d63b7dSRichard Lowe if (!makefile_read &&
223810d63b7dSRichard Lowe Makefile->stat.is_file) {
223910d63b7dSRichard Lowe if (Makefile->stat.has_sccs == NO_SCCS) {
224010d63b7dSRichard Lowe primary_makefile = Makefile;
224110d63b7dSRichard Lowe makefile_read = read_makefile(Makefile,
224210d63b7dSRichard Lowe false,
224310d63b7dSRichard Lowe false,
224410d63b7dSRichard Lowe true);
224510d63b7dSRichard Lowe } else {
224610d63b7dSRichard Lowe save_M_has_sccs = Makefile->stat.has_sccs;
224710d63b7dSRichard Lowe Makefile->stat.has_sccs = NO_SCCS;
224810d63b7dSRichard Lowe primary_makefile = Makefile;
224910d63b7dSRichard Lowe makefile_read = read_makefile(Makefile,
225010d63b7dSRichard Lowe false,
225110d63b7dSRichard Lowe false,
225210d63b7dSRichard Lowe true);
225310d63b7dSRichard Lowe }
225410d63b7dSRichard Lowe }
225510d63b7dSRichard Lowe if (!makefile_read &&
225610d63b7dSRichard Lowe makefile_name->stat.is_file) {
225710d63b7dSRichard Lowe makefile_name->stat.has_sccs = save_m_has_sccs;
225810d63b7dSRichard Lowe primary_makefile = makefile_name;
225910d63b7dSRichard Lowe makefile_read = read_makefile(makefile_name,
226010d63b7dSRichard Lowe false,
226110d63b7dSRichard Lowe false,
226210d63b7dSRichard Lowe true);
226310d63b7dSRichard Lowe }
226410d63b7dSRichard Lowe if (!makefile_read &&
226510d63b7dSRichard Lowe Makefile->stat.is_file) {
226610d63b7dSRichard Lowe Makefile->stat.has_sccs = save_M_has_sccs;
226710d63b7dSRichard Lowe primary_makefile = Makefile;
226810d63b7dSRichard Lowe makefile_read = read_makefile(Makefile,
226910d63b7dSRichard Lowe false,
227010d63b7dSRichard Lowe false,
227110d63b7dSRichard Lowe true);
227210d63b7dSRichard Lowe }
227310d63b7dSRichard Lowe }
227410d63b7dSRichard Lowe }
227510d63b7dSRichard Lowe do_not_exec_rule = save_do_not_exec_rule;
227610d63b7dSRichard Lowe allrules_read = makefile_read;
227710d63b7dSRichard Lowe trace_reader = false;
227810d63b7dSRichard Lowe
227910d63b7dSRichard Lowe /*
228010d63b7dSRichard Lowe * Now get current value of MAKEFLAGS and compare it with
228110d63b7dSRichard Lowe * the saved value we set before reading makefile.
228210d63b7dSRichard Lowe * If they are different then MAKEFLAGS is subsequently set by
228310d63b7dSRichard Lowe * makefile, just leave it there. Otherwise, if make mode
228410d63b7dSRichard Lowe * is changed by using .POSIX target in makefile we need
228510d63b7dSRichard Lowe * to correct MAKEFLAGS value.
228610d63b7dSRichard Lowe */
228710d63b7dSRichard Lowe Name mf_val = getvar(makeflags);
228810d63b7dSRichard Lowe if( (posix != is_xpg4)
228910d63b7dSRichard Lowe && (!strcmp(mf_val->string_mb, makeflags_value_saved->string_mb)))
229010d63b7dSRichard Lowe {
229110d63b7dSRichard Lowe if (makeflags_string_posix.buffer.start[1] == (int) nul_char) {
229210d63b7dSRichard Lowe (void) SETVAR(makeflags,
229310d63b7dSRichard Lowe GETNAME(makeflags_string_posix.buffer.start + 1,
229410d63b7dSRichard Lowe FIND_LENGTH),
229510d63b7dSRichard Lowe false);
229610d63b7dSRichard Lowe } else {
229710d63b7dSRichard Lowe if (makeflags_string_posix.buffer.start[1] != (int) space_char) {
229810d63b7dSRichard Lowe (void) SETVAR(makeflags,
229910d63b7dSRichard Lowe GETNAME(makeflags_string_posix.buffer.start,
230010d63b7dSRichard Lowe FIND_LENGTH),
230110d63b7dSRichard Lowe false);
230210d63b7dSRichard Lowe } else {
230310d63b7dSRichard Lowe (void) SETVAR(makeflags,
230410d63b7dSRichard Lowe GETNAME(makeflags_string_posix.buffer.start + 2,
230510d63b7dSRichard Lowe FIND_LENGTH),
230610d63b7dSRichard Lowe false);
230710d63b7dSRichard Lowe }
230810d63b7dSRichard Lowe }
230910d63b7dSRichard Lowe }
231010d63b7dSRichard Lowe
231110d63b7dSRichard Lowe if (makeflags_string.free_after_use) {
231210d63b7dSRichard Lowe retmem(makeflags_string.buffer.start);
231310d63b7dSRichard Lowe }
231410d63b7dSRichard Lowe if (makeflags_string_posix.free_after_use) {
231510d63b7dSRichard Lowe retmem(makeflags_string_posix.buffer.start);
231610d63b7dSRichard Lowe }
231710d63b7dSRichard Lowe makeflags_string.buffer.start = NULL;
231810d63b7dSRichard Lowe makeflags_string_posix.buffer.start = NULL;
231910d63b7dSRichard Lowe
232010d63b7dSRichard Lowe if (posix) {
232110d63b7dSRichard Lowe /*
232210d63b7dSRichard Lowe * If the user did not redefine the ARFLAGS macro in the
232310d63b7dSRichard Lowe * default makefile (make.rules), then we'd like to
232410d63b7dSRichard Lowe * change the macro value of ARFLAGS to be in accordance
232510d63b7dSRichard Lowe * with "POSIX" requirements.
232610d63b7dSRichard Lowe */
232710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "ARFLAGS");
232810d63b7dSRichard Lowe name = GETNAME(wcs_buffer, wcslen(wcs_buffer));
232910d63b7dSRichard Lowe macro = get_prop(name->prop, macro_prop);
233010d63b7dSRichard Lowe if ((macro != NULL) && /* Maybe (macro == NULL) || ? */
233110d63b7dSRichard Lowe (IS_EQUAL(macro->body.macro.value->string_mb,
233210d63b7dSRichard Lowe "rv"))) {
233310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "-rv");
233410d63b7dSRichard Lowe value = GETNAME(wcs_buffer, wcslen(wcs_buffer));
233510d63b7dSRichard Lowe (void) SETVAR(name,
233610d63b7dSRichard Lowe value,
233710d63b7dSRichard Lowe false);
233810d63b7dSRichard Lowe }
233910d63b7dSRichard Lowe }
234010d63b7dSRichard Lowe
234110d63b7dSRichard Lowe if (!posix && !svr4) {
234210d63b7dSRichard Lowe set_sgs_support();
234310d63b7dSRichard Lowe }
234410d63b7dSRichard Lowe
234510d63b7dSRichard Lowe
234610d63b7dSRichard Lowe /*
234710d63b7dSRichard Lowe * Make sure KEEP_STATE is in the environment if KEEP_STATE is on.
234810d63b7dSRichard Lowe */
234910d63b7dSRichard Lowe macro = get_prop(keep_state_name->prop, macro_prop);
235010d63b7dSRichard Lowe if ((macro != NULL) &&
235110d63b7dSRichard Lowe macro->body.macro.exported) {
235210d63b7dSRichard Lowe keep_state = true;
235310d63b7dSRichard Lowe }
235410d63b7dSRichard Lowe if (keep_state) {
235510d63b7dSRichard Lowe if (macro == NULL) {
235610d63b7dSRichard Lowe macro = maybe_append_prop(keep_state_name,
235710d63b7dSRichard Lowe macro_prop);
235810d63b7dSRichard Lowe }
235910d63b7dSRichard Lowe macro->body.macro.exported = true;
236010d63b7dSRichard Lowe (void) SETVAR(keep_state_name,
236110d63b7dSRichard Lowe empty_name,
236210d63b7dSRichard Lowe false);
236310d63b7dSRichard Lowe
236410d63b7dSRichard Lowe /*
236510d63b7dSRichard Lowe * Read state file
236610d63b7dSRichard Lowe */
236710d63b7dSRichard Lowe
236810d63b7dSRichard Lowe /* Before we read state, let's make sure we have
236910d63b7dSRichard Lowe ** right state file.
237010d63b7dSRichard Lowe */
237110d63b7dSRichard Lowe /* just in case macro references are used in make_state file
237210d63b7dSRichard Lowe ** name, we better expand them at this stage using expand_value.
237310d63b7dSRichard Lowe */
237410d63b7dSRichard Lowe INIT_STRING_FROM_STACK(dest, destbuffer);
237510d63b7dSRichard Lowe expand_value(make_state, &dest, false);
237610d63b7dSRichard Lowe
237710d63b7dSRichard Lowe make_state = GETNAME(dest.buffer.start, FIND_LENGTH);
237810d63b7dSRichard Lowe
237910d63b7dSRichard Lowe if(!stat(make_state->string_mb, &make_state_stat)) {
238010d63b7dSRichard Lowe if(!(make_state_stat.st_mode & S_IFREG) ) {
238110d63b7dSRichard Lowe /* copy the make_state structure to the other
238210d63b7dSRichard Lowe ** and then let make_state point to the new
238310d63b7dSRichard Lowe ** one.
238410d63b7dSRichard Lowe */
238510d63b7dSRichard Lowe memcpy(&state_filename, make_state,sizeof(state_filename));
238610d63b7dSRichard Lowe state_filename.string_mb = state_file_str_mb;
2387ae389aa9SAndy Fiddaman /* Just a kludge to avoid two slashes back to back */
238810d63b7dSRichard Lowe if((make_state->hash.length == 1)&&
238910d63b7dSRichard Lowe (make_state->string_mb[0] == '/')) {
239010d63b7dSRichard Lowe make_state->hash.length = 0;
239110d63b7dSRichard Lowe make_state->string_mb[0] = '\0';
239210d63b7dSRichard Lowe }
2393ae389aa9SAndy Fiddaman sprintf(state_file_str_mb,"%s%s",
239410d63b7dSRichard Lowe make_state->string_mb,"/.make.state");
239510d63b7dSRichard Lowe make_state = &state_filename;
239610d63b7dSRichard Lowe /* adjust the length to reflect the appended string */
239710d63b7dSRichard Lowe make_state->hash.length += 12;
239810d63b7dSRichard Lowe }
239910d63b7dSRichard Lowe } else { /* the file doesn't exist or no permission */
240010d63b7dSRichard Lowe char tmp_path[MAXPATHLEN];
240110d63b7dSRichard Lowe char *slashp;
240210d63b7dSRichard Lowe
240310d63b7dSRichard Lowe if (slashp = strrchr(make_state->string_mb, '/')) {
2404ae389aa9SAndy Fiddaman strncpy(tmp_path, make_state->string_mb,
240510d63b7dSRichard Lowe (slashp - make_state->string_mb));
240610d63b7dSRichard Lowe tmp_path[slashp - make_state->string_mb]=0;
240710d63b7dSRichard Lowe if(strlen(tmp_path)) {
240810d63b7dSRichard Lowe if(stat(tmp_path, &make_state_stat)) {
240910d63b7dSRichard Lowe warning(gettext("directory %s for .KEEP_STATE_FILE does not exist"),tmp_path);
241010d63b7dSRichard Lowe }
241110d63b7dSRichard Lowe if (access(tmp_path, F_OK) != 0) {
241210d63b7dSRichard Lowe warning(gettext("can't access dir %s"),tmp_path);
241310d63b7dSRichard Lowe }
241410d63b7dSRichard Lowe }
241510d63b7dSRichard Lowe }
241610d63b7dSRichard Lowe }
241710d63b7dSRichard Lowe if (report_dependencies_level != 1) {
241810d63b7dSRichard Lowe Makefile_type makefile_type_temp = makefile_type;
241910d63b7dSRichard Lowe makefile_type = reading_statefile;
242010d63b7dSRichard Lowe if (read_trace_level > 1) {
242110d63b7dSRichard Lowe trace_reader = true;
242210d63b7dSRichard Lowe }
242310d63b7dSRichard Lowe (void) read_simple_file(make_state,
242410d63b7dSRichard Lowe false,
242510d63b7dSRichard Lowe false,
242610d63b7dSRichard Lowe false,
242710d63b7dSRichard Lowe false,
242810d63b7dSRichard Lowe false,
242910d63b7dSRichard Lowe true);
243010d63b7dSRichard Lowe trace_reader = false;
243110d63b7dSRichard Lowe makefile_type = makefile_type_temp;
243210d63b7dSRichard Lowe }
243310d63b7dSRichard Lowe }
243410d63b7dSRichard Lowe }
243510d63b7dSRichard Lowe
243610d63b7dSRichard Lowe /*
243710d63b7dSRichard Lowe * Scan the argv for options and "=" type args and make them readonly.
243810d63b7dSRichard Lowe */
243910d63b7dSRichard Lowe static void
enter_argv_values(int argc,char * argv[],ASCII_Dyn_Array * makeflags_and_macro)244010d63b7dSRichard Lowe enter_argv_values(int argc, char *argv[], ASCII_Dyn_Array *makeflags_and_macro)
244110d63b7dSRichard Lowe {
2442*e7afc443SToomas Soome char *cp;
2443*e7afc443SToomas Soome int i;
244410d63b7dSRichard Lowe int length;
2445*e7afc443SToomas Soome Name name;
2446ae389aa9SAndy Fiddaman int opt_separator = argc;
244710d63b7dSRichard Lowe char tmp_char;
244810d63b7dSRichard Lowe wchar_t *tmp_wcs_buffer;
2449*e7afc443SToomas Soome Name value;
245010d63b7dSRichard Lowe Boolean append = false;
245110d63b7dSRichard Lowe Property macro;
245210d63b7dSRichard Lowe struct stat statbuf;
245310d63b7dSRichard Lowe
245410d63b7dSRichard Lowe
245510d63b7dSRichard Lowe /* Read argv options and "=" type args and make them readonly. */
245610d63b7dSRichard Lowe makefile_type = reading_nothing;
245710d63b7dSRichard Lowe for (i = 1; i < argc; ++i) {
245810d63b7dSRichard Lowe append = false;
245910d63b7dSRichard Lowe if (argv[i] == NULL) {
246010d63b7dSRichard Lowe continue;
246110d63b7dSRichard Lowe } else if (((argv[i][0] == '-') && (argv[i][1] == '-')) ||
246210d63b7dSRichard Lowe ((argv[i][0] == (int) ' ') &&
246310d63b7dSRichard Lowe (argv[i][1] == (int) '-') &&
246410d63b7dSRichard Lowe (argv[i][2] == (int) ' ') &&
246510d63b7dSRichard Lowe (argv[i][3] == (int) '-'))) {
246610d63b7dSRichard Lowe argv[i] = NULL;
246710d63b7dSRichard Lowe opt_separator = i;
246810d63b7dSRichard Lowe continue;
246910d63b7dSRichard Lowe } else if ((i < opt_separator) && (argv[i][0] == (int) hyphen_char)) {
247010d63b7dSRichard Lowe switch (parse_command_option(argv[i][1])) {
247110d63b7dSRichard Lowe case 1: /* -f seen */
247210d63b7dSRichard Lowe ++i;
247310d63b7dSRichard Lowe continue;
247410d63b7dSRichard Lowe case 2: /* -c seen */
247510d63b7dSRichard Lowe if (argv[i+1] == NULL) {
247610d63b7dSRichard Lowe fatal(gettext("No dmake rcfile argument after -c flag"));
247710d63b7dSRichard Lowe }
247810d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_RCFILE");
247910d63b7dSRichard Lowe name = GETNAME(wcs_buffer, FIND_LENGTH);
248010d63b7dSRichard Lowe break;
248110d63b7dSRichard Lowe case 4: /* -g seen */
248210d63b7dSRichard Lowe if (argv[i+1] == NULL) {
248310d63b7dSRichard Lowe fatal(gettext("No dmake group argument after -g flag"));
248410d63b7dSRichard Lowe }
248510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_GROUP");
248610d63b7dSRichard Lowe name = GETNAME(wcs_buffer, FIND_LENGTH);
248710d63b7dSRichard Lowe break;
248810d63b7dSRichard Lowe case 8: /* -j seen */
248910d63b7dSRichard Lowe if (argv[i+1] == NULL) {
249010d63b7dSRichard Lowe fatal(gettext("No dmake max jobs argument after -j flag"));
249110d63b7dSRichard Lowe }
249210d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_MAX_JOBS");
249310d63b7dSRichard Lowe name = GETNAME(wcs_buffer, FIND_LENGTH);
249410d63b7dSRichard Lowe break;
249510d63b7dSRichard Lowe case 16: /* -M seen */
249610d63b7dSRichard Lowe if (argv[i+1] == NULL) {
249710d63b7dSRichard Lowe fatal(gettext("No pmake machinesfile argument after -M flag"));
249810d63b7dSRichard Lowe }
249910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "PMAKE_MACHINESFILE");
250010d63b7dSRichard Lowe name = GETNAME(wcs_buffer, FIND_LENGTH);
250110d63b7dSRichard Lowe break;
250210d63b7dSRichard Lowe case 32: /* -m seen */
250310d63b7dSRichard Lowe if (argv[i+1] == NULL) {
250410d63b7dSRichard Lowe fatal(gettext("No dmake mode argument after -m flag"));
250510d63b7dSRichard Lowe }
250610d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_MODE");
250710d63b7dSRichard Lowe name = GETNAME(wcs_buffer, FIND_LENGTH);
250810d63b7dSRichard Lowe break;
250910d63b7dSRichard Lowe case 256: /* -K seen */
251010d63b7dSRichard Lowe if (argv[i+1] == NULL) {
251110d63b7dSRichard Lowe fatal(gettext("No makestate filename argument after -K flag"));
251210d63b7dSRichard Lowe }
251310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, argv[i+1]);
251410d63b7dSRichard Lowe make_state = GETNAME(wcs_buffer, FIND_LENGTH);
251510d63b7dSRichard Lowe keep_state = true;
251610d63b7dSRichard Lowe argv[i] = NULL;
251710d63b7dSRichard Lowe argv[i+1] = NULL;
251810d63b7dSRichard Lowe continue;
251910d63b7dSRichard Lowe case 512: /* -o seen */
252010d63b7dSRichard Lowe if (argv[i+1] == NULL) {
252110d63b7dSRichard Lowe fatal(gettext("No dmake output dir argument after -o flag"));
252210d63b7dSRichard Lowe }
252310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_ODIR");
252410d63b7dSRichard Lowe name = GETNAME(wcs_buffer, FIND_LENGTH);
252510d63b7dSRichard Lowe break;
252610d63b7dSRichard Lowe case 1024: /* -x seen */
252710d63b7dSRichard Lowe if (argv[i+1] == NULL) {
252810d63b7dSRichard Lowe fatal(gettext("No argument after -x flag"));
252910d63b7dSRichard Lowe }
253010d63b7dSRichard Lowe length = strlen( "SUN_MAKE_COMPAT_MODE=");
253110d63b7dSRichard Lowe if (strncmp(argv[i+1], "SUN_MAKE_COMPAT_MODE=", length) == 0) {
253210d63b7dSRichard Lowe argv[i+1] = &argv[i+1][length];
253310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "SUN_MAKE_COMPAT_MODE");
253410d63b7dSRichard Lowe name = GETNAME(wcs_buffer, FIND_LENGTH);
253510d63b7dSRichard Lowe dmake_compat_mode_specified = dmake_add_mode_specified;
253610d63b7dSRichard Lowe break;
253710d63b7dSRichard Lowe }
253810d63b7dSRichard Lowe length = strlen( "DMAKE_OUTPUT_MODE=");
253910d63b7dSRichard Lowe if (strncmp(argv[i+1], "DMAKE_OUTPUT_MODE=", length) == 0) {
254010d63b7dSRichard Lowe argv[i+1] = &argv[i+1][length];
254110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "DMAKE_OUTPUT_MODE");
254210d63b7dSRichard Lowe name = GETNAME(wcs_buffer, FIND_LENGTH);
254310d63b7dSRichard Lowe dmake_output_mode_specified = dmake_add_mode_specified;
254410d63b7dSRichard Lowe } else {
254510d63b7dSRichard Lowe warning(gettext("Unknown argument `%s' after -x flag (ignored)"),
254610d63b7dSRichard Lowe argv[i+1]);
254710d63b7dSRichard Lowe argv[i] = argv[i + 1] = NULL;
254810d63b7dSRichard Lowe continue;
254910d63b7dSRichard Lowe }
255010d63b7dSRichard Lowe break;
255136cd0120SRobert Mustacchi case 2048: /* -C seen */
2552ae389aa9SAndy Fiddaman /*
2553ae389aa9SAndy Fiddaman * The chdir() will have been performed
2554ae389aa9SAndy Fiddaman * in read_command_options().
2555ae389aa9SAndy Fiddaman * Just set DMAKE_CDIR here.
2556ae389aa9SAndy Fiddaman */
255736cd0120SRobert Mustacchi if (argv[i + 1] == NULL) {
2558ae389aa9SAndy Fiddaman fatal(gettext(
2559ae389aa9SAndy Fiddaman "No argument after -C flag"));
256036cd0120SRobert Mustacchi }
256132106ed6SJohn Levon MBSTOWCS(wcs_buffer, "DMAKE_CDIR");
256232106ed6SJohn Levon name = GETNAME(wcs_buffer, FIND_LENGTH);
256336cd0120SRobert Mustacchi break;
256410d63b7dSRichard Lowe default: /* Shouldn't reach here */
256510d63b7dSRichard Lowe argv[i] = NULL;
256610d63b7dSRichard Lowe continue;
256710d63b7dSRichard Lowe }
256810d63b7dSRichard Lowe argv[i] = NULL;
256910d63b7dSRichard Lowe if (i == (argc - 1)) {
257010d63b7dSRichard Lowe break;
257110d63b7dSRichard Lowe }
257210d63b7dSRichard Lowe if ((length = strlen(argv[i+1])) >= MAXPATHLEN) {
257310d63b7dSRichard Lowe tmp_wcs_buffer = ALLOC_WC(length + 1);
257410d63b7dSRichard Lowe (void) mbstowcs(tmp_wcs_buffer, argv[i+1], length + 1);
257510d63b7dSRichard Lowe value = GETNAME(tmp_wcs_buffer, FIND_LENGTH);
257610d63b7dSRichard Lowe retmem(tmp_wcs_buffer);
257710d63b7dSRichard Lowe } else {
257810d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, argv[i+1]);
257910d63b7dSRichard Lowe value = GETNAME(wcs_buffer, FIND_LENGTH);
258010d63b7dSRichard Lowe }
258110d63b7dSRichard Lowe argv[i+1] = NULL;
258210d63b7dSRichard Lowe } else if ((cp = strchr(argv[i], (int) equal_char)) != NULL) {
2583ae389aa9SAndy Fiddaman /*
258410d63b7dSRichard Lowe * Combine all macro in dynamic array
258510d63b7dSRichard Lowe */
258610d63b7dSRichard Lowe if(*(cp-1) == (int) plus_char)
258710d63b7dSRichard Lowe {
258810d63b7dSRichard Lowe if(isspace(*(cp-2))) {
258910d63b7dSRichard Lowe append = true;
259010d63b7dSRichard Lowe cp--;
259110d63b7dSRichard Lowe }
259210d63b7dSRichard Lowe }
259310d63b7dSRichard Lowe if(!append)
259410d63b7dSRichard Lowe append_or_replace_macro_in_dyn_array(makeflags_and_macro, argv[i]);
259510d63b7dSRichard Lowe
259610d63b7dSRichard Lowe while (isspace(*(cp-1))) {
259710d63b7dSRichard Lowe cp--;
259810d63b7dSRichard Lowe }
259910d63b7dSRichard Lowe tmp_char = *cp;
260010d63b7dSRichard Lowe *cp = (int) nul_char;
260110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, argv[i]);
260210d63b7dSRichard Lowe *cp = tmp_char;
260310d63b7dSRichard Lowe name = GETNAME(wcs_buffer, wcslen(wcs_buffer));
260410d63b7dSRichard Lowe while (*cp != (int) equal_char) {
260510d63b7dSRichard Lowe cp++;
260610d63b7dSRichard Lowe }
260710d63b7dSRichard Lowe cp++;
260810d63b7dSRichard Lowe while (isspace(*cp) && (*cp != (int) nul_char)) {
260910d63b7dSRichard Lowe cp++;
261010d63b7dSRichard Lowe }
261110d63b7dSRichard Lowe if ((length = strlen(cp)) >= MAXPATHLEN) {
261210d63b7dSRichard Lowe tmp_wcs_buffer = ALLOC_WC(length + 1);
261310d63b7dSRichard Lowe (void) mbstowcs(tmp_wcs_buffer, cp, length + 1);
261410d63b7dSRichard Lowe value = GETNAME(tmp_wcs_buffer, FIND_LENGTH);
261510d63b7dSRichard Lowe retmem(tmp_wcs_buffer);
261610d63b7dSRichard Lowe } else {
261710d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, cp);
261810d63b7dSRichard Lowe value = GETNAME(wcs_buffer, FIND_LENGTH);
261910d63b7dSRichard Lowe }
262010d63b7dSRichard Lowe argv[i] = NULL;
262110d63b7dSRichard Lowe } else {
262210d63b7dSRichard Lowe /* Illegal MAKEFLAGS argument */
262310d63b7dSRichard Lowe continue;
262410d63b7dSRichard Lowe }
262510d63b7dSRichard Lowe if(append) {
262610d63b7dSRichard Lowe setvar_append(name, value);
262710d63b7dSRichard Lowe append = false;
262810d63b7dSRichard Lowe } else {
262910d63b7dSRichard Lowe macro = maybe_append_prop(name, macro_prop);
263010d63b7dSRichard Lowe macro->body.macro.exported = true;
263110d63b7dSRichard Lowe SETVAR(name, value, false)->body.macro.read_only = true;
263210d63b7dSRichard Lowe }
263310d63b7dSRichard Lowe }
263410d63b7dSRichard Lowe }
263510d63b7dSRichard Lowe
263610d63b7dSRichard Lowe /*
263710d63b7dSRichard Lowe * Append the DMake option and value to the MAKEFLAGS string.
263810d63b7dSRichard Lowe */
263910d63b7dSRichard Lowe static void
append_makeflags_string(Name name,String makeflags_string)2640*e7afc443SToomas Soome append_makeflags_string(Name name, String makeflags_string)
264110d63b7dSRichard Lowe {
264210d63b7dSRichard Lowe const char *option;
264310d63b7dSRichard Lowe
264410d63b7dSRichard Lowe if (strcmp(name->string_mb, "DMAKE_GROUP") == 0) {
264510d63b7dSRichard Lowe option = " -g ";
264610d63b7dSRichard Lowe } else if (strcmp(name->string_mb, "DMAKE_MAX_JOBS") == 0) {
264710d63b7dSRichard Lowe option = " -j ";
264810d63b7dSRichard Lowe } else if (strcmp(name->string_mb, "DMAKE_MODE") == 0) {
264910d63b7dSRichard Lowe option = " -m ";
265010d63b7dSRichard Lowe } else if (strcmp(name->string_mb, "DMAKE_ODIR") == 0) {
265110d63b7dSRichard Lowe option = " -o ";
265210d63b7dSRichard Lowe } else if (strcmp(name->string_mb, "DMAKE_RCFILE") == 0) {
265310d63b7dSRichard Lowe option = " -c ";
265410d63b7dSRichard Lowe } else if (strcmp(name->string_mb, "PMAKE_MACHINESFILE") == 0) {
265510d63b7dSRichard Lowe option = " -M ";
265610d63b7dSRichard Lowe } else if (strcmp(name->string_mb, "DMAKE_OUTPUT_MODE") == 0) {
265710d63b7dSRichard Lowe option = " -x DMAKE_OUTPUT_MODE=";
265810d63b7dSRichard Lowe } else if (strcmp(name->string_mb, "SUN_MAKE_COMPAT_MODE") == 0) {
265910d63b7dSRichard Lowe option = " -x SUN_MAKE_COMPAT_MODE=";
266010d63b7dSRichard Lowe } else {
266110d63b7dSRichard Lowe fatal(gettext("Internal error: name not recognized in append_makeflags_string()"));
266210d63b7dSRichard Lowe }
266310d63b7dSRichard Lowe Property prop = maybe_append_prop(name, macro_prop);
266410d63b7dSRichard Lowe if( prop == 0 || prop->body.macro.value == 0 ||
266510d63b7dSRichard Lowe prop->body.macro.value->string_mb == 0 ) {
266610d63b7dSRichard Lowe return;
266710d63b7dSRichard Lowe }
266810d63b7dSRichard Lowe char mbs_value[MAXPATHLEN + 100];
266910d63b7dSRichard Lowe strcpy(mbs_value, option);
267010d63b7dSRichard Lowe strcat(mbs_value, prop->body.macro.value->string_mb);
267110d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, mbs_value);
267210d63b7dSRichard Lowe append_string(wcs_buffer, makeflags_string, FIND_LENGTH);
267310d63b7dSRichard Lowe }
267410d63b7dSRichard Lowe
267510d63b7dSRichard Lowe /*
267610d63b7dSRichard Lowe * read_environment(read_only)
267710d63b7dSRichard Lowe *
267810d63b7dSRichard Lowe * This routine reads the process environment when make starts and enters
267910d63b7dSRichard Lowe * it as make macros. The environment variable SHELL is ignored.
268010d63b7dSRichard Lowe *
268110d63b7dSRichard Lowe * Parameters:
268210d63b7dSRichard Lowe * read_only Should we make env vars read only?
268310d63b7dSRichard Lowe *
268410d63b7dSRichard Lowe * Global variables used:
268510d63b7dSRichard Lowe * report_pwd Set if this make was started by other make
268610d63b7dSRichard Lowe */
268710d63b7dSRichard Lowe static void
read_environment(Boolean read_only)268810d63b7dSRichard Lowe read_environment(Boolean read_only)
268910d63b7dSRichard Lowe {
2690*e7afc443SToomas Soome char **environment;
269110d63b7dSRichard Lowe int length;
269210d63b7dSRichard Lowe wchar_t *tmp_wcs_buffer;
269310d63b7dSRichard Lowe Boolean alloced_tmp_wcs_buffer = false;
2694*e7afc443SToomas Soome wchar_t *name;
2695*e7afc443SToomas Soome wchar_t *value;
2696*e7afc443SToomas Soome Name macro;
269710d63b7dSRichard Lowe Property val;
269810d63b7dSRichard Lowe Boolean read_only_saved;
269910d63b7dSRichard Lowe
270010d63b7dSRichard Lowe reading_environment = true;
270110d63b7dSRichard Lowe environment = environ;
270210d63b7dSRichard Lowe for (; *environment; environment++) {
270310d63b7dSRichard Lowe read_only_saved = read_only;
270410d63b7dSRichard Lowe if ((length = strlen(*environment)) >= MAXPATHLEN) {
270510d63b7dSRichard Lowe tmp_wcs_buffer = ALLOC_WC(length + 1);
270610d63b7dSRichard Lowe alloced_tmp_wcs_buffer = true;
270710d63b7dSRichard Lowe (void) mbstowcs(tmp_wcs_buffer, *environment, length + 1);
270810d63b7dSRichard Lowe name = tmp_wcs_buffer;
270910d63b7dSRichard Lowe } else {
271010d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, *environment);
271110d63b7dSRichard Lowe name = wcs_buffer;
271210d63b7dSRichard Lowe }
271310d63b7dSRichard Lowe value = (wchar_t *) wcschr(name, (int) equal_char);
271410d63b7dSRichard Lowe
271510d63b7dSRichard Lowe /*
271610d63b7dSRichard Lowe * Looks like there's a bug in the system, but sometimes
271710d63b7dSRichard Lowe * you can get blank lines in *environment.
271810d63b7dSRichard Lowe */
271910d63b7dSRichard Lowe if (!value) {
272010d63b7dSRichard Lowe continue;
272110d63b7dSRichard Lowe }
272210d63b7dSRichard Lowe MBSTOWCS(wcs_buffer2, "SHELL=");
272310d63b7dSRichard Lowe if (IS_WEQUALN(name, wcs_buffer2, wcslen(wcs_buffer2))) {
272410d63b7dSRichard Lowe continue;
272510d63b7dSRichard Lowe }
272610d63b7dSRichard Lowe MBSTOWCS(wcs_buffer2, "MAKEFLAGS=");
272710d63b7dSRichard Lowe if (IS_WEQUALN(name, wcs_buffer2, wcslen(wcs_buffer2))) {
272810d63b7dSRichard Lowe report_pwd = true;
272910d63b7dSRichard Lowe /*
273010d63b7dSRichard Lowe * In POSIX mode we do not want MAKEFLAGS to be readonly.
273110d63b7dSRichard Lowe * If the MAKEFLAGS macro is subsequently set by the makefile,
273210d63b7dSRichard Lowe * it replaces the MAKEFLAGS variable currently found in the
273310d63b7dSRichard Lowe * environment.
273410d63b7dSRichard Lowe * See Assertion 50 in section 6.2.5.3 of standard P1003.3.2/D8.
273510d63b7dSRichard Lowe */
273610d63b7dSRichard Lowe if(posix) {
273710d63b7dSRichard Lowe read_only_saved = false;
273810d63b7dSRichard Lowe }
273910d63b7dSRichard Lowe }
274010d63b7dSRichard Lowe
274110d63b7dSRichard Lowe /*
274210d63b7dSRichard Lowe * We ignore SUNPRO_DEPENDENCIES. This environment variable is
274310d63b7dSRichard Lowe * set by make and read by cpp which then writes info to
274410d63b7dSRichard Lowe * .make.dependency.xxx. When make is invoked by another make
274510d63b7dSRichard Lowe * (recursive make), we don't want to read this because then
274610d63b7dSRichard Lowe * the child make will end up writing to the parent
274710d63b7dSRichard Lowe * directory's .make.state and clobbering them.
274810d63b7dSRichard Lowe */
274910d63b7dSRichard Lowe MBSTOWCS(wcs_buffer2, "SUNPRO_DEPENDENCIES");
275010d63b7dSRichard Lowe if (IS_WEQUALN(name, wcs_buffer2, wcslen(wcs_buffer2))) {
275110d63b7dSRichard Lowe continue;
275210d63b7dSRichard Lowe }
275310d63b7dSRichard Lowe
275410d63b7dSRichard Lowe macro = GETNAME(name, value - name);
275510d63b7dSRichard Lowe maybe_append_prop(macro, macro_prop)->body.macro.exported =
275610d63b7dSRichard Lowe true;
275710d63b7dSRichard Lowe if ((value == NULL) || ((value + 1)[0] == (int) nul_char)) {
275810d63b7dSRichard Lowe val = setvar_daemon(macro,
275910d63b7dSRichard Lowe (Name) NULL,
276010d63b7dSRichard Lowe false, no_daemon, false, debug_level);
276110d63b7dSRichard Lowe } else {
276210d63b7dSRichard Lowe val = setvar_daemon(macro,
276310d63b7dSRichard Lowe GETNAME(value + 1, FIND_LENGTH),
276410d63b7dSRichard Lowe false, no_daemon, false, debug_level);
276510d63b7dSRichard Lowe }
276610d63b7dSRichard Lowe val->body.macro.read_only = read_only_saved;
276710d63b7dSRichard Lowe if (alloced_tmp_wcs_buffer) {
276810d63b7dSRichard Lowe retmem(tmp_wcs_buffer);
276910d63b7dSRichard Lowe alloced_tmp_wcs_buffer = false;
277010d63b7dSRichard Lowe }
277110d63b7dSRichard Lowe }
277210d63b7dSRichard Lowe reading_environment = false;
277310d63b7dSRichard Lowe }
277410d63b7dSRichard Lowe
277510d63b7dSRichard Lowe /*
277610d63b7dSRichard Lowe * read_makefile(makefile, complain, must_exist, report_file)
277710d63b7dSRichard Lowe *
277810d63b7dSRichard Lowe * Read one makefile and check the result
277910d63b7dSRichard Lowe *
278010d63b7dSRichard Lowe * Return value:
278110d63b7dSRichard Lowe * false is the read failed
278210d63b7dSRichard Lowe *
278310d63b7dSRichard Lowe * Parameters:
278410d63b7dSRichard Lowe * makefile The file to read
278510d63b7dSRichard Lowe * complain Passed thru to read_simple_file()
278610d63b7dSRichard Lowe * must_exist Passed thru to read_simple_file()
278710d63b7dSRichard Lowe * report_file Passed thru to read_simple_file()
278810d63b7dSRichard Lowe *
278910d63b7dSRichard Lowe * Global variables used:
279010d63b7dSRichard Lowe * makefile_type Set to indicate we are reading main file
279110d63b7dSRichard Lowe * recursion_level Initialized
279210d63b7dSRichard Lowe */
279310d63b7dSRichard Lowe static Boolean
read_makefile(Name makefile,Boolean complain,Boolean must_exist,Boolean report_file)2794*e7afc443SToomas Soome read_makefile(Name makefile, Boolean complain, Boolean must_exist, Boolean report_file)
279510d63b7dSRichard Lowe {
279610d63b7dSRichard Lowe Boolean b;
2797ae389aa9SAndy Fiddaman
279810d63b7dSRichard Lowe makefile_type = reading_makefile;
279910d63b7dSRichard Lowe recursion_level = 0;
280010d63b7dSRichard Lowe reading_dependencies = true;
280110d63b7dSRichard Lowe b = read_simple_file(makefile, true, true, complain,
280210d63b7dSRichard Lowe must_exist, report_file, false);
280310d63b7dSRichard Lowe reading_dependencies = false;
280410d63b7dSRichard Lowe return b;
280510d63b7dSRichard Lowe }
280610d63b7dSRichard Lowe
280710d63b7dSRichard Lowe /*
280810d63b7dSRichard Lowe * make_targets(argc, argv, parallel_flag)
280910d63b7dSRichard Lowe *
281010d63b7dSRichard Lowe * Call doname on the specified targets
281110d63b7dSRichard Lowe *
281210d63b7dSRichard Lowe * Parameters:
281310d63b7dSRichard Lowe * argc You know what this is
281410d63b7dSRichard Lowe * argv You know what this is
281510d63b7dSRichard Lowe * parallel_flag True if building in parallel
281610d63b7dSRichard Lowe *
281710d63b7dSRichard Lowe * Global variables used:
281810d63b7dSRichard Lowe * build_failed_seen Used to generated message after failed -k
281910d63b7dSRichard Lowe * commands_done Used to generate message "Up to date"
282010d63b7dSRichard Lowe * default_target_to_build First proper target in makefile
282110d63b7dSRichard Lowe * init The Name ".INIT", use to run command
282210d63b7dSRichard Lowe * parallel Global parallel building flag
282310d63b7dSRichard Lowe * quest make -q, suppresses messages
282410d63b7dSRichard Lowe * recursion_level Initialized, used for tracing
282510d63b7dSRichard Lowe * report_dependencies make -P, regroves whole process
282610d63b7dSRichard Lowe */
282710d63b7dSRichard Lowe static void
make_targets(int argc,char ** argv,Boolean parallel_flag)282810d63b7dSRichard Lowe make_targets(int argc, char **argv, Boolean parallel_flag)
282910d63b7dSRichard Lowe {
283010d63b7dSRichard Lowe int i;
283110d63b7dSRichard Lowe char *cp;
283210d63b7dSRichard Lowe Doname result;
2833*e7afc443SToomas Soome Boolean target_to_make_found = false;
283410d63b7dSRichard Lowe
283510d63b7dSRichard Lowe (void) doname(init, true, true);
283610d63b7dSRichard Lowe recursion_level = 1;
283710d63b7dSRichard Lowe parallel = parallel_flag;
283810d63b7dSRichard Lowe /*
283910d63b7dSRichard Lowe * make remaining args
284010d63b7dSRichard Lowe */
284110d63b7dSRichard Lowe /*
284210d63b7dSRichard Lowe if ((report_dependencies_level == 0) && parallel) {
284310d63b7dSRichard Lowe */
284410d63b7dSRichard Lowe if (parallel) {
284510d63b7dSRichard Lowe /*
284610d63b7dSRichard Lowe * If building targets in parallel, start all of the
284710d63b7dSRichard Lowe * remaining args to build in parallel.
284810d63b7dSRichard Lowe */
284910d63b7dSRichard Lowe for (i = 1; i < argc; i++) {
285010d63b7dSRichard Lowe if ((cp = argv[i]) != NULL) {
285110d63b7dSRichard Lowe commands_done = false;
285210d63b7dSRichard Lowe if ((cp[0] == (int) period_char) &&
285310d63b7dSRichard Lowe (cp[1] == (int) slash_char)) {
285410d63b7dSRichard Lowe cp += 2;
285510d63b7dSRichard Lowe }
285610d63b7dSRichard Lowe if((cp[0] == (int) ' ') &&
285710d63b7dSRichard Lowe (cp[1] == (int) '-') &&
285810d63b7dSRichard Lowe (cp[2] == (int) ' ') &&
285910d63b7dSRichard Lowe (cp[3] == (int) '-')) {
286010d63b7dSRichard Lowe argv[i] = NULL;
286110d63b7dSRichard Lowe continue;
286210d63b7dSRichard Lowe }
286310d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, cp);
286410d63b7dSRichard Lowe //default_target_to_build = GETNAME(wcs_buffer,
286510d63b7dSRichard Lowe // FIND_LENGTH);
286610d63b7dSRichard Lowe default_target_to_build = normalize_name(wcs_buffer,
286710d63b7dSRichard Lowe wcslen(wcs_buffer));
286810d63b7dSRichard Lowe if (default_target_to_build == wait_name) {
286910d63b7dSRichard Lowe if (parallel_process_cnt > 0) {
287010d63b7dSRichard Lowe finish_running();
287110d63b7dSRichard Lowe }
287210d63b7dSRichard Lowe continue;
287310d63b7dSRichard Lowe }
287410d63b7dSRichard Lowe top_level_target = get_wstring(default_target_to_build->string_mb);
287510d63b7dSRichard Lowe /*
287610d63b7dSRichard Lowe * If we can't execute the current target in
287710d63b7dSRichard Lowe * parallel, hold off the target processing
287810d63b7dSRichard Lowe * to preserve the order of the targets as they appeared
287910d63b7dSRichard Lowe * in command line.
288010d63b7dSRichard Lowe */
288110d63b7dSRichard Lowe if (!parallel_ok(default_target_to_build, false)
288210d63b7dSRichard Lowe && parallel_process_cnt > 0) {
288310d63b7dSRichard Lowe finish_running();
288410d63b7dSRichard Lowe }
288510d63b7dSRichard Lowe result = doname_check(default_target_to_build,
288610d63b7dSRichard Lowe true,
288710d63b7dSRichard Lowe false,
288810d63b7dSRichard Lowe false);
288910d63b7dSRichard Lowe gather_recursive_deps();
289010d63b7dSRichard Lowe if (/* !commands_done && */
289110d63b7dSRichard Lowe (result == build_ok) &&
289210d63b7dSRichard Lowe !quest &&
289310d63b7dSRichard Lowe (report_dependencies_level == 0) /* &&
289410d63b7dSRichard Lowe (exists(default_target_to_build) > file_doesnt_exist) */) {
289510d63b7dSRichard Lowe if (posix) {
289610d63b7dSRichard Lowe if (!commands_done) {
289710d63b7dSRichard Lowe (void) printf(gettext("`%s' is updated.\n"),
2898ae389aa9SAndy Fiddaman default_target_to_build->string_mb);
289910d63b7dSRichard Lowe } else {
290010d63b7dSRichard Lowe if (no_action_was_taken) {
290110d63b7dSRichard Lowe (void) printf(gettext("`%s': no action was taken.\n"),
2902ae389aa9SAndy Fiddaman default_target_to_build->string_mb);
290310d63b7dSRichard Lowe }
290410d63b7dSRichard Lowe }
290510d63b7dSRichard Lowe } else {
290610d63b7dSRichard Lowe default_target_to_build->stat.time = file_no_time;
290710d63b7dSRichard Lowe if (!commands_done &&
290810d63b7dSRichard Lowe (exists(default_target_to_build) > file_doesnt_exist)) {
290910d63b7dSRichard Lowe (void) printf(gettext("`%s' is up to date.\n"),
291010d63b7dSRichard Lowe default_target_to_build->string_mb);
291110d63b7dSRichard Lowe }
291210d63b7dSRichard Lowe }
291310d63b7dSRichard Lowe }
291410d63b7dSRichard Lowe }
291510d63b7dSRichard Lowe }
291610d63b7dSRichard Lowe /* Now wait for all of the targets to finish running */
291710d63b7dSRichard Lowe finish_running();
291810d63b7dSRichard Lowe // setjmp(jmpbuffer);
2919ae389aa9SAndy Fiddaman
292010d63b7dSRichard Lowe }
292110d63b7dSRichard Lowe for (i = 1; i < argc; i++) {
292210d63b7dSRichard Lowe if ((cp = argv[i]) != NULL) {
292310d63b7dSRichard Lowe target_to_make_found = true;
292410d63b7dSRichard Lowe if ((cp[0] == (int) period_char) &&
292510d63b7dSRichard Lowe (cp[1] == (int) slash_char)) {
292610d63b7dSRichard Lowe cp += 2;
292710d63b7dSRichard Lowe }
292810d63b7dSRichard Lowe if((cp[0] == (int) ' ') &&
292910d63b7dSRichard Lowe (cp[1] == (int) '-') &&
293010d63b7dSRichard Lowe (cp[2] == (int) ' ') &&
293110d63b7dSRichard Lowe (cp[3] == (int) '-')) {
293210d63b7dSRichard Lowe argv[i] = NULL;
293310d63b7dSRichard Lowe continue;
293410d63b7dSRichard Lowe }
293510d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, cp);
293610d63b7dSRichard Lowe default_target_to_build = normalize_name(wcs_buffer, wcslen(wcs_buffer));
293710d63b7dSRichard Lowe top_level_target = get_wstring(default_target_to_build->string_mb);
293810d63b7dSRichard Lowe report_recursion(default_target_to_build);
293910d63b7dSRichard Lowe commands_done = false;
294010d63b7dSRichard Lowe if (parallel) {
294110d63b7dSRichard Lowe result = (Doname) default_target_to_build->state;
294210d63b7dSRichard Lowe } else {
294310d63b7dSRichard Lowe result = doname_check(default_target_to_build,
294410d63b7dSRichard Lowe true,
294510d63b7dSRichard Lowe false,
294610d63b7dSRichard Lowe false);
294710d63b7dSRichard Lowe }
294810d63b7dSRichard Lowe gather_recursive_deps();
294910d63b7dSRichard Lowe if (build_failed_seen) {
295010d63b7dSRichard Lowe build_failed_ever_seen = true;
295110d63b7dSRichard Lowe warning(gettext("Target `%s' not remade because of errors"),
295210d63b7dSRichard Lowe default_target_to_build->string_mb);
295310d63b7dSRichard Lowe }
295410d63b7dSRichard Lowe build_failed_seen = false;
295510d63b7dSRichard Lowe if (report_dependencies_level > 0) {
295610d63b7dSRichard Lowe print_dependencies(default_target_to_build,
295710d63b7dSRichard Lowe get_prop(default_target_to_build->prop,
295810d63b7dSRichard Lowe line_prop));
295910d63b7dSRichard Lowe }
296010d63b7dSRichard Lowe default_target_to_build->stat.time =
296110d63b7dSRichard Lowe file_no_time;
296210d63b7dSRichard Lowe if (default_target_to_build->colon_splits > 0) {
296310d63b7dSRichard Lowe default_target_to_build->state =
296410d63b7dSRichard Lowe build_dont_know;
296510d63b7dSRichard Lowe }
296610d63b7dSRichard Lowe if (!parallel &&
296710d63b7dSRichard Lowe /* !commands_done && */
296810d63b7dSRichard Lowe (result == build_ok) &&
296910d63b7dSRichard Lowe !quest &&
297010d63b7dSRichard Lowe (report_dependencies_level == 0) /* &&
297110d63b7dSRichard Lowe (exists(default_target_to_build) > file_doesnt_exist) */) {
297210d63b7dSRichard Lowe if (posix) {
297310d63b7dSRichard Lowe if (!commands_done) {
297410d63b7dSRichard Lowe (void) printf(gettext("`%s' is updated.\n"),
2975ae389aa9SAndy Fiddaman default_target_to_build->string_mb);
297610d63b7dSRichard Lowe } else {
297710d63b7dSRichard Lowe if (no_action_was_taken) {
297810d63b7dSRichard Lowe (void) printf(gettext("`%s': no action was taken.\n"),
2979ae389aa9SAndy Fiddaman default_target_to_build->string_mb);
298010d63b7dSRichard Lowe }
298110d63b7dSRichard Lowe }
298210d63b7dSRichard Lowe } else {
298310d63b7dSRichard Lowe if (!commands_done &&
298410d63b7dSRichard Lowe (exists(default_target_to_build) > file_doesnt_exist)) {
298510d63b7dSRichard Lowe (void) printf(gettext("`%s' is up to date.\n"),
298610d63b7dSRichard Lowe default_target_to_build->string_mb);
298710d63b7dSRichard Lowe }
298810d63b7dSRichard Lowe }
298910d63b7dSRichard Lowe }
299010d63b7dSRichard Lowe }
299110d63b7dSRichard Lowe }
299210d63b7dSRichard Lowe
299310d63b7dSRichard Lowe /*
299410d63b7dSRichard Lowe * If no file arguments have been encountered,
299510d63b7dSRichard Lowe * make the first name encountered that doesnt start with a dot
299610d63b7dSRichard Lowe */
299710d63b7dSRichard Lowe if (!target_to_make_found) {
299810d63b7dSRichard Lowe if (default_target_to_build == NULL) {
299910d63b7dSRichard Lowe fatal(gettext("No arguments to build"));
300010d63b7dSRichard Lowe }
300110d63b7dSRichard Lowe commands_done = false;
300210d63b7dSRichard Lowe top_level_target = get_wstring(default_target_to_build->string_mb);
300310d63b7dSRichard Lowe report_recursion(default_target_to_build);
300410d63b7dSRichard Lowe
300510d63b7dSRichard Lowe
300610d63b7dSRichard Lowe if (getenv("SPRO_EXPAND_ERRORS")){
300710d63b7dSRichard Lowe (void) printf("::(%s)\n",
300810d63b7dSRichard Lowe default_target_to_build->string_mb);
300910d63b7dSRichard Lowe }
301010d63b7dSRichard Lowe
301110d63b7dSRichard Lowe
301210d63b7dSRichard Lowe result = doname_parallel(default_target_to_build, true, false);
301310d63b7dSRichard Lowe gather_recursive_deps();
301410d63b7dSRichard Lowe if (build_failed_seen) {
301510d63b7dSRichard Lowe build_failed_ever_seen = true;
301610d63b7dSRichard Lowe warning(gettext("Target `%s' not remade because of errors"),
301710d63b7dSRichard Lowe default_target_to_build->string_mb);
301810d63b7dSRichard Lowe }
301910d63b7dSRichard Lowe build_failed_seen = false;
302010d63b7dSRichard Lowe if (report_dependencies_level > 0) {
302110d63b7dSRichard Lowe print_dependencies(default_target_to_build,
302210d63b7dSRichard Lowe get_prop(default_target_to_build->
302310d63b7dSRichard Lowe prop,
302410d63b7dSRichard Lowe line_prop));
302510d63b7dSRichard Lowe }
302610d63b7dSRichard Lowe default_target_to_build->stat.time = file_no_time;
302710d63b7dSRichard Lowe if (default_target_to_build->colon_splits > 0) {
302810d63b7dSRichard Lowe default_target_to_build->state = build_dont_know;
302910d63b7dSRichard Lowe }
303010d63b7dSRichard Lowe if (/* !commands_done && */
303110d63b7dSRichard Lowe (result == build_ok) &&
303210d63b7dSRichard Lowe !quest &&
303310d63b7dSRichard Lowe (report_dependencies_level == 0) /* &&
303410d63b7dSRichard Lowe (exists(default_target_to_build) > file_doesnt_exist) */) {
303510d63b7dSRichard Lowe if (posix) {
303610d63b7dSRichard Lowe if (!commands_done) {
303710d63b7dSRichard Lowe (void) printf(gettext("`%s' is updated.\n"),
3038ae389aa9SAndy Fiddaman default_target_to_build->string_mb);
303910d63b7dSRichard Lowe } else {
304010d63b7dSRichard Lowe if (no_action_was_taken) {
304110d63b7dSRichard Lowe (void) printf(gettext("`%s': no action was taken.\n"),
304210d63b7dSRichard Lowe default_target_to_build->string_mb);
304310d63b7dSRichard Lowe }
304410d63b7dSRichard Lowe }
304510d63b7dSRichard Lowe } else {
304610d63b7dSRichard Lowe if (!commands_done &&
304710d63b7dSRichard Lowe (exists(default_target_to_build) > file_doesnt_exist)) {
304810d63b7dSRichard Lowe (void) printf(gettext("`%s' is up to date.\n"),
304910d63b7dSRichard Lowe default_target_to_build->string_mb);
305010d63b7dSRichard Lowe }
305110d63b7dSRichard Lowe }
305210d63b7dSRichard Lowe }
305310d63b7dSRichard Lowe }
305410d63b7dSRichard Lowe }
305510d63b7dSRichard Lowe
305610d63b7dSRichard Lowe /*
305710d63b7dSRichard Lowe * report_recursion(target)
305810d63b7dSRichard Lowe *
305910d63b7dSRichard Lowe * If this is a recursive make and the parent make has KEEP_STATE on
306010d63b7dSRichard Lowe * this routine reports the dependency to the parent make
306110d63b7dSRichard Lowe *
306210d63b7dSRichard Lowe * Parameters:
306310d63b7dSRichard Lowe * target Target to report
306410d63b7dSRichard Lowe *
306510d63b7dSRichard Lowe * Global variables used:
306610d63b7dSRichard Lowe * makefiles_used List of makefiles read
306710d63b7dSRichard Lowe * recursive_name The Name ".RECURSIVE", printed
306810d63b7dSRichard Lowe * report_dependency dwight
306910d63b7dSRichard Lowe */
307010d63b7dSRichard Lowe static void
report_recursion(Name target)3071*e7afc443SToomas Soome report_recursion(Name target)
307210d63b7dSRichard Lowe {
3073*e7afc443SToomas Soome FILE *report_file = get_report_file();
307410d63b7dSRichard Lowe
307510d63b7dSRichard Lowe if ((report_file == NULL) || (report_file == (FILE*)-1)) {
307610d63b7dSRichard Lowe return;
307710d63b7dSRichard Lowe }
307810d63b7dSRichard Lowe if (primary_makefile == NULL) {
307910d63b7dSRichard Lowe /*
308010d63b7dSRichard Lowe * This can happen when there is no makefile and
308110d63b7dSRichard Lowe * only implicit rules are being used.
308210d63b7dSRichard Lowe */
308310d63b7dSRichard Lowe return;
308410d63b7dSRichard Lowe }
308510d63b7dSRichard Lowe (void) fprintf(report_file,
308610d63b7dSRichard Lowe "%s: %s ",
308710d63b7dSRichard Lowe get_target_being_reported_for(),
308810d63b7dSRichard Lowe recursive_name->string_mb);
308910d63b7dSRichard Lowe report_dependency(get_current_path());
309010d63b7dSRichard Lowe report_dependency(target->string_mb);
309110d63b7dSRichard Lowe report_dependency(primary_makefile->string_mb);
309210d63b7dSRichard Lowe (void) fprintf(report_file, "\n");
309310d63b7dSRichard Lowe }
309410d63b7dSRichard Lowe
309510d63b7dSRichard Lowe /* Next function "append_or_replace_macro_in_dyn_array" must be in "misc.cc". */
309610d63b7dSRichard Lowe /* NIKMOL */
309710d63b7dSRichard Lowe extern void
append_or_replace_macro_in_dyn_array(ASCII_Dyn_Array * Ar,char * macro)309810d63b7dSRichard Lowe append_or_replace_macro_in_dyn_array(ASCII_Dyn_Array *Ar, char *macro)
309910d63b7dSRichard Lowe {
3100*e7afc443SToomas Soome char *cp0; /* work pointer in macro */
3101*e7afc443SToomas Soome char *cp1; /* work pointer in array */
3102*e7afc443SToomas Soome char *cp2; /* work pointer in array */
3103*e7afc443SToomas Soome char *cp3; /* work pointer in array */
3104*e7afc443SToomas Soome char *name; /* macro name */
3105*e7afc443SToomas Soome char *value; /* macro value */
3106*e7afc443SToomas Soome int len_array;
3107*e7afc443SToomas Soome int len_macro;
310810d63b7dSRichard Lowe
310910d63b7dSRichard Lowe char * esc_value = NULL;
311010d63b7dSRichard Lowe int esc_len;
311110d63b7dSRichard Lowe
311210d63b7dSRichard Lowe if (!(len_macro = strlen(macro))) return;
311310d63b7dSRichard Lowe name = macro;
311410d63b7dSRichard Lowe while (isspace(*(name))) {
311510d63b7dSRichard Lowe name++;
311610d63b7dSRichard Lowe }
311710d63b7dSRichard Lowe if (!(value = strchr(name, (int) equal_char))) {
311810d63b7dSRichard Lowe /* no '=' in macro */
311910d63b7dSRichard Lowe goto ERROR_MACRO;
312010d63b7dSRichard Lowe }
312110d63b7dSRichard Lowe cp0 = value;
312210d63b7dSRichard Lowe value++;
312310d63b7dSRichard Lowe while (isspace(*(value))) {
312410d63b7dSRichard Lowe value++;
312510d63b7dSRichard Lowe }
312610d63b7dSRichard Lowe while (isspace(*(cp0-1))) {
312710d63b7dSRichard Lowe cp0--;
312810d63b7dSRichard Lowe }
312910d63b7dSRichard Lowe if (cp0 <= name) goto ERROR_MACRO; /* no name */
313010d63b7dSRichard Lowe if (!(Ar->size)) goto ALLOC_ARRAY;
313110d63b7dSRichard Lowe cp1 = Ar->start;
313210d63b7dSRichard Lowe
313310d63b7dSRichard Lowe LOOK_FOR_NAME:
313410d63b7dSRichard Lowe if (!(cp1 = strchr(cp1, name[0]))) goto APPEND_MACRO;
313510d63b7dSRichard Lowe if (!(cp2 = strchr(cp1, (int) equal_char))) goto APPEND_MACRO;
313610d63b7dSRichard Lowe if (strncmp(cp1, name, (size_t)(cp0-name))) {
313710d63b7dSRichard Lowe /* another name */
313810d63b7dSRichard Lowe cp1++;
313910d63b7dSRichard Lowe goto LOOK_FOR_NAME;
314010d63b7dSRichard Lowe }
314110d63b7dSRichard Lowe if (cp1 != Ar->start) {
314210d63b7dSRichard Lowe if (!isspace(*(cp1-1))) {
314310d63b7dSRichard Lowe /* another name */
314410d63b7dSRichard Lowe cp1++;
314510d63b7dSRichard Lowe goto LOOK_FOR_NAME;
314610d63b7dSRichard Lowe }
314710d63b7dSRichard Lowe }
314810d63b7dSRichard Lowe for (cp3 = cp1 + (cp0-name); cp3 < cp2; cp3++) {
314910d63b7dSRichard Lowe if (isspace(*cp3)) continue;
315010d63b7dSRichard Lowe /* else: another name */
315110d63b7dSRichard Lowe cp1++;
315210d63b7dSRichard Lowe goto LOOK_FOR_NAME;
315310d63b7dSRichard Lowe }
315410d63b7dSRichard Lowe /* Look for the next macro name in array */
315510d63b7dSRichard Lowe cp3 = cp2+1;
315610d63b7dSRichard Lowe if (*cp3 != (int) doublequote_char) {
315710d63b7dSRichard Lowe /* internal error */
315810d63b7dSRichard Lowe goto ERROR_MACRO;
315910d63b7dSRichard Lowe }
316010d63b7dSRichard Lowe if (!(cp3 = strchr(cp3+1, (int) doublequote_char))) {
316110d63b7dSRichard Lowe /* internal error */
316210d63b7dSRichard Lowe goto ERROR_MACRO;
316310d63b7dSRichard Lowe }
316410d63b7dSRichard Lowe cp3++;
316510d63b7dSRichard Lowe while (isspace(*cp3)) {
316610d63b7dSRichard Lowe cp3++;
316710d63b7dSRichard Lowe }
3168ae389aa9SAndy Fiddaman
316910d63b7dSRichard Lowe cp2 = cp1; /* remove old macro */
317010d63b7dSRichard Lowe if ((*cp3) && (cp3 < Ar->start + Ar->size)) {
317110d63b7dSRichard Lowe for (; cp3 < Ar->start + Ar->size; cp3++) {
317210d63b7dSRichard Lowe *cp2++ = *cp3;
317310d63b7dSRichard Lowe }
3174ae389aa9SAndy Fiddaman }
317510d63b7dSRichard Lowe for (; cp2 < Ar->start + Ar->size; cp2++) {
317610d63b7dSRichard Lowe *cp2 = 0;
317710d63b7dSRichard Lowe }
317810d63b7dSRichard Lowe if (*cp1) {
317910d63b7dSRichard Lowe /* check next name */
318010d63b7dSRichard Lowe goto LOOK_FOR_NAME;
318110d63b7dSRichard Lowe }
318210d63b7dSRichard Lowe goto APPEND_MACRO;
318310d63b7dSRichard Lowe
318410d63b7dSRichard Lowe ALLOC_ARRAY:
318510d63b7dSRichard Lowe if (Ar->size) {
318610d63b7dSRichard Lowe cp1 = Ar->start;
318710d63b7dSRichard Lowe } else {
318810d63b7dSRichard Lowe cp1 = 0;
318910d63b7dSRichard Lowe }
319010d63b7dSRichard Lowe Ar->size += 128;
319110d63b7dSRichard Lowe Ar->start = getmem(Ar->size);
319210d63b7dSRichard Lowe for (len_array=0; len_array < Ar->size; len_array++) {
319310d63b7dSRichard Lowe Ar->start[len_array] = 0;
319410d63b7dSRichard Lowe }
319510d63b7dSRichard Lowe if (cp1) {
319610d63b7dSRichard Lowe strcpy(Ar->start, cp1);
319710d63b7dSRichard Lowe retmem((wchar_t *) cp1);
319810d63b7dSRichard Lowe }
319910d63b7dSRichard Lowe
320010d63b7dSRichard Lowe APPEND_MACRO:
320110d63b7dSRichard Lowe len_array = strlen(Ar->start);
320210d63b7dSRichard Lowe esc_value = (char*)malloc(strlen(value)*2 + 1);
320310d63b7dSRichard Lowe quote_str(value, esc_value);
320410d63b7dSRichard Lowe esc_len = strlen(esc_value) - strlen(value);
320510d63b7dSRichard Lowe if (len_array + len_macro + esc_len + 5 >= Ar->size) goto ALLOC_ARRAY;
320610d63b7dSRichard Lowe strcat(Ar->start, " ");
320710d63b7dSRichard Lowe strncat(Ar->start, name, cp0-name);
320810d63b7dSRichard Lowe strcat(Ar->start, "=");
320910d63b7dSRichard Lowe strncat(Ar->start, esc_value, strlen(esc_value));
321010d63b7dSRichard Lowe free(esc_value);
321110d63b7dSRichard Lowe return;
3212ae389aa9SAndy Fiddaman ERROR_MACRO:
321310d63b7dSRichard Lowe /* Macro without '=' or with invalid left/right part */
321410d63b7dSRichard Lowe return;
321510d63b7dSRichard Lowe }
321610d63b7dSRichard Lowe
321710d63b7dSRichard Lowe static void
report_dir_enter_leave(Boolean entering)321810d63b7dSRichard Lowe report_dir_enter_leave(Boolean entering)
321910d63b7dSRichard Lowe {
322010d63b7dSRichard Lowe char rcwd[MAXPATHLEN];
322110d63b7dSRichard Lowe static char * mlev = NULL;
322210d63b7dSRichard Lowe char * make_level_str = NULL;
322310d63b7dSRichard Lowe int make_level_val = 0;
322410d63b7dSRichard Lowe
322510d63b7dSRichard Lowe make_level_str = getenv("MAKELEVEL");
322610d63b7dSRichard Lowe if(make_level_str) {
322710d63b7dSRichard Lowe make_level_val = atoi(make_level_str);
322810d63b7dSRichard Lowe }
322910d63b7dSRichard Lowe if(mlev == NULL) {
323010d63b7dSRichard Lowe mlev = (char*) malloc(MAXPATHLEN);
323110d63b7dSRichard Lowe }
323210d63b7dSRichard Lowe if(entering) {
323310d63b7dSRichard Lowe sprintf(mlev, "MAKELEVEL=%d", make_level_val + 1);
323410d63b7dSRichard Lowe } else {
323510d63b7dSRichard Lowe make_level_val--;
323610d63b7dSRichard Lowe sprintf(mlev, "MAKELEVEL=%d", make_level_val);
323710d63b7dSRichard Lowe }
323810d63b7dSRichard Lowe putenv(mlev);
323910d63b7dSRichard Lowe
324010d63b7dSRichard Lowe if(report_cwd) {
324110d63b7dSRichard Lowe if(make_level_val <= 0) {
324210d63b7dSRichard Lowe if(entering) {
324310d63b7dSRichard Lowe sprintf(rcwd,
324410d63b7dSRichard Lowe gettext("%s: Entering directory `%s'\n"),
324510d63b7dSRichard Lowe getprogname(),
324610d63b7dSRichard Lowe get_current_path());
324710d63b7dSRichard Lowe } else {
324810d63b7dSRichard Lowe sprintf(rcwd,
324910d63b7dSRichard Lowe gettext("%s: Leaving directory `%s'\n"),
325010d63b7dSRichard Lowe getprogname(),
325110d63b7dSRichard Lowe get_current_path());
325210d63b7dSRichard Lowe }
325310d63b7dSRichard Lowe } else {
325410d63b7dSRichard Lowe if(entering) {
325510d63b7dSRichard Lowe sprintf(rcwd,
325610d63b7dSRichard Lowe gettext("%s[%d]: Entering directory `%s'\n"),
325710d63b7dSRichard Lowe getprogname(),
325810d63b7dSRichard Lowe make_level_val, get_current_path());
325910d63b7dSRichard Lowe } else {
326010d63b7dSRichard Lowe sprintf(rcwd,
326110d63b7dSRichard Lowe gettext("%s[%d]: Leaving directory `%s'\n"),
326210d63b7dSRichard Lowe getprogname(),
326310d63b7dSRichard Lowe make_level_val, get_current_path());
326410d63b7dSRichard Lowe }
326510d63b7dSRichard Lowe }
326610d63b7dSRichard Lowe printf("%s", rcwd);
326710d63b7dSRichard Lowe }
326810d63b7dSRichard Lowe }
3269