---
title: Chapter 14. A Sample Makefile
prev: books/porters-handbook/porting-dads
next: books/porters-handbook/order
description: A sample Makefile that can be used to create a new FreeBSD Port
tags: ["sample", "makefile"]
showBookMenu: true
weight: 14
params:
  path: "/books/porters-handbook/porting-samplem/"
---

[[porting-samplem]]
= A Sample Makefile
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 14
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/porters-handbook/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

Here is a sample [.filename]#Makefile# that can be used to create a new port.

The format shown is the recommended one for crossref:order[, ordering] variables, empty lines between sections, and so on.
This format is designed so that the most important information is easy to locate.
Refer to crossref:testing[, the chapter about testing] to learn more about tools for linting, formatting, and checking the [.filename]#Makefile#.

[.programlisting]
....
PORTNAME=	xdvi <1>
DISTVERSION=	18.2
CATEGORIES=	print
MASTER_SITES=	${MASTER_SITE_XCONTRIB} <2>
MASTER_SITE_SUBDIR=	applications
PKGNAMEPREFIX=	ja-
DISTNAME=	xdvi-pl18
EXTRACT_SUFX=	.tar.Z <3>

PATCH_SITES=	ftp://ftp.sra.co.jp/pub/X11/japanese/ <4>
PATCHFILES=	xdvi-18.patch1.gz xdvi-18.patch2.gz
PATCH_DIST_STRIP=	-p1 <5>

MAINTAINER=	asami@FreeBSD.org <6>
COMMENT=	DVI Previewer for the X Window System
WWW=		http://xdvi.sourceforge.net/

LICENSE=	BSD2CLAUSE <7>
LICENSE_FILE=	${WRKSRC}/LICENSE

RUN_DEPENDS=	gs:print/ghostscript <8>

USES=		gmake <9>

<10>
IS_INTERACTIVE=	yes <11>
WRKSRC=		${WRKDIR}/xdvi-new <12>
GNU_CONFIGURE=	yes <13>

<14>
OPTIONS_DEFINE=	DOCS EXAMPLES FOO
OPTIONS_DEFAULT=FOO
OPTIONS_SUB=	yes <15>

FOO_DESC=		Enable foo support
FOO_CONFIGURE_ENABLE=	foo

<16>
MY_FAVORITE_RESPONSE=	"yeah, right"

<17>
pre-fetch:
	i go fetch something, yeah

post-patch:
	i need to do something after patch, great

pre-install:
	and then some more stuff before installing, wow

.include <bsd.port.mk> <18>
....

<1> Section to describe the port itself and the master site -- `PORTNAME` and `PORTVERSION` or the `DISTVERSION*` variables are always first, followed by `CATEGORIES`, and then `MASTER_SITES`, which can be followed by `MASTER_SITE_SUBDIR`.
`PKGNAMEPREFIX` and `PKGNAMESUFFIX`, if needed, will be after that.
Then comes `DISTNAME`, `EXTRACT_SUFX` and/or `DISTFILES`, and then `EXTRACT_ONLY`, as necessary.
<2> Do not forget the trailing slash (`/`) if not using `MASTER_SITE_*` macros.
<3> Set this if the source is not in the standard ".tar.gz" form.
<4> Section for distributed patches -- can be empty.
<5> If the distributed patches were not made relative to `WRKSRC`, this may need to be tweaked.
<6> Maintainer; *mandatory*!
This is the person who is volunteering to handle port updates, build breakages, and to whom a users can direct questions and bug reports.
To keep the quality of the Ports Collection as high as possible, we do not accept new ports that are assigned to "ports@FreeBSD.org".
<7> License -- should not be empty.
<8> Dependencies -- can be empty.
<9> If the port requires GNU make instead of the default FreeBSD `make` (man:make[1]) to build.
For example, some X applications require `xmkmf -a` to run, in which case the port would need `USES=imake`.
<10> This section is for other standard [.filename]#bsd.port.mk# variables that do not belong to any of the above.
<11> If the ports asks interactive questions during configure, build, install.
<12> If it extracts to a directory other than `DISTNAME`.
<13> If it requires a `configure` script generated by GNU autoconf to be run.
<14> This section is for handling ports options.
<15> Set `OPTIONS_SUB` if options will change the list of files in the crossref:plist[plist-sub, plist].
<16> Non-standard variables to be used in the rules below.
<17> Special rules, in the order they are called by the ports framework.
<18> Finally, the epilogue.
