summaryrefslogtreecommitdiff
path: root/Packages.txt
diff options
context:
space:
mode:
authoragc <agc@pkgsrc.org>2003-06-28 09:58:11 +0000
committeragc <agc@pkgsrc.org>2003-06-28 09:58:11 +0000
commit8a6be63ded9477bdfbb9fd752557048b87f5bf62 (patch)
treea488ee2be8891ab0536c4ba6d80ad746c540fbf1 /Packages.txt
parent4835054c51a81697146683a3f5767c8c5f9c64a8 (diff)
downloadpkgsrc-8a6be63ded9477bdfbb9fd752557048b87f5bf62.tar.gz
Resurrect the previous version of Packages.txt until the new docbook-style
documentation has been properly sorted out.
Diffstat (limited to 'Packages.txt')
-rw-r--r--Packages.txt2965
1 files changed, 2955 insertions, 10 deletions
diff --git a/Packages.txt b/Packages.txt
index 2bf21db989d..7fdcb8d03a2 100644
--- a/Packages.txt
+++ b/Packages.txt
@@ -1,15 +1,2960 @@
-$NetBSD: Packages.txt,v 1.297 2003/06/23 07:48:01 grant Exp $
+# $NetBSD: Packages.txt,v 1.298 2003/06/28 09:58:11 agc Exp $
+###########################################################################
-The pkgsrc documentation now lives on the NetBSD web site.
+ ==========================
+ Documentation on the
+ NetBSD Package System
+ ==========================
-Full documentation, one file per chapter:
- http://www.NetBSD.org/Documentation/pkgsrc/
+ Hubert Feyrer, Alistair Crooks
-Full documentation in a single file:
- http://www.NetBSD.org/Documentation/pkgsrc/pkgsrc.html
-Full documentation in a single plain-text file:
- http://www.NetBSD.org/Documentation/pkgsrc/pkgsrc.txt
+Table of contents:
+==================
-pkgsrc.txt and pkgsrc.html are also provided in the top level pkgsrc
-directory (this directory).
+Run this command to produce a table of contents:
+ sed '/^.====/{g;p;};h;d' Packages.txt
+
+
+ 0 Intro
+ =======
+
+There is a lot of software freely available for Unix based systems, which
+usually runs on NetBSD, too, sometimes with some modifications. The NetBSD
+packages collection incorporates any such changes necessary to make that
+software run on NetBSD, and makes the installation (and re-installation) of
+the software package easy by means of a single command.
+
+The NetBSD package system is used to enable such freely available
+third-party software to be built easily on NetBSD hosts. Once the software
+has been built, it is manipulated with the pkg_* tools so that installation
+and de-installation, printing of an inventory of all installed packages and
+retrieval of one-line comments or more verbose descriptions are all simple.
+
+Both the NetBSD packages collection and the NetBSD package system are
+derived from FreeBSD.
+
+
+ 0.1 Overview
+ ============
+
+This document is divided into two parts. The first, "User's Guide",
+describes how one can use one of the packages in the Package
+Collection, either by installing a precompiled binary package, or
+by building one's copy using the NetBSD package system. The
+second part, "Package Constructor's Guide", explains how to prepare
+a package so it can be easily built by other NetBSD users without
+knowing about the package's building details.
+
+
+ 0.2 Terminology
+ ===============
+
+There has been a lot of talk about "ports", "packages", etc. so far. Here
+is a description of all the terminology used within this document:
+
+ * Package:
+ A set of files and building instructions that describe what's necessary
+ to build a certain piece of software using the NetBSD package
+ system. Packages are traditionally stored under /usr/pkgsrc.
+
+ * The NetBSD package system:
+ This is the part of the NetBSD operating system handling building
+ (compiling), installing, and removing of packages.
+
+ * Distfile:
+ This term describes the file or files that are provided by the author
+ of the piece of freely available software to distribute his work. All
+ the changes necessary to build on NetBSD are reflected in the
+ corresponding package. Usually the distfile is in the form of a
+ compressed tar-archive, but other types are possible, too. Distfiles
+ are stored below /usr/pkgsrc/distfiles.
+
+ * Port:
+ This is the term used by FreeBSD people for what we call a package.
+ In NetBSD terminology, "port" refers to a different architecture.
+
+ * Precompiled (binary) package:
+ A set of binaries built by the NetBSD package system from a distfile
+ using the NetBSD package system and stuffed together in a single .tgz
+ file so it can be installed on machines of the same machine architecture
+ without the need to recompile. Packages are generated in
+ /usr/pkgsrc/packages by the NetBSD package system; there is also an
+ archive on ftp.netbsd.org.
+
+ Sometimes, this is referred to by the term "package" too,
+ especially in the context of precompiled packages.
+
+ * Program:
+ The piece of software to be installed which will be constructed from
+ all the files in the Distfile by the actions defined in the
+ corresponding package.
+
+ * NetBSD RCS IDs:
+ Some files in a package contain RCS IDs to reflect which version of
+ that file this is (inserted automatically by cvs). These IDs are used
+ in several examples within this document, but as this document itself
+ is managed by CVS, it can't list the RCS IDs in plaintext. Instead, the
+ $s are written as <$>, resulting in <$>NetBSD<$> and <$>Id<$>.
+
+
+ 0.3 Typography
+ ==============
+
+Right now this document is written in plain ASCII text, and there's not
+much typography applied here. It's being moved to DocBook.
+
+When giving examples for commands, shell prompts are used to show if the
+command should/can be issued as root, or if "normal" user privileges are
+sufficient. We use a "#" for root's shell prompt, and a "%" for users'
+shell prompt, assuming they use the C-shell or tcsh.
+
+
+====================
+Part I: User's Guide
+====================
+
+ 1 Installing a precompiled binary package
+ =========================================
+
+This section describes how to find, retrieve and install a precompiled
+binary package that someone else already prepared for your type of machine.
+
+
+ 1.1 Where to get
+ ================
+
+Precompiled packages are stored on ftp.netbsd.org and its mirrors in the
+directory /pub/NetBSD/packages for anon FTP access. Please pick the right
+subdirectory there as indicated by "uname -p". In that directory, there
+is a subdirectory for each category plus a subdirectory "All" which includes
+the actual binaries in .tgz-files. The category subdirectories use symbolic
+links to those files. (This is the same directory layout as in
+/usr/pkgsrc/packages).
+
+This same directory layout applies for CDROM distributions, only that the
+directory may be rooted somewhere else, probably somewhere below /cdrom.
+Please consult your CDROM's documentation for the exact location!
+
+
+ 1.2 How to use
+ ==============
+
+If you have the files on a CDROM or downloaded them to your hard disk, you
+can install them with the following command (be sure to su to root first):
+
+ # pkg_add /path/to/package.tgz
+
+If you have FTP access and you don't want to download the packages via FTP
+prior to installation, you can do this automatically by giving pkg_add an
+ftp-URL:
+
+ # pkg_add ftp://ftp.netbsd.org/pub/NetBSD/packages/<OS Ver>/<arch>/All/package.tgz
+
+If there is any doubt, the uname utility can be used to determine the
+<OS Ver>, and <arch> by running "uname -rp".
+
+Also note that any prerequisite packages needed to run the package in
+question will be installed, too, assuming they are present where you install
+from.
+
+After you've installed packages, be sure to have /usr/pkg/bin in your $PATH
+so you can actually start the just installed program.
+
+
+ 1.3 A word of warning
+ =====================
+
+Please pay very careful attention to the warnings expressed in that manual
+page about the inherent dangers of installing binary packages which you did
+not create yourself, and the security holes that can be introduced onto
+your system by indiscriminate adding of such files.
+
+
+ 2 Installing by Building
+ ========================
+
+This assumes that the package is already part of the NetBSD package system.
+If it is not, then you are advised to read part II of this document,
+"Package Constructor's Guide".
+
+
+ 2.1 Requirements
+ ================
+
+To build packages from source on a NetBSD system the "comp" and the "text"
+distribution sets must be installed. If you want to build X11 related
+packages the "xbase" and "xcomp" distribution sets are required, too.
+
+
+ 2.2 Where to get pkgsrc
+ =======================
+
+There are three ways to get pkgsrc. Either as a tar file, via SUP, or
+via CVS. All three ways are described here.
+
+To get the package source going, you need to get the pkgsrc.tar.gz file
+from ftp://ftp.netbsd.org/pub/NetBSD-current/tar_files/pkgsrc.tar.gz and
+unpack it into /usr.
+
+As an alternative, you can get pkgsrc via the Software Update Protocol,
+SUP. To do so, make sure your supfile has a line saying "release=pkgsrc" in
+it, see the examples in /usr/share/examples/supfiles, and that the
+directory /usr/pkgsrc does exist. Then, simply start "sup -v
+/path/to/your/supfile".
+
+To get pkgsrc via CVS, make sure you have cvs installed. If not present on
+your system, it can be found as precompiled binary on ftp.netbsd.org.
+To do an initial (full) checkout of pkgsrc, do the following steps:
+
+ % setenv CVSROOT anoncvs@anoncvs.netbsd.org:/cvsroot
+ % setenv CVS_RSH ssh
+ % cd /usr
+ % cvs checkout -P pkgsrc
+
+This will create the "pkgsrc" directory in your /usr, and all the
+package source will be stored under /usr/pkgsrc. To update pkgsrc
+after the initial checkout, make sure you have CVS_RSH set as above,
+then do:
+
+ % cd /usr/pkgsrc
+ % cvs -q update -dP
+
+Please also note that it is possible to have multiple copies of the
+pkgsrc hierarchy in use at any one time - all work is done relatively
+within the pkgsrc tree.
+
+
+ 2.3 Fetching distfiles
+ ======================
+
+There is one gotcha: The distribution file (i.e. the unmodified source)
+must exist on your system for the packages system to be able to build it.
+If it does not, then ftp(1) is used to fetch the distribution files
+automatically.
+
+You can overwrite some of the major distribution sites to fit to sites
+that are close to your own. Have a look at
+pkgsrc/mk/bsd.pkg.defaults.mk to find some examples - in particular,
+look for the MASTER_SORT, MASTER_SORT_REGEX and INET_COUNTRY
+definitions. This may save some of your bandwidth and time.
+
+You can change these settings either in your shell's environment, or,
+if you want to keep the settings, by editing the /etc/mk.conf file,
+and adding the definitions there.
+
+If you don't have a permanent Internet connection and you want to know
+which files to download, "make fetch-list" will tell you what you'll need.
+Put these distfiles into /usr/pkgsrc/distfiles.
+
+
+ 2.4 How to build and install
+ ============================
+
+Assuming that the distfile has been fetched (see previous section), become
+root and change into the relevant directory. Then you can type
+
+ % make
+
+at the shell prompt to build the various components of the package, and
+
+ # make install
+
+at the shell prompt to install the various components into the correct
+places on your system.
+
+Taking the top system utility as an example, we can install it on our
+system by building as shown in appendix A.1.
+
+The program is installed under the default root of the packages tree -
+/usr/pkg. Should this not conform to your tastes, simply set the LOCALBASE
+variable in your environment, and it will use that value as the root of
+your packages tree. So, to use /usr/local, set
+
+ LOCALBASE=/usr/local
+
+in your environment. Please note that you should use a root which is
+dedicated to packages and not shared with other programs (ie, do not try
+and use LOCALBASE=/usr). Also, you should not try to add any of your
+own files or directories (such as, for example, src, obj, or pkgsrc) below
+the LOCALBASE tree. This is to prevent possible conflicts between programs
+and other files installed by the package system and whatever else may have
+been installed there.
+
+There is, of course, one exception to this - X11 packages are traditionally
+installed in the X11 tree. The definition used to identify the root of the
+X11 tree is the X11BASE definition.
+
+It is possible to install X11 packages in the LOCALBASE tree, for
+which you must install the xpkgwedge package
+(pkgsrc/pkgtools/xpkgwedge) - see section 7.1 for further details.
+
+Some packages look in /etc/mk.conf to alter some configuration options
+at build time. Have a look at pkgsrc/mk/bsd.pkg.defaults.mk to
+get an overview of what will be set there by default. Environment
+variables such as LOCALBASE, and X11BASE can be set in /etc/mk.conf to
+save having to remember to set them each time you want to use pkgsrc.
+
+Occasionally, people want to "look under the covers" to see what is
+going on when a package is building or being installed. This may be
+for debugging purposes, or out of simple curiosity. A number of utility
+values have been added to help with this.
+
+(1) If you invoke the make(1) command with PKG_DEBUG_LEVEL=2, then a
+huge amount of information will be displayed. As a worked example,
+
+ make patch PKG_DEBUG_LEVEL=2
+
+will show all the commands that are invoked, up to and including the
+"patch stage".
+
+(2) If you want to know the value of a certain make(1) definition, then
+the VARNAME definition should be used, in conjunction with the show-var
+target. e.g.
+
+ make show-var VARNAME=DISTFILES
+
+will show the expansion of the make(1) variable "DISTFILES".
+
+If you want to de-install and re-install a binary package that you've
+created (see next section), that you put into pkgsrc/packages manually or
+that's located on a remote FTP server, you can use the the "bin-install"
+target. This target will install a binary package - if available - via
+pkg_add, and do a "make package" else. The list of remote FTP sites
+searched is kept in the variable BINPKG_SITE, which defaults to
+ftp.netbsd.org. Any flags that should be added to pkg_add(8) can be put
+into BIN_INSTALL_FLAGS. See pkgsrc/mk/bsd.pkg.defaults.mk for more details.
+
+A final word of warning: If you setup a system that has a non-standard
+setting for LOCALBASE (or X11BASE, for that matter), be sure to set that
+before any packages are installed, as you can not use several directories
+for the same purpose. Doing so will result in pkgsrc not being able to
+properly detect your installed packages, and fail miserably. Note also that
+precompiled binary packages are usually built with the default LOCALBASE of
+/usr/pkg, and that you should *not* install any if you use a non-standard
+LOCALBASE.
+
+
+ 3 Making precompiled packages
+ =============================
+
+
+ 3.1 Packaging a single package
+ ==============================
+
+Once you have built and installed the package as mentioned above, you can
+build it into a "binary package" - you might want to do this so that you
+can use the binaries you have just built on another NetBSD system, or to
+provide a simple means for others to use your binary package instead of
+wasting CPU time - this is done by changing to the appropriate directory in
+the pkgsrc tree, and typing the command
+
+ # make package
+
+at the shell prompt. This will build and install your package (if not
+already done), and then construct a binary package out of the results so
+that you can use the pkg_* tools to manipulate this. The binary package is
+stored under /usr/pkgsrc/packages, it's in the form of a gzipped file at
+the present time. See appendix A.2 for a continuation of the above top
+example.
+
+Please see the "submitting" section later in this document on how to submit
+such a binary package.
+
+
+ 3.2 Doing a bulk build of all packages
+ ======================================
+
+If you want to get a full set of precompiled binary packages, this section
+describes how to get them. Beware that the bulk build will remove all
+currently installed packages from your your system! Having a FTP server
+configured either on the machine doing the bulk builds or on a nearby NFS
+server can help to make the packages available to everyone. See ftpd(8) for
+more information. If you use a remote NFS server's storage, be sure to not
+actually compile on NFS storage, as this slows things down a lot.
+
+
+ 3.2.1 Configuration
+ ===================
+
+ 3.2.1.1 /etc/mk.conf
+ ====================
+
+You may want to set things in /etc/mk.conf. Look at
+pkgsrc/mk/bsd.pkg.defaults.mk for details of the default settings.
+You will want to make sure that ACCEPTABLE_LICENSES meet your local
+policy:
+
+ PACKAGES?= ${_PKGSRCDIR}/packages/${MACHINE_ARCH}
+ WRKOBJDIR?= /usr/tmp/pkgsrc # build here instead of in pkgsrc
+ BSDSRCDIR= /usr/src
+ BSDXSRCDIR= /usr/xsrc # for x11/xservers
+ OBJHOSTNAME?= yes # use work.`hostname`
+ FAILOVER_FETCH= yes # insist on the correct checksum
+ PKG_DEVELOPER?= yes
+ _ACCEPTABLE= yes
+
+If you wish to use xpkgwedge for the entire build, then add:
+
+ BULK_PREREQ+= pkgtools/xpkgwedge
+
+Other packages which must be installed during the bulk build to modify the
+build behaviour may be added to the BULK_PREREQ variable. Note that currently
+the only package for which BULK_PREREQ makes sense is xpkgwedge.
+
+ 3.2.1.2 build.conf
+ ==================
+
+In pkgsrc/mk/bulk, copy ``build.conf-example'' to ``build.conf'' and
+edit it, following the comments in that file. This is the config
+file that determines where log files are generated after the build,
+where to mail the build report, where your pkgsrc is located and
+which user to su(8) to to do a 'cvs update'.
+
+ 3.2.1.3 pre-build.local
+ =======================
+
+It is possible to configure the bulk build to perform certain site
+specific tasks at the end of the pre-build stage. If the file
+``pre-build.local'' exists in pkgsrc/mk/bulk it will be executed
+(as a sh(1) script) at the end of the usual pre-build stage. An
+example use of pre-build.local is to have the line:
+
+ # echo "I do not have enough disk space to build this pig." \
+ > pkgsrc/games/crafty-book-enormous/$BROKENF
+
+to prevent the system from trying to build a particular package
+which requires nearly 3 Gb of disk space.
+
+ 3.2.2 Other environmental considerations
+ ========================================
+
+As /usr/pkg will be completely deleted at the start of bulk builds,
+make sure your login shell is placed somewhere else. Either drop it into
+/usr/local/bin (and adjust your login shell in the password file), or
+(re-)install it via pkg_add from /etc/rc.local, so you can login after a
+reboot (remember that your current process won't die if the package is
+removed, you just can't start any new instances of the shell any more).
+Also, if you use a OS version below 1.5 or you still want to use the
+pkgsrc version of ssh for some reason, be sure to install ssh before
+starting it from rc.local:
+
+ ( cd /usr/pkgsrc/security/ssh ; make bulk-install )
+ if [ -f /usr/pkg/etc/rc.d/sshd ]; then
+ /usr/pkg/etc/rc.d/sshd
+ fi
+
+Not doing so will result in you being not able to log in via ssh
+after the bulk build is finished or if the machine gets rebooted
+or crashes. You have been warned! :)
+
+
+ 3.2.3 Operation
+ ===============
+
+Make sure you don't need any of the packages still installed.
+BEWARE: During the bulk build, ALL packages will be removed!!!
+Be sure to remove all other things that might interfere with builds, like
+some libs installed in /usr/local, etc. then become root and type:
+
+ # cd /usr/pkgsrc
+ # sh mk/bulk/build
+
+If for some reason your last build didn't complete (power failure,
+system panic, ...), you can continue it by running:
+
+ # sh mk/bulk/build restart
+
+At the end of the bulk run, you will get a summary via mail, and find
+build logs in the directory specified by "FTP" in the "build.conf"
+file.
+
+
+ 3.2.4 What it does
+ ==================
+
+The bulk builds consist of three steps:
+
+1. pre-build: The script updates your pkgsrc via (anon)cvs, then cleans
+ out any broken distfiles, and removes all packages installed.
+
+2. the bulk build: This is basically 'make bulk-package' with an optimised
+ order in which packages will be built. Packages that don't require
+ other packages will be built first, and packages with many depends
+ will be built later.
+
+3. post-build: Generates a report that's placed in the directory specified
+ in the build.conf file named ``broken.html'', a short version of
+ that report will also be mailed to the build's admin.
+
+During the build, a list of broken packages will be compiled in
+/usr/pkgsrc/.broken (or .../.broken.${MACHINE} if OBJMACHINE is set),
+individual build logs of broken builds can be found in the package's
+directory. These files are used by the bulk-targets to mark broken builds
+to not waste time trying to rebuild them, and they can be used to debug
+these broken package builds later.
+
+
+ 3.2.5 Disk space requirements
+ =============================
+
+Currently, roughly the following requirements are valid for
+1.5/i386:
+
+ * Distfiles: 1500MB (NFS ok)
+ * Full set of all binaries: 1000MB (NFS ok)
+ * Temp space for compiling: 1500MB (local disk recommended)
+
+For 1.5/alpha:
+
+ * Full set of all binaries: 1300MB (NFS ok)
+
+Note that all pkgs will be de-installed as soon as they are turned into a
+binary package, and that work-sources are removed, so there is no huge
+demand to disk space. Afterwards, if the package is needed again, it will
+be installed via pkg_add instead of building again, so there are no cycles
+wasted by recompiling.
+
+
+ 3.2.6 Setting up a sandbox for chroot'ed builds
+ ===============================================
+
+If you don't want all the pkgs nuked from a machine (rendering it useless
+for anything but pkg compiling), there is the possibility of doing the pkg
+bulk build inside a chroot environment.
+
+The first step to do so is setting up a chroot sandbox, e.g. /usr/sandbox.
+After extracting all the sets from a NetBSD installation or doing a
+"make distribution DESTDIR=/usr/sandbox" in src/etc, make sure the following
+items are present and properly configured:
+
+ * kernel:
+ cp /netbsd /usr/sandbox
+ * /dev/*:
+ cd /usr/sandbox/dev ; sh MAKEDEV all
+ * /etc/resolv.conf (for security/smtpd and mail):
+ cp /etc/resolv.conf /usr/sandbox/etc
+ * working(!) mail config (hostname, sendmail.cf):
+ cp /etc/mail/sendmail.cf /usr/sandbox/etc/mail
+ * /etc/localtime (for security/smtpd):
+ ln -sf /usr/share/zoneinfo/GMT /usr/sandbox/etc/localtime
+ * /usr/src (system sources, for sysutils/aperture, net/ppp-mppe):
+ ln -s ../disk1/cvs .
+ ln -s cvs/src-1.6 src
+ ln -s cvs/pkgsrc .
+ * create /var/db/pkg (not part of default install):
+ mkdir /usr/sandbox/var/db/pkg
+ * create /usr/pkg (not part of default install)
+ mkdir /usr/sandbox/usr/pkg
+ * checkout pkgsrc from cvs, into /usr/sandbox/usr/pkgsrc
+ cvs -d cvs.netbsd.org:/cvsroot co pkgsrc
+ * /usr/pkgsrc/packages & .../distfiles (point outside of sandbox)
+ * /etc/mk.conf, see 3.2.1.1
+ * adjust .../mk/bulk/build.conf
+
+!!! Don't forget to install X !!!
+If you are a developer and want to upload the resulting binary packages
+to ftp.netbsd.org, make sure you are using the default X version for your
+architecture and release (up to 1.6, that is 3.3.6 for all architectures).
+
+Next thing you will want to is make sure /usr/sandbox/usr/pkgsrc contains a
+fresh checkout of pkgsrc (e.g. from anoncvs). Do not mount/link this to the
+copy of your pkgsrc tree you do development in, as this will likely cause
+problems! Adjust .../pkgsrc/packages and .../pkgsrc/distfiles to point to
+some places outside the sandbox if you want to make the files public.
+
+Then, configure .../pkgsrc/mk/bulk/build.conf to fit your needs!
+
+When the chroot sandbox is setup, you can start the build with the following
+steps:
+
+ # cd /usr/sandbox/usr/pkgsrc
+ # sh mk/bulk/do-sandbox-build
+
+This will just jump inside the sandbox and start thrash^Wbuilding.
+At the end of the build, mail will be sent with the results of the build.
+Created binary pkgs will be in /usr/sandbox/usr/pkgsrc/packages (wherever
+that points/mounts to/from).
+
+
+ 3.3 Creating a multiple CD-ROM packages collection
+ ==================================================
+
+After your bulk pkgsrc build has completed, you may wish to create a CD-ROM
+set of the resulting binary packages to assist in installing packages on
+other machines. The package pkgsrc/pkgtools/cdpack provides a simple tool for
+creating the ISO 9660 images. `cdpack' arranges the packages on the CD-ROM's
+in a way that keeps all the dependencies for given package on the same
+CD as that package.
+
+
+ 3.3.1 Example of cdpack
+ =======================
+
+Complete documentation for cdpack is found in cdpack(1). The following
+short example assumes that the binary packages are left in
+/usr/pkgsrc/packages/All and that sufficient disk space exists in /u2
+to hold the ISO 9660 images.
+
+ # mkdir /u2/images
+ # pkg_add /usr/pkgsrc/packages/All/cdpack
+ # cdpack /usr/pkgsrc/packages/All /u2/images
+
+If you wish to include a common set of files (COPYRIGHT, README, etc)
+on each CD in the collection, then you need to create a directory which
+contains these files. For example
+
+ # mkdir /tmp/common
+ # echo "This is a README" > /tmp/common/README
+ # echo "Another file" > /tmp/common/COPYING
+ # mkdir /tmp/common/bin
+ # echo "#!/bin/sh" > /tmp/common/bin/myscript
+ # echo "echo Hello world" >> /tmp/common/bin/myscript
+ # chmod 755 /tmp/common/bin/myscript
+
+Now create the images with
+
+ # cdpack -x /tmp/common /usr/pkgsrc/packages/All /u2/images
+
+and each image will contain "README", "COPYING", and "bin/myscript"
+in their root directories.
+
+
+====================================
+Part II: Package Constructor's Guide
+====================================
+
+ 4 Package components - files, directories and contents
+ ======================================================
+
+Whenever you're preparing a package, there are a number of files involved
+which are described in the following sections.
+
+
+ 4.1 Makefile
+ ============
+
+Building, installation and creation of a binary package are all controlled
+by the package's Makefile.
+
+There is a Makefile for each package. This file includes the standard
+bsd.pkg.mk file (referenced as "../../mk/bsd.pkg.mk"), which sets all the
+definitions and actions necessary for the package to compile and install
+itself. The mandatory fields are the DISTNAME which specifies the base name
+of the distribution file to be downloaded from the site on the Internet,
+MASTER_SITES which specifies that site, CATEGORIES which denotes the
+categories into which the package falls, PKGNAME which is the name of the
+package, the MAINTAINER name, and the COMMENT variable, which should
+contain a one-line description of the package (the package name should not
+appear, it will be added automatically). The maintainer variable is there
+so that anyone who quibbles with the (always completely correct) decisions
+taken by the guy who maintains the port can complain vigorously.
+
+The MASTER_SITES may be set to one of the predefined sites:
+
+ ${MASTER_SITE_APACHE}
+ ${MASTER_SITE_DEBIAN}
+ ${MASTER_SITE_GNOME}
+ ${MASTER_SITE_GNU}
+ ${MASTER_SITE_GNUSTEP}
+ ${MASTER_SITE_MOZILLA}
+ ${MASTER_SITE_PERL_CPAN}
+ ${MASTER_SITE_SOURCEFORGE}
+ ${MASTER_SITE_SUNSITE}
+ ${MASTER_SITE_R_CRAN}
+ ${MASTER_SITE_SUSE}
+ ${MASTER_SITE_TEX_CTAN}
+ ${MASTER_SITE_XCONTRIB}
+ ${MASTER_SITE_XEMACS}
+
+If one of these predefined sites is chosen, you may require the ability to
+specify a subdirectory of that site. Since these macros may expand to
+more than one actual site, you MUST use the following construct to specify
+a subdirectory:
+
+ ${MASTER_SITE_GNU:=subdirectory/name/}
+
+(Note the trailing slash after the subdirectory name.) Use of the deprecated
+MASTER_SITE_SUBDIR will not work.
+
+If the package has multiple DISTFILES or multiple PATCHFILES from different
+sites, set SITES_foo to a list of URI's where file "foo" may be found. "foo"
+includes the suffix, e.g.
+
+ DISTFILES=${DISTNAME}${EXTRACT_SUFX}
+ DISTFILES+=foo-file.tar.gz
+ SITES_foo-file.tar.gz=http://www.somewhere.com/somehow/ \
+ http://www.somewhereelse.com/mirror/somehow/
+
+Note, that the normal default setting of DISTFILES must be made explicit
+if you want to add to it (rather than replace it), as you usually would.
+
+Currently the following values are available for CATEGORIES. If more than
+one is used, they need to be separated by spaces:
+
+ archivers audio benchmarks biology cad
+ chat comms converters cross databases
+ devel editors emulators finance fonts
+ games graphics ham japanese lang
+ mail math mbone misc net
+ news parallel print security shells
+ sysutils textproc time wm www
+ x11
+
+See the NetBSD packages(7) manual page for a description of all available
+options and variables.
+
+Please pay attention to the following gotchas:
+
+ - Add MANCOMPRESSED (if not already there) if manpages are installed in
+ compressed form by the package; see comment in bsd.pkg.mk
+ - Replace /usr/local by ${PREFIX} in all files (see patches below)
+ - If the package installs any info files, see the section `Packages providing
+ info files' in this document.
+ - Adjust MAINTAINER to be either yourself, if you plan to maintain the
+ package for future updates, or set it to the default MAINTAINER
+ packages@netbsd.org.
+ - If there exists a home page for the software in question, please
+ add the variable HOMEPAGE right after MAINTAINER. The value of this
+ variable should be the URL for the home page.
+ - Please also set the COMMENT variable to a short description of the
+ package.
+
+
+ 4.2 distinfo
+ ============
+
+Most important, the mandatory message digest, or checksum, of all the
+distfiles needed for the package to compile, confirming they match the
+original file distributed by the author. This ensures that the
+distfile retrieved from the Internet has not been corrupted during
+transfer or altered by a malign force to introduce a security hole.
+It is best generated using the "make makesum" command. The digest
+algorithm used was, at one stage, md5, but that was felt lacking
+compared to sha1, and so sha1 is now the default algorithm. The
+distfile size is also generated and stored in new distinfo files.
+The pkgsrc/pkgtools/digest utility calculates all of the digests
+in the distinfo file, and it provides various different algorithms.
+At the current time, the algorithms provided are:
+
+ md5, rmd160, sha1, sha256, sha384 and sha512
+
+Some packages have different sets of distfiles on a per architecture
+basis. (A good example is pkgsrc/www/navigator). These are kept in the
+same distinfo file and care should be taken when upgrading such a
+package to ensure distfile information is not lost.
+
+The message digest/checksum for all the official patches found in the
+patches/ directory (see section 4.3) for the package is also stored in
+the distinfo file. This is a message digest/checksum of all lines in
+the patch file except the NetBSD RCS Id. This file is generated by
+invoking "make makepatchsum".
+
+
+ 4.3 patches/*
+ =============
+
+This directory contains files that are used by the patch(1) command to
+modify the sources as distributed in the distribution file into a form that
+will compile and run perfectly on NetBSD. The files are applied
+successively in alphabetic order (as returned by a shell "patches/patch-*"
+glob expansion), so patch-aa is applied before patch-ab etc.
+
+The patch-?? files should be in "diff -bu" format, and apply without
+a fuzz to avoid problems (To force patches to apply with fuzz you
+can set PATCH_FUZZ_FACTOR=-F2). Furthermore, do not put changes
+for more than one file into a single patch-file, as this will make
+future modifications more difficult.
+
+Similar, a file should be patched at most once, not several times by
+several different patches. If a file needs several patches, they should
+be combined into one file.
+
+One important thing to mention is to pay attention that no RCS IDs
+get stored in the patch files, as these will cause problems when
+later checked into the NetBSD CVS tree. To avoid this, use either
+the "-U 2" or "-U 1" option to diff, or let the 'pkgdiff' command
+from pkgsrc/pkgtools/pkgdiff help you.
+
+If you don't want to worry about the problems in the last two paragraphs
+yourself, use pkgdiff from the pkgsrc/pkgtools/pkgdiff package, which takes
+care of any RCS Ids by itself.
+
+For even more automation, we recommend using mkpatches from the same
+package to make a whole set of patches. You just have to backup files
+before you edit them to "filename.orig", e.g. with "cp -p filename
+filename.orig" or, easier, by using pkgvi from the same package. If you
+upgrade a package this way, you can easily compare the new set of patches
+with the previously existing one with patchdiff.
+
+When you have finished a package, remember to generate the checksums
+for the patch files by using the "make makepatchsum" command, see
+section 4.2.
+
+If it is desired to store any patches that should not be committed into
+pkgsrc, they can be kept outside the pkgsrc tree in the $LOCALPATCHES
+directory. The directory tree there is expected to have the same
+"category/package" structure as pkgsrc, and patches are expected to be
+stored inside these dirs (also known as $LOCALPATCHES/$PKGPATH). For
+example if you want to keep a private patch for pkgsrc/graphics/png, keep
+it in $LOCALPATCHES/graphics/png/mypatch. All files in the named directory
+are expected to be patch files, and they are applied after the "normal"
+pkgsrc patches are applied.
+
+
+ 4.4 Other mandatory files
+ =========================
+
+ * DESCR:
+ A multi-line description of the piece of software. This should include
+ any credits where they are due. Please bear in mind that others do not
+ share your sense of humour (or spelling idiosyncrasies), and that others
+ will read everything that you write here.
+
+ * PLIST:
+ This file governs the files that are installed on your system: all the
+ binaries, manual pages, etc. There are other directives which may be
+ entered in this file, to control the creation and deletion of
+ directories, and the location of inserted files.
+
+
+ 4.5 Optional files
+ ==================
+
+ * INSTALL:
+ Shell script invoked twice during pkg_add. First time after package
+ extraction and before files are moved in place, the second time after
+ the files to install are moved in place. This can be used to do any
+ custom procedures not possible with @exec commands in PLIST. See
+ pkg_add(1) and pkg_create(1) for more information.
+
+ * DEINSTALL:
+ This script is executed before and after any files are removed. It is
+ this script's responsibility to clean up any additional messy details
+ around the package's installation, since all pkg_delete knows is how to
+ delete the files created in the original distribution. See pkg_delete(1)
+ and pkg_create(1) for more information.
+
+ * MESSAGE:
+ Display this file after installation of the package.
+ Useful for things like legal notices on almost-free software, etc.
+ Please note that you can modify variables in it easily by using
+ MESSAGE_SUBST in the package's Makefile:
+
+ MESSAGE_SUBST+= SOMEVAR="somevalue"
+
+ replaces
+
+ ${SOMEVAR}
+
+ in MESSAGE with "somevalue" before displaying the message.
+
+
+ 4.6 work/*
+ ==========
+
+When you type "make" the distribution files are unpacked into this
+directory. It can be removed by typing
+
+ # make clean
+
+at the shell prompt. Also, this directory is used to keep various
+timestamp files.
+
+
+ 4.7 files/*
+ ===========
+
+If you have any files that you wish to be placed in the package prior
+to configuration or building, you could place these files here and use
+a ${CP} command in the pre-configure target to achieve this.
+Alternatively, you could simply diff the file against /dev/null and
+use the patch mechanism to manage the creation of this file.
+
+
+ 5 PLIST* issues
+ ===============
+
+This section addresses some special issues that one needs to pay attention
+to when dealing with the PLIST file (or files, see below!).
+
+
+ 5.1 Miscellaneous
+ =================
+
+ * NetBSD RCS Id:
+ Be sure to add a RCS ID line as the first thing in any PLIST file you
+ write:
+
+ @comment <$>NetBSD<$>
+
+ * ${MACHINE_ARCH}, ${MACHINE_GNU_ARCH}:
+ Some packages like emacs and perl embed information about which
+ architecture they were built on into the pathnames where they install
+ their file. To handle this case, PLIST will be preprocessed before
+ actually used, and the symbol "${MACHINE_ARCH}" will be replaced by
+ what "uname -p" gives. The same is done if the string ${MACHINE_GNU_ARCH}
+ is embedded in PLIST somewhere - use this on packages that have GNU
+ autoconf created configure scripts.
+
+ Legacy note: There used to be a symbol "<$ARCH>" that was replaced by
+ the output of "uname -m", but that's no longer supported and has been
+ removed.
+
+ * ${OPSYS}, ${LOWER_OPSYS}, ${OS_VERSION}:
+ Some packages want to embed the OS name and version into some paths.
+ To do this, use these variables in the PLIST:
+
+ * ${OPSYS} - output of "uname -s"
+ * ${LOWER_OPSYS} - lowercase common name (eg. "solaris")
+ * ${OS_VERSION} - "uname -r"
+
+ * ${PKGLOCALEDIR}:
+ Packages that install locale files should list them in the PLIST as
+ "${PKGLOCALEDIR}/locale/de/LC_MESSAGES/..." instead of
+ "share/locale/de/LC_MESSAGES/...". This properly handles the fact that
+ different OSes expect locale files to be either in "share" or "lib" by
+ default.
+
+ * Manpage-compression:
+ Manpages should be installed in compressed form if MANZ is set (in
+ bsd.own.mk), and uncompressed otherwise. To handle this in the PLIST
+ file, the suffix ".gz" is appended/removed automatically for manpages
+ according to MANZ and MANCOMPRESSED being set or not, see above for
+ details. This modification of the PLIST file is done on a copy of it,
+ not PLIST itself.
+
+ * Platform specific and differing PLISTs:
+ Some packages decide to install a different set of files based on
+ the operating system being used. These differences can be
+ automatically handled by using the following files:
+
+ * PLIST.common
+ * PLIST.${OPSYS}
+ * PLIST.common_end
+
+ If PLIST.${OPSYS} exists, these files are used instead of PLIST. This
+ allows packages which behave in this way to be handled gracefully.
+ Manually overriding PLIST_SRC for other more exotic uses is also
+ possible.
+
+ * Semi-automatic PLIST generation:
+ You can use the "make print-PLIST" command to output a PLIST that matches
+ any new files since the package was extracted. See below for more
+ information on this target.
+
+
+ 5.2 ${PLIST_SRC}
+ ================
+
+To use one or more files as source for the PLIST used in generating the
+binary package, set the variable PLIST_SRC to the names of that file(s).
+The files are later concatenated using cat(1), and order of things is
+important.
+
+ 5.3 ${PLIST_SUBST}
+ ==================
+
+Similar to MESSAGE_SUBST (see above), you can add variables and their
+expansions to this variable in the following way:
+
+ PLIST_SUBST+= SOMEVAR="somevalue"
+
+which replaces all occurrences of ${SOMEVAR} in the PLIST with "somevalue".
+For the values which are replaced by default, please look in bsd.pkg.mk
+(and search for PLIST_SUBST).
+
+ 5.4 Perl5 modules
+ =================
+
+Makefile of packages providing perl5 modules should include the
+makefile fragment lang/perl5/module.mk. It provides a do-configure
+target for the standard perl configuration for such modules as well
+as various hooks to tune this configuration. See comments in this
+file for details.
+
+Perl5 modules will install into different places depending on the version
+of perl used during the build process. To address this, the NetBSD
+packages system will append lines to the PLIST corresponding to the files
+listed in the installed .packlist file generated by most perl5 modules.
+This is invoked by defining PERL5_PACKLIST to a space-separated list of
+paths to packlist files:
+
+ PERL5_PACKLIST= ${PERL5_SITEARCH}/auto/Pg/.packlist
+
+The variables PERL5_SITELIB, PERL5_SITEARCH, and PERL5_ARCHLIB represent
+the three locations in which perl5 modules may be installed, and may be
+used by perl5 packages that don't have a packlist. These three variables
+are also substituted for in the PLIST.
+
+ 5.5 User Interaction
+ ====================
+
+Occasionally, packages require interaction from the user, and this can be
+in a number of ways:
+
++ help in fetching the distfiles
++ help to configure the package before it is built
++ help during the build process
++ help during the installation of a package
+
+The INTERACTIVE_STAGE definition is provided, to notify the pkgsrc mechanism
+of an interactive stage which will be needed, and this should be set in the
+package's Makefile. e.g.
+
+INTERACTIVE_STAGE= build
+
+Multiple interactive stages can be specified:
+
+INTERACTIVE_STAGE= configure install
+
+
+ 6 Notes on fixes for packages
+ =============================
+
+ 6.1 CPP defines
+ ===============
+
+To port an application to NetBSD, it's usually necessary for the compiler
+to be able to judge the system on which it's compiling, and we use
+definitions so that the C pre-processor can do this.
+
+To test whether you are working on a 4.4 BSD-derived system, you should use
+the BSD definition, which is defined in <sys/param.h> on said systems.
+
+ #include <sys/param.h>
+
+and then you can surround the BSD-specific parts of your port using the
+conditional:
+
+ #if (defined(BSD) && BSD >= 199306)
+ ...
+ #endif
+
+Please use the __NetBSD__ definition sparingly - it should only apply to
+features of NetBSD that are not present in other 4.4-lite derived BSDs.
+
+ 6.2 Shared libraries - libtool
+ ==============================
+
+Pkgsrc supports many different machines, with different object formats
+like a.out and ELF, and varying abilities to do shared library and
+dynamic loading at all. To accompany this, varying commands and options
+have to be passed to the compiler, linker etc. to get the Right Thing,
+which can be pretty annoying especially if you don't have all the
+machines at your hand to test things. The "libtool" pkg can help
+here, as it just "knows" how to build both static and dynamic
+libraries from a set of source files, thus being platform
+independent.
+
+Here's how to use libtool in a pkg in seven simple steps:
+
+1. Add USE_LIBTOOL= yes to the package Makefile.
+
+2. For library objects, use "${LIBTOOL} --mode=compile ${CC}" in place of
+ ${CC}. You could even add it to the definition of CC, if only
+ libraries are being built in a given Makefile. This one command will
+ build both PIC and non-PIC library objects, so you need not have
+ separate shared and non-shared library rules.
+
+3. For the linking of the library, remove any "ar", "ranlib", and "ld
+ -Bshareable" commands, and use instead:
+
+ ${LIBTOOL} --mode=link ${CC} -o ${.TARGET:.a=.la} ${OBJS:.o=.lo} -rpath ${PREFIX}/lib -version-info major:minor
+
+ Note that the library is changed to have a .la extension, and the
+ objects are changed to have a .lo extension. Change OBJS as necessary.
+ This automatically creates all of the .a, .so.major.minor, and ELF
+ symlinks (if necessary) in the build directory. Be sure to include
+ the -version-info especially when major and minor are zero, as libtool
+ will otherwise strip off the shared library version.
+
+ The "-release" option will produce different results for a.out and ELF
+ (excluding symlinks) in only one case. An ELF library of the form
+ libfoo-release.so.x.y will have a symlink of libfoo.so.x.y on an a.out
+ platform. This is handled automatically.
+
+ The -rpath argument is the install directory of the library being built.
+
+ PLIST should include all of the .a, .la and so, .so.major and
+ .so.major.minor entries.
+
+4. When linking shared object (.so) files, i.e. files that are loaded via
+ dlopen(3), NOT shared libraries, use "-module -avoid-version" to prevent
+ them getting version tacked on.
+
+ PLIST gets the foo.so entry.
+
+5. When linking programs that depend on these libraries _before_ they are
+ installed, preface the cc or ld line with "${LIBTOOL} --mode=link", and
+ it will find the correct libraries (static or shared), but please be
+ aware that libtool will not allow you to specify a relative path in -L
+ (such as -L../somelib), because it expects you to change that argument
+ to be the .la file. For example:
+
+ ${LIBTOOL} --mode=link ${CC} -o someprog -L../somelib -lsomelib
+
+ should be changed to:
+
+ ${LIBTOOL} --mode=link ${CC} -o someprog ../somelib/somelib.la
+
+ and it will DTRT with the libraries.
+
+6. When installing libraries, preface the install or cp command with
+ "${LIBTOOL} --mode=install", and change the library name to .la. For
+ example:
+
+ ${LIBTOOL} --mode=install ${BSD_INSTALL_DATA} ${SOMELIB:.a=.la} ${PREFIX}/lib
+
+ This will install the static .a, shared library, any needed symlinks,
+ and run "ldconfig."
+
+7. In your PLIST, include all of the .a, .la, and so, .so.major and
+ .so.major.minor files (this is a change from the previous behaviour).
+
+
+ 6.3 Using libtool on GNU packages that already support libtool
+ ==============================================================
+
+Add USE_LIBTOOL=yes and LIBTOOL_OVERRIDE=${WRKSRC}/libtool to the
+package Makefile as the quick way to bypass the pkg's own libtool.
+For older libtool using packages, libtool is made by ltconfig script
+during the do-configure step; you can check the libtool script
+location by doing "make configure; find work*/ -name libtool".
+
+If your package makes use of the platform independent library for loading
+dynamic shared objects, that comes with libtool (libltdl), you should
+include the libtool buildlink2.mk (and set USE_BUILDLINK2 to YES).
+
+Some packages use libtool incorrectly so that the package may not work or
+build in some circumstances. Some common errors are
+
+ * The inclusion of a shared object (-module) as a dependent library in an
+ executable or library. This in itself isn't a problem if one of two things
+ has been done.
+
+ 1. The shared object is named correctly, i.e. libfoo.la and not foo.la
+
+ 2. The -dlopen option is used when linking an executable.
+
+ * The use of libltdl without the correct calls to initialisation routines.
+ The function lt_dlinit() should be called and the macro
+ LTDL_SET_PRELOADED_SYMBOLS included in executables.
+
+
+ 6.4 GNU Autoconf/Automake
+ =========================
+
+If a package needs GNU autoconf or automake to be executed to regenerate
+the configure script and Makefile.in makefile templates, then they should
+be executed in a pre-configure target. Two makefile fragments are provided
+in pkgsrc/mk/autoconf.mk and pkgsrc/mk/automake.mk to help dealing with
+these tools. See comments in these files for details.
+
+For packages that need only autoconf:
+
+ AUTOCONF_REQD= 2.50 # if default version is not good enough
+ ...
+
+ pre-configure:
+ cd ${WRKSRC}; ${AUTOCONF}
+
+ ...
+ .include "../../mk/autoconf.mk"
+
+and for packages that need automake and autoconf:
+
+ AUTOMAKE_REQD= 1.7.1 # if default version is not good enough
+ ...
+
+ pre-configure:
+ cd ${WRKSRC}; \
+ ${ACLOCAL}; \
+ ${AUTOHEADER}; \
+ ${AUTOMAKE} -a --foreign -i; \
+ ${AUTOCONF}
+
+ ...
+ .include "../mk/automake.mk"
+
+There are times when the configure process makes additional changes to the
+generated files, which then causes the build process to try to re-execute
+the automake sequence. This is prevented by touching various files in
+the configure stage. If this causes problems with your package you can set
+AUTOMAKE_OVERRIDE to NO in the package Makefile.
+
+
+ 6.5 Package configuration files
+ ===============================
+
+Packages should be taught to look for their configuration files in
+${PKG_SYSCONFDIR}, which is passed through to the configure and build
+processes. PKG_SYSCONFDIR may be customized in various ways by setting
+other make variables:
+
+* PKG_SYSCONFBASE is the main config directory under which all package
+ configuration files are to be found. This defaults to ${PREFIX}/etc, but
+ may be overridden in /etc/mk.conf.
+
+* PKG_SYSCONFSUBDIR is the subdirectory of PKG_SYSCONFBASE under which the
+ configuration files for a particular package may be found, e.g. the
+ Apache configuration files may all be found under the "httpd" subdirectory
+ of ${PKG_SYSCONFBASE}. This is meant to be set in a package Makefile.
+
+* By default PKG_SYSCONFDIR=${PKG_SYSCONFBASE}/${PKG_SYSCONFSUBDIR}, but
+ the default may be overridden by setting PKG_SYSCONFDIR.${PKG_SYSCONFVAR}
+ for a particular package, where PKG_SYSCONFVAR defaults to ${PKGBASE}.
+ This is not meant to be set by a package Makefile, but is reserved for
+ users who wish to override the PKG_SYSCONFDIR setting for a particular
+ package with a special location.
+
+The only variables that users should customize are PKG_SYSCONFBASE and
+PKG_SYSCONFDIR.${PKG_SYSCONFVAR}. Users will typically want to set
+PKG_SYSCONFBASE to /etc, or to accept the default location of ${PREFIX}/etc.
+
+
+ 6.6 Feedback to the author
+ ==========================
+
+If you have found any bugs in the package you make available, if you had to
+do special steps to make it run under NetBSD or if you enhanced the software
+in various other ways, be sure to report these changes back to the original
+author of the program! With that kind of support, the next release of the
+program can incorporate these fixes, and people not using the NetBSD packages
+system can win from your efforts.
+
+Support the idea of free software!
+
+
+ 7 The build process
+ ===================
+
+The basic steps for building a program are always the same. First the
+program's source (distfile) must be brought to the local system and
+then extracted. After any patches to compile properly on NetBSD are
+applied, the software can be configured, then built (usually by
+compiling), and finally the generated binaries etc. can be put into
+place on the system. These are exactly the steps performed by the
+NetBSD package system, which is implemented as a series of targets in
+a central Makefile, pkgsrc/mk/bsd.pkg.mk.
+
+
+ 7.1 Program location
+ ====================
+
+Before outlining the process performed by the NetBSD package system in the
+next section, here's a brief discussion on where programs are installed,
+and which variables influence this.
+
+The automatic variable PREFIX indicates where all files of the final
+program shall be installed. It is usually set to $LOCALBASE (/usr/pkg),
+or $CROSSBASE for pkgs in the "cross" category, though its value becomes
+that of $X11BASE if USE_IMAKE or USE_X11BASE is set. The value ${PREFIX}
+needs to be put into the various places in the program's source where paths
+to these files are encoded; see sections 4.3 and 6.2 for details on this.
+
+When choosing which of these variables to use, follow the following rules:
+
+ * ${PREFIX} always points to the location where the current pkg will be
+ installed. When referring to a pkg's own installation path, use ${PREFIX}.
+
+ * ${LOCALBASE} is where all non-X11 pkgs are installed. If you need to
+ construct a -I or -L argument to the compiler to find includes and
+ libraries installed by another non-X11 pkg, use ${LOCALBASE}.
+
+ * ${X11BASE} is where the actual X11 distribution (from xsrc etc.) is installed.
+ When looking for _standard_ X11 includes (not those installed by a pkg), use
+ ${X11BASE}.
+
+ * X11 based pkgs are special in that they may be installed in either
+ X11BASE or LOCALBASE. To install X11 packages in LOCALBASE, simply
+ install the xpkgwedge package (pkgsrc/pkgtools/xpkgwedge).
+ If you need to find includes or libraries installed by a pkg that has
+ USE_IMAKE or USE_X11BASE in its pkg Makefile, you need to use _both_
+ ${X11BASE} and ${LOCALBASE}.
+
+ * ${X11PREFIX} should be used to refer to the installed location of an X11
+ package. X11PREFIX will be set to ${X11BASE} if xpkgwedge is not installed,
+ and to ${LOCALBASE} if xpkgwedge is installed.
+
+ * If xpkgwedge is installed, it is possible to have some packages installed in
+ X11BASE and some in LOCALBASE. To determine the prefix of an installed
+ package, the EVAL_PREFIX definition can be used. It takes pairs in the
+ format DIRNAME=<package>, and the make(1) variable DIRNAME will be set
+ to the prefix of the installed package <package>, or ${X11PREFIX} if the
+ package is not installed.
+
+ This is best illustrated by example.
+
+ The following lines are taken from pkgsrc/wm/scwm/Makefile:
+
+ EVAL_PREFIX+= GTKDIR=gtk+
+ CONFIGURE_ARGS+= --with-guile-prefix=${LOCALBASE} \
+ --with-gtk-prefix="${GTKDIR}" \
+ --enable-multibyte
+
+ Specific defaults can be defined for the packages evaluated using
+ EVAL_PREFIX, by using a definition of the form:
+
+ GTKDIR_DEFAULT= ${LOCALBASE}
+
+ where "GTKDIR" corresponds to the first definition in the EVAL_PREFIX pair.
+
+ 7.2 Main targets
+ ================
+
+The main targets used during the build process defined in bsd.pkg.mk are:
+
+ * fetch:
+ This will check if the file(s) given in the variables DISTFILES and
+ PATCHFILES (as defined in the package's Makefile) are present on the
+ local system in /usr/pkgsrc/distfiles. If they are not present, an
+ attempt will be made to fetch them using commands of the form
+
+ ${FETCH_CMD} ${FETCH_BEFORE_ARGS} ${site}${file} ${FETCH_AFTER_ARGS}
+
+ where ${site} varies through several possibilities in turn: first,
+ ${MASTER_SITE_OVERRIDE} is tried, then the sites specified in either
+ ${SITES_file}, if defined, else ${MASTER_SITES} or ${PATCH_SITES}, as
+ applies, then finally the value of ${MASTER_SITE_BACKUP}. The order of
+ all except the first can be optionally sorted by the user, via setting
+ either ${MASTER_SORT_AWK} or ${MASTER_SORT_REGEX}.
+
+ * checksum:
+ After the distfile(s) are fetched, their checksum is generated and
+ compared with the checksums stored in the distinfo file. If the
+ checksums don't match, the build is aborted. This is to ensure the same
+ distfile is used for building, and that the distfile wasn't changed,
+ e.g. by some malign force, deliberately changed distfiles on the master
+ distribution site or network lossage.
+
+ * extract:
+ When the distfiles are present on the local system, they need to be
+ extracted, as they are usually in the form of some compressed archive
+ format, most commonly .tar.gz. If only some of the distfiles need to be
+ uncompressed, the files to be uncompressed should be put into
+ EXTRACT_ONLY. If the distfiles are not in .tar.gz format, they can be
+ extracted by setting EXTRACT_CMD.
+
+ * patch:
+ After extraction, all the patches named by the PATCHFILES, those present
+ in the patches subdirectory of the package as well as in
+ $LOCALPATCHES/$PKGPATH (e.g. /usr/local/patches/graphics/png) are
+ applied. Patchfiles ending in .Z or .gz are uncompressed before they are
+ applied, files ending in .orig or .rej are ignored. Any special options
+ to patch(1) can be handed in PATCH_DIST_ARGS. See section 4.3 for more
+ details.
+
+ By default patch is given special args to make it fail if the
+ patches with some lines of fuzz. Please fix (regen) the patches
+ so that they apply cleanly. The rationale behind this is that
+ patches that apply cleanly may end up being applied in the wrong
+ place, and cause severe harm there.
+
+ * configure:
+ Most pieces of software need information on the header files,
+ system calls, and library routines which are available in NetBSD.
+ This is the process known as configuration, and is usually
+ automated. In most cases, a script is supplied with the source,
+ and its invocation results in generation of header files,
+ Makefiles, etc.
+
+ If the program's distfile contains its own configure script, this can
+ be invoked by setting HAS_CONFIGURE. If the configure script is a GNU
+ autoconf script, GNU_CONFIGURE should be specified instead. In either
+ case, any arguments to the configure script can be specified in the
+ CONFIGURE_ARGS variable, and the configure script's name can be set in
+ CONFIGURE_SCRIPT if it differs from the default "configure".
+
+ If the program uses an Imakefile for configuration, the appropriate
+ steps can be invoked by setting USE_IMAKE to YES. (If you only want the
+ package installed in $X11PREFIX but xmkmf not being run, set USE_X11BASE
+ instead!)
+
+ * build:
+ Once configuration has taken place, the software can be built on
+ NetBSD by invoking $MAKE_PROGRAM on $MAKEFILE with $ALL_TARGET as
+ the target to build. The default MAKE_PROGRAM is "gmake" if
+ USE_GMAKE is set, "make" otherwise. MAKEFILE is set to "Makefile"
+ by default, and ALL_TARGET defaults to "all". Any of these
+ variables can be set to change the default build process.
+
+ * install:
+ Once the build stage has completed, the final step is to install
+ the software in public directories, for users. As in the
+ build-target, $MAKE_PROGRAM is invoked on $MAKEFILE here, but with
+ the $INSTALL_TARGET instead, the latter defaulting to "install"
+ (plus "install.man", if USE_IMAKE is set).
+
+If no target is specified, the default is "build". If a subsequent stage
+is requested, all prior stages are made: e.g. "make build" will also
+perform the equivalent of:
+
+ make fetch
+ make checksum
+ make extract
+ make patch
+ make configure
+ make build
+
+
+ 7.3 Other helpful targets
+ =========================
+
+ * pre/post-*
+ For any of the main targets described in the previous section, two
+ auxiliary targets exist with "pre-" and "post-" used as a prefix
+ for the main target's name. These targets are invoked before and
+ after the main target is called, allowing extra configuration or
+ installation steps, for example, which program's configure script
+ or install target omitted.
+
+ * do-*:
+ Should one of the main targets do the wrong thing, and should there
+ be no variable to fix this, you can redefine it with the do-*
+ target. (Note that redefining the target itself instead of the
+ do-* target is a bad idea, as the pre-* and post-* targets won't be
+ called anymore, etc.) You will not usually need to do this.
+
+ * reinstall:
+ If you did a "make install" and you noticed some file was not installed
+ properly, you can repeat the installation with this target, which will
+ ignore the "already installed" flag.
+
+ * deinstall:
+ This target does a pkg_delete(1) in the current directory,
+ effectively de-installing the package. The following variables can
+ be used either on the command line or in /etc/mk.conf to tune the
+ behaviour:
+
+ - PKG_VERBOSE:
+ Add a "-v" to the pkg_delete(1) command.
+
+ - DEINSTALLDEPENDS:
+ Remove all packages that require (depend on) the given package.
+ This can be used to remove any packages that may have been pulled in
+ by a given package, e.g. if "make deinstall DEINSTALLDEPENDS=1" is
+ done in pkgsrc/x11/kde, this is likely to remove whole KDE. Works by
+ adding a "-R" to the pkg_delete command line.
+
+ * update:
+ This target causes the current package to be updated to the latest
+ version. The package and all depending packages first get de-installed,
+ then current versions of the corresponding packages get compiled and
+ installed. This is similar to manually noting which packages are
+ currently installed, then performing a series of "make deinstall" and
+ "make install" (or whatever UPDATE_TARGET is set to) for these packages.
+
+ You can use the "update" target to resume package updating in case a
+ previous "make update" was interrupted for some reason. However, in
+ this case, make sure you don't call "make clean" or otherwise remove
+ the list of dependent packages in ${WRKDIR}. Otherwise you lose the
+ ability to automatically update the current package along with the
+ dependent packages you have installed.
+
+ Resuming an interrupted "make update" will only work as long as the
+ package tree remains unchanged. If the source code for one of the
+ packages to be updated has been changed, resuming "make update" will
+ most certainly fail!
+
+ The following variables can be used either on the command line or in
+ /etc/mk.conf to alter the behaviour of "make update":
+
+ - UPDATE_TARGET:
+ Install target to recursively use for the updated package and the
+ dependent packages. Defaults to ${DEPENDS_TARGET} if set, "install"
+ otherwise for "make update".
+ E.g. "make update UPDATE_TARGET=package"
+
+ - NOCLEAN:
+ Don't clean up after updating. Useful if you want to leave the
+ work sources of the updated packages around for inspection or
+ other purposes. Be sure you eventually clean up the source
+ tree (see the "clean-update" target below) or you may run into
+ troubles with old source code still lying around on your next
+ "make" or "make update".
+
+ - REINSTALL:
+ Deinstall each package before installing (making ${DEPENDS_TARGET}).
+ This may be necessary if the "clean-update" target (see below) was
+ called after interrupting a running "make update".
+
+ - DEPENDS_TARGET:
+ Allows you to disable recursion and hardcode the target for
+ packages. The default is "update" for the update target,
+ facilitating a recursive update of prerequisite packages.
+ Only set DEPENDS_TARGET if you want to disable recursive updates.
+ Use "UPDATE_TARGET" instead to just set a specific target for
+ each package to be installed during "make update" (see above).
+
+ * clean-update:
+ Clean the source tree for all packages that would get updated if
+ "make update" was called from the current directory. This target
+ should not be used if the current package (or any of its depending
+ packages) have already been de-installed (e.g., after calling "make
+ update") or you may lose some packages you intended to update.
+ As a rule of thumb: only use this target _before_ the first time
+ you call "make update" and only if you have a dirty package tree
+ (e.g., if you used NOCLEAN).
+
+ If you unsure about whether your tree is clean you can either perform
+ a "make clean" at the top of the tree, or use the following sequence
+ of commands from the directory of the package you want to update
+ (*before* running "make update" for the first time, otherwise you lose
+ all the packages you wanted to update!):
+
+ make clean-update
+ make clean CLEANDEPENDS=YES
+ make update
+
+ The following variables can be used either on the command line or in
+ /etc/mk.conf to alter the behaviour of "make clean-update":
+
+ - CLEAR_DIRLIST:
+ After "make clean", do not reconstruct the list of directories to
+ update for this package. Only use this if "make update" successfully
+ installed all packages you wanted to update. Normally, this is done
+ automatically on "make update", but may have been suppressed by the
+ NOCLEAN variable (see above).
+
+ * info:
+ This target invokes "pkg_info" for the current package. You can use this
+ e.g. to check which version of a package is installed.
+
+ * readme:
+ This target generates a README.html file, which can be viewed using a
+ browser such as navigator (pkgsrc/www/navigator) or lynx
+ (pkgsrc/www/lynx). The generated files contain references to any
+ packages which are in the ${PACKAGES} directory on the local host. The
+ generated files can be made to refer to URLs based on FTP_PKG_URL_HOST
+ and FTP_PKG_URL_DIR. For example, if I wanted to generate README.html
+ files which pointed to binary packages on the local machine, in the
+ directory /usr/packages, set FTP_PKG_URL_HOST=file://localhost and
+ FTP_PKG_URL_DIR=/usr/packages. The ${PACKAGES} directory and its
+ subdirectories will be searched for all the binary packages.
+
+ * readme-all:
+ Use this target to create a file README-all.html which contains a
+ list of all packages currently available in the NetBSD Packages
+ Collection, together with the category they belong to and a short
+ description. This file is compiled from the pkgsrc/*/README.html
+ files, so be sure to run this _after_ a "make readme".
+
+ * cdrom-readme:
+ This is very much the same as the readme: target (see above), but is
+ to be used when generating a pkgsrc tree to be written to a CD-ROM.
+ This target also produces README.html files, and can be made to refer
+ to URLs based on CDROM_PKG_URL_HOST and CDROM_PKG_URL_DIR.
+
+ * show-distfiles:
+ This target shows which distfiles and patchfiles are needed to build
+ the package. (DISTFILES and PATCHFILES, but not patches/*)
+
+ * show-downlevel:
+ This target shows nothing if the package is not installed. If a version
+ of this package is installed, but is not the version provided in this
+ version of pkgsrc, then a warning message is displayed. This target can
+ be used to show which of your installed packages are downlevel, and so
+ the old versions can be deleted, and the current ones added.
+
+ * show-pkgsrc-dir:
+ This target shows the directory in the pkgsrc hierarchy from which the
+ package can be built and installed. This may not be the same directory
+ as the one from which the package was installed. This target is intended
+ to be used by people who may wish to upgrade many packages on a single
+ host, and can be invoked from the top-level pkgsrc Makefile by using the
+ target "show-host-specific-pkgs"
+
+ * show-installed-depends:
+ This target shows which installed packages match the current package's
+ DEPENDS. Useful if out of date DEPENDS are causing build problems.
+
+ * check-shlibs:
+ After a package is installed, check all its binaries and (on ELF
+ platforms) shared libraries to see if they find the shared libs they need.
+ Run by default if PKG_DEVELOPER is set in /etc/mk.conf.
+
+ * print-PLIST:
+ After a 'make install' from a new or upgraded pkg, this prints out an
+ attempt to generate a new PLIST from a 'find -newer work/.extract_done'.
+ An attempt is made to care for shared libs etc., but it is STRONGLY
+ recommended to review the result before putting it into PLIST. On
+ upgrades, it's useful to diff the output of this command against an already
+ existing PLIST file.
+
+ If the package installs files via tar(1) or other methods that don't update
+ file access times, be sure to add these files manually to your PLIST,
+ as 'find -newer' won't catch them!
+
+ * bulk-package:
+ Used to do bulk builds. If an appropriate binary package already exists,
+ no action is taken. If not, this target will compile, install and
+ package it (and it's depends, if PKG_DEPENDS is set properly, see
+ section 3.2.1). After creating the binary package, the sources, the
+ just-installed package and it's required packages are removed,
+ preserving free disk space.
+
+ * bulk-install:
+ Used during bulk-installs to install required packages. If an
+ appropriate binary package is available, it will be installed via
+ pkg_add. If not, "make bulk-package" will be executed, but the installed
+ binary not be removed. A binary package is "appropriate" to be installed
+ via pkg_add if:
+
+ - None of the package's files (Makefile, ...) were modified since it
+ was built
+ - None of the package's required (binary) packages were modified since
+ it was built
+
+
+ 8 buildlink2 methodology
+ ========================
+
+"buildlink2" is a pkgsrc framework that controls what headers and libraries
+are seen by a package's configure and build processes. This is implemented
+in a two step process:
+
+ (1) Symlink headers and libraries for dependencies into ${BUILDLINK_DIR},
+ which by default is a subdirectory of ${WRKDIR};
+
+ (2) Create wrapper scripts that are used in place of the normal compiler
+ tools that translate -I${LOCALBASE}/include and -L${LOCALBASE}/lib
+ into references into ${BUILDLINK_DIR}.
+
+This normalizes the environment in which a package is built so that the
+package may be built consistently despite what may other software may
+installed. Please refer to pkgsrc/mk/buildlink2/buildlink2.txt for some
+FAQs and answers regarding buildlink2, and to pkgsrc/mk/buildlink2/README
+for a description of how buildlink2 is implemented in pkgsrc.
+
+
+ 8.1 Converting packages to use buildlink2
+ =========================================
+
+The process of converting packages to use the buildlink2 framework is
+fairly straightforward. The package Makefile must define USE_BUILDLINK2.
+If a dependency on a particular package, e.g. foo, is required for its
+libraries and headers, then we replace:
+
+ DEPENDS+= foo>=1.1.0:../../category/foo
+with
+ .include "../../category/foo/buildlink2.mk"
+
+There are several buildlink2.mk files in pkgsrc/mk that handle special
+package issues:
+
+ * motif.buildlink2.mk checks for a system-provided Motif installation
+ or adds a dependency on x11/lesstif or x11/openmotif;
+
+ * ossaudio.buildlink2.mk defines several variables that may be used by
+ packages that use the Open Sound System (OSS) API;
+
+ * pthread.buildlink2.mk uses the value of PTHREAD_OPTS and checks for
+ native pthreads or adds a dependency on devel/pth as needed;
+
+ * xaw.buildlink2.mk uses the value of XAW_TYPE to choose a particular
+ Athena widgets library.
+
+The comments in those buildlink2.mk files provide a more complete
+description of how to use them properly.
+
+
+ 8.2 Writing buildlink2.mk files
+ ===============================
+
+A simple example of a buildlink2.mk file for a mythical package foo
+follows:
+
+ BUILDLINK_PACKAGES+= foo
+ BUILDLINK_PKGBASE.foo= foo
+ BUILDLINK_DEPENDS.foo?= foo>=1.0
+ BUILDLINK_PKGSRCDIR.foo?= ../../category/foo
+
+ EVAL_PREFIX+= BUILDLINK_PREFIX.foo=foo
+ BUILDLINK_PREFIX.foo_DEFAULT= ${LOCALBASE}
+ BUILDLINK_FILES.foo= include/foo.h
+ BUILDLINK_FILES.foo+= include/bar.h
+ BUILDLINK_FILES.foo+= lib/libfoo.*
+
+ BUILDLINK_TARGETS+= foo-buildlink
+
+ foo-buildlink: _BUILDLINK_USE
+
+The first section controls how the dependency on foo is added. The
+dependency is constructed from four parts:
+
+ (1) BUILDLINK_PACKAGES is the global list of packages for which
+ dependencies will be added by buildlink2;
+
+ (2) BUILDLINK_DEPENDS.foo is the actual dependency recorded in the
+ installed package;
+
+ (3) BUILDLINK_PKGSRCDIR.foo is the location of the foo pkgsrc
+ directory;
+
+ (4) BUILDLINK_DEPMETHOD.foo (not shown above) controls whether we use
+ BUILD_DEPENDS or DEPENDS to add the foo dependency, where the
+ full dependency is added if BUILDLINK_DEPMETHOD.foo contains "full".
+
+The second section controls which files are linked into ${BUILDLINK_DIR}:
+
+ (1) BUILDLINK_PREFIX.foo is the installation prefix of the package which
+ we derive by using EVAL_PREFIX;
+
+ (2) BUILDLINK_FILES.foo is a list of files (shell globs allowed) relative
+ to the BUILDLINK_PREFIX.foo directory and will be symlinked into
+ ${BUILDLINK_DIR};
+
+ (3) BUILDLINK_FILES_CMD.foo (not shown above) is a shell pipeline that
+ outputs a list of files relative to the BUILDLINK_PREFIX.foo
+ directory and will be symlinked into ${BUILDLINK_DIR}.
+
+The remaining parts create the foo-buildlink target that actually performs
+the symlinking and adds the foo-buildlink target to BUILDLINK_TARGETS,
+which is the global list of targets to execute at do-buildlink time.
+
+
+ 9 Debugging
+ ===========
+
+To check out all the gotchas when building a package, here are the steps
+that I do in order to get a package working. Please note this is basically
+the same as what was explained in the previous sections, only with some
+debugging aids.
+
+ * Make sure PKG_DEVELOPER=1 is in /etc/mk.conf
+ * Create a new directory, and run
+
+ # url2pkg http://www.example.com/path/to/distfile.tar.gz
+
+ You'll need to have pkgsrc/pkgtools/url2pkg installed for that.
+ * Edit the Makefile as requested.
+ * Fill in DESCR
+ * ``make configure''
+ * Add any dependencies glimpsed from the configure step to the package's
+ Makefile.
+ * Make the package compile, doing multiple rounds of
+
+ # make
+ # pkgvi ${WRKSRC}/some/file/that/does/not/compile
+ # mkpatches
+ # patchdiff
+ # mv ${WRKDIR}/.newpatches/* patches
+ # make mps
+ # make clean
+ [ mkpatches, patchdiff and pkgvi are from pkgsrc/pkgtools/pkgdiff ]
+
+ Doing as non-root user will assure that no files are modified that
+ shouldn't, esp. not during the build phase.
+ * Look at Makefile, fix if necessary; see section 4.1.
+ * Generate a PLIST:
+
+ # make install
+ # make print-PLIST > PLIST
+ # make deinstall
+ # make install
+ # make deinstall
+
+ You usually need to be root to do this.
+ * Look if there are any files left:
+
+ # make print-PLIST
+
+ If this brings up any files that are missing in PLIST, add them.
+ * Now that the PLIST is ok, install the package again and make a binary
+ package:
+
+ # make reinstall && make package
+
+ * Delete the installed package:
+
+ # pkg_delete blub
+
+ * Repeat the above find command, which shouldn't find anything now:
+
+ # make print-PLIST
+
+ * Reinstall the binary package:
+
+ # pkg_add ..../blub.tgz
+
+ * Play with it. Make sure everything works.
+ * Run pkglint from pkgsrc/pkgtools/pkglint, and fix the problems it reports.
+
+ # pkglint
+
+ * Submit (or commit, if you have cvs access); see section 11.
+
+
+ 10 FAQs & features of the package system
+ ========================================
+
+ 10.1 Packages using GNU autoconf
+ ================================
+
+If your package uses GNU autoconf created configure scripts, add the following
+to your package's Makefile:
+
+ GNU_CONFIGURE= yes
+
+Note that this appends --prefix=${PREFIX} to CONFIGURE_ARGS, so you don't
+have to do that yourself, and this may not be what you want.
+
+
+ 10.2 Other distrib methods than .tar.gz
+ =======================================
+
+If your package uses a different distribution method from .tar.gz, take a
+look at the package for pkgsrc/editors/sam, which uses a gzipped shell archive
+(shar), but the quick solution is to set EXTRACT_SUFX to the name after the
+DISTNAME field, and add the following to your package's Makefile:
+
+ EXTRACT_SUFX= .msg.gz
+ EXTRACT_CMD= zcat
+
+
+ 10.3 Packages not creating their own subdirectory
+ =================================================
+
+Your package doesn't create a subdirectory for itself (like GNU software
+does, for instance), but extracts itself in the current directory: see
+pkgsrc/editors/sam again, but the quick answer is:
+
+ WRKSRC= ${WRKDIR}
+
+Please note that the old
+
+ NO_WRKSUBDIR= yes
+
+has been deprecated and should not be used.
+
+
+ 10.4 Custom configuration process
+ =================================
+
+Your package uses a weird Configure script: See the top package, but the
+quick answer is:
+
+ HAS_CONFIGURE= yes
+ CONFIGURE_SCRIPT= Configure
+ CONFIGURE_ARGS+= netbsd13
+
+
+ 10.5 Packages not building in their DISTNAME directory
+ ======================================================
+
+Your package builds in a different directory from its base DISTNAME - see
+tcl and tk packages:
+
+ WRKSRC= ${WRKDIR}/${DISTNAME}/unix
+
+
+ 10.6 How to fetch all distfiles at once
+ =======================================
+
+You would like to download all the distfiles in a single batch from work or
+university, where you can't run a "make fetch". But there's no archive of
+the distfiles on ftp.netbsd.org and the one on ftp.freebsd.org contains
+many distfiles for which there are no ports (yet).
+
+The answer here is to do a "make fetch-list" in /usr/pkgsrc, carry the
+resulting list to your machine at work/school and use it there. If you don't
+have a NetBSD-compatible ftp(1) (like lukemftp) at work, don't forget to
+set FETCH_CMD to something that fetches an URL:
+
+At home:
+
+ % cd /usr/pkgsrc
+ % make fetch-list FETCH_CMD=wget DISTDIR=/tmp/distfiles >/tmp/fetch.sh
+ % scp /tmp/fetch.sh work:/tmp
+
+At work:
+
+ % sh /tmp/fetch.sh
+ % tar up /tmp/distfiles and take it home
+
+If you have a machine running NetBSD, and you want to get *all* distfiles
+(even ones that aren't for your machine architecture), you can do so by
+using the above-mentioned 'make fetch-list'-approach, or fetch the distfiles
+directly by typing:
+
+ % make mirror-distfiles
+
+If you even decide to ignore NO_{SRC,BIN}_ON_{FTP,CDROM}, then you can
+get all & everything by typing
+
+ % make fetch NO_SKIP=yes
+
+
+ 10.7 How to fetch files from behind a firewall
+ ==============================================
+
+If you are sitting behind a firewall which does not allow direct connections
+to Internet hosts (i.e. non-NAT), you may specify the relevant proxy hosts.
+This is done using an environment variable in the form of a URL
+e.g. in Amdahl, the machine orpheus.amdahl.com is one of the firewalls, and
+it uses port 80 as the proxy port number. So the proxy environment
+variables look like:
+
+ ftp_proxy=ftp://orpheus.amdahl.com:80/
+ http_proxy=http://orpheus.amdahl.com:80/
+
+
+ 10.8 If your patch contains an RCS ID
+ =====================================
+
+See section 4.3 on how to remove RCS IDs from patch files.
+
+
+ 10.9 How to pull in variables from /etc/mk.conf
+ ===============================================
+
+The problem with package-defined variables that can be overridden via
+MAKECONF or /etc/mk.conf is that make(1) expands a variable as it is
+used, but evaluates preprocessor like statements (.if, .ifdef and
+.ifndef) as they are read. So, to use any variable (which may be set
+in /etc/mk.conf) in one of the .if* statements, the file /etc/mk.conf
+must be included before that .if* statement.
+
+Rather than have a number of ad-hoc ways of including /etc/mk.conf,
+should it exist, or MAKECONF, should it exist, include the
+pkgsrc/mk/bsd.prefs.mk file in the package Makefile before any
+preprocessor-like .if, .ifdef, or .ifndef statements:
+
+ .include "../../mk/bsd.prefs.mk"
+
+ .if defined(USE_MENUS)
+ ...
+ .endif
+
+If you wish to set the CFLAGS variable in /etc/mk.conf please make sure
+to use:
+
+ CFLAGS+= -your -flags
+
+Using 'CFLAGS=' (ie without the '+') may lead to problems with packages
+that need to add their own flags. Also, you may want to take a look at
+the devel/cpuflags package, if you're interested in optimization for the
+current CPU.
+
+
+ 10.10 Is there a mailing list for pkg-related discussion?
+ =========================================================
+
+Yes. We are using tech-pkg@netbsd.org for discussing package related
+issues. To subscribe do:
+
+ % echo subscribe tech-pkg | mail majordomo@netbsd.org
+
+
+ 10.11 How do i tell "make fetch" to do passive FTP?
+ ===================================================
+
+This depends on which utility is used to retrieve distfiles. From
+bsd.pkg.mk, FETCH_CMD is assigned the first available command from the
+following list:
+
+ /usr/bin/fetch
+ ${LOCALBASE}/bsd/bin/ftp
+ /usr/bin/ftp
+
+On a default NetBSD install, this will be /usr/bin/ftp, which automatically
+tries passive connections first, and falls back to active connections if the
+server refuses to do passive. For the other tools, add the following to your
+/etc/mk.conf file: PASSIVE_FETCH=1
+
+Having that option present will prevent /usr/bin/ftp from falling back to
+active transfers.
+
+
+ 10.12 Dependencies on other packages
+ ====================================
+
+Your package may depend on some other package being present - and there are
+various ways of expressing this dependency. NetBSD supports the
+BUILD_DEPENDS and DEPENDS definitions, as well as dependencies via
+buildlink2.mk (see section 8).
+
+The basic difference between the two definitions is as follows: The
+DEPENDS definition registers that pre-requisite in the binary package,
+whilst the BUILD_DEPENDS definition does not.
+
+This means that if you only need a package present whilst you are building,
+it should be noted as a BUILD_DEPENDS.
+
+The format for a BUILD_DEPENDS and a DEPENDS definition is:
+
+ <pre-req-package-name>:../../<category>/<pre-req-package>
+
+Please note that the "pre-req-package-name" may include any of the wildcard
+version numbers recognised by pkg_info(1).
+
+(a) If your package needs to use another package to build itself, this
+is specified using the BUILD_DEPENDS definition.
+
+ BUILD_DEPENDS+= autoconf-2.13:../../devel/autoconf
+
+(b) If your package needs a library with which to link, this is specified
+using the DEPENDS definition. An example of this is the pkgsrc/print/lyx
+package, which uses the xpm library, version 3.4j to build.
+
+ DEPENDS+= xpm-3.4j:../../graphics/xpm
+
+You can also use wildcards in package dependences:
+
+ DEPENDS+= xpm-[0-9]*:../../graphics/xpm
+
+Note that such wildcard dependencies are retained when creating binary
+packages. The dependency is checked when installing the binary
+package and any package which matches the pattern will be used.
+Wildcard dependencies should be used with care.
+
+The -[0-9]* should be used instead of -* to avoid potentially
+ambiguous matches such as tk-postgresql matching a tk-* DEPEND.
+
+(c) If your package needs some executable to be able to run correctly, this
+is specified using the DEPENDS definition. The pkgsrc/print/lyx package needs
+to be able to execute the latex binary from the teTeX package when it runs,
+and that is specified:
+
+ DEPENDS+= teTeX-[0-9]*:../../print/teTeX
+
+The comment about wildcard dependencies from previous paragraph
+applies here, too.
+
+If your package needs files from another package to build, see the
+first part of the "do-configure" target pkgsrc/print/ghostscript5 package
+(it relies on the jpeg sources being present in source form during the
+build):
+
+ if [ ! -e ${_PKGSRCDIR}/graphics/jpeg/${WRKDIR:T}/jpeg-6b ]; then \
+ cd ${_PKGSRCDIR}/../../graphics/jpeg && ${MAKE} extract; \
+ fi
+
+If you build any other packages that way, please make sure the working
+files are deleted too when this package's working files are cleaned up.
+The easiest way to do so is by adding a pre-clean target:
+
+ pre-clean:
+ cd ${_PKGSRCDIR}/../../graphics/jpeg && ${MAKE} clean
+
+Please also note the BUILD_USES_MSGFMT and BUILD_USES_GETTEXT_M4 definitions,
+which are provided as convenience definitions. The former works out whether
+msgfmt(1) is part of the base system, and, if it isn't, installs the
+pkgsrc/devel/gettext package. The latter adds a build dependency on either an
+installed version of an older gettext package, or if it isn't, installs the
+pkgsrc/devel/gettext-m4 package.
+
+
+ 10.13 Conflicts with other packages
+ ===================================
+
+Your package may conflict with other packages a user might already have
+installed on his system, e.g. if your package installs the same set of
+files like another package in our pkgsrc tree.
+
+In this case you can set CONFLICTS to a space separated list of packages
+(including version string) your package conflicts with.
+
+For example pkgsrc/x11/Xaw3d and pkgsrc/x11/Xaw-Xpm install provide the
+same shared library, thus you set in pkgsrc/x11/Xaw3d/Makefile:
+
+ CONFLICTS= Xaw-Xpm-[0-9]*
+
+and in pkgsrc/x11/Xaw-Xpm/Makefile:
+
+ CONFLICTS= Xaw3d-[0-9]*
+
+Packages will automatically conflict with other packages with the name prefix
+and a different version string. "Xaw3d-1.5" e.g. will automatically conflict
+with the older version "Xaw3d-1.3".
+
+
+ 10.14 Software which has a WWW Home Page
+ ========================================
+
+The NetBSD packages system now supports a variable called HOMEPAGE.
+If the software being packaged has a home page, the Makefile should
+include the URL for that page in the HOMEPAGE variable. The definition
+of the variable should be placed immediately after the MAINTAINER
+variable.
+
+
+ 10.15 How to handle modified distfiles with the 'old' name
+ ==========================================================
+
+Sometimes authors of a software package make some modifications after the
+software was released, and they put up a new distfile without changing the
+package's version number. If a package is already in pkgsrc at that time,
+the md5 checksum will no longer match. The correct way to work around this
+is to update the package's md5 checksum to match the package on the master
+site (beware, any mirrors may not be up to date yet!), and to remove the
+old distfile from ftp.netbsd.org's /pub/NetBSD/packages/distfiles directory.
+Furthermore, a mail to the package's author seems appropriate making sure
+the distfile was really updated on purpose, and that no trojan horse or so
+crept in.
+
+
+ 10.16 What does "Don't know how to make /usr/share/tmac/tmac.andoc" mean?
+ =========================================================================
+
+When compiling the pkgsrc/pkgtools/pkg_install package, you get the error
+from make that it doesn't know how to make /usr/share/tmac/tmac.andoc? This
+indicates that you don't have installed the "text" set on your machine
+(nroff, ...). It is recommended to do that.
+
+In the case of the pkg_install package, you can get away with setting
+NOMAN=YES either in the environment or in /etc/mk.conf.
+
+
+ 10.17 How to handle incrementing versions when fixing an existing package
+ =========================================================================
+
+When making fixes to an existing package it can be useful to change
+the version number in PKGNAME. To avoid conflicting with future versions
+by the original author, a 'nb1' ('nb2', ...) suffix can be used on package
+versions by setting PKGREVISION=1 (2,. ..). The "nb" is treated like a "."
+by the pkg tools. E.g.
+
+DISTNAME= foo-17.42
+PKGREVISION= 9
+
+will result in a PKGNAME of foo-17.42nb9.
+
+When a new release of the package is released, the PKGREVISION should be
+removed. E.g. on a new minor release of the above package, things should
+be like:
+
+DISTNAME= foo-17.43
+
+
+ 10.18 "Could not find bsd.own.mk" - what's wrong?
+ =================================================
+
+You didn't install the compiler set, comp.tgz, when you installed your
+NetBSD machine. Please get it and install it, by extracting it in /:
+
+ # tar --unlink -pvxf .../comp.tgz
+
+comp.tgz is part of every NetBSD release, please get the one matching
+the release you have installed (determine via "uname -r").
+
+
+ 10.19 Restricted packages
+ =========================
+
+Some licenses restrict how software may be re-distributed. In order to
+satisfy these restrictions, the package system defines five make variables
+that can be set to note these restrictions:
+
+ * RESTRICTED:
+ This variable should be set whenever a restriction exists
+ (regardless of its kind). Set this variable to a string
+ containing the reason for the restriction.
+
+ * NO_BIN_ON_CDROM:
+ Binaries may not be placed on CD-ROM. Set this variable to
+ ${RESTRICTED} whenever a binary package may not be included
+ on a CD-ROM.
+
+ * NO_BIN_ON_FTP:
+ Binaries may not be placed on an ftp server. Set this
+ variable to ${RESTRICTED} whenever a binary package may not
+ not be made available on the Internet.
+
+ * NO_SRC_ON_CDROM:
+ Distfiles may not be placed on CD-ROM. Set this variable to
+ ${RESTRICTED} if re-distribution of the source code or other
+ distfile(s) is not allowed on CD-ROMs.
+
+ * NO_SRC_ON_FTP:
+ Distfiles may not be placed on FTP. Set this variable to
+ ${RESTRICTED} if re-distribution of the source code or other
+ distfile(s) via the Internet is not allowed.
+
+Please note that the use of NO_PACKAGE, IGNORE, NO_CDROM, or other generic
+make variables to denote restrictions is deprecated, because they
+unconditionally prevent users from generating binary packages!
+
+
+ 10.20 Packages using (n)curses
+ ==============================
+
+Some packages need curses functionality that wasn't present in NetBSD's own
+curses prior to 1.4Y.
+
+If ../../devel/ncurses/buildlink2.mk is included in a package's Makefile,
+then a curses library and headers with ncurses functionality are linked
+into ${BUILDLINK_DIR} at pre-configure time. If ncurses is actually
+required, then define USE_NCURSES in the package's Makefile:
+ USE_NCURSES= # redrawwin
+The comment should indicate which functions are missing.
+
+
+ 10.21 Automated security check
+ ==============================
+
+Please be aware that there can often be bugs in third-party software,
+and some of these bugs can leave a machine vulnerable to exploitation
+by attackers. In an effort to lessen the exposure, the NetBSD
+packages team maintains a database of known-exploits to packages which
+have at one time been included in pkgsrc. The database can be
+downloaded automatically, and a security audit of all packages
+installed on a system can take place. To do this, install the
+pkgsrc/security/audit-packages package. It has two components:
+
+ (1) download-vulnerability-list, an easy way to download a list of the
+ security vulnerabilities information. This list is kept up to date by
+ the NetBSD security officer and the NetBSD packages team, and is
+ distributed from the NetBSD ftp server:
+
+ ftp://ftp.netbsd.org/pub/NetBSD/packages/distfiles/vulnerabilities
+
+ (2) audit-packages, an easy way to audit the current machine, checking
+ each vulnerability which is known. If a vulnerable package is
+ installed, it will be shown by output to stdout, including a
+ description of the type of vulnerability, and a URL containing more
+ information.
+
+Use of the audit-packages package is strongly recommended.
+
+The following message is displayed as part of the audit-packages
+installation procedure:
+
+ ======================================================================
+ You may wish to have the vulnerabilities file downloaded daily so that
+ it remains current. This may be done by adding an appropriate entry
+ to the root users crontab(5) entry. For example the entry
+
+ # download vulnerabilities file
+ 0 3 * * * ${PREFIX}/sbin/download-vulnerability-list >/dev/null 2>&1
+
+ will update the vulnerability list every day at 3AM.
+
+ In addition, you may wish to run the package audit from the daily
+ security script. This may be accomplished by adding the following
+ lines to /etc/security.local
+
+ if [ -x ${PREFIX}/sbin/audit-packages ]; then
+ ${PREFIX}/sbin/audit-packages
+ fi
+ ======================================================================
+
+
+Note to package developers: When a vulnerability is found, this should be
+noted in localsrc/security/advisories/pkg-vulnerabilities, and after the
+commit of that file, it should be copied to
+/pub/NetBSD/packages/distfiles/vulnerabilities on ftp.netbsd.org.
+
+
+ 10.22 What's the proper way to create an account from a package?
+ ================================================================
+
+There are two make variables used to control the creation of package-specific
+groups and users at pre-install time. The first is PKG_GROUPS, which is a
+list of group[:groupid] elements, where the groupid is optional. The second
+is PKG_USERS, which is a list of elements of the form:
+
+ user:group[:[userid][:[description][:[home][:shell]]]]
+
+where only the user and group are required, the rest being optional. A
+simple example is:
+
+ PKG_GROUPS= foogroup
+ PKG_USERS= foouser:foogroup
+
+A more complex example is that creates two groups and two users is:
+
+ PKG_GROUPS= group1 group2:1005
+ PKG_USERS= first:group1::First\\ User \
+ second:group2::Second\\ User:/home/second:${SH}
+
+By default, a new user will have home directory /nonexistent, and login shell
+/sbin/nologin unless they are specified as part of the user element.
+
+The package Makefile must also set USE_PKGINSTALL to "YES" prior to the
+inclusion of bsd.pkg.mk. This will cause the users and groups to be created
+at pre-install time, and the admin will be prompted to remove them at
+post-deinstall time. Automatic creation of the users and groups can be
+toggled on and off by setting the environment variable PKG_CREATE_USERGROUP
+prior to package installation.
+
+
+ 10.23 How to handle compiler bugs
+ =================================
+
+Some source files trigger bugs in the compiler, based on combinations
+of compiler version and architecture and almost always relation to
+optimisation being enabled. Common symptoms are gcc internal errors
+or never finishing compiling a file.
+
+Typically a workaround involves testing the MACHINE_ARCH and compiler
+version, disabling optimisation for that file/MACHINE_ARCH/compiler
+combination, and documenting it in doc/HACKS. See doc/HACKS for
+examples.
+
+
+ 10.24 Packages providing info files
+ ===================================
+
+Some packages install info files or use the makeinfo or install-info
+commands. Each info files:
+ - is considered to be installed in the directory
+ ${PREFIX}/${INFO_DIR};
+ - is registered in the Info directory file
+ ${PREFIX}/${INFO_DIR}/dir;
+ - and must be listed as a filename in the INFO_FILES variable
+ in the package Makefile.
+
+INFO_DIR defaults to `info' and can be overridden in the package Makefile.
+INSTALL and DEINSTALL scripts will be generated for handling registration
+of the info files in the Info directory file.
+The command install-info used for the info files registration is either
+provided by the system or by a special purpose package automatically
+added as dependency if needed.
+
+A package which need the makeinfo command at build time must define
+the variable USE_MAKEINFO in its Makefile. If a minimum version of the
+makeinfo command is needed it should be noted with the TEXINFO_REQD variable
+in the package Makefile. By default a minimum version of 3.12 is required.
+If the system does not provide a makeinfo command or if it does not match
+the required minimum a build dependency on the devel/gtexinfo package is
+added.
+
+The installation process of the software provided by the package must not
+use the install-info as the registration of info files
+is the task of the package INSTALL SCRIPT, and it must use
+the right makeinfo command.
+
+If the package use buildlink2 framework no special action should be needed
+to achieve this goal.
+
+If the package does not use the buildlink2 framework patch files are likely
+to be needed so the build and installation process of the software
+picks up the -possibly dummys- values of INSTALL_INFO and MAKEINFO in the
+environment.
+
+*NOTE* Temporally the variable USE_NEW_TEXINFO must be defined in the
+package Makefile. Previously info files, install-info and makeinfo
+were handled somewhat differently and the two ways will coexist for
+a short period of time until all older packages are updated.
+
+ 10.25 Packages whose distfiles aren't available for plain downloading
+ =====================================================================
+
+If you need to download from a dynamic URL you can set DYNAMIC_MASTER_SITES
+and a 'make fetch' will call files/getsite.sh with the name of each file
+to download as an argument, expecting it to output the URL of the directory
+from which to download it. graphics/ns-cult3d is an example of this usage.
+
+If the download can't be automated, because the user must submit personal
+information to apply for a password, or must pay for the source, or whatever,
+you can set _FETCH_MESSAGE to a macro which displays a message explaining
+the situation. _FETCH_MESSAGE must be executable shell commands, not just a
+message. (Generally, it executes ${ECHO}). As of this writing, the following
+packages use this: audio/realplayer, cad/simian, devel/ipv6socket,
+emulators/vmare-module, fonts/acroread-jpnfont, sysutils/storage-manager,
+www/ap-aolserver, www/openacs. Try to be consistent with them.
+
+
+ 10.26 Using pkgsrc on non-NetBSD (Darwin, FreeBSD, IRIX, Linux, OpenBSD, Solaris)
+ =================================================================================
+
+In order to use pkgsrc on a non-NetBSD operating system, you must first
+bootstrap the necessary utilities (BSD make, pkg_*, ...). See
+http://www.netbsd.org/Documentation/software/packages.html#bootstrap
+for information on boostrapping. Binary bootstrap-kits are available from that
+URL as well. If your Operating System is not yet supported, we encourage you to
+port the bootstrap-kit and submit your changes.
+
+
+ 10.27 Configuration files handling and placement
+ ================================================
+
+The global variable PKG_SYSCONFBASE (and some others) can be set by the
+system administrator in /etc/mk.conf to define the place where
+configuration files get installed. Therefore, packages must be adapted to
+support this feature. Keep in mind that you should only install files that
+are strictly necessary in the configuration directory, files that can
+go to $PREFIX/share should go there.
+
+We will take a look at available variables first (bsd.pkg.mk contains more
+information). PKG_SYSCONFDIR is where the configuration files for a package
+may be found (that is, the full path, e.g. /etc or /usr/pkg/etc). This
+value may be customized in various ways:
+
+ 1) PKG_SYSCONFBASE is the main config directory under which all package
+ configuration files are to be found. Users will typically want to set
+ it to /etc, or accept the default location of $PREFIX/etc.
+
+ 2) PKG_SYSCONFSUBDIR is the subdirectory of PKG_SYSCONFBASE under which
+ the configuration files for a particular package may be found. Defaults
+ to $SYSCONFBASE
+
+ 3) PKG_SYSCONFVAR is the special suffix used to distinguish any overriding
+ values for a particular package (see next item). It defaults to
+ ${PKGBASE}, but for a collection of related packages that should all
+ have the same PKG_SYSCONFDIR value, it can be set in each of the
+ package Makefiles to a common value.
+
+ 4) PKG_SYSCONFDIR.${PKG_SYSCONFVAR} overrides the value of
+ ${PKG_SYSCONFDIR} for packages with the same value for PKG_SYSCONFVAR.
+
+ As an example, all the various KDE packages may want to set
+ PKG_SYSCONFVAR to "kde" so admins can set ${PKG_SYSCONFDIR.kde} in
+ /etc/mk.conf to define where to install KDE config files.
+
+Programs' configuration directory should be defined during the configure
+stage. Packages that use GNU autoconf can usually do this by using the
+--sysconfdir parameter, but this brings some problems as we will see now.
+When you change this pathname in packages, you should not allow them to
+install files in that directory directly. Instead they need to install
+those files under share/examples/${PKGNAME} so PLIST can register them.
+
+Once you have the required configuration files in place (under the
+share/examples directory) the variable CONF_FILES should be set to copy
+them into PKG_SYSCONFDIR. The contents of this variable is formed by pairs
+of filenames; the first element of the pair specifies the file inside the
+examples directory (registered by PLIST) and the second element specifies
+the target file. This is done this way to allow binary packages to place
+files in the right directory using INSTALL/DEINSTALL scripts which are
+created automatically. The package Makefile must also set USE_PKGINSTALL
+to "YES" prior to the inclusion of bsd.pkg.mk to use these automatically
+generated scripts. The automatic copying of config files can be toggled by
+setting the environment variable PKG_CONFIG prior to package installation.
+
+Here is an example, taken from mail/mutt/Makefile:
+
+ EGDIR= ${PREFIX}/share/doc/mutt/samples
+ CONF_FILES= ${EGDIR}/Muttrc ${PKG_SYSCONFDIR}/Muttrc
+
+As you can see, this package installs configuration files inside EGDIR,
+which are registered by PLIST. After that, the variable CONF_FILES lists
+the installed file first and then the target file. Users will also get an
+automatic message when files are installed using this method.
+
+
+ 10.28 Packages providing login shells
+ =====================================
+
+If the purpose of the package is to provide a login shell, the variable
+PKG_SHELL should contain the full pathname of the shell executable installed
+by this package. The package Makefile also must set USE_PKGINSTALL to "YES"
+prior to the inclusion of bsd.pkg.mk to use the automatically generated
+INSTALL/DEINSTALL scripts.
+
+An example taken from shells/zsh:
+
+ USE_PKGINSTALL= YES
+ PKG_SHELL= ${PREFIX}/bin/zsh
+
+The shell is registered into /etc/shells file automatically in the
+post-install step by the auto-generated INSTALL script and removed in the
+deinstall step by the DEINSTALL script.
+
+
+ 10.29 Packages providing locale catalogues
+ ==========================================
+
+If the package provides its own locale catalogues, the variable
+USE_PKGLOCALEDIR should be defined. It will ensure that the package's
+Makefile template files are fixed and point to the correct locale directories
+(which may vary, depending on OS), if necessary. See also section 5.1 for
+details about ${PKGLOCALEDIR}. This functionality is buildlink2-only.
+
+
+ 10.30 Using 'sudo' with pkgsrc
+ ==============================
+
+When installing packages as non-root user and using the just-in-time
+su(1) feature of pkgsrc, it can become annoying to type in the root
+password for each required package installed. To avoid this, the sudo
+package can be used, which does password caching over a limited time.
+To use it, install sudo (either as binary package or from
+pkgsrc/security/sudo) and then put the following into your /etc/mk.conf:
+
+ SU_CMD=/usr/pkg/bin/sudo /bin/sh -c
+
+
+ 10.31 Packages that cannot or should not be built
+ =================================================
+
+There are several reasons why a package might be instructed to not
+build under certain circumstances. If the package builds and runs
+on most platforms, the exceptions should be noted with NOT_FOR_PLATFORM.
+If the package builds and runs on a small handful of platforms,
+set ONLY_FOR_PLATFORM instead. If the package should be skipped
+(for example, because it provides functionality already provided
+by the system), set PKG_SKIP_REASON to a descriptive message. If
+the package should fail because some preconditions are not met,
+set PKG_FAIL_REASON to a descriptive message.
+
+IGNORE is deprecated because it didn't provide enough information
+to determine whether the build should fail.
+
+
+ 10.32 Packages which should not be deleted, once installed
+ ==========================================================
+
+To ensure that a package may not be deleted, once it has been installed,
+the PKG_PRESERVE definition should be set in the package Makefile. This
+will be carried into any binary package that is made from this pkgsrc
+entry. A "preserved" package will not be deleted using pkg_delete(1),
+unless the "-f" option is used.
+
+ 10.33 Packages containing perl scripts
+ ======================================
+
+If your package contains interpreted perl scripts, set REPLACE_PERL to
+ensure that the proper interpreter path is set. REPLACE_PERL should
+contain a list of scripts, relative to WRKSRC, that you want adjusted.
+
+ 11 Submitting & Committing
+ ==========================
+
+ 11.1 Submitting your packages
+ =============================
+
+You have to separate between binary and "normal" (source) packages here:
+
+ * precompiled binary packages:
+ Our policy is that we accept binaries only from NetBSD developers to
+ guarantee that the packages don't contain any trojan horses etc.
+ This is not to piss anyone off but rather to protect our users!
+ You're still free to put up your home-made binary packages and tell
+ the world where to get them.
+
+ * packages:
+ First, check that your package is complete, compiles and runs well; see
+ section 9 and the rest of this document. Next, generate an uuencoded
+ gzipped tar(1) archive, preferably with all files in a single directory.
+ Finally, send-pr(1) with category "pkg", a synopsis which includes the
+ package name and version number, a short description of your package
+ (contents of the COMMENT variable or DESCR file are OK) and attach the
+ archive to your PR.
+
+ If you want to submit several packages, please send a separate PR for
+ each one, it's easier for us to track things that way.
+
+
+ 11.2 Committing: Importing the package into CVS
+ ===============================================
+
+This section is only of interest for NetBSD developers with write
+access to the NetBSD pkgsrc repository. Please remember that cvs
+imports files relative to the cwd, and that the pathname that you
+give the "cvs import" command is so that it knows where to place
+the files in the repository. Newly created packages should be
+imported with a vendor tag of "TNF" and a release tag of "pkgsrc-base",
+e.g:
+
+ % cd .../pkgsrc/<category>/<pkgname>
+ % cvs import pkgsrc/<category>/<pkgname> TNF pkgsrc-base
+
+and remember to move the directory from which you imported out of
+the way, or cvs will complain the next time you "cvs update" your
+source tree. Also don't forget to add the new package to the
+category's Makefile.
+
+The commit message of the initial import should include part of the
+DESCR file, so people reading the mailing lists know what the package
+is/does.
+
+Please note all package updates/additions in pkgsrc/doc/CHANGES! It's very
+important to keep this file up to date and conforming to the existing
+format, because it will be used by scripts to automatically update pages on
+www.netbsd.org and other sites.
+
+For new packages, "cvs import" is preferred to "cvs add" because
+the former gets everything with a single command, and provides a
+consistent tag.
+
+
+ 11.3 Updating a Package to a Newer Version
+ ==========================================
+
+Please always put a concise, appropriate and relevant summary of the
+changes between old and new versions into the commit log when updating
+a package. There are various reasons for this:
+
++ a URL is volatile, and can change over time. It may go away completely,
+or its information may be overwritten by newer information.
+
++ having the change information between old and new versions in our CVS
+repository is very useful for people who use either cvs or anoncvs.
+
++ having the change information between old and new versions in our CVS
+repository is very useful for people who read the pkgsrc-changes mailing
+list, so that they can make tactical decisions about when to upgrade
+the package.
+
+Please also recognise that, just because a new version of a package
+has been released, it should not automatically be upgraded in the CVS
+repository. We prefer to be conservative in the packages that are
+included in pkgsrc - development or beta packages are not really the
+best thing for most places in which pkgsrc is used. Please use your
+judgement about what should go into pkgsrc, and bear in mind that
+stability is to be preferred above new and possibly untested features.
+
+
+ 11.4 Moving a Package in pkgsrc
+ ===============================
+
+ 1. Make a copy of the directory somewhere else.
+ 2. Remove all CVS dirs.
+ Alternatively to the first two steps you can also do:
+ cvs -d user@cvs.netbsd.org:/cvsroot export -D today pkgsrc/category/package
+ and use that for further work.
+ 3. Fix CATEGORIES and any DEPENDS paths that just did ../package
+ instead of ../../category/package.
+ 4. "cvs import" the modified package in the new place.
+ 5. Check if any package depends on it:
+ cd /usr/pkgsrc
+ grep /package */*/Makefile* */*/buildlink*
+ 6. Fix paths in packages from step 5 to point to new location.
+ 7. "cvs rm (-f)" the package at the old location.
+ 8. Remove from oldcategory/Makefile.
+ 9. Add to newcategory/Makefile.
+10. Commit the changed and removed files:
+ cvs commit oldcategory/package oldcategory/Makefile newcategory/Makefile
+ and any packages from step 5, of course.
+
+
+ 12 A simple example of a package: bison
+ =======================================
+
+I checked to find a piece of software that wasn't in the packages
+collection, and picked GNU bison. Quite why someone would want to have
+bison when Berkeley yacc is already present in the tree is beyond me, but
+it's useful for the purposes of this exercise.
+
+
+ 12.1 files
+ ==========
+
+The file contents in this section must be used without the "> " prefix.
+
+
+ 12.1.1 Makefile
+ ===============
+
+ # <$>NetBSD<$>
+
+ DISTNAME= bison-1.25
+ CATEGORIES= devel
+ MASTER_SITES= ${MASTER_SITE_GNU}
+ MAINTAINER= thorpej@netbsd.org
+ HOMEPAGE= http://www.gnu.org/software/bison/bison.html
+ COMMENT= GNU yacc clone
+
+ GNU_CONFIGURE= yes
+ INFO_FILES= bison.info
+
+ .include "../../mk/bsd.pkg.mk"
+
+
+ 12.1.2 DESCR
+ ================
+
+ GNU version of yacc. Can make re-entrant parsers, and numerous other
+ improvements. Why you would want this when Berkeley yacc(1) is part
+ of the NetBSD source tree is beyond me.
+
+
+ 12.1.3 PLIST
+ ================
+
+ @comment <$>NetBSD<$>
+ bin/bison
+ man/man1/bison.1.gz
+ info/bison.info
+ info/bison.info-1
+ info/bison.info-2
+ info/bison.info-3
+ info/bison.info-4
+ info/bison.info-5
+ share/bison.simple
+ share/bison.hairy
+
+
+ 12.1.4 Checking a package "pkglint"
+ ===================================
+
+The NetBSD package system comes with a tool called "pkglint" (located in the
+directory "pkgsrc/pkgtools/pkglint") which helps to check the contents of these
+files. After installation it is quite easy to use, just change to the
+directory of the package you wish to examine and execute "pkglint":
+
+ % pkglint
+ OK: checking ./DESCR.
+ OK: checking Makefile.
+ OK: checking distinfo.
+ OK: checking patches/patch-aa.
+ looks fine.
+
+Depending on the supplied command line arguments (see "man pkglint") more
+verbose checks will be performed. Use e.g. "pkglint -v" for a very verbose
+check.
+
+
+ 12.2 Steps for building, installing, packaging
+ ==============================================
+
+Create the directory where the package lives, plus any auxiliary directories:
+
+ # cd /usr/pkgsrc/lang
+ # mkdir bison
+ # cd bison
+ # mkdir patches pkg
+
+Create Makefile, DESCR and PLIST as in section 11.1,
+then continue with fetching the distfile:
+
+ # make fetch
+ >> bison-1.25.tar.gz doesn't seem to exist on this system.
+ >> Attempting to fetch from ftp://prep.ai.mit.edu/pub/gnu//.
+ Requesting ftp://prep.ai.mit.edu/pub/gnu//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/)
+ ftp: Error retrieving file: 500 Internal error
+
+ >> Attempting to fetch from ftp://wuarchive.wustl.edu/systems/gnu//.
+ Requesting ftp://wuarchive.wustl.edu/systems/gnu//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/)
+ ftp: Error retrieving file: 500 Internal error
+
+ >> Attempting to fetch from ftp://ftp.freebsd.org/pub/FreeBSD/distfiles//.
+ Requesting ftp://ftp.freebsd.org/pub/FreeBSD/distfiles//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/)
+ Successfully retrieved file.
+
+Generate the checksum of the distfile into distinfo:
+
+ # make makesum
+
+Now compile:
+
+ # make
+ >> Checksum OK for bison-1.25.tar.gz.
+ ===> Extracting for bison-1.25
+ ===> Patching for bison-1.25
+ ===> Ignoring empty patch directory
+ ===> Configuring for bison-1.25
+ creating cache ./config.cache
+ checking for gcc... cc
+ checking whether we are using GNU C... yes
+ checking for a BSD compatible install... /usr/bin/install -c -o bin -g bin
+ checking how to run the C preprocessor... cc -E
+ checking for minix/config.h... no
+ checking for POSIXized ISC... no
+ checking whether cross-compiling... no
+ checking for ANSI C header files... yes
+ checking for string.h... yes
+ checking for stdlib.h... yes
+ checking for memory.h... yes
+ checking for working const... yes
+ checking for working alloca.h... no
+ checking for alloca... yes
+ checking for strerror... yes
+ updating cache ./config.cache
+ creating ./config.status
+ creating Makefile
+ ===> Building for bison-1.25
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g LR0.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g allocate.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g closure.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g conflicts.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g derives.c
+ cc -c -DXPFILE=\"/usr/pkg/share/bison.simple\" -DXPFILE1=\"/usr/pkg/share/bison.hairy\" -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -g ./files.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g getargs.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g gram.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g lalr.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g lex.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g main.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g nullable.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g output.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g print.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g reader.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g reduce.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g symtab.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g warshall.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g version.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g getopt.c
+ cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g getopt1.c
+ cc -g -o bison LR0.o allocate.o closure.o conflicts.o derives.o files.o getargs.o gram.o lalr.o lex.o main.o nullable.o output.o print.o reader.o reduce.o symtab.o warshall.o version.o getopt.o getopt1.o
+ ./files.c:240: warning: mktemp() possibly used unsafely, consider using mkstemp()
+ rm -f bison.s1
+ sed -e "/^#line/ s|bison|/usr/pkg/share/bison|" < ./bison.simple > bison.s1
+
+Everything seems OK, so install the files:
+
+ # make install
+ >> Checksum OK for bison-1.25.tar.gz.
+ ===> Installing for bison-1.25
+ sh ./mkinstalldirs /usr/pkg/bin /usr/pkg/share /usr/pkg/info /usr/pkg/man/man1
+ rm -f /usr/pkg/bin/bison
+ cd /usr/pkg/share; rm -f bison.simple bison.hairy
+ rm -f /usr/pkg/man/man1/bison.1 /usr/pkg/info/bison.info*
+ install -c -o bin -g bin -m 555 bison /usr/pkg/bin/bison
+ /usr/bin/install -c -o bin -g bin -m 644 bison.s1 /usr/pkg/share/bison.simple
+ /usr/bin/install -c -o bin -g bin -m 644 ./bison.hairy /usr/pkg/share/bison.hairy
+ cd .; for f in bison.info*; do /usr/bin/install -c -o bin -g bin -m 644 $f /usr/pkg/info/$f; done
+ /usr/bin/install -c -o bin -g bin -m 644 ./bison.1 /usr/pkg/man/man1/bison.1
+ ===> Registering installation for bison-1.25
+
+You can now use bison, and also - if you decide so - remove it with
+"pkg_delete bison-1.25". Should you decide that you want a binary package,
+do this now:
+
+ # make package
+ >> Checksum OK for bison-1.25.tar.gz.
+ ===> Building package for bison-1.25
+ Creating package bison-1.25.tgz
+ Registering depends:.
+ Creating gzip'd tar ball in '/u/pkgsrc/lang/bison/bison-1.25.tgz'
+
+Now that you don't need the source and object files any more, clean up:
+
+ # make clean
+ ===> Cleaning for bison-1.25
+
+
+======================
+Appendix A: build logs
+======================
+
+ A.1 Building top
+ ================
+
+ # make
+ >> top-3.5beta5.tar.gz doesn't seem to exist on this system.
+ >> Attempting to fetch from ftp://ftp.groupsys.com/pub/top/.
+ Requesting ftp://ftp.groupsys.com/pub/top/top-3.5beta5.tar.gz (via ftp://orpheus.amdahl.com:80/)
+ Successfully retrieved file.
+ >> Checksum OK for top-3.5beta5.tar.gz.
+ ===> Extracting for top-3.5beta5
+ ===> Patching for top-3.5beta5
+ ===> Applying NetBSD patches for top-3.5beta5
+ ===> Configuring for top-3.5beta5
+ /bin/cp /u/pkgsrc/sysutils/top/files/defaults /u/pkgsrc/sysutils/top/work/top-3.5beta5/.defaults
+ chmod a-x /u/pkgsrc/sysutils/top/work/top-3.5beta5/install
+
+ Reading configuration from last time...
+
+ Using these settings:
+ Bourne Shell /bin/sh
+ C compiler cc
+ Compiler options -DHAVE_GETOPT -O
+ Awk command awk
+ Install command /usr/bin/install
+
+ Module netbsd13
+ LoadMax 5.0
+ Default TOPN -1
+ Nominal TOPN 18
+ Default Delay 2
+ Random passwd access yes
+ Table Size 47
+ Owner root
+ Group Owner kmem
+ Mode 2755
+ bin directory $(PREFIX)/bin
+ man directory $(PREFIX)/man/man1
+ man extension 1
+ man style man
+
+ Building Makefile...
+ Building top.local.h...
+ Building top.1...
+ Doing a "make clean".
+ rm -f *.o top core core.* sigdesc.h
+ To create the executable, type "make".
+ To install the executable, type "make install".
+ ===> Building for top-3.5beta5
+ cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c top.c
+ awk -f sigconv.awk /usr/include/sys/signal.h >sigdesc.h
+ cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c commands.c
+ cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c display.c
+ cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c screen.c
+ cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c username.c
+ cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c utils.c
+ utils.c: In function `errmsg':
+ utils.c:348: warning: return discards `const' from pointer target type
+ cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c version.c
+ cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c getopt.c
+ cc "-DOSREV=12G" -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c machine.c
+ rm -f top
+ cc -o top top.o commands.o display.o screen.o username.o utils.o version.o getopt.o machine.o -ltermcap -lm -lkvm
+ #
+ #
+ #
+ #
+ # make install
+ >> Checksum OK for top-3.5beta5.tar.gz.
+ ===> Installing for top-3.5beta5
+ /usr/bin/install -o root -m 2755 -g kmem top /usr/pkg/bin
+ /usr/bin/install top.1 /usr/pkg/man/man1/top.1
+ strip /usr/pkg/bin/top
+ ===> Registering installation for top-3.5beta5
+ #
+
+
+ A.2 Packaging top
+ =================
+
+ # make package
+ >> Checksum OK for top-3.5beta5.tar.gz.
+ ===> Building package for top-3.5beta5
+ Creating package top-3.5beta5.tgz
+ Registering depends:.
+ Creating gzip'd tar ball in '/u/pkgsrc/sysutils/top/top-3.5beta5.tgz'
+
+
+======================================================
+Appendix B: Layout of the FTP server's package archive
+======================================================
+
+Layout for precompiled binary packages on ftp.netbsd.org:
+
+/pub/NetBSD/packages/
+ README
+ distfiles/
+ pkgsrc -> /pub/NetBSD/NetBSD-current/pkgsrc
+ 1.5/
+ i386/
+ All/
+ archivers/
+ foo -> ../All/foo
+ ...
+ m68k/
+ All/
+ archivers/
+ foo -> ../All/foo
+ ...
+ amiga -> m68k
+ atari -> m68k
+ ...
+
+
+To create:
+ - cd /usr/pkgsrc ; make install ; make package
+ - upload /usr/pkgsrc/packages to
+ ftp://ftp.netbsd.org/pub/NetBSD/packages/\
+ `uname -r | sed 's@\.\([0-9]*\)[\._].*@\.\1@'`/`uname -p`
+ - if necessary ln -s `uname -m` `uname -p`
+
+Disk space needed: unknown.
+
+Packages for a release version of NetBSD should be uploaded to the
+directory major.minor corresponding to the appropriate release. Packages
+for NetBSD with versions such as "1.5.1" should be uploaded to the "1.5"
+directory, stripping the tiny number off the directory name. For packages
+that need to be tightly coupled with the OS Version, such as LKM's, you
+may create a major.minor.tiny release directory, and place those packages
+therein. Such packages should be marked with the variable
+"OSVERSION_SPECIFIC=yes" to mark them in some way for binary package
+builders.
+
+
+###########################################################################
+# Local Variables:
+# mode: Text
+# fill-column: 75
+# sentence-end-double-space: nil
+# End: