GTK+ / Gnome Application Development | |||
---|---|---|---|
<<< Previous | Home | Next >>> |
automake processes Makefile.am to produce a standards-compliant Makefile.in. automake does a lot of work for you: it keeps up with dependencies between source files, for example. It creates all the standard targets, such as install and clean. It also creates more complex targets: simply typing make dist creates a standard .tar.gz file if your Makefile.am is correct.
The Makefile.am in the top source directory is generally very simple; here is an example:
SUBDIRS = macros po intl src pixmaps doc ## We dist autogen.sh since this is an example program ## Real-world programs do not need to distribute autogen.sh EXTRA_DIST = \ gnome-hello.desktop \ autogen.sh Applicationsdir = $(datadir)/gnome/apps/Applications Applications_DATA = gnome-hello.desktop |
The SUBDIRS line instructs automake to recursively look for Makefile.am files in the given subdirectories. (the section called .desktop Entries describes the remainder of the file, ignore it for now.) The Makefile.am in the src directory is a little more interesting:
INCLUDES = -I$(top_srcdir) -I$(includedir) $(GNOME_INCLUDEDIR) \ -DG_LOG_DOMAIN=\"GnomeHello\" -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ -I../intl -I$(top_srcdir)/intl bin_PROGRAMS = gnome-hello gnome_hello_SOURCES = \ app.c \ hello.c \ menus.c \ app.h \ hello.h \ menus.h gnome_hello_LDADD = $(GNOMEUI_LIBS) $(GNOME_LIBDIR) $(INTLLIBS) |
automake understands a number of "magic variables" and can use them to create Makefile.in. In the small example above, the following variables are used:
INCLUDES specifies flags to pass to the C compiler during the compile phase (as opposed to the link phase). The variables used in this line come from the configure.in shown in the previous section.
bin_PROGRAMS lists the programs to be compiled.
hello_SOURCES lists the files to be compiled and linked to create the program called hello; hello must be listed in bin_PROGRAMS. All files in this variable are automatically included in the distribution.
hello_LDADD lists flags to be passed to the linker. In this case, Gnome library flags determined by configure.
Several elements of the INCLUDES line should be used in all Gnome programs. G_LOG_DOMAIN should always be defined; error messages from checks and assertions will report this value, so you can determine where the error occurred (in your code, or in a library). GNOMELOCALEDIR is used to locate translation files. The intl directory is added to the header search path so the application can find the intl headers.
There are many more complex things one can do in Makefile.am; in particular, you can add @-bounded variables to be substituted by configure, you can conditionally include portions of the Makefile based on configure checks, and you can build libraries. The automake manual gives more details.
Table 1 summarizes the most interesting targets generated by automake. Of course the default target is all, which compiles the program. The GNU Coding Standards (http://www.gnu.org/prep/standards_toc.html) have more information about these targets and GNU makefiles in general.
Table 1. Standard make targets
Target | Description |
---|---|
dist | Builds a tarball (.tar.gz) for distribution |
distcheck | Builds a tarball, then tries to compile it |
clean | Deletes the results of compilation (object files and executables), but may not delete some generated files that come with the distribution. |
install | Creates installation directories if needed, and copies the software into them. |
uninstall | Reverses the install (deletes installed files). |
distclean | Reverse the effects of the configure script and the all target; that is, revert a tarball to its pristine state. |
mostlyclean | Nearly the same as clean, but leaves some object files that most likely don't need to be rebuilt. |
maintainer-clean | More thorough than clean; may delete some files that require special tools to rebuild, such as machine-generated source code. |
TAGS | Creates a tag table, for use with Emacs. |
check | Runs a test suite if you have one |