mirror of
https://salsa.debian.org/srivasta/make-dfsg.git
synced 2024-12-25 05:29:47 +00:00
* 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:
parent
bf7cc546dd
commit
82f0c5495a
9 changed files with 133 additions and 13 deletions
28
ChangeLog
28
ChangeLog
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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)"
|
||||||
|
|
|
@ -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
49
main.c
|
@ -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);
|
||||||
|
|
||||||
|
|
50
make.texinfo
50
make.texinfo
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue