f78
Incompatibilities and Missing Features
Contents|Index|Previous|Next
Incompatibilities and Missing Features
The make programs in various other systems support a few features that are not
implemented in GNU make. The POSIX.2 standard (IEEE Standard 1003.2-1992) which specifies make does not require any of these features.
A target of the form
file((entry)) stands for a member of archive file file. The member is chosen, not by name,
but by being an object file which defines the linker symbol, entry.
This feature was not put into GNU
make because of the non-modularity of putting knowledge into make of the internal format of archive file symbol tables. See Updating Archive Symbol Directories.
Suffixes (used in suffix rules) that end with the character
have a special meaning to System V make; they refer to the SCCS file that corresponds to the file one would get
without the . For example, the suffix rule, .c.o, would make the file, n.o, from the SCCS file, s.n.c. For complete coverage, a whole series of such suffix rules is required. See Old-Fashioned Suffix Rules.
In GNU
make, this entire series of cases is handled by two pattern rules for extraction
from SCCS, in combination with the general feature of rule chaining. See Chains of Implicit Rules.
In System V make, the string,
$$@, has the strange meaning that, in the dependencies of a rule with multiple
targets, it stands for the particular target that is being processed.
This is not defined in GNU
make because $$ should always stand for an ordinary $. It is possible to get this functionality through the use of static pattern
rules (see Static Pattern Rules).
The System V make rule:
$(targets): $$@.o lib.a can be replaced with the GNU make static pattern rule: $(targets): %: %.o lib.a.
In System V and 4.3 BSD
make, files found by VPATH search (see Searching Directories for Dependencies) have their names changed inside command strings. We feel it is much cleaner
to always use automatic variables and thus make this feature obsolete.
In some Unix
make utilities, the automatic variable, $*, appearing in the dependencies of a rule, has the amazingly strange feature
of expanding to the full name of the target of that rule. We cannot imagine
what went on in the minds of Unix make developers to do this; it is utterly inconsistent with the normal definition
of $*.
In some Unix
make utilities, implicit rule search is apparently done for all targets, not just
those without commands (see Using Implicit Rules). This means you can use: foo.o: cc -c foo.c, and Unix make will intuit that foo.o depends on foo.c.
We feel that such usage is broken. The dependency properties of
make are well-defined (for GNU make, at least), and doing such a thing simply does not fit the model.
GNU
make does not incl
8a2
ude any built-in implicit rules for compiling or preprocessing
EFL programs. If we hear of anyone who is using EFL, we will gladly add them.
It appears that in SVR4
make, a suffix rule can be specified with no commands, and it is treated as if it
had empty commands (see Using Empty Commands).
For example,
.c.a: will override the built-in .c.a suffix rule. We feel that it is cleaner for a rule without commands to
always simply add to the dependency list for the target. .c.a: can be easily rewritten to get the desired behavior in GNU make: .c.a: ;
Some versions of make invoke the shell with the -e flag, except under -k (see Testing the Compilation of a Program). The -e flag tells the shell to exit as soon as any program it runs returns a
nonzero status.
We feel it is cleaner to write each shell command line to stand on its own and
not require this special treatment.
0