Subject: Package Paths Proposal v3
To: None <firstname.lastname@example.org>
From: Todd Vierling <email@example.com>
Date: 12/18/1998 10:12:12
Addressing some concerns, here it is again.
1. /usr is designed to be shared amongst multiple machines of a single
architecture. Therefore, in the default configuration, files that are
not exactly the same for all machines of a single architecture should not
go here, and files that are written other than at package installation
should not go here.
2. /var and /etc are local to the current machine. As per the hier(8)
manpage, /etc has configuration files and /var has log, temporary,
transient and spool files. It is known that configuration files
are typically host-specific, and that a user may at his/her discretion
use symbolic links to share particular configuration files.
3. It must be possible to have the package system install files in the same
locations as system binaries, and in a separate area, where they are not
mixed in with the standard system binaries.
1. The package tools will install things in $PREFIX, which is typically
a) The user may create $PREFIX as a symlink to /usr, causing packaged
binaries to be intermixed with the operating system files themselves.
This has some advantages, including that paths don't have to be
changed; users just use their usual paths to find the installed
packages. (cjs: In my personal experience, this would make it easier
to convert Linux users.)
b) The user may create $PREFIX as a directory, separating all but
configuration and host volatile files from the rest of the system.
[The default setting between (a) and (b) with a `shipped' system
is OUTSIDE OF THE SCOPE OF THIS PROPOSAL, and should be discussed
in a different thread.]
c) Special packages, such as those intended to replace system binaries,
should install binaries in $PREFIX, rename the appropriate system
files to `file.old', and if the user chose (b) instead of (a)
above, use symbolic links to point to the proper paths in $PREFIX.
2. Programs will be compiled to find their data and modules under $PREFIX
in bin, sbin, lib, libexec, libdata, share, as per hier(7) (a similar
fashion to the subdirectories under /usr/local). These would then equate
to paths such as /usr/pkg/bin, /usr/pkg/sbin, etc., for the separation
case, and /usr/bin, /usr/sbin, /usr/lib, etc., for the intermix case.
3. Programs use configuration files from /etc (not
$PREFIX/etc) as the compiled-in default. Generally, subdirectories
(/etc/<pkgname>) should be created for packages that have more than one
or two config files. Sample configuration files should be placed in
$PREFIX/share/examples/<pkgname> (pkgname may be omitted if a single,
uniquely named config file is used). The general algorithm for
a) See if example config files exist in $PREFIX/share/examples. If they
do, rename them with a .old extension. (This facilitates a later
diff3(1) or merge(1) to see and deal with configuration options that
are new or changed when a package is upgraded.)
b) Install sample config files in $PREFIX/share/examples/<pkgname>.
c) See if `real' configuration files exist in /etc. If not, copy the
copy the sample config set over to /etc.
4. Volatile files go in /var as per hier(4) and do NOT go in $PREFIX/var.
These are most often host-specific and usually host-byte-order dependent
in the case of binary volatile files.
5. Daemons that start at boot time should have a start/stop script
available. This should be placed in $PREFIX/share/rc.d/<pkgname>.
It should accept the following arguments:
start: start the daemon
stop: stop the daemon
reload: reload configuration files
The `stop' item is so that the script can clean up things that the daemon
doesn't (such as /var/run/xntpd.pid, for xntpd) and the reload is so that
the script can do whatever is appropriate to make the server reread its
config files (send a sighup, stop and start for dhcpd, mysqladmin reload
for MySQL, etc.)
These should return a status code, but should not produce output except
in the case of an error. These scripts are likely to be called from
another program, though they may also be run directly by the user.
7. Package metadata: the files describing a package install (PLIST, etc.) go
in $PREFIX/libdata/pkgdb. That way if a package is installed on a one
system sharing /usr with others, it `appears' on the other systems (minus
/etc config files and /var files).
-- Todd Vierling (Personal firstname.lastname@example.org; Bus. email@example.com)