Incompatibliities between Make and Makepp

makepp was designed to be as close as possible to GNU make. However, because of the difference in philosophy, some of GNU make's features cannot be supported; others have not been implemented because I haven't had time. Also, in order to emulate GNU make's behavior precisely, you may in some cases have to add additional command line options to the makepp command line, as noted below.

Makepp will give warning messages for many things which the traditional unix make accepts without flinching. This is because there are better ways to do them with makepp. If these warnings annoy you, you can turn them off with the --nowarn command line option.

Incompatibilities for all options

Incompatibilities without the --percent-subdirs option

Incompatibilities without the -m option

By default, makepp will attempt to rebuild all targets if any of the dependencies have changed since the last build, or if the command has changed. This is normally what you want. Sometimes, however, you don't want the target to be rebuilt if it has been modified apart from the control of makepp (e.g., by editing it, or by running a program manually to make the file). You can force makepp to use the traditional make algorithm, which only rebuilds if any of the targets are newer than the dependencies, by adding the option -m target_newer to the command line.

As a special exception, any targets which are built while rebuilding the makefile are automatically checked using the target_newer method in order to avoid problems with configure procedures.

Incompatibilities without the --traditional-recursion option

Recursive invocations of make are often considered to be an unsafe practice (see the section on recursive make in the discussion of deprecated idioms), but they are extremely common in existing makefiles. Makepp supports recursive make for backward compatibility; for new makefiles, it is much better to use the load_makefile statement, or makepp's implicit makefile loading mechanism.

Sometimes recursive make invocations set variables on the command line:

target: dependencies
	cd subdir && $(MAKE) VAR=val VAR2=val2 some-other-target

If you do this, you may have to add the --noimplicit-load option to the command line to avoid conflicts between what the parent process and the child process think the build rules are.

In order to be able to use repositories for variant builds, and to help make recursive invocations of make safter, makepp normally does not actually invoke itself recursively even if you tell it to. Instead, a subprocess communicates with the parent process, and the actual build is done by the parent process.

This works in most cases, but there are a few incompatibilities. (All of these incompatibilities are removed by adding the --traditional-recursive-make option to the command line.)

This may seem like a long list of restrictions, but many makefiles obey them. For example, as far as I know, all makefiles produced by automake follow these restrictions.

All of these restrictions go away if you add the --traditional-recursive-make option to the command line, but that has the following undesirable side effects:

Even with the --traditional-recursive-make option, there are a few remaining incompatibilities:

Command line incompatibilities

At present, you may not combine single character options into a single word. E.g., you may not say makepp -ejk 2 instead of makepp -e -j 2 -k.

Makepp supports a few of make's more useful command line options. The following, however, are not supported, and are ignored after a warning message is printed:

Some of these can be easily supported if anyone cares.

Note that the -q option at present actually does something different--it suppresses some of makepp's chatty informational messages.

The -m option also has a different function.


Table of contents | Next (bugs) | Previous (using/converting old makefiles)
Last modified: Tue Nov 14 15:58:57 PST 2000