Date: Sun, 13 Aug 1995 23:44:06 +0200 From: Wolfram Schneider <wosch@cs.tu-berlin.de> To: current@freebsd.org Subject: make(1) extension for SHELL COMMANDS Message-ID: <199508132144.XAA25996@localhost>
next in thread | raw e-mail | index | archive | help
from new manpage: If the first or first three characters of the command line are `@' and/or `-', and/or `!', the command is treated specially. A `@' causes the com- mand not to be echoed before it is executed. A `-' causes any non-zero exit status of the command line to be ignored. A `!' causes make to use exec and not /bin/sh. This makes live with quotes much easier. Example: date: date "+%D%M (test)\n" use /bin/sh due '(' date: !date "+%D%M (test)\n" use explicit exec. -- Wolfram Schneider <wosch@cs.tu-berlin.de> http://hyperg.cs.tu-berlin.de/C~wosch --- 1.1 1995/08/13 16:54:38 +++ compat.c 1995/08/13 21:28:49 @@ -148,7 +148,8 @@ char *cmdStart; /* Start of expanded command */ register char *cp; Boolean silent, /* Don't print command */ - errCheck; /* Check errors */ + errCheck, /* Check errors */ + ForceExec; /* Don't use /bin/sh, use exec */ union wait reason; /* Reason for child's death */ int status; /* Description of child's death */ int cpid; /* Child actually found */ @@ -171,6 +172,7 @@ silent = gn->type & OP_SILENT; errCheck = !(gn->type & OP_IGNORE); + ForceExec = gn->type & OP_FORCE_EXEC; cmdNode = Lst_Member (gn->commands, (ClientData)cmd); cmdStart = Var_Subst (NULL, cmd, gn, FALSE); @@ -198,11 +200,13 @@ return(0); } - while ((*cmd == '@') || (*cmd == '-')) { + while ((*cmd == '@') || (*cmd == '-') || (*cmd == '!')) { if (*cmd == '@') { silent = TRUE; - } else { + } else if (*cmd == '-'){ errCheck = FALSE; + } else { + ForceExec = TRUE; } cmd++; } @@ -235,7 +239,16 @@ if (noExecute) { return (0); } - + + /* + * to force an exec and not /bin/sh ignore result from + * meta character checking + */ + if (ForceExec) { + while(*cp) + cp++; + } + if (*cp != '\0') { /* * If *cp isn't the null character, we hit a "meta" character and @@ -259,6 +272,18 @@ */ av = brk_string(cmd, &argc); av += 1; + if (ForceExec && DEBUG(JOB)) { + char **a = av; + + fprintf(stdout, "ForceExec %s\n", cmd); + fprintf(stdout, "execvp(\"%s\"", *av); + for(a = av; *a; a++) { + fprintf(stdout, ", \"%s\"", *a); + } + fprintf(stdout, ");\nargc: %d\n", argc); + } + + } local = TRUE; --- 1.1 1995/08/13 17:30:42 +++ job.c 1995/08/13 17:30:53 @@ -447,10 +447,10 @@ /* * Check for leading @' and -'s to control echoing and error checking. */ - while (*cmd == '@' || *cmd == '-') { + while (*cmd == '@' || *cmd == '-' || *cmd == '!') { if (*cmd == '@') { shutUp = TRUE; - } else { + } else if (*cmd == '-'){ errOff = TRUE; } cmd++; --- 1.1 1995/08/13 21:06:29 +++ make.1 1995/08/13 21:40:23 @@ -236,10 +236,12 @@ .Ql Ic :: operator is used. .Pp -If the first or first two characters of the command line are +If the first or first three characters of the command line are .Ql Ic @ and/or .Ql Ic \- , +and/or +.Ql Ic ! , the command is treated specially. A .Ql Ic @ @@ -247,6 +249,10 @@ A .Ql Ic \- causes any non-zero exit status of the command line to be ignored. +A +.Ql Ic ! +causes make to use exec and not /bin/sh. This makes live with +quotes and meta characters much easier. .Sh VARIABLE ASSIGNMENTS Variables in make are much like variables in the shell, and, by tradition, consist of all upper-case letters. --- 1.1 1995/08/13 17:08:19 +++ make.h 1995/08/13 17:08:26 @@ -179,6 +179,7 @@ * state of the -n or -t flags */ #define OP_JOIN 0x00000400 /* Target is out-of-date only if any of its * children was out-of-date */ +#define OP_FORCE_EXEC 0x00000800 /* Don't use /bin/sh, use exec */ #define OP_INVISIBLE 0x00004000 /* The node is invisible to its parents. * I.e. it doesn't show up in the parents's * local variables. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199508132144.XAA25996>