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 In 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
HISTORY
This manual page is inspired from the style(9) manual page and first appeared in FreeBSD 5.1.
AUTHORS
David O'Brien ⟨[email protected]⟩
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.