Subject: Re: make: add ksh spec and have compat mode use default shell
To: None <tech-toolchain@netbsd.org>
From: Christos Zoulas <christos@zoulas.com>
List: tech-toolchain
Date: 07/31/2003 13:13:04
In article <20030731054947.23AEA691A@void.crufty.net>,
Simon J. Gerraty <sjg@crufty.net> wrote:
I like it.
christos
>
>Thoughts?
>--sjg
>
>Index: compat.c
>===================================================================
>RCS file: /cvsroot/src/usr.bin/make/compat.c,v
>retrieving revision 1.45
>diff -u -p -r1.45 compat.c
>--- compat.c 2003/07/14 18:19:11 1.45
>+++ compat.c 2003/07/31 05:48:17
>@@ -259,8 +259,12 @@ CompatRunCommand(ClientData cmdp, Client
> * -e flag as well as -c if it's supposed to exit when it hits an
> * error.
> */
>- static const char *shargv[4] = { _PATH_BSHELL };
>+ static const char *shargv[4];
>
>+ shargv[0] = shellPath;
>+ /*
>+ * The following work for any of the builtin shell specs.
>+ */
> if (DEBUG(SHELL))
> shargv[1] = (errCheck ? "-exc" : "-xc");
> else
>@@ -549,6 +553,8 @@ Compat_Run(Lst targs)
> const char *cp; /* Pointer to string of shell meta-characters */
> GNode *gn = NULL;/* Current root target */
> int errors; /* Number of targets not remade due to errors */
>+
>+ Shell_Init(); /* setup default shell */
>
> if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
> signal(SIGINT, CompatInterrupt);
>Index: config.h
>===================================================================
>RCS file: /cvsroot/src/usr.bin/make/config.h,v
>retrieving revision 1.14
>diff -u -p -r1.14 config.h
>--- config.h 2002/01/16 03:40:29 1.14
>+++ config.h 2003/07/31 05:48:17
>@@ -40,7 +40,9 @@
> * from: @(#)config.h 8.1 (Berkeley) 6/6/93
> */
>
>+#ifndef DEFSHELL
> #define DEFSHELL 1 /* Bourne shell */
>+#endif
>
> /*
> * DEFMAXJOBS
>Index: job.c
>===================================================================
>RCS file: /cvsroot/src/usr.bin/make/job.c,v
>retrieving revision 1.80
>diff -u -p -r1.80 job.c
>--- job.c 2003/07/16 07:16:24 1.80
>+++ job.c 2003/07/31 05:48:20
>@@ -209,6 +209,16 @@ static Shell shells[] = {
> "e",
> },
> /*
>+ * KSH description.
>+ */
>+{
>+ "ksh",
>+ TRUE, "set +v", "set -v", "set +v", 6,
>+ TRUE, "set -e", "set +e",
>+ "v",
>+ "e",
>+},
>+ /*
> * UNKNOWN.
> */
> {
>@@ -223,10 +233,10 @@ static Shell *commandShell = &shells[DE
> * commands in the Makefile.
> * It is set by the
> * Job_ParseShell function */
>-static const char *shellPath = NULL, /* full pathname of
>+const char *shellPath = NULL, /* full pathname of
> * executable image */
>- *shellName = NULL, /* last component of shell */
>- *shellArgv = NULL; /* Custom shell args */
>+ *shellName = NULL; /* last component of shell */
>+static const char *shellArgv = NULL; /* Custom shell args */
>
>
> static int maxJobs; /* The most children we can run at once */
>@@ -2531,6 +2541,28 @@ Job_Make(GNode *gn)
> (void) JobStart(gn, 0, NULL);
> }
>
>+void
>+Shell_Init()
>+{
>+ if (shellPath == NULL) {
>+ /*
>+ * The user didn't specify a shell to use, so we are using the
>+ * default one... Both the absolute path and the last component
>+ * must be set. The last component is taken from the 'name' field
>+ * of the default shell description pointed-to by commandShell.
>+ * All default shells are located in _PATH_DEFSHELLDIR.
>+ */
>+ shellName = commandShell->name;
>+ shellPath = str_concat(_PATH_DEFSHELLDIR, shellName, STR_ADDSLASH);
>+ }
>+ if (commandShell->exit == NULL) {
>+ commandShell->exit = "";
>+ }
>+ if (commandShell->echo == NULL) {
>+ commandShell->echo = "";
>+ }
>+}
>+
> /*-
> *-----------------------------------------------------------------------
> * Job_Init --
>@@ -2581,24 +2613,7 @@ Job_Init(int maxproc, int maxlocal)
> targFmt = TARG_FMT;
> }
>
>- if (shellPath == NULL) {
>- /*
>- * The user didn't specify a shell to use, so we are using the
>- * default one... Both the absolute path and the last component
>- * must be set. The last component is taken from the 'name' field
>- * of the default shell description pointed-to by commandShell.
>- * All default shells are located in _PATH_DEFSHELLDIR.
>- */
>- shellName = commandShell->name;
>- shellPath = str_concat(_PATH_DEFSHELLDIR, shellName, STR_ADDSLASH);
>- }
>-
>- if (commandShell->exit == NULL) {
>- commandShell->exit = "";
>- }
>- if (commandShell->echo == NULL) {
>- commandShell->echo = "";
>- }
>+ Shell_Init();
>
> if (pipe(exit_pipe) < 0)
> Fatal("error in pipe: %s", strerror(errno));
>Index: job.h
>===================================================================
>RCS file: /cvsroot/src/usr.bin/make/job.h,v
>retrieving revision 1.18
>diff -u -p -r1.18 job.h
>--- job.h 2003/07/14 18:19:12 1.18
>+++ job.h 2003/07/31 05:48:20
>@@ -231,6 +231,9 @@ typedef struct Shell {
> const char *exit; /* exit on error */
> } Shell;
>
>+extern const char *shellPath;
>+extern const char *shellName;
>+
> extern int job_pipe[2]; /* token pipe for jobs. */
> extern int jobTokensRunning; /* tokens currently "out" */
> extern int jobTokensFree; /* tokens free but not yet released to pipe */
>@@ -251,6 +254,7 @@ extern Lst stoppedJobs; /* List of job
> * quite get started */
> #endif
>
>+void Shell_Init(void);
> void Job_Touch(GNode *, Boolean);
> Boolean Job_CheckCommands(GNode *, void (*abortProc )(const char *, ...));
> void Job_CatchChildren(Boolean);
>Index: main.c
>===================================================================
>RCS file: /cvsroot/src/usr.bin/make/main.c,v
>retrieving revision 1.89
>diff -u -p -r1.89 main.c
>--- main.c 2003/07/14 18:19:12 1.89
>+++ main.c 2003/07/31 05:48:22
>@@ -1224,10 +1224,12 @@ Cmd_Exec(const char *cmd, const char **e
>
> *err = NULL;
>
>+ if (!shellName)
>+ Shell_Init();
> /*
> * Set up arguments for shell
> */
>- args[0] = "sh";
>+ args[0] = shellName;
> args[1] = "-c";
> args[2] = cmd;
> args[3] = NULL;
>@@ -1258,7 +1260,7 @@ Cmd_Exec(const char *cmd, const char **e
> (void) dup2(fds[1], 1);
> (void) close(fds[1]);
>
>- (void) execv(_PATH_BSHELL, UNCONST(args));
>+ (void) execv(shellPath, UNCONST(args));
> _exit(1);
> /*NOTREACHED*/
>
>
>