Allow loaded objects to opt out of the "auto-rebuild" feature.

This commit is contained in:
Paul Smith 2013-09-22 12:13:28 -04:00
parent f69922b335
commit 0296e40fc7
3 changed files with 20 additions and 5 deletions

View File

@ -1,5 +1,9 @@
2013-09-22 Paul Smith <psmith@gnu.org> 2013-09-22 Paul Smith <psmith@gnu.org>
* read.c (eval): If load_file() returns -1, don't add this to the
"to be rebuilt" list.
* doc/make.texi (load Directive): Document it.
* guile.c (guile_gmake_setup): Don't initialize Guile so early. * guile.c (guile_gmake_setup): Don't initialize Guile so early.
(func_guile): Lazily initialize Guile the first time the $(guile ..) (func_guile): Lazily initialize Guile the first time the $(guile ..)
function is invoked. Guile can steal file descriptors which function is invoked. Guile can steal file descriptors which

View File

@ -10910,7 +10910,8 @@ The @code{load} directive and extension capability is considered a
``technology preview'' in this release of GNU make. We encourage you ``technology preview'' in this release of GNU make. We encourage you
to experiment with this feature and we appreciate any feedback on it. to experiment with this feature and we appreciate any feedback on it.
However we cannot guarantee to maintain backward-compatibility in the However we cannot guarantee to maintain backward-compatibility in the
next release. next release. Consider using GNU Guile instead for extending GNU make
(@pxref{Guile Function, ,The @code{guile} Function}).
@end quotation @end quotation
@end cartouche @end cartouche
@ -10978,7 +10979,9 @@ same directive.
The initializing function will be provided the file name and line The initializing function will be provided the file name and line
number of the invocation of the @code{load} operation. It should number of the invocation of the @code{load} operation. It should
return a value of type @code{int}, which must be @code{0} on failure return a value of type @code{int}, which must be @code{0} on failure
and non-@code{0} on success. and non-@code{0} on success. If the return value is @code{-1}, then
GNU make will @emph{not} attempt to rebuild the object file
(@pxref{Remaking Loaded Objects, ,How Loaded Objects Are Remade}).
For example: For example:

14
read.c
View File

@ -947,19 +947,27 @@ eval (struct ebuffer *ebuf, int set_default)
PARSEFS_NOAR); PARSEFS_NOAR);
free (p); free (p);
/* Load each file and add it to the list "to be rebuilt". */ /* Load each file. */
while (files != 0) while (files != 0)
{ {
struct nameseq *next = files->next; struct nameseq *next = files->next;
const char *name = files->name; const char *name = files->name;
struct dep *deps; struct dep *deps;
int r;
/* Load the file. 0 means failure. */
r = load_file (&ebuf->floc, &name, noerror);
if (! r && ! noerror)
fatal (&ebuf->floc, _("%s: failed to load"), name);
free_ns (files); free_ns (files);
files = next; files = next;
if (! load_file (&ebuf->floc, &name, noerror) && ! noerror) /* Return of -1 means a special load: don't rebuild it. */
fatal (&ebuf->floc, _("%s: failed to load"), name); if (r == -1)
continue;
/* It succeeded, so add it to the list "to be rebuilt". */
deps = alloc_dep (); deps = alloc_dep ();
deps->next = read_files; deps->next = read_files;
read_files = deps; read_files = deps;