---
name: "release"
section: "8"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["openbsd"]
url: "https://new.carta.tech/release/8"
---

# release(8)

building an OpenBSD release

## NAME

**release** – building an OpenBSD release

## DESCRIPTION

There are several steps necessary to build a release:

1. Update sources.

2. Build and install a new kernel.

3. Build a new base system.

4. Make and validate the base system release.

5. Build and install Xenocara.

6. Make and validate the Xenocara release.

7. Create boot and installation disk images.

8. Make the third party packages.

This manual describes the steps for the *release* and *stable* branches. To build a *current* release, additional steps may be required. See **https://www.openbsd.org/faq/current.html** for any needed workarounds.

Commands to be run as a user are preceded by a dollar sign ‘$’. Commands that must be run as the superuser are preceded by a hash mark ‘#’. Privileges will be de-escalated to the user **build** whenever possible.

Most of the defaults can be overridden by setting the appropriate variables in [mk.conf(5)](/mk.conf/5.md).

### 1. Update sources

A **release** should use sources that were checked out using the same [cvs(1)](/cvs/1.md) tag. There are two families of tags:

- OPENBSD\_x\_y\_BASE

  The sources for the OpenBSD x.y release.

- OPENBSD\_x\_y

  The sources for the OpenBSD x.y stable branch. It contains the patches described in **https://www.openbsd.org/stable.html**.

See **https://www.openbsd.org/anoncvs.html** for instructions on fetching the sources for the first time.

To update existing sources to the versions identified by one of the above tags, use the commands:

```
$ cd /usr/src && cvs up -r TAG -Pd
$ cd /usr/xenocara && cvs up -r TAG -Pd
$ cd /usr/ports && cvs up -r TAG -Pd
```

**Warning**: [cvs(1)](/cvs/1.md) tags are ‘sticky’. See [cvs(1)](/cvs/1.md) for more information.

### 2. Build and install a new kernel

Always build and install a new kernel and reboot before building the programs that will use the kernel. This ensures that any new system calls, for example, will be present when needed.

```
# cd /sys/arch/$(machine)/compile/GENERIC.MP
```

Replace *GENERIC.MP* with a different kernel configuration if necessary.

Create the build directory and configuration file, then compile and install the kernel:

```
# make obj
# make config
# make && make install
```

The current kernel is copied to */obsd* and the new kernel to */bsd*. Reboot.

### 3. Build a new base system

The build process will place the object files in a tree under */usr/obj*. This directory must be owned by build:wobj with mode 770.

Create the tree of obj directories and begin the build:

```
# cd /usr/src
# make obj && make build
```

After the build is completed, update */etc*, */var*, and */dev*, using [sysmerge(8)](/sysmerge/8.md) and [MAKEDEV(8)](/MAKEDEV/8.md):

```
# sysmerge
# cd /dev && ./MAKEDEV all
```

At this point, the base system is up to date with the code that will be made into a release.

### 4. Make and validate the base system release

The base system release consists of at least one generic kernel, some installation media, the release tarballs, installation instructions, and checksum files.

On arm64, armv7 and riscv64 architectures, additional files are required. Install the following packages using pkg\_add(1) or from [ports(7)](/ports/7.md):

- arm64

  raspberrypi-firmware u-boot-rpi

- armv7

  dtb u-boot-arm

and install the following firmware packages using [fw\_update(8)](/fw_update/8.md):

- riscv64

  riscv64-spacemit-dtb

Create a *RELEASEDIR* directory to store the release files. This directory must be writable by **build**.

To build a release, it is necessary to prepare a filesystem mounted with the *noperm* [mount(8)](/mount/8.md) option. Either standard FFS or [mount\_mfs(8)](/mount_mfs/8.md) may be used. The root of this filesystem must have owner **build** and mode 700. On this filesystem, create a *DESTDIR* directory. This will be the root of a complete OpenBSD installation.

**Warning**: *DESTDIR* and *RELEASEDIR* must not refer to any directory with */mnt* in its path, as */mnt* is used in the release generation process. The [vnd(4)](/vnd/4.md) device vnd0 is also used and must not be configured.

Make the release and check the contents of the release tarballs:

```
# export DESTDIR=your-destdir RELEASEDIR=your-releasedir
# cd /usr/src/etc && make release
# cd /usr/src/distrib/sets && sh checkflist
# unset RELEASEDIR DESTDIR
```

### 5. Build and install Xenocara

Xenocara is based on the X.Org modular build system. Its sources are supposed to be in */usr/xenocara*. The */usr/src* tree is also needed while building Xenocara. The object directory */usr/xobj* should be empty and owned by build:wobj with mode 770.

The following steps will build and install Xenocara.

```
# cd /usr/xenocara
# make bootstrap
# make obj
# make build
```

### 6. Make and validate the Xenocara release

Xenocara uses *DESTDIR* and *RELEASEDIR* as described above. Use a different *DESTDIR* for the Xenocara release than for the base release, as the contents of *DESTDIR* will be removed.

The steps to build and validate the Xenocara release are:

```
# export DESTDIR=your-destdir RELEASEDIR=your-releasedir
# make release
# make checkdist
# unset RELEASEDIR DESTDIR
```

At this point, OpenBSD base system and X Window System tarballs are in *RELEASEDIR*.

### 7. Create boot and installation disk images

The disk images install${*VERSION*}.img and install${*VERSION*}.iso are suitable for installs without network connectivity. They contain the tarballs built in the previous steps.

```
# export RELDIR=your-releasedir RELXDIR=your-xenocara-releasedir
# cd /usr/src/distrib/$(machine)/iso && make
# make install
```

The two installer images are now stored in the local release directory.

### 8. Make the third party packages

The ports subsystem of contributed applications is capable of producing packages for installation, either individually or in bulk. This is described in [ports(7)](/ports/7.md).

## SEE ALSO

[cvs(1)](/cvs/1.md), pkg\_add(1), [mk.conf(5)](/mk.conf/5.md), [ports(7)](/ports/7.md), [sysmerge(8)](/sysmerge/8.md)
