make-w32
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: Eli Zaretskii
Subject: Re: process_begin: CreateProcess(NULL, "", ...) failed
Date: Mon, 17 Mar 2008 22:38:27 +0200

> Date: Mon, 17 Mar 2008 14:34:06 +0100
> From: Fabrice GIRARDOT <address@hidden>
> 
> 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  <address@hidden>

        * 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  <address@hidden>

        * 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;
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]