WRKDIR
Infrastructure
infrastructure/bin
that facilitate the creation of new ports:
make lib-depends-check
, to verify shared
libraries dependencies.
make update-patches
, which should
always be used to regenerate patches.
make update-plist
.
This takes care of most of the finest points of crafting accurate
packing-lists.
OpenBSD packing-lists are significantly different from those of other
BSD projects, in part because the package tools have been completely
rewritten.
infrastructure/bin
directory for more useful scripts.
Most of them have man pages.
${VAR:U}
and ${VAR:L}
to transform a variable's value
into uppercase or lowercase. Accordingly, make tests should be coded in
a case-independent way.
For example:
.if ${NEED_XXX:L} == "yes" do stuff if yes .else do other stuff .endifIn theory, all boolean variables recognized by
bsd.port.mk
should
always be defined, so that code like defined(USE_FOO)
should not
be necessary, and ${USE_FOO:L} != "no"
ought to work.
The main bsd.port.mk
file has been heavily streamlined and fixed.
In particular, it is parallel-make ready.
The scripts/{pre,do,post}-*
feature has been lost in the process.
To replace that feature,
invoke the script manually from the Makefile
.
make VAR=value
,
the assignment will override whatever value VAR
may get from the
Makefile
.
This means that many Makefile
patches are not necessary.
It is much better to set MAKE_FLAGS
correctly, which decreases the
maintenance burden.
DISTFILES
and
PATCHFILES
.
OpenBSD processes them in a uniform way and retrieves everything from
MASTER_SITES
by default.
There are no PATCH_SITES
nor PATCH_SITES_SUBDIR
.
If all files to fetch don't come from the same set of sites, OpenBSD allows
the extension filename:0
to filename:9
, in which case
it will use MASTER_SITES0
to MASTER_SITES9
to
retrieve the file.
Some architectures may need specific distfiles.
In the past, this has caused trouble where mirroring distfiles was concerned.
OpenBSD supports a third set of files: SUPDISTFILES
.
Those will be considered only for creating checksums and mirroring purposes.
Note that SUPDISTFILES
may have an overlap with
DISTFILES
or
PATCHFILES
.
For instance:
DISTFILES=foo-1.0.tgz .if ${ARCH} == "i386" DISTFILES+=foo-i386.tgz .elif ${ARCHI} == "amd64" DISTFILES+=foo-amd64.tgz .endif SUPDISTFILES=foo-i386.tgz foo-amd64.tgz
WRKDIR
InfrastructureNO_WRKDIR
.
All OpenBSD ports must have a work directory.
Naming details of those work directories should not be a porter's concerns.
If you need to find out about such a name, ask the Makefile
:
$ cd that_ports_dir && make show=WRKDIRThis will yield that port's idea of
WRKDIR
.
The main reason behind this prohibition is that OpenBSD's
bsd.port.mk
acts like a real Makefile
, with dependencies.
The fetch
stage depends upon the distfiles and patchfiles, and all
other stages depend on real files living in the working directory (cookies),
so they can't exist without a working directory.
If the DISTFILES
extraction is special, set
EXTRACT_ONLY=and do the extraction in
post-extract.
WRKDIR
WRKDIST
WRKDIR
where the port actually unpacks.
It is also the base directory for patch.
Other BSDs currently don't have the WRKDIST/WRKSRC
distinction and
have only WRKSRC
.WRKSRC
WRKDIST
where the actual source lives.WRKBUILD
WRKDIR
where the port configure and build will
occur.
Other BSDs don't have the WRKBUILD/WRKSRC
distinction.
Programs based on autoconf (mostly) can usually set SEPARATE_BUILD
to let the port build happen in a WRKBUILD
distinct from
WRKSRC
.WRKCONF
WRKDIR
where configure scripts should be run.
Defaults to WRKBUILD
, which is correct 99% of the time.WRKINST
Note that NO_WRKSUBDIR
has been removed: its functionality can
be achieved by setting WRKDIST=$(WRKDIR)
instead.
PREFIX
, usually /usr/local
).
WRKINST
, which
is usually a subdirectory of WRKDIR
.
-B
option of
pkg_create.
make fake
are the usual install
targets, except for a few differences:
FAKE_FLAGS
is used instead of MAKE_FLAGS
.
By default, FAKE_FLAGS
sets DESTDIR=${WRKINST}
.
FAKE_TARGET
is used instead of INSTALL_TARGET
.
{pre,do,post}-install
fragments are invoked with
TRUEPREFIX
set to $(PREFIX)
,
PREFIX
set to $(WRKINST)$(PREFIX)
, and
DESTDIR
set to $(WRKINST)
.
Ports using imake should work as is, since the imake fragments are configured
to use DESTDIR
.
Similarly, recent GNU configure ports should need no change.
Another good technique is a "late binding" trick: configure the ports to use
a prefix of $(DESTDIR)/usr/local
, so that the resulting
Makefile
has the following set:
prefix=$(DESTDIR)/usr/localWhen the port gets built, since
DESTDIR
is set to nothing,
/usr/local
is used.
The fake install will put everything into ${WRKINST}/usr/local
(e.g., for GNU configure, use CONFIGURE_STYLE= gnu dest
).
DESTDIR
processing: most
of the port is happy with DESTDIR
set, except for one or two
offenders.
Patch the problem away.
TRUEPREFIX
.
bsd.port.mk
will notice problems in that area.
$(DESTDIR)
alone at the
configure stage.
A post-configure
fragment that tweaks all Makefiles to add the
DESTDIR
is needed.
pre-fake
to link or copy
everything the port wants to find in the WRKINST
area, then perform
the install under chroot.
@exec
commands or INSTALL
scripts are unneeded.
Note that all unneeded scripts should be banned, as they have scalability issues. It is much easier to debug one single package infrastructure than to modify hundreds of scripts to handle new problems. For instance:
@exec ldconfig
is not needed, as shared libraries are
annotated with @lib libfoo.so.1.0
and ldconfig
runs only when needed, and handles chroot gracefully.
@exec install-info
is not needed, as info documentation
files are annotated with @info file.info
.
This also takes care of multiple info files, and removes the need for
makeinfo --no-split
.
@font
and
@fontdir
.
@newuser
and
@newgroup
instead of installation scripts.
They also get created early enough so that further package extraction can
use them.
@tag
which triggers running tools like update-desktop-database once at the
end of installation.
@sample
instead
of installation scripts.
Refer to pkg_create(1) for
more details.
In most cases, make update-plist
will write a very good
approximation of a complete packing-list, and will carry hand-made tweaks
from one version to the next.
FLAVORS
to the list of all options
that make sense for that port (e.g., FLAVORS=foo bar zoinx
),
then use
FLAVOR
to test what options have actually been selected (e.g.,
FLAVOR=zoinx foo
).
bsd.port.mk
provides some support:
PKGNAME
is tweaked to include dash separated options (e.g.,
package-foo-zoinx
).
WRKDIR
is tweaked so that distinct flavors can be built
concurrently without colliding.
%%flavor%%
will trigger the inclusion of
PFRAG.flavor
.
bsd.port.subdir.mk
understands the extension
SUBDIR=directory,opt1,opt2
to say
"build port in directory
with FLAVOR=opt1 opt2
."
Checking that a given flavor has been selected is as simple as:
.if ${FLAVOR:Mzoinx}There is an extra extension, known as
MULTI_PACKAGES
.
Generally speaking, MULTI_PACKAGES
and FLAVORS
are orthogonal mechanisms.
Together, they account for OpenBSD ports tree being somewhat smaller than the
other BSDs, as they allow one single port directory to build lots of distinct
packages.
bsd.port.mk(5) has
a full
section devoted to FLAVORS AND MULTI_PACKAGES.