STYLE.MAKEFILE(5)

NAME
style.Makefile - FreeBSD Makefile 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.

•   Lists that span more than one line should be formatted as follows:

        SRCS+=<SP>\
        <TAB>main.c<SP>\
        <TAB>trace.c<SP>\
        <TAB>zoo.c \

    Specifically, the last item in the list should have a trailing '\'. This is to avoid causing a "false diff" or "false blame" when a new item is appended at the end. In general the list should be English language alphabetized. A list of libraries or header inclusion paths are notable exceptions if needed for proper building.

•   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.

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
make(1), make.conf(5), style(9)

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 desire to express a logical grouping sometimes means not obeying some of the above. The style of many things is too dependent on the context of the whole makefile, or the lines surrounding it.