Next: , Previous: , Up: Some example packages   [Index]


17.3 Automake uses itself

Automake, of course, uses itself to generate its Makefile.in. Since Automake is a shallow package, it has more than one Makefile.am. Here is the top-level Makefile.am:

## Process this file with automake to create Makefile.in

AUTOMAKE_OPTIONS = gnits
MAINT_CHARSET = latin1
PERL = @PERL@

SUBDIRS = tests

bin_SCRIPTS = automake
info_TEXINFOS = automake.texi

pkgdata_DATA = clean-kr.am clean.am compile-kr.am compile-vars.am \
compile.am data.am depend.am \
dist-vars.am footer.am header.am header-vars.am \
kr-vars.am libraries-vars.am \
libraries.am library.am mans-vars.am \
program.am programs.am remake-hdr.am \
remake-subd.am remake.am scripts.am subdirs.am tags.am tags-subd.am \
tags-clean.am \
texi-version.am texinfos-vars.am texinfos.am \
libraries-clean.am programs-clean.am data-clean.am \
COPYING INSTALL texinfo.tex \
ansi2knr.c ansi2knr.1 \
aclocal.m4

## These must all be executable when installed.
pkgdata_SCRIPTS = config.guess config.sub install-sh mdate-sh mkinstalldirs

CLEANFILES = automake

# The following requires a fixed version of the Emacs 19.30 etags.
ETAGS_ARGS = automake.in --lang=none \
 --regex='/^@node[ \t]+\([^,]+\)/\1/' automake.texi

## `test -x' is not portable.  So we use Perl instead.  If Perl
## doesn't exist, then this test is meaningless anyway.
# Check to make sure some installed files are executable.
installcheck-local:
	$(PERL) -e "exit ! -x '$(pkgdatadir)/config.guess';"
	$(PERL) -e "exit ! -x '$(pkgdatadir)/config.sub';"
	$(PERL) -e "exit ! -x '$(pkgdatadir)/install-sh';"
	$(PERL) -e "exit ! -x '$(pkgdatadir)/mdate-sh';"
	$(PERL) -e "exit ! -x '$(pkgdatadir)/mkinstalldirs';"

# Some simple checks:
# * syntax check with perl4 and perl5.
# * make sure the scripts don't use 'true'
# * expect no instances of '${...}'
# These are only really guaranteed to work on my machine.
maintainer-check: automake check
	$(PERL) -c -w automake
	@if grep '^[^#].*true' $(srcdir)/[a-z]*.am; then \
	  echo "can't use 'true' in GNU Makefile" 1>&2; \
	  exit 1;				\
	else :; fi
	@if test `fgrep '$${' $(srcdir)/[a-z]*.am | wc -l` -ne 0; then \
	  echo "found too many uses of '\$${'" 1>&2; \
	  exit 1;				\
	fi
	if $(SHELL) -c 'perl4.036 -v' >/dev/null 2>&1; then \
	  perl4.036 -c -w automake; \
	else :; fi

# Tag before making distribution.  Also, don't make a distribution if
# checks fail.  Also, make sure the NEWS file is up-to-date.
cvs-dist: maintainer-check
	@if sed 1q NEWS | grep -e "$(VERSION)" > /dev/null; then :; else \
	  echo "NEWS not updated; not releasing" 1>&2; \
	  exit 1;				\
	fi
	cvs tag `echo "Release-$(VERSION)" | sed 's/\./-/g'`
	$(MAKE) dist

As you can see, Automake defines many of its own rules, to make the maintainer’s job easier. For instance the cvs-dist rule automatically tags the current version in the CVS repository, and then makes a standard distribution.

Automake consists primarily of one program, automake, and a number of auxiliary scripts. Automake also installs a number of programs which are possibly installed via the ‘--add-missing’ option; these scripts are listed in the pkgdata_SCRIPTS variable.

Automake also has a tests subdirectory, as indicated in the SUBDIRS variable above. Here is tests/Makefile.am:

## Process this file with automake to create Makefile.in

AUTOMAKE_OPTIONS = gnits

TESTS = mdate.test vtexi.test acoutput.test instexec.test checkall.test \
acoutnoq.test acouttbs.test libobj.test proginst.test acoutqnl.test \
confincl.test spelling.test prefix.test badprog.test depend.test

EXTRA_DIST = defs

This is where all the tests are really run. defs is an initialization file used by each test script; it is explicitly mentioned because automake has no way of automatically finding it.


Next: A deep hierarchy, Previous: A tricker example, Up: Some example packages   [Index]