gettext
iconv
rc
Scripts)This section explains the most common things to consider when creating a port.
bsd.port.mk
expects ports to work
with a “stage directory”. This means that a port
must not install files directly to the regular destination
directories (that is, under PREFIX
, for
example) but instead into a separate directory from which the
package is then built. In many cases, this does not require
root privileges, making it possible to build packages as an
unprivileged user. With staging, the port is built and
installed into the stage directory,
STAGEDIR
. A package is created from the
stage directory and then installed on the system. Automake
tools refer to this concept as DESTDIR
, but
in FreeBSD, DESTDIR
has a different meaning
(see Section 9.4, “PREFIX
and
DESTDIR
”).
No port really needs to be root. It
can mostly be avoided by using USES=uidfix
.
If the port still runs commands like chown(8),
chgrp(1), or forces owner or group with install(1)
then use USES=fakeroot
to fake those calls. Sligh patching of the port's
Makefiles
will be needed.
Meta ports, or ports that do not install files themselves but only depend on other ports, must avoid needlessly extracting the mtree(8) to the stage directory. This is the basic directory layout of the package, and these empty directories will be seen as orphans. To prevent mtree(8) extraction, add this line:
NO_MTREE= yes
Metaports should use USES=metaport
.
It sets up defaults for ports that do not fetch, build, or
install anything.
Staging is enabled by prepending
STAGEDIR
to paths used in the
pre-install
,
do-install
, and
post-install
targets (see the
examples through the book). Typically, this includes
PREFIX
, ETCDIR
,
DATADIR
, EXAMPLESDIR
,
MANPREFIX
, DOCSDIR
, and
so on. Directories should be created as part of the
post-install
target. Avoid using
absolute paths whenever possible.
When creating a symlink, STAGEDIR
is prepended to the target path only. For
example:
${LN} -sflibfoo.so.42
${STAGEDIR}${PREFIX}/lib/libfoo.so
The source path
${PREFIX}/lib/
looks fine but
could, in fact, be incorrect. Absolute paths can point to a
wrong location, like when a remote file system has been
mounted with NFS under a non-root mount
point. Relative paths are less fragile, and often much
shorter.libfoo.so.42
Ports that install kernel modules must prepend
STAGEDIR
to
their destination, by default
/boot/modules
.
All FreeBSD documents are available for download at http://ftp.FreeBSD.org/pub/FreeBSD/doc/
Questions that are not answered by the
documentation may be
sent to <[email protected]>.
Send questions about this document to <[email protected]>.