NAME
makepp_release_notes -- Major changes in each version of makepp
DESCRIPTION
Version 1.50 (under development)
All internal classes have been moved to the new package
Mpp::
so as to abide by CPAN rules, and to avoid potential collision with any module you might load into your makefiles. This is transparent to casual users of makepp.In case you did Perl programming for your makefiles, and you made use of some internals this would break your build. Therefore there is a temporary backward compatibility feature, to be removed in the future, which you can activate during installation. The new environment variable
$MAKEPP_INSTALL_OLD_MODULES
is checked for a list of old modules you want created as wrappers around the new ones. Additionally if you have makefiles you can't quickly change, which rely on these things being available without ause
statement, you must prefix those modules with a+
, to get them preloaded:MAKEPP_INSTALL_OLD_MODULES='+Glob Rule +MakeEvent'
New makeppreplay, mppr utility to repeat some of makepp's actions very fast. New makepplog, mppl utility to see the log data readably, needed due to a changed file format. New makeppgraph, mppg utility to graphically analyze dependencies, includes and partially the reasons for a rebuild. New makeppinfo, mppi utility to see somewhat cryptically what makepp knows about some file.
Ported to IBM z/OS Unix System Services. Only smart recursive make doesn't work.
Makepp has become noticeably faster.
Abolish the undocumented fancy renaming of only '.' to '_dot_' in variable and function names.
Makepp will now also look for options in files called .makepprc. The option
-A
or--args-file
is now consistently available on all commands.The environment variable MAKEPP_CASE_SENSITIVE_FILENAMES supercedes the options --case-sensitive-filenames and --no-case-sensitive-filenames.
New variable $/ for portable directory separator. Lots of Windows fixes, including
-j
(parallel builds) for Cygwin and MinGW and smart recursive builds on Cygwin.Also install abbreviations consisting of 'mpp' plus the first letter of every following word, e.g. 'mppc' for makeppclean.
All utilities now also query an environment variable for presetting options. Each one is called like the utility in upper case, with FLAGS added, e.g.
$MAKEPPCLEANFLAGS
or$MAKEPPLOGFLAGS
.New `:build_check only_action' for commands that don't depend on the contents of their dependencies, like symlink creation, where it is used automatically.
Removed
--keep-repository-links
option, the behaviour of which is now the default.Removed
--norc-substitution
and--percent-subdirs
and$(rc_substitution)
andpercent_subdirs
. They are now to be given anywhere from target specific assignment to command line or environment varsmakepp_simple_concatenation
andmakepp_percent_subdirs
.New action syntax
&perl_function 'arg 1' arg2 ...
and&external-perl-script 'arg 1' arg2 ...
New Perl functionrun
.There are the following builtin commands:
&chmod
,&cp
,&cut
,&echo
,&expr
,&grep
,&install
,&ln
,&mkdir
,&mv
,&perl
,&preprocess
,&printf
,&rm
,&sed
,&sort
,&template
,&touch
,&uninstall
,&uniq
and&yes
, which can replace Unix commands of the same name, and more or less also the following:awk
,chgrp
,chown
,head
,m4
,rmdir
,tail
andtr
. They are also available stand-alone from the Shell. They can also be used as functions, e.g.$(&cat file)
, or as statements, or standalone.Note that, unlike earlier CVS versions,
&cut -f
,&grep -v
and&sort -r
now behave as in Unix. Note that in earlier CVS versions of&template
@@
was processed before@
, but now lines are consistently handled front to back.Added a
global
statement for sharing variables accross makefiles. The assignment variant ofexport
now works like a normal assignmant, so you may have to change to:=
. Added theoverride
modifier to assignments. Thedefine var :=
statement now optionally allows specifying the kind of assignment. And the forms with immediate evaluation retain the newlines in$(shell ...)
or$(&command)
. There are new assignment operators&=
for prepending, and;=
which is a=
when set, but automatically turns into a:=
when first used.Short command line options may now be grouped in the Unix way, so
-k -j 4
may be given as-kj4
. In all long options the dash between words may now consistently be omitted or replaced with an underscore, so that--no-log
can be--nolog
or--no_log
. Unknown options now cause an error.A makefile is now also found if it is called
Makeppfile.mk
.There are two new possible filenames for makefiles:
RootMakeppfile
or equivalentlyRootMakeppfile.mk
. The presence of either of these gives your build tree a formal root, accesible through the new variable$(ROOT)
. The advantage is that this file is always loaded first, if present, allowing you to more easily create a build system where makepp can be called from anywhere, without telling it which makefile to start at.The root of the file system is then automatically marked for
--dont-build
, so that makepp doesn't go messing into other directories you include or use libs from, just because they happen to have a Makefile or sources.Usually this means that the root of your build system gets marked for
--do-build
. If, however, you say--do-build
for something under your build system root, which doesn't inherit--dont-build
, then instead your build system root gets marked for--dont-build
.New option
--stop-after-loading
(or--stop
) gives makepp a headstart while you're still editing.Removed command
makeppclient
since we never managed to let builds start significantly faster. The option--stop-after-loading
is more beneficial.Interface definition files for SWIG (.i files) are now scanned for includes. Makepp now understands swig invocations. (SWIG stands for Simplified Wrapper and Interface Generator. It automatically generates all the wrapper functions to link your C or C++ code to a variety of other languages such as perl, python, tcl, ruby, ocaml, C#, etc. See http://www.swig.org.)
Gnu Emacs 22 now has a standard makefile-makepp-mode, which is the default when visiting Makeppfile.
$[VARIABLE] or $[function ...] is evaluated when reading a makefile line, so the variable may contain makepp syntax.
$( ...) is now always a list in rc-style substitution, so that
-I$( $(DIRLIST))
will leave no lonely option when DIRLIST is empty.You can now double-paren functions and multi-line lists, allowing things like
$((perl if( $a < 5 ) { ... }))
.New
c_compilation_md5
signature, which also allows adding whitespace where there was none and inversely. It also ignores whitespace and comments after the last token. This is useful for preventing a useless rebuild if your VC adds lines at a$
Log$
tag when checking in.New scanner
esqlc_compilation
for embedded SQL C. You must supply the rules, however.Implement
$?
exactly as GNU make does. New long name$(changed_inputs)
for it.Implement
$(error ...)
and$(warning ...)
as in GNU make.New method
: build_check ignore_action
to ignore changes to the action string.New statements
ifperl
,ifmakeperl
,iftrue
,ifntrue
,ifsys
andifnsys
.Conditionals
ifxxx
may now be grouped withand
andor
. When written on the same line afterelse
, they create a branch of the same statement, rather than requiring nesting.New options
--rm-stale
,--sandbox
and--dont-read
, for sandbox control when running multiple concurrent (possibly distributed) makepp commands.Added support for dependencies on environment variables, using the
:env
rule option.Various signal handling fixes.
New command
makeppclean
that efficiently removes generated files without loading makefiles.Ported to MinGW.
Experimental new build caches, to cache files that are identical. This means that if you change a file and revert, then you can have makepp drop back to the immediately preceding .o file without rebuilding. Or you can share builds of identical files between separate source trees. This feature is still experimental and the interface is not yet final. Newly added grouping of build caches.
Version 1.40 (December 2004)
Thanks to Anders Johnson and Daniel Pfeiffer for major contributions of code to this release.
Too many bug fixes to list individually. Probably the most salient fixes are to make it work significantly more reliably on cygwin, but there were also fixes to variable expansion, scanning, repositories, etc.
Rewritten command parser and file scanner architecture so that it is more easily extensible. Makepp now supports Verilog (a language used for chip design) in addition to C++ and Fortran. It should be relatively straightforward to support additional languages. (Anders Johnson)
New command
makeppclient
that lets builds start faster. (Daniel Pfeiffer)If you have Perl 5.6.0 or higher, HTML documentation now comes with the new working camel logo and syntax highlighting in the examples. (Daniel Pfeiffer)
Numerous corrections and improvements to the documentation. (Mostly Anders Johnson)
Support for GNU make's
define
statement to define multi-line variable values.$(PWD) and $(CURDIR) now work as in GNU make.
New
--keep-repository-links
option to prevent makepp from deleting all the soft links it creates when making repositories.New
--assume-old
,--assume-new
, and--dont-build
options, and support for the-n
option.Support for double colon rules has slightly improved, so that we can handle makefiles produced by MakeMaker without much trouble.
Added syntax for perfoming Perl code as a statement and in rules
perl { ... }
ormakeperl { ... }
. Added functions for evaluating Perl statements$(perl ... )
or$(makeperl ... )
. Added statementmakesub { ... }
. (Daniel Pfeiffer)Short options can now be directly followed by argument as in -j4. Documented options --jobs, --keep-going, --makefile, --what-if, --assume-new, --new-file, --assume-old & --old-file are now really accepted. (Daniel Pfeiffer)
Version 1.19 (July 2003)
Special thanks to Matthew Lovell and Chris van Engelen for lots of suggestions and tracking down problems in the code.
Documentation was reorganized so that man pages as well as HTML pages can be produced, and a cookbook/FAQ was added (see makepp_cookbook).
A "configure" script was added so installation is more like other software products from the user point of view.
The
$(origin )
function from GNU make is now supported.Target-specific variables are now supported as in GNU make, except that they do not propagate their values to dependencies.
New functions
$(find_upwards )
and$(relative_filename )
(contributed by Matthew Lovell) and$(relative_to )
.In compilation commands,
-I dir
and-L dir
are now supported and work just like-Idir
and-Ldir
.Recompilation of C files will now occur if a multi-line comment was inserted, or if the line numbering changed in any way. Previously it ignored newlines in computing the checksum, which meant that a change that affected debugger info might not force a recompilation.
A bug in
$(shell )
which caused it to return a null string occasionally (especially when the system was heavily loaded) was fixed.Unreadable files or directories suppress importing from repositories but are not matched by wildcards.
A few other minor bugs were fixed.
Version 1.18
The most important change was support for the Cygwin build environment. You can now run makepp with the Cygwin version of perl; I do not think it will work properly with the native windows version of perl yet.
A few other bug fixes went into this release.
Version 1.10
The most important change in this version is that makepp can accept a vastly larger number of makefiles without any command line options because of some changes to the implementation of recursive make. There are a few minor improvements in the GNU make compatibility, and a slight improvement in memory usage.
There are several user visible changes:
c_compilation_md5
is now the default signature method. This means that by default, makepp won't recompile C/C++ modules if only whitespace or comments have changed.A new signature method
md5
has been added, which runs an MD5 checksum on the file's contents. This is not enabled by default; makepp still uses its original method (exact_match
) for any files other than C/C++ source files.
Because of these changes, makepp will recompile everything the first time you run it.
Version 1.05
In addition to bug-fixes, this version has one user-visible change. The --norc-substitution
command line option was introduced to allow compatible handling of whitespace in makefiles.
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, as is the
$(if )
function.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 makepp_extending for details.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 build 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
$(only_targets)
.