diff options
-rw-r--r-- | config.h-vms.template | 10 | ||||
-rw-r--r-- | vmsjobs.c | 29 |
2 files changed, 37 insertions, 2 deletions
diff --git a/config.h-vms.template b/config.h-vms.template index eefc299..71fe269 100644 --- a/config.h-vms.template +++ b/config.h-vms.template @@ -1,6 +1,6 @@ /* config.h-vms. Generated by hand by Klaus Kämpf <kkaempf@rmi.de> -*-C-*- -Copyright (C) 1996-2013 Free Software Foundation, Inc. +Copyright (C) 1996-2014 Free Software Foundation, Inc. This file is part of GNU Make. GNU Make is free software; you can redistribute it and/or modify it under the @@ -414,5 +414,13 @@ this program. If not, see <http://www.gnu.org/licenses/>. */ /* Output sync sypport */ #define NO_OUTPUT_SYNC +/* Define to 1 to write even short single-line actions into a VMS/DCL command + file; this also enables exporting make environment variables into the + (sub-)process, which executes the action. + The usual make rules apply whether a shell variable - here a DCL symbol or + VMS logical [see CRTL getenv()] - is added to the make environment and + is exported. */ +#define USE_DCL_COM_FILE 1 + /* Build host information. */ #define MAKE_HOST "VMS" @@ -613,14 +613,24 @@ child_execute_job (char *argv, struct child *child) cmd = tmp_cmd; } + +#ifdef USE_DCL_COM_FILE + /* Enforce the creation of a command file. + Then all the make environment variables are written as DCL symbol + assignments into the command file as well, so that they are visible + in the sub-process but do not affect the current process. + Further, this way DCL reads the input stream and therefore does + 'forced' symbol substitution, which it doesn't do for one-liners when + they are 'lib$spawn'ed. */ +#else /* Create a *.com file if either the command is too long for lib$spawn, or the command contains a newline, or if redirection is desired. Forcing commands with newlines into DCLs allows to store search lists on user mode logicals. */ - if (strlen (cmd) > MAXCMDLEN || (have_redirection != 0) || (have_newline != 0)) +#endif { FILE *outfile; char c; @@ -686,6 +696,23 @@ child_execute_job (char *argv, struct child *child) DB (DB_JOBS, (_("Redirected output to %s\n"), ofile)); ofiledsc.dsc$w_length = 0; } +#ifdef USE_DCL_COM_FILE + /* Export the child environment into DCL symbols */ + if (child->environment != 0) + { + char **ep = child->environment; + char *valstr; + while (*ep != 0) + { + valstr = strchr(*ep, '='); + if (valstr == NULL) + continue; + fprintf(outfile, "$ %.*s=\"%s\"\n", valstr - *ep, *ep, + valstr + 1); + ep++; + } + } +#endif fprintf (outfile, "$ %.*s_ = f$verify(%.*s_1)\n", tmpstrlen, tmpstr, tmpstrlen, tmpstr); p = sep = q = cmd; for (c = '\n'; c; c = *q++) |