---
name: "style.Makefile"
section: "5"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/style.Makefile"
---

# style.Makefile(5)

FreeBSD Makefile style guide

## 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)](/make.conf/5.md).

- “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

[make(1)](/make/1.md), [make.conf(5)](/make.conf/5.md), [style(9)](/style/9.md)

## HISTORY

This manual page is inspired from the [style(9)](/style/9.md) 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.
