* A bugfix on MAKEFLAGS options creation that broke jobserver.

* Put the host info in the --version output.
* Don't croak if the user forces -jN on submakes.
This commit is contained in:
Paul Smith 1999-09-01 08:04:30 +00:00
parent bf7cc546dd
commit 82f0c5495a
9 changed files with 133 additions and 13 deletions

View file

@ -1,3 +1,31 @@
1999-09-01 Paul D. Smith <psmith@gnu.org>
* configure.in (MAKE_HOST): Define it to be the canonical build
host info, now that we need AC_CANONICAL_HOST anyway (for large
file support).
* version.c (make_host): Define a variable to MAKE_HOST so we're
sure to get it from the local config.h.
* main.c (print_version): Use it in the version information.
* config.ami.template: Add MAKE_HOST.
* configh.dos.template: Ditto.
* config.h.W32.template: Ditto.
* config.h-vms.template: Ditto.
* main.c (main): Close the jobserver file descriptors if we need
to re-exec ourselves.
Also print more reasonable error if users force -jN for submakes.
This may be common for a while until people use the jobserver
feature. If it happens, we ignore the existing jobserver stuff
and use whatever they specified on the commandline.
(define_makeflags): Fixed a long-standing bug: if a long name
only option comes immediately after a single letter option with no
argument, then the option string is constructed incorrectly. For
example, with -w and --jobserver-fds you get "-w-jobserver-fds..."
instead of "-w --jobserver-fds..."; add in an extra " -".
* make.texinfo (Phony Targets): Add another example of using
.PHONY with subdirectories/recursive make.
1999-08-30 Paul D. Smith <psmith@gnu.org> 1999-08-30 Paul D. Smith <psmith@gnu.org>
* README.W32.template: Renamed from README.W32 so it's * README.W32.template: Renamed from README.W32 so it's

View file

@ -308,3 +308,6 @@
/* Define for Case Insensitve behavior */ /* Define for Case Insensitve behavior */
#define HAVE_CASE_INSENSITIVE_FS #define HAVE_CASE_INSENSITIVE_FS
/* Build host information. */
#define MAKE_HOST "Amiga"

View file

@ -341,3 +341,5 @@
#define PARAMS(protos) () #define PARAMS(protos) ()
#endif /* C++ or ANSI C. */ #endif /* C++ or ANSI C. */
/* Build host information. */
#define MAKE_HOST "VMS"

View file

@ -332,6 +332,9 @@
/* Define if you have the sun library (-lsun). */ /* Define if you have the sun library (-lsun). */
/* #undef HAVE_LIBSUN */ /* #undef HAVE_LIBSUN */
/* Build host information. */
#define MAKE_HOST "Windows32"
/* /*
* Refer to README.W32 for info on the following settings * Refer to README.W32 for info on the following settings
*/ */

View file

@ -47,3 +47,6 @@
/* Define if you have the vprintf library function. */ /* Define if you have the vprintf library function. */
#undef HAVE_VPRINTF #undef HAVE_VPRINTF
#define HAVE_VPRINTF 1 #define HAVE_VPRINTF 1
/* Build host information. */
#define MAKE_HOST "DOS (DJGPP)"

View file

@ -209,6 +209,9 @@ case "$make_cv_sys_gnu_glob" in
esac esac
AC_DEFINE_UNQUOTED(MAKE_HOST,"$host",[Build host information.])
MAINT_MAKEFILE=/dev/null MAINT_MAKEFILE=/dev/null
if test -r "$srcdir/maintMakefile"; then if test -r "$srcdir/maintMakefile"; then
MAINT_MAKEFILE="$srcdir/maintMakefile" MAINT_MAKEFILE="$srcdir/maintMakefile"

49
main.c
View file

@ -1316,13 +1316,6 @@ int main (int argc, char ** argv)
if (jobserver_fds->idx > 1) if (jobserver_fds->idx > 1)
fatal (NILF, _("internal error: multiple --jobserver-fds options")); fatal (NILF, _("internal error: multiple --jobserver-fds options"));
/* The combination of a pipe + !job_slots means we're using the
jobserver. If !job_slots and we don't have a pipe, we can start
infinite jobs. */
if (job_slots != 0)
fatal (NILF, _("internal error: --jobserver-fds unexpected"));
/* Now parse the fds string and make sure it has the proper format. */ /* Now parse the fds string and make sure it has the proper format. */
cp = jobserver_fds->list[0]; cp = jobserver_fds->list[0];
@ -1331,12 +1324,21 @@ int main (int argc, char ** argv)
fatal (NILF, fatal (NILF,
_("internal error: invalid --jobserver-fds string `%s'"), cp); _("internal error: invalid --jobserver-fds string `%s'"), cp);
/* The combination of a pipe + !job_slots means we're using the
jobserver. If !job_slots and we don't have a pipe, we can start
infinite jobs. If we see both a pipe and job_slots >0 that means the
user set -j explicitly. This is broken; in this case obey the user
(ignore the jobserver pipe for this make) but print a message. */
if (job_slots > 0)
error (NILF, _("warning: -jN set for submakes: ignoring jobserver."));
/* Create a duplicate pipe, that will be closed in the SIGCHLD /* Create a duplicate pipe, that will be closed in the SIGCHLD
handler. If this fails with EBADF, the parent has closed the pipe handler. If this fails with EBADF, the parent has closed the pipe
on us because it didn't think we were a submake. If so, print a on us because it didn't think we were a submake. If so, print a
warning then default to -j1. */ warning then default to -j1. */
if ((job_rfd = dup (job_fds[0])) < 0) else if ((job_rfd = dup (job_fds[0])) < 0)
{ {
if (errno != EBADF) if (errno != EBADF)
pfatal_with_name (_("dup jobserver")); pfatal_with_name (_("dup jobserver"));
@ -1344,6 +1346,12 @@ int main (int argc, char ** argv)
error (NILF, error (NILF,
_("warning: jobserver unavailable (using -j1). Add `+' to parent make rule.")); _("warning: jobserver unavailable (using -j1). Add `+' to parent make rule."));
job_slots = 1; job_slots = 1;
}
if (job_slots > 0)
{
close (job_fds[0]);
close (job_fds[1]);
job_fds[0] = job_fds[1] = -1; job_fds[0] = job_fds[1] = -1;
free (jobserver_fds->list); free (jobserver_fds->list);
free (jobserver_fds); free (jobserver_fds);
@ -1354,7 +1362,7 @@ int main (int argc, char ** argv)
/* If we have >1 slot but no jobserver-fds, then we're a top-level make. /* If we have >1 slot but no jobserver-fds, then we're a top-level make.
Set up the pipe and install the fds option for our children. */ Set up the pipe and install the fds option for our children. */
else if (job_slots > 1) if (job_slots > 1)
{ {
char c = '+'; char c = '+';
@ -1682,6 +1690,15 @@ int main (int argc, char ** argv)
fflush (stdout); fflush (stdout);
fflush (stderr); fflush (stderr);
/* Close the jobserver pipes if we opened any. */
if (job_fds[0] >= 0)
{
close (job_fds[0]);
close (job_fds[1]);
}
if (job_rfd >= 0)
close (job_rfd);
#ifndef _AMIGA #ifndef _AMIGA
exec_command (nargv, environ); exec_command (nargv, environ);
#else #else
@ -2383,14 +2400,19 @@ define_makeflags (all, makefile)
while (flags != 0) while (flags != 0)
{ {
/* Add the flag letter or name to the string. */ /* Add the flag letter or name to the string. */
if (!short_option (flags->cs->c)) if (short_option (flags->cs->c))
*p++ = flags->cs->c;
else
{ {
if (*p != '-')
{
*p++ = ' ';
*p++ = '-';
}
*p++ = '-'; *p++ = '-';
strcpy (p, flags->cs->long_name); strcpy (p, flags->cs->long_name);
p += strlen (p); p += strlen (p);
} }
else
*p++ = flags->cs->c;
if (flags->arg != 0) if (flags->arg != 0)
{ {
/* A flag that takes an optional argument which in this case is /* A flag that takes an optional argument which in this case is
@ -2509,6 +2531,7 @@ define_makeflags (all, makefile)
static void static void
print_version () print_version ()
{ {
extern char *make_host;
static int printed_version = 0; static int printed_version = 0;
char *precede = print_data_base_flag ? "# " : ""; char *precede = print_data_base_flag ? "# " : "";
@ -2517,7 +2540,7 @@ print_version ()
/* Do it only once. */ /* Do it only once. */
return; return;
printf ("%sGNU Make version %s", precede, version_string); printf ("%sGNU Make %s (%s)", precede, version_string, make_host);
if (remote_description != 0 && *remote_description != '\0') if (remote_description != 0 && *remote_description != '\0')
printf ("-%s", remote_description); printf ("-%s", remote_description);

View file

@ -2183,6 +2183,56 @@ clean:
@end group @end group
@end example @end example
Another example of the usefulness of phony targets is in conjunction
with recursive invocations of @code{make}. In this case the makefile
will often contain a variable which lists a number of subdirectories to
be built. One way to handle this is with one rule whose command is a
shell loop over the subdirectories, like this:
@example
@group
SUBDIRS = foo bar baz
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
@end group
@end example
There are a few of problems with this method, however. First, any error
detected in a submake is not noted by this rule, so it will continue to
build the rest of the directories even when one fails. This can be
overcome by adding shell commands to note the error and exit, but then
it will do so even if @code{make} is invoked with the @code{-k} option,
which is unfortunate. Second, and perhaps more importantly, you cannot
take advantage of the parallel build capabilities of make using this
method, since there is only one rule.
By declaring the subdirectories as phony targets (you must do this as
the subdirectory obviously always exists; otherwise it won't be built)
you can remove these problems:
@example
@group
SUBDIRS = foo bar baz
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
foo: baz
@end group
@end example
Here we've also declared that the @file{foo} subdirectory cannot be
built until after the @file{baz} subdirectory is complete; this kind of
relationship declaration is particularly important when attempting
parallel builds.
A phony target should not be a prerequisite of a real target file; if it A phony target should not be a prerequisite of a real target file; if it
is, its commands are run every time @code{make} goes to update that is, its commands are run every time @code{make} goes to update that
file. As long as a phony target is never a prerequisite of a real file. As long as a phony target is never a prerequisite of a real

View file

@ -3,7 +3,12 @@
(which it would do because make.h was found in $srcdir). */ (which it would do because make.h was found in $srcdir). */
#include <config.h> #include <config.h>
#ifndef MAKE_HOST
# define MAKE_HOST "unknown"
#endif
char *version_string = VERSION; char *version_string = VERSION;
char *make_host = MAKE_HOST;
/* /*
Local variables: Local variables: