summaryrefslogtreecommitdiff
path: root/automake.txt
blob: 22a0b84f634eec715a9c2e286996ac78d0c9ddba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
Luke's AutoMake
===============

Yo, this document is incomplete.  It describes the magical
automake.{head,tail}.mk Makefiles and how to use them, kinda.

I wrote a "clone" of automake.  I say clone, because it works
differently.  Yeah, I need a new name for it.

High-level overview
-------------------

In each source directory, you write a `Makefile`, very similarly to if
you were writing for plain GNU Make, with

    # adjust the number of `../` segments as appropriate
    include $(dir $(lastword $(MAKEFILE_LIST)))/../../config.mk
    include $(topsrcdir)/automake.head.mk

    # your makefile
    
    include $(topsrcdir)/automake.tail.mk

Write your own `common.{each,once}.{head,tail}.mk` files that get
included:
 - `common.once.head.mk`: before parsing any of your Makefiles
 - `common.each.head.mk`: before parsing each of your Makefiles
 - `common.each.tail.mk`: after parsing each of your Makefiles
 - `common.each.tail.mk`: after parsing all of your Makefiles

Here is a table of all of the .PHONY targets that automake takes care
of for you:

| this | and this         | are aliases for this                                   |
|------+------------------+--------------------------------------------------------|
| all  | build            | $(outdir)/build                                        |
|      | install          | $(outdir)/install                                      |
|      | uninstall        | $(outdir)/uninstall                                    |
|      | mostlyclean      | $(outdir)/mostlyclean                                  |
|      | clean            | $(outdir)/clean                                        |
|      | distclean        | $(outdir)/distclean                                    |
|      | maintainer-clean | $(outdir)/maintainer-clean                             |
|      | check            | $(outdir)/check (not implemented for you)              |
|      | dist             | $(topoutdir)/$(PACKAGE)-$(VERSION).tar.gz (not .PHONY) |

You are responsible for implementing the `$(outdir)/check` target in
each of your Makefiles.

Telling automake about your program
-----------------------------------

You tell automake what to do for you by setting some variables.  They
are all prefixed with `am_`; this prefix may be changed by editing the
`_am` variable at the top of `automake.head.mk`.

There are several commands that generate files; simply record the list
of files that each command generates as the following variable
variables:

| Variable     | Create Command | Delete Command              | Description                       | Relative to |
|--------------+----------------+-----------------------------+-----------------------------------+-------------|
| am_src_files | emacs          | rm -rf .                    | Files that the developer writes   | srcdir      |
| am_gen_files | ???            | make maintainer-clean       | Files the developer compiles      | srcdir      |
| am_cfg_files | ./configure    | make distclean              | Users' compile-time configuration | outdir      |
| am_out_files | make all       | make mostlyclean/make clean | Files the user compiles           | outdir      |
| am_sys_files | make install   | make uninstall              | Files the user installs           | DESTDIR     |

In addition, there are two more variables that control not how files
are created, but how they are deleted:

| Variable       | Affected command | Description                                    | Relative to |
|----------------+------------------+------------------------------------------------+-------------|
| am_clean_files | make clean       | A list of things to `rm` in addition to the    | outdir      |
|                |                  | files in `$(am_out_files)`.  (Example: `*.o`)  |             |
|----------------+------------------+------------------------------------------------+-------------|
| am_slow_files  | make mostlyclean | A list of things that (as an exception) should | outdir      |
|                |                  | _not_ be deleted.  (otherwise, `mostlyclean`   |             |
|                |                  | is the same as `clean`)                        |             |

Finally, there are two variables that express the relationships
between directories:

| Variable   | Description                                             |
|------------+---------------------------------------------------------|
| am_subdirs | A list of other directories (containing Makefiles) that |
|            | may be considered "children" of this                    |
|            | directory/Makefile; building a phony target in this     |
|            | directory should also build it in the subdirectory.     |
|            | They are not necesarily actually subdirectories of this |
|            | directory in the filesystem.                            |
|------------+---------------------------------------------------------|
| am_depdirs | A list of other directories (containing Makefiles) that |
|            | contain or generate files that are dependencies of      |
|            | targets in this directory.  They are not necesarily     |
|            | actually subdirectories of this directory in the        |
|            | filesystem.  Except for files that are dependencies of  |
|            | files in this directory, things in the dependency       |
|            | directory will not be built.                            |

----
Copyright (C) 2016  Luke Shumaker

This documentation file is placed into the public domain.  If that is
not possible in your legal system, I grant you permission to use it in
absolutely every way that I can legally do so.