Each location in the ports tree is uniquely identified through a
pkgpath, which encodes the directory, flavor and
subpackage information that allows the build of a package. This is not to be
confused with PKG_PATH, the list of URLs
from which
pkg_add(1)
retrieves binary packages.

Every pkgpath conforms to the pattern
some/directory[,-sub][,flavor...].

The some/directory part refers to the directory
part, to find under the portstree, usually in
/usr/ports (or
/usr/ports/mystuff for port developers).

The ,-sub optional part refers to a specific
subpackage from a multi-package port. It can be left blank for non
multi-package ports, or to get the default subpackage (usually
-main).

The ,flavor... optional part refers to the
flavors or pseudo-flavors to use when building the package. If left blank, it
refers to the default flavor. An explicit empty flavor can also be specified
to make sure to get an empty flavor, even if it does not correspond to the
default flavor.

Note that -sub and
flavor parts can be specified in any order,
as all subpackages start with a dash. It is an error to ask for several subs
at once, e.g. some/path,-sub1,-sub2, though
it won't always be flagged as a problem.

For instance:

misc/screen

A simple directory, default flavor, which happens to be
empty.

misc/screen,static

Same port, static
flavor.

x11/kde/libs3

A multi-package port with no subpackage nor flavor, refers
to x11/kde/libs3,-main.

net/avahi

Multi-package port with default flavor. Will actually build
with FLAVOR="no_gui no_mono no_qt3 no_qt4 bootstrap" (all of
which are pseudo-flavors), so that only the main package will build.

net/avahi,no_mono,-qt3

Build avahi with the "no_mono" pseudo-flavor,
which will build the -main, -qt3, -qt4, -gui, -gtk, -gtk3, and -ui
subpackages, and refer to the -qt3
subpackage.

net/avahi,

net/avahi with an explicit
empty flavor, default subpackage (which happens to be
-main).

net/avahi,,-qt4

net/avahi with an explicit
empty flavor, -qt4 subpackage.

The ports tree can iterate over lists of pkgpath
through SUBDIR="pkgpath1 pkgpath2..." or
through a full list through SUBDIRLIST=file.

When the ports tree handles dependencies, it passes
pkgpath from
BUILD_DEPENDS,
LIB_DEPENDS,
RUN_DEPENDS, and
TEST_DEPENDS to the dependent port for
normalisation purposes. That way, the pkgpath
that gets recorded in the package doesn't have any "default" flavor
or "default" subpackage left: those are always resolved to the
correct value.

Likewise, pseudo-flavors vanish from the pkgpath,
since they only participate in the build process, but do not intervene in the
built package.

As a result, such pkgpath are slightly different
from the description above, as a flavor left blank is the empty flavor (and
not the default flavor). This is the “fullpath convention”.

Tools such as dpb(1)
display fullpath pkgpaths, and binary packages store full pkgpaths.

SUBDIR and
SUBDIRLIST can be forced to follow the
fullpath convention by explicitly passing FULLPATH=Yes
to the corresponding
make(1) invocations.