--nWEzmRaGLXxZdI3i
Content-Type: multipart/mixed; boundary="ssZxAlvqSOvXAj81"
Content-Disposition: inline


--ssZxAlvqSOvXAj81
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

* Max Khon wrote:
> BSD make does not exit with appropriate error code (2) if it is run with=

=20
> "-k" and errors are encountered.
>
> Please review this patch that fixes this bug:
>
> http://people.freebsd.org/~fjoe/make.diff
>
> Sample BSDmakefile is:
>
> --- cut here ---
> all: a b
>
> a:
> exit 1
>
> b:
> touch ${.TARGET}
> --- cut here ---
>
> I'd like to commit the to HEAD soon.
>
> /fjoe


Could you take at the attached patches as well? One patch adds support
for the -p flag, which is described in POSIX. The other patch adds a
small optimization, by ignoring execution when the command is a comment.

Thanks!

--=20
Ed Schouten
WWW: http://g-rave.nl/

--ssZxAlvqSOvXAj81
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="freebsd-make-graph-posix.diff"
Content-Transfer-Encoding: quoted-printable

--- src/usr.bin/make/main.c Sun Jul 9 14:13:59 2006
+++ src/usr.bin/make/main.c Sun Jul 9 14:16:59 2006
@@ -127,6 +127,7 @@
Boolean jobsRunning; /* TRUE if the jobs might be running */
Boolean keepgoing; /* -k flag */
Boolean noExecute; /* -n flag */
+Boolean printGraphOnly; /* -p flag */
Boolean queryFlag; /* -q flag */
Boolean touchFlag; /* -t flag */
Boolean usePipes; /* !-P flag */
@@ -335,7 +336,7 @@
rearg:
optind =3D 1; /* since we're called more than once */
optreset =3D 1;
-#define OPTFLAGS "ABC:E:I:PSV:Xd:ef:ij:km:nqrstvx:"
+#define OPTFLAGS "ABC:E:I:PSV:Xd:ef:ij:km:npqrstvx:"
for (; {
if ((optind < argc) && strcmp(argv[optind], "--") =3D=3D 0) {
found_dd =3D TRUE;
@@ -477,6 +478,10 @@
noExecute =3D TRUE;
MFLAGS_append("-n", NULL);
break;
+ case 'p':
+ printGraphOnly =3D TRUE;
+ debug |=3D DEBUG_GRAPH1;
+ break;
case 'q':
queryFlag =3D TRUE;
/* Kind of nonsensical, wot? */
@@ -685,6 +690,7 @@
beSilent =3D FALSE; /* Print commands as executed */
ignoreErrors =3D FALSE; /* Pay attention to non-zero returns */
noExecute =3D FALSE; /* Execute all commands */
+ printGraphOnly =3D FALSE; /* Do not print processed output */
keepgoing =3D FALSE; /* Stop on error */
allPrecious =3D FALSE; /* Remove targets when interrupted */
queryFlag =3D FALSE; /* This is not just a check-run */
@@ -1026,7 +1032,7 @@
Targ_PrintGraph(1);
=20
/* print the values of any variables requested by the user */
- if (Lst_IsEmpty(&variables)) {
+ if (Lst_IsEmpty(&variables) && !printGraphOnly) {
/*
* Since the user has not requested that any variables
* be printed, we can build targets.
@@ -1069,7 +1075,7 @@
}
Lst_Destroy(&targs, NOFREE);
=20
- } else {
+ } else if (!printGraphOnly) {
Var_Print(&variables, expandVars);
}
=20
--- src/usr.bin/make/make.1 Sun Jul 9 14:14:02 2006
+++ src/usr.bin/make/make.1 Sun Jul 9 14:22:53 2006
@@ -40,7 +40,7 @@
.Nd maintain program dependencies
.Sh SYNOPSIS
.Nm
-.Op Fl ABPSXeiknqrstv
+.Op Fl ABPSXeiknpqrstv
.Op Fl C Ar directory
.Op Fl D Ar variable
.Op Fl d Ar flags
@@ -242,6 +242,15 @@
This option has no effect unless
.Fl j
is used too.
+.It Fl p
+Only print the input graph, do not executing any commands. The output is t=
he
+same as
+.Fl d Ar g1 .
+When combined with
+.Fl f Pa /dev/null ,
+only the builtin rules of
+.Nm
+are displayed.
.It Fl q
Do not execute any commands, but exit 0 if the specified targets are
up-to-date and 1, otherwise.

--ssZxAlvqSOvXAj81
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="freebsd-make-comment.diff"
Content-Transfer-Encoding: quoted-printable

Index: job.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D
RCS file: /datadump/cvs/freebsd/src/usr.bin/make/job.c,v
retrieving revision 1.126
diff -u -r1.126 job.c
--- job.c 8 Mar 2007 09:16:10 -0000 1.126
+++ job.c 10 Jun 2007 11:39:45 -0000
@@ -2817,6 +2817,24 @@
}
=20
/**
+ * shellskip
+ *
+ * Results:
+ * Returns a non-zero value if execution of the command wouldn't
+ * have an effect at all, which allows us to skip this line. This
+ * is useful for lines starting with '#'.
+ */
+static int
+shellskip(char *cmd)
+{
+ if (commandShell->skipfirst !=3D NULL &&
+ strchr(commandShell->skipfirst, cmd[0]) !=3D NULL)
+ return (1);
+
+ return (0);
+}
+
+/**
* shellneed
*
* Results:
@@ -2958,6 +2976,13 @@
return (0);
}
=20
+ /*
+ * Don't execute the command if it's just a comment.
+ */
+ if (shellskip(cmd)) {
+ return (0);
+ }
+
ps.in =3D STDIN_FILENO;
ps.out =3D STDOUT_FILENO;
ps.err =3D STDERR_FILENO;
Index: shell.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D
RCS file: /datadump/cvs/freebsd/src/usr.bin/make/shell.c,v
retrieving revision 1.1
diff -u -r1.1 shell.c
--- shell.c 24 May 2005 15:30:03 -0000 1.1
+++ shell.c 10 Jun 2007 11:51:31 -0000
@@ -82,7 +82,7 @@
"name=3Dcsh path=3D'" PATH_DEFSHELLDIR "/csh' "
"quiet=3D'unset verbose' echo=3D'set verbose' filter=3D'unset verbose' "
"hasErrCtl=3DN check=3D'echo \"%s\"\n' ignore=3D'csh -c \"%s || exit 0\"'=
"
- "echoFlag=3Dv errFlag=3De "
+ "echoFlag=3Dv errFlag=3De skipfirst=3D# "
"meta=3D'" CSH_META "' builtins=3D'" CSH_BUILTINS "'",
=20
/*
@@ -92,7 +92,7 @@
"name=3Dsh path=3D'" PATH_DEFSHELLDIR "/sh' "
"quiet=3D'set -' echo=3D'set -v' filter=3D'set -' "
"hasErrCtl=3DY check=3D'set -e' ignore=3D'set +e' "
- "echoFlag=3Dv errFlag=3De "
+ "echoFlag=3Dv errFlag=3De skipfirst=3D# "
"meta=3D'" SH_META "' builtins=3D'" SH_BUILTINS "'",
=20
/*
@@ -103,7 +103,7 @@
"name=3Dksh path=3D'" PATH_DEFSHELLDIR "/ksh' "
"quiet=3D'set -' echo=3D'set -v' filter=3D'set -' "
"hasErrCtl=3DY check=3D'set -e' ignore=3D'set +e' "
- "echoFlag=3Dv errFlag=3De "
+ "echoFlag=3Dv errFlag=3De skipfirst=3D# "
"meta=3D'" SH_META "' builtins=3D'" SH_BUILTINS "' unsetenv=3DT",
=20
NULL
@@ -150,6 +150,7 @@
free(sh->echo);
free(sh->exit);
ArgArray_Done(&sh->builtins);
+ free(sh->skipfirst);
free(sh->meta);
free(sh);
}
@@ -174,7 +175,8 @@
fprintf(stderr, " builtins=3D%d\n", sh->builtins.argc - 1);
for (i =3D 1; i < sh->builtins.argc; i++)
fprintf(stderr, " '%s'", sh->builtins.argv[i]);
- fprintf(stderr, "\n meta=3D'%s'\n", sh->meta);
+ fprintf(stderr, "\n skipfirst=3D'%s'\n", sh->skipfirst);
+ fprintf(stderr, " meta=3D'%s'\n", sh->meta);
fprintf(stderr, " unsetenv=3D%d\n", sh->unsetenv);
}
=20
@@ -260,6 +262,10 @@
qsort(sh->builtins.argv + 1, sh->builtins.argc - 1,
sizeof(char *), sort_builtins);
*fullSpec =3D TRUE;
+ } else if (strcmp(keyw, "skipfirst") =3D=3D 0) {
+ free(sh->skipfirst);
+ sh->skipfirst =3D estrdup(eq);
+ *fullSpec =3D TRUE;
} else if (strcmp(keyw, "meta") =3D=3D 0) {
free(sh->meta);
sh->meta =3D estrdup(eq);
@@ -379,6 +385,8 @@
* execute the command directly. If this list is empty
* it is assumed, that the command must always be
* handed over to the shell.
+ * skipfirst Skip execution of the command if the first
+ * character has a certain value.
* meta The shell meta characters. If this is not specified
* or empty, commands are alway passed to the shell.
* Otherwise they are not passed when they contain
Index: shell.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D
RCS file: /datadump/cvs/freebsd/src/usr.bin/make/shell.h,v
retrieving revision 1.1
diff -u -r1.1 shell.h
--- shell.h 24 May 2005 15:30:03 -0000 1.1
+++ shell.h 10 Jun 2007 11:39:45 -0000
@@ -96,6 +96,7 @@
char *exit; /* command line flag: exit on error */
=20
ArgArray builtins; /* ordered list of shell builtins */
+ char *skipfirst; /* characters that determine if we can skip the line */
char *meta; /* shell meta characters */
=20
Boolean unsetenv; /* unsetenv("ENV") before exec */

--ssZxAlvqSOvXAj81--

--nWEzmRaGLXxZdI3i
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (FreeBSD)

iEYEARECAAYFAkfmdHoACgkQ52SDGA2eCwVwaACfc+REXUn8H2 98o0gQoqKVnm9h
0dUAnjVM7fww74UaBZvKV1UIOQwcH8im
=drjK
-----END PGP SIGNATURE-----

--nWEzmRaGLXxZdI3i--