# Release notes

## Version 0.99

In addition to numerous bug fixes, this version has several user-visible changes:

- Multiple targets for a rule are now treated in a way which is more compatible with old makefiles. Makepp has a heuristic algorithm for guessing whether the rule is supposed to build all targets at once or whether the rule needs to be invoked multiple times. I do not think this will break any existing makefiles, but it should allow makepp to work with many more makefiles designed for unix make.
- The `--traditional-recursive-make` option can be used for legacy makefiles which use recursive invocations of make in a way that didn't work with makepp's default implementation.
- Repositories now work with libtool.
- Variable settings are now allowed with the `load_makefile` statement and with recursive make.

## Version 0.95

This version has several user-visible changes:

- A tutorial on writing makefiles for makepp has been added.
- GNU make style conditionals (ifeq/ifneq/ifdef/ifndef) are now supported. The `$(if cond, then, else)` function is supported to a limited extent.
- By default, the `%` wildcard now matches only files within a directory; `%.c` is now equivalent to `*.c`, not `**/*.c`. The reason for this change was that rules almost never need to use the more complicated wildcard, and it often caused unnecessary directories to be searched. You can get the old behavior by specifying `--percent-subdirs` on the command line. (I'm curious how people feel about this change. Please let me know if you have good reasons for it being one way or the other.)
- By default, makefiles from any directory that contains a dependency, or that is searched by a wildcard, are loaded automatically. Usually this means you don't need any `load_makefile` statements at all. If this causes you problems, you can turn off implicit loading of makefiles by adding `--no-implicit-load` to the command line. (I'm curious whether people like or dislike implicit loading of makefiles.)
- A target may now be declared phony on the same line that defines the target by using the new `$(phony )` function, like this:

      $(phony all): program_1 program_2

  The `$(phony )` function simply returns its arguments, but marks them as phony targets. You can still use the older syntax that looks like this:

      all: program_1 program_2

      .PHONY: all

  The `$(phony )` function is an attempt to improve the readability of makefiles. I'd welcome other suggestions, as I'm still not entirely happy with the syntax.

## Version 0.90

In order to support features like parallel make, most of the internals had to be reorganized or rewritten. The result is much cleaner and hopefully more reliable.

Bugs too numerous to mention have been fixed. In order to help ensure reliability, a test suite has been developed. It doesn't test absolutely everything yet, but it does test most things, and I hope to make it more extensive in the future. You can run it by typing `makepp test` in the makepp distribution directory. If an unmodified makepp fails the test suite, please let me know so I can fix it.

There are many new features:

- Repositories are now supported.
- It is now possible to specify different methods for calculating and comparing file signatures. For example, you can use an MD5 checksum ignoring comments and whitespace, or you can require merely that the target be newer than the dependencies (the method that the traditional make uses).
- Makefiles are only rebuilt if they are older than their dependencies; a different signature method is used in this special case.
- Parallel builds are now supported, though this is still an experimental feature. See the `-j` option.
- It is now possible to write your own functions. See the sub statement and the discussion about extending makepp.
- Filenames with characters like colon or space are now supported with a new quoting syntax.
- Synonymous, less cryptic names for automatic variables have been introduced to encourage more readable makefiles.
- Makepp now remembers the architecture of the machine you built on, and rebuilds if the architecture is different.
- Directories can now be targets or dependencies; a previous restriction that all directories had to exist before the start of the built has been lifted.
- Makepp now writes a log file called `.makepp_log` explaining why it rebuilt everything. This is extremely useful for debugging.
- The usual `-k` option for continuing to build even when an error occurs is now supported.
- The documentation has been reorganized and extended.

There are also (unfortunately) a few incompatibilities with previous versions:

- The file format for storing information about the last build has changed. Thus makepp will insist on rebuilding everything the first time you run the new version.
- load_makefile no longer supports targets or variable settings. It now supports loading a list of makefiles rather than just one, so the `-F` switch is now unnecessary (and no longer documented).
- Recursive make now ignores variable settings on the command line. This is necessary to load makefiles in a consistent way.
- `$(INFERRED_OBJS)` is no longer supported (since it was not a well-designed interface anyway). Use the newer `$(infer_objects )` function instead.
- `$_` is no longer supported. Use `$(foreach)` instead.
- A few seldom used GNU make options such as `-s`, `-n`, and `-q` are no longer supported due to internal architecture changes. `-n` will probably be supported again in future releases.
- A man page is no longer provided since the documentation is no longer written in the perl pod format. Use the HTML documentation instead.
- The automatic clean target is no longer supported. A better way to do it is with the `$(only_targets)`.

Table of contents | Previous (unexpected features)
Last modified: Sat Oct 14 22:18:25 PDT 2000