mirror of
https://github.com/mirror/make.git
synced 2026-09-01 04:08:10 +08:00
Support the .EXTRA_PREREQS special variable
Initial implementation by Christof Warlich <cwarlich@gmx.de> * NEWS: Announce the new feature. * doc/make.texi (Other Special Variables): Document .EXTRA_PREREQS. * src/dep.h (struct dep): New flag to note extra prereq deps. * src/filedef.h (expand_extra_prereqs): Declare a function to expand the value of .EXTRA_PREREQS. * src/file.c (expand_extra_prereqs): Given a struct variable lookup of .EXTRA_PREREQS, convert it into a list of deps and for each one make sure it has a struct file and has the new flag set. (snap_file): A new function invoked by hash_map that will perform per-file operations: set up second expansion, intermediate, and also .EXTRA_PREREQS. Manage circular dependencies by ignoring them. (snap_deps): Defer per-file operations until the end. Look up the global .EXTRA_PREREQS and pass it along to snap_file for each file. * src/implicit.c (struct patdeps): Remember the extra prereqs flag. (pattern_search): Transfer extra prereqs flag settings into the matched pattern rule. * src/rule.h (snap_implicit_rules): Rename count_implicit_rules to snap_implicit_rules since we now do more than count. * src/rule.c (snap_implicit_rules): As we walk through all the pattern rules, add in any global .EXTRA_PREREQS to the dep list. Ensure we take them into account for the max number of prereqs and name length. * src/main.c (main): Add extra-prereqs to .FEATURES. Call the renamed snap_implicit_rules. * tests/scripts/variables/EXTRA_PREREQS: Add tests.
This commit is contained in:
@@ -6631,6 +6631,57 @@ Supports dynamically loadable objects for creating custom extensions.
|
||||
Expands to a list of directories that @code{make} searches for
|
||||
included makefiles (@pxref{Include, , Including Other Makefiles}).
|
||||
|
||||
@vindex .EXTRA_PREREQS @r{(prerequisites not added to automatic variables)}
|
||||
@item .EXTRA_PREREQS
|
||||
Each word in this variable is a new prerequisite which is added to
|
||||
targets for which it is set. These prerequisites differ from normal
|
||||
prerequisites in that they do not appear in any of the automatic
|
||||
variables (@pxref{Automatic Variables}). This allows prerequisites to
|
||||
be defined which do not impact the recipe.
|
||||
|
||||
Consider a rule to link a program:
|
||||
|
||||
@example
|
||||
myprog: myprog.o file1.o file2.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@@ $^ $(LDLIBS)
|
||||
@end example
|
||||
|
||||
Now suppose you want to enhance this makefile to ensure that updates
|
||||
to the compiler cause the program to be re-linked. You can add the
|
||||
compiler as a prerequisite, but you must ensure that it's not passed
|
||||
as an argument to link command. You'll need something like this:
|
||||
|
||||
@example
|
||||
myprog: myprog.o file1.o file2.o $(CC)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@@ $(filter-out $(CC),$^) $(LDLIBS)
|
||||
@end example
|
||||
|
||||
Then consider having multiple extra prerequisites: they would all have
|
||||
to be filtered out. Using @code{.EXTRA_PREREQS} and target-specific
|
||||
variables provides a simpler solution:
|
||||
|
||||
@example
|
||||
myprog: myprog.o file1.o file2.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@@ $^ $(LDLIBS)
|
||||
myprog: .EXTRA_PREREQS = $(CC)
|
||||
@end example
|
||||
|
||||
This feature can also be useful if you want to add prerequisites to a
|
||||
makefile you cannot easily modify: you can create a new file such as
|
||||
@file{extra.mk}:
|
||||
|
||||
@example
|
||||
myprog: .EXTRA_PREREQS = $(CC)
|
||||
@end example
|
||||
|
||||
then invoke @code{make -f extra.mk -f Makefile}.
|
||||
|
||||
Setting @code{.EXTRA_PREREQS} globally will cause those prerequisites
|
||||
to be added to all targets (which did not themselves override it with
|
||||
a target-specific value). Note @code{make} is smart enough not to add
|
||||
a prerequisite listed in @code{.EXTRA_PREREQS} as a prerequisite to
|
||||
itself.
|
||||
|
||||
@end table
|
||||
|
||||
@node Conditionals, Functions, Using Variables, Top
|
||||
|
||||
Reference in New Issue
Block a user