Next: Headers, Up: Other Objects
It is possible to define and install programs that are scripts. Such
programs are listed using the
SCRIPTS primary name. When the
script is distributed in its final, installable form, the
Makefile usually looks as follows:
# Install my_script in $(bindir) and distribute it. dist_bin_SCRIPTS = my_script
Scripts are not distributed by default; as we have just seen, those
that should be distributed can be specified using a
prefix as with other primaries.
Scripts can be installed in
Scripts that need not be installed can be listed in
noinst_SCRIPTS, and among them, those which are needed only by
‘make check’ should go in
When a script needs to be built, the Makefile.am should include the appropriate rules. For instance the automake program itself is a Perl script that is generated from automake.in. Here is how this is handled:
bin_SCRIPTS = automake CLEANFILES = $(bin_SCRIPTS) EXTRA_DIST = automake.in do_subst = sed -e 's,[@]datadir[@],$(datadir),g' \ -e 's,[@]PERL[@],$(PERL),g' \ -e 's,[@]PACKAGE[@],$(PACKAGE),g' \ -e 's,[@]VERSION[@],$(VERSION),g' \ ... automake: automake.in Makefile $(do_subst) < $(srcdir)/automake.in > automake chmod +x automake
Such scripts for which a build rule has been supplied need to be
deleted explicitly using
CLEANFILES (see Clean), and their
sources have to be distributed, usually with
(see Basics of Distribution).
Another common way to build scripts is to process them from
AC_CONFIG_FILES. In this situation
Automake knows which files should be cleaned and distributed, and what
the rebuild rules should look like.
For instance if configure.ac contains
AC_CONFIG_FILES([src/my_script], [chmod +x src/my_script])
to build src/my_script from src/my_script.in, then a
src/Makefile.am to install this script in
be as simple as
bin_SCRIPTS = my_script CLEANFILES = $(bin_SCRIPTS)
There is no need for
EXTRA_DIST or any build rule: Automake
infers them from
AC_CONFIG_FILES (see Requirements).
CLEANFILES is still useful, because by default Automake will
clean targets of
Although this looks simpler, building scripts this way has one
drawback: directory variables such as
$(datadir) are not fully
expanded and may refer to other directory variables.