1.\" Copyright (c) 2002-2003 David O'Brien <obrien@FreeBSD.org> 2.\" All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice, this list of conditions and the following disclaimer. 9.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" notice, this list of conditions and the following disclaimer in the 11.\" documentation and/or other materials provided with the distribution. 12.\" 3. Neither the name of the author nor the names of any contributors 13.\" may be used to endorse or promote products derived from this software 14.\" without specific prior written permission. 15.\" 16.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19.\" ARE DISCLAIMED. IN NO EVENT SHALL DAVID O'BRIEN OR CONTRIBUTORS BE LIABLE 20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26.\" SUCH DAMAGE. 27.\" 28.\" $FreeBSD$ 29.\" 30.Dd January 8, 2005 31.Dt STYLE.MAKEFILE 5 32.Os 33.Sh NAME 34.Nm style.Makefile 35.Nd 36.Fx 37.Pa Makefile 38file style guide 39.Sh DESCRIPTION 40This file specifies the preferred style for makefiles in the 41.Fx 42source tree. 43.Bl -bullet 44.It 45All makefiles should have an SCM ID at the start of the file, 46followed by a blank line. 47.Bd -literal 48# $FreeBSD\&$ 49 50.Ed 51.It 52.Cm .PATH : 53comes next if needed, and is spelled 54.Dq Li ".PATH: " , 55with a single 56.Tn ASCII 57space after a colon. 58Do not use the 59.Va VPATH 60variable. 61.It 62Special variables (i.e., 63.Va LIB , SRCS , MLINKS , 64etc.) are listed in order of 65.Dq product , 66then building and installing a binary. 67Special variables may also be listed in 68.Dq build 69order: i.e., ones for the primary program (or library) first. 70The general 71.Dq product 72order is: 73.Va PROG Ns / Ns Oo Va SH Oc Ns Va LIB Ns / Ns Va SCRIPTS 74.Va FILES 75.Va LINKS 76.Oo Va NO_ Oc Ns Va MAN 77.Va MLINKS 78.Va INCS 79.Va SRCS 80.Va WARNS 81.Va CFLAGS 82.Va DPADD 83.Va LDADD . 84The general 85.Dq build 86order is: 87.Va PROG Ns / Ns Oo Va SH Oc Ns Va LIB Ns / Ns Va SCRIPTS 88.Va SRCS 89.Va WARNS 90.Va CFLAGS 91.Va DPADD 92.Va LDADD 93.Va INCS 94.Va FILES 95.Va LINKS 96.Oo Va NO_ Oc Ns Va MAN 97.Va MLINKS . 98.It 99Omit 100.Va SRCS 101when using 102.In bsd.prog.mk 103and there is a single source file named the same as the 104.Va PROG . 105.It 106Omit 107.Va MAN 108when using 109.In bsd.prog.mk 110and the manual page is named the same as the 111.Va PROG , 112and is in section 1. 113.It 114All variable assignments are spelled 115.Dq Va VAR Ns Ic = , 116i.e., no space between the variable name and the 117.Ic = . 118Keep values sorted alphabetically, if possible. 119.It 120Do not use 121.Ic += 122to set variables that are only set once 123(or to set variables for the first time). 124.It 125Do not use vertical whitespace in simple makefiles, 126but do use it to group locally related things in more complex/longer ones. 127.It 128.Va WARNS 129comes before 130.Va CFLAGS , 131as it is basically a 132.Va CFLAGS 133modifier. 134It comes before 135.Va CFLAGS 136rather than after 137.Va CFLAGS 138so it does not get lost in a sea of 139.Va CFLAGS 140statements as 141.Va WARNS 142is an important thing. 143The usage of 144.Va WARNS 145is spelled 146.Dq Li "WARNS?= " , 147so that it may be overridden on the command line or in 148.Pa /etc/make.conf . 149.It 150.Dq Li "NO_WERROR= yes" 151should not be used, 152it defeats the purpose of 153.Va WARNS . 154It should only be used on the command line and in special circumstances. 155.It 156.Va CFLAGS 157is spelled 158.Dq Li "CFLAGS+= " . 159.It 160Listing 161.Fl D Ns 's 162before 163.Fl I Ns 's 164in 165.Va CFLAGS 166is preferred for alphabetical ordering and to make 167.Fl D Ns 's 168easier to see. 169The 170.Fl D Ns 's 171often affect conditional compilation, 172and 173.Fl I Ns 's 174tend to be quite long. 175Split long 176.Va CFLAGS 177settings between the 178.Fl D Ns 's 179and 180.Fl I Ns 's. 181.It 182Do not use GCCisms (such as 183.Fl g 184and 185.Fl Wall ) 186in 187.Va CFLAGS . 188.It 189Typically, there is one 190.Tn ASCII 191tab between 192.Va VAR Ns Ic = 193and the value in order to start the value in column 9. 194An 195.Tn ASCII 196space is allowed for variable names that extend beyond column 9. 197A lack of whitespace is also allowed for very long variable names. 198.It 199.Ic .include In bsd.*.mk 200goes last. 201.It 202Do not use anachronisms like 203.Va $< 204and 205.Va $@ . 206Instead use 207.Va ${.IMPSRC} 208or 209.Va ${.ALLSRC} 210and 211.Va ${.TARGET} . 212.El 213.Pp 214The desire to express a logical grouping often means not obeying some of the 215above. 216.Sh EXAMPLES 217The simplest program 218.Pa Makefile 219is: 220.Bd -literal -offset indent 221# $FreeBSD\&$ 222 223PROG= foo 224 225\&.include <bsd.prog.mk> 226.Ed 227.Pp 228The simplest library 229.Pa Makefile 230is: 231.Bd -literal -offset indent 232# $FreeBSD\&$ 233 234LIB= foo 235SHLIB_MAJOR= 1 236MAN= libfoo.3 237SRCS= foo.c 238 239\&.include <bsd.lib.mk> 240.Ed 241.Sh SEE ALSO 242.Xr make 1 , 243.Xr style 9 244.Sh HISTORY 245This manual page is inspired from the same source as 246.Xr style 9 247manual page in 248.Fx . 249.Sh BUGS 250There are few hard and fast style rules here. 251The style of many things is too dependent on the context of the whole makefile, 252or the lines surrounding it. 253