|o||Wildcards can match files which dont exist yet but can be built.|
|o||Header files which have been detected by the automatic dependency scanner dont have to exist; makepp knows where they will be. (Most other solutions to this problem assume that any headers which dont exist yet are in the current directory.)|
|o||Repositories are much simpler to implement since makepp knows beforehand what files it can make. (See makepp_repositories for details.)|
|o||It is possible to determine easily which files can be built (see the $(only_targets ) function.|
|o||Makepps $(infer_objects) function is greatly simplified by knowing what objects are available.|
Makepp associates build commands with a target file, not to a textual pattern for a filename. It is therefore not confused by different names for the same file. Thus, for example, makepp will know that ./xyz and and xyz are the same file, whereas other make utilities may not.
This is particularly important because (unlike the standard make) makepp loads makefiles from different directories. In order for the makefiles to be relatively independent, with no special position given to a top-level makefile, each makefile refers to all files relative to its own directory. Thus if you load a makefile from the subdirectory other_stuff, and that makefile refers to ../xyz, makepp will again realize that its the same file referred to above. (It also wont be confused by soft-linked directory names.)
Makepp stores much more information about each file that it builds beyond just the date stamp (which is all that the standard make cares about). This information includes:
Makepp makes a subdirectory in every directory that it touches called .makepp. The build information for a file filename in a directory is stored in .makepp/filename. If you delete this subdirectory or alter the files, makepp will rebuild all affected files.
o The signature of this file on the last build, so we know if the file itself has changed. o The names of each dependency file, including include files and other files inferred automatically. If this list changes, then makepp assumes it needs to rebuild. o The signature of each dependency. This way, makepp knows to rebuild not only when the dependencies are newer than the target, but when they change at all. This also makes it possible to use other kinds of signatures, such as cryptographic checksums, rather than the file date. o The entire build command (and its cwd). This way if you change the build command (e.g., change the compiler options), makepp knows to rebuild even if the files themselves havent changed. o The architecture. If you have compiled your program on Linux and then switch to Solaris, makepp automatically knows to recompile everything.
If makepp is trying to build a target in a directory and doesnt have a rule for it yet, or if it is looking for files matching a wildcard in a directory, it will look in that directory to see if a makefile is present. If so, the makefile will be loaded automatically.
This means that you usually dont have to tell makepp explicitly where to find makefilesall you have to do is to reference a file in another directory, and makepp will automatically figure out how to build it.
Implicit loading will occur only if the directory is writable to you. Thus if you want to prevent makepp from trying to build a bunch of things that never change, simply make the directory read-only.
Implicit loading will not occur if you are in a tree under a RootMakeppfile(.mk) and the other makefile is outside that tree. If you do want this once, you can give a --do-build=/ option to makepp, to make everything outside the tree buildable. If you always want this, you can put a load_makefile statement somewhere within the tree to explicitly connect it to the tree.
If implicit loading gets in your way (i.e., makepp loads too many makefiles and it wastes time, or else you really dont want it to try to rebuild all the stuff described in the makefiles), you can turn it off for all directories using the --noimplicit_load command line option, or you can turn it off for selected directories using the no_implicit_load statement in your makefile.
|perl v5.20.3||MAKEPP_BUILD_ALGORITHM (1)||2012-02-07|