NAME
style.Makefile
—
FreeBSD
Makefile file style guide
DESCRIPTION
This file specifies the preferred style for makefiles in the FreeBSD source tree.
.PATH
: comes first if needed, and is spelled “.PATH:
”, with a single ASCII space after a colon. Do not use the VPATH variable.- Special variables (i.e., LIB, SRCS, MLINKS, etc.) are listed in order of “product”, then building and installing a binary. Special variables may also be listed in “build” order: i.e., ones for the primary program (or library) first. The general “product” order is: PROG/[SH]LIB/SCRIPTS FILES LINKS MAN MLINKS INCS SRCS WARNS CSTD CFLAGS DPADD LDADD. The general “build” order is: PROG/[SH]LIB/SCRIPTS SRCS WARNS CSTD CFLAGS DPADD LDADD INCS FILES LINKS MAN MLINKS.
- Omit SRCS when using
<bsd.prog.mk>
and there is a single source file named the same as the PROG. - Omit MAN when using
<bsd.prog.mk>
and the manual page is named the same as the PROG, and is in section 1. - All variable assignments are spelled
“VAR
=
”, i.e., no space between the variable name and the=
. Keep values sorted alphabetically, if possible. - Variables are expanded with {}, not (). Such as ${VARIABLE}.
- Do not use
+=
to set variables that are only set once (or to set variables for the first time). - Do not use vertical whitespace in simple makefiles, but do use it to group locally related things in more complex/longer ones.
- WARNS comes before
CFLAGS, as it is basically a
CFLAGS modifier. It comes before
CFLAGS rather than after
CFLAGS so it does not get lost in a sea of
CFLAGS statements as WARNS is
an important thing. The usage of WARNS is spelled
“
WARNS?=
”, so that it may be overridden on the command line or in make.conf(5). - “
MK_WERROR=no
” should not be used, it defeats the purpose of WARNS. It should only be used on the command line and in special circumstances. - CFLAGS is spelled
“
CFLAGS+=
”. - Listing
-D
's before-I
's in CFLAGS is preferred for alphabetical ordering and to make-D
's easier to see. The-D
's often affect conditional compilation, and-I
's tend to be quite long. Split long CFLAGS settings between the-D
's and-I
's. - Do not use GCCisms (such as
-g
and-Wall
) in CFLAGS. - Typically, there is one ASCII tab between
VAR
=
and the value in order to start the value in column 9. An ASCII space is allowed for variable names that extend beyond column 9. A lack of whitespace is also allowed for very long variable names. .include
<bsd.*.mk>
goes last.- Do not use anachronisms like $< and $@. Instead use ${.IMPSRC} or ${.ALLSRC} and ${.TARGET}.
- To not build the “foo” part of the base system, use NO_FOO, not NOFOO.
- To optionally build something in the base system, spell the knob WITH_FOO not WANT_FOO or USE_FOO. The latter are reserved for the FreeBSD Ports Collection.
- For variables that are only checked with
defined
(), do not provide any fake value.
The desire to express a logical grouping often means not obeying some of the above.
EXAMPLES
The simplest program Makefile is:
PROG= foo .include <bsd.prog.mk>
The simplest library Makefile is:
LIB= foo SHLIB_MAJOR= 1 MAN= libfoo.3 SRCS= foo.c .include <bsd.lib.mk>
SEE ALSO
HISTORY
This manual page is inspired from the style(9) manual page and first appeared in FreeBSD 5.1.
AUTHORS
David O'Brien ⟨deo@NUXI.org⟩
BUGS
There are few hard and fast style rules here. The style of many things is too dependent on the context of the whole makefile, or the lines surrounding it.