gettext
iconv
rc
Scripts)There are some more things you have to take into account when you create a port. This section explains the most common of those.
bsd.port.mk
expects ports to work
with a “stage directory”. This means that a port
should 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
”).
When a port still requires system-wide privileges in order
to run the stage
and
package
targets, this line must be
added to the
Makefile
:
NEED_ROOT= yes
The vast majority of ports do not really
need to be root. You can mostly avoid it by
using USES=uidfix
,
and from time to time by slightly patching the port's
Makefiles
.
Meta ports, or ports that do not install files themselves but only depend on other ports, should 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
Staging is enabled by prepending the
STAGEDIR
variable 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
should be prepended to the target path only. For
example:
${LN} -sf libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so
The source path
${PREFIX}/lib/libfoo.so.42
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.
Ports that install kernel modules must prepend the
STAGEDIR
variable 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 <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.