STYLE.MAKEFILE(5)         FreeBSD File Formats Manual        STYLE.MAKEFILE(5)

NAME

     style.Makefile - FreeBSD Makefile style guide

DESCRIPTION

     This file specifies the preferred style for makefiles in the FreeBSD
     source tree.

     o   .PATH: comes first if needed, and is spelled ".PATH: ", with a single
         ASCII space after a colon.  Do not use the VPATH variable.

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

     o   Omit SRCS when using <bsd.prog.mk> and there is a single source file
         named the same as the PROG.

     o   Omit MAN when using <bsd.prog.mk> and the manual page is named the
         same as the PROG, and is in section 1.

     o   All variable assignments are spelled "VAR=", i.e., no space between
         the variable name and the =.  Keep values sorted alphabetically, if
         possible.

     o   Variables are expanded with {}, not ().  Such as ${VARIABLE}.

     o   Do not use += to set variables that are only set once (or to set
         variables for the first time).

     o   Do not use vertical whitespace in simple makefiles, but do use it to
         group locally related things in more complex/longer ones.

     o   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).

     o   "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.

     o   CFLAGS is spelled "CFLAGS+= ".

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

     o   Do not use GCCisms (such as -g and -Wall) in CFLAGS.

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

     o   .include <bsd.*.mk> goes last.

     o   Do not use anachronisms like $< and $@.  Instead use ${.IMPSRC} or
         ${.ALLSRC} and ${.TARGET}.

     o   To not build the "foo" part of the base system, use NO_FOO, not
         NOFOO.

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

     o   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

     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 style of many things
     is too dependent on the context of the whole makefile, or the lines
     surrounding it.

FreeBSD 15.1-STABLE-HBSD         July 17, 2023               STYLE.MAKEFILE(5)