summaryrefslogtreecommitdiffstats
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/archive/mirroring.mdwn108
-rw-r--r--dev/multiarch.mdwn180
-rw-r--r--dev/opkbuild.mdwn14
-rw-r--r--dev/opkhelper.mdwn5
-rw-r--r--dev/opkhelper/oh-architecture.1.mdwn8
-rw-r--r--dev/opkhelper/oh-autobuild.1.mdwn14
-rw-r--r--dev/opkhelper/oh-autoclean.1.mdwn14
-rw-r--r--dev/opkhelper/oh-autoconfigure.1.mdwn12
-rw-r--r--dev/opkhelper/oh-autoinstall.1.mdwn16
-rw-r--r--dev/opkhelper/oh-autotest.1.mdwn10
-rw-r--r--dev/opkhelper/oh-fixperms.1.mdwn7
-rw-r--r--dev/opkhelper/oh-installfiles.1.mdwn6
-rw-r--r--dev/opkhelper/oh-shlibdeps.1.mdwn63
-rw-r--r--dev/opkhelper/oh-strip.1.mdwn9
-rw-r--r--dev/prokit.mdwn6
-rw-r--r--dev/prokit/prokit-build.8.mdwn15
-rw-r--r--dev/prokit/prokit-help.1.mdwn8
-rw-r--r--dev/prokit/prokit-install.8.mdwn26
-rw-r--r--dev/prokit/prokit-installer-pc.8.mdwn122
-rw-r--r--dev/prokit/prokit-mkinitramfs.8.mdwn110
-rw-r--r--dev/prokit/prokit-opkg.8.mdwn16
-rw-r--r--dev/prokit/prokit-shell.8.mdwn25
-rw-r--r--dev/prokit/prokit-version.1.mdwn6
-rw-r--r--dev/prokit/prokit.1.mdwn22
-rw-r--r--dev/releases/1/packages.mdwn96
-rw-r--r--dev/todo/install-bb-without-bb.mdwn86
-rw-r--r--dev/wolfutil.mdwn48
27 files changed, 881 insertions, 171 deletions
diff --git a/dev/archive/mirroring.mdwn b/dev/archive/mirroring.mdwn
index 9d2b38a..deabb91 100644
--- a/dev/archive/mirroring.mdwn
+++ b/dev/archive/mirroring.mdwn
@@ -1,53 +1,117 @@
[[!meta title="Mirroring the ProteanOS Package Archive"]]
-Running a mirror of the ProteanOS package archive contributes to the
+Running a public mirror of the ProteanOS package archive contributes to the
availability of ProteanOS.
-You can keep your mirror private or make it an official mirror.
+Organizations deploying many ProteanOS systems are encouraged to make local
+mirrors, which they may keep private or make public, to save bandwidth on both
+their and ProteanOS's infrastructure.
Setting up a Mirror
===================
-A mirror takes about 700 MiB of storage space as of this writing and should be
+Overview
+--------
+
+*(Impatient mirror administrators may skip this informational section and read
+the instructional sections below.)*
+
+A mirror takes about 730 MiB of storage space as of this writing and should be
expected to grow beyond that.
-The following command will list files in the archive:
+The curious may view a list of files in the archive with the following command:
$ rsync --recursive --exclude .db rsync://files.proteanos.com/proteanos
-The following command will mirror the archive:
-
- $ rsync --recursive --times --delete --exclude .db \
- > rsync://files.proteanos.com/proteanos /path/to/your/mirror/directory/
+See below for commands to copy archive files to a local mirror.
-Packages are moved from incoming into the archive four times daily. The
+Packages are processed from the incoming queue into the archive four times
+daily, so mirrors need not be updated more frequently than that. The
[[archive_management_software|dev/pro-archman]] is [configured][arch-conf] to
keep unreferenced files in the pool for one day, so mirrors must be updated at
least once a day. Otherwise, during the update, some feed index files may
-reference deleted files.
+reference deleted files. Updating at least twice daily is recommended, in case
+the synchronization source is ever temporarily unreachable.
+
+Serving the archive mirror at `/pub/proteanos` over HTTP and FTP is recommended,
+but any path and either protocol may be used. HTTP Strict Transport Security
+(HSTS) must not be used except on private mirrors used by ProteanOS systems
+known to install the `wolfssl-util` package. The ProteanOS package archive is
+already [cryptographically verified][archive-signing] using software smaller
+than a TLS implementation.
+
+Mirrors are classified by their synchronization source as either "primary" or
+"secondary" as described below. This design distributes synchronization
+bandwidth usage more efficiently across the mirror network. Secondary mirrors
+will typically update a few hours after primary mirrors do, but are otherwise
+still "first-class citizens". All mirrors regardless of classification are
+treated equally by [[dev/prokit]], the installer utility that selects a mirror.
+
+Please configure private mirrors as secondary mirrors, so as to reserve
+ProteanOS project bandwidth for those that contribute bandwidth back to the
+project.
[arch-conf]: http://files.proteanos.com/pub/proteanos/conf
+[archive-signing]:http://lists.proteanos.com/proteanos-dev/2019/04/msg00008.html
+
+Primary Public Mirror
+---------------------
+
+Primary mirrors are those that synchronize directly from
+<files.proteanos.com> and must serve their contents publicly over HTTP
+(without HSTS) and rsync and may also serve over anonymous FTP as defined by
+[IETF RFC 1635][rfc1635] with no password requirements.
+
+Run the following command one to four times (four times preferred) daily to
+synchronize your mirror:
+
+ $ rsync --recursive --times --delete --exclude .db \
+ > rsync://files.proteanos.com/proteanos /path/to/your/mirror/directory/
+
+Secondary Public or Private Mirror
+----------------------------------
+Secondary mirrors are those that synchronize from a primary mirror and serve
+their contents either publicly or privately. Public mirrors must serve over
+HTTP (without HSTS) and may also serve over anonymous FTP as defined by [IETF
+RFC 1635][rfc1635] with no password requirements. Private mirrors may serve
+over either protocol.
-Making an Official Mirror
-=========================
+Run the following command one to four times (four times preferred) daily to
+synchronize your mirror:
+
+ $ rsync --recursive --times --delete --exclude .db \
+ > ${src} /path/to/your/mirror/directory/
-Official mirror sites should make their archive mirrors available at
-`/pub/proteanos` over HTTP and FTP. Sites should also make their archive
-mirrors accessible over rsync, if possible.
+Where `${src}` is any primary mirror in the [rsync mirrors list][mirrors-rsync].
+Please try to select a primary mirror that is being used by few or no other
+secondary mirrors, to evenly spread the load across the primary mirrors.
-Once your mirror is set up, please announce it to the [ProteanOS development
-mailing list][proteanos-dev] ([list info][proteanos-dev-info]). Please include
-the following information in your announcement:
+[rfc1635]: https://tools.ietf.org/html/rfc1635
+
+
+Announcing a Public Mirror
+==========================
+
+After setting up a public mirror, please announce it to the [ProteanOS
+development mailing list][proteanos-dev] ([list info][proteanos-dev-info]).
+Please include the following information in your announcement:
* Name and e-mail address of site maintainer;
* Name and URL of site sponsor, if any;
- * Domain name, or IPv4 and/or IPv6 address, of mirror site;
- * Available protocols;
- * Country of site;
- * Frequency of mirroring; and
+ * URIs of mirror site (HTTP and/or FTP, and rsync for primary mirrors);
+ * Location (country at a minimum) of site;
+ * Synchronization frequency (or times);
+ * Synchronization source, in the case of a secondary mirror; and
* Any other comments about the site.
+Your mirror will be reviewed and added to the official mirror lists
+([HTTP][mirrors-http] and [FTP][mirrors-ftp] used by [[dev/prokit]], as well as
+[rsync][mirrors-rsync] referenced above).
+
[proteanos-dev]: mailto:proteanos-dev@lists.proteanos.com
[proteanos-dev-info]: http://lists.proteanos.com/proteanos-dev/
+[mirrors-http]: http://files.proteanos.com/pub/proteanos-mirrors-http
+[mirrors-ftp]: http://files.proteanos.com/pub/proteanos-mirrors-ftp
+[mirrors-rsync]: http://files.proteanos.com/pub/proteanos-mirrors-rsync
diff --git a/dev/multiarch.mdwn b/dev/multiarch.mdwn
new file mode 100644
index 0000000..d869a7d
--- /dev/null
+++ b/dev/multiarch.mdwn
@@ -0,0 +1,180 @@
+[[!meta title="Multiarch Design"]]
+
+Earlier design proposals are documented in [[another_page|dev/multiarch/design]]
+kept for historical purposes.
+
+
+Background
+==========
+
+ProteanOS is a self-hosting binary distribution that builds its own packages.
+It is also an embedded distribution, intended to be suitable for small
+resource-limited systems. It may not be practical to natively build all of
+ProteanOS on real hardware for every architecture to be supported. Thus, it
+will be preferable to cross-build all of ProteanOS's packages, making ProteanOS
+a highly ambitious cross-built self-hosting binary distribution.
+
+Cross-compiling and cross-assembling self-contained code is a solved problem,
+however programs typically use separately built libraries, which must be
+installed at build time to be available for compiling and linking. Sometimes,
+these dependency libraries will already be installed for use by the native
+system. So it needs to be possible to "coinstall" different architecture builds
+of each library. Package management and build tools also need to be able to
+install dependency packages of the correct architecture; for example, libraries
+must be of the *host* architecture (the architecture **for** which a package is
+being built), but build utilities must be of the *build* architecture (the
+architecture **on** which a package is being built). Further complicating
+dependency resolution, such build utilities often themselves depend on
+libraries, which must also be of the build architecture (not the host
+architecture like libraries that are direct build-dependencies). These are the
+two main problems in cross-building distribution packages: coinstallability and
+dependencies. The solution is a design known as "multiarch".
+
+ProteanOS's multiarch design is inspired by, but different from, that
+[specified][wuc-mas] and [documented][wdo-ma] in Debian and Ubuntu.
+
+ProteanOS's design solves the coinstallability and dependency problems without
+*any* modifications to its package manager, opkg-lede. This is desirable
+because opkg-lede is a tool used by many distributions separate from ProteanOS,
+and its upstream maintainers (OpenWrt) would likely be unwilling to merge and
+maintain invasive patches specific to a different distribution (making the
+patches impossible to test upstream).
+
+[wdo-ma]: http://wiki.debian.org/Multiarch
+[wuc-mas]: https://wiki.ubuntu.com/MultiarchSpec
+
+
+Design
+======
+
+Coinstallability
+----------------
+
+opkg-lede doesn't allow multiple packages to provide the same file path, so, in
+order to be coinstallable, library packages must install all of their files into
+architecture-qualified locations. [Debian and Ubuntu][wuc-mas-arch-indep-files]
+limit this requirement to only files whose contents differ between
+architectures. This is accomplished by the package manager dpkg requiring all
+packages of the same name to be the same version, verifying that shared files
+have identical contents, and reference counting shared files. As explained
+above, ProteanOS's multiarch design doesn't entail such modifications to the
+package manager.
+
+opkg-lede also doesn't allow installation of multiple packages with the same
+name and different architectures. The only way to solve this without modifying
+the package manager is to qualify the names of coinstallable packages with
+their host architectures. This will be done by appending a colon followed by
+the host architecture to each coinstallable package name, e.g. `libc.6` becomes
+`libc.6:amd64-linux-glibc`. Package names appear in the file system under
+`/var/cache/opkg/archives/` and `/var/lib/opkg/info/`, so using a colon in
+package names will prevent the use of restricted file systems such as FAT file
+systems as the root file system.
+
+Dependencies
+------------
+
+opkg-lede allows packages from different architectures to be installed, but
+there is no way to select the architecture to install other than blanket
+priority values. Since libraries of different architectures will often need to
+be installed during the same installation transaction, as described above, such
+a blunt solution is insufficient.
+
+[Debian and Ubuntu][wuc-mas-control-fields] solve this by declaring the kinds of
+dependencies each package is able to satisfy (based on the interfaces it
+provides: executables and/or libraries). Again this requires modifications to
+the package manager to affect dependency resolution. ProteanOS's design is
+similar, but implemented in a way such that *dependent* binary packages are
+responsible for declaring the architectures of *their dependencies* (which can
+be done automatically at build time, so package maintainers can focus on
+declaring how their packages satisfy dependencies, as in Debian and Ubuntu).
+
+One way to declare dependency semantics is by introducing a new single-purpose
+control field like Debian's and Ubuntu's `Multi-Arch`. However, ProteanOS will
+instead use [a control field that serves multiple purposes:
+`Section`][spf-fields-bin]. `Section: lib` packages will be automatically made
+coinstallable by opkbuild, by architecture-qualifying their names as described
+above. Library dependencies generated by oh-shlibdeps (with [a
+fix][oh-shlibdeps-host-libdirs] to be released) will automatically use the
+architecture-qualified names.
+
+ProteanOS systems should have only native architecture feeds for sections
+`boot`, `dev`, and `util` but may have multiple feeds for sections `dbg`, `lib`,
+and `libdev`. (Sections `doc`, `locale`, and `share` are
+architecture-independent.)
+
+opkg-lede's architecture priorities as described above can be useful in certain
+specific ways, through a [wrapper script that adds an `-a`/`--host-architecture`
+option][opkg-wrapper] (similar to that of apt-get). First, since multiple
+`Section: dbg` feeds may be downloaded and requiring users to
+architecture-qualify such packages would be undesirable, such packages could be
+installed instead via `opkg -a amd64-linux-glibc foo-dbg` or even simply `opkg
+install foo-dbg` for the native architecture. Similarly, `Section: libdev`
+packages as build dependencies could be automatically installed for the host
+architecture by prokit supplying an appropriate `-a` option, allowing
+maintainers to continue listing unqualified package names in `Build-Depends`
+instead of having to add `:${Host-Arch}` to every `Section: libdev` package in
+`Build-Depends`. Therefore, only `Section: lib` packages need to have
+architecture-qualified names (due to the coinstallability issue described
+above), and neither users nor maintainers are expected to manually install or
+list as dependencies such architecture-qualified packages.
+
+[wuc-mas-arch-indep-files]: https://wiki.ubuntu.com/MultiarchSpec#Architecture-independent_files_in_multiarch_packages
+[wuc-mas-control-fields]: https://wiki.ubuntu.com/MultiarchSpec#Binary_package_control_fields
+[spf-fields-bin]: http://specs.proteanos.com/spf-2.0/fields.html#fields-bin
+[oh-shlibdeps-host-libdirs]: http://git.proteanos.com/opkhelper/opkhelper.git/commit/?id=c214c727f60b070aa502b20dcc1ad7e3ce8579f2
+[opkg-wrapper]: http://git.proteanos.com/pkg/opkg-lede.git/tree/opkg
+
+
+Use Cases
+=========
+
+**Run-time dependency on a utility:** Only the native architecture of the
+utility dependency is available in the downloaded feed lists, and the dependency
+is not architecture-qualified. The native architecture will be installed.
+
+**Run-time dependency on a library:** Multiple architectures of the library
+dependency may be available, and the dependency must be qualified with the
+native architecture.
+
+**Run-time dependency on a language extension:** Despite technically being a
+shared object file, only the native architecture of the language extension
+dependency is available in the downloaded feed lists, and the dependency is not
+architecture-qualified. The language extension dependency in turn depends on a
+language interpreter, which is also not architecture-qualified. The native
+architecture of both will be installed.
+
+**Build-time dependency on a utility:** Only the build architecture of the
+utility dependency is available in the downloaded feed lists, and the dependency
+is not architecture-qualified. The build architecture will be installed.
+
+**Build-time dependency on a library:** Multiple architectures of the library
+dependency are available, and the dependency must be qualified with the host
+architecture.
+
+**Build-time dependency on a language extension:** Despite technically being a
+shared object file, only the native architecture of the language extension
+dependency is available in the downloaded feed lists, and the dependency is not
+architecture-qualified. The language extension dependency in turn depends on a
+language interpreter, which is also not architecture-qualified. The native
+architecture of both will be installed.
+
+
+Implementation
+==============
+
+File System Hierarchy
+---------------------
+
+As explained above, to be coninstallable, library packages must install all of
+their files in architecture-qualified locations. Debian and Ubuntu install
+shared object files in `/usr/lib/<triplet>` or `/lib/<triplet>`, where
+`<triplet>` is a [GNU system type][ac-systemtype]. Since multiple ProteanOS
+architectures may share the same GNU system type, ProteanOS architecture names
+are instead used in such library directories.
+
+ProteanOS's GNU Binutils and GCC packages have been patched and configured to
+use multiarch library paths since their initial releases in 2014. opkhelper has
+used multiarch library paths when configuring packages since version 3.0.0-beta1
+released in 2012.
+
+[ac-systemtype]: https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/System-Type.html
diff --git a/dev/opkbuild.mdwn b/dev/opkbuild.mdwn
index b055f80..9e45e00 100644
--- a/dev/opkbuild.mdwn
+++ b/dev/opkbuild.mdwn
@@ -2,24 +2,24 @@
opkbuild is a distribution build system – a set of tools for building
software packages. From source packages it builds binary packages for
-use with the [opkg package manager][opkg].
+use with the opkg package manager.
Currently one format of source package is supported by opkbuild:
ProteanOS [Source Package Format 2.0][spf-2.0].
-opkbuild is similar in function to the [development library and utilities
-of dpkg][dpkg-dev] ([sources][dpkg-dev-git]), the Debian package manager.
+opkbuild is similar in function to the [development library][libdpkg-perl] and
+[utilities][dpkg-dev] of [dpkg][dpkg], the Debian package manager.
-[opkg]: https://code.google.com/p/opkg/
[spf-2.0]: http://specs.proteanos.com/spf-2.0/
+[libdpkg-perl]: https://packages.debian.org/sid/libdpkg-perl
[dpkg-dev]: https://packages.debian.org/sid/dpkg-dev
-[dpkg-dev-git]: https://anonscm.debian.org/gitweb/?p=dpkg/dpkg.git;a=tree;f=scripts
+[dpkg]: https://wiki.debian.org/Teams/Dpkg/
Downloading
===========
-The current version of opkbuild is [3.0.0-beta7][rel-ann].
+The current version of opkbuild is [4.2.0][rel-ann].
opkbuild can be found on the ProteanOS files site by [HTTP][dl-http] or
[FTP][dl-ftp].
@@ -27,7 +27,7 @@ opkbuild can be found on the ProteanOS files site by [HTTP][dl-http] or
opkbuild is maintained in a [Git repository][repo-http], which can be cloned
from `git://git.proteanos.com/opkbuild/opkbuild.git`.
-[rel-ann]: http://lists.proteanos.com/proteanos-dev/2014/10/msg00002.html
+[rel-ann]: http://lists.proteanos.com/proteanos-dev/2020/07/msg00000.html
[dl-http]: http://files.proteanos.com/pub/opkbuild/
[dl-ftp]: ftp://files.proteanos.com/pub/opkbuild/
[repo-http]: http://git.proteanos.com/opkbuild/opkbuild.git/
diff --git a/dev/opkhelper.mdwn b/dev/opkhelper.mdwn
index 70deda7..47bcd49 100644
--- a/dev/opkhelper.mdwn
+++ b/dev/opkhelper.mdwn
@@ -14,7 +14,7 @@ Debian.
Downloading
===========
-The current version of opkhelper is [3.0.0][rel-ann].
+The current version of opkhelper is [3.1.3][rel-ann].
opkhelper can be found on the ProteanOS files site by [HTTP][dl-http] or
[FTP][dl-ftp].
@@ -22,7 +22,7 @@ opkhelper can be found on the ProteanOS files site by [HTTP][dl-http] or
opkhelper is maintained in a [Git repository][repo-http], which can be cloned
from `git://git.proteanos.com/opkhelper/opkhelper.git`.
-[rel-ann]: http://lists.proteanos.com/proteanos-dev/2014/03/msg00000.html
+[rel-ann]: http://lists.proteanos.com/proteanos-dev/2020/07/msg00001.html
[dl-http]: http://files.proteanos.com/pub/opkhelper/
[dl-ftp]: ftp://files.proteanos.com/pub/opkhelper/
[repo-http]: http://git.proteanos.com/opkhelper/opkhelper.git/
@@ -43,6 +43,7 @@ Manual
Pages in the Distribution Build System manual:
* [[**oh-installfiles**(1)|dev/opkhelper/oh-installfiles.1]]
+ * [[**oh-shlibdeps**(1)|dev/opkhelper/oh-shlibdeps.1]]
* [[**oh-strip**(1)|dev/opkhelper/oh-strip.1]]
* [[**oh-fixperms**(1)|dev/opkhelper/oh-fixperms.1]]
* [[**oh-autoconfigure**(1)|dev/opkhelper/oh-autoconfigure.1]]
diff --git a/dev/opkhelper/oh-architecture.1.mdwn b/dev/opkhelper/oh-architecture.1.mdwn
index 4ed8163..ee13049 100644
--- a/dev/opkhelper/oh-architecture.1.mdwn
+++ b/dev/opkhelper/oh-architecture.1.mdwn
@@ -16,7 +16,7 @@
<p style="margin-left:11%; margin-top: 1em">oh-architecture
-&minus; Print build system architecture names.</p>
+- Print build system architecture names.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -44,20 +44,20 @@ looks up the build system architecture that matches
-<p style="margin-left:11%; margin-top: 1em"><b>&minus;s&nbsp;</b><i>sourcedir</i></p>
+<p style="margin-left:11%; margin-top: 1em"><b>-s&nbsp;</b><i>sourcedir</i></p>
<p style="margin-left:22%;">Find sources in
<i>sourcedir</i> instead of in <i>src</i>.</p>
-<p style="margin-left:11%;"><b>&minus;S&nbsp;</b><i>buildsystem</i></p>
+<p style="margin-left:11%;"><b>-S&nbsp;</b><i>buildsystem</i></p>
<p style="margin-left:22%;">Force the use of
<i>buildsystem</i>, instead of trying to detect the one used
by the package.</p>
-<p style="margin-left:11%;"><b>&minus;B&nbsp;</b><i>builddir</i></p>
+<p style="margin-left:11%;"><b>-B&nbsp;</b><i>builddir</i></p>
<p style="margin-left:22%;">Build in <i>builddir</i>
instead of in the source directory.</p>
diff --git a/dev/opkhelper/oh-autobuild.1.mdwn b/dev/opkhelper/oh-autobuild.1.mdwn
index 146423d..62ea6dd 100644
--- a/dev/opkhelper/oh-autobuild.1.mdwn
+++ b/dev/opkhelper/oh-autobuild.1.mdwn
@@ -14,8 +14,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">oh-autobuild
-&minus; Automatically build a package.</p>
+<p style="margin-left:11%; margin-top: 1em">oh-autobuild -
+Automatically build a package.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -26,7 +26,7 @@
<p style="margin-left:11%; margin-top: 1em"><b>oh-autobuild</b>
[<b>-s</b> <i>sourcedir</i>] [<b>-S</b> <i>buildsystem</i>]
[<b>-B</b> <i>builddir</i>] [<b>-T</b> <i>buildtarget</i>]
-[&minus;&minus; <i>arguments</i>]</p>
+[-- <i>arguments</i>]</p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -43,26 +43,26 @@ attempts to automatically build a package.</p>
-<p style="margin-left:11%; margin-top: 1em"><b>&minus;s&nbsp;</b><i>sourcedir</i></p>
+<p style="margin-left:11%; margin-top: 1em"><b>-s&nbsp;</b><i>sourcedir</i></p>
<p style="margin-left:22%;">Find sources in
<i>sourcedir</i> instead of in <i>src</i>.</p>
-<p style="margin-left:11%;"><b>&minus;S&nbsp;</b><i>buildsystem</i></p>
+<p style="margin-left:11%;"><b>-S&nbsp;</b><i>buildsystem</i></p>
<p style="margin-left:22%;">Force the use of
<i>buildsystem</i>, instead of trying to detect the one used
by the package.</p>
-<p style="margin-left:11%;"><b>&minus;B&nbsp;</b><i>builddir</i></p>
+<p style="margin-left:11%;"><b>-B&nbsp;</b><i>builddir</i></p>
<p style="margin-left:22%;">Build in <i>builddir</i>
instead of in the source directory.</p>
-<p style="margin-left:11%;"><b>&minus;T&nbsp;</b><i>buildtarget</i></p>
+<p style="margin-left:11%;"><b>-T&nbsp;</b><i>buildtarget</i></p>
<p style="margin-left:22%;">Update the <i>buildtarget</i>
target.</p>
diff --git a/dev/opkhelper/oh-autoclean.1.mdwn b/dev/opkhelper/oh-autoclean.1.mdwn
index 31dbb24..77716e6 100644
--- a/dev/opkhelper/oh-autoclean.1.mdwn
+++ b/dev/opkhelper/oh-autoclean.1.mdwn
@@ -14,9 +14,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">oh-autoclean
-&minus; Automatically clean up a package&rsquo;s built
-files.</p>
+<p style="margin-left:11%; margin-top: 1em">oh-autoclean -
+Automatically clean up a package&rsquo;s built files.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -26,8 +25,7 @@ files.</p>
<p style="margin-left:11%; margin-top: 1em"><b>oh-autoclean</b>
[<b>-s</b> <i>sourcedir</i>] [<b>-S</b> <i>buildsystem</i>]
-[<b>-B</b> <i>builddir</i>] [&minus;&minus;
-<i>arguments</i>]</p>
+[<b>-B</b> <i>builddir</i>] [-- <i>arguments</i>]</p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -45,20 +43,20 @@ directory.</p>
-<p style="margin-left:11%; margin-top: 1em"><b>&minus;s&nbsp;</b><i>sourcedir</i></p>
+<p style="margin-left:11%; margin-top: 1em"><b>-s&nbsp;</b><i>sourcedir</i></p>
<p style="margin-left:22%;">Find sources in
<i>sourcedir</i> instead of in <i>src</i>.</p>
-<p style="margin-left:11%;"><b>&minus;S&nbsp;</b><i>buildsystem</i></p>
+<p style="margin-left:11%;"><b>-S&nbsp;</b><i>buildsystem</i></p>
<p style="margin-left:22%;">Force the use of
<i>buildsystem</i>, instead of trying to detect the one used
by the package.</p>
-<p style="margin-left:11%;"><b>&minus;B&nbsp;</b><i>builddir</i></p>
+<p style="margin-left:11%;"><b>-B&nbsp;</b><i>builddir</i></p>
<p style="margin-left:22%;">Build in <i>builddir</i>
instead of in the source directory.</p>
diff --git a/dev/opkhelper/oh-autoconfigure.1.mdwn b/dev/opkhelper/oh-autoconfigure.1.mdwn
index d577261..a3ee79e 100644
--- a/dev/opkhelper/oh-autoconfigure.1.mdwn
+++ b/dev/opkhelper/oh-autoconfigure.1.mdwn
@@ -16,7 +16,7 @@
<p style="margin-left:11%; margin-top: 1em">oh-autoconfigure
-&minus; Automatically configure a package to be built.</p>
+- Automatically configure a package to be built.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -27,7 +27,7 @@
<p style="margin-left:11%; margin-top: 1em"><b>oh-autoconfigure</b>
[<b>-s</b> <i>sourcedir</i>] [<b>-S</b> <i>buildsystem</i>]
[<b>-B</b> <i>builddir</i>] [<b>-t</b> <i>targetarch</i>]
-[&minus;&minus; <i>arguments</i>]</p>
+[-- <i>arguments</i>]</p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -45,26 +45,26 @@ built.</p>
-<p style="margin-left:11%; margin-top: 1em"><b>&minus;s&nbsp;</b><i>sourcedir</i></p>
+<p style="margin-left:11%; margin-top: 1em"><b>-s&nbsp;</b><i>sourcedir</i></p>
<p style="margin-left:22%;">Find sources in
<i>sourcedir</i> instead of in <i>src</i>.</p>
-<p style="margin-left:11%;"><b>&minus;S&nbsp;</b><i>buildsystem</i></p>
+<p style="margin-left:11%;"><b>-S&nbsp;</b><i>buildsystem</i></p>
<p style="margin-left:22%;">Force the use of
<i>buildsystem</i>, instead of trying to detect the one used
by the package.</p>
-<p style="margin-left:11%;"><b>&minus;B&nbsp;</b><i>builddir</i></p>
+<p style="margin-left:11%;"><b>-B&nbsp;</b><i>builddir</i></p>
<p style="margin-left:22%;">Build in <i>builddir</i>
instead of in the source directory.</p>
-<p style="margin-left:11%;"><b>&minus;t&nbsp;</b><i>targetarch</i></p>
+<p style="margin-left:11%;"><b>-t&nbsp;</b><i>targetarch</i></p>
<p style="margin-left:22%;">Build a tool that cross builds
for <i>targetarch</i>.</p>
diff --git a/dev/opkhelper/oh-autoinstall.1.mdwn b/dev/opkhelper/oh-autoinstall.1.mdwn
index d2cc80f..6fd8d88 100644
--- a/dev/opkhelper/oh-autoinstall.1.mdwn
+++ b/dev/opkhelper/oh-autoinstall.1.mdwn
@@ -15,8 +15,7 @@
<p style="margin-left:11%; margin-top: 1em">oh-autoinstall
-&minus; Automatically install a package&rsquo;s data
-files.</p>
+- Automatically install a package&rsquo;s data files.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -27,8 +26,7 @@ files.</p>
<p style="margin-left:11%; margin-top: 1em"><b>oh-autoinstall</b>
[<b>-s</b> <i>sourcedir</i>] [<b>-S</b> <i>buildsystem</i>]
[<b>-B</b> <i>builddir</i>] [<b>-d</b> <i>destdir</i>]
-[<b>-T</b> <i>buildtarget</i>] [&minus;&minus;
-<i>arguments</i>]</p>
+[<b>-T</b> <i>buildtarget</i>] [-- <i>arguments</i>]</p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -46,32 +44,32 @@ files.</p>
-<p style="margin-left:11%; margin-top: 1em"><b>&minus;s&nbsp;</b><i>sourcedir</i></p>
+<p style="margin-left:11%; margin-top: 1em"><b>-s&nbsp;</b><i>sourcedir</i></p>
<p style="margin-left:22%;">Find sources in
<i>sourcedir</i> instead of in <i>src</i>.</p>
-<p style="margin-left:11%;"><b>&minus;S&nbsp;</b><i>buildsystem</i></p>
+<p style="margin-left:11%;"><b>-S&nbsp;</b><i>buildsystem</i></p>
<p style="margin-left:22%;">Force the use of
<i>buildsystem</i>, instead of trying to detect the one used
by the package.</p>
-<p style="margin-left:11%;"><b>&minus;B&nbsp;</b><i>builddir</i></p>
+<p style="margin-left:11%;"><b>-B&nbsp;</b><i>builddir</i></p>
<p style="margin-left:22%;">Build in <i>builddir</i>
instead of in the source directory.</p>
-<p style="margin-left:11%;"><b>&minus;d&nbsp;</b><i>destdir</i></p>
+<p style="margin-left:11%;"><b>-d&nbsp;</b><i>destdir</i></p>
<p style="margin-left:22%;">Install data files in
<i>destdir</i>. The default directory is <i>dest</i>.</p>
-<p style="margin-left:11%;"><b>&minus;T&nbsp;</b><i>buildtarget</i></p>
+<p style="margin-left:11%;"><b>-T&nbsp;</b><i>buildtarget</i></p>
<p style="margin-left:22%;">Update the <i>buildtarget</i>
target.</p>
diff --git a/dev/opkhelper/oh-autotest.1.mdwn b/dev/opkhelper/oh-autotest.1.mdwn
index a0c5bb6..a1d5739 100644
--- a/dev/opkhelper/oh-autotest.1.mdwn
+++ b/dev/opkhelper/oh-autotest.1.mdwn
@@ -14,8 +14,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">oh-autotest
-&minus; Automatically run a package&rsquo;s test suites.</p>
+<p style="margin-left:11%; margin-top: 1em">oh-autotest -
+Automatically run a package&rsquo;s test suites.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -25,7 +25,7 @@
<p style="margin-left:11%; margin-top: 1em"><b>oh-autotest</b>
[<b>-S</b> <i>buildsystem</i>] [<b>-B</b> <i>builddir</i>]
-[&minus;&minus; <i>arguments</i>]</p>
+[-- <i>arguments</i>]</p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -43,14 +43,14 @@ suites.</p>
-<p style="margin-left:11%; margin-top: 1em"><b>&minus;S&nbsp;</b><i>buildsystem</i></p>
+<p style="margin-left:11%; margin-top: 1em"><b>-S&nbsp;</b><i>buildsystem</i></p>
<p style="margin-left:22%;">Force the use of
<i>buildsystem</i>, instead of trying to detect the one used
by the package.</p>
-<p style="margin-left:11%;"><b>&minus;B&nbsp;</b><i>builddir</i></p>
+<p style="margin-left:11%;"><b>-B&nbsp;</b><i>builddir</i></p>
<p style="margin-left:22%;">Build in <i>builddir</i>
instead of in the source directory.</p>
diff --git a/dev/opkhelper/oh-fixperms.1.mdwn b/dev/opkhelper/oh-fixperms.1.mdwn
index d855663..a25d4cb 100644
--- a/dev/opkhelper/oh-fixperms.1.mdwn
+++ b/dev/opkhelper/oh-fixperms.1.mdwn
@@ -14,8 +14,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">oh-fixperms
-&minus; Fix permissions and ownerships of data files.</p>
+<p style="margin-left:11%; margin-top: 1em">oh-fixperms -
+Fix permissions and ownerships of data files.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -48,8 +48,7 @@ data files.</p>
<td width="9%">
-
-<p style="margin-top: 1em"><b>&minus;d&nbsp;</b><i>dir</i></p> </td>
+<p style="margin-top: 1em"><b>-d&nbsp;</b><i>dir</i></p></td>
<td width="2%"></td>
<td width="78%">
diff --git a/dev/opkhelper/oh-installfiles.1.mdwn b/dev/opkhelper/oh-installfiles.1.mdwn
index b2d1a76..ac694f0 100644
--- a/dev/opkhelper/oh-installfiles.1.mdwn
+++ b/dev/opkhelper/oh-installfiles.1.mdwn
@@ -17,8 +17,7 @@
<p style="margin-left:11%; margin-top: 1em">oh-installfiles
-&minus; Install files into binary package data
-directories.</p>
+- Install files into binary package data directories.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -54,8 +53,7 @@ the binary package&rsquo;s data directory.</p>
<td width="9%">
-
-<p style="margin-top: 1em"><b>&minus;d&nbsp;</b><i>dir</i></p> </td>
+<p style="margin-top: 1em"><b>-d&nbsp;</b><i>dir</i></p></td>
<td width="2%"></td>
<td width="78%">
diff --git a/dev/opkhelper/oh-shlibdeps.1.mdwn b/dev/opkhelper/oh-shlibdeps.1.mdwn
new file mode 100644
index 0000000..26e6f84
--- /dev/null
+++ b/dev/opkhelper/oh-shlibdeps.1.mdwn
@@ -0,0 +1,63 @@
+[[!meta title="oh-shlibdeps"]]
+
+<a href="#NAME">NAME</a><br>
+<a href="#SYNOPSIS">SYNOPSIS</a><br>
+<a href="#DESCRIPTION">DESCRIPTION</a><br>
+<a href="#COPYRIGHT">COPYRIGHT</a><br>
+
+<hr>
+
+
+<h2>NAME
+<a name="NAME"></a>
+</h2>
+
+
+<p style="margin-left:11%; margin-top: 1em">oh-shlibdeps -
+Find shared library dependencies.</p>
+
+<h2>SYNOPSIS
+<a name="SYNOPSIS"></a>
+</h2>
+
+
+
+<p style="margin-left:11%; margin-top: 1em"><b>oh-shlibdeps</b></p>
+
+<h2>DESCRIPTION
+<a name="DESCRIPTION"></a>
+</h2>
+
+
+
+<p style="margin-left:11%; margin-top: 1em"><b>oh-shlibdeps</b>
+finds packages that provide libraries needed by ELF files in
+each binary package. It lists library depenency packages in
+each binary package&rsquo;s &quot;Shlib-Depends&quot;
+substitution variable.</p>
+
+<h2>COPYRIGHT
+<a name="COPYRIGHT"></a>
+</h2>
+
+
+<p style="margin-left:11%; margin-top: 1em">Copyright (C)
+2019 Patrick &quot;P. J.&quot; McDermott</p>
+
+<p style="margin-left:11%; margin-top: 1em">This program is
+free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as
+published by the Free Software Foundation, either version 2
+of the License, or (at your option) any later version.</p>
+
+<p style="margin-left:11%; margin-top: 1em">This program is
+distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.</p>
+
+<p style="margin-left:11%; margin-top: 1em">You should have
+received a copy of the GNU General Public License along with
+this program. If not, see
+&lt;http://www.gnu.org/licenses/&gt;.</p>
+
diff --git a/dev/opkhelper/oh-strip.1.mdwn b/dev/opkhelper/oh-strip.1.mdwn
index 39344dc..d16d49b 100644
--- a/dev/opkhelper/oh-strip.1.mdwn
+++ b/dev/opkhelper/oh-strip.1.mdwn
@@ -14,8 +14,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">oh-strip
-&minus; Strip binary objects of symbols.</p>
+<p style="margin-left:11%; margin-top: 1em">oh-strip -
+Strip binary objects of symbols.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -48,8 +48,7 @@ copying debugging symbols into debugging object files.</p>
<td width="9%">
-
-<p style="margin-top: 1em"><b>&minus;d&nbsp;</b><i>dir</i></p> </td>
+<p style="margin-top: 1em"><b>-d&nbsp;</b><i>dir</i></p></td>
<td width="2%"></td>
<td width="78%">
@@ -61,7 +60,7 @@ copying debugging symbols into debugging object files.</p>
<td width="9%">
-<p><b>&minus;k</b></p></td>
+<p><b>-k</b></p></td>
<td width="2%"></td>
<td width="78%">
diff --git a/dev/prokit.mdwn b/dev/prokit.mdwn
index 9d6dc88..3008ffa 100644
--- a/dev/prokit.mdwn
+++ b/dev/prokit.mdwn
@@ -14,7 +14,7 @@ programs of Debian and derivatives.
Downloading
===========
-The current version of prokit is [1.1.0][rel-ann].
+The current version of prokit is [2.0.0][rel-ann].
prokit can be found on the ProteanOS files site by [HTTP][dl-http] or
[FTP][dl-ftp].
@@ -22,7 +22,7 @@ prokit can be found on the ProteanOS files site by [HTTP][dl-http] or
prokit is maintained in a [Git repository][repo-http], which can be cloned from
`git://git.proteanos.com/prokit/prokit.git`.
-[rel-ann]: http://lists.proteanos.com/proteanos-dev/2014/10/msg00000.html
+[rel-ann]: http://lists.proteanos.com/proteanos-dev/2019/04/msg00004.html
[dl-http]: http://files.proteanos.com/pub/prokit/
[dl-ftp]: ftp://files.proteanos.com/pub/prokit/
[repo-http]: http://git.proteanos.com/prokit/prokit.git/
@@ -49,3 +49,5 @@ Pages in the ProteanOS Development Kit Manual:
* [[**prokit-shell**(8)|dev/prokit/prokit-shell.8]]
* [[**prokit-opkg**(8)|dev/prokit/prokit-opkg.8]]
* [[**prokit-build**(8)|dev/prokit/prokit-build.8]]
+ * [[**prokit-installer-pc**(8)|dev/prokit/prokit-installer-pc.8]]
+ * [[**prokit-mkinitramfs**(8)|dev/prokit/prokit-mkinitramfs.8]]
diff --git a/dev/prokit/prokit-build.8.mdwn b/dev/prokit/prokit-build.8.mdwn
index fefa5fc..e7ad25f 100644
--- a/dev/prokit/prokit-build.8.mdwn
+++ b/dev/prokit/prokit-build.8.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="prokit-build"]]
+[[!meta title="PROKIT-BUILD"]]
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
@@ -13,8 +13,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">prokit-build
-&minus; Build a package</p>
+<p style="margin-left:11%; margin-top: 1em">prokit-build -
+Build a package</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -22,8 +22,7 @@
<p style="margin-left:11%; margin-top: 1em"><b>prokit
-build</b> <i>root-dir</i> [<i>option</i> ...]
-<i>pkg-dir</i></p>
+build</b> <i>root</i> [<i>option</i> ...] <i>pkg-dir</i></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -35,6 +34,10 @@ build</b></i> runs <b>opkbuild</b> to build a package in an
isolated file system environment, temporarily installing any
missing build dependencies.</p>
+<p style="margin-left:11%; margin-top: 1em">If <i>root</i>
+is a block device node, the block device is mounted and
+<b>opkbuild</b> is run in its file system.</p>
+
<p style="margin-left:11%; margin-top: 1em"><i>option</i>s
are <b>opkbuild</b> options. Run <i>prokit build -h .</i>
for more information.</p>
@@ -48,7 +51,7 @@ is a source package directory.</p>
<p style="margin-left:11%; margin-top: 1em">Copyright (C)
-2014 Patrick &quot;P. J.&quot; McDermott</p>
+2014 Patrick McDermott</p>
<p style="margin-left:11%; margin-top: 1em">The ProteanOS
Development Kit is free software: you can redistribute it
diff --git a/dev/prokit/prokit-help.1.mdwn b/dev/prokit/prokit-help.1.mdwn
index 733a358..f594457 100644
--- a/dev/prokit/prokit-help.1.mdwn
+++ b/dev/prokit/prokit-help.1.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="prokit-help"]]
+[[!meta title="PROKIT-HELP"]]
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
@@ -13,8 +13,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">prokit-help
-&minus; Print help information</p>
+<p style="margin-left:11%; margin-top: 1em">prokit-help -
+Print help information</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -48,7 +48,7 @@ help</b> [<i>command</i>].</p>
<p style="margin-left:11%; margin-top: 1em">Copyright (C)
-2014 Patrick &quot;P. J.&quot; McDermott</p>
+2014 Patrick McDermott</p>
<p style="margin-left:11%; margin-top: 1em">The ProteanOS
Development Kit is free software: you can redistribute it
diff --git a/dev/prokit/prokit-install.8.mdwn b/dev/prokit/prokit-install.8.mdwn
index 427f6a7..2f617d5 100644
--- a/dev/prokit/prokit-install.8.mdwn
+++ b/dev/prokit/prokit-install.8.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="prokit-install"]]
+[[!meta title="PROKIT-INSTALL"]]
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
@@ -15,7 +15,7 @@
<p style="margin-left:11%; margin-top: 1em">prokit-install
-&minus; Install a system into a directory</p>
+- Install a system into a directory</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -24,8 +24,7 @@
<p style="margin-left:11%; margin-top: 1em"><b>prokit
install</b> [<b>-a</b> <i>arch</i>] [<b>-p</b> <i>plat</i>]
-[<b>-m</b> <i>mirror</i>] [<b>-F</b>] <i>suite
-root-dir</i></p>
+[<b>-m</b> <i>mirror</i>] [<b>-F</b>] <i>suite root</i></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -34,7 +33,11 @@ root-dir</i></p>
<p style="margin-left:11%; margin-top: 1em"><i><b>prokit
install</b></i> installs a basic system of <i>suite</i> into
-<i>root-dir</i>.</p>
+<i>root</i>.</p>
+
+<p style="margin-left:11%; margin-top: 1em">If <i>root</i>
+is a block device node, the block device is mounted and a
+system is installed into its file system.</p>
<p style="margin-left:11%; margin-top: 1em"><i>suite</i>
can be a distribution like <i>trunk</i>; a channel and
@@ -49,26 +52,25 @@ channel, and distribution like
-<p style="margin-left:11%; margin-top: 1em"><b>&minus;a&nbsp;</b><i>arch</i></p>
+<p style="margin-left:11%; margin-top: 1em"><b>-a&nbsp;</b><i>arch</i></p>
<p style="margin-left:22%;">Install packages built for the
<i>arch</i> architecture instead of automatically detecting
the architecture of the running system.</p>
-
-<p style="margin-left:11%;"><b>&minus;p&nbsp;</b><i>plat</i></p>
+<p style="margin-left:11%;"><b>-p&nbsp;</b><i>plat</i></p>
<p style="margin-left:22%;">Install packages built for the
<i>plat</i> platform instead of automatically choosing a
default platform.</p>
-<p style="margin-left:11%;"><b>&minus;m&nbsp;</b><i>mirror</i></p>
+<p style="margin-left:11%;"><b>-m&nbsp;</b><i>mirror</i></p>
<p style="margin-left:22%;">Download packages from
<i>mirror</i> instead of automatically selecting one at
random. <i>mirror</i> is a base URL like
-<i>http://mirror.gnu.dk/pub/proteanos</i>.</p>
+<i>http://us.mirror.gnu.dk/pub/proteanos</i>.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
@@ -77,7 +79,7 @@ random. <i>mirror</i> is a base URL like
<td width="3%">
-<p><b>&minus;F</b></p></td>
+<p><b>-F</b></p></td>
<td width="8%"></td>
<td width="78%">
@@ -92,7 +94,7 @@ for packages to be configured later.</p></td></tr>
<p style="margin-left:11%; margin-top: 1em">Copyright (C)
-2014 Patrick &quot;P. J.&quot; McDermott</p>
+2014 Patrick McDermott</p>
<p style="margin-left:11%; margin-top: 1em">The ProteanOS
Development Kit is free software: you can redistribute it
diff --git a/dev/prokit/prokit-installer-pc.8.mdwn b/dev/prokit/prokit-installer-pc.8.mdwn
new file mode 100644
index 0000000..7b32be9
--- /dev/null
+++ b/dev/prokit/prokit-installer-pc.8.mdwn
@@ -0,0 +1,122 @@
+[[!meta title="PROKIT-INSTALLER-PC"]]
+
+<a href="#NAME">NAME</a><br>
+<a href="#SYNOPSIS">SYNOPSIS</a><br>
+<a href="#DESCRIPTION">DESCRIPTION</a><br>
+<a href="#OPTIONS">OPTIONS</a><br>
+<a href="#EXAMPLES">EXAMPLES</a><br>
+<a href="#COPYRIGHT">COPYRIGHT</a><br>
+
+<hr>
+
+
+<h2>NAME
+<a name="NAME"></a>
+</h2>
+
+
+
+<p style="margin-left:11%; margin-top: 1em">prokit-installer-pc
+- Install a PC system onto a block device</p>
+
+<h2>SYNOPSIS
+<a name="SYNOPSIS"></a>
+</h2>
+
+
+<p style="margin-left:11%; margin-top: 1em"><b>prokit
+installer-pc -a</b> <i>arch</i> <b>-p</b> <i>plat</i>
+[<b>-m</b> <i>mirror</i>] <i>suite device</i></p>
+
+<h2>DESCRIPTION
+<a name="DESCRIPTION"></a>
+</h2>
+
+
+<p style="margin-left:11%; margin-top: 1em"><i><b>prokit
+installer-pc</b></i> installs a basic PC system of
+<i>suite</i> onto <i>device</i>.</p>
+
+<p style="margin-left:11%; margin-top: 1em"><i>suite</i>
+can be a distribution like <i>trunk</i>; a channel and
+distribution like <i>dev/trunk</i>; a profile and
+distribution like <i>proteanos:trunk</i>; or a profile,
+channel, and distribution like
+<i>proteanos:dev/trunk</i>.</p>
+
+<p style="margin-left:11%; margin-top: 1em"><i>device</i>
+must be a block device file representing a whole storage
+device, not a partition.</p>
+
+<h2>OPTIONS
+<a name="OPTIONS"></a>
+</h2>
+
+
+
+<p style="margin-left:11%; margin-top: 1em"><b>-a&nbsp;</b><i>arch</i></p>
+
+<p style="margin-left:22%;">Install packages built for the
+<i>arch</i> architecture.</p>
+
+<p style="margin-left:11%;"><b>-p&nbsp;</b><i>plat</i></p>
+
+<p style="margin-left:22%;">Install packages built for the
+<i>plat</i> platform.</p>
+
+
+<p style="margin-left:11%;"><b>-m&nbsp;</b><i>mirror</i></p>
+
+<p style="margin-left:22%;">Download packages from
+<i>mirror</i> instead of automatically selecting one at
+random. <i>mirror</i> is a base URL like
+<i>http://us.mirror.gnu.dk/pub/proteanos</i>.</p>
+
+<h2>EXAMPLES
+<a name="EXAMPLES"></a>
+</h2>
+
+
+<table width="100%" border="0" rules="none" frame="void"
+ cellspacing="0" cellpadding="0">
+<tr valign="top" align="left">
+<td width="11%"></td>
+<td width="1%">
+
+
+<p style="margin-top: 1em">&bull;</p></td>
+<td width="10%"></td>
+<td width="78%">
+
+
+<p style="margin-top: 1em"># prokit installer-pc -a
+i686-linux-glibc -p x60 dev/trunk /dev/sdb</p></td></tr>
+</table>
+
+<h2>COPYRIGHT
+<a name="COPYRIGHT"></a>
+</h2>
+
+
+<p style="margin-left:11%; margin-top: 1em">Copyright (C)
+2014, 2015 Patrick McDermott</p>
+
+<p style="margin-left:11%; margin-top: 1em">The ProteanOS
+Development Kit is free software: you can redistribute it
+and/or modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation, either
+version 3 of the License, or (at your option) any later
+version.</p>
+
+<p style="margin-left:11%; margin-top: 1em">The ProteanOS
+Development Kit is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied
+warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. See the GNU General Public License for more
+details.</p>
+
+<p style="margin-left:11%; margin-top: 1em">You should have
+received a copy of the GNU General Public License along with
+the ProteanOS Development Kit. If not, see
+&lt;http://www.gnu.org/licenses/&gt;.</p>
+
diff --git a/dev/prokit/prokit-mkinitramfs.8.mdwn b/dev/prokit/prokit-mkinitramfs.8.mdwn
new file mode 100644
index 0000000..0b5381d
--- /dev/null
+++ b/dev/prokit/prokit-mkinitramfs.8.mdwn
@@ -0,0 +1,110 @@
+[[!meta title="PROKIT-MKINITRAMFS"]]
+
+<a href="#NAME">NAME</a><br>
+<a href="#SYNOPSIS">SYNOPSIS</a><br>
+<a href="#DESCRIPTION">DESCRIPTION</a><br>
+<a href="#OPTIONS">OPTIONS</a><br>
+<a href="#EXAMPLES">EXAMPLES</a><br>
+<a href="#COPYRIGHT">COPYRIGHT</a><br>
+
+<hr>
+
+
+<h2>NAME
+<a name="NAME"></a>
+</h2>
+
+
+
+<p style="margin-left:11%; margin-top: 1em">prokit-mkinitramfs
+- Generate an initramfs containing an installed system</p>
+
+<h2>SYNOPSIS
+<a name="SYNOPSIS"></a>
+</h2>
+
+
+<p style="margin-left:11%; margin-top: 1em"><b>prokit
+mkinitramfs -l</b> <i>linux-output</i> <b>-i</b>
+<i>initramfs-output root</i></p>
+
+<h2>DESCRIPTION
+<a name="DESCRIPTION"></a>
+</h2>
+
+
+<p style="margin-left:11%; margin-top: 1em"><i><b>prokit
+mkinitramfs</b></i> generates an initial RAM-based file
+system image containing an installed system found at
+<i>root</i>.</p>
+
+<p style="margin-left:11%; margin-top: 1em">If <i>root</i>
+is a block device node, the block device is mounted and the
+initial RAM-based file system is generated from the
+device&rsquo;s file system.</p>
+
+<h2>OPTIONS
+<a name="OPTIONS"></a>
+</h2>
+
+
+
+<p style="margin-left:11%; margin-top: 1em"><b>-l&nbsp;</b><i>linux-output</i></p>
+
+<p style="margin-left:22%;">Copy a Linux image from the
+system at <i>root</i> to <i>linux-output</i>.</p>
+
+
+<p style="margin-left:11%;"><b>-i&nbsp;</b><i>initramfs-output</i></p>
+
+<p style="margin-left:22%;">Write the initial RAM-based
+file system image to <i>initramfs-output</i>.</p>
+
+<h2>EXAMPLES
+<a name="EXAMPLES"></a>
+</h2>
+
+
+<table width="100%" border="0" rules="none" frame="void"
+ cellspacing="0" cellpadding="0">
+<tr valign="top" align="left">
+<td width="11%"></td>
+<td width="1%">
+
+
+<p style="margin-top: 1em">&bull;</p></td>
+<td width="10%"></td>
+<td width="78%">
+
+
+<p style="margin-top: 1em"># prokit mkinitramfs -l vmlinuz
+-i initrd.img $root</p></td></tr>
+</table>
+
+<h2>COPYRIGHT
+<a name="COPYRIGHT"></a>
+</h2>
+
+
+<p style="margin-left:11%; margin-top: 1em">Copyright (C)
+2016 Patrick McDermott</p>
+
+<p style="margin-left:11%; margin-top: 1em">The ProteanOS
+Development Kit is free software: you can redistribute it
+and/or modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation, either
+version 3 of the License, or (at your option) any later
+version.</p>
+
+<p style="margin-left:11%; margin-top: 1em">The ProteanOS
+Development Kit is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied
+warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. See the GNU General Public License for more
+details.</p>
+
+<p style="margin-left:11%; margin-top: 1em">You should have
+received a copy of the GNU General Public License along with
+the ProteanOS Development Kit. If not, see
+&lt;http://www.gnu.org/licenses/&gt;.</p>
+
diff --git a/dev/prokit/prokit-opkg.8.mdwn b/dev/prokit/prokit-opkg.8.mdwn
index 7fb3a30..2143aa0 100644
--- a/dev/prokit/prokit-opkg.8.mdwn
+++ b/dev/prokit/prokit-opkg.8.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="prokit-opkg"]]
+[[!meta title="PROKIT-OPKG"]]
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
@@ -13,8 +13,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">prokit-opkg
-&minus; Manage packages with opkg</p>
+<p style="margin-left:11%; margin-top: 1em">prokit-opkg -
+Manage packages with opkg</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -22,8 +22,8 @@
<p style="margin-left:11%; margin-top: 1em"><b>prokit
-opkg</b> <i>root-dir</i> [<i>option</i> ...]
-<i>sub-command</i> [<i>argument</i> ...]</p>
+opkg</b> <i>root</i> [<i>option</i> ...] <i>sub-command</i>
+[<i>argument</i> ...]</p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -34,6 +34,10 @@ opkg</b> <i>root-dir</i> [<i>option</i> ...]
opkg</b> runs <b>opkg</b> in an isolated file system
environment.</p>
+<p style="margin-left:11%; margin-top: 1em">If <i>root</i>
+is a block device node, the block device is mounted and
+<b>opkg</b> is run in its file system.</p>
+
<p style="margin-left:11%; margin-top: 1em"><i>option</i>s
are <b>opkg</b> options and <i>sub-command</i> is an
<b>opkg</b> sub-command. See the usage information for
@@ -50,7 +54,7 @@ isolated system for installation.</p>
<p style="margin-left:11%; margin-top: 1em">Copyright (C)
-2014 Patrick &quot;P. J.&quot; McDermott</p>
+2014 Patrick McDermott</p>
<p style="margin-left:11%; margin-top: 1em">The ProteanOS
Development Kit is free software: you can redistribute it
diff --git a/dev/prokit/prokit-shell.8.mdwn b/dev/prokit/prokit-shell.8.mdwn
index f454a0f..7466403 100644
--- a/dev/prokit/prokit-shell.8.mdwn
+++ b/dev/prokit/prokit-shell.8.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="prokit-shell"]]
+[[!meta title="PROKIT-SHELL"]]
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
@@ -14,8 +14,8 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">prokit-shell
-&minus; Run a shell in an isolated environment</p>
+<p style="margin-left:11%; margin-top: 1em">prokit-shell -
+Run a shell in an isolated environment</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -23,7 +23,7 @@
<p style="margin-left:11%; margin-top: 1em"><b>prokit
-shell</b> <i>root-dir</i> [<i>command</i> [<i>argument</i>
+shell</b> <i>root</i> [<i>command</i> [<i>argument</i>
...]]</p>
<h2>DESCRIPTION
@@ -36,6 +36,10 @@ shell</b> starts a shell in an isolated file system
environment (using <b>chroot</b>(8)) with basic file systems
mounted.</p>
+<p style="margin-left:11%; margin-top: 1em">If <i>root</i>
+is a block device node, the block device is mounted and a
+shell is started in its file system.</p>
+
<p style="margin-left:11%; margin-top: 1em">If a
<i>command</i> is given (with optional <i>argument</i>s), it
is executed in a non-interactive shell.</p>
@@ -71,6 +75,17 @@ world</p> </td></tr>
<p># prokit shell $root &rsquo;opkg install
build-essential-$(cat /etc/proteanos_arch)&rsquo;</p></td></tr>
+<tr valign="top" align="left">
+<td width="11%"></td>
+<td width="1%">
+
+
+<p>&bull;</p></td>
+<td width="10%"></td>
+<td width="78%">
+
+
+<p># prokit shell /dev/sdb1</p></td></tr>
</table>
<h2>COPYRIGHT
@@ -79,7 +94,7 @@ build-essential-$(cat /etc/proteanos_arch)&rsquo;</p></td></tr>
<p style="margin-left:11%; margin-top: 1em">Copyright (C)
-2014 Patrick &quot;P. J.&quot; McDermott</p>
+2014 Patrick McDermott</p>
<p style="margin-left:11%; margin-top: 1em">The ProteanOS
Development Kit is free software: you can redistribute it
diff --git a/dev/prokit/prokit-version.1.mdwn b/dev/prokit/prokit-version.1.mdwn
index aa6cb4e..955d692 100644
--- a/dev/prokit/prokit-version.1.mdwn
+++ b/dev/prokit/prokit-version.1.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="prokit-version"]]
+[[!meta title="PROKIT-VERSION"]]
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
@@ -14,7 +14,7 @@
<p style="margin-left:11%; margin-top: 1em">prokit-version
-&minus; Print version information</p>
+- Print version information</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
@@ -42,7 +42,7 @@ information for prokit.</p>
<p style="margin-left:11%; margin-top: 1em">Copyright (C)
-2014 Patrick &quot;P. J.&quot; McDermott</p>
+2014 Patrick McDermott</p>
<p style="margin-left:11%; margin-top: 1em">The ProteanOS
Development Kit is free software: you can redistribute it
diff --git a/dev/prokit/prokit.1.mdwn b/dev/prokit/prokit.1.mdwn
index 4db796b..24d22ee 100644
--- a/dev/prokit/prokit.1.mdwn
+++ b/dev/prokit/prokit.1.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="prokit"]]
+[[!meta title="PROKIT"]]
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
@@ -15,7 +15,7 @@
</h2>
-<p style="margin-left:11%; margin-top: 1em">prokit &minus;
+<p style="margin-left:11%; margin-top: 1em">prokit -
ProteanOS Development Kit</p>
<h2>SYNOPSIS
@@ -49,7 +49,7 @@ program of Debian and derivatives.</p>
<td width="3%">
-<p style="margin-top: 1em"><b>&minus;h</b></p></td>
+<p style="margin-top: 1em"><b>-h</b></p></td>
<td width="8%"></td>
<td width="38%">
@@ -62,7 +62,7 @@ program of Debian and derivatives.</p>
<td width="3%">
-<p><b>&minus;V</b></p></td>
+<p><b>-V</b></p></td>
<td width="8%"></td>
<td width="38%">
@@ -104,13 +104,25 @@ environment</p>
<p style="margin-left:22%;">Build a package</p>
+
+<p style="margin-left:11%;"><b>prokit-installer-pc</b>(8)</p>
+
+<p style="margin-left:22%;">Install a PC system onto a
+block device</p>
+
+
+<p style="margin-left:11%;"><b>prokit-mkinitramfs</b>(8)</p>
+
+<p style="margin-left:22%;">Generate an initramfs
+containing an installed system</p>
+
<h2>COPYRIGHT
<a name="COPYRIGHT"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Copyright (C)
-2014 Patrick &quot;P. J.&quot; McDermott</p>
+2014 Patrick McDermott</p>
<p style="margin-left:11%; margin-top: 1em">The ProteanOS
Development Kit is free software: you can redistribute it
diff --git a/dev/releases/1/packages.mdwn b/dev/releases/1/packages.mdwn
index b4992a7..02f6810 100644
--- a/dev/releases/1/packages.mdwn
+++ b/dev/releases/1/packages.mdwn
@@ -9,9 +9,10 @@ packages:
alsa-lib 1.0.27.2-1
alsa-utils 1.0.27.2-1
base-files 1.0.3
- bc 1.06.95-1
- binutils 2.23.2-1
- build-essential 1.1
+ bc 1.07.1-1
+ binutils 2.32+sip1-1
+ bison 3.4.1-1
+ build-essential 1.2
busybox 1.21.1-13
bzip2 1.0.6-3
cmake 3.0.2-1
@@ -22,29 +23,31 @@ packages:
config-tp-gm45-flash-8mib 1.1
config-x60 1.3
curl 7.38.0-1
- dejagnu 1.5.1-1
+ dejagnu 1.6.2-1
dev86 0.16.21-1
- dropbear 2014.65-1
+ dropbear 2019.78-1
eglibc 2.19~r25243+sip1-3
- expat 2.1.0-2
- expect 5.45-1
- fakeroot 1.18.4-1
+ expat 2.2.7-1
+ expect 5.45.4-1
+ fakeroot 1.23-2
fbida 2.09-2
- file 5.17-3
- flashrom 0.9.8~r1896-1
+ file 5.37-3
+ flashrom 1.1~rc1-1
+ flex 2.6.4-1
fontconfig 2.11.1-1
freetype 2.5.3-1
fss 1.0
- gawk 4.1.0-1
- gcc-4.7 4.7.3+sip1-1
- gcc-defaults 1.0
+ gawk 5.0.0-1
+ gcc-8 8.3.0+sip1-1
+ gcc-defaults 1.1
+ gdb 8.3+sip1-1
gettext 0.18.3.2-1
- gmake 4.0-2
- gmp 5.0.5-1
+ gettext-tiny 0.3.1
+ gmake 4.2.1-1
+ gmp 6.1.2-1
gnupg 2.2.15-1
gpgme 1.13.0-2
- ich9deblob 20150518fix~git20150628.0e3520f-1
- iptables 1.4.21-2
+ ich9deblob 20160907-1
libarchive 3.1.2-1
libassuan 2.5.1-2
libexif 0.6.21-1
@@ -56,48 +59,53 @@ packages:
libnl-3 3.2.25-1
libogg 1.3.2-1
libpng12 1.2.51-2
- libsigsegv 2.10-1
- libtomcrypt 1.17-1
+ libsigsegv 2.12-1
+ libtomcrypt 1.18.2-1
libtommath 0.42.0-1
+ libtommath.1 1.1.0-1
libtool 2.4.2-2
libubox 0+git20190227.eeef7b5-1
- libunistring 0.9.3-1
+ libunistring 0.9.10-1
libvorbis 1.3.4-1
lilo 24.2-1
linux-libre 3.10.60~gnu-1
- m4 1.4.17-2
- mpc 1.0.1-1
- mpfr 3.1.1-1
+ m4 1.4.18-1
+ mpc 1.1.0-1
+ mpfr 4.0.2-1
mplus-fonts 058-2
- ncurses 5.9~20140301-2
+ ncurses 6.1+20190706-1
npth 1.6-1
+ nss-certdata 3.54-2
open-ath9k-htc-firmware 1.4~git20141115.146bff1-1
- opkbuild 4.0.2-1
- opkg-lede 0+git20190131.d4ba162-5
+ opkbuild 4.2.0-1
opkg 0.2.4-3
- opkhelper-3.0 3.1.2-2
+ opkg-lede 0+git20190131.d4ba162-6
+ opkhelper-3.0 3.1.3-1
opkhelper-default 3.0.0
- patch 2.7.1-2
- pciids 2015.09.03-2
- pciutils 3.3.1-2
+ patch 2.7.6-1
+ pciids 2019.06.17-1
+ pciutils 3.6.2-1
pcre 8.35-1
pkgconf 0.9.6-1
- platconf-pkg-tools 2.1.1
+ platconf-pkg-tools 3.0.0
popt 1.16+sip1-1
+ proquivs 1.0
proteanos-branding 0.3
pth 2.0.7-1
readline 6.3-1
+ readline.8 8.0-1
strace 4.8-1
- tcl8.6 8.6.1+sip1-1
- tzcode 2014e-1
- tzdata 2014e-1
+ tcl8.6 8.6.9+sip1-2
+ tzdb 2019a-1
usign 0+git20161022.3e6648b-1
+ wolfssl.24 4.4.0-3
+ wolfutil 1.0.0-2
wpa-supplicant 2.2-2
- xz 5.1.3alpha-2
- zlib 1.2.8+sip1-1
+ xz 5.2.4-1
+ zlib 1.2.11+sip1-1
------------------------------------------------------------
- Source packages: 90
- Binary packages: 354
+ Source packages: 98
+ Binary packages: 395
The above list was generated by running the following shell script:
@@ -107,9 +115,6 @@ The above list was generated by running the following shell script:
verw=33
base_url='http://files.proteanos.com/pub/proteanos/feeds/dev/trunk'
- LF='
- '
-
# Print header
i=0
l=$(($pkgw + $verw + 2))
@@ -134,17 +139,18 @@ The above list was generated by running the following shell script:
;;
esac
done <<EOF
- $(wget -q -O - "${base_url}/src/all/base/Packages")
+ $(wget -q -O - "${base_url}/src/all/base/Packages" \
+ "${base_url}/src/all/src/Packages")
EOF
# Collect binary package names
bins=''
- for aps in $(wget -q -O - "${base_url}/Manifest" | grep -Fv 'src/all/base'); do
- bins="${bins}${LF}$(wget -q -O - "${base_url}/${aps}/Packages" | \
+ for aps in $(wget -q -O - "${base_url}/Manifest" | grep -Fv 'src/all/'); do
+ bins="${bins} $(wget -q -O - "${base_url}/${aps}/Packages" | \
sed -n 's/^Package: //p;')"
done
# Print totals
printf '%s\n' "${tblline}"
printf 'Source packages: %d\n' "${srcs}"
- printf 'Binary packages: %d\n' "$(printf '%s\n' "${bins}" | sort -u | wc -l)"
+ printf 'Binary packages: %d\n' "$(printf '%s\n' ${bins} | sort -u | wc -l)"
diff --git a/dev/todo/install-bb-without-bb.mdwn b/dev/todo/install-bb-without-bb.mdwn
new file mode 100644
index 0000000..4bb90ff
--- /dev/null
+++ b/dev/todo/install-bb-without-bb.mdwn
@@ -0,0 +1,86 @@
+[[!meta title="Installing BusyBox Without BusyBox"]]
+
+**or, Adventures in Regressions and Crazy Ideas**
+
+---
+
+**This work is now done.**
+
+**The rest of this page is kept only for reference and historical purposes.**
+
+---
+
+Two Problems
+============
+
+`opkg-lede` and the Outsourced Inflation
+----------------------------------------
+
+`opkg-lede` [now relies][opkg-lede-dd4c78a] on an external `gzip` executable.
+When upgrading a package, it tries to execute `gzip` to unpack maintainer
+scripts and data files [after removing][opkg_install_pkg] the old version of the
+package. When the package being upgraded is `busybox`, which provides `gzip`,
+`opkg` crashes and leaves behind a completely broken system.
+
+To reiterate, `opkg-lede` is (and has been for as long as it has been in
+ProteanOS) **currently unable to upgrade `busybox`**, due to its own design.
+
+[opkg-lede-dd4c78a]: https://git.openwrt.org/?p=project/opkg-lede.git;a=commitdiff;h=dd4c78aa88efd3b9cf516030937c684814df7962
+[opkg_install_pkg]: https://git.openwrt.org/?p=project/opkg-lede.git;a=blob;f=libopkg/opkg_install.c;hb=d4ba162#l1520
+
+The Amazing Alternatives of `busybox`
+-------------------------------------
+
+Instead of [adding alternatives][alts-log] one at a time, [it would be
+nice][bb-ua] to manage all of `busybox`'s utility links using
+`update-alternatives`. Unfortunately, the [maintainer script][bb.pi] that runs
+`update-alternatives` (as well as the [`update-alternatives` script][u-a]
+itself) needs a few `busybox` utilities (`/bin/sh` for a start). Thus, after an
+older version of `busybox` is deconfigured, a newer version can't be configured.
+`busybox` also can't be configured when first unpacked by `prokit`.
+
+[alts-log]: http://git.proteanos.com/pkg/busybox.git/log/alternatives
+[bb-ua]: http://git.proteanos.com/pkg/busybox.git/commit/?id=1558d05c62ed90f7d93a14533541c33896b7b733
+[bb.pi]: http://git.proteanos.com/pkg/busybox.git/tree/busybox.pkg/postinst
+[u-a]: https://git.openwrt.org/?p=project/opkg-lede.git;a=blob;f=utils/update-alternatives.in;hb=d4ba162
+
+One Solution
+============
+
+The next version of `src:opkg-lede` (likely 0+git20190131.d4ba162-7) already
+will have a [wrapper script called `opkg`][opkg] that executes `opkg-cl` (the
+actual binary executable). The script can be extended to first save a copy of
+`/bin/busybox` to an empty temporary directory, generate utility links to it in
+the directory, and add the directory to `PATH`. Until all of this setup is
+complete, the wrapper script must be careful to execute utilities as `busybox
+$util` (a full path to `busybox` won't be necessary, as the usual `/bin/busybox`
+will be available at that point). This includes the interpreter line, which
+will need to be changed to `#!/bin/busybox sh`. `ash` built-in utilities can be
+used as usual.
+
+The `busybox` package can't use `update-alternatives` to manage all of its
+utility links until an `opkg-lede` with this wrapper script functionality is
+uploaded. This is because, even if `busybox`'s `postinst` script is modified to
+use the `busybox` executable directly, other packages' maintainer scripts may be
+executed first, while `busybox` is unpacked but not yet configured (and
+therefore utility links are not yet created).
+
+Once this new `opkg-lede` package is uploaded and `busybox` uses
+`update-alternatives` for everything, `busybox` would need to declare that it
+`Breaks` older versions of `opkg-lede`, to ensure that `opkg-lede` will preserve
+a copy of the `busybox` executable and its utility links. However, this is
+still insufficient, as the version of `opkg` that is *running* must have already
+set up this environment before `busybox` is upgraded. `busybox`'s `prerm`
+script will need to check for this somehow and abort the upgrade if `opkg` is
+too old to have prepared for a safe upgrade. One solution is for the `opkg`
+script to set an `OPKG_BUSYBOX_SAVED` environment variable.
+
+The `opkg` script of the `opkg-lede` package will need to read `busybox`'s list
+of alternatives links. This is currently located at
+`/usr/share/busybox/alternatives`. [The file's format][alts] will change when
+`busybox` uses `update-alternatives` for everything: the last two columns (name
+and priority) will be dropped. `opkg` however can simply read the first column,
+so it will maintain compatibility.
+
+[opkg]: http://git.proteanos.com/pkg/opkg-lede.git/tree/opkg
+[alts]: http://git.proteanos.com/pkg/busybox.git/tree/alternatives?id=e37f03311d934a8f33a9ff31db47b18bbf0be555
diff --git a/dev/wolfutil.mdwn b/dev/wolfutil.mdwn
new file mode 100644
index 0000000..1fba2fe
--- /dev/null
+++ b/dev/wolfutil.mdwn
@@ -0,0 +1,48 @@
+[[!meta title="Unofficial wolfSSL Utility"]]
+
+wolfutil is a command-line tool for the wolfSSL embedded (SSL/)TLS
+library. It is similar to the OpenSSL command-line tool, providing only
+a limited `s_client` TLS client command. The primary goal is to provide
+enough functionality for use by BusyBox's wget applet.
+
+wolfutil's `s_client` command is designed to be stronger by default than
+OpenSSL's, as the latter is only meant to be a "diagnostic tool". That
+is, the following command:
+
+ $ wolfutil s_client -quiet -connect ${host}:${port} \
+ > -servername ${servername}
+
+is roughly equivalent to the more complicated:
+
+ $ openssl s_client -quiet -connect ${host}:${port} \
+ > -servername ${servername} -verify 9 -verify_return_error \
+ > -no_ssl3 -no_tls1 -no_tls1_1
+
+This utility is in no way authored by or affiliated with wolfSSL Inc. or
+its contributors.
+
+
+Downloading
+===========
+
+The current version of wolfutil is [1.0.0][rel-ann].
+
+wolfutil can be found on the ProteanOS files site by [HTTP][dl-http] or
+[FTP][dl-ftp].
+
+wolfutil is maintained in a [Git repository][repo-http], which can be cloned
+from `git://git.proteanos.com/wolfutil/wolfutil.git`.
+
+[rel-ann]: http://lists.proteanos.com/proteanos-dev/2020/08/msg00000.html
+[dl-http]: http://files.proteanos.com/pub/wolfutil/
+[dl-ftp]: ftp://files.proteanos.com/pub/wolfutil/
+[repo-http]: http://git.proteanos.com/wolfutil/wolfutil.git/
+
+
+Mailing List
+============
+
+Bug reports, feature requests, and patches for wolfutil are welcome on the
+[ProteanOS development mailing list][proteanos-dev].
+
+[proteanos-dev]: http://lists.proteanos.com/proteanos-dev/