1 /* Definitions for managing subprocesses in GNU Make. 2 Copyright (C) 1992-2020 Free Software Foundation, Inc. 3 This file is part of GNU Make. 4 5 GNU Make is free software; you can redistribute it and/or modify it under the 6 terms of the GNU General Public License as published by the Free Software 7 Foundation; either version 3 of the License, or (at your option) any later 8 version. 9 10 GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY 11 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 12 A PARTICULAR PURPOSE. See the GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License along with 15 this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17 #include "output.h" 18 19 /* Structure describing a running or dead child process. */ 20 21 #ifdef VMS 22 #define VMSCHILD \ 23 char *comname; /* Temporary command file name */ \ 24 int efn; /* Completion event flag number */ \ 25 int cstatus; /* Completion status */ \ 26 int vms_launch_status; /* non-zero if lib$spawn, etc failed */ 27 #else 28 #define VMSCHILD 29 #endif 30 31 #define CHILDBASE \ 32 char *cmd_name; /* Alloced copy of command run. */ \ 33 char **environment; /* Environment for commands. */ \ 34 VMSCHILD \ 35 struct output output /* Output for this child. */ 36 37 38 struct childbase 39 { 40 CHILDBASE; 41 }; 42 43 struct child 44 { 45 CHILDBASE; 46 47 struct child *next; /* Link in the chain. */ 48 49 struct file *file; /* File being remade. */ 50 51 char *sh_batch_file; /* Script file for shell commands */ 52 char **command_lines; /* Array of variable-expanded cmd lines. */ 53 char *command_ptr; /* Ptr into command_lines[command_line]. */ 54 55 unsigned int command_line; /* Index into command_lines. */ 56 57 pid_t pid; /* Child process's ID number. */ 58 59 unsigned int remote:1; /* Nonzero if executing remotely. */ 60 unsigned int noerror:1; /* Nonzero if commands contained a '-'. */ 61 unsigned int good_stdin:1; /* Nonzero if this child has a good stdin. */ 62 unsigned int deleted:1; /* Nonzero if targets have been deleted. */ 63 unsigned int recursive:1; /* Nonzero for recursive command ('+' etc.) */ 64 unsigned int jobslot:1; /* Nonzero if it's reserved a job slot. */ 65 unsigned int dontcare:1; /* Saved dontcare flag. */ 66 }; 67 68 extern struct child *children; 69 70 /* A signal handler for SIGCHLD, if needed. */ 71 RETSIGTYPE child_handler (int sig); 72 int is_bourne_compatible_shell(const char *path); 73 void new_job (struct file *file); 74 void reap_children (int block, int err); 75 void start_waiting_jobs (void); 76 77 char **construct_command_argv (char *line, char **restp, struct file *file, 78 int cmd_flags, char** batch_file); 79 80 pid_t child_execute_job (struct childbase *child, int good_stdin, char **argv); 81 82 #ifdef _AMIGA 83 void exec_command (char **argv) NORETURN; 84 #elif defined(__EMX__) 85 int exec_command (char **argv, char **envp); 86 #else 87 void exec_command (char **argv, char **envp) NORETURN; 88 #endif 89 90 void unblock_all_sigs (void); 91 92 extern unsigned int job_slots_used; 93 extern unsigned int jobserver_tokens; 94