Re: process_begin: CreateProcess(NULL, "", ...) failed

Eli Zaretskii <[email protected]>
Newsgroups gmane.comp.gnu.make.windows
Message-ID <[email protected]>
> Date: Mon, 17 Mar 2008 14:34:06 +0100
> From: Fabrice GIRARDOT <[email protected]>
> 
> Using GNU Make 3.81 compiled for Win32, I got this error message
> when I run Make with the "-n" option :
> 
> process_begin: CreateProcess(NULL, "", ...) failed

Yes, this is a known bug in Make 3.81.  If you can build Make from
sources, please try the following two patches (apply them in order):

2006-05-27  Eli Zaretskii  <[email protected]>

	* function.c (func_shell) [WINDOWS32]: Reset just_print_flag
	around the call to construct_command_argv, so that a temporary
	batch file _is_ created when needed for $(shell).


--- function.c~0	2006-04-01 12:36:40.000000000 +0300
+++ function.c	2006-05-27 15:58:26.984375000 +0300
@@ -1589,12 +1589,25 @@ func_shell (char *o, char **argv, const 
   int pid;
 
 #ifndef __MSDOS__
+#ifdef WINDOWS32
+  /* Reset just_print_flag.  This is needed on Windows when batch files
+     are used to run the commands, because we normally refrain from
+     creating batch files under -n.  */
+  int j_p_f = just_print_flag;
+
+  just_print_flag = 0;
+#endif
   /* Construct the argument list.  */
   command_argv = construct_command_argv (argv[0],
 					 (char **) NULL, (struct file *) 0,
                                          &batch_filename);
   if (command_argv == 0)
-    return o;
+    {
+#ifdef WINDOWS32
+      just_print_flag = j_p_f;
+#endif
+      return o;
+    }
 #endif
 
   /* Using a target environment for `shell' loses in cases like:
@@ -1622,12 +1635,14 @@ func_shell (char *o, char **argv, const 
 #ifdef WINDOWS32
 
   windows32_openpipe (pipedes, &pid, command_argv, envp);
+  /* Restore the value of just_print_flag.  */
+  just_print_flag = j_p_f;
 
   if (pipedes[0] < 0) {
 	/* open of the pipe failed, mark as failed execution */
     shell_function_completed = -1;
 
-	return o;
+    return o;
   } else
 
 #elif defined(__MSDOS__)



2007-07-21  Eli Zaretskii  <[email protected]>

	* function.c (func_shell): Call construct_command_argv with zero
	value of FLAGS.

	* job.c (construct_command_argv_internal): New argument FLAGS; all
	callers changed.
	[WINDOWS32]: If FLAGS has the COMMANDS_RECURSE bit set, ignore
	just_print_flag.

	* job.h (construct_command_argv_internal): Update prototype.

--- job.c~1	2006-08-19 09:25:07.687500000 +0300
+++ job.c	2007-07-21 16:35:37.391750000 +0300
@@ -1018,7 +1018,9 @@
 #ifdef VMS
     argv = p;
 #else
-    argv = construct_command_argv (p, &end, child->file, &child->sh_batch_file);
+    argv = construct_command_argv (p, &end, child->file,
+				   child->file->cmds->lines_flags[child->command_line - 1],
+				   &child->sh_batch_file);
 #endif
     if (end == NULL)
       child->command_ptr = NULL;
@@ -2193,11 +2195,17 @@
    If *RESTP is NULL, newlines will be ignored.
 
    SHELL is the shell to use, or nil to use the default shell.
-   IFS is the value of $IFS, or nil (meaning the default).  */
+   IFS is the value of $IFS, or nil (meaning the default).
+
+   FLAGS is the value of lines_flags for this command line.  It is
+   used in the WINDOWS32 port to check whether + or $(MAKE) were found
+   in this command line, in which case the effect of just_print_flag
+   is overridden.  */
 
 static char **
 construct_command_argv_internal (char *line, char **restp, char *shell,
-                                 char *ifs, char **batch_filename_ptr)
+                                 char *ifs, int flags,
+				 char **batch_filename_ptr)
 {
 #ifdef __MSDOS__
   /* MSDOS supports both the stock DOS shell and ports of Unixy shells.
@@ -2776,7 +2784,7 @@
     /* Some shells do not work well when invoked as 'sh -c xxx' to run a
        command line (e.g. Cygnus GNUWIN32 sh.exe on WIN32 systems).  In these
        cases, run commands via a script file.  */
-    if (just_print_flag) {
+    if (just_print_flag && !(flags & COMMANDS_RECURSE)) {
       /* Need to allocate new_argv, although it's unused, because
         start_job_command will want to free it and its 0'th element.  */
       new_argv = (char **) xmalloc(2 * sizeof (char *));
@@ -2820,7 +2828,7 @@
     if (unixy_shell)
       new_argv = construct_command_argv_internal (new_line, (char **) NULL,
                                                   (char *) 0, (char *) 0,
-                                                  (char **) 0);
+                                                  flags, (char **) 0);
 #ifdef __EMX__
     else if (!unixy_shell)
       {
@@ -2930,7 +2938,7 @@
 
 char **
 construct_command_argv (char *line, char **restp, struct file *file,
-                        char **batch_filename_ptr)
+                        int cmd_flags, char **batch_filename_ptr)
 {
   char *shell, *ifs;
   char **argv;
@@ -3042,7 +3050,8 @@
     warn_undefined_variables_flag = save;
   }
 
-  argv = construct_command_argv_internal (line, restp, shell, ifs, batch_filename_ptr);
+  argv = construct_command_argv_internal (line, restp, shell, ifs,
+					  cmd_flags, batch_filename_ptr);
 
   free (shell);
   free (ifs);
--- job.h~1	2006-08-12 15:44:06.875000000 +0300
+++ job.h	2007-07-21 16:21:39.110500000 +0300
@@ -70,7 +70,7 @@
 extern void reap_children PARAMS ((int block, int err));
 extern void start_waiting_jobs PARAMS ((void));
 
-extern char **construct_command_argv PARAMS ((char *line, char **restp, struct file *file, char** batch_file));
+extern char **construct_command_argv PARAMS ((char *line, char **restp, struct file *file, int cmd_flags, char** batch_file));
 #ifdef VMS
 extern int child_execute_job PARAMS ((char *argv, struct child *child));
 #elif defined(__MSDOS__) || defined(__EMX__)
--- function.c~1	2006-05-27 17:37:47.453125000 +0300
+++ function.c	2007-07-21 16:22:48.126125000 +0300
@@ -1600,7 +1600,7 @@
   /* Construct the argument list.  */
   command_argv = construct_command_argv (argv[0],
 					 (char **) NULL, (struct file *) 0,
-                                         &batch_filename);
+                                         0, &batch_filename);
   if (command_argv == 0)
     {
 #ifdef WINDOWS32
@@ -1799,7 +1799,7 @@
 
   /* Construct the argument list.  */
   command_argv = construct_command_argv (argv[0], (char **) NULL,
-                                         (struct file *) 0, &batch_filename);
+                                         (struct file *) 0, 0, &batch_filename);
   if (command_argv == 0)
     return o;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.