mirror of
https://github.com/mirror/make.git
synced 2026-08-20 08:53:28 +08:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e34540f79b | ||
|
|
09f1e4cf83 | ||
|
|
28ef4c4dac | ||
|
|
3a945a665e | ||
|
|
6dbd348522 | ||
|
|
a9166bb7bc | ||
|
|
4e7ee4fc01 |
165
ChangeLog
165
ChangeLog
@@ -1,3 +1,135 @@
|
||||
1999-08-01 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
New jobserver algorithm to avoid a possible hole where we could
|
||||
miss SIGCHLDs and get into a deadlock. The original algorithm was
|
||||
suggested by Roland McGrath with a nice refinement by Paul Eggert.
|
||||
Many thanks as well to Tim Magill and Howard Chu, who also
|
||||
provided many viable ideas and critiques. We all had a fun week
|
||||
dreaming up interesting ways to use and abuse UNIX syscalls :).
|
||||
|
||||
Previously we could miss a SIGCHLD if it happened after we reaped
|
||||
the children but before we re-entered the blocking read. If this
|
||||
happened to all makes and/or all children, make would never wake
|
||||
up.
|
||||
|
||||
We avoid this by having the SIGCHLD handler reset the blocking bit
|
||||
on the jobserver pipe read FD (normally read does block in this
|
||||
algorithm). Now if the handler is called between the time we reap
|
||||
and the time we read(), and there are no tokens available, the
|
||||
read will merely return with EAGAIN instead of blocking.
|
||||
|
||||
* main.c (main): Set the blocking bit explicitly here.
|
||||
* job.c (child_handler): If we have a jobserver pipe, set the
|
||||
non-blocking bit for it.
|
||||
(start_waiting_job): Move the token stuff back to new_job; if we
|
||||
do it here then we're not controlling the number of remote jobs
|
||||
started!
|
||||
(new_job): Move the check for job slots to _after_ we've created a
|
||||
child structure. If the read returns without getting a token, set
|
||||
the blocking bit then try to reap_children.
|
||||
|
||||
* make.h (EINTR_SET): Define to test errno if EINTR is available,
|
||||
or 0 otherwise. Just some code cleanup.
|
||||
* arscan.c (ar_member_touch): Use it.
|
||||
* function.c (func_shell): Use it.
|
||||
* job.c (reap_children): Use it.
|
||||
* remake.c (touch_file): Use it.
|
||||
|
||||
1999-07-28 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* make.h: Define _() and N_() macros as passthrough to initiate
|
||||
NLS support.
|
||||
* <all>: Add _()/N_() around translatable strings.
|
||||
|
||||
1999-07-27 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* read.c: Make sure make.h comes before other headers.
|
||||
|
||||
1999-07-26 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* make.texinfo (Quick Reference): Update with the new features.
|
||||
|
||||
1999-07-25 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* remake.c [__MSDOS__]: Don't include variables.h, it's already
|
||||
included.
|
||||
|
||||
* function.c (msdos_openpipe) [__MSDOS__]: Return FILE ptr.
|
||||
(func_shell) [__MSDOS__]: Fix the argument list.
|
||||
|
||||
* Makefile.DOS.template: Update from Makefile.in.
|
||||
|
||||
* README.DOS.template: Configure command fixed.
|
||||
|
||||
* configh.dos.template: Update to provide definitions for
|
||||
uintmax_t, fd_set_size_t, and HAVE_SELECT.
|
||||
|
||||
1999-07-24 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* Version 3.77.91 released.
|
||||
|
||||
* configure.in: Changes to the boostrapping code: if build.sh.in
|
||||
doesn't exist configure spits an error and generates an empty
|
||||
build.sh file which causes make to be confused.
|
||||
* maintMakefile: Don't build README early.
|
||||
|
||||
1999-07-23 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* job.c (my_job_token): This variable controls whether we've
|
||||
handed our personal token to a subprocess or not. Note we could
|
||||
probably infer this from the value of job_slots_used, but it's
|
||||
clearer to just keep it separately. Job_slots_used isn't really
|
||||
relevant when running the job server.
|
||||
(free_job_token): New function: free a job token. If we don't
|
||||
have one, no-op. If we have the personal token, reclaim it. If
|
||||
we have another token, write it back to the pipe.
|
||||
(reap_children): Call free_job_token.
|
||||
(free_child): Call free_job_token.
|
||||
(start_job_command): Remove duplicate test for '+' in the command.
|
||||
If we don't appear to be running a recursive make, close the
|
||||
jobserver filedescriptors.
|
||||
(start_waiting_job): If our personal token is available, use that
|
||||
instead of going to the server pipe.
|
||||
(*): Add the token value to many debugging statements, and print
|
||||
the child target name in addition to the ptr hex value.
|
||||
Change the default "no token" value from '\0' to '-' so it looks
|
||||
better in the output.
|
||||
|
||||
* main.c (main): Install the child_handler with sigaction()
|
||||
instead of signal() if we have it. On SysV systems, signal() uses
|
||||
SysV semantics which are a pain. But sigaction() always does what
|
||||
we want.
|
||||
(main): If we got job server FDs from the environment, test them
|
||||
to see if they're open. If not, the parent make closed them
|
||||
because it didn't think we were a submake. Print a warning and
|
||||
suggestion to use "+" on the submake invocation, and hard-set to
|
||||
-j1 for this instance of make.
|
||||
(main): Change the algorithm for assigning slots to be more
|
||||
robust. Previously make checked to see if it thought a subprocess
|
||||
was a submake and if so, didn't give it a token. Since make's
|
||||
don't consume tokens we could spawn many of makes fighting for a
|
||||
small number of tokens. Plus this is unreliable because submakes
|
||||
might not be recognized by the parent (see above) then all the
|
||||
tokens could be used up by unrecognized makes, and no one could
|
||||
run. Now every make consumes a token from its parent. However,
|
||||
the make can also use this token to spawn a child. If the make
|
||||
wants more than one, it goes to the jobserver pipe. Thus there
|
||||
will never be more than N makes running for -jN, and N*2 processes
|
||||
(N makes and their N children). Every make can always run at
|
||||
least one job, and we'll never deadlock. (Note the closing of the
|
||||
pipe for non-submakes also solves this, but this is still a better
|
||||
algorithm.) So! Only put N-1 tokens into the pipe, since the
|
||||
topmost make keeps one for itself.
|
||||
|
||||
* configure.in: Find sigaction. Disable job server support unless
|
||||
the system provides it, in addition to either waitpid() or
|
||||
wait3().
|
||||
|
||||
1999-07-22 Rob Tulloh <rob_tulloh@dev.tivoli.com>
|
||||
|
||||
* arscan.c (ar_member_touch) [WINDOWS32]: The ar_date field is a
|
||||
string on Windows, not a timestamp.
|
||||
|
||||
1999-07-21 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* Version 3.77.90 released.
|
||||
@@ -111,21 +243,24 @@
|
||||
already have one; if we're waiting on the load to go down
|
||||
start_waiting_job() might get called twice on the same file.
|
||||
|
||||
* remake.c (update_goal_chain): If we try to update a goal and it
|
||||
doesn't complete (e.g., parallel builds) remember that by setting
|
||||
the `deferred' flag in the goal structure. Later when we're
|
||||
determining the return value we consider a goal updated if either
|
||||
the mtime has changed _or_ this flag was set. We need this
|
||||
because the mtime doesn't change during the update_file() function
|
||||
if we started a job running; instead it's set during the
|
||||
reap_children() call. So, the code doesn't know it was updated
|
||||
and returns a status of -1 (nothing done). This is OK during
|
||||
"normal" builds since our caller (main) treats these cases
|
||||
identically in that case, but if you're building makefiles the
|
||||
difference is very important (whether we re-exec or not).
|
||||
|
||||
* dep.h: Add a `deferred' flag to track whether a goal was run but
|
||||
not completed (parallel builds).
|
||||
* filedef.h (struct file): Add new field, mtime_before_update.
|
||||
When notice_finished_file runs it assigns the cached last_mtime to
|
||||
this field.
|
||||
* remake.c (update_goal_chain): Notice that a file wasn't updated
|
||||
by asking if it changed (g->changed) and comparing the current
|
||||
cached time (last_mtime) with the previous one, stored in
|
||||
mtime_before_update. The previous check ("did last_mtime changed
|
||||
during the run of update_file?") fails for parallel builds because
|
||||
last_mtime is set during reap_children, before update_file is run.
|
||||
This causes update_goal_chain to always return -1 (nothing
|
||||
rebuilt) when running parallel (-jN). This is OK during "normal"
|
||||
builds since our caller (main) treats these cases identically in
|
||||
that case, but if when rebuilding makefiles the difference is very
|
||||
important, as it controls whether we re-exec or not.
|
||||
* file.c (file_hash_enter): Copy the mtime_before_update field.
|
||||
(snap_deps): Initialize mtime_before_update to -1.
|
||||
* main.c (main): Initialize mtime_before_update on old (-o) and
|
||||
new (-W) files.
|
||||
|
||||
1999-07-08 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# -*-Makefile-*- template for DJGPP
|
||||
# Makefile.in generated automatically by automake 1.2 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995-1998, 1999 Free Software Foundation, Inc.
|
||||
# This Makefile.DOS is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy, distribute and modify it.
|
||||
|
||||
@@ -118,7 +118,11 @@ HEADERS = $(wildcard $(srcdir)/*.h)
|
||||
default: all
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .dvi .info .o .ps .texi .texinfo
|
||||
.SUFFIXES: .S .c .dvi .info .o .ps .s .texi .texinfo .txi
|
||||
|
||||
mostlyclean-hdr:
|
||||
|
||||
clean-hdr:
|
||||
|
||||
distclean-hdr:
|
||||
-rm -f config.h
|
||||
@@ -141,11 +145,17 @@ install-binPROGRAMS: $(bin_PROGRAMS)
|
||||
|
||||
uninstall-binPROGRAMS:
|
||||
$(NORMAL_UNINSTALL)
|
||||
list='$(bin_PROGRAMS)'; for p in $$list; do rm -f $(bindir)/`echo $$p|sed '$(transform)'`; done
|
||||
list='$(bin_PROGRAMS)'; for p in $$list; do rm -f $(bindir)/`echo $$p|sed '$(transform)'`.exe; done
|
||||
|
||||
.c.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
.s.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
.S.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
clean-noinstLIBRARIES:
|
||||
-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
|
||||
|
||||
@@ -155,7 +165,7 @@ mostlyclean-compile:
|
||||
clean-compile:
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
-rm -f *.tab.c *_tab.c
|
||||
|
||||
maintainer-clean-compile:
|
||||
|
||||
@@ -188,6 +198,12 @@ DVIPS = dvips
|
||||
.texinfo.dvi:
|
||||
TEXINPUTS="$(srcdir);$$TEXINPUTS" MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
|
||||
|
||||
.txi.info:
|
||||
$(MAKEINFO) $(srcdir)/$< -o ./$@
|
||||
|
||||
.txi.dvi:
|
||||
TEXINPUTS="$(srcdir);$$TEXINPUTS" MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
|
||||
|
||||
.dvi.ps:
|
||||
$(DVIPS) $< -o $@
|
||||
|
||||
@@ -208,7 +224,7 @@ dist-info: $(INFO_DEPS)
|
||||
for base in $(INFO_DEPS); do d=$(srcdir); for file in `cd $$d && eval echo $$base*`; do test -f $(distdir)/$$file || ln $$d/$$file $(distdir)/$$file 2> /dev/null || cp -p $$d/$$file $(distdir)/$$file; done; done
|
||||
|
||||
mostlyclean-aminfo:
|
||||
rm -f make.aux make.cp make.cps make.dvi make.fn make.fns make.ky make.kys make.ps make.log make.pg make.toc make.tp make.tps make.vr make.vrs make.op make.tr make.cv make.cn
|
||||
cd $(srcdir) && for i in $(INFO_DEPS) make.i; do rm -f `eval echo $$i*`; done
|
||||
|
||||
clean-aminfo:
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Builds with DJGPP v2 port of GNU C/C++ compiler and utilities.
|
||||
|
||||
New (since 3.74) DOS-specific features:
|
||||
|
||||
1. Supports long filenames when run from DOS box on Windows 95.
|
||||
1. Supports long filenames when run from DOS box on Windows 9x.
|
||||
|
||||
2. Supports both stock DOS COMMAND.COM and Unix-style shells
|
||||
(details in ``Notes'' below).
|
||||
@@ -48,9 +48,10 @@ To build:
|
||||
[Enter]. Otherwise, you need to supply the path to the source
|
||||
directory as an argument to the batch file, like this:
|
||||
|
||||
configure.bat c:/djgpp/gnu/make-%VERSION%
|
||||
c:\djgpp\gnu\make-%VERSION%\configure.bat c:/djgpp/gnu/make-%VERSION%
|
||||
|
||||
Note the forward slashes: you MUST use them here.
|
||||
Note the forward slashes in the source path argument: you MUST
|
||||
use them here.
|
||||
|
||||
3. If configure.bat doesn't find a working Make, it will suggest to
|
||||
use the `dosbuild.bat' batch file to build Make. Either do as it
|
||||
@@ -228,9 +229,9 @@ Notes:
|
||||
|
||||
4. Letter-case in filenames.
|
||||
|
||||
If you run Make on Windows 95, you should be aware of the
|
||||
If you run Make on Windows 9x, you should be aware of the
|
||||
letter-case issue. Make is internally case-sensitive, but all
|
||||
file operations are case-insensitive on Windows 95, so
|
||||
file operations are case-insensitive on Windows 9x, so
|
||||
e.g. files `FAQ', `faq' and `Faq' all refer to the same file, as
|
||||
far as Windows is concerned. The underlying DJGPP C library
|
||||
functions honor the letter-case of the filenames they get from
|
||||
@@ -240,8 +241,8 @@ Notes:
|
||||
converted to lower case are explained in the DJGPP libc docs,
|
||||
under the `_preserve_fncase' and `_lfn_gen_short_fname'
|
||||
functions, but as a thumb rule, any filename that is stored in
|
||||
upper case in the directory, is a legal DOS 8+3 filename and
|
||||
doesn't include characters illegal on MSDOS FAT filesystems,
|
||||
upper case in the directory, is a valid DOS 8+3 filename and
|
||||
doesn't include characters invalid on MSDOS FAT filesystems,
|
||||
will be automatically down-cased.) User reports that I have
|
||||
indicate that this default behavior is generally what you'd
|
||||
expect; however, your input is most welcome.
|
||||
|
||||
12
ar.c
12
ar.c
@@ -47,7 +47,7 @@ ar_name (name)
|
||||
return 0;
|
||||
|
||||
if (p[1] == '(' && end[-1] == ')')
|
||||
fatal (NILF, "attempt to use unsupported feature: `%s'", name);
|
||||
fatal (NILF, _("attempt to use unsupported feature: `%s'"), name);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -138,7 +138,7 @@ int
|
||||
ar_touch (name)
|
||||
char *name;
|
||||
{
|
||||
error (NILF, "touch archive member is not available on VMS");
|
||||
error (NILF, _("touch archive member is not available on VMS"));
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
@@ -170,24 +170,24 @@ ar_touch (name)
|
||||
switch (ar_member_touch (arname, memname))
|
||||
{
|
||||
case -1:
|
||||
error (NILF, "touch: Archive `%s' does not exist", arname);
|
||||
error (NILF, _("touch: Archive `%s' does not exist"), arname);
|
||||
break;
|
||||
case -2:
|
||||
error (NILF, "touch: `%s' is not a valid archive", arname);
|
||||
error (NILF, _("touch: `%s' is not a valid archive"), arname);
|
||||
break;
|
||||
case -3:
|
||||
perror_with_name ("touch: ", arname);
|
||||
break;
|
||||
case 1:
|
||||
error (NILF,
|
||||
"touch: Member `%s' does not exist in `%s'", memname, arname);
|
||||
_("touch: Member `%s' does not exist in `%s'"), memname, arname);
|
||||
break;
|
||||
case 0:
|
||||
val = 0;
|
||||
break;
|
||||
default:
|
||||
error (NILF,
|
||||
"touch: Bad return code from ar_member_touch on `%s'", name);
|
||||
_("touch: Bad return code from ar_member_touch on `%s'"), name);
|
||||
}
|
||||
|
||||
if (!arname_used)
|
||||
|
||||
23
arscan.c
23
arscan.c
@@ -70,7 +70,7 @@ VMS_get_member_info (module, rfa)
|
||||
&bufdesc.dsc$w_length, 0);
|
||||
if (! status)
|
||||
{
|
||||
error (NILF, "lbr$set_module failed to extract module info, status = %d",
|
||||
error (NILF, _("lbr$set_module failed to extract module info, status = %d"),
|
||||
status);
|
||||
|
||||
lbr$close (&VMS_lib_idx);
|
||||
@@ -152,7 +152,7 @@ ar_scan (archive, function, arg)
|
||||
|
||||
if (! status)
|
||||
{
|
||||
error (NILF, "lbr$ini_control failed with status = %d",status);
|
||||
error (NILF, _("lbr$ini_control failed with status = %d"),status);
|
||||
return -2;
|
||||
}
|
||||
|
||||
@@ -163,7 +163,7 @@ ar_scan (archive, function, arg)
|
||||
|
||||
if (! status)
|
||||
{
|
||||
error (NILF, "unable to open library `%s' to lookup member `%s'",
|
||||
error (NILF, _("unable to open library `%s' to lookup member `%s'"),
|
||||
archive, (char *)arg);
|
||||
return -1;
|
||||
}
|
||||
@@ -775,12 +775,9 @@ ar_member_touch (arname, memname)
|
||||
if (AR_HDR_SIZE != write (fd, (char *) &ar_hdr, AR_HDR_SIZE))
|
||||
goto lose;
|
||||
/* The file's mtime is the time we we want. */
|
||||
#ifdef EINTR
|
||||
while (fstat (fd, &statbuf) < 0 && errno == EINTR);
|
||||
#else
|
||||
fstat (fd, &statbuf);
|
||||
#endif
|
||||
#if defined(ARFMAG) || defined(ARFZMAG) || defined(AIAMAG)
|
||||
while (fstat (fd, &statbuf) < 0 && EINTR_SET)
|
||||
;
|
||||
#if defined(ARFMAG) || defined(ARFZMAG) || defined(AIAMAG) || defined(WINDOWS32)
|
||||
/* Advance member's time to that time */
|
||||
for (i = 0; i < sizeof ar_hdr.ar_date; i++)
|
||||
ar_hdr.ar_date[i] = ' ';
|
||||
@@ -820,11 +817,11 @@ describe_member (desc, name, truncated,
|
||||
{
|
||||
extern char *ctime ();
|
||||
|
||||
printf ("Member `%s'%s: %ld bytes at %ld (%ld).\n",
|
||||
name, truncated ? " (name might be truncated)" : "",
|
||||
printf (_("Member `%s'%s: %ld bytes at %ld (%ld).\n"),
|
||||
name, truncated ? _(" (name might be truncated)") : "",
|
||||
size, hdrpos, datapos);
|
||||
printf (" Date %s", ctime (&date));
|
||||
printf (" uid = %d, gid = %d, mode = 0%o.\n", uid, gid, mode);
|
||||
printf (_(" Date %s"), ctime (&date));
|
||||
printf (_(" uid = %d, gid = %d, mode = 0%o.\n"), uid, gid, mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
16
commands.c
16
commands.c
@@ -386,7 +386,7 @@ fatal_error_signal (sig)
|
||||
#ifdef _AMIGA
|
||||
remove_intermediates (1);
|
||||
if (sig == SIGINT)
|
||||
fputs ("*** Break.\n", stderr);
|
||||
fputs (_("*** Break.\n"), stderr);
|
||||
|
||||
exit (10);
|
||||
#else /* not Amiga */
|
||||
@@ -478,10 +478,10 @@ delete_target (file, on_behalf_of)
|
||||
if (ar_member_date (file->name) != FILE_TIMESTAMP_S (file->last_mtime))
|
||||
{
|
||||
if (on_behalf_of)
|
||||
error (NILF, "*** [%s] Archive member `%s' may be bogus; not deleted",
|
||||
error (NILF, _("*** [%s] Archive member `%s' may be bogus; not deleted"),
|
||||
on_behalf_of, file->name);
|
||||
else
|
||||
error (NILF, "*** Archive member `%s' may be bogus; not deleted",
|
||||
error (NILF, _("*** Archive member `%s' may be bogus; not deleted"),
|
||||
file->name);
|
||||
}
|
||||
return;
|
||||
@@ -493,9 +493,9 @@ delete_target (file, on_behalf_of)
|
||||
&& FILE_TIMESTAMP_STAT_MODTIME (st) != file->last_mtime)
|
||||
{
|
||||
if (on_behalf_of)
|
||||
error (NILF, "*** [%s] Deleting file `%s'", on_behalf_of, file->name);
|
||||
error (NILF, _("*** [%s] Deleting file `%s'"), on_behalf_of, file->name);
|
||||
else
|
||||
error (NILF, "*** Deleting file `%s'", file->name);
|
||||
error (NILF, _("*** Deleting file `%s'"), file->name);
|
||||
if (unlink (file->name) < 0
|
||||
&& errno != ENOENT) /* It disappeared; so what. */
|
||||
perror_with_name ("unlink: ", file->name);
|
||||
@@ -533,12 +533,12 @@ print_commands (cmds)
|
||||
{
|
||||
register char *s;
|
||||
|
||||
fputs ("# commands to execute", stdout);
|
||||
fputs (_("# commands to execute"), stdout);
|
||||
|
||||
if (cmds->fileinfo.filenm == 0)
|
||||
puts (" (built-in):");
|
||||
puts (_(" (built-in):"));
|
||||
else
|
||||
printf (" (from `%s', line %lu):\n",
|
||||
printf (_(" (from `%s', line %lu):\n"),
|
||||
cmds->fileinfo.filenm, cmds->fileinfo.lineno);
|
||||
|
||||
s = cmds->commands;
|
||||
|
||||
@@ -33,3 +33,17 @@
|
||||
#define HAVE_MEMMOVE 1
|
||||
|
||||
#define SCCS_GET "get"
|
||||
|
||||
/* Define to `unsigned long' or `unsigned long long'
|
||||
if <inttypes.h> doesn't define. */
|
||||
#define uintmax_t unsigned long long
|
||||
|
||||
/* Define the type of the first arg to select(). */
|
||||
#define fd_set_size_t int
|
||||
|
||||
/* Define if you have the select function. */
|
||||
#define HAVE_SELECT 1
|
||||
|
||||
/* Define if you have the vprintf library function. */
|
||||
#undef HAVE_VPRINTF
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
52
configure.in
52
configure.in
@@ -3,7 +3,7 @@ AC_REVISION([$Id$])
|
||||
AC_PREREQ(2.13)dnl dnl Minimum Autoconf version required.
|
||||
AC_INIT(vpath.c)dnl dnl A distinctive file to look for in srcdir.
|
||||
|
||||
AM_INIT_AUTOMAKE(make, 3.77.90)
|
||||
AM_INIT_AUTOMAKE(make, 3.77.92)
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Regular configure stuff
|
||||
@@ -56,8 +56,9 @@ AC_MSG_RESULT($ac_cv_check_symbol_$1)])dnl
|
||||
AC_CHECK_LIB(posix4, clock_gettime)
|
||||
|
||||
AC_CHECK_FUNCS(memmove strdup psignal mktemp pstat_getdynamic \
|
||||
clock_gettime dup2 getcwd sigsetmask getgroups setlinebuf \
|
||||
seteuid setegid setreuid setregid strerror strsignal pipe)
|
||||
clock_gettime dup2 getcwd sigsetmask sigaction getgroups \
|
||||
setlinebuf seteuid setegid setreuid setregid pipe \
|
||||
strerror strsignal)
|
||||
AC_CHECK_SYMBOL(sys_siglist)
|
||||
AC_FUNC_ALLOCA
|
||||
AC_FUNC_VFORK
|
||||
@@ -129,11 +130,16 @@ dnl See if we can handle the job server feature, and if the user wants it.
|
||||
|
||||
AC_ARG_ENABLE(job-server,
|
||||
[ --disable-job-server Disallow recursive make communication during -jN],
|
||||
[make_cv_job_server="$enableval"],
|
||||
[make_cv_job_server="$enableval" user_job_server="$enableval"],
|
||||
[make_cv_job_server="yes"])
|
||||
|
||||
case "$ac_cv_func_pipe $make_cv_job_server" in
|
||||
"yes yes") AC_DEFINE(MAKE_JOBSERVER) ;;
|
||||
has_wait_nohang=yes
|
||||
case "$ac_cv_func_waitpid/$ac_cv_func_wait3" in
|
||||
no/no) has_wait_nohang=no ;;
|
||||
esac
|
||||
|
||||
case "$ac_cv_func_pipe/$ac_cv_func_sigaction/$has_wait_nohang/$make_cv_job_server" in
|
||||
yes/yes/yes/yes) AC_DEFINE(MAKE_JOBSERVER) ;;
|
||||
esac
|
||||
|
||||
dnl Allow building with dmalloc
|
||||
@@ -206,12 +212,14 @@ if test -r $srcdir/maintMakefile; then
|
||||
fi
|
||||
AC_SUBST_FILE(MAINT_MAKEFILE)
|
||||
|
||||
dnl build.sh is also an AC_OUTPUT, but we can't specify it here because
|
||||
dnl it's built from build.template and autoconf will crap out. So, we
|
||||
dnl build it in the makefiles themselves.
|
||||
|
||||
AC_OUTPUT(build.sh Makefile glob/Makefile)
|
||||
|
||||
dnl If we don't yet have build.sh.in, build.sh is a bogus 0-length file
|
||||
dnl so remove it.
|
||||
|
||||
test -f build.sh.in || rm -f build.sh
|
||||
|
||||
|
||||
case "$make_badcust" in
|
||||
yes) echo
|
||||
echo "WARNING: --with-customs specified but no customs.h could be found;"
|
||||
@@ -232,13 +240,23 @@ case "$with_customs" in
|
||||
fi ;;
|
||||
esac
|
||||
|
||||
case "$ac_cv_func_waitpid/$ac_cv_func_wait3" in
|
||||
no/no) echo
|
||||
echo "WARNING: Your system has neither waitpid() nor wait3()."
|
||||
echo " Without one of these, signal handling is unreliable."
|
||||
echo " You should be aware that running GNU make with -j"
|
||||
echo " could result in erratic behavior."
|
||||
echo ;;
|
||||
case "$has_wait_nohang" in
|
||||
no) echo
|
||||
echo "WARNING: Your system has neither waitpid() nor wait3()."
|
||||
echo " Without one of these, signal handling is unreliable."
|
||||
echo " You should be aware that running GNU make with -j"
|
||||
echo " could result in erratic behavior."
|
||||
echo ;;
|
||||
esac
|
||||
|
||||
case "$make_cv_job_server/$user_job_server" in
|
||||
no/yes) echo
|
||||
echo "WARNING: Make job server requires a POSIX-ish system that"
|
||||
echo " supports the pipe(), sigaction(), and either"
|
||||
echo " waitpid() or wait3() functions. Your system doesn't"
|
||||
echo " appear to provide one or more of those."
|
||||
echo " Disabling job server support."
|
||||
echo ;;
|
||||
esac
|
||||
|
||||
dnl Local Variables:
|
||||
|
||||
34
dir.c
34
dir.c
@@ -884,7 +884,7 @@ print_dir_data_base ()
|
||||
register unsigned int i, dirs, files, impossible;
|
||||
register struct directory *dir;
|
||||
|
||||
puts ("\n# Directories\n");
|
||||
puts (_("\n# Directories\n"));
|
||||
|
||||
dirs = files = impossible = 0;
|
||||
for (i = 0; i < DIRECTORY_BUCKETS; ++i)
|
||||
@@ -892,19 +892,19 @@ print_dir_data_base ()
|
||||
{
|
||||
++dirs;
|
||||
if (dir->contents == 0)
|
||||
printf ("# %s: could not be stat'd.\n", dir->name);
|
||||
printf (_("# %s: could not be stat'd.\n"), dir->name);
|
||||
else if (dir->contents->files == 0)
|
||||
#ifdef WINDOWS32
|
||||
printf ("# %s (key %s, mtime %d): could not be opened.\n",
|
||||
printf (_("# %s (key %s, mtime %d): could not be opened.\n"),
|
||||
dir->name, dir->contents->path_key,dir->contents->mtime);
|
||||
#else /* WINDOWS32 */
|
||||
#ifdef VMS
|
||||
printf ("# %s (device %d, inode [%d,%d,%d]): could not be opened.\n",
|
||||
printf (_("# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"),
|
||||
dir->name, dir->contents->dev,
|
||||
dir->contents->ino[0], dir->contents->ino[1],
|
||||
dir->contents->ino[2]);
|
||||
#else
|
||||
printf ("# %s (device %ld, inode %ld): could not be opened.\n",
|
||||
printf (_("# %s (device %ld, inode %ld): could not be opened.\n"),
|
||||
dir->name, (long int) dir->contents->dev,
|
||||
(long int) dir->contents->ino);
|
||||
#endif
|
||||
@@ -921,34 +921,34 @@ print_dir_data_base ()
|
||||
else
|
||||
++f;
|
||||
#ifdef WINDOWS32
|
||||
printf ("# %s (key %s, mtime %d): ",
|
||||
printf (_("# %s (key %s, mtime %d): "),
|
||||
dir->name, dir->contents->path_key, dir->contents->mtime);
|
||||
#else /* WINDOWS32 */
|
||||
#ifdef VMS
|
||||
printf ("# %s (device %d, inode [%d,%d,%d]): ",
|
||||
printf (_("# %s (device %d, inode [%d,%d,%d]): "),
|
||||
dir->name, dir->contents->dev,
|
||||
dir->contents->ino[0], dir->contents->ino[1],
|
||||
dir->contents->ino[2]);
|
||||
#else
|
||||
printf ("# %s (device %ld, inode %ld): ",
|
||||
printf (_("# %s (device %ld, inode %ld): "),
|
||||
dir->name,
|
||||
(long)dir->contents->dev, (long)dir->contents->ino);
|
||||
#endif
|
||||
#endif /* WINDOWS32 */
|
||||
if (f == 0)
|
||||
fputs ("No", stdout);
|
||||
fputs (_("No"), stdout);
|
||||
else
|
||||
printf ("%u", f);
|
||||
fputs (" files, ", stdout);
|
||||
fputs (_(" files, "), stdout);
|
||||
if (im == 0)
|
||||
fputs ("no", stdout);
|
||||
fputs (_("no"), stdout);
|
||||
else
|
||||
printf ("%u", im);
|
||||
fputs (" impossibilities", stdout);
|
||||
fputs (_(" impossibilities"), stdout);
|
||||
if (dir->contents->dirstream == 0)
|
||||
puts (".");
|
||||
else
|
||||
puts (" so far.");
|
||||
puts (_(" so far."));
|
||||
files += f;
|
||||
impossible += im;
|
||||
}
|
||||
@@ -956,15 +956,15 @@ print_dir_data_base ()
|
||||
|
||||
fputs ("\n# ", stdout);
|
||||
if (files == 0)
|
||||
fputs ("No", stdout);
|
||||
fputs (_("No"), stdout);
|
||||
else
|
||||
printf ("%u", files);
|
||||
fputs (" files, ", stdout);
|
||||
fputs (_(" files, "), stdout);
|
||||
if (impossible == 0)
|
||||
fputs ("no", stdout);
|
||||
fputs (_("no"), stdout);
|
||||
else
|
||||
printf ("%u", impossible);
|
||||
printf (" impossibilities in %u directories.\n", dirs);
|
||||
printf (_(" impossibilities in %u directories.\n"), dirs);
|
||||
}
|
||||
|
||||
/* Hooks for globbing. */
|
||||
|
||||
7
expand.c
7
expand.c
@@ -98,7 +98,8 @@ recursively_expand (v)
|
||||
if (v->expanding)
|
||||
/* Expanding V causes infinite recursion. Lose. */
|
||||
fatal (reading_file,
|
||||
"Recursive variable `%s' references itself (eventually)", v->name);
|
||||
_("Recursive variable `%s' references itself (eventually)"),
|
||||
v->name);
|
||||
|
||||
v->expanding = 1;
|
||||
value = allocated_variable_expand (v->value);
|
||||
@@ -119,7 +120,7 @@ warn_undefined (name, length)
|
||||
{
|
||||
if (warn_undefined_variables_flag)
|
||||
error (reading_file,
|
||||
"warning: undefined variable `%.*s'", (int)length, name);
|
||||
_("warning: undefined variable `%.*s'"), (int)length, name);
|
||||
}
|
||||
|
||||
/* Expand a simple reference to variable NAME, which is LENGTH chars long. */
|
||||
@@ -231,7 +232,7 @@ variable_expand_string (line, string, length)
|
||||
end = index (beg, closeparen);
|
||||
if (end == 0)
|
||||
/* Unterminated variable reference. */
|
||||
fatal (reading_file, "unterminated variable reference");
|
||||
fatal (reading_file, _("unterminated variable reference"));
|
||||
p1 = lindex (beg, end, '$');
|
||||
if (p1 != 0)
|
||||
{
|
||||
|
||||
74
file.c
74
file.c
@@ -301,22 +301,22 @@ file_hash_enter (file, name, oldhash, oldname)
|
||||
but give a message to let the user know what's going on. */
|
||||
if (oldfile->cmds->fileinfo.filenm != 0)
|
||||
error (&file->cmds->fileinfo,
|
||||
"Commands were specified for \
|
||||
file `%s' at %s:%lu,",
|
||||
_("Commands were specified for \
|
||||
file `%s' at %s:%lu,"),
|
||||
oldname, oldfile->cmds->fileinfo.filenm,
|
||||
oldfile->cmds->fileinfo.lineno);
|
||||
else
|
||||
error (&file->cmds->fileinfo,
|
||||
"Commands for file `%s' were found by \
|
||||
implicit rule search,",
|
||||
_("Commands for file `%s' were found by \
|
||||
implicit rule search,"),
|
||||
oldname);
|
||||
error (&file->cmds->fileinfo,
|
||||
"but `%s' is now considered the same file \
|
||||
as `%s'.",
|
||||
_("but `%s' is now considered the same file \
|
||||
as `%s'."),
|
||||
oldname, name);
|
||||
error (&file->cmds->fileinfo,
|
||||
"Commands for `%s' will be ignored \
|
||||
in favor of those for `%s'.",
|
||||
_("Commands for `%s' will be ignored \
|
||||
in favor of those for `%s'."),
|
||||
name, oldname);
|
||||
}
|
||||
}
|
||||
@@ -336,12 +336,12 @@ in favor of those for `%s'.",
|
||||
merge_variable_set_lists (&oldfile->variables, file->variables);
|
||||
|
||||
if (oldfile->double_colon && file->is_target && !file->double_colon)
|
||||
fatal (NILF, "can't rename single-colon `%s' to double-colon `%s'",
|
||||
fatal (NILF, _("can't rename single-colon `%s' to double-colon `%s'"),
|
||||
oldname, name);
|
||||
if (!oldfile->double_colon && file->double_colon)
|
||||
{
|
||||
if (oldfile->is_target)
|
||||
fatal (NILF, "can't rename double-colon `%s' to single-colon `%s'",
|
||||
fatal (NILF, _("can't rename double-colon `%s' to single-colon `%s'"),
|
||||
oldname, name);
|
||||
else
|
||||
oldfile->double_colon = file->double_colon;
|
||||
@@ -408,7 +408,7 @@ remove_intermediates (sig)
|
||||
if (!f->dontcare)
|
||||
{
|
||||
if (sig)
|
||||
error (NILF, "*** Deleting intermediate file `%s'", f->name);
|
||||
error (NILF, _("*** Deleting intermediate file `%s'"), f->name);
|
||||
else if (!silent_flag)
|
||||
{
|
||||
if (! doneany)
|
||||
@@ -612,7 +612,7 @@ print_file (f)
|
||||
|
||||
putchar ('\n');
|
||||
if (!f->is_target)
|
||||
puts ("# Not a target:");
|
||||
puts (_("# Not a target:"));
|
||||
printf ("%s:%s", f->name, f->double_colon ? ":" : "");
|
||||
|
||||
for (d = f->deps; d != 0; d = d->next)
|
||||
@@ -620,45 +620,45 @@ print_file (f)
|
||||
putchar ('\n');
|
||||
|
||||
if (f->precious)
|
||||
puts ("# Precious file (dependency of .PRECIOUS).");
|
||||
puts (_("# Precious file (dependency of .PRECIOUS)."));
|
||||
if (f->phony)
|
||||
puts ("# Phony target (dependency of .PHONY).");
|
||||
puts (_("# Phony target (dependency of .PHONY)."));
|
||||
if (f->cmd_target)
|
||||
puts ("# Command-line target.");
|
||||
puts (_("# Command-line target."));
|
||||
if (f->dontcare)
|
||||
puts ("# A default or MAKEFILES makefile.");
|
||||
printf ("# Implicit rule search has%s been done.\n",
|
||||
f->tried_implicit ? "" : " not");
|
||||
puts (_("# A default or MAKEFILES makefile."));
|
||||
printf (_("# Implicit rule search has%s been done.\n"),
|
||||
f->tried_implicit ? "" : _(" not"));
|
||||
if (f->stem != 0)
|
||||
printf ("# Implicit/static pattern stem: `%s'\n", f->stem);
|
||||
printf (_("# Implicit/static pattern stem: `%s'\n"), f->stem);
|
||||
if (f->intermediate)
|
||||
puts ("# File is an intermediate dependency.");
|
||||
puts (_("# File is an intermediate dependency."));
|
||||
if (f->also_make != 0)
|
||||
{
|
||||
fputs ("# Also makes:", stdout);
|
||||
fputs (_("# Also makes:"), stdout);
|
||||
for (d = f->also_make; d != 0; d = d->next)
|
||||
printf (" %s", dep_name (d));
|
||||
putchar ('\n');
|
||||
}
|
||||
if (f->last_mtime == 0)
|
||||
puts ("# Modification time never checked.");
|
||||
puts (_("# Modification time never checked."));
|
||||
else if (f->last_mtime == (FILE_TIMESTAMP) -1)
|
||||
puts ("# File does not exist.");
|
||||
puts (_("# File does not exist."));
|
||||
else
|
||||
{
|
||||
char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1];
|
||||
file_timestamp_sprintf (buf, f->last_mtime);
|
||||
printf ("# Last modified %s\n", buf);
|
||||
printf (_("# Last modified %s\n"), buf);
|
||||
}
|
||||
printf ("# File has%s been updated.\n",
|
||||
f->updated ? "" : " not");
|
||||
printf (_("# File has%s been updated.\n"),
|
||||
f->updated ? "" : _(" not"));
|
||||
switch (f->command_state)
|
||||
{
|
||||
case cs_running:
|
||||
puts ("# Commands currently running (THIS IS A BUG).");
|
||||
puts (_("# Commands currently running (THIS IS A BUG)."));
|
||||
break;
|
||||
case cs_deps_running:
|
||||
puts ("# Dependencies commands running (THIS IS A BUG).");
|
||||
puts (_("# Dependencies commands running (THIS IS A BUG)."));
|
||||
break;
|
||||
case cs_not_started:
|
||||
case cs_finished:
|
||||
@@ -667,24 +667,24 @@ print_file (f)
|
||||
case -1:
|
||||
break;
|
||||
case 0:
|
||||
puts ("# Successfully updated.");
|
||||
puts (_("# Successfully updated."));
|
||||
break;
|
||||
case 1:
|
||||
assert (question_flag);
|
||||
puts ("# Needs to be updated (-q is set).");
|
||||
puts (_("# Needs to be updated (-q is set)."));
|
||||
break;
|
||||
case 2:
|
||||
puts ("# Failed to be updated.");
|
||||
puts (_("# Failed to be updated."));
|
||||
break;
|
||||
default:
|
||||
puts ("# Invalid value in `update_status' member!");
|
||||
puts (_("# Invalid value in `update_status' member!"));
|
||||
fflush (stdout);
|
||||
fflush (stderr);
|
||||
abort ();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
puts ("# Invalid value in `command_state' member!");
|
||||
puts (_("# Invalid value in `command_state' member!"));
|
||||
fflush (stdout);
|
||||
fflush (stderr);
|
||||
abort ();
|
||||
@@ -703,7 +703,7 @@ print_file_data_base ()
|
||||
register unsigned int i, nfiles, per_bucket;
|
||||
register struct file *file;
|
||||
|
||||
puts ("\n# Files");
|
||||
puts (_("\n# Files"));
|
||||
|
||||
per_bucket = nfiles = 0;
|
||||
for (i = 0; i < FILE_BUCKETS; ++i)
|
||||
@@ -726,12 +726,12 @@ print_file_data_base ()
|
||||
}
|
||||
|
||||
if (nfiles == 0)
|
||||
puts ("\n# No files.");
|
||||
puts (_("\n# No files."));
|
||||
else
|
||||
{
|
||||
printf ("\n# %u files in %u hash buckets.\n", nfiles, FILE_BUCKETS);
|
||||
printf (_("\n# %u files in %u hash buckets.\n"), nfiles, FILE_BUCKETS);
|
||||
#ifndef NO_FLOAT
|
||||
printf ("# average %.3f files per bucket, max %u files in one bucket.\n",
|
||||
printf (_("# average %.3f files per bucket, max %u files in one bucket.\n"),
|
||||
((double) nfiles) / ((double) FILE_BUCKETS), per_bucket);
|
||||
#endif
|
||||
}
|
||||
|
||||
55
function.c
55
function.c
@@ -735,11 +735,11 @@ func_word(o, argv, funcname)
|
||||
char *p=0;
|
||||
|
||||
/* Check the first argument. */
|
||||
check_numeric (argv[0], "non-numeric first argument to `word' function");
|
||||
check_numeric (argv[0], _("non-numeric first argument to `word' function"));
|
||||
i = atoi (argv[0]);
|
||||
|
||||
if (i == 0)
|
||||
fatal (reading_file, "the `word' function takes a positive index argument");
|
||||
fatal (reading_file, _("the `word' function takes a positive index argument"));
|
||||
|
||||
|
||||
end_p = argv[1];
|
||||
@@ -764,10 +764,10 @@ func_wordlist (o, argv, funcname)
|
||||
|
||||
/* Check the first argument. */
|
||||
check_numeric (argv[0],
|
||||
"non-numeric first argument to `wordlist' function");
|
||||
_("non-numeric first argument to `wordlist' function"));
|
||||
i =atoi(argv[0]);
|
||||
check_numeric (argv[1],
|
||||
"non-numeric second argument to `wordlist' function");
|
||||
_("non-numeric second argument to `wordlist' function"));
|
||||
|
||||
j = atoi(argv[1]);
|
||||
|
||||
@@ -1156,7 +1156,7 @@ windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp)
|
||||
0,
|
||||
TRUE,
|
||||
DUPLICATE_SAME_ACCESS) == FALSE) {
|
||||
fatal (NILF, "create_child_process: DuplicateHandle(In) failed (e=%d)\n",
|
||||
fatal (NILF, _("create_child_process: DuplicateHandle(In) failed (e=%d)\n"),
|
||||
GetLastError());
|
||||
|
||||
}
|
||||
@@ -1167,19 +1167,19 @@ windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp)
|
||||
0,
|
||||
TRUE,
|
||||
DUPLICATE_SAME_ACCESS) == FALSE) {
|
||||
fatal (NILF, "create_child_process: DuplicateHandle(Err) failed (e=%d)\n",
|
||||
fatal (NILF, _("create_child_process: DuplicateHandle(Err) failed (e=%d)\n"),
|
||||
GetLastError());
|
||||
}
|
||||
|
||||
if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0))
|
||||
fatal (NILF, "CreatePipe() failed (e=%d)\n", GetLastError());
|
||||
fatal (NILF, _("CreatePipe() failed (e=%d)\n"), GetLastError());
|
||||
|
||||
|
||||
|
||||
hProcess = process_init_fd(hIn, hChildOutWr, hErr);
|
||||
|
||||
if (!hProcess)
|
||||
fatal (NILF, "windows32_openpipe (): process_init_fd() failed\n");
|
||||
fatal (NILF, _("windows32_openpipe (): process_init_fd() failed\n"));
|
||||
|
||||
else
|
||||
process_register(hProcess);
|
||||
@@ -1190,7 +1190,7 @@ windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp)
|
||||
if (!process_begin(hProcess, command_argv, envp, command_argv[0], NULL))
|
||||
*pid_p = (int) hProcess;
|
||||
else
|
||||
fatal (NILF, "windows32_openpipe (): unable to launch process (e=%d)\n",
|
||||
fatal (NILF, _("windows32_openpipe (): unable to launch process (e=%d)\n"),
|
||||
process_last_err(hProcess));
|
||||
|
||||
/* set up to read data from child */
|
||||
@@ -1203,15 +1203,11 @@ windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp)
|
||||
|
||||
|
||||
#ifdef __MSDOS__
|
||||
/*
|
||||
untested
|
||||
*/
|
||||
int
|
||||
msdos_openpipe (int* pipedes, int *pidp, char *text)
|
||||
{
|
||||
FILE *fpipe=0;
|
||||
/* MSDOS can't fork, but it has `popen'.
|
||||
(Bwt, why isn't `popen' used in all the versions?) */
|
||||
/* MSDOS can't fork, but it has `popen'. */
|
||||
struct variable *sh = lookup_variable ("SHELL", 5);
|
||||
int e;
|
||||
extern int dos_command_running, dos_status;
|
||||
@@ -1235,6 +1231,9 @@ msdos_openpipe (int* pipedes, int *pidp, char *text)
|
||||
errno = 0;
|
||||
dos_command_running = 1;
|
||||
dos_status = 0;
|
||||
/* If dos_status becomes non-zero, it means the child process
|
||||
was interrupted by a signal, like SIGINT or SIGQUIT. See
|
||||
fatal_error_signal in commands.c. */
|
||||
fpipe = popen (text, "rt");
|
||||
dos_command_running = 0;
|
||||
if (!fpipe || dos_status)
|
||||
@@ -1250,7 +1249,7 @@ msdos_openpipe (int* pipedes, int *pidp, char *text)
|
||||
else
|
||||
{
|
||||
pipedes[0] = fileno (fpipe);
|
||||
*pidp = 42; /* uh? The meaning of Life?*/
|
||||
*pidp = 42; /* Yes, the Meaning of Life, the Universe, and Everything! */
|
||||
errno = e;
|
||||
shell_function_completed = 1;
|
||||
}
|
||||
@@ -1308,11 +1307,9 @@ func_shell (o, argv, funcname)
|
||||
/* For error messages. */
|
||||
if (reading_file != 0)
|
||||
{
|
||||
error_prefix = (char *) alloca (strlen(reading_file->filenm)+100);
|
||||
|
||||
error_prefix = (char *) alloca (strlen(reading_file->filenm)+100);
|
||||
sprintf (error_prefix,
|
||||
"%s:%lu: ", reading_file->filenm, reading_file->lineno);
|
||||
|
||||
}
|
||||
else
|
||||
error_prefix = "";
|
||||
@@ -1322,11 +1319,11 @@ func_shell (o, argv, funcname)
|
||||
#else /* WINDOWS32 */
|
||||
|
||||
# ifdef __MSDOS__
|
||||
fpipe = msdos_openpipe (pipedes, argv[0], command_argv, envp);
|
||||
if (!fpipe || pipedes[0] < 0)
|
||||
fpipe = msdos_openpipe (pipedes, &pid, argv[0]);
|
||||
if (pipedes[0] < 0)
|
||||
{
|
||||
perror_with_name (error_prefix, "pipe");
|
||||
return o;
|
||||
perror_with_name (error_prefix, "pipe");
|
||||
return o;
|
||||
}
|
||||
# else
|
||||
if (pipe (pipedes) < 0)
|
||||
@@ -1384,11 +1381,7 @@ func_shell (o, argv, funcname)
|
||||
if (cc > 0)
|
||||
i += cc;
|
||||
}
|
||||
#ifdef EINTR
|
||||
while (cc > 0 || errno == EINTR);
|
||||
#else
|
||||
while (cc > 0);
|
||||
#endif
|
||||
while (cc > 0 || EINTR_SET);
|
||||
|
||||
/* Close the read side of the pipe. */
|
||||
#ifdef __MSDOS__
|
||||
@@ -1405,7 +1398,7 @@ func_shell (o, argv, funcname)
|
||||
|
||||
if (batch_filename) {
|
||||
if (debug_flag)
|
||||
printf("Cleaning up temporary batch file %s\n", batch_filename);
|
||||
printf(_("Cleaning up temporary batch file %s\n"), batch_filename);
|
||||
remove(batch_filename);
|
||||
free(batch_filename);
|
||||
}
|
||||
@@ -1676,11 +1669,11 @@ expand_builtin_function (o, argc, argv, entry_p)
|
||||
|
||||
if (argc < min)
|
||||
fatal (reading_file,
|
||||
"Insufficient number of arguments (%d) to function `%s'",
|
||||
_("Insufficient number of arguments (%d) to function `%s'"),
|
||||
argc, entry_p->name);
|
||||
|
||||
if (!entry_p->func_ptr)
|
||||
fatal (reading_file, "Unimplemented on this platform: function `%s'",
|
||||
fatal (reading_file, _("Unimplemented on this platform: function `%s'"),
|
||||
entry_p->name);
|
||||
|
||||
return entry_p->func_ptr (o, argv, entry_p->name);
|
||||
@@ -1736,7 +1729,7 @@ handle_function (op, stringp)
|
||||
|
||||
if (count >= 0)
|
||||
fatal (reading_file,
|
||||
"unterminated call to function `%s': missing `%c'",
|
||||
_("unterminated call to function `%s': missing `%c'"),
|
||||
entry_p->name, closeparen);
|
||||
|
||||
/* Get some memory to store the arg pointers. */
|
||||
|
||||
22
implicit.c
22
implicit.c
@@ -36,7 +36,7 @@ try_implicit_rule (file, depth)
|
||||
struct file *file;
|
||||
unsigned int depth;
|
||||
{
|
||||
DEBUGPR ("Looking for an implicit rule for `%s'.\n");
|
||||
DEBUGPR (_("Looking for an implicit rule for `%s'.\n"));
|
||||
|
||||
/* The order of these searches was previously reversed. My logic now is
|
||||
that since the non-archive search uses more information in the target
|
||||
@@ -51,7 +51,7 @@ try_implicit_rule (file, depth)
|
||||
archive member name to search for implicit rules. */
|
||||
if (ar_name (file->name))
|
||||
{
|
||||
DEBUGPR ("Looking for archive-member implicit rule for `%s'.\n");
|
||||
DEBUGPR (_("Looking for archive-member implicit rule for `%s'.\n"));
|
||||
if (pattern_search (file, 1, depth, 0))
|
||||
return 1;
|
||||
}
|
||||
@@ -199,7 +199,7 @@ pattern_search (file, archive, depth, recursions)
|
||||
don't use it here. */
|
||||
if (rule->in_use)
|
||||
{
|
||||
DEBUGP2 ("Avoiding implicit rule recursion.%s%s\n", "", "");
|
||||
DEBUGP2 (_("Avoiding implicit rule recursion.%s%s\n"), "", "");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -335,7 +335,7 @@ pattern_search (file, archive, depth, recursions)
|
||||
stemlen -= (lastslash - filename) + 1;
|
||||
}
|
||||
|
||||
DEBUGP2 ("Trying pattern rule with stem `%.*s'.\n",
|
||||
DEBUGP2 (_("Trying pattern rule with stem `%.*s'.\n"),
|
||||
(int) stemlen, stem);
|
||||
|
||||
/* Try each dependency; see if it "exists". */
|
||||
@@ -376,16 +376,16 @@ pattern_search (file, archive, depth, recursions)
|
||||
"impossible", then the rule fails and don't
|
||||
bother trying it on the second pass either
|
||||
since we know that will fail too. */
|
||||
DEBUGP2 ("Rejecting impossible %s dependency `%s'.\n",
|
||||
p == depname ? "implicit" : "rule", p);
|
||||
DEBUGP2 (_("Rejecting impossible %s dependency `%s'.\n"),
|
||||
p == depname ? _("implicit") : _("rule"), p);
|
||||
tryrules[i] = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
intermediate_files[deps_found] = 0;
|
||||
|
||||
DEBUGP2 ("Trying %s dependency `%s'.\n",
|
||||
p == depname ? "implicit" : "rule", p);
|
||||
DEBUGP2 (_("Trying %s dependency `%s'.\n"),
|
||||
p == depname ? _("implicit") : _("rule"), p);
|
||||
|
||||
/* The DEP->changed flag says that this dependency resides in a
|
||||
nonexistent directory. So we normally can skip looking for
|
||||
@@ -408,7 +408,7 @@ pattern_search (file, archive, depth, recursions)
|
||||
vp = p;
|
||||
if (vpath_search (&vp, (FILE_TIMESTAMP *) 0))
|
||||
{
|
||||
DEBUGP2 ("Found dependency `%s' as VPATH `%s'\n", p, vp);
|
||||
DEBUGP2 (_("Found dependency `%s' as VPATH `%s'\n"), p, vp);
|
||||
strcpy(vp, p);
|
||||
found_files[deps_found++] = vp;
|
||||
continue;
|
||||
@@ -424,8 +424,8 @@ pattern_search (file, archive, depth, recursions)
|
||||
intermediate_file
|
||||
= (struct file *) alloca (sizeof (struct file));
|
||||
|
||||
DEBUGP2 ("Looking for a rule with %s file `%s'.\n",
|
||||
"intermediate", p);
|
||||
DEBUGP2 (_("Looking for a rule with %s file `%s'.\n"),
|
||||
_("intermediate"), p);
|
||||
|
||||
bzero ((char *) intermediate_file, sizeof (struct file));
|
||||
intermediate_file->name = p;
|
||||
|
||||
574
job.c
574
job.c
@@ -145,6 +145,17 @@ extern int wait ();
|
||||
|
||||
#endif /* Don't have `union wait'. */
|
||||
|
||||
/* How to set close-on-exec for a file descriptor. */
|
||||
|
||||
#if !defined F_SETFD
|
||||
# define CLOSE_ON_EXEC(_d)
|
||||
#else
|
||||
# ifndef FD_CLOEXEC
|
||||
# define FD_CLOEXEC 1
|
||||
# endif
|
||||
# define CLOSE_ON_EXEC(_d) (void) fcntl ((_d), F_SETFD, FD_CLOEXEC)
|
||||
#endif
|
||||
|
||||
#ifdef VMS
|
||||
static int vms_jobsefnmask = 0;
|
||||
#endif /* !VMS */
|
||||
@@ -191,6 +202,11 @@ unsigned int job_slots_used = 0;
|
||||
|
||||
static int good_stdin_used = 0;
|
||||
|
||||
/* Specifies whether the current process's reserved job token is in use.
|
||||
'+' means it's available, '-' means it isn't. */
|
||||
|
||||
static char my_job_token = '+';
|
||||
|
||||
/* Chain of children waiting to run until the load average goes down. */
|
||||
|
||||
static struct child *waiting_jobs = 0;
|
||||
@@ -198,6 +214,9 @@ static struct child *waiting_jobs = 0;
|
||||
/* Non-zero if we use a *real* shell (always so on Unix). */
|
||||
|
||||
int unixy_shell = 1;
|
||||
|
||||
/* #define debug_flag 1 */
|
||||
|
||||
|
||||
#ifdef WINDOWS32
|
||||
/*
|
||||
@@ -209,6 +228,36 @@ int w32_kill(int pid, int sig)
|
||||
}
|
||||
#endif /* WINDOWS32 */
|
||||
|
||||
|
||||
static void
|
||||
free_job_token (child)
|
||||
struct child *child;
|
||||
{
|
||||
switch (child->job_token)
|
||||
{
|
||||
case '-':
|
||||
/* If this child doesn't have a token, punt. */
|
||||
return;
|
||||
|
||||
case '+':
|
||||
/* If this child has the reserved token, take it back. */
|
||||
my_job_token = '+';
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Write any other job tokens back to the pipe. */
|
||||
write (job_fds[1], &child->job_token, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (debug_flag)
|
||||
printf (_("Released token `%c' for child 0x%08lx (%s).\n"),
|
||||
child->job_token, (unsigned long int) child, child->file->name);
|
||||
|
||||
child->job_token = '-';
|
||||
}
|
||||
|
||||
|
||||
/* Write an error message describing the exit status given in
|
||||
EXIT_CODE, EXIT_SIG, and COREDUMP, for the target TARGET_NAME.
|
||||
Append "(ignored)" if IGNORED is nonzero. */
|
||||
@@ -224,16 +273,16 @@ child_error (target_name, exit_code, exit_sig, coredump, ignored)
|
||||
|
||||
#ifdef VMS
|
||||
if (!(exit_code & 1))
|
||||
error (NILF, "*** [%s] Error 0x%x%s", target_name, exit_code, ((ignored)? " (ignored)" : ""));
|
||||
error (NILF, _("*** [%s] Error 0x%x%s"), target_name, exit_code, ((ignored)? _(" (ignored)") : ""));
|
||||
#else
|
||||
if (exit_sig == 0)
|
||||
error (NILF, ignored ? "[%s] Error %d (ignored)" :
|
||||
"*** [%s] Error %d",
|
||||
error (NILF, ignored ? _("[%s] Error %d (ignored)") :
|
||||
_("*** [%s] Error %d"),
|
||||
target_name, exit_code);
|
||||
else
|
||||
error (NILF, "*** [%s] %s%s",
|
||||
target_name, strsignal (exit_sig),
|
||||
coredump ? " (core dumped)" : "");
|
||||
coredump ? _(" (core dumped)") : "");
|
||||
#endif /* VMS */
|
||||
}
|
||||
|
||||
@@ -257,33 +306,48 @@ vmsWaitForChildren(int *status)
|
||||
#endif
|
||||
|
||||
|
||||
/* Count the number of dead children we have. If we can use wait3() or
|
||||
waitpid() then we'll never use this count: it's completely unnecessary.
|
||||
But we need the handler installed to interrupt the select() call for
|
||||
the jobs pipe, so we might as well keep it. */
|
||||
/* Handle a dead child. This handler may or may not ever be installed.
|
||||
|
||||
If we're using the jobserver blocking read, we need it. First, installing
|
||||
it ensures the read will interrupt on SIGCHLD. Second, we reset the
|
||||
blocking bit on the read side of the pipe to ensure we don't enter another
|
||||
blocking read without reaping all the dead children. In this case we
|
||||
don't need the dead_children count.
|
||||
|
||||
If we don't have either waitpid or wait3, then make is unreliable, but we
|
||||
use the dead_children count to reap children as best we can. */
|
||||
|
||||
static unsigned int dead_children = 0;
|
||||
|
||||
/* Notice that a child died.
|
||||
reap_children should be called when convenient. */
|
||||
RETSIGTYPE
|
||||
child_handler (sig)
|
||||
int sig;
|
||||
{
|
||||
++dead_children;
|
||||
|
||||
#ifdef HAVE_JOBSERVER
|
||||
if (job_fds[0] >= 0)
|
||||
{
|
||||
int fl = fcntl(job_fds[0], F_GETFL, 0);
|
||||
|
||||
if (fl >= 0)
|
||||
fcntl(job_fds[0], F_SETFL, fl | O_NONBLOCK);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (debug_flag)
|
||||
printf ("Got a SIGCHLD; %u unreaped children.\n", dead_children);
|
||||
printf (_("Got a SIGCHLD; %u unreaped children.\n"), dead_children);
|
||||
}
|
||||
|
||||
|
||||
extern int shell_function_pid, shell_function_completed;
|
||||
|
||||
/* Reap dead children, storing the returned status and the new command
|
||||
/* Reap all dead children, storing the returned status and the new command
|
||||
state (`cs_finished') in the `file' member of the `struct child' for the
|
||||
dead child, and removing the child from the chain. If BLOCK nonzero,
|
||||
reap at least one child, waiting for it to die if necessary. If ERR is
|
||||
nonzero, print an error message first. */
|
||||
dead child, and removing the child from the chain. In addition, if BLOCK
|
||||
nonzero, we block in this function until we've reaped at least one
|
||||
complete child, waiting for it to die if necessary. If ERR is nonzero,
|
||||
print an error message first. */
|
||||
|
||||
void
|
||||
reap_children (block, err)
|
||||
@@ -312,7 +376,7 @@ reap_children (block, err)
|
||||
{
|
||||
/* We might block for a while, so let the user know why. */
|
||||
fflush (stdout);
|
||||
error (NILF, "*** Waiting for unfinished jobs....");
|
||||
error (NILF, _("*** Waiting for unfinished jobs...."));
|
||||
}
|
||||
|
||||
/* We have one less dead child to reap. As noted in
|
||||
@@ -342,9 +406,10 @@ reap_children (block, err)
|
||||
any_remote |= c->remote;
|
||||
any_local |= ! c->remote;
|
||||
if (debug_flag)
|
||||
printf ("Live child 0x%08lx PID %ld%s\n",
|
||||
(unsigned long int) c,
|
||||
(long) c->pid, c->remote ? " (remote)" : "");
|
||||
printf (_("Live child 0x%08lx (%s) PID %ld token %c%s\n"),
|
||||
(unsigned long int) c, c->file->name,
|
||||
(long) c->pid, c->job_token,
|
||||
c->remote ? _(" (remote)") : "");
|
||||
#ifdef VMS
|
||||
break;
|
||||
#endif
|
||||
@@ -363,19 +428,18 @@ reap_children (block, err)
|
||||
{
|
||||
/* A remote status command failed miserably. Punt. */
|
||||
remote_status_lose:
|
||||
#ifdef EINTR
|
||||
if (errno == EINTR)
|
||||
if (EINTR_SET)
|
||||
continue;
|
||||
#endif
|
||||
|
||||
pfatal_with_name ("remote_status");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No remote children. Check for local children. */
|
||||
|
||||
#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32)
|
||||
if (any_local)
|
||||
{
|
||||
local_wait:
|
||||
#ifdef VMS
|
||||
vmsWaitForChildren (&status);
|
||||
pid = c->pid;
|
||||
@@ -394,15 +458,14 @@ reap_children (block, err)
|
||||
if (pid < 0)
|
||||
{
|
||||
/* The wait*() failed miserably. Punt. */
|
||||
#ifdef EINTR
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
#endif
|
||||
if (EINTR_SET)
|
||||
goto local_wait;
|
||||
|
||||
pfatal_with_name ("wait");
|
||||
}
|
||||
else if (pid > 0)
|
||||
{
|
||||
/* We got one; chop the status word up. */
|
||||
/* We got a child exit; chop the status word up. */
|
||||
exit_code = WEXITSTATUS (status);
|
||||
exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0;
|
||||
coredump = WCOREDUMP (status);
|
||||
@@ -499,162 +562,150 @@ reap_children (block, err)
|
||||
break;
|
||||
|
||||
if (c == 0)
|
||||
{
|
||||
/* An unknown child died.
|
||||
Ignore it; it was inherited from our invoker. */
|
||||
continue;
|
||||
}
|
||||
/* An unknown child died.
|
||||
Ignore it; it was inherited from our invoker. */
|
||||
continue;
|
||||
|
||||
if (debug_flag)
|
||||
printf (_("Reaping %s child 0x%08lx PID %ld token %c%s\n"),
|
||||
child_failed ? _("losing") : _("winning"),
|
||||
(unsigned long int) c, (long) c->pid, c->job_token,
|
||||
c->remote ? _(" (remote)") : "");
|
||||
|
||||
if (c->sh_batch_file) {
|
||||
if (debug_flag)
|
||||
printf (_("Cleaning up temp batch file %s\n"), c->sh_batch_file);
|
||||
|
||||
/* just try and remove, don't care if this fails */
|
||||
remove (c->sh_batch_file);
|
||||
|
||||
/* all done with memory */
|
||||
free (c->sh_batch_file);
|
||||
c->sh_batch_file = NULL;
|
||||
}
|
||||
|
||||
/* If this child had the good stdin, say it is now free. */
|
||||
if (c->good_stdin)
|
||||
good_stdin_used = 0;
|
||||
|
||||
if (child_failed && !c->noerror && !ignore_errors_flag)
|
||||
{
|
||||
/* The commands failed. Write an error message,
|
||||
delete non-precious targets, and abort. */
|
||||
static int delete_on_error = -1;
|
||||
child_error (c->file->name, exit_code, exit_sig, coredump, 0);
|
||||
c->file->update_status = 2;
|
||||
if (delete_on_error == -1)
|
||||
{
|
||||
struct file *f = lookup_file (".DELETE_ON_ERROR");
|
||||
delete_on_error = f != 0 && f->is_target;
|
||||
}
|
||||
if (exit_sig != 0 || delete_on_error)
|
||||
delete_child_targets (c);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (debug_flag)
|
||||
printf ("Reaping %s child 0x%08lx PID %ld%s\n",
|
||||
child_failed ? "losing" : "winning",
|
||||
(unsigned long int) c,
|
||||
(long) c->pid, c->remote ? " (remote)" : "");
|
||||
{
|
||||
if (child_failed)
|
||||
{
|
||||
/* The commands failed, but we don't care. */
|
||||
child_error (c->file->name,
|
||||
exit_code, exit_sig, coredump, 1);
|
||||
child_failed = 0;
|
||||
}
|
||||
|
||||
if (c->sh_batch_file) {
|
||||
if (debug_flag)
|
||||
printf("Cleaning up temp batch file %s\n", c->sh_batch_file);
|
||||
/* If there are more commands to run, try to start them. */
|
||||
if (job_next_command (c))
|
||||
{
|
||||
if (handling_fatal_signal)
|
||||
{
|
||||
/* Never start new commands while we are dying.
|
||||
Since there are more commands that wanted to be run,
|
||||
the target was not completely remade. So we treat
|
||||
this as if a command had failed. */
|
||||
c->file->update_status = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Check again whether to start remotely.
|
||||
Whether or not we want to changes over time.
|
||||
Also, start_remote_job may need state set up
|
||||
by start_remote_job_p. */
|
||||
c->remote = start_remote_job_p (0);
|
||||
start_job_command (c);
|
||||
/* Fatal signals are left blocked in case we were
|
||||
about to put that child on the chain. But it is
|
||||
already there, so it is safe for a fatal signal to
|
||||
arrive now; it will clean up this child's targets. */
|
||||
unblock_sigs ();
|
||||
if (c->file->command_state == cs_running)
|
||||
/* We successfully started the new command.
|
||||
Loop to reap more children. */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* just try and remove, don't care if this fails */
|
||||
remove(c->sh_batch_file);
|
||||
if (c->file->update_status != 0)
|
||||
/* We failed to start the commands. */
|
||||
delete_child_targets (c);
|
||||
}
|
||||
else
|
||||
/* There are no more commands. We got through them all
|
||||
without an unignored error. Now the target has been
|
||||
successfully updated. */
|
||||
c->file->update_status = 0;
|
||||
}
|
||||
|
||||
/* all done with memory */
|
||||
free(c->sh_batch_file);
|
||||
c->sh_batch_file = NULL;
|
||||
}
|
||||
/* When we get here, all the commands for C->file are finished
|
||||
(or aborted) and C->file->update_status contains 0 or 2. But
|
||||
C->file->command_state is still cs_running if all the commands
|
||||
ran; notice_finish_file looks for cs_running to tell it that
|
||||
it's interesting to check the file's modtime again now. */
|
||||
|
||||
/* If this child had the good stdin, say it is now free. */
|
||||
if (c->good_stdin)
|
||||
good_stdin_used = 0;
|
||||
if (! handling_fatal_signal)
|
||||
/* Notice if the target of the commands has been changed.
|
||||
This also propagates its values for command_state and
|
||||
update_status to its also_make files. */
|
||||
notice_finished_file (c->file);
|
||||
|
||||
if (child_failed && !c->noerror && !ignore_errors_flag)
|
||||
{
|
||||
/* The commands failed. Write an error message,
|
||||
delete non-precious targets, and abort. */
|
||||
static int delete_on_error = -1;
|
||||
child_error (c->file->name, exit_code, exit_sig, coredump, 0);
|
||||
c->file->update_status = 2;
|
||||
if (delete_on_error == -1)
|
||||
{
|
||||
struct file *f = lookup_file (".DELETE_ON_ERROR");
|
||||
delete_on_error = f != 0 && f->is_target;
|
||||
}
|
||||
if (exit_sig != 0 || delete_on_error)
|
||||
delete_child_targets (c);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (child_failed)
|
||||
{
|
||||
/* The commands failed, but we don't care. */
|
||||
child_error (c->file->name,
|
||||
exit_code, exit_sig, coredump, 1);
|
||||
child_failed = 0;
|
||||
}
|
||||
if (debug_flag)
|
||||
printf (_("Removing child 0x%08lx PID %ld token %c%s from chain.\n"),
|
||||
(unsigned long int) c, (long) c->pid, c->job_token,
|
||||
c->remote ? _(" (remote)") : "");
|
||||
|
||||
/* If there are more commands to run, try to start them. */
|
||||
if (job_next_command (c))
|
||||
{
|
||||
if (handling_fatal_signal)
|
||||
{
|
||||
/* Never start new commands while we are dying.
|
||||
Since there are more commands that wanted to be run,
|
||||
the target was not completely remade. So we treat
|
||||
this as if a command had failed. */
|
||||
c->file->update_status = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Check again whether to start remotely.
|
||||
Whether or not we want to changes over time.
|
||||
Also, start_remote_job may need state set up
|
||||
by start_remote_job_p. */
|
||||
c->remote = start_remote_job_p (0);
|
||||
start_job_command (c);
|
||||
/* Fatal signals are left blocked in case we were
|
||||
about to put that child on the chain. But it is
|
||||
already there, so it is safe for a fatal signal to
|
||||
arrive now; it will clean up this child's targets. */
|
||||
unblock_sigs ();
|
||||
if (c->file->command_state == cs_running)
|
||||
/* We successfully started the new command.
|
||||
Loop to reap more children. */
|
||||
continue;
|
||||
}
|
||||
/* Block fatal signals while frobnicating the list, so that
|
||||
children and job_slots_used are always consistent. Otherwise
|
||||
a fatal signal arriving after the child is off the chain and
|
||||
before job_slots_used is decremented would believe a child was
|
||||
live and call reap_children again. */
|
||||
block_sigs ();
|
||||
|
||||
if (c->file->update_status != 0)
|
||||
/* We failed to start the commands. */
|
||||
delete_child_targets (c);
|
||||
}
|
||||
else
|
||||
/* There are no more commands. We got through them all
|
||||
without an unignored error. Now the target has been
|
||||
successfully updated. */
|
||||
c->file->update_status = 0;
|
||||
}
|
||||
/* If this job has a token out, return it. */
|
||||
free_job_token(c);
|
||||
|
||||
/* When we get here, all the commands for C->file are finished
|
||||
(or aborted) and C->file->update_status contains 0 or 2. But
|
||||
C->file->command_state is still cs_running if all the commands
|
||||
ran; notice_finish_file looks for cs_running to tell it that
|
||||
it's interesting to check the file's modtime again now. */
|
||||
/* There is now another slot open. */
|
||||
if (job_slots_used > 0)
|
||||
--job_slots_used;
|
||||
|
||||
if (! handling_fatal_signal)
|
||||
/* Notice if the target of the commands has been changed.
|
||||
This also propagates its values for command_state and
|
||||
update_status to its also_make files. */
|
||||
notice_finished_file (c->file);
|
||||
/* Remove the child from the chain and free it. */
|
||||
if (lastc == 0)
|
||||
children = c->next;
|
||||
else
|
||||
lastc->next = c->next;
|
||||
if (! handling_fatal_signal) /* Don't bother if about to die. */
|
||||
free_child (c);
|
||||
|
||||
if (debug_flag)
|
||||
printf ("Removing child 0x%08lx PID %ld%s from chain.\n",
|
||||
(unsigned long int) c,
|
||||
(long) c->pid, c->remote ? " (remote)" : "");
|
||||
unblock_sigs ();
|
||||
|
||||
/* Block fatal signals while frobnicating the list, so that
|
||||
children and job_slots_used are always consistent. Otherwise
|
||||
a fatal signal arriving after the child is off the chain and
|
||||
before job_slots_used is decremented would believe a child was
|
||||
live and call reap_children again. */
|
||||
block_sigs ();
|
||||
|
||||
#ifdef MAKE_JOBSERVER
|
||||
/* If this job has a token out, return it. */
|
||||
if (c->job_token)
|
||||
{
|
||||
assert(job_slots_used > 0);
|
||||
write (job_fds[1], &c->job_token, 1);
|
||||
if (debug_flag)
|
||||
printf ("Released token `%c' for child 0x%08lx.\n",
|
||||
c->job_token, (unsigned long int) c);
|
||||
c->job_token = 0;
|
||||
}
|
||||
#endif
|
||||
/* There is now another slot open. */
|
||||
if (job_slots_used > 0)
|
||||
--job_slots_used;
|
||||
|
||||
/* Remove the child from the chain and free it. */
|
||||
if (lastc == 0)
|
||||
children = c->next;
|
||||
else
|
||||
lastc->next = c->next;
|
||||
if (! handling_fatal_signal) /* Don't bother if about to die. */
|
||||
free_child (c);
|
||||
|
||||
unblock_sigs ();
|
||||
|
||||
/* If the job failed, and the -k flag was not given, die,
|
||||
unless we are already in the process of dying. */
|
||||
if (!err && child_failed && !keep_going_flag &&
|
||||
/* fatal_error_signal will die with the right signal. */
|
||||
!handling_fatal_signal)
|
||||
die (2);
|
||||
}
|
||||
/* If the job failed, and the -k flag was not given, die,
|
||||
unless we are already in the process of dying. */
|
||||
if (!err && child_failed && !keep_going_flag &&
|
||||
/* fatal_error_signal will die with the right signal. */
|
||||
!handling_fatal_signal)
|
||||
die (2);
|
||||
|
||||
/* Only block for one child. */
|
||||
block = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -680,18 +731,10 @@ free_child (child)
|
||||
free ((char *) child->environment);
|
||||
}
|
||||
|
||||
#ifdef MAKE_JOBSERVER
|
||||
/* If this child has a token it hasn't relinquished, give it up now.
|
||||
This can happen if the job completes immediately, mainly because
|
||||
all the command lines evaluated to empty strings. */
|
||||
if (child->job_token)
|
||||
{
|
||||
write (job_fds[1], &child->job_token, 1);
|
||||
if (debug_flag)
|
||||
printf ("Freed token `%c' for child 0x%08lx.\n",
|
||||
child->job_token, (unsigned long int) child);
|
||||
}
|
||||
#endif
|
||||
free_job_token(child);
|
||||
|
||||
free ((char *) child);
|
||||
}
|
||||
@@ -764,7 +807,7 @@ start_job_command (child)
|
||||
flags |= COMMANDS_RECURSE;
|
||||
else if (*p == '-')
|
||||
child->noerror = 1;
|
||||
else if (!isblank (*p) && *p != '+')
|
||||
else if (!isblank (*p))
|
||||
break;
|
||||
++p;
|
||||
}
|
||||
@@ -904,12 +947,7 @@ start_job_command (child)
|
||||
/* Set the descriptor to close on exec, so it does not litter any
|
||||
child's descriptor table. When it is dup2'd onto descriptor 0,
|
||||
that descriptor will not close on exec. */
|
||||
#ifdef F_SETFD
|
||||
#ifndef FD_CLOEXEC
|
||||
#define FD_CLOEXEC 1
|
||||
#endif
|
||||
(void) fcntl (bad_stdin, F_SETFD, FD_CLOEXEC);
|
||||
#endif
|
||||
CLOSE_ON_EXEC (bad_stdin);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -986,6 +1024,15 @@ start_job_command (child)
|
||||
{
|
||||
/* We are the child side. */
|
||||
unblock_sigs ();
|
||||
|
||||
/* If we aren't running a recursive command and we have a jobserver
|
||||
pipe, close it before exec'ing. */
|
||||
if (!(flags & COMMANDS_RECURSE) && job_fds[0] >= 0)
|
||||
{
|
||||
close (job_fds[0]);
|
||||
close (job_fds[1]);
|
||||
}
|
||||
|
||||
child_execute_job (child->good_stdin ? 0 : bad_stdin, 1,
|
||||
argv, child->environment);
|
||||
}
|
||||
@@ -1090,11 +1137,11 @@ start_job_command (child)
|
||||
int i;
|
||||
unblock_sigs();
|
||||
fprintf(stderr,
|
||||
"process_easy() failed failed to launch process (e=%d)\n",
|
||||
_("process_easy() failed failed to launch process (e=%d)\n"),
|
||||
process_last_err(hPID));
|
||||
for (i = 0; argv[i]; i++)
|
||||
fprintf(stderr, "%s ", argv[i]);
|
||||
fprintf(stderr, "\nCounted %d args in failed launch\n", i);
|
||||
fprintf(stderr, _("\nCounted %d args in failed launch\n"), i);
|
||||
}
|
||||
}
|
||||
#endif /* WINDOWS32 */
|
||||
@@ -1135,64 +1182,16 @@ start_waiting_job (c)
|
||||
|
||||
c->remote = start_remote_job_p (1);
|
||||
|
||||
/* If not, start it locally. */
|
||||
if (!c->remote)
|
||||
/* If we are running at least one job already and the load average
|
||||
is too high, make this one wait. */
|
||||
if (!c->remote && job_slots_used > 0 && load_too_high ())
|
||||
{
|
||||
#ifdef MAKE_JOBSERVER
|
||||
/* If this is not a recurse command and we are controlling
|
||||
multiple jobs, and we don't yet have one, obtain a token before
|
||||
starting child. */
|
||||
if (job_fds[0] >= 0 && !f->cmds->any_recurse && !c->job_token)
|
||||
{
|
||||
fd_set rfds;
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_SET(job_fds[0], &rfds);
|
||||
|
||||
/* Read a token. We set the non-blocking bit on this earlier,
|
||||
so if there's no token to be read we'll fall through to the
|
||||
select. The select blocks until (a) there's data to read,
|
||||
in which case we come back around and try to grab the token
|
||||
before someone else does, or (b) a signal, such as SIGCHLD,
|
||||
is caught (because we installed a handler for it). If the
|
||||
latter, call reap_children() to try to free up some slots. */
|
||||
|
||||
while (read (job_fds[0], &c->job_token, 1) < 1)
|
||||
{
|
||||
int r = select (job_fds[0]+1, SELECT_FD_SET_CAST &rfds,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
if (r < 0)
|
||||
{
|
||||
#ifdef EINTR
|
||||
if (errno != EINTR)
|
||||
/* We should definitely handle this more gracefully!
|
||||
What kinds of things can happen here? ^C closes the
|
||||
pipe? Something else closes it? */
|
||||
pfatal_with_name ("read jobs pipe");
|
||||
#endif
|
||||
/* We were interrupted; handle any dead children. */
|
||||
reap_children (1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
assert(c->job_token != 0);
|
||||
if (debug_flag)
|
||||
printf ("Obtained token `%c' for child 0x%08lx.\n",
|
||||
c->job_token, (unsigned long int) c);
|
||||
}
|
||||
#endif
|
||||
/* If we are running at least one job already and the load average
|
||||
is too high, make this one wait. */
|
||||
if (job_slots_used > 0 && load_too_high ())
|
||||
{
|
||||
/* Put this child on the chain of children waiting
|
||||
for the load average to go down. */
|
||||
set_command_state (f, cs_running);
|
||||
c->next = waiting_jobs;
|
||||
waiting_jobs = c;
|
||||
return 0;
|
||||
}
|
||||
/* Put this child on the chain of children waiting for the load average
|
||||
to go down. */
|
||||
set_command_state (f, cs_running);
|
||||
c->next = waiting_jobs;
|
||||
waiting_jobs = c;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Start the first command; reap_children will run later command lines. */
|
||||
@@ -1203,9 +1202,10 @@ start_waiting_job (c)
|
||||
case cs_running:
|
||||
c->next = children;
|
||||
if (debug_flag)
|
||||
printf ("Putting child 0x%08lx PID %ld%s on the chain.\n",
|
||||
(unsigned long int) c,
|
||||
(long) c->pid, c->remote ? " (remote)" : "");
|
||||
printf (_("Putting child 0x%08lx (%s) PID %ld token %c%s on the chain.\n"),
|
||||
(unsigned long int) c, c->file->name,
|
||||
(long) c->pid, c->job_token,
|
||||
c->remote ? _(" (remote)") : "");
|
||||
children = c;
|
||||
/* One more job slot is in use. */
|
||||
++job_slots_used;
|
||||
@@ -1251,12 +1251,6 @@ new_job (file)
|
||||
/* Chop the commands up into lines if they aren't already. */
|
||||
chop_commands (cmds);
|
||||
|
||||
/* Wait for a job slot to be freed up. If we allow an infinite number
|
||||
don't bother; also job_slots will == 0 if we're using the job pipe. */
|
||||
if (job_slots != 0)
|
||||
while (job_slots_used == job_slots)
|
||||
reap_children (1, 0);
|
||||
|
||||
/* Expand the command lines and store the results in LINES. */
|
||||
lines = (char **) xmalloc (cmds->ncommand_lines * sizeof (char *));
|
||||
for (i = 0; i < cmds->ncommand_lines; ++i)
|
||||
@@ -1368,11 +1362,59 @@ new_job (file)
|
||||
c->command_ptr = 0;
|
||||
c->environment = 0;
|
||||
c->sh_batch_file = NULL;
|
||||
c->job_token = 0;
|
||||
c->job_token = '-';
|
||||
|
||||
/* Fetch the first command line to be run. */
|
||||
job_next_command (c);
|
||||
|
||||
/* Wait for a job slot to be freed up. If we allow an infinite number
|
||||
don't bother; also job_slots will == 0 if we're using the jobserver. */
|
||||
if (job_slots != 0)
|
||||
while (job_slots_used == job_slots)
|
||||
reap_children (1, 0);
|
||||
#ifdef MAKE_JOBSERVER
|
||||
/* If we are controlling multiple jobs, and we don't yet have one,
|
||||
obtain a token before starting the child. */
|
||||
else if (job_fds[0] >= 0)
|
||||
{
|
||||
while (c->job_token == '-')
|
||||
/* If the reserved token is available, just use that. */
|
||||
if (my_job_token == '+')
|
||||
{
|
||||
c->job_token = my_job_token;
|
||||
my_job_token = '-';
|
||||
}
|
||||
/* Read a token. As long as there's no token available we'll block.
|
||||
If we get a SIGCHLD we'll return with EINTR. If one happened
|
||||
before we got here we'll return immediately with EAGAIN because
|
||||
the signal handler unsets the blocking bit. */
|
||||
else if (read (job_fds[0], &c->job_token, 1) < 1)
|
||||
{
|
||||
int fl;
|
||||
|
||||
#if !defined(EAGAIN)
|
||||
# define EAGAIN EWOULDBLOCK
|
||||
#endif
|
||||
if (errno != EINTR && errno != EAGAIN)
|
||||
pfatal_with_name (_("read jobs pipe"));
|
||||
|
||||
/* Set the blocking bit on the read FD again, just in case. */
|
||||
fl = fcntl(job_fds[0], F_GETFL, 0);
|
||||
if (fl >= 0)
|
||||
fcntl(job_fds[0], F_SETFL, fl & ~O_NONBLOCK);
|
||||
|
||||
/* Something's done. We don't want to block for a whole child,
|
||||
just reap whatever's there. */
|
||||
reap_children (0, 0);
|
||||
}
|
||||
|
||||
assert(c->job_token != '-');
|
||||
if (debug_flag)
|
||||
printf (_("Obtained token `%c' for child 0x%08lx (%s).\n"),
|
||||
c->job_token, (unsigned long int) c, c->file->name);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* The job is now primed. Start it running.
|
||||
(This will notice if there are in fact no commands.) */
|
||||
(void)start_waiting_job (c);
|
||||
@@ -1429,9 +1471,9 @@ load_too_high ()
|
||||
{
|
||||
if (errno == 0)
|
||||
/* An errno value of zero means getloadavg is just unsupported. */
|
||||
error (NILF, "cannot enforce load limits on this operating system");
|
||||
error (NILF, _("cannot enforce load limits on this operating system"));
|
||||
else
|
||||
perror_with_name ("cannot enforce load limit: ", "getloadavg");
|
||||
perror_with_name (_("cannot enforce load limit: "), "getloadavg");
|
||||
}
|
||||
lossage = errno;
|
||||
load = 0;
|
||||
@@ -1534,7 +1576,7 @@ int vmsHandleChildTerm(struct child *child)
|
||||
break;
|
||||
|
||||
default:
|
||||
error (NILF, "internal error: `%s' command_state", c->file->name);
|
||||
error (NILF, _("internal error: `%s' command_state"), c->file->name);
|
||||
abort ();
|
||||
break;
|
||||
}
|
||||
@@ -1640,7 +1682,7 @@ child_execute_job (argv, child)
|
||||
sprintf (cmd, "$ @%s", comname);
|
||||
|
||||
if (debug_flag)
|
||||
printf ("Executing %s instead\n", cmd);
|
||||
printf (_("Executing %s instead\n"), cmd);
|
||||
}
|
||||
|
||||
cmddsc.dsc$w_length = strlen(cmd);
|
||||
@@ -1671,7 +1713,7 @@ child_execute_job (argv, child)
|
||||
|
||||
if (!(status & 1))
|
||||
{
|
||||
printf("Error spawning, %d\n",status);
|
||||
printf(_("Error spawning, %d\n"),status);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
@@ -1740,11 +1782,11 @@ exec_command (argv, envp)
|
||||
{
|
||||
int i;
|
||||
fprintf(stderr,
|
||||
"process_easy() failed failed to launch process (e=%d)\n",
|
||||
_("process_easy() failed failed to launch process (e=%d)\n"),
|
||||
process_last_err(hPID));
|
||||
for (i = 0; argv[i]; i++)
|
||||
fprintf(stderr, "%s ", argv[i]);
|
||||
fprintf(stderr, "\nCounted %d args in failed launch\n", i);
|
||||
fprintf(stderr, _("\nCounted %d args in failed launch\n"), i);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -1769,7 +1811,7 @@ exec_command (argv, envp)
|
||||
break;
|
||||
else
|
||||
fprintf(stderr,
|
||||
"make reaped child pid %d, still waiting for pid %d\n",
|
||||
_("make reaped child pid %d, still waiting for pid %d\n"),
|
||||
hWaitPID, hPID);
|
||||
}
|
||||
|
||||
@@ -1788,7 +1830,7 @@ exec_command (argv, envp)
|
||||
switch (errno)
|
||||
{
|
||||
case ENOENT:
|
||||
error (NILF, "%s: Command not found", argv[0]);
|
||||
error (NILF, _("%s: Command not found"), argv[0]);
|
||||
break;
|
||||
case ENOEXEC:
|
||||
{
|
||||
@@ -1817,7 +1859,7 @@ exec_command (argv, envp)
|
||||
|
||||
execvp (shell, new_argv);
|
||||
if (errno == ENOENT)
|
||||
error (NILF, "%s: Shell program not found", shell);
|
||||
error (NILF, _("%s: Shell program not found"), shell);
|
||||
else
|
||||
perror_with_name ("execvp: ", shell);
|
||||
break;
|
||||
@@ -1997,7 +2039,7 @@ construct_command_argv_internal (line, restp, shell, ifs, batch_filename_ptr)
|
||||
{
|
||||
extern int _is_unixy_shell (const char *_path);
|
||||
|
||||
message (1, "$SHELL changed (was `%s', now `%s')", default_shell, shell);
|
||||
message (1, _("$SHELL changed (was `%s', now `%s')"), default_shell, shell);
|
||||
unixy_shell = _is_unixy_shell (shell);
|
||||
default_shell = shell;
|
||||
}
|
||||
@@ -2399,7 +2441,7 @@ construct_command_argv_internal (line, restp, shell, ifs, batch_filename_ptr)
|
||||
}
|
||||
|
||||
if (debug_flag)
|
||||
printf("Creating temporary batch file %s\n", *batch_filename_ptr);
|
||||
printf(_("Creating temporary batch file %s\n"), *batch_filename_ptr);
|
||||
|
||||
/* create batch file to execute command */
|
||||
batch = fopen (*batch_filename_ptr, "w");
|
||||
@@ -2440,7 +2482,7 @@ construct_command_argv_internal (line, restp, shell, ifs, batch_filename_ptr)
|
||||
}
|
||||
#else
|
||||
else
|
||||
fatal (NILF, "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n",
|
||||
fatal (NILF, _("%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"),
|
||||
__FILE__, __LINE__);
|
||||
#endif
|
||||
}
|
||||
|
||||
236
main.c
236
main.c
@@ -249,33 +249,33 @@ static const struct command_switch switches[] =
|
||||
{
|
||||
{ 'b', ignore, 0, 0, 0, 0, 0, 0,
|
||||
0, 0,
|
||||
"Ignored for compatibility" },
|
||||
_("Ignored for compatibility") },
|
||||
{ 'C', string, (char *) &directories, 0, 0, 0, 0, 0,
|
||||
"directory", "DIRECTORY",
|
||||
"Change to DIRECTORY before doing anything" },
|
||||
"directory", _("DIRECTORY"),
|
||||
_("Change to DIRECTORY before doing anything") },
|
||||
{ 'd', flag, (char *) &debug_flag, 1, 1, 0, 0, 0,
|
||||
"debug", 0,
|
||||
"Print lots of debugging information" },
|
||||
_("Print lots of debugging information") },
|
||||
#ifdef WINDOWS32
|
||||
{ 'D', flag, (char *) &suspend_flag, 1, 1, 0, 0, 0,
|
||||
"suspend-for-debug", 0,
|
||||
"Suspend process to allow a debugger to attach" },
|
||||
_("Suspend process to allow a debugger to attach") },
|
||||
#endif
|
||||
{ 'e', flag, (char *) &env_overrides, 1, 1, 0, 0, 0,
|
||||
"environment-overrides", 0,
|
||||
"Environment variables override makefiles" },
|
||||
_("Environment variables override makefiles") },
|
||||
{ 'f', string, (char *) &makefiles, 0, 0, 0, 0, 0,
|
||||
"file", "FILE",
|
||||
"Read FILE as a makefile" },
|
||||
"file", _("FILE"),
|
||||
_("Read FILE as a makefile") },
|
||||
{ 'h', flag, (char *) &print_usage_flag, 0, 0, 0, 0, 0,
|
||||
"help", 0,
|
||||
"Print this message and exit" },
|
||||
_("Print this message and exit") },
|
||||
{ 'i', flag, (char *) &ignore_errors_flag, 1, 1, 0, 0, 0,
|
||||
"ignore-errors", 0,
|
||||
"Ignore errors from commands" },
|
||||
_("Ignore errors from commands") },
|
||||
{ 'I', string, (char *) &include_directories, 1, 1, 0, 0, 0,
|
||||
"include-dir", "DIRECTORY",
|
||||
"Search DIRECTORY for included makefiles" },
|
||||
"include-dir", _("DIRECTORY"),
|
||||
_("Search DIRECTORY for included makefiles") },
|
||||
{ 'j',
|
||||
#ifndef MAKE_JOBSERVER
|
||||
positive_int, (char *) &job_slots, 1, 1, 0,
|
||||
@@ -284,68 +284,68 @@ static const struct command_switch switches[] =
|
||||
int_string, (char *)&job_slots_str, 1, 1, 0, "0", "1",
|
||||
#endif
|
||||
"jobs", "N",
|
||||
"Allow N jobs at once; infinite jobs with no arg" },
|
||||
_("Allow N jobs at once; infinite jobs with no arg") },
|
||||
{ 'k', flag, (char *) &keep_going_flag, 1, 1, 0,
|
||||
0, (char *) &default_keep_going_flag,
|
||||
"keep-going", 0,
|
||||
"Keep going when some targets can't be made" },
|
||||
_("Keep going when some targets can't be made") },
|
||||
#ifndef NO_FLOAT
|
||||
{ 'l', floating, (char *) &max_load_average, 1, 1, 0,
|
||||
(char *) &default_load_average, (char *) &default_load_average,
|
||||
"load-average", "N",
|
||||
"Don't start multiple jobs unless load is below N" },
|
||||
_("Don't start multiple jobs unless load is below N") },
|
||||
#else
|
||||
{ 'l', positive_int, (char *) &max_load_average, 1, 1, 0,
|
||||
(char *) &default_load_average, (char *) &default_load_average,
|
||||
"load-average", "N",
|
||||
"Don't start multiple jobs unless load is below N" },
|
||||
_("Don't start multiple jobs unless load is below N") },
|
||||
#endif
|
||||
{ 'm', ignore, 0, 0, 0, 0, 0, 0,
|
||||
0, 0,
|
||||
"-b" },
|
||||
{ 'n', flag, (char *) &just_print_flag, 1, 1, 1, 0, 0,
|
||||
"just-print", 0,
|
||||
"Don't actually run any commands; just print them" },
|
||||
_("Don't actually run any commands; just print them") },
|
||||
{ 'o', string, (char *) &old_files, 0, 0, 0, 0, 0,
|
||||
"old-file", "FILE",
|
||||
"Consider FILE to be very old and don't remake it" },
|
||||
"old-file", _("FILE"),
|
||||
_("Consider FILE to be very old and don't remake it") },
|
||||
{ 'p', flag, (char *) &print_data_base_flag, 1, 1, 0, 0, 0,
|
||||
"print-data-base", 0,
|
||||
"Print make's internal database" },
|
||||
_("Print make's internal database") },
|
||||
{ 'q', flag, (char *) &question_flag, 1, 1, 1, 0, 0,
|
||||
"question", 0,
|
||||
"Run no commands; exit status says if up to date" },
|
||||
_("Run no commands; exit status says if up to date") },
|
||||
{ 'r', flag, (char *) &no_builtin_rules_flag, 1, 1, 0, 0, 0,
|
||||
"no-builtin-rules", 0,
|
||||
"Disable the built-in implicit rules" },
|
||||
_("Disable the built-in implicit rules") },
|
||||
{ 'R', flag, (char *) &no_builtin_variables_flag, 1, 1, 0, 0, 0,
|
||||
"no-builtin-variables", 0,
|
||||
"Disable the built-in variable settings" },
|
||||
_("Disable the built-in variable settings") },
|
||||
{ 's', flag, (char *) &silent_flag, 1, 1, 0, 0, 0,
|
||||
"silent", 0,
|
||||
"Don't echo commands" },
|
||||
_("Don't echo commands") },
|
||||
{ 'S', flag_off, (char *) &keep_going_flag, 1, 1, 0,
|
||||
0, (char *) &default_keep_going_flag,
|
||||
"no-keep-going", 0,
|
||||
"Turns off -k" },
|
||||
_("Turns off -k") },
|
||||
{ 't', flag, (char *) &touch_flag, 1, 1, 1, 0, 0,
|
||||
"touch", 0,
|
||||
"Touch targets instead of remaking them" },
|
||||
_("Touch targets instead of remaking them") },
|
||||
{ 'v', flag, (char *) &print_version_flag, 1, 1, 0, 0, 0,
|
||||
"version", 0,
|
||||
"Print the version number of make and exit" },
|
||||
_("Print the version number of make and exit") },
|
||||
{ 'w', flag, (char *) &print_directory_flag, 1, 1, 0, 0, 0,
|
||||
"print-directory", 0,
|
||||
"Print the current directory" },
|
||||
_("Print the current directory") },
|
||||
{ 2, flag, (char *) &inhibit_print_directory_flag, 1, 1, 0, 0, 0,
|
||||
"no-print-directory", 0,
|
||||
"Turn off -w, even if it was turned on implicitly" },
|
||||
_("Turn off -w, even if it was turned on implicitly") },
|
||||
{ 'W', string, (char *) &new_files, 0, 0, 0, 0, 0,
|
||||
"what-if", "FILE",
|
||||
"Consider FILE to be infinitely new" },
|
||||
"what-if", _("FILE"),
|
||||
_("Consider FILE to be infinitely new") },
|
||||
{ 3, flag, (char *) &warn_undefined_variables_flag, 1, 1, 0, 0, 0,
|
||||
"warn-undefined-variables", 0,
|
||||
"Warn when an undefined variable is referenced" },
|
||||
_("Warn when an undefined variable is referenced") },
|
||||
{ '\0', }
|
||||
};
|
||||
|
||||
@@ -438,7 +438,7 @@ enter_command_line_file (name)
|
||||
char *name;
|
||||
{
|
||||
if (name[0] == '\0')
|
||||
fatal (NILF, "empty string invalid as file name");
|
||||
fatal (NILF, _("empty string invalid as file name"));
|
||||
|
||||
if (name[0] == '~')
|
||||
{
|
||||
@@ -504,7 +504,7 @@ handle_runtime_exceptions( struct _EXCEPTION_POINTERS *exinfo )
|
||||
|
||||
if (!debug_flag)
|
||||
{
|
||||
sprintf(errmsg, "%s: Interrupt/Exception caught ", prg);
|
||||
sprintf(errmsg, _("%s: Interrupt/Exception caught "), prg);
|
||||
sprintf(&errmsg[strlen(errmsg)],
|
||||
"(code = 0x%x, addr = 0x%x)\r\n",
|
||||
exrec->ExceptionCode, exrec->ExceptionAddress);
|
||||
@@ -513,7 +513,7 @@ handle_runtime_exceptions( struct _EXCEPTION_POINTERS *exinfo )
|
||||
}
|
||||
|
||||
sprintf(errmsg,
|
||||
"\r\nUnhandled exception filter called from program %s\r\n", prg);
|
||||
_("\r\nUnhandled exception filter called from program %s\r\n"), prg);
|
||||
sprintf(&errmsg[strlen(errmsg)], "ExceptionCode = %x\r\n",
|
||||
exrec->ExceptionCode);
|
||||
sprintf(&errmsg[strlen(errmsg)], "ExceptionFlags = %x\r\n",
|
||||
@@ -524,8 +524,8 @@ handle_runtime_exceptions( struct _EXCEPTION_POINTERS *exinfo )
|
||||
if (exrec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION
|
||||
&& exrec->NumberParameters >= 2)
|
||||
sprintf(&errmsg[strlen(errmsg)],
|
||||
"Access violation: %s operation at address %x\r\n",
|
||||
exrec->ExceptionInformation[0] ? "write": "read",
|
||||
_("Access violation: %s operation at address %x\r\n"),
|
||||
exrec->ExceptionInformation[0] ? _("write"): _("read"),
|
||||
exrec->ExceptionInformation[1]);
|
||||
|
||||
/* turn this on if we want to put stuff in the event log too */
|
||||
@@ -590,7 +590,7 @@ find_and_set_default_shell(char *token)
|
||||
sprintf(sh_path, "%s", search_token);
|
||||
default_shell = xstrdup(w32ify(sh_path,0));
|
||||
if (debug_flag)
|
||||
printf("find_and_set_shell setting default_shell = %s\n", default_shell);
|
||||
printf(_("find_and_set_shell setting default_shell = %s\n"), default_shell);
|
||||
sh_found = 1;
|
||||
} else {
|
||||
char *p;
|
||||
@@ -632,7 +632,7 @@ find_and_set_default_shell(char *token)
|
||||
}
|
||||
|
||||
if (debug_flag && sh_found)
|
||||
printf("find_and_set_shell path search set default_shell = %s\n", default_shell);
|
||||
printf(_("find_and_set_shell path search set default_shell = %s\n"), default_shell);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -929,9 +929,9 @@ int main (int argc, char ** argv)
|
||||
#ifdef WINDOWS32
|
||||
if (suspend_flag) {
|
||||
fprintf(stderr, "%s (pid = %d)\n", argv[0], GetCurrentProcessId());
|
||||
fprintf(stderr, "%s is suspending for 30 seconds...", argv[0]);
|
||||
fprintf(stderr, _("%s is suspending for 30 seconds..."), argv[0]);
|
||||
Sleep(30 * 1000);
|
||||
fprintf(stderr, "done sleep(30). Continuing.\n");
|
||||
fprintf(stderr, _("done sleep(30). Continuing.\n"));
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1130,17 +1130,17 @@ int main (int argc, char ** argv)
|
||||
#endif
|
||||
|
||||
if (stdin_nm)
|
||||
fatal (NILF, "Makefile from standard input specified twice.");
|
||||
fatal (NILF, _("Makefile from standard input specified twice."));
|
||||
|
||||
outfile = fopen (name, "w");
|
||||
if (outfile == 0)
|
||||
pfatal_with_name ("fopen (temporary file)");
|
||||
pfatal_with_name (_("fopen (temporary file)"));
|
||||
while (!feof (stdin))
|
||||
{
|
||||
char buf[2048];
|
||||
unsigned int n = fread (buf, 1, sizeof(buf), stdin);
|
||||
if (n > 0 && fwrite (buf, 1, n, outfile) != n)
|
||||
pfatal_with_name ("fwrite (temporary file)");
|
||||
pfatal_with_name (_("fwrite (temporary file)"));
|
||||
}
|
||||
(void) fclose (outfile);
|
||||
|
||||
@@ -1168,23 +1168,41 @@ int main (int argc, char ** argv)
|
||||
}
|
||||
|
||||
#if defined(MAKE_JOBSERVER) || !defined(HAVE_WAIT_NOHANG)
|
||||
/* If we don't have a hanging wait we have to fall back to old, broken
|
||||
/* Set up to handle children dying. This must be done before
|
||||
reading in the makefiles so that `shell' function calls will work.
|
||||
|
||||
If we don't have a hanging wait we have to fall back to old, broken
|
||||
functionality here and rely on the signal handler and counting
|
||||
children.
|
||||
|
||||
Also, if we're using the jobs pipe we need a signal handler so that
|
||||
SIGCHLD is not ignored; we need it to interrupt select(2) in
|
||||
job.c:start_waiting_job() if we're waiting on the pipe for a token. */
|
||||
If we're using the jobs pipe we need a signal handler so that
|
||||
SIGCHLD is not ignored; we need it to interrupt the read(2) of the
|
||||
jobserver pipe in job.c if we're waiting for a token.
|
||||
|
||||
If none of these are true, we don't need a signal handler at all. */
|
||||
{
|
||||
extern RETSIGTYPE child_handler PARAMS ((int sig));
|
||||
|
||||
/* Set up to handle children dying. This must be done before
|
||||
reading in the makefiles so that `shell' function calls will work. */
|
||||
# if defined HAVE_SIGACTION
|
||||
struct sigaction sa;
|
||||
|
||||
bzero ((char *)&sa, sizeof (struct sigaction));
|
||||
sa.sa_handler = child_handler;
|
||||
# if defined SA_INTERRUPT
|
||||
/* This is supposed to be the default, but what the heck... */
|
||||
sa.sa_flags = SA_INTERRUPT;
|
||||
# endif
|
||||
# define HANDLESIG(s) sigaction(s, &sa, NULL)
|
||||
# else
|
||||
# define HANDLESIG(s) signal(s, child_handler)
|
||||
# endif
|
||||
|
||||
/* OK, now actually install the handlers. */
|
||||
# if defined SIGCHLD
|
||||
(void) signal (SIGCHLD, child_handler);
|
||||
(void) HANDLESIG (SIGCHLD);
|
||||
# endif
|
||||
# if defined SIGCLD && SIGCLD != SIGCHLD
|
||||
(void) signal (SIGCLD, child_handler);
|
||||
(void) HANDLESIG (SIGCLD);
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
@@ -1231,8 +1249,8 @@ int main (int argc, char ** argv)
|
||||
no_default_sh_exe = !find_and_set_default_shell(NULL);
|
||||
|
||||
if (no_default_sh_exe && job_slots != 1) {
|
||||
error (NILF, "Do not specify -j or --jobs if sh.exe is not available.");
|
||||
error (NILF, "Resetting make for single job mode.");
|
||||
error (NILF, _("Do not specify -j or --jobs if sh.exe is not available."));
|
||||
error (NILF, _("Resetting make for single job mode."));
|
||||
job_slots = 1;
|
||||
}
|
||||
#endif /* WINDOWS32 */
|
||||
@@ -1267,21 +1285,38 @@ int main (int argc, char ** argv)
|
||||
|
||||
#ifdef MAKE_JOBSERVER
|
||||
/* If extended jobs are available then the -j option can have one of 4
|
||||
formats: (1) not specified: default is "1"; (2) specified with no
|
||||
value: default is "0" (infinite); (3) specified with a single
|
||||
value: this means the user wants N job slots; or (4) specified with
|
||||
2 values separated by commas. The latter means we're a submake and
|
||||
the two values are the read and write FDs, respectively, for the
|
||||
pipe. Note this last form is undocumented for the user!
|
||||
*/
|
||||
sscanf(job_slots_str, "%d", &job_slots);
|
||||
{
|
||||
char *cp = index(job_slots_str, ',');
|
||||
formats: (1) not specified: default is "1"; (2) specified with no value:
|
||||
default is "0" (infinite); (3) specified with a single value: this means
|
||||
the user wants N job slots; or (4) specified with 2 values separated by
|
||||
a comma. The latter means we're a submake; the two values are the read
|
||||
and write FDs, respectively, for the pipe. Note this last form is
|
||||
undocumented for the user! */
|
||||
|
||||
if (cp && sscanf(cp+1, "%d", &job_fds[1]) == 1)
|
||||
sscanf (job_slots_str, "%d", &job_slots);
|
||||
{
|
||||
char *cp = index (job_slots_str, ',');
|
||||
|
||||
/* In case #4, get the FDs. */
|
||||
if (cp && sscanf (cp+1, "%d", &job_fds[1]) == 1)
|
||||
{
|
||||
job_fds[0] = job_slots;
|
||||
job_slots = 0;
|
||||
/* Set up the first FD and set job_slots to 0. 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. */
|
||||
job_fds[0] = job_slots;
|
||||
job_slots = 0;
|
||||
|
||||
/* Make sure the pipe is open! The parent might have closed it
|
||||
because it didn't think we were a submake. If so, print a warning
|
||||
then default to -j1. */
|
||||
if (fcntl (job_fds[0], F_GETFL, 0) < 0
|
||||
|| fcntl (job_fds[1], F_GETFL, 0) < 0)
|
||||
{
|
||||
error (NILF,
|
||||
_("warning: jobserver unavailable (using -j1). Add `+' to parent make rule."));
|
||||
job_slots = 1;
|
||||
job_fds[0] = job_fds[1] = -1;
|
||||
job_slots_str = "1";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1293,14 +1328,14 @@ int main (int argc, char ** argv)
|
||||
char buf[(sizeof("1024")*2)+1];
|
||||
char c = '0';
|
||||
|
||||
if (pipe(job_fds) < 0)
|
||||
pfatal_with_name("creating jobs pipe");
|
||||
if (pipe (job_fds) < 0)
|
||||
pfatal_with_name (_("creating jobs pipe"));
|
||||
|
||||
/* Set the read FD to nonblocking; we'll use select() to wait
|
||||
for it in job.c. */
|
||||
fcntl (job_fds[0], F_SETFL, O_NONBLOCK);
|
||||
/* Every make assumes that it always has one job it can run. For the
|
||||
submakes it's the token they were given by their parent. For the
|
||||
top make, we just subtract one from the number the user wants. */
|
||||
|
||||
for (; job_slots; --job_slots)
|
||||
while (--job_slots)
|
||||
{
|
||||
write(job_fds[1], &c, 1);
|
||||
if (c == '9')
|
||||
@@ -1316,6 +1351,14 @@ int main (int argc, char ** argv)
|
||||
sprintf(buf, "%d,%d", job_fds[0], job_fds[1]);
|
||||
job_slots_str = xstrdup(buf);
|
||||
}
|
||||
|
||||
/* Be sure the blocking bit on the read FD is set to start with. */
|
||||
if (job_fds[0] >= 0)
|
||||
{
|
||||
int fl = fcntl(job_fds[0], F_GETFL, 0);
|
||||
if (fl >= 0)
|
||||
fcntl(job_fds[0], F_SETFL, fl & ~O_NONBLOCK);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set up MAKEFLAGS and MFLAGS again, so they will be right. */
|
||||
@@ -1385,7 +1428,7 @@ int main (int argc, char ** argv)
|
||||
int nargc = argc;
|
||||
|
||||
if (debug_flag)
|
||||
puts ("Updating makefiles....");
|
||||
puts (_("Updating makefiles...."));
|
||||
|
||||
/* Remove any makefiles we don't want to try to update.
|
||||
Also record the current modtimes so we can compare them later. */
|
||||
@@ -1410,7 +1453,7 @@ int main (int argc, char ** argv)
|
||||
you write your makefiles.) */
|
||||
|
||||
if (debug_flag)
|
||||
printf ("Makefile `%s' might loop; not remaking it.\n",
|
||||
printf (_("Makefile `%s' might loop; not remaking it.\n"),
|
||||
f->name);
|
||||
|
||||
if (last == 0)
|
||||
@@ -1484,7 +1527,7 @@ int main (int argc, char ** argv)
|
||||
FILE_TIMESTAMP mtime;
|
||||
/* The update failed and this makefile was not
|
||||
from the MAKEFILES variable, so we care. */
|
||||
error (NILF, "Failed to remake makefile `%s'.",
|
||||
error (NILF, _("Failed to remake makefile `%s'."),
|
||||
d->file->name);
|
||||
mtime = file_mtime_no_search (d->file);
|
||||
any_remade |= (mtime != (FILE_TIMESTAMP) -1
|
||||
@@ -1499,12 +1542,13 @@ int main (int argc, char ** argv)
|
||||
if (d->changed & RM_INCLUDED)
|
||||
/* An included makefile. We don't need
|
||||
to die, but we do want to complain. */
|
||||
error (NILF, "Included makefile `%s' was not found.",
|
||||
error (NILF,
|
||||
_("Included makefile `%s' was not found."),
|
||||
dep_name (d));
|
||||
else
|
||||
{
|
||||
/* A normal makefile. We must die later. */
|
||||
error (NILF, "Makefile `%s' was not found",
|
||||
error (NILF, _("Makefile `%s' was not found"),
|
||||
dep_name (d));
|
||||
any_failed = 1;
|
||||
}
|
||||
@@ -1572,7 +1616,7 @@ int main (int argc, char ** argv)
|
||||
else
|
||||
bad = 1;
|
||||
if (bad)
|
||||
fatal (NILF, "Couldn't change back to original directory.");
|
||||
fatal (NILF, _("Couldn't change back to original directory."));
|
||||
}
|
||||
|
||||
#ifndef _AMIGA
|
||||
@@ -1606,7 +1650,7 @@ int main (int argc, char ** argv)
|
||||
if (debug_flag)
|
||||
{
|
||||
char **p;
|
||||
fputs ("Re-executing:", stdout);
|
||||
fputs (_("Re-executing:"), stdout);
|
||||
for (p = nargv; *p != 0; ++p)
|
||||
printf (" %s", *p);
|
||||
puts ("");
|
||||
@@ -1631,7 +1675,7 @@ int main (int argc, char ** argv)
|
||||
/* If there is a temp file from reading a makefile from stdin, get rid of
|
||||
it now. */
|
||||
if (stdin_nm && unlink(stdin_nm) < 0 && errno != ENOENT)
|
||||
perror_with_name("unlink (temporary file): ", stdin_nm);
|
||||
perror_with_name(_("unlink (temporary file): "), stdin_nm);
|
||||
|
||||
{
|
||||
int status;
|
||||
@@ -1653,15 +1697,15 @@ int main (int argc, char ** argv)
|
||||
if (!goals)
|
||||
{
|
||||
if (read_makefiles == 0)
|
||||
fatal (NILF, "No targets specified and no makefile found");
|
||||
fatal (NILF, _("No targets specified and no makefile found"));
|
||||
|
||||
fatal (NILF, "No targets");
|
||||
fatal (NILF, _("No targets"));
|
||||
}
|
||||
|
||||
/* Update the goals. */
|
||||
|
||||
if (debug_flag)
|
||||
puts ("Updating goal targets....");
|
||||
puts (_("Updating goal targets...."));
|
||||
|
||||
switch (update_goal_chain (goals, 0))
|
||||
{
|
||||
@@ -1686,7 +1730,7 @@ int main (int argc, char ** argv)
|
||||
|
||||
/* If we detected some clock skew, generate one last warning */
|
||||
if (clock_skew_detected)
|
||||
error (NILF, "*** Warning: Clock skew detected. Your build may be incomplete.");
|
||||
error (NILF, _("*** Warning: Clock skew detected. Your build may be incomplete."));
|
||||
|
||||
/* Exit. */
|
||||
die (status);
|
||||
@@ -1843,9 +1887,9 @@ print_usage (bad)
|
||||
|
||||
usageto = bad ? stderr : stdout;
|
||||
|
||||
fprintf (usageto, "Usage: %s [options] [target] ...\n", program);
|
||||
fprintf (usageto, _("Usage: %s [options] [target] ...\n"), program);
|
||||
|
||||
fputs ("Options:\n", usageto);
|
||||
fputs (_("Options:\n"), usageto);
|
||||
for (cs = switches; cs->c != '\0'; ++cs)
|
||||
{
|
||||
char buf[1024], shortarg[50], longarg[50], *p;
|
||||
@@ -2046,8 +2090,8 @@ decode_switches (argc, argv, env)
|
||||
if (i < 1)
|
||||
{
|
||||
if (doit)
|
||||
error (NILF, "the `-%c' option requires a \
|
||||
positive integral argument",
|
||||
error (NILF, _("the `-%c' option requires a \
|
||||
positive integral argument"),
|
||||
cs->c);
|
||||
bad = 1;
|
||||
}
|
||||
@@ -2486,13 +2530,13 @@ print_version ()
|
||||
if (remote_description != 0 && *remote_description != '\0')
|
||||
printf ("-%s", remote_description);
|
||||
|
||||
printf (", by Richard Stallman and Roland McGrath.\n\
|
||||
printf (_(", by Richard Stallman and Roland McGrath.\n\
|
||||
%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99\n\
|
||||
%s\tFree Software Foundation, Inc.\n\
|
||||
%sThis is free software; see the source for copying conditions.\n\
|
||||
%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
|
||||
%sPARTICULAR PURPOSE.\n\n\
|
||||
%sReport bugs to <bug-make@gnu.org>.\n\n",
|
||||
%sReport bugs to <bug-make@gnu.org>.\n\n"),
|
||||
precede, precede, precede, precede, precede, precede);
|
||||
|
||||
printed_version = 1;
|
||||
@@ -2510,7 +2554,7 @@ print_data_base ()
|
||||
time_t when;
|
||||
|
||||
when = time ((time_t *) 0);
|
||||
printf ("\n# Make data base, printed on %s", ctime (&when));
|
||||
printf (_("\n# Make data base, printed on %s"), ctime (&when));
|
||||
|
||||
print_variable_data_base ();
|
||||
print_dir_data_base ();
|
||||
@@ -2519,7 +2563,7 @@ print_data_base ()
|
||||
print_vpath_data_base ();
|
||||
|
||||
when = time ((time_t *) 0);
|
||||
printf ("\n# Finished Make data base on %s\n", ctime (&when));
|
||||
printf (_("\n# Finished Make data base on %s\n"), ctime (&when));
|
||||
}
|
||||
|
||||
/* Exit with STATUS, cleaning up as necessary. */
|
||||
@@ -2574,7 +2618,7 @@ log_working_directory (entering)
|
||||
int entering;
|
||||
{
|
||||
static int entered = 0;
|
||||
char *msg = entering ? "Entering" : "Leaving";
|
||||
char *msg = entering ? _("Entering") : _("Leaving");
|
||||
|
||||
/* Print nothing without the flag. Don't print the entering message
|
||||
again if we already have. Don't print the leaving message if we
|
||||
@@ -2593,7 +2637,7 @@ log_working_directory (entering)
|
||||
printf ("%s[%u]: %s ", program, makelevel, msg);
|
||||
|
||||
if (starting_directory == 0)
|
||||
puts ("an unknown directory");
|
||||
puts (_("an unknown directory"));
|
||||
else
|
||||
printf ("directory `%s'\n", starting_directory);
|
||||
printf (_("directory `%s'\n"), starting_directory);
|
||||
}
|
||||
|
||||
@@ -11,10 +11,10 @@ globhdr := $(wildcard glob/*.h)
|
||||
TEMPLATES = README README.DOS config.ami configh.dos config.h.W32 config.h-vms
|
||||
MTEMPLATES = Makefile.DOS SMakefile
|
||||
|
||||
# We need this to ensure that README is created on time to avoid errors
|
||||
# by automake.
|
||||
# We need this to ensure that README and build.sh.in are created on time to
|
||||
# avoid errors by automake.
|
||||
#
|
||||
Makefile.in: README
|
||||
#Makefile.in: README build.sh.in
|
||||
|
||||
# General rule for turning a .template into a regular file.
|
||||
#
|
||||
|
||||
15
make.h
15
make.h
@@ -40,6 +40,13 @@ Boston, MA 02111-1307, USA. */
|
||||
#endif /* C++ or ANSI C. */
|
||||
|
||||
|
||||
/* For now, set gettext macro to a no-op. */
|
||||
#undef _
|
||||
#undef N_
|
||||
#define _(s) s
|
||||
#define N_(s) s
|
||||
|
||||
|
||||
#ifdef CRAY
|
||||
/* This must happen before #include <signal.h> so
|
||||
that the declaration therein is changed. */
|
||||
@@ -70,6 +77,14 @@ Boston, MA 02111-1307, USA. */
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
/* A shortcut for EINTR checking. Note you should never negate this! That
|
||||
very likely doesn't mean what you want if EINTR is not available. */
|
||||
#ifdef EINTR
|
||||
# define EINTR_SET (errno == EINTR)
|
||||
#else
|
||||
# define EINTR_SET (0)
|
||||
#endif
|
||||
|
||||
#ifndef isblank
|
||||
# define isblank(c) ((c) == ' ' || (c) == '\t')
|
||||
#endif
|
||||
|
||||
39
make.texinfo
39
make.texinfo
@@ -38,7 +38,7 @@ This is Edition @value{EDITION}, last updated @value{UPDATED},
|
||||
of @cite{The GNU Make Manual}, for @code{make}, Version @value{VERSION}.
|
||||
|
||||
Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95, '96, '97, '98, '99
|
||||
Free Software Foundation, Inc.
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
@@ -3784,7 +3784,7 @@ a canned sequence apply to every line in the sequence. So the rule:
|
||||
|
||||
@example
|
||||
frob.out: frob.in
|
||||
@@$(frobnicate)
|
||||
@@$(frobnicate)
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
@@ -3820,8 +3820,8 @@ from getting implicit commands (from implicit rules or the
|
||||
@ignore
|
||||
foo: stamp-foo ;
|
||||
stamp-foo: foo.in
|
||||
create foo frm foo.in
|
||||
touch $@
|
||||
create foo frm foo.in
|
||||
touch $@
|
||||
@end ignore
|
||||
|
||||
You may be inclined to define empty command strings for targets that are
|
||||
@@ -8955,6 +8955,8 @@ Conditionally evaluate part of the makefile.@*
|
||||
@xref{Conditionals}.
|
||||
|
||||
@item include @var{file}
|
||||
@itemx -include @var{file}
|
||||
@itemx sinclude @var{file}
|
||||
|
||||
Include another makefile.@*
|
||||
@xref{Include, ,Including Other Makefiles}.
|
||||
@@ -8962,6 +8964,7 @@ Include another makefile.@*
|
||||
@item override @var{variable} = @var{value}
|
||||
@itemx override @var{variable} := @var{value}
|
||||
@itemx override @var{variable} += @var{value}
|
||||
@itemx override @var{variable} ?= @var{value}
|
||||
@itemx override define @var{variable}
|
||||
@itemx endef
|
||||
|
||||
@@ -8978,6 +8981,7 @@ Tell @code{make} to export all variables to child processes by default.@*
|
||||
@itemx export @var{variable} = @var{value}
|
||||
@itemx export @var{variable} := @var{value}
|
||||
@itemx export @var{variable} += @var{value}
|
||||
@itemx export @var{variable} ?= @var{value}
|
||||
@itemx unexport @var{variable}
|
||||
Tell @code{make} whether or not to export a particular variable to child
|
||||
processes.@*
|
||||
@@ -9062,6 +9066,10 @@ Extract the @var{n}th word (one-origin) of @var{text}.@*
|
||||
Count the number of words in @var{text}.@*
|
||||
@xref{File Name Functions, ,Functions for File Names}.
|
||||
|
||||
@item $(wordlist @var{s},@var{e},@var{text})
|
||||
Returns the list of words in @var{text} from @var{s} to @var{e}.@*
|
||||
@xref{File Name Functions, ,Functions for File Names}.
|
||||
|
||||
@item $(firstword @var{names}@dots{})
|
||||
Extract the first word of @var{names}.@*
|
||||
@xref{File Name Functions, ,Functions for File Names}.
|
||||
@@ -9071,6 +9079,18 @@ Find file names matching a shell file name pattern (@emph{not} a
|
||||
@samp{%} pattern).@*
|
||||
@xref{Wildcard Function, ,The Function @code{wildcard}}.
|
||||
|
||||
@item $(error @var{text}@dots{})
|
||||
|
||||
When this function is evaluated, @code{make} generates a fatal error
|
||||
with the message @var{text}.@*
|
||||
@xref{Make Control Functions, ,Functions That Control Make}.
|
||||
|
||||
@item $(warning @var{text}@dots{})
|
||||
|
||||
When this function is evaluated, @code{make} generates a warning with
|
||||
the message @var{text}.@*
|
||||
@xref{Make Control Functions, ,Functions That Control Make}.
|
||||
|
||||
@item $(shell @var{command})
|
||||
|
||||
Execute a shell command and return its output.@*
|
||||
@@ -9087,6 +9107,12 @@ defined.@*
|
||||
Evaluate @var{text} with @var{var} bound to each word in @var{words},
|
||||
and concatenate the results.@*
|
||||
@xref{Foreach Function, ,The @code{foreach} Function}.
|
||||
|
||||
@item $(call @var{var},@var{param},@dots{})
|
||||
|
||||
Evaluate the variable @var{var} replacing any references to @var{$(1)},
|
||||
@var{$(2)} with the first, second, etc. @var{param} values.@*
|
||||
@xref{Call Function, ,The @code{call} Function}.
|
||||
@end table
|
||||
|
||||
Here is a summary of the automatic variables.
|
||||
@@ -9207,6 +9233,11 @@ effect on the operation of @code{make}.@*
|
||||
@item SUFFIXES
|
||||
|
||||
The default list of suffixes before @code{make} reads any makefiles.
|
||||
|
||||
@item .LIBPATTERNS
|
||||
Defines the naming of the libraries @code{make} searches for, and their
|
||||
order.@*
|
||||
@xref{Libraries/Search, ,Directory Search for Link Libraries}.
|
||||
@end table
|
||||
|
||||
@node Make Errors, Complex Makefile, Quick Reference, Top
|
||||
|
||||
14
misc.c
14
misc.c
@@ -304,7 +304,7 @@ fatal (flocp, fmt, va_alist)
|
||||
VA_PRINTF (stderr, fmt, args);
|
||||
VA_END (args);
|
||||
|
||||
fputs (". Stop.\n", stderr);
|
||||
fputs (_(". Stop.\n"), stderr);
|
||||
|
||||
die (2);
|
||||
}
|
||||
@@ -326,7 +326,7 @@ strerror (errnum)
|
||||
if (errno < sys_nerr)
|
||||
return sys_errlist[errnum];
|
||||
|
||||
sprintf (buf, "Unknown error %d", errnum);
|
||||
sprintf (buf, _("Unknown error %d"), errnum);
|
||||
return buf;
|
||||
}
|
||||
#endif
|
||||
@@ -366,7 +366,7 @@ xmalloc (size)
|
||||
{
|
||||
char *result = (char *) malloc (size);
|
||||
if (result == 0)
|
||||
fatal (NILF, "virtual memory exhausted");
|
||||
fatal (NILF, _("virtual memory exhausted"));
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -381,7 +381,7 @@ xrealloc (ptr, size)
|
||||
/* Some older implementations of realloc() don't conform to ANSI. */
|
||||
result = ptr ? realloc (ptr, size) : malloc (size);
|
||||
if (result == 0)
|
||||
fatal (NILF, "virtual memory exhausted");
|
||||
fatal (NILF, _("virtual memory exhausted"));
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -399,7 +399,7 @@ xstrdup (ptr)
|
||||
#endif
|
||||
|
||||
if (result == 0)
|
||||
fatal (NILF, "virtual memory exhausted");
|
||||
fatal (NILF, _("virtual memory exhausted"));
|
||||
|
||||
#ifdef HAVE_STRDUP
|
||||
return result;
|
||||
@@ -650,7 +650,7 @@ log_access (flavor)
|
||||
but we write this one to stderr because it might be
|
||||
run in a child fork whose stdout is piped. */
|
||||
|
||||
fprintf (stderr, "%s access: user %lu (real %lu), group %lu (real %lu)\n",
|
||||
fprintf (stderr, _("%s access: user %lu (real %lu), group %lu (real %lu)\n"),
|
||||
flavor, (unsigned long) geteuid (), (unsigned long) getuid (),
|
||||
(unsigned long) getegid (), (unsigned long) getgid ());
|
||||
fflush (stderr);
|
||||
@@ -671,7 +671,7 @@ init_access ()
|
||||
if (user_uid == -1 || user_gid == -1 || make_uid == -1 || make_gid == -1)
|
||||
pfatal_with_name ("get{e}[gu]id");
|
||||
|
||||
log_access ("Initialized");
|
||||
log_access (_("Initialized"));
|
||||
|
||||
current_access = make;
|
||||
#endif
|
||||
|
||||
94
read.c
94
read.c
@@ -17,11 +17,12 @@ along with GNU Make; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "make.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <glob.h>
|
||||
|
||||
#include "make.h"
|
||||
#include "dep.h"
|
||||
#include "filedef.h"
|
||||
#include "job.h"
|
||||
@@ -149,7 +150,7 @@ read_all_makefiles (makefiles)
|
||||
unsigned int num_makefiles = 0;
|
||||
|
||||
if (debug_flag)
|
||||
puts ("Reading makefiles...");
|
||||
puts (_("Reading makefiles..."));
|
||||
|
||||
/* If there's a non-null variable MAKEFILES, its value is a list of
|
||||
files to read first thing. But don't let it prevent reading the
|
||||
@@ -323,15 +324,15 @@ read_makefile (filename, flags)
|
||||
|
||||
if (debug_flag)
|
||||
{
|
||||
printf ("Reading makefile `%s'", fileinfo.filenm);
|
||||
printf (_("Reading makefile `%s'"), fileinfo.filenm);
|
||||
if (flags & RM_NO_DEFAULT_GOAL)
|
||||
printf (" (no default goal)");
|
||||
printf (_(" (no default goal)"));
|
||||
if (flags & RM_INCLUDED)
|
||||
printf (" (search path)");
|
||||
printf (_(" (search path)"));
|
||||
if (flags & RM_DONTCARE)
|
||||
printf (" (don't care)");
|
||||
printf (_(" (don't care)"));
|
||||
if (flags & RM_NO_TILDE)
|
||||
printf (" (no ~ expansion)");
|
||||
printf (_(" (no ~ expansion)"));
|
||||
puts ("...");
|
||||
}
|
||||
|
||||
@@ -511,7 +512,7 @@ read_makefile (filename, flags)
|
||||
if (i >= 0)
|
||||
ignoring = i;
|
||||
else
|
||||
fatal (&fileinfo, "invalid syntax in conditional");
|
||||
fatal (&fileinfo, _("invalid syntax in conditional"));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -520,7 +521,7 @@ read_makefile (filename, flags)
|
||||
if (in_ignored_define)
|
||||
in_ignored_define = 0;
|
||||
else
|
||||
fatal (&fileinfo, "extraneous `endef'");
|
||||
fatal (&fileinfo, _("extraneous `endef'"));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -532,7 +533,7 @@ read_makefile (filename, flags)
|
||||
{
|
||||
p2 = next_token (p + 6);
|
||||
if (*p2 == '\0')
|
||||
fatal (&fileinfo, "empty variable name");
|
||||
fatal (&fileinfo, _("empty variable name"));
|
||||
|
||||
/* Let the variable name be the whole rest of the line,
|
||||
with trailing blanks stripped (comments have already been
|
||||
@@ -550,7 +551,7 @@ read_makefile (filename, flags)
|
||||
{
|
||||
p2 = next_token (p + 8);
|
||||
if (*p2 == '\0')
|
||||
error (&fileinfo, "empty `override' directive");
|
||||
error (&fileinfo, _("empty `override' directive"));
|
||||
if (strneq (p2, "define", 6) && (isblank (p2[6]) || p2[6] == '\0'))
|
||||
{
|
||||
if (ignoring)
|
||||
@@ -559,7 +560,7 @@ read_makefile (filename, flags)
|
||||
{
|
||||
p2 = next_token (p2 + 6);
|
||||
if (*p2 == '\0')
|
||||
fatal (&fileinfo, "empty variable name");
|
||||
fatal (&fileinfo, _("empty variable name"));
|
||||
|
||||
/* Let the variable name be the whole rest of the line,
|
||||
with trailing blanks stripped (comments have already been
|
||||
@@ -573,7 +574,7 @@ read_makefile (filename, flags)
|
||||
}
|
||||
else if (!ignoring
|
||||
&& !try_variable_definition (&fileinfo, p2, o_override))
|
||||
error (&fileinfo, "invalid `override' directive");
|
||||
error (&fileinfo, _("invalid `override' directive"));
|
||||
|
||||
continue;
|
||||
}
|
||||
@@ -657,8 +658,7 @@ read_makefile (filename, flags)
|
||||
if (*p == '\0')
|
||||
{
|
||||
error (&fileinfo,
|
||||
"no file name for `%sinclude'",
|
||||
noerror ? "-" : "");
|
||||
_("no file name for `%sinclude'"), noerror ? "-" : "");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -691,8 +691,7 @@ read_makefile (filename, flags)
|
||||
if (! read_makefile (name, (RM_INCLUDED | RM_NO_TILDE
|
||||
| (noerror ? RM_DONTCARE : 0)))
|
||||
&& ! noerror)
|
||||
error (&fileinfo,
|
||||
"%s: %s", name, strerror (errno));
|
||||
error (&fileinfo, "%s: %s", name, strerror (errno));
|
||||
free(name);
|
||||
}
|
||||
|
||||
@@ -722,7 +721,7 @@ read_makefile (filename, flags)
|
||||
because there was no preceding target, and the line
|
||||
might have been usable as a variable definition.
|
||||
But now it is definitely lossage. */
|
||||
fatal(&fileinfo, "commands commence before first target");
|
||||
fatal(&fileinfo, _("commands commence before first target"));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -770,7 +769,7 @@ read_makefile (filename, flags)
|
||||
{
|
||||
case w_eol:
|
||||
if (cmdleft != 0)
|
||||
fatal(&fileinfo, "missing rule before commands");
|
||||
fatal(&fileinfo, _("missing rule before commands"));
|
||||
/* This line contained something but turned out to be nothing
|
||||
but whitespace (a comment?). */
|
||||
continue;
|
||||
@@ -856,9 +855,9 @@ read_makefile (filename, flags)
|
||||
if (*p2 != '\0')
|
||||
/* There's no need to be ivory-tower about this: check for
|
||||
one of the most common bugs found in makefiles... */
|
||||
fatal (&fileinfo, "missing separator%s",
|
||||
fatal (&fileinfo, _("missing separator%s"),
|
||||
!strneq(lb.buffer, " ", 8) ? ""
|
||||
: " (did you mean TAB instead of 8 spaces?)");
|
||||
: _(" (did you mean TAB instead of 8 spaces?)"));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -987,14 +986,13 @@ read_makefile (filename, flags)
|
||||
target = parse_file_seq (&p2, ':', sizeof (struct nameseq), 1);
|
||||
++p2;
|
||||
if (target == 0)
|
||||
fatal (&fileinfo, "missing target pattern");
|
||||
fatal (&fileinfo, _("missing target pattern"));
|
||||
else if (target->next != 0)
|
||||
fatal (&fileinfo, "multiple target patterns");
|
||||
fatal (&fileinfo, _("multiple target patterns"));
|
||||
pattern = target->name;
|
||||
pattern_percent = find_percent (pattern);
|
||||
if (pattern_percent == 0)
|
||||
fatal (&fileinfo,
|
||||
"target pattern contains no `%%'");
|
||||
fatal (&fileinfo, _("target pattern contains no `%%'"));
|
||||
free((char *)target);
|
||||
}
|
||||
else
|
||||
@@ -1035,7 +1033,7 @@ read_makefile (filename, flags)
|
||||
}
|
||||
|
||||
if (conditionals->if_cmds)
|
||||
fatal (&fileinfo, "missing `endif'");
|
||||
fatal (&fileinfo, _("missing `endif'"));
|
||||
|
||||
/* At eof, record the last rule. */
|
||||
record_waiting_files ();
|
||||
@@ -1094,7 +1092,7 @@ do_define (name, namelen, origin, infile, flocp)
|
||||
p += 5;
|
||||
remove_comments (p);
|
||||
if (*next_token (p) != '\0')
|
||||
error (flocp, "Extraneous text after `endef' directive");
|
||||
error (flocp, _("Extraneous text after `endef' directive"));
|
||||
/* Define the variable. */
|
||||
if (idx == 0)
|
||||
definition[0] = '\0';
|
||||
@@ -1123,7 +1121,7 @@ do_define (name, namelen, origin, infile, flocp)
|
||||
}
|
||||
|
||||
/* No `endef'!! */
|
||||
fatal (flocp, "missing `endef', unterminated `define'");
|
||||
fatal (flocp, _("missing `endef', unterminated `define'"));
|
||||
|
||||
/* NOTREACHED */
|
||||
return;
|
||||
@@ -1177,16 +1175,15 @@ conditional_line (line, flocp)
|
||||
if (*cmdname == 'e')
|
||||
{
|
||||
if (*line != '\0')
|
||||
error (flocp,
|
||||
"Extraneous text after `%s' directive", cmdname);
|
||||
error (flocp, _("Extraneous text after `%s' directive"), cmdname);
|
||||
/* "Else" or "endif". */
|
||||
if (conditionals->if_cmds == 0)
|
||||
fatal (flocp, "extraneous `%s'", cmdname);
|
||||
fatal (flocp, _("extraneous `%s'"), cmdname);
|
||||
/* NOTDEF indicates an `endif' command. */
|
||||
if (notdef)
|
||||
--conditionals->if_cmds;
|
||||
else if (conditionals->seen_else[conditionals->if_cmds - 1])
|
||||
fatal (flocp, "only one `else' per conditional");
|
||||
fatal (flocp, _("only one `else' per conditional"));
|
||||
else
|
||||
{
|
||||
/* Toggle the state of ignorance. */
|
||||
@@ -1334,8 +1331,7 @@ conditional_line (line, flocp)
|
||||
*line = '\0';
|
||||
line = next_token (++line);
|
||||
if (*line != '\0')
|
||||
error (flocp,
|
||||
"Extraneous text after `%s' directive", cmdname);
|
||||
error (flocp, _("Extraneous text after `%s' directive"), cmdname);
|
||||
|
||||
s2 = variable_expand (s2);
|
||||
conditionals->ignoring[conditionals->if_cmds - 1]
|
||||
@@ -1444,9 +1440,9 @@ record_target_var (filenames, defn, two_colon, origin, flocp)
|
||||
|
||||
/* Make the new variable context current and define the variable. */
|
||||
current_variable_set_list = vlist;
|
||||
v = try_variable_definition(flocp, defn, origin);
|
||||
v = try_variable_definition (flocp, defn, origin);
|
||||
if (!v)
|
||||
error (flocp, "Malformed per-target variable definition");
|
||||
error (flocp, _("Malformed per-target variable definition"));
|
||||
v->per_target = 1;
|
||||
|
||||
/* If it's not an override, check to see if there was a command-line
|
||||
@@ -1457,10 +1453,10 @@ record_target_var (filenames, defn, two_colon, origin, flocp)
|
||||
int len = strlen(v->name);
|
||||
|
||||
current_variable_set_list = global;
|
||||
gv = lookup_variable(v->name, len);
|
||||
gv = lookup_variable (v->name, len);
|
||||
if (gv && (gv->origin == o_env_override || gv->origin == o_command))
|
||||
define_variable_in_set(v->name, len, gv->value, gv->origin,
|
||||
gv->recursive, vlist->set);
|
||||
define_variable_in_set (v->name, len, gv->value, gv->origin,
|
||||
gv->recursive, vlist->set);
|
||||
}
|
||||
|
||||
/* Free name if not needed further. */
|
||||
@@ -1528,10 +1524,10 @@ record_files (filenames, pattern, pattern_percent, deps, cmds_started,
|
||||
implicit |= implicit_percent != 0;
|
||||
|
||||
if (implicit && pattern != 0)
|
||||
fatal (flocp, "mixed implicit and static pattern rules");
|
||||
fatal (flocp, _("mixed implicit and static pattern rules"));
|
||||
|
||||
if (implicit && implicit_percent == 0)
|
||||
fatal (flocp, "mixed implicit and normal rules");
|
||||
fatal (flocp, _("mixed implicit and normal rules"));
|
||||
|
||||
if (implicit)
|
||||
{
|
||||
@@ -1572,7 +1568,7 @@ record_files (filenames, pattern, pattern_percent, deps, cmds_started,
|
||||
{
|
||||
/* Give a warning if the rule is meaningless. */
|
||||
error (flocp,
|
||||
"target `%s' doesn't match the target pattern", name);
|
||||
_("target `%s' doesn't match the target pattern"), name);
|
||||
this = 0;
|
||||
}
|
||||
else
|
||||
@@ -1604,12 +1600,12 @@ record_files (filenames, pattern, pattern_percent, deps, cmds_started,
|
||||
|
||||
if (f->double_colon)
|
||||
fatal (flocp,
|
||||
"target file `%s' has both : and :: entries", f->name);
|
||||
_("target file `%s' has both : and :: entries"), f->name);
|
||||
|
||||
/* If CMDS == F->CMDS, this target was listed in this rule
|
||||
more than once. Just give a warning since this is harmless. */
|
||||
if (cmds != 0 && cmds == f->cmds)
|
||||
error (flocp, "target `%s' given more than once in the same rule.",
|
||||
error (flocp, _("target `%s' given more than once in the same rule."),
|
||||
f->name);
|
||||
|
||||
/* Check for two single-colon entries both with commands.
|
||||
@@ -1618,9 +1614,9 @@ record_files (filenames, pattern, pattern_percent, deps, cmds_started,
|
||||
else if (cmds != 0 && f->cmds != 0 && f->is_target)
|
||||
{
|
||||
error (&cmds->fileinfo,
|
||||
"warning: overriding commands for target `%s'", f->name);
|
||||
_("warning: overriding commands for target `%s'"), f->name);
|
||||
error (&f->cmds->fileinfo,
|
||||
"warning: ignoring old commands for target `%s'",
|
||||
_("warning: ignoring old commands for target `%s'"),
|
||||
f->name);
|
||||
}
|
||||
|
||||
@@ -1702,7 +1698,7 @@ record_files (filenames, pattern, pattern_percent, deps, cmds_started,
|
||||
we don't lose on default suffix rules or makefiles. */
|
||||
if (f != 0 && f->is_target && !f->double_colon)
|
||||
fatal (flocp,
|
||||
"target file `%s' has both : and :: entries", f->name);
|
||||
_("target file `%s' has both : and :: entries"), f->name);
|
||||
f = enter_file (name);
|
||||
/* If there was an existing entry and it was a double-colon
|
||||
entry, enter_file will have returned a new one, making it the
|
||||
@@ -2119,7 +2115,7 @@ readline (linebuffer, stream, flocp)
|
||||
lossage strikes again! (xmkmf puts NULs in its makefiles.)
|
||||
There is nothing really to be done; we synthesize a newline so
|
||||
the following line doesn't appear to be part of this line. */
|
||||
error (flocp, "warning: NUL character seen; rest of line ignored");
|
||||
error (flocp, _("warning: NUL character seen; rest of line ignored"));
|
||||
p[0] = '\n';
|
||||
len = 1;
|
||||
}
|
||||
@@ -2674,7 +2670,7 @@ multi_glob (chain, size)
|
||||
}
|
||||
|
||||
case GLOB_NOSPACE:
|
||||
fatal (NILF, "virtual memory exhausted");
|
||||
fatal (NILF, _("virtual memory exhausted"));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
87
remake.c
87
remake.c
@@ -32,10 +32,6 @@ Boston, MA 02111-1307, USA. */
|
||||
#include <sys/file.h>
|
||||
#endif
|
||||
|
||||
#ifdef __MSDOS__
|
||||
#include "variable.h"
|
||||
#endif
|
||||
|
||||
#ifdef VMS
|
||||
#include <starlet.h>
|
||||
#endif
|
||||
@@ -226,8 +222,8 @@ update_goal_chain (goals, makefiles)
|
||||
/* Never give a message under -s or -q. */
|
||||
&& !silent_flag && !question_flag)
|
||||
message (1, ((file->phony || file->cmds == 0)
|
||||
? "Nothing to be done for `%s'."
|
||||
: "`%s' is up to date."),
|
||||
? _("Nothing to be done for `%s'.")
|
||||
: _("`%s' is up to date.")),
|
||||
file->name);
|
||||
|
||||
/* This goal is finished. Remove it from the chain. */
|
||||
@@ -274,9 +270,9 @@ no_rule_error(file)
|
||||
struct file *file;
|
||||
{
|
||||
static const char msg_noparent[]
|
||||
= "%sNo rule to make target `%s'%s";
|
||||
= _("%sNo rule to make target `%s'%s");
|
||||
static const char msg_parent[]
|
||||
= "%sNo rule to make target `%s', needed by `%s'%s";
|
||||
= _("%sNo rule to make target `%s', needed by `%s'%s");
|
||||
|
||||
if (keep_going_flag || file->dontcare)
|
||||
{
|
||||
@@ -326,7 +322,7 @@ update_file (file, depth)
|
||||
possible below here until then. */
|
||||
if (file->considered == considered)
|
||||
{
|
||||
DEBUGPR ("Pruning file `%s'.\n");
|
||||
DEBUGPR (_("Pruning file `%s'.\n"));
|
||||
return 0;
|
||||
}
|
||||
file->considered = considered;
|
||||
@@ -373,18 +369,18 @@ update_file_1 (file, depth)
|
||||
register struct dep *d, *lastd;
|
||||
int running = 0;
|
||||
|
||||
DEBUGPR ("Considering target file `%s'.\n");
|
||||
DEBUGPR (_("Considering target file `%s'.\n"));
|
||||
|
||||
if (file->updated)
|
||||
{
|
||||
if (file->update_status > 0)
|
||||
{
|
||||
DEBUGPR ("Recently tried and failed to update file `%s'.\n");
|
||||
DEBUGPR (_("Recently tried and failed to update file `%s'.\n"));
|
||||
no_rule_error(file);
|
||||
return file->update_status;
|
||||
}
|
||||
|
||||
DEBUGPR ("File `%s' was considered already.\n");
|
||||
DEBUGPR (_("File `%s' was considered already.\n"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -394,10 +390,10 @@ update_file_1 (file, depth)
|
||||
case cs_deps_running:
|
||||
break;
|
||||
case cs_running:
|
||||
DEBUGPR ("Still updating file `%s'.\n");
|
||||
DEBUGPR (_("Still updating file `%s'.\n"));
|
||||
return 0;
|
||||
case cs_finished:
|
||||
DEBUGPR ("Finished updating file `%s'.\n");
|
||||
DEBUGPR (_("Finished updating file `%s'.\n"));
|
||||
return file->update_status;
|
||||
default:
|
||||
abort ();
|
||||
@@ -418,7 +414,7 @@ update_file_1 (file, depth)
|
||||
check_renamed (file);
|
||||
noexist = this_mtime == (FILE_TIMESTAMP) -1;
|
||||
if (noexist)
|
||||
DEBUGPR ("File `%s' does not exist.\n");
|
||||
DEBUGPR (_("File `%s' does not exist.\n"));
|
||||
|
||||
must_make = noexist;
|
||||
|
||||
@@ -428,15 +424,15 @@ update_file_1 (file, depth)
|
||||
if (!file->phony && file->cmds == 0 && !file->tried_implicit)
|
||||
{
|
||||
if (try_implicit_rule (file, depth))
|
||||
DEBUGPR ("Found an implicit rule for `%s'.\n");
|
||||
DEBUGPR (_("Found an implicit rule for `%s'.\n"));
|
||||
else
|
||||
DEBUGPR ("No implicit rule found for `%s'.\n");
|
||||
DEBUGPR (_("No implicit rule found for `%s'.\n"));
|
||||
file->tried_implicit = 1;
|
||||
}
|
||||
if (file->cmds == 0 && !file->is_target
|
||||
&& default_file != 0 && default_file->cmds != 0)
|
||||
{
|
||||
DEBUGPR ("Using default commands for `%s'.\n");
|
||||
DEBUGPR (_("Using default commands for `%s'.\n"));
|
||||
file->cmds = default_file->cmds;
|
||||
}
|
||||
|
||||
@@ -456,7 +452,7 @@ update_file_1 (file, depth)
|
||||
|
||||
if (d->file->updating)
|
||||
{
|
||||
error (NILF, "Circular %s <- %s dependency dropped.",
|
||||
error (NILF, _("Circular %s <- %s dependency dropped."),
|
||||
file->name, d->file->name);
|
||||
/* We cannot free D here because our the caller will still have
|
||||
a reference to it when we were called recursively via
|
||||
@@ -534,13 +530,13 @@ update_file_1 (file, depth)
|
||||
|
||||
file->updating = 0;
|
||||
|
||||
DEBUGPR ("Finished dependencies of target file `%s'.\n");
|
||||
DEBUGPR (_("Finished dependencies of target file `%s'.\n"));
|
||||
|
||||
if (running)
|
||||
{
|
||||
set_command_state (file, cs_deps_running);
|
||||
--depth;
|
||||
DEBUGPR ("The dependencies of `%s' are being made.\n");
|
||||
DEBUGPR (_("The dependencies of `%s' are being made.\n"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -553,11 +549,11 @@ update_file_1 (file, depth)
|
||||
|
||||
depth--;
|
||||
|
||||
DEBUGPR ("Giving up on target file `%s'.\n");
|
||||
DEBUGPR (_("Giving up on target file `%s'.\n"));
|
||||
|
||||
if (depth == 0 && keep_going_flag
|
||||
&& !just_print_flag && !question_flag)
|
||||
error (NILF, "Target `%s' not remade because of errors.", file->name);
|
||||
error (NILF, _("Target `%s' not remade because of errors."), file->name);
|
||||
|
||||
return dep_status;
|
||||
}
|
||||
@@ -602,10 +598,10 @@ update_file_1 (file, depth)
|
||||
{
|
||||
print_spaces (depth);
|
||||
if (d_mtime == (FILE_TIMESTAMP) -1)
|
||||
printf ("Dependency `%s' does not exist.\n", dep_name (d));
|
||||
printf (_("Dependency `%s' does not exist.\n"), dep_name (d));
|
||||
else
|
||||
printf ("Dependency `%s' is %s than dependent `%s'.\n",
|
||||
dep_name (d), d->changed ? "newer" : "older", file->name);
|
||||
printf (_("Dependency `%s' is %s than dependent `%s'.\n"),
|
||||
dep_name (d), d->changed ? _("newer") : _("older"), file->name);
|
||||
fflush (stdout);
|
||||
}
|
||||
}
|
||||
@@ -616,12 +612,12 @@ update_file_1 (file, depth)
|
||||
if (file->double_colon && file->deps == 0)
|
||||
{
|
||||
must_make = 1;
|
||||
DEBUGPR ("Target `%s' is double-colon and has no dependencies.\n");
|
||||
DEBUGPR (_("Target `%s' is double-colon and has no dependencies.\n"));
|
||||
}
|
||||
else if (!noexist && file->is_target && !deps_changed && file->cmds == 0)
|
||||
{
|
||||
must_make = 0;
|
||||
DEBUGPR ("No commands for `%s' and no dependencies actually changed.\n");
|
||||
DEBUGPR (_("No commands for `%s' and no dependencies actually changed.\n"));
|
||||
}
|
||||
|
||||
if (!must_make)
|
||||
@@ -629,9 +625,9 @@ update_file_1 (file, depth)
|
||||
if (debug_flag)
|
||||
{
|
||||
print_spaces(depth);
|
||||
printf("No need to remake target `%s'", file->name);
|
||||
printf(_("No need to remake target `%s'"), file->name);
|
||||
if (!streq(file->name, file->hname))
|
||||
printf("; using VPATH name `%s'", file->hname);
|
||||
printf(_("; using VPATH name `%s'"), file->hname);
|
||||
printf(".\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
@@ -651,7 +647,7 @@ update_file_1 (file, depth)
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEBUGPR ("Must remake target `%s'.\n");
|
||||
DEBUGPR (_("Must remake target `%s'.\n"));
|
||||
|
||||
/* It needs to be remade. If it's VPATH and not reset via GPATH, toss the
|
||||
VPATH. */
|
||||
@@ -660,7 +656,7 @@ update_file_1 (file, depth)
|
||||
if (debug_flag)
|
||||
{
|
||||
print_spaces (depth);
|
||||
printf(" Ignoring VPATH name `%s'.\n", file->hname);
|
||||
printf(_(" Ignoring VPATH name `%s'.\n"), file->hname);
|
||||
fflush(stdout);
|
||||
}
|
||||
file->ignore_vpath = 1;
|
||||
@@ -671,20 +667,20 @@ update_file_1 (file, depth)
|
||||
|
||||
if (file->command_state != cs_finished)
|
||||
{
|
||||
DEBUGPR ("Commands of `%s' are being run.\n");
|
||||
DEBUGPR (_("Commands of `%s' are being run.\n"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (file->update_status)
|
||||
{
|
||||
case 2:
|
||||
DEBUGPR ("Failed to remake target file `%s'.\n");
|
||||
DEBUGPR (_("Failed to remake target file `%s'.\n"));
|
||||
break;
|
||||
case 0:
|
||||
DEBUGPR ("Successfully remade target file `%s'.\n");
|
||||
DEBUGPR (_("Successfully remade target file `%s'.\n"));
|
||||
break;
|
||||
case 1:
|
||||
DEBUGPR ("Target file `%s' needs remade under -q.\n");
|
||||
DEBUGPR (_("Target file `%s' needs remade under -q.\n"));
|
||||
break;
|
||||
default:
|
||||
assert (file->update_status >= 0 && file->update_status <= 2);
|
||||
@@ -823,15 +819,15 @@ check_dep (file, depth, this_mtime, must_make_ptr)
|
||||
if (!file->phony && file->cmds == 0 && !file->tried_implicit)
|
||||
{
|
||||
if (try_implicit_rule (file, depth))
|
||||
DEBUGPR ("Found an implicit rule for `%s'.\n");
|
||||
DEBUGPR (_("Found an implicit rule for `%s'.\n"));
|
||||
else
|
||||
DEBUGPR ("No implicit rule found for `%s'.\n");
|
||||
DEBUGPR (_("No implicit rule found for `%s'.\n"));
|
||||
file->tried_implicit = 1;
|
||||
}
|
||||
if (file->cmds == 0 && !file->is_target
|
||||
&& default_file != 0 && default_file->cmds != 0)
|
||||
{
|
||||
DEBUGPR ("Using default commands for `%s'.\n");
|
||||
DEBUGPR (_("Using default commands for `%s'.\n"));
|
||||
file->cmds = default_file->cmds;
|
||||
}
|
||||
|
||||
@@ -855,7 +851,7 @@ check_dep (file, depth, this_mtime, must_make_ptr)
|
||||
{
|
||||
if (d->file->updating)
|
||||
{
|
||||
error (NILF, "Circular %s <- %s dependency dropped.",
|
||||
error (NILF, _("Circular %s <- %s dependency dropped."),
|
||||
file->name, d->file->name);
|
||||
if (lastd == 0)
|
||||
{
|
||||
@@ -922,13 +918,10 @@ touch_file (file)
|
||||
char buf;
|
||||
int status;
|
||||
|
||||
#ifdef EINTR
|
||||
do
|
||||
#endif
|
||||
status = fstat (fd, &statbuf);
|
||||
#ifdef EINTR
|
||||
while (status < 0 && errno == EINTR);
|
||||
#endif
|
||||
while (status < 0 && EINTR_SET);
|
||||
|
||||
if (status < 0)
|
||||
TOUCH_ERROR ("touch: fstat: ");
|
||||
/* Rewrite character 0 same as it already is. */
|
||||
@@ -1152,7 +1145,7 @@ f_mtime (file, search)
|
||||
|
||||
file_timestamp_sprintf (mtimebuf, mtime);
|
||||
file_timestamp_sprintf (nowbuf, now);
|
||||
error (NILF, "*** Warning: File `%s' has modification time in the future (%s > %s)",
|
||||
error (NILF, _("*** Warning: File `%s' has modification time in the future (%s > %s)"),
|
||||
file->name, mtimebuf, nowbuf);
|
||||
clock_skew_detected = 1;
|
||||
}
|
||||
@@ -1266,7 +1259,7 @@ library_search (lib, mtime_ptr)
|
||||
{
|
||||
/* Give a warning if there is no pattern, then remove the
|
||||
pattern so it's ignored next time. */
|
||||
error (NILF, ".LIBPATTERNS element `%s' is not a pattern", p);
|
||||
error (NILF, _(".LIBPATTERNS element `%s' is not a pattern"), p);
|
||||
for (; len; --len, ++p)
|
||||
*p = ' ';
|
||||
*p = c;
|
||||
|
||||
14
rule.c
14
rule.c
@@ -664,10 +664,10 @@ print_rule_data_base ()
|
||||
}
|
||||
|
||||
if (rules == 0)
|
||||
puts ("\n# No implicit rules.");
|
||||
puts (_("\n# No implicit rules."));
|
||||
else
|
||||
{
|
||||
printf ("\n# %u implicit rules, %u", rules, terminal);
|
||||
printf (_("\n# %u implicit rules, %u"), rules, terminal);
|
||||
#ifndef NO_FLOAT
|
||||
printf (" (%.1f%%)", (double) terminal / (double) rules * 100.0);
|
||||
#else
|
||||
@@ -676,7 +676,7 @@ print_rule_data_base ()
|
||||
printf (" (%d.%d%%)", f/10, f%10);
|
||||
}
|
||||
#endif
|
||||
puts (" terminal.");
|
||||
puts (_(" terminal."));
|
||||
}
|
||||
|
||||
if (num_pattern_rules != rules)
|
||||
@@ -684,11 +684,11 @@ print_rule_data_base ()
|
||||
/* This can happen if a fatal error was detected while reading the
|
||||
makefiles and thus count_implicit_rule_limits wasn't called yet. */
|
||||
if (num_pattern_rules != 0)
|
||||
fatal (NILF, "BUG: num_pattern_rules wrong! %u != %u",
|
||||
fatal (NILF, _("BUG: num_pattern_rules wrong! %u != %u"),
|
||||
num_pattern_rules, rules);
|
||||
}
|
||||
|
||||
puts ("\n# Pattern-specific variable values");
|
||||
puts (_("\n# Pattern-specific variable values"));
|
||||
|
||||
{
|
||||
struct pattern_var *p;
|
||||
@@ -703,10 +703,10 @@ print_rule_data_base ()
|
||||
}
|
||||
|
||||
if (rules == 0)
|
||||
puts ("\n# No pattern-specific variable values.");
|
||||
puts (_("\n# No pattern-specific variable values."));
|
||||
else
|
||||
{
|
||||
printf ("\n# %u pattern-specific variable values", rules);
|
||||
printf (_("\n# %u pattern-specific variable values"), rules);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
90
signame.c
90
signame.c
@@ -17,9 +17,7 @@
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#include "make.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h> /* Some systems need this for <signal.h>. */
|
||||
@@ -56,7 +54,7 @@
|
||||
/* There is too much variation in Sys V signal numbers and names, so
|
||||
we must initialize them at runtime. */
|
||||
|
||||
static const char undoc[] = "unknown signal";
|
||||
static const char *undoc;
|
||||
|
||||
const char *sys_siglist[NSIG];
|
||||
|
||||
@@ -109,6 +107,10 @@ signame_init ()
|
||||
{
|
||||
#ifndef HAVE_SYS_SIGLIST
|
||||
int i;
|
||||
char *u = _("unknown signal");
|
||||
|
||||
undoc = xstrdup(u);
|
||||
|
||||
/* Initialize signal names. */
|
||||
for (i = 0; i < NSIG; i++)
|
||||
sys_siglist[i] = undoc;
|
||||
@@ -116,135 +118,135 @@ signame_init ()
|
||||
|
||||
/* Initialize signal names. */
|
||||
#if defined (SIGHUP)
|
||||
init_sig (SIGHUP, "HUP", "Hangup");
|
||||
init_sig (SIGHUP, "HUP", _("Hangup"));
|
||||
#endif
|
||||
#if defined (SIGINT)
|
||||
init_sig (SIGINT, "INT", "Interrupt");
|
||||
init_sig (SIGINT, "INT", _("Interrupt"));
|
||||
#endif
|
||||
#if defined (SIGQUIT)
|
||||
init_sig (SIGQUIT, "QUIT", "Quit");
|
||||
init_sig (SIGQUIT, "QUIT", _("Quit"));
|
||||
#endif
|
||||
#if defined (SIGILL)
|
||||
init_sig (SIGILL, "ILL", "Illegal Instruction");
|
||||
init_sig (SIGILL, "ILL", _("Illegal Instruction"));
|
||||
#endif
|
||||
#if defined (SIGTRAP)
|
||||
init_sig (SIGTRAP, "TRAP", "Trace/breakpoint trap");
|
||||
init_sig (SIGTRAP, "TRAP", _("Trace/breakpoint trap"));
|
||||
#endif
|
||||
/* If SIGIOT == SIGABRT, we want to print it as SIGABRT because
|
||||
SIGABRT is in ANSI and POSIX.1 and SIGIOT isn't. */
|
||||
#if defined (SIGABRT)
|
||||
init_sig (SIGABRT, "ABRT", "Aborted");
|
||||
init_sig (SIGABRT, "ABRT", _("Aborted"));
|
||||
#endif
|
||||
#if defined (SIGIOT)
|
||||
init_sig (SIGIOT, "IOT", "IOT trap");
|
||||
init_sig (SIGIOT, "IOT", _("IOT trap"));
|
||||
#endif
|
||||
#if defined (SIGEMT)
|
||||
init_sig (SIGEMT, "EMT", "EMT trap");
|
||||
init_sig (SIGEMT, "EMT", _("EMT trap"));
|
||||
#endif
|
||||
#if defined (SIGFPE)
|
||||
init_sig (SIGFPE, "FPE", "Floating point exception");
|
||||
init_sig (SIGFPE, "FPE", _("Floating point exception"));
|
||||
#endif
|
||||
#if defined (SIGKILL)
|
||||
init_sig (SIGKILL, "KILL", "Killed");
|
||||
init_sig (SIGKILL, "KILL", _("Killed"));
|
||||
#endif
|
||||
#if defined (SIGBUS)
|
||||
init_sig (SIGBUS, "BUS", "Bus error");
|
||||
init_sig (SIGBUS, "BUS", _("Bus error"));
|
||||
#endif
|
||||
#if defined (SIGSEGV)
|
||||
init_sig (SIGSEGV, "SEGV", "Segmentation fault");
|
||||
init_sig (SIGSEGV, "SEGV", _("Segmentation fault"));
|
||||
#endif
|
||||
#if defined (SIGSYS)
|
||||
init_sig (SIGSYS, "SYS", "Bad system call");
|
||||
init_sig (SIGSYS, "SYS", _("Bad system call"));
|
||||
#endif
|
||||
#if defined (SIGPIPE)
|
||||
init_sig (SIGPIPE, "PIPE", "Broken pipe");
|
||||
init_sig (SIGPIPE, "PIPE", _("Broken pipe"));
|
||||
#endif
|
||||
#if defined (SIGALRM)
|
||||
init_sig (SIGALRM, "ALRM", "Alarm clock");
|
||||
init_sig (SIGALRM, "ALRM", _("Alarm clock"));
|
||||
#endif
|
||||
#if defined (SIGTERM)
|
||||
init_sig (SIGTERM, "TERM", "Terminated");
|
||||
init_sig (SIGTERM, "TERM", _("Terminated"));
|
||||
#endif
|
||||
#if defined (SIGUSR1)
|
||||
init_sig (SIGUSR1, "USR1", "User defined signal 1");
|
||||
init_sig (SIGUSR1, "USR1", _("User defined signal 1"));
|
||||
#endif
|
||||
#if defined (SIGUSR2)
|
||||
init_sig (SIGUSR2, "USR2", "User defined signal 2");
|
||||
init_sig (SIGUSR2, "USR2", _("User defined signal 2"));
|
||||
#endif
|
||||
/* If SIGCLD == SIGCHLD, we want to print it as SIGCHLD because that
|
||||
is what is in POSIX.1. */
|
||||
#if defined (SIGCHLD)
|
||||
init_sig (SIGCHLD, "CHLD", "Child exited");
|
||||
init_sig (SIGCHLD, "CHLD", _("Child exited"));
|
||||
#endif
|
||||
#if defined (SIGCLD)
|
||||
init_sig (SIGCLD, "CLD", "Child exited");
|
||||
init_sig (SIGCLD, "CLD", _("Child exited"));
|
||||
#endif
|
||||
#if defined (SIGPWR)
|
||||
init_sig (SIGPWR, "PWR", "Power failure");
|
||||
init_sig (SIGPWR, "PWR", _("Power failure"));
|
||||
#endif
|
||||
#if defined (SIGTSTP)
|
||||
init_sig (SIGTSTP, "TSTP", "Stopped");
|
||||
init_sig (SIGTSTP, "TSTP", _("Stopped"));
|
||||
#endif
|
||||
#if defined (SIGTTIN)
|
||||
init_sig (SIGTTIN, "TTIN", "Stopped (tty input)");
|
||||
init_sig (SIGTTIN, "TTIN", _("Stopped (tty input)"));
|
||||
#endif
|
||||
#if defined (SIGTTOU)
|
||||
init_sig (SIGTTOU, "TTOU", "Stopped (tty output)");
|
||||
init_sig (SIGTTOU, "TTOU", _("Stopped (tty output)"));
|
||||
#endif
|
||||
#if defined (SIGSTOP)
|
||||
init_sig (SIGSTOP, "STOP", "Stopped (signal)");
|
||||
init_sig (SIGSTOP, "STOP", _("Stopped (signal)"));
|
||||
#endif
|
||||
#if defined (SIGXCPU)
|
||||
init_sig (SIGXCPU, "XCPU", "CPU time limit exceeded");
|
||||
init_sig (SIGXCPU, "XCPU", _("CPU time limit exceeded"));
|
||||
#endif
|
||||
#if defined (SIGXFSZ)
|
||||
init_sig (SIGXFSZ, "XFSZ", "File size limit exceeded");
|
||||
init_sig (SIGXFSZ, "XFSZ", _("File size limit exceeded"));
|
||||
#endif
|
||||
#if defined (SIGVTALRM)
|
||||
init_sig (SIGVTALRM, "VTALRM", "Virtual timer expired");
|
||||
init_sig (SIGVTALRM, "VTALRM", _("Virtual timer expired"));
|
||||
#endif
|
||||
#if defined (SIGPROF)
|
||||
init_sig (SIGPROF, "PROF", "Profiling timer expired");
|
||||
init_sig (SIGPROF, "PROF", _("Profiling timer expired"));
|
||||
#endif
|
||||
#if defined (SIGWINCH)
|
||||
/* "Window size changed" might be more accurate, but even if that
|
||||
is all that it means now, perhaps in the future it will be
|
||||
extended to cover other kinds of window changes. */
|
||||
init_sig (SIGWINCH, "WINCH", "Window changed");
|
||||
init_sig (SIGWINCH, "WINCH", _("Window changed"));
|
||||
#endif
|
||||
#if defined (SIGCONT)
|
||||
init_sig (SIGCONT, "CONT", "Continued");
|
||||
init_sig (SIGCONT, "CONT", _("Continued"));
|
||||
#endif
|
||||
#if defined (SIGURG)
|
||||
init_sig (SIGURG, "URG", "Urgent I/O condition");
|
||||
init_sig (SIGURG, "URG", _("Urgent I/O condition"));
|
||||
#endif
|
||||
#if defined (SIGIO)
|
||||
/* "I/O pending" has also been suggested. A disadvantage is
|
||||
that signal only happens when the process has
|
||||
asked for it, not everytime I/O is pending. Another disadvantage
|
||||
is the confusion from giving it a different name than under Unix. */
|
||||
init_sig (SIGIO, "IO", "I/O possible");
|
||||
init_sig (SIGIO, "IO", _("I/O possible"));
|
||||
#endif
|
||||
#if defined (SIGWIND)
|
||||
init_sig (SIGWIND, "WIND", "SIGWIND");
|
||||
init_sig (SIGWIND, "WIND", _("SIGWIND"));
|
||||
#endif
|
||||
#if defined (SIGPHONE)
|
||||
init_sig (SIGPHONE, "PHONE", "SIGPHONE");
|
||||
init_sig (SIGPHONE, "PHONE", _("SIGPHONE"));
|
||||
#endif
|
||||
#if defined (SIGPOLL)
|
||||
init_sig (SIGPOLL, "POLL", "I/O possible");
|
||||
init_sig (SIGPOLL, "POLL", _("I/O possible"));
|
||||
#endif
|
||||
#if defined (SIGLOST)
|
||||
init_sig (SIGLOST, "LOST", "Resource lost");
|
||||
init_sig (SIGLOST, "LOST", _("Resource lost"));
|
||||
#endif
|
||||
#if defined (SIGDANGER)
|
||||
init_sig (SIGDANGER, "DANGER", "Danger signal");
|
||||
init_sig (SIGDANGER, "DANGER", _("Danger signal"));
|
||||
#endif
|
||||
#if defined (SIGINFO)
|
||||
init_sig (SIGINFO, "INFO", "Information request");
|
||||
init_sig (SIGINFO, "INFO", _("Information request"));
|
||||
#endif
|
||||
#if defined (SIGNOFP)
|
||||
init_sig (SIGNOFP, "NOFP", "Floating point co-processor not available");
|
||||
init_sig (SIGNOFP, "NOFP", _("Floating point co-processor not available"));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
16
variable.c
16
variable.c
@@ -768,7 +768,7 @@ try_variable_definition (flocp, line, origin)
|
||||
expanded_name = allocated_variable_expand (name);
|
||||
|
||||
if (expanded_name[0] == '\0')
|
||||
fatal (flocp, "empty variable name");
|
||||
fatal (flocp, _("empty variable name"));
|
||||
|
||||
/* Calculate the variable's new value in VALUE. */
|
||||
|
||||
@@ -1043,21 +1043,21 @@ print_variable_set (set, prefix)
|
||||
}
|
||||
|
||||
if (nvariables == 0)
|
||||
puts ("# No variables.");
|
||||
puts (_("# No variables."));
|
||||
else
|
||||
{
|
||||
printf ("# %u variables in %u hash buckets.\n",
|
||||
printf (_("# %u variables in %u hash buckets.\n"),
|
||||
nvariables, set->buckets);
|
||||
#ifndef NO_FLOAT
|
||||
printf ("# average of %.1f variables per bucket, \
|
||||
max %u in one bucket.\n",
|
||||
printf (_("# average of %.1f variables per bucket, \
|
||||
max %u in one bucket.\n"),
|
||||
(double) nvariables / (double) set->buckets,
|
||||
per_bucket);
|
||||
#else
|
||||
{
|
||||
int f = (nvariables * 1000 + 5) / set->buckets;
|
||||
printf ("# average of %d.%d variables per bucket, \
|
||||
max %u in one bucket.\n",
|
||||
printf (_("# average of %d.%d variables per bucket, \
|
||||
max %u in one bucket.\n"),
|
||||
f/10, f%10,
|
||||
per_bucket);
|
||||
}
|
||||
@@ -1071,7 +1071,7 @@ max %u in one bucket.\n",
|
||||
void
|
||||
print_variable_data_base ()
|
||||
{
|
||||
puts ("\n# Variables\n");
|
||||
puts (_("\n# Variables\n"));
|
||||
|
||||
print_variable_set (&global_variable_set, "");
|
||||
}
|
||||
|
||||
10
vpath.c
10
vpath.c
@@ -549,7 +549,7 @@ print_vpath_data_base ()
|
||||
register unsigned int nvpaths;
|
||||
register struct vpath *v;
|
||||
|
||||
puts ("\n# VPATH Search Paths\n");
|
||||
puts (_("\n# VPATH Search Paths\n"));
|
||||
|
||||
nvpaths = 0;
|
||||
for (v = vpaths; v != 0; v = v->next)
|
||||
@@ -566,18 +566,18 @@ print_vpath_data_base ()
|
||||
}
|
||||
|
||||
if (vpaths == 0)
|
||||
puts ("# No `vpath' search paths.");
|
||||
puts (_("# No `vpath' search paths."));
|
||||
else
|
||||
printf ("\n# %u `vpath' search paths.\n", nvpaths);
|
||||
printf (_("\n# %u `vpath' search paths.\n"), nvpaths);
|
||||
|
||||
if (general_vpath == 0)
|
||||
puts ("\n# No general (`VPATH' variable) search path.");
|
||||
puts (_("\n# No general (`VPATH' variable) search path."));
|
||||
else
|
||||
{
|
||||
register char **path = general_vpath->searchpath;
|
||||
register unsigned int i;
|
||||
|
||||
fputs ("\n# General (`VPATH' variable) search path:\n# ", stdout);
|
||||
fputs (_("\n# General (`VPATH' variable) search path:\n# "), stdout);
|
||||
|
||||
for (i = 0; path[i] != 0; ++i)
|
||||
printf ("%s%c", path[i],
|
||||
|
||||
Reference in New Issue
Block a user