ID Number: Q25951
4.06
MS-DOS
Problem:
MAKE does not correctly handle inference rules when they are used with
macros. MAKE recognizes that the destination file does not exist and
that the file needs to be built, but it does not invoke the commands
in the inference rule needed to create the destination file.
The same macros work properly when used without inference rules, as
the following MAKE file demonstrates:
# this make file works fine
source1=source1.src
source2=source2.src
destination=dest.dst
$(destination): $(source1) $(source2)
type $(source1) > $(destination)
type $(source2) >> $(destination)
The following is the same MAKE file modified to use inference rules in
addition to the macros:
# this make file does not work correctly
source1=source1.src
source2=source2.src
destination=dest.dst
.src.dst:
type $(source1) > $(destination)
type $(source2) >> $(destination)
$(destination): $(source1) $(source2)
The inference rule correctly identifies that "dest.dst" does not exist
and needs to be built, but it does not invoke the "type" commands to
build it.
Response:
This is not a problem in MAKE. It is an example of the incorrect use
of inference rules. The inference rule (.src.dst) only applies to
files that have the same base name, as in the following:
program.src
program.dst
Because the example uses different base names (source1.src,
source2.src, and dest.dst), it would be incorrect for the inference
rule to act upon these files.
If the filenames contained in the macros are changed to the following,
then the inference rule works properly (even with macros) because
source1.src and source1.dst have the same base name:
source1.src
source2.src
source1.dst