mirror of
https://github.com/mirror/make.git
synced 2026-08-25 03:13:31 +08:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b134da5505 | ||
|
|
d0b03e9355 | ||
|
|
5dc4b92b60 | ||
|
|
b3fa4b3c7e | ||
|
|
6fa76a7d15 | ||
|
|
4ff6c62456 | ||
|
|
cbb9e38d10 | ||
|
|
9e79637ec3 | ||
|
|
e34540f79b | ||
|
|
09f1e4cf83 | ||
|
|
28ef4c4dac | ||
|
|
3a945a665e | ||
|
|
6dbd348522 | ||
|
|
a9166bb7bc | ||
|
|
4e7ee4fc01 |
@@ -22,3 +22,5 @@ sun4 i386 i386-netbsd hp300-netbsd hp300 rs6000 sun3 news800 amiga
|
||||
hp700 hp834 mips sol2 i486-linux
|
||||
|
||||
customs
|
||||
|
||||
install-sh mkinstalldirs
|
||||
|
||||
315
ChangeLog
315
ChangeLog
@@ -1,3 +1,285 @@
|
||||
1999-08-25 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* Version 3.77.94 released.
|
||||
|
||||
* main.c (main) [__MSDOS__]: If the user uses -j, warn that it's
|
||||
not supported and reset it.
|
||||
|
||||
* make.h (ISDIGIT): Obtained this from the textutils distribution.
|
||||
* main.c (decode_switches): Use it.
|
||||
* function.c (is_numeric): Use it.
|
||||
|
||||
* main.c (struct command_switch): Store the switch char in an
|
||||
unsigned char to shut up GCC about using it with ctype.h macros.
|
||||
Besides, it _is_ always unsigned.
|
||||
|
||||
1999-08-24 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* make.texinfo: Change "dependency" to "prerequisite" and
|
||||
"dependencies" to "prerequisites". Various other cleanups related
|
||||
to the terminology change.
|
||||
* file.c: Change debugging and error messages to use
|
||||
"prerequisite" instead of "dependency".
|
||||
* implicit.c: Ditto.
|
||||
* remake.c: Ditto.
|
||||
* NEWS: Document it.
|
||||
|
||||
1999-08-23 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* remake.c (update_file): Move the considered check into the
|
||||
double-colon rule loop, so we consider double-colon rules
|
||||
individually (otherwise after the first is pruned, the rest won't
|
||||
get run).
|
||||
|
||||
* README.template: Minor changes.
|
||||
|
||||
Remove the debugging features of the jobserver, so it no longer
|
||||
writes distinct tokens to the pipe. Thus, we don't need to store
|
||||
the token we get. A side effect of this is to remove a potential
|
||||
"unavailable token" situation: make-1 invokes make-2 with its
|
||||
special token and make-3 with a normal token; make-2 completes.
|
||||
Now we're waiting for make-3 but using 2 tokens; our special token
|
||||
is idle. In the new version we don't have special tokens per se,
|
||||
we merely decide if we already have a child or not. If we don't,
|
||||
we don't need a token. If we do, we have to get one to run the
|
||||
next child. Similar for putting tokens back: if we're cleaning up
|
||||
the last child, we don't put a token back. Otherwise, we do.
|
||||
|
||||
* main.c: Add a new, internal flag --jobserver-fds instead of
|
||||
overloading the meaning of -j. Remove job_slots_str and add the
|
||||
stringlist jobserver_fds.
|
||||
(struct command_switch): We don't need the int_string type.
|
||||
(switches[]): Add a new option for --jobserver-fds and remove
|
||||
conditions around -j. Make the description for the former 0 so it
|
||||
doesn't print during "make --help".
|
||||
(main): Rework jobserver parsing. If we got --jobserver-fds
|
||||
make sure it's valid. We only get one and job_slots must be 0.
|
||||
If we're the toplevel make (-jN without --jobserver-fds) create
|
||||
the pipe and write generic tokens.
|
||||
Create the stringlist struct for the submakes.
|
||||
Clean up the stringlist where necessary.
|
||||
(init_switches): Remove int_string handling.
|
||||
(print_usage): Don't print internal flags (description ptr is 0).
|
||||
(decode_switches): Remove int_string handling.
|
||||
(define_makeflags): Remove int_string handling.
|
||||
|
||||
* job.c: Remove my_job_token flag and all references to the
|
||||
child->job_token field.
|
||||
(free_job_token): Remove this and merge it into free_child().
|
||||
(reap_children): Rework the "reaped a child" logic slightly.
|
||||
Don't call defunct free_job_token anymore. Always call
|
||||
free_child, even if we're dying.
|
||||
(free_child): If we're not freeing the only child, put a token
|
||||
back in the pipe. Then, if we're dying, don't bother to free.
|
||||
(new_job): If we are using the jobserver, loop checking to see if
|
||||
a) there are no children or b) we get a token from the pipe.
|
||||
|
||||
* job.h (struct child): Remove the job_token field.
|
||||
|
||||
1999-08-20 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* variable.c (try_variable_definition): Allocate for variable
|
||||
expansion in f_append with a simple variable: if we're looking at
|
||||
target-specific variables we don't want to trash the buffer.
|
||||
Noticed by Reiner Beninga <Reiner.Beninga@mchp.siemens.de>.
|
||||
|
||||
1999-08-16 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* main.c (main) [__MSDOS__]: Mirror any backslashes in argv[0], to
|
||||
avoid problems in shell commands that use backslashes as escape
|
||||
characters.
|
||||
|
||||
1999-08-16 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* Version 3.77.93 released.
|
||||
|
||||
1999-08-13 Paul D. Smith <psmith@gnu.org
|
||||
|
||||
* function.c (func_if): New function $(if ...) based on the
|
||||
original by Han-Wen but reworked quite a bit.
|
||||
(function_table): Add it.
|
||||
* NEWS: Introduce it.
|
||||
* make.texinfo (If Function): Document it.
|
||||
|
||||
* job.c (free_job_token): Check for EINTR when writing tokens to
|
||||
the jobserver pipe.
|
||||
|
||||
1999-08-12 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
Another jobserver algorithm change. We conveniently forgot that
|
||||
the blocking bit is shared by all users of the pipe, it's not a
|
||||
per-process setting. Since we have many make processes all
|
||||
sharing the pipe we can't use the blocking bit as a signal handler
|
||||
flag. Instead, we'll dup the pipe's read FD and have the SIGCHLD
|
||||
handler close the dup'd FD. This will cause the read() to fail
|
||||
with EBADF the next time we invoke it, so we know we need to reap
|
||||
children. We then re-dup and reap.
|
||||
|
||||
* main.c (main): Define the job_rfd variable to hold the dup'd FD.
|
||||
Actually dup the read side of the pipe. Don't bother setting the
|
||||
blocking bit on the file descriptor.
|
||||
* make.h: Declare the job_rfd variable.
|
||||
* job.c (child_handler): If the dup'd jobserver pipe is open,
|
||||
close it and assign -1 to job_rfd to notify the main program that
|
||||
we got a SIGCHLD.
|
||||
(start_job_command): Close the dup'd FD before exec'ing children.
|
||||
Since we open and close this thing so often it doesn't seem
|
||||
worth it to use the close-on-exec bit.
|
||||
(new_job): Remove code for testing/setting the blocking bit.
|
||||
Instead of EAGAIN, test for EBADF. If the dup'd FD has been
|
||||
closed, re-dup it before we reap children.
|
||||
|
||||
* function.c (func_shell): Be a little more accurate about the
|
||||
length of the error string to allocate.
|
||||
|
||||
* expand.c (variable_expand_for_file): If there's no filenm info
|
||||
(say, from a builtin command) then reset reading_file to 0.
|
||||
|
||||
1999-08-09 Paul D. Smith <psmith@gnu.org>
|
||||
|
||||
* maintMakefile: Use g in sed (s///g) to replace >1 variable per
|
||||
line.
|
||||
|
||||
* Makefile.DOS.template [__MSDOS__]: Fix mostlyclean-aminfo to
|
||||
remove the right files.
|
||||
|
||||
1999-08-01 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* function.c (msdos_openpipe) [__MSDOS__]: *Really* return a FILE
|
||||
ptr.
|
||||
|
||||
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 +393,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,9 @@ 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
|
||||
-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
|
||||
|
||||
clean-aminfo:
|
||||
|
||||
|
||||
14
NEWS
14
NEWS
@@ -12,17 +12,21 @@ Please send GNU make bug reports to bug-make@gnu.org.
|
||||
|
||||
Version 3.78
|
||||
|
||||
* Two new functions, $(error ...) and $(warning ...) are provided. The
|
||||
* Two new functions, $(error ...) and $(warning ...) are available. The
|
||||
former will cause make to fail and exit immediately upon expansion of
|
||||
the function, with the text provided as the error message. The latter
|
||||
causes the text provided to be printed as a warning message, but make
|
||||
proceeds normally.
|
||||
|
||||
* A new function, $(call ...) is provided. This allows users to create
|
||||
* A new function $(call ...) is available. This allows users to create
|
||||
their own parameterized macros and invoke them later. Original
|
||||
implementation of this feature was provided by Han-Wen Nienhuys
|
||||
implementation of this function was provided by Han-Wen Nienhuys
|
||||
<hanwen@cs.uu.nl>.
|
||||
|
||||
* A new function $(if ...) is available. It provides if-then-else
|
||||
capabilities in a builtin function. Original implementation of this
|
||||
function was provided by Han-Wen Nienhuys <hanwen@cs.uu.nl>.
|
||||
|
||||
* Make defines a new variable, .LIBPATTERNS. This variable controls how
|
||||
library dependency expansion (dependencies like ``-lfoo'') is performed.
|
||||
|
||||
@@ -42,6 +46,10 @@ Version 3.78
|
||||
each other to ensure that no more than N jobs are started across all
|
||||
makes. To get the old behavior of -j back, you can configure make
|
||||
with the --disable-job-server option.
|
||||
|
||||
* The confusing term "dependency" has been replaced by the more accurate
|
||||
and standard term "prerequisite", both in the manual and in all GNU make
|
||||
output.
|
||||
|
||||
Version 3.77
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
This directory contains the %VERSION% release of GNU Make.
|
||||
All bugs reported for previous releases have been fixed.
|
||||
Some bugs surely remain.
|
||||
|
||||
See the file NEWS for the user-visible changes from previous releases.
|
||||
In addition, there have been bugs fixed.
|
||||
|
||||
For general building and installation instructions, see the file INSTALL.
|
||||
|
||||
@@ -24,6 +25,8 @@ site. There is information there about ordering hardcopy documentation.
|
||||
http://www.gnu.org/doc/doc.html
|
||||
http://www.gnu.org/manual/manual.html
|
||||
|
||||
You can also find the latest versions of GNU Make from there.
|
||||
|
||||
Please send GNU make bug reports to bug-make@gnu.org. Please see the
|
||||
section of the manual entitles `Problems and Bugs' for information on
|
||||
submitting bug reports.
|
||||
@@ -61,9 +64,5 @@ debug this code, you can do `make check-loadavg' to see if it works
|
||||
properly on your system. (You must run `configure' beforehand, but you
|
||||
need not build Make itself to run this test.)
|
||||
|
||||
See the file NEWS for what has changed since previous releases.
|
||||
|
||||
GNU Make is fully documented in make.texinfo. See the section entitled
|
||||
`Problems and Bugs' for information on submitting bug reports.
|
||||
|
||||
GNU Make is free software. See the file COPYING for copying conditions.
|
||||
|
||||
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.94)
|
||||
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. */
|
||||
|
||||
12
expand.c
12
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)
|
||||
{
|
||||
@@ -441,7 +442,10 @@ variable_expand_for_file (line, file)
|
||||
|
||||
save = current_variable_set_list;
|
||||
current_variable_set_list = file->variables;
|
||||
reading_file = &file->cmds->fileinfo;
|
||||
if (file->cmds && file->cmds->fileinfo.filenm)
|
||||
reading_file = &file->cmds->fileinfo;
|
||||
else
|
||||
reading_file = 0;
|
||||
fnext = file->variables->next;
|
||||
/* See if there's a pattern-specific variable struct for this target. */
|
||||
if (!file->pat_searched)
|
||||
|
||||
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 (prerequisite of .PRECIOUS)."));
|
||||
if (f->phony)
|
||||
puts ("# Phony target (dependency of .PHONY).");
|
||||
puts (_("# Phony target (prerequisite 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 prerequisite."));
|
||||
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
|
||||
}
|
||||
|
||||
184
function.c
184
function.c
@@ -699,16 +699,13 @@ int
|
||||
is_numeric (p)
|
||||
char *p;
|
||||
{
|
||||
char *end = p + strlen (p) -1;
|
||||
char *end = p + strlen (p) - 1;
|
||||
char *beg = p;
|
||||
strip_whitespace (&p, &end);
|
||||
while (p <= end)
|
||||
{
|
||||
if (!isdigit (*p))
|
||||
return 0;
|
||||
|
||||
p++;
|
||||
}
|
||||
while (p <= end)
|
||||
if (!ISDIGIT (*(p++))) /* ISDIGIT only evals its arg once: see make.h. */
|
||||
return 0;
|
||||
|
||||
return (end - beg >= 0);
|
||||
}
|
||||
@@ -735,11 +732,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 +761,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]);
|
||||
|
||||
@@ -817,9 +814,9 @@ func_foreach (o, argv, funcname)
|
||||
const char *funcname;
|
||||
{
|
||||
/* expand only the first two. */
|
||||
char *varname = expand_argument (argv[0], argv[1] -1);
|
||||
char *varname = expand_argument (argv[0], argv[1] - 1);
|
||||
char *list = expand_argument (argv[1], argv[2] -1);
|
||||
char *body = savestring (argv[2], argv[3] - argv[2] -1 );
|
||||
char *body = savestring (argv[2], argv[3] - argv[2] - 1);
|
||||
|
||||
int len =0;
|
||||
char *list_iterator = list;
|
||||
@@ -1075,6 +1072,68 @@ func_sort (o, argv, funcname)
|
||||
return o;
|
||||
}
|
||||
|
||||
/*
|
||||
$(if condition,true-part[,false-part])
|
||||
|
||||
CONDITION is false iff it evaluates to an empty string. White
|
||||
space before and after condition are stripped before evaluation.
|
||||
|
||||
If CONDITION is true, then TRUE-PART is evaluated, otherwise FALSE-PART is
|
||||
evaluated (if it exists). Because only one of the two PARTs is evaluated,
|
||||
you can use $(if ...) to create side-effects (with $(shell ...), for
|
||||
example).
|
||||
*/
|
||||
|
||||
static char *
|
||||
func_if (o, argv, funcname)
|
||||
char *o;
|
||||
char **argv;
|
||||
const char *funcname;
|
||||
{
|
||||
char *begp = argv[0];
|
||||
char *endp = argv[1]-1;
|
||||
int result = 0;
|
||||
|
||||
/* Find the result of the condition: if we have a value, and it's not
|
||||
empty, the condition is true. If we don't have a value, or it's the
|
||||
empty string, then it's false. */
|
||||
|
||||
strip_whitespace (&begp, &endp);
|
||||
|
||||
if (begp < endp)
|
||||
{
|
||||
char *expansion = expand_argument (begp, endp);
|
||||
|
||||
result = strlen (expansion);
|
||||
free (expansion);
|
||||
}
|
||||
|
||||
/* If the result is true (1) we want to eval the first argument, and if
|
||||
it's false (0) we want to eval the second. If the argument doesn't
|
||||
exist we do nothing, otherwise expand it and add to the buffer. */
|
||||
|
||||
argv += 1 + !result;
|
||||
|
||||
if (argv[0] != NULL && argv[1] != NULL)
|
||||
{
|
||||
char *expansion;
|
||||
char **endp = argv+1;
|
||||
|
||||
/* If we're doing the else-clause, make sure we concatenate any
|
||||
potential extra arguments into the last argument. */
|
||||
if (!result)
|
||||
while (*endp && **endp != '\0')
|
||||
++endp;
|
||||
|
||||
expansion = expand_argument (*argv, *endp-1);
|
||||
|
||||
o = variable_buffer_output (o, expansion, strlen (expansion));
|
||||
free (expansion);
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
static char *
|
||||
func_wildcard(o, argv, funcname)
|
||||
char *o;
|
||||
@@ -1156,7 +1215,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 +1226,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 +1249,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 +1262,11 @@ windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp)
|
||||
|
||||
|
||||
#ifdef __MSDOS__
|
||||
/*
|
||||
untested
|
||||
*/
|
||||
int
|
||||
FILE *
|
||||
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 +1290,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 +1308,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 +1366,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)+11+4);
|
||||
sprintf (error_prefix,
|
||||
"%s:%lu: ", reading_file->filenm, reading_file->lineno);
|
||||
|
||||
}
|
||||
else
|
||||
error_prefix = "";
|
||||
@@ -1322,11 +1378,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 +1440,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 +1457,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);
|
||||
}
|
||||
@@ -1553,54 +1605,6 @@ func_not (char* o, char **argv, char *funcname)
|
||||
o = variable_buffer_output (o, result ? "1" : "", result);
|
||||
return o;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
This is an experimental conditional function.
|
||||
|
||||
Syntax:
|
||||
|
||||
$(if condition, true-part, false-part)
|
||||
|
||||
This is fully not consistent with make's syntax, but more in line
|
||||
with `normal' programming languages.
|
||||
|
||||
Semantics:
|
||||
|
||||
- CONDITION is false iff it evaluates to an empty string. White
|
||||
space before and after condition are stripped before evaluation.
|
||||
|
||||
- If CONDITION is true, then TRUE-PART is evaluated, otherwise
|
||||
FALSE-PART is evaluated. Because only one of the two PARTs is
|
||||
evaluated, you can use $(if ) to create side-effects with the
|
||||
$(shell ) function
|
||||
|
||||
*/
|
||||
static char *
|
||||
func_if (char* o, char **argv, char *funcname)
|
||||
{
|
||||
char *begp = argv[0];
|
||||
char *endp = argv[1]-2;
|
||||
char *expansion =0;
|
||||
int result = 0;
|
||||
|
||||
strip_whitespace (&begp, &endp);
|
||||
if(begp <= endp)
|
||||
expansion = expand_argument (begp, endp + 1);
|
||||
|
||||
result = expansion
|
||||
? strlen (expansion)
|
||||
: 0;
|
||||
|
||||
result = !result;
|
||||
free (expansion);
|
||||
|
||||
expansion = expand_argument (argv[1 + result], argv[2+result] -1);
|
||||
o = variable_buffer_output (o, expansion, strlen (expansion));
|
||||
|
||||
return o;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1652,9 +1656,9 @@ static struct function_table_entry function_table[] =
|
||||
{ STRING_SIZE_TUPLE("call"), -1, 1, func_call},
|
||||
{ STRING_SIZE_TUPLE("error"), 1, 1, func_error},
|
||||
{ STRING_SIZE_TUPLE("warning"), 1, 1, func_error},
|
||||
{ STRING_SIZE_TUPLE("if"), -2, 0, func_if},
|
||||
#ifdef EXPERIMENTAL
|
||||
{ STRING_SIZE_TUPLE("eq"), 2, 1, func_eq},
|
||||
{ STRING_SIZE_TUPLE("if"), 3, 0, func_if},
|
||||
{ STRING_SIZE_TUPLE("not"), 1, 1, func_not},
|
||||
#endif
|
||||
{ 0 }
|
||||
@@ -1676,11 +1680,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 +1740,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. */
|
||||
|
||||
25
implicit.c
25
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 prerequisite `%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 prerequisite `%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,8 +408,9 @@ 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);
|
||||
strcpy(vp, p);
|
||||
DEBUGP2 (_("Found prerequisite `%s' as VPATH `%s'\n"),
|
||||
p, vp);
|
||||
strcpy (vp, p);
|
||||
found_files[deps_found++] = vp;
|
||||
continue;
|
||||
}
|
||||
@@ -424,8 +425,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;
|
||||
|
||||
625
job.c
625
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 */
|
||||
@@ -198,6 +209,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
|
||||
/*
|
||||
@@ -205,10 +219,11 @@ int unixy_shell = 1;
|
||||
*/
|
||||
int w32_kill(int pid, int sig)
|
||||
{
|
||||
return ((process_kill(pid, sig) == TRUE) ? 0 : -1);
|
||||
return ((process_kill(pid, sig) == TRUE) ? 0 : -1);
|
||||
}
|
||||
#endif /* WINDOWS32 */
|
||||
|
||||
|
||||
/* 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 +239,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,47 +272,66 @@ 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 feature, we need it. First, installing it
|
||||
ensures the read will interrupt on SIGCHLD. Second, we close the dup'd
|
||||
read FD 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;
|
||||
|
||||
if (job_rfd >= 0)
|
||||
{
|
||||
close (job_rfd);
|
||||
job_rfd = -1;
|
||||
}
|
||||
|
||||
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)
|
||||
int block, err;
|
||||
{
|
||||
WAIT_T status;
|
||||
#ifdef WAIT_NOHANG
|
||||
/* Initially, assume we have some. */
|
||||
int reap_more = 1;
|
||||
|
||||
#ifdef WAIT_NOHANG
|
||||
# define REAP_MORE reap_more
|
||||
#else
|
||||
# define REAP_MORE dead_children
|
||||
#endif
|
||||
|
||||
/* As long as:
|
||||
|
||||
We have at least one child outstanding OR a shell function in progress,
|
||||
AND
|
||||
We're blocking for a complete child OR there are more children to reap
|
||||
|
||||
we'll keep reaping children. */
|
||||
|
||||
while ((children != 0 || shell_function_pid != 0) &&
|
||||
(block || REAP_MORE))
|
||||
{
|
||||
@@ -312,7 +346,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 +376,9 @@ 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 %s\n"),
|
||||
(unsigned long int) c, c->file->name,
|
||||
(long) c->pid, c->remote ? _(" (remote)") : "");
|
||||
#ifdef VMS
|
||||
break;
|
||||
#endif
|
||||
@@ -363,19 +397,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;
|
||||
@@ -393,16 +426,16 @@ reap_children (block, err)
|
||||
|
||||
if (pid < 0)
|
||||
{
|
||||
/* EINTR? Try again. */
|
||||
if (EINTR_SET)
|
||||
goto local_wait;
|
||||
|
||||
/* The wait*() failed miserably. Punt. */
|
||||
#ifdef EINTR
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
#endif
|
||||
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);
|
||||
@@ -410,26 +443,24 @@ reap_children (block, err)
|
||||
else
|
||||
{
|
||||
/* No local children are dead. */
|
||||
#ifdef WAIT_NOHANG
|
||||
reap_more = 0;
|
||||
#endif
|
||||
if (block && any_remote)
|
||||
{
|
||||
/* Now try a blocking wait for a remote child. */
|
||||
pid = remote_status (&exit_code, &exit_sig, &coredump, 1);
|
||||
if (pid < 0)
|
||||
goto remote_status_lose;
|
||||
else if (pid == 0)
|
||||
/* No remote children either. Finally give up. */
|
||||
break;
|
||||
else
|
||||
/* We got a remote child. */
|
||||
remote = 1;
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
if (!block || !any_remote)
|
||||
break;
|
||||
|
||||
/* Now try a blocking wait for a remote child. */
|
||||
pid = remote_status (&exit_code, &exit_sig, &coredump, 1);
|
||||
if (pid < 0)
|
||||
goto remote_status_lose;
|
||||
else if (pid == 0)
|
||||
/* No remote children either. Finally give up. */
|
||||
break;
|
||||
|
||||
/* We got a remote child. */
|
||||
remote = 1;
|
||||
}
|
||||
#endif /* !__MSDOS__, !Amiga, !WINDOWS32. */
|
||||
|
||||
#ifdef __MSDOS__
|
||||
/* Life is very different on MSDOS. */
|
||||
pid = dos_pid - 1;
|
||||
@@ -499,162 +530,147 @@ 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 %s\n"),
|
||||
child_failed ? _("losing") : _("winning"),
|
||||
(unsigned long int) c, (long) c->pid,
|
||||
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 %s from chain.\n"),
|
||||
(unsigned long int) c, (long) c->pid,
|
||||
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;
|
||||
}
|
||||
/* There is now another slot open. */
|
||||
if (job_slots_used > 0)
|
||||
--job_slots_used;
|
||||
|
||||
/* 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. */
|
||||
/* Remove the child from the chain and free it. */
|
||||
if (lastc == 0)
|
||||
children = c->next;
|
||||
else
|
||||
lastc->next = c->next;
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -664,6 +680,28 @@ static void
|
||||
free_child (child)
|
||||
register struct child *child;
|
||||
{
|
||||
/* If this child is the only one it was our "free" job, so don't put a
|
||||
token back for it. This child has already been removed from the list,
|
||||
so if there any left this wasn't the last one. */
|
||||
|
||||
if (job_fds[1] >= 0 && children)
|
||||
{
|
||||
char token = '+';
|
||||
|
||||
/* Write a job token back to the pipe. */
|
||||
|
||||
while (write (job_fds[1], &token, 1) != 1)
|
||||
if (!EINTR_SET)
|
||||
pfatal_with_name (_("write jobserver"));
|
||||
|
||||
if (debug_flag)
|
||||
printf (_("Released token for child 0x%08lx (%s).\n"),
|
||||
(unsigned long int) child, child->file->name);
|
||||
}
|
||||
|
||||
if (handling_fatal_signal) /* Don't bother free'ing if about to die. */
|
||||
return;
|
||||
|
||||
if (child->command_lines != 0)
|
||||
{
|
||||
register unsigned int i;
|
||||
@@ -680,19 +718,6 @@ 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 ((char *) child);
|
||||
}
|
||||
|
||||
@@ -764,7 +789,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;
|
||||
}
|
||||
@@ -840,17 +865,18 @@ start_job_command (child)
|
||||
? "%s" : (char *) 0, p);
|
||||
|
||||
/* Optimize an empty command. People use this for timestamp rules,
|
||||
and forking a useless shell all the time leads to inefficiency. */
|
||||
so avoid forking a useless shell. */
|
||||
|
||||
#if !defined(VMS) && !defined(_AMIGA)
|
||||
if (
|
||||
#ifdef __MSDOS__
|
||||
unixy_shell /* the test is complicated and we already did it */
|
||||
#else
|
||||
(argv[0] && !strcmp(argv[0], "/bin/sh"))
|
||||
(argv[0] && !strcmp (argv[0], "/bin/sh"))
|
||||
#endif
|
||||
&& (argv[1] && !strcmp(argv[1], "-c"))
|
||||
&& (argv[2] && !strcmp(argv[2], ":"))
|
||||
&& (argv[1]
|
||||
&& argv[1][0] == '-' && argv[1][1] == 'c' && argv[1][2] == '\0')
|
||||
&& (argv[2] && argv[2][0] == ':' && argv[2][1] == '\0')
|
||||
&& argv[3] == NULL)
|
||||
{
|
||||
free (argv[0]);
|
||||
@@ -904,12 +930,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 +1007,17 @@ 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]);
|
||||
}
|
||||
if (job_rfd >= 0)
|
||||
close (job_rfd);
|
||||
|
||||
child_execute_job (child->good_stdin ? 0 : bad_stdin, 1,
|
||||
argv, child->environment);
|
||||
}
|
||||
@@ -1090,11 +1122,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 +1167,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 +1187,9 @@ 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%s on the chain.\n"),
|
||||
(unsigned long int) c, c->file->name,
|
||||
(long) c->pid, c->remote ? _(" (remote)") : "");
|
||||
children = c;
|
||||
/* One more job slot is in use. */
|
||||
++job_slots_used;
|
||||
@@ -1251,12 +1235,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,14 +1346,69 @@ new_job (file)
|
||||
c->command_ptr = 0;
|
||||
c->environment = 0;
|
||||
c->sh_batch_file = NULL;
|
||||
c->job_token = 0;
|
||||
|
||||
/* 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 make sure we have a token before
|
||||
starting the child. */
|
||||
|
||||
/* This can be inefficient. There's a decent chance that this job won't
|
||||
actually have to run any subprocesses: the command script may be empty
|
||||
or otherwise optimized away. It would be nice if we could defer
|
||||
obtaining a token until just before we need it, in start_job_command.
|
||||
To do that we'd need to keep track of whether we'd already obtained a
|
||||
token (since start_job_command is called for each line of the job, not
|
||||
just once). Also more thought needs to go into the entire algorithm;
|
||||
this is where the old parallel job code waits, so... */
|
||||
|
||||
else if (job_fds[0] >= 0)
|
||||
while (1)
|
||||
{
|
||||
char token;
|
||||
|
||||
/* If we don't already have a job started, use our "free" token. */
|
||||
if (!children)
|
||||
break;
|
||||
|
||||
/* 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 EBADF because
|
||||
the signal handler closes the dup'd file descriptor. */
|
||||
|
||||
if (read (job_rfd, &token, 1) == 1)
|
||||
{
|
||||
if (debug_flag)
|
||||
printf (_("Obtained token for child 0x%08lx (%s).\n"),
|
||||
(unsigned long int) c, c->file->name);
|
||||
break;
|
||||
}
|
||||
|
||||
if (errno != EINTR && errno != EBADF)
|
||||
pfatal_with_name (_("read jobs pipe"));
|
||||
|
||||
/* Re-dup the read side of the pipe, so the signal handler can
|
||||
notify us if we miss a child. */
|
||||
if (job_rfd < 0)
|
||||
job_rfd = dup (job_fds[0]);
|
||||
|
||||
/* Something's done. We don't want to block for a whole child,
|
||||
just reap whatever's there. */
|
||||
reap_children (0, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* The job is now primed. Start it running.
|
||||
(This will notice if there are in fact no commands.) */
|
||||
(void)start_waiting_job (c);
|
||||
(void) start_waiting_job (c);
|
||||
|
||||
if (job_slots == 1)
|
||||
/* Since there is only one job slot, make things run linearly.
|
||||
@@ -1429,9 +1462,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 +1567,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 +1673,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 +1704,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 +1773,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 +1802,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 +1821,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 +1850,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 +2030,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;
|
||||
}
|
||||
@@ -2108,7 +2141,7 @@ construct_command_argv_internal (line, restp, shell, ifs, batch_filename_ptr)
|
||||
/* Note these overlap and strcpy() is undefined for
|
||||
overlapping objects in ANSI C. The strlen() _IS_ right,
|
||||
since we need to copy the nul byte too. */
|
||||
bcopy (p + 1, p, strlen(p));
|
||||
bcopy (p + 1, p, strlen (p));
|
||||
|
||||
if (instring)
|
||||
goto string_char;
|
||||
@@ -2276,7 +2309,7 @@ construct_command_argv_internal (line, restp, shell, ifs, batch_filename_ptr)
|
||||
}
|
||||
*dptr = 0;
|
||||
|
||||
new_argv = (char **) xmalloc(2 * sizeof(char *));
|
||||
new_argv = (char **) xmalloc (2 * sizeof (char *));
|
||||
new_argv[0] = buffer;
|
||||
new_argv[1] = 0;
|
||||
}
|
||||
@@ -2399,7 +2432,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 +2473,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
|
||||
}
|
||||
|
||||
1
job.h
1
job.h
@@ -46,7 +46,6 @@ struct child
|
||||
|
||||
unsigned int good_stdin:1; /* Nonzero if this child has a good stdin. */
|
||||
unsigned int deleted:1; /* Nonzero if targets have been deleted. */
|
||||
char job_token; /* The token read from the job pipe. */
|
||||
};
|
||||
|
||||
extern struct child *children;
|
||||
|
||||
396
main.c
396
main.c
@@ -79,14 +79,13 @@ static char *quote_as_word PARAMS ((char *out, char *in, int double_dollars));
|
||||
|
||||
struct command_switch
|
||||
{
|
||||
char c; /* The switch character. */
|
||||
unsigned char c; /* The switch character. */
|
||||
|
||||
enum /* Type of the value. */
|
||||
{
|
||||
flag, /* Turn int flag on. */
|
||||
flag_off, /* Turn int flag off. */
|
||||
string, /* One string per switch. */
|
||||
int_string, /* One string. */
|
||||
positive_int, /* A positive integer. */
|
||||
floating, /* A floating-point number (double). */
|
||||
ignore /* Ignored. */
|
||||
@@ -104,6 +103,7 @@ struct command_switch
|
||||
char *long_name; /* Long option name. */
|
||||
char *argdesc; /* Descriptive word for argument. */
|
||||
char *description; /* Description for usage message. */
|
||||
/* 0 means internal; don't display help. */
|
||||
};
|
||||
|
||||
|
||||
@@ -195,16 +195,16 @@ static struct stringlist *makefiles = 0;
|
||||
unsigned int job_slots = 1;
|
||||
unsigned int default_job_slots = 1;
|
||||
|
||||
static char *job_slots_str = "1";
|
||||
|
||||
#ifndef MAKE_JOBSERVER
|
||||
/* Value of job_slots that means no limit. */
|
||||
|
||||
static unsigned int inf_jobs = 0;
|
||||
#endif
|
||||
|
||||
/* File descriptors for the jobs pipe. */
|
||||
|
||||
static struct stringlist *jobserver_fds = 0;
|
||||
|
||||
int job_fds[2] = { -1, -1 };
|
||||
int job_rfd = -1;
|
||||
|
||||
/* Maximum load average at which multiple jobs will be run.
|
||||
Negative values mean unlimited, while zero means limit to
|
||||
@@ -249,103 +249,102 @@ 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,
|
||||
(char *) &inf_jobs, (char *) &default_job_slots,
|
||||
#else
|
||||
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") },
|
||||
{ 2, string, (char *) &jobserver_fds, 1, 1, 0, 0, 0,
|
||||
"jobserver-fds", 0,
|
||||
0 },
|
||||
{ '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" },
|
||||
{ 2, flag, (char *) &inhibit_print_directory_flag, 1, 1, 0, 0, 0,
|
||||
_("Print the current directory") },
|
||||
{ 3, 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" },
|
||||
{ 3, flag, (char *) &warn_undefined_variables_flag, 1, 1, 0, 0, 0,
|
||||
"what-if", _("FILE"),
|
||||
_("Consider FILE to be infinitely new") },
|
||||
{ 4, 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 +437,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 +503,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 +512,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 +523,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 +589,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 +631,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 +928,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
|
||||
|
||||
@@ -944,7 +943,7 @@ int main (int argc, char ** argv)
|
||||
if (print_version_flag)
|
||||
die (0);
|
||||
|
||||
#if !defined(__MSDOS__) && !defined(VMS)
|
||||
#ifndef VMS
|
||||
/* Set the "MAKE_COMMAND" variable to the name we were invoked with.
|
||||
(If it is a relative pathname with a slash, prepend our directory name
|
||||
so the result will run the same program regardless of the current dir.
|
||||
@@ -962,9 +961,21 @@ int main (int argc, char ** argv)
|
||||
strneq(argv[0], "//", 2))
|
||||
argv[0] = xstrdup(w32ify(argv[0],1));
|
||||
#else /* WINDOWS32 */
|
||||
#ifdef __MSDOS__
|
||||
if (strchr (argv[0], '\\'))
|
||||
{
|
||||
char *p;
|
||||
|
||||
argv[0] = xstrdup (argv[0]);
|
||||
for (p = argv[0]; *p; p++)
|
||||
if (*p == '\\')
|
||||
*p = '/';
|
||||
}
|
||||
#else /* !__MSDOS__ */
|
||||
if (current_directory[0] != '\0'
|
||||
&& argv[0] != 0 && argv[0][0] != '/' && index (argv[0], '/') != 0)
|
||||
argv[0] = concat (current_directory, "/", argv[0]);
|
||||
#endif /* !__MSDOS__ */
|
||||
#endif /* WINDOWS32 */
|
||||
#endif
|
||||
|
||||
@@ -1130,17 +1141,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);
|
||||
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);
|
||||
|
||||
@@ -1155,7 +1166,7 @@ int main (int argc, char ** argv)
|
||||
}
|
||||
|
||||
/* Make sure the temporary file will not be remade. */
|
||||
stdin_nm = savestring (name, sizeof(name) -1);
|
||||
stdin_nm = savestring (name, sizeof (name) -1);
|
||||
f = enter_file (stdin_nm);
|
||||
f->updated = 1;
|
||||
f->update_status = 0;
|
||||
@@ -1168,23 +1179,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 +1260,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 */
|
||||
@@ -1241,7 +1270,7 @@ int main (int argc, char ** argv)
|
||||
/* We need to know what kind of shell we will be using. */
|
||||
{
|
||||
extern int _is_unixy_shell (const char *_path);
|
||||
struct variable *shv = lookup_variable("SHELL", 5);
|
||||
struct variable *shv = lookup_variable ("SHELL", 5);
|
||||
extern int unixy_shell;
|
||||
extern char *default_shell;
|
||||
|
||||
@@ -1265,56 +1294,90 @@ int main (int argc, char ** argv)
|
||||
decode_env_switches ("MFLAGS", 6);
|
||||
#endif
|
||||
|
||||
#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, ',');
|
||||
#ifdef __MSDOS__
|
||||
if (job_slots != 1)
|
||||
{
|
||||
error (NILF, _("Parallel jobs (-j) are not supported on MS-DOS."));
|
||||
error (NILF, _("Resetting to single job mode."));
|
||||
job_slots = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (cp && sscanf(cp+1, "%d", &job_fds[1]) == 1)
|
||||
#ifdef MAKE_JOBSERVER
|
||||
/* If the jobserver-fds option is seen, make sure that -j is reasonable. */
|
||||
|
||||
if (jobserver_fds)
|
||||
{
|
||||
char *cp;
|
||||
|
||||
if (jobserver_fds->idx > 1)
|
||||
fatal (NILF, _("internal error: multiple --jobserver-fds options"));
|
||||
|
||||
/* The combination of a pipe + !job_slots means we're using the
|
||||
jobserver. If !job_slots and we don't have a pipe, we can start
|
||||
infinite jobs. */
|
||||
|
||||
if (job_slots != 0)
|
||||
fatal (NILF, _("internal error: --jobserver-fds unexpected"));
|
||||
|
||||
/* Now parse the fds string and make sure it has the proper format. */
|
||||
|
||||
cp = jobserver_fds->list[0];
|
||||
|
||||
if (sscanf (cp, "%d,%d", &job_fds[0], &job_fds[1]) != 2)
|
||||
fatal (NILF,
|
||||
_("internal error: invalid --jobserver-fds string `%s'"), cp);
|
||||
|
||||
/* Create a duplicate pipe, that will be closed in the SIGCHLD
|
||||
handler. If this fails with EBADF, the parent has closed the pipe
|
||||
on us because it didn't think we were a submake. If so, print a
|
||||
warning then default to -j1. */
|
||||
|
||||
if ((job_rfd = dup (job_fds[0])) < 0)
|
||||
{
|
||||
job_fds[0] = job_slots;
|
||||
job_slots = 0;
|
||||
if (errno != EBADF)
|
||||
pfatal_with_name (_("dup jobserver"));
|
||||
|
||||
error (NILF,
|
||||
_("warning: jobserver unavailable (using -j1). Add `+' to parent make rule."));
|
||||
job_slots = 1;
|
||||
job_fds[0] = job_fds[1] = -1;
|
||||
free (jobserver_fds->list);
|
||||
free (jobserver_fds);
|
||||
jobserver_fds = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* In case #3 above, set up the pipe and set up the submake options
|
||||
properly. */
|
||||
/* If we have >1 slot but no jobserver-fds, then we're a top-level make.
|
||||
Set up the pipe and install the fds option for our children. */
|
||||
|
||||
if (job_slots > 1)
|
||||
else if (job_slots > 1)
|
||||
{
|
||||
char buf[(sizeof("1024")*2)+1];
|
||||
char c = '0';
|
||||
char c = '+';
|
||||
|
||||
if (pipe(job_fds) < 0)
|
||||
pfatal_with_name("creating jobs pipe");
|
||||
if (pipe (job_fds) < 0 || (job_rfd = dup (job_fds[0])) < 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. We
|
||||
want job_slots to be 0 to indicate we're using the jobserver. */
|
||||
|
||||
for (; job_slots; --job_slots)
|
||||
{
|
||||
write(job_fds[1], &c, 1);
|
||||
if (c == '9')
|
||||
c = 'a';
|
||||
else if (c == 'z')
|
||||
c = 'A';
|
||||
else if (c == 'Z')
|
||||
c = '0'; /* Start over again!! */
|
||||
else
|
||||
++c;
|
||||
}
|
||||
while (--job_slots)
|
||||
while (write (job_fds[1], &c, 1) != 1)
|
||||
if (!EINTR_SET)
|
||||
pfatal_with_name (_("init jobserver pipe"));
|
||||
|
||||
sprintf(buf, "%d,%d", job_fds[0], job_fds[1]);
|
||||
job_slots_str = xstrdup(buf);
|
||||
/* Fill in the jobserver_fds struct for our children. */
|
||||
|
||||
jobserver_fds = (struct stringlist *)
|
||||
xmalloc (sizeof (struct stringlist));
|
||||
jobserver_fds->list = (char **) xmalloc (sizeof (char *));
|
||||
jobserver_fds->list[0] = xmalloc ((sizeof ("1024")*2)+1);
|
||||
|
||||
sprintf (jobserver_fds->list[0], "%d,%d", job_fds[0], job_fds[1]);
|
||||
jobserver_fds->idx = 1;
|
||||
jobserver_fds->max = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1385,7 +1448,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 +1473,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 +1547,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 +1562,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;
|
||||
}
|
||||
@@ -1550,9 +1614,9 @@ int main (int argc, char ** argv)
|
||||
/* Add -o option for the stdin temporary file, if necessary. */
|
||||
if (stdin_nm)
|
||||
{
|
||||
nargv = (char **)xmalloc((nargc + 2) * sizeof(char *));
|
||||
bcopy((char *)argv, (char *)nargv, argc * sizeof(char *));
|
||||
nargv[nargc++] = concat("-o", stdin_nm, "");
|
||||
nargv = (char **) xmalloc ((nargc + 2) * sizeof (char *));
|
||||
bcopy ((char *) argv, (char *) nargv, argc * sizeof (char *));
|
||||
nargv[nargc++] = concat ("-o", stdin_nm, "");
|
||||
nargv[nargc] = 0;
|
||||
}
|
||||
|
||||
@@ -1572,7 +1636,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 +1670,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 ("");
|
||||
@@ -1630,8 +1694,8 @@ 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);
|
||||
if (stdin_nm && unlink (stdin_nm) < 0 && errno != ENOENT)
|
||||
perror_with_name (_("unlink (temporary file): "), stdin_nm);
|
||||
|
||||
{
|
||||
int status;
|
||||
@@ -1653,15 +1717,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 +1750,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);
|
||||
@@ -1736,7 +1800,6 @@ init_switches ()
|
||||
long_options[i].has_arg = no_argument;
|
||||
break;
|
||||
|
||||
case int_string:
|
||||
case string:
|
||||
case positive_int:
|
||||
case floating:
|
||||
@@ -1797,8 +1860,7 @@ handle_non_switch_argument (arg, env)
|
||||
}
|
||||
else
|
||||
{
|
||||
lastgoal->next
|
||||
= (struct dep *) xmalloc (sizeof (struct dep));
|
||||
lastgoal->next = (struct dep *) xmalloc (sizeof (struct dep));
|
||||
lastgoal = lastgoal->next;
|
||||
}
|
||||
lastgoal->name = 0;
|
||||
@@ -1809,7 +1871,7 @@ handle_non_switch_argument (arg, env)
|
||||
struct variable *v;
|
||||
char *value;
|
||||
|
||||
v = lookup_variable("MAKECMDGOALS", 12);
|
||||
v = lookup_variable ("MAKECMDGOALS", 12);
|
||||
if (v == 0)
|
||||
value = f->name;
|
||||
else
|
||||
@@ -1817,14 +1879,14 @@ handle_non_switch_argument (arg, env)
|
||||
/* Paste the old and new values together */
|
||||
unsigned int oldlen, newlen;
|
||||
|
||||
oldlen = strlen(v->value);
|
||||
newlen = strlen(f->name);
|
||||
value = (char *)alloca(oldlen + 1 + newlen + 1);
|
||||
bcopy(v->value, value, oldlen);
|
||||
oldlen = strlen (v->value);
|
||||
newlen = strlen (f->name);
|
||||
value = (char *) alloca (oldlen + 1 + newlen + 1);
|
||||
bcopy (v->value, value, oldlen);
|
||||
value[oldlen] = ' ';
|
||||
bcopy(f->name, &value[oldlen + 1], newlen + 1);
|
||||
bcopy (f->name, &value[oldlen + 1], newlen + 1);
|
||||
}
|
||||
define_variable("MAKECMDGOALS", 12, value, o_default, 0);
|
||||
define_variable ("MAKECMDGOALS", 12, value, o_default, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1843,14 +1905,14 @@ 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;
|
||||
|
||||
if (cs->description[0] == '-')
|
||||
if (!cs->description || cs->description[0] == '-')
|
||||
continue;
|
||||
|
||||
switch (long_options[cs - switches].has_arg)
|
||||
@@ -1895,8 +1957,9 @@ print_usage (bad)
|
||||
{
|
||||
const struct command_switch *ncs = cs;
|
||||
while ((++ncs)->c != '\0')
|
||||
if (ncs->description[0] == '-' &&
|
||||
ncs->description[1] == cs->c)
|
||||
if (ncs->description
|
||||
&& ncs->description[0] == '-'
|
||||
&& ncs->description[1] == cs->c)
|
||||
{
|
||||
/* This is another switch that does the same
|
||||
one as the one we are processing. We want
|
||||
@@ -1990,20 +2053,6 @@ decode_switches (argc, argv, env)
|
||||
*(int *) cs->value_ptr = cs->type == flag;
|
||||
break;
|
||||
|
||||
case int_string:
|
||||
if (optarg == 0 && argc > optind
|
||||
&& isdigit (argv[optind][0]))
|
||||
optarg = argv[optind++];
|
||||
|
||||
if (!doit)
|
||||
break;
|
||||
|
||||
if (optarg == 0)
|
||||
optarg = cs->noarg_value;
|
||||
|
||||
*(char **)cs->value_ptr = optarg;
|
||||
break;
|
||||
|
||||
case string:
|
||||
if (!doit)
|
||||
break;
|
||||
@@ -2034,7 +2083,7 @@ decode_switches (argc, argv, env)
|
||||
|
||||
case positive_int:
|
||||
if (optarg == 0 && argc > optind
|
||||
&& isdigit (argv[optind][0]))
|
||||
&& ISDIGIT (argv[optind][0]))
|
||||
optarg = argv[optind++];
|
||||
|
||||
if (!doit)
|
||||
@@ -2046,8 +2095,7 @@ 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;
|
||||
}
|
||||
@@ -2062,7 +2110,7 @@ positive integral argument",
|
||||
#ifndef NO_FLOAT
|
||||
case floating:
|
||||
if (optarg == 0 && optind < argc
|
||||
&& (isdigit (argv[optind][0]) || argv[optind][0] == '.'))
|
||||
&& (ISDIGIT (argv[optind][0]) || argv[optind][0] == '.'))
|
||||
optarg = argv[optind++];
|
||||
|
||||
if (doit)
|
||||
@@ -2089,7 +2137,7 @@ positive integral argument",
|
||||
|
||||
if (!env && (bad || print_usage_flag))
|
||||
{
|
||||
print_usage(bad);
|
||||
print_usage (bad);
|
||||
die (bad ? 2 : 0);
|
||||
}
|
||||
}
|
||||
@@ -2302,22 +2350,6 @@ define_makeflags (all, makefile)
|
||||
break;
|
||||
#endif
|
||||
|
||||
case int_string:
|
||||
if (all)
|
||||
{
|
||||
char *vp = *(char **)cs->value_ptr;
|
||||
|
||||
if (cs->default_value != 0
|
||||
&& streq(vp, cs->default_value))
|
||||
break;
|
||||
if (cs->noarg_value != 0
|
||||
&& streq(vp, cs->noarg_value))
|
||||
ADD_FLAG("", 0); /* Optional value omitted; see below. */
|
||||
else
|
||||
ADD_FLAG(vp, strlen(vp));
|
||||
}
|
||||
break;
|
||||
|
||||
case string:
|
||||
if (all)
|
||||
{
|
||||
@@ -2486,13 +2518,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 +2542,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 +2551,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 +2606,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 +2625,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,36 +11,36 @@ 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.
|
||||
#
|
||||
$(TEMPLATES) : % : %.template configure.in
|
||||
$(TEMPLATES) : % : %.template Makefile
|
||||
rm -f $@
|
||||
sed -e 's@%VERSION%@$(VERSION)@' \
|
||||
-e 's@%PACKAGE%@$(PACKAGE)@' \
|
||||
sed -e 's@%VERSION%@$(VERSION)@g' \
|
||||
-e 's@%PACKAGE%@$(PACKAGE)@g' \
|
||||
$< > $@
|
||||
chmod a-w $@
|
||||
|
||||
# Construct Makefiles by adding on dependencies, etc.
|
||||
#
|
||||
$(MTEMPLATES) : % : %.template .dep_segment Makefile.am maintMakefile
|
||||
$(MTEMPLATES) : % : %.template .dep_segment Makefile
|
||||
rm -f $@
|
||||
sed -e 's@%VERSION%@$(VERSION)@' \
|
||||
-e 's@%PROGRAMS%@$(bin_PROGRAMS)@' \
|
||||
-e 's@%SOURCES%@$(filter-out remote-%,$(make_SOURCES)) remote-$$(REMOTE).c@' \
|
||||
-e 's@%OBJECTS%@$(filter-out remote-%,$(make_OBJECTS)) remote-$$(REMOTE).o@' \
|
||||
-e 's@%GLOB_SOURCES%@$(globsrc) $(globhdr)@' \
|
||||
-e 's@%GLOB_OBJECTS%@$(globsrc:glob/%.c=%.o)@' \
|
||||
sed -e 's@%VERSION%@$(VERSION)@g' \
|
||||
-e 's@%PROGRAMS%@$(bin_PROGRAMS)@g' \
|
||||
-e 's@%SOURCES%@$(filter-out remote-%,$(make_SOURCES)) remote-$$(REMOTE).c@g' \
|
||||
-e 's@%OBJECTS%@$(filter-out remote-%,$(make_OBJECTS)) remote-$$(REMOTE).o@g' \
|
||||
-e 's@%GLOB_SOURCES%@$(globsrc) $(globhdr)@g' \
|
||||
-e 's@%GLOB_OBJECTS%@$(globsrc:glob/%.c=%.o)@g' \
|
||||
$< > $@
|
||||
echo >>$@; echo '# --------------- DEPENDENCIES' >>$@; echo '#' >>$@; \
|
||||
cat $(word 2,$^) >>$@
|
||||
chmod a-w $@
|
||||
|
||||
NMakefile: NMakefile.template .dep_segment Makefile.am maintMakefile
|
||||
NMakefile: NMakefile.template .dep_segment Makefile
|
||||
rm -f $@
|
||||
cp $< $@
|
||||
echo >>$@; echo '# --------------- DEPENDENCIES' >>$@; echo '#' >>$@; \
|
||||
@@ -49,10 +49,10 @@ NMakefile: NMakefile.template .dep_segment Makefile.am maintMakefile
|
||||
|
||||
# Construct build.sh.in
|
||||
#
|
||||
build.sh.in: build.template Makefile.am maintMakefile
|
||||
build.sh.in: build.template Makefile
|
||||
rm -f $@
|
||||
sed -e 's@%objs%@$(filter-out remote-%, $(make_OBJECTS)@' \
|
||||
-e 's@%globobjs%@$(patsubst %.c,%.o,$(globsrc)))@' \
|
||||
sed -e 's@%objs%@$(filter-out remote-%, $(make_OBJECTS)@g' \
|
||||
-e 's@%globobjs%@$(patsubst %.c,%.o,$(globsrc)))@g' \
|
||||
$< > $@
|
||||
chmod a-w+x $@
|
||||
|
||||
|
||||
27
make.h
27
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
|
||||
@@ -284,6 +299,17 @@ extern char *alloca ();
|
||||
# endif /* HAVE_ALLOCA_H. */
|
||||
#endif /* GCC. */
|
||||
|
||||
/* ISDIGIT offers the following features:
|
||||
- Its arg may be any int or unsigned int; it need not be an unsigned char.
|
||||
- It's guaranteed to evaluate its argument exactly once.
|
||||
NOTE! Make relies on this behavior, don't change it!
|
||||
- It's typically faster.
|
||||
Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
|
||||
only '0' through '9' are digits. Prefer ISDIGIT to isdigit() unless
|
||||
it's important to use the locale's definition of `digit' even when the
|
||||
host does not conform to Posix. */
|
||||
#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
|
||||
|
||||
#ifndef iAPX286
|
||||
# define streq(a, b) \
|
||||
((a) == (b) || \
|
||||
@@ -464,6 +490,7 @@ extern int batch_mode_shell;
|
||||
|
||||
extern unsigned int job_slots;
|
||||
extern int job_fds[2];
|
||||
extern int job_rfd;
|
||||
#ifndef NO_FLOAT
|
||||
extern double max_load_average;
|
||||
#else
|
||||
|
||||
799
make.texinfo
799
make.texinfo
File diff suppressed because it is too large
Load Diff
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:
|
||||
|
||||
107
remake.c
107
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)
|
||||
{
|
||||
@@ -320,19 +316,19 @@ update_file (file, depth)
|
||||
register int status = 0;
|
||||
register struct file *f;
|
||||
|
||||
/* Prune the dependency graph: if we've already been here on _this_ pass
|
||||
through the dependency graph, we don't have to go any further. We won't
|
||||
reap_children until we start the next pass, so no state change is
|
||||
possible below here until then. */
|
||||
if (file->considered == considered)
|
||||
{
|
||||
DEBUGPR ("Pruning file `%s'.\n");
|
||||
return 0;
|
||||
}
|
||||
file->considered = considered;
|
||||
|
||||
for (f = file->double_colon ? file->double_colon : file; f != 0; f = f->prev)
|
||||
{
|
||||
/* Prune the dependency graph: if we've already been here on _this_
|
||||
pass through the dependency graph, we don't have to go any further.
|
||||
We won't reap_children until we start the next pass, so no state
|
||||
change is possible below here until then. */
|
||||
if (f->considered == considered)
|
||||
{
|
||||
DEBUGPR (_("Pruning file `%s'.\n"));
|
||||
continue;
|
||||
}
|
||||
f->considered = considered;
|
||||
|
||||
status |= update_file_1 (f, depth);
|
||||
check_renamed (f);
|
||||
|
||||
@@ -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 prerequisite 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 prerequisites 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 prerequisites 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 (_("Prerequisite `%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 (_("Prerequisite `%s' is %s than target `%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 prerequisites.\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 prerequisites 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 prerequisite 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
|
||||
}
|
||||
|
||||
|
||||
31
variable.c
31
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. */
|
||||
|
||||
@@ -780,9 +780,9 @@ try_variable_definition (flocp, line, origin)
|
||||
case f_simple:
|
||||
/* A simple variable definition "var := value". Expand the value.
|
||||
We have to allocate memory since otherwise it'll clobber the
|
||||
variable buffer, and we still need that. */
|
||||
alloc_value = allocated_variable_expand (p);
|
||||
value = alloc_value;
|
||||
variable buffer, and we may still need that if we're looking at a
|
||||
target-specific variable. */
|
||||
value = alloc_value = allocated_variable_expand (p);
|
||||
break;
|
||||
case f_conditional:
|
||||
/* A conditional variable definition "var ?= value".
|
||||
@@ -824,8 +824,10 @@ try_variable_definition (flocp, line, origin)
|
||||
else
|
||||
/* The previous definition of the variable was simple.
|
||||
The new value comes from the old value, which was expanded
|
||||
when it was set; and from the expanded new value. */
|
||||
p = variable_expand (p);
|
||||
when it was set; and from the expanded new value. Allocate
|
||||
memory for the expansion as we may still need the rest of the
|
||||
buffer if we're looking at a target-specific variable. */
|
||||
p = alloc_value = allocated_variable_expand (p);
|
||||
|
||||
oldlen = strlen (v->value);
|
||||
newlen = strlen (p);
|
||||
@@ -952,7 +954,7 @@ print_variable (v, prefix)
|
||||
register struct variable *v;
|
||||
char *prefix;
|
||||
{
|
||||
char *origin;
|
||||
const char *origin;
|
||||
|
||||
switch (v->origin)
|
||||
{
|
||||
@@ -980,7 +982,6 @@ print_variable (v, prefix)
|
||||
case o_invalid:
|
||||
default:
|
||||
abort ();
|
||||
break;
|
||||
}
|
||||
printf ("# %s\n", origin);
|
||||
|
||||
@@ -1043,21 +1044,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 +1072,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