diff options
author | grant <grant@pkgsrc.org> | 2004-10-21 14:44:39 +0000 |
---|---|---|
committer | grant <grant@pkgsrc.org> | 2004-10-21 14:44:39 +0000 |
commit | c15ddf8a40064a8e229c7a51226b8ab9fbd95f9c (patch) | |
tree | c16cd3ef3340d5c9c442c07e2729ad8c6dc81b60 /doc/pkgsrc.html | |
parent | 07026e39d015771ec8f44d9fefccd5959b085dce (diff) | |
download | pkgsrc-c15ddf8a40064a8e229c7a51226b8ab9fbd95f9c.tar.gz |
initial commit of the pkgsrc guide for distribution with pkgsrc.
Diffstat (limited to 'doc/pkgsrc.html')
-rw-r--r-- | doc/pkgsrc.html | 10834 |
1 files changed, 10834 insertions, 0 deletions
diff --git a/doc/pkgsrc.html b/doc/pkgsrc.html new file mode 100644 index 00000000000..28b486f944e --- /dev/null +++ b/doc/pkgsrc.html @@ -0,0 +1,10834 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <meta name="generator" content= + "HTML Tidy for NetBSD (vers 1st August 2004), see www.w3.org" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=us-ascii" /> + + <title>The pkgsrc guide</title> + <link rel="stylesheet" href="/NetBSD.css" type="text/css" /> + <meta name="generator" content= + "DocBook XSL Stylesheets V1.65.0" /> + <meta name="description" content= + "Information about using the NetBSD package system (pkgsrc) from both a user view for installing packages as well as from a pkgsrc developers' view for creating new packages." /> + </head> + +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" +alink="#0000FF"> + <div class="book" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h1 class="title"><a name="id2496010" id= + "id2496010"></a>The pkgsrc guide</h1> + </div> + + <div> + <h2 class="subtitle">Documentation on the NetBSD package + system</h2> + </div> + + <div> + <div class="authorgroup"> + <div class="author"> + <h3 class="author"><span class= + "firstname">Alistair</span> <span class= + "surname">Crooks</span></h3> + + <div class="affiliation"> + <div class="address"> + <p><tt class="email"><<a href= + "mailto:agc@NetBSD.org">agc@NetBSD.org</a>></tt></p> + </div> + </div> + </div> + + <div class="author"> + <h3 class="author"><span class= + "firstname">Hubert</span> <span class= + "surname">Feyrer</span></h3> + + <div class="affiliation"> + <div class="address"> + <p><tt class="email"><<a href= + "mailto:hubertf@NetBSD.org">hubertf@NetBSD.org</a>></tt></p> + </div> + </div> + </div> + </div> + </div> + + <div> + <p class="copyright">Copyright © 1994-2004 The + NetBSD Foundation, Inc</p> + </div> + + <div> + <p class="pubdate">$NetBSD: pkgsrc.xml,v 1.1.1.1 + 2004/10/21 14:27:40 grant Exp $</p> + </div> + + <div> + <div class="abstract"> + <p class="title"><b>Abstract</b></p> + + <p>Information about using the NetBSD package system + (pkgsrc) from both a user view for installing packages + as well as from a pkgsrc developers' view for creating + new packages.</p> + </div> + </div> + </div> + <hr /> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="chapter"><a href="#introduction">1. + Introduction</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2494471">1.1. + Introduction</a></span></dt> + + <dt><span class="sect1"><a href="#overview">1.2. + Overview</a></span></dt> + + <dt><span class="sect1"><a href="#terminology">1.3. + Terminology</a></span></dt> + + <dt><span class="sect1"><a href="#typography">1.4. + Typography</a></span></dt> + </dl> + </dd> + + <dt><span class="part"><a href="#users-guide">I. pkgsrc + user's guide</a></span></dt> + + <dd> + <dl> + <dt><span class="chapter"><a href="#getting">2. Where + to get pkgsrc</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2495110">2.1. + As tar file</a></span></dt> + + <dt><span class="sect1"><a href="#id2495127">2.2. + Via SUP</a></span></dt> + + <dt><span class="sect1"><a href="#id2495159">2.3. + Via CVS</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#platforms">3. Using + pkgsrc on systems other than NetBSD</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2495269">3.1. + Bootstrapping pkgsrc</a></span></dt> + + <dt><span class="sect1"><a href="#id2495376">3.2. + Platform specific notes</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2495382">3.2.1. Darwin (Mac OS + X)</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2495681">3.2.2. FreeBSD</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496397">3.2.3. Interix</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496488">3.2.4. IRIX</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496605">3.2.5. OpenBSD</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496786">3.2.6. Solaris</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="chapter"><a href="#using">4. Using + pkgsrc</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href= + "#getting-started">4.1. Working with binary + packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2496922">4.1.1. Where to get binary + packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496963">4.1.2. How to use binary + packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2497165">4.1.3. A word of + warning</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2497177">4.2. + Building packages from source</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2497187">4.2.1. + Requirements</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2497275">4.2.2. Fetching + distfiles</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2497328">4.2.3. How to build and + install</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2498259">4.2.4. Selecting the + compiler</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="chapter"><a href="#binary">5. Creating + binary packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2498413">5.1. + Building a single binary package</a></span></dt> + + <dt><span class="sect1"><a href="#id2563208">5.2. + Settings for creation of binary + packages</a></span></dt> + + <dt><span class="sect1"><a href="#bulkbuild">5.3. + Doing a bulk build of all packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#binary.configuration">5.3.1. + Configuration</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563348">5.3.2. Other environmental + considerations</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563388">5.3.3. Operation</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563595">5.3.4. What it + does</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563652">5.3.5. Disk space + requirements</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563678">5.3.6. Setting up a sandbox for + chroot'ed builds</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2564042">5.3.7. Building a partial set of + packages</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2564085">5.4. + Creating a multiple CD-ROM packages + collection</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2564168">5.4.1. Example of + cdpack</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="chapter"><a href="#faq">6. Frequently + Asked Questions</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2564359">6.1. + Is there a mailing list for pkg-related + discussion?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564457">6.2. + Where's the pkgviews documentation?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564470">6.3. + Utilities for package management + (pkgtools)</a></span></dt> + + <dt><span class="sect1"><a href="#id2564695">6.4. + How to use pkgsrc as non-root</a></span></dt> + + <dt><span class="sect1"><a href="#id2564707">6.5. + How can I install/use XFree86 from + pkgsrc?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564803">6.6. + How can I install/use X.org from + pkgsrc?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564830">6.7. + How to fetch files from behind a + firewall</a></span></dt> + + <dt><span class="sect1"><a href="#id2564844">6.8. + How do I tell make fetch to do passive + FTP?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564896">6.9. + How to fetch all distfiles at once</a></span></dt> + + <dt><span class="sect1"><a href="#id2565104">6.10. + What does Don't know how to make + /usr/share/tmac/tmac.andoc mean?</a></span></dt> + + <dt><span class="sect1"><a href="#id2565142">6.11. + What does Could not find bsd.own.mk + mean?</a></span></dt> + + <dt><span class="sect1"><a href="#id2565200">6.12. + Using 'sudo' with pkgsrc</a></span></dt> + + <dt><span class="sect1"><a href="#faq.conf">6.13. + Configuration files handling and + placement</a></span></dt> + + <dt><span class="sect1"><a href= + "#audit-packages">6.14. Automated security + checks</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="part"><a href="#developers-guide">II. + pkgsrc developer's guide</a></span></dt> + + <dd> + <dl> + <dt><span class="chapter"><a href="#components">7. + Package components - files, directories and + contents</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href= + "#components.Makefile">7.1. + Makefile</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.distinfo">7.2. + distinfo</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.patches">7.3. + patches/*</a></span></dt> + + <dt><span class="sect1"><a href="#id2566375">7.4. + Other mandatory files</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.optional">7.5. Optional + files</a></span></dt> + + <dt><span class="sect1"><a href="#id2566569">7.6. + work*</a></span></dt> + + <dt><span class="sect1"><a href="#id2566657">7.7. + files/*</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#plist">8. PLIST + issues</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2566711">8.1. + RCS ID</a></span></dt> + + <dt><span class="sect1"><a href="#id2566726">8.2. + Semi-automatic PLIST generation</a></span></dt> + + <dt><span class="sect1"><a href="#print-PLIST">8.3. + Tweaking output of make print-PLIST</a></span></dt> + + <dt><span class="sect1"><a href="#plist.misc">8.4. + Variable substitution in PLIST</a></span></dt> + + <dt><span class="sect1"><a href="#id2567047">8.5. + Manpage-compression</a></span></dt> + + <dt><span class="sect1"><a href="#id2567089">8.6. + Changing PLIST source with + PLIST_SRC</a></span></dt> + + <dt><span class="sect1"><a href="#id2567106">8.7. + Platform specific and differing + PLISTs</a></span></dt> + + <dt><span class="sect1"><a href= + "#faq.common-dirs">8.8. Sharing directories between + packages</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#buildlink">9. + Buildlink methodology</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2567378">9.1. + Converting packages to use + buildlink3</a></span></dt> + + <dt><span class="sect1"><a href="#id2567637">9.2. + Writing buildlink3.mk files</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2567774">9.2.1. Anatomy of a buildlink3.mk + file</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2568283">9.2.2. Updating + BUILDLINK_DEPENDS.pkg in buildlink3.mk + files</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2568362">9.3. + Writing builtin.mk files</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2568512">9.3.1. Anatomy of a builtin.mk + file</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2568739">9.3.2. Global preferences for + native or pkgsrc software</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="chapter"><a href="#options">10. + Options handling</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2568811">10.1. + Global default options</a></span></dt> + + <dt><span class="sect1"><a href="#id2568826">10.2. + Converting packages to use + bsd.options.mk</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#build">11. The + build process</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href= + "#build.prefix">11.1. Program + location</a></span></dt> + + <dt><span class="sect1"><a href="#id2569571">11.2. + Main targets</a></span></dt> + + <dt><span class="sect1"><a href= + "#build.helpful-targets">11.3. Other helpful + targets</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#fixes">12. Notes on + fixes for packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2570968">12.1. + General operation</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2570971">12.1.1. How to pull in variables + from /etc/mk.conf</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571054">12.1.2. Restricted + packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#dependencies">12.1.3. Handling + dependencies</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571501">12.1.4. Handling conflicts with + other packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571620">12.1.5. Packages that cannot or + should not be built</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571645">12.1.6. Packages which should not + be deleted, once installed</a></span></dt> + + <dt><span class="sect2"><a href= + "#security-handling">12.1.7. Handling packages + with security problems</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571737">12.1.8. How to handle compiler + bugs</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571760">12.1.9. How to handle incrementing + versions when fixing an existing + package</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571809">12.1.10. Portability of + packages</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2571901">12.2. + Possible downloading issues</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2571905">12.2.1. Packages whose distfiles + aren't available for plain + downloading</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572036">12.2.2. How to handle modified + distfiles with the 'old' name</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572048">12.3. + Configuration gotchas</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#fixes.libtool">12.3.1. Shared libraries - + libtool</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572523">12.3.2. Using libtool on GNU + packages that already support + libtool</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572608">12.3.3. GNU + Autoconf/Automake</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572652">12.4. + Building considerations</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2572656">12.4.1. CPP + defines</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572685">12.5. + Package specific actions</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2572689">12.5.1. Package configuration + files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572859">12.5.2. User + Interaction</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572904">12.5.3. Handling + licenses</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572987">12.5.4. Creating an account from a + package</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573049">12.5.5. Installing score + files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573093">12.5.6. Packages providing login + shells</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573424">12.5.7. Packages containing perl + scripts</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573442">12.5.8. Packages with hardcoded + paths to other interpreters</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573463">12.5.9. Packages installing perl + modules</a></span></dt> + + <dt><span class="sect2"><a href= + "#faq.info-files">12.5.10. Packages installing + info files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573751">12.5.11. Packages installing + GConf2 data files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573851">12.5.12. Packages installing + scrollkeeper data files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573902">12.5.13. Packages installing X11 + fonts</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574018">12.5.14. Packages installing GTK2 + modules</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574087">12.5.15. Packages installing SGML + or XML data</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574139">12.5.16. Packages installing + extensions to the MIME database</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574210">12.5.17. Packages using + intltool</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2574224">12.6. + Feedback to the author</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#debug">13. + Debugging</a></span></dt> + + <dt><span class="chapter"><a href="#submit">14. + Submitting and Committing</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2574685">14.1. + Submitting your packages</a></span></dt> + + <dt><span class="sect1"><a href="#id2574732">14.2. + Committing: Importing a package into + CVS</a></span></dt> + + <dt><span class="sect1"><a href="#id2575000">14.3. + Updating a Package to a Newer + Version</a></span></dt> + + <dt><span class="sect1"><a href="#id2575019">14.4. + Moving a Package in pkgsrc</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="appendix"><a href="#examples">A. A simple + example package: bison</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2575177">A.1. + files</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href="#id2575180">A.1.1. + Makefile</a></span></dt> + + <dt><span class="sect2"><a href="#id2575188">A.1.2. + DESCR</a></span></dt> + + <dt><span class="sect2"><a href="#id2575203">A.1.3. + PLIST</a></span></dt> + + <dt><span class="sect2"><a href="#id2575210">A.1.4. + Checking a package with pkglint</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2575319">A.2. Steps + for building, installing, packaging</a></span></dt> + </dl> + </dd> + + <dt><span class="appendix"><a href="#logs">B. Build + logs</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#logs.building">B.1. + Building figlet</a></span></dt> + + <dt><span class="sect1"><a href="#logs.package">B.2. + Packaging figlet</a></span></dt> + </dl> + </dd> + + <dt><span class="appendix"><a href="#ftp-layout">C. Layout + of the FTP server's package archive</a></span></dt> + </dl> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="introduction" id= + "introduction"></a>Chapter 1. Introduction</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2494471">1.1. + Introduction</a></span></dt> + + <dt><span class="sect1"><a href="#overview">1.2. + Overview</a></span></dt> + + <dt><span class="sect1"><a href="#terminology">1.3. + Terminology</a></span></dt> + + <dt><span class="sect1"><a href="#typography">1.4. + Typography</a></span></dt> + </dl> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2494471" id= + "id2494471"></a>1.1. Introduction</h2> + </div> + </div> + </div> + + <p>There is a lot of software freely available for Unix + based systems, which usually runs on NetBSD and other + Unix-flavoured systems, too, sometimes with some + modifications. The NetBSD Packages Collection (pkgsrc) + incorporates any such changes necessary to make that + software run, and makes the installation (and + de-installation) of the software package easy by means of a + single command.</p> + + <p>Once the software has been built, it is manipulated with + the <span><b class="command">pkg_*</b></span> 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.</p> + + <p>pkgsrc currently contains several thousand packages, + including:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/www/apache/README.html" + class="pkgname">www/apache</a> - The Apache web + server</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/www/mozilla/README.html" + class="pkgname">www/mozilla</a> - The Mozilla web + browser</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/meta-pkgs/gnome/README.html" + class="pkgname">meta-pkgs/gnome</a> - The GNOME + Desktop Environment</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/meta-pkgs/kde3/README.html" + class="pkgname">meta-pkgs/kde3</a> - The K Desktop + Environment</p> + </li> + </ul> + </div> + + <p>...just to name a few.</p> + + <p>pkgsrc has built-in support for handling varying + dependencies, such as pthreads and X11, and extended + features such as IPv6 support on a range of platforms.</p> + + <p>pkgsrc was derived from FreeBSD's ports system, and + initially developed for NetBSD only. Since then, pkgsrc has + grown a lot, and now supports the following platforms:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a href="http://developer.apple.com/darwin/" + target="_top">Darwin</a> (<a href= + "http://www.apple.com/macosx/" target="_top">Mac OS + X</a>)</p> + </li> + + <li> + <p><a href="http://www.FreeBSD.org/" target= + "_top">FreeBSD</a></p> + </li> + + <li> + <p><a href="http://www.microsoft.com/windows/sfu/" + target="_top">Interix</a></p> + </li> + + <li> + <p><a href="http://www.sgi.com/software/irix6.5/" + target="_top">IRIX</a></p> + </li> + + <li> + <p><a href="http://www.linux.org/" target= + "_top">Linux</a></p> + </li> + + <li> + <p><a href="http://www.NetBSD.org/" target= + "_top">NetBSD</a> (of course)</p> + </li> + + <li> + <p><a href="http://www.openbsd.org/" target= + "_top">OpenBSD</a></p> + </li> + + <li> + <p><a href="http://www.sun.com/solaris/" target= + "_top">Solaris</a></p> + </li> + </ul> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "overview" id="overview"></a>1.2. Overview</h2> + </div> + </div> + </div> + + <p>This document is divided into two parts. The first, + <a href="#users-guide" title= + "Part I. pkgsrc user's guide">pkgsrc user's + guide</a>, 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 own copy using the + NetBSD package system. The second part, <a href= + "#developers-guide" title= + "Part II. pkgsrc developer's guide">pkgsrc + developer's guide</a>, explains how to prepare a package so + it can be easily built by other NetBSD users without + knowing about the package's building details.</p> + + <p>This document is available in various formats:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a href="index.html" target="_top">HTML</a></p> + </li> + + <li> + <p><a href="pkgsrc.pdf" target="_top">PDF</a></p> + </li> + + <li> + <p><a href="pkgsrc.ps" target="_top">PS</a></p> + </li> + + <li> + <p><a href="pkgsrc.txt" target="_top">TXT</a></p> + </li> + </ul> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "terminology" id= + "terminology"></a>1.3. Terminology</h2> + </div> + </div> + </div> + + <p>There has been a lot of talk about “<span class= + "quote">ports</span>”, “<span class= + "quote">packages</span>”, etc. so far. Here is a + description of all the terminology used within this + document.</p> + + <div class="variablelist"> + <dl> + <dt><span class="term">Package</span></dt> + + <dd> + <p>A set of files and building instructions that + describe what's necessary to build a certain piece of + software using pkgsrc. Packages are traditionally + stored under <tt class= + "filename">/usr/pkgsrc</tt>.</p> + </dd> + + <dt><span class="term">The NetBSD package + system</span></dt> + + <dd> + <p>This is the former name of “<span class= + "quote">pkgsrc</span>”. It is part of the + NetBSD operating system and can be bootstrap to run + on non-NetBSD operating systems as well. It handles + building (compiling), installing, and removing of + packages.</p> + </dd> + + <dt><span class="term">Distfile</span></dt> + + <dd> + <p>This term describes the file or files that are + provided by the author of the piece of 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 usually stored below <tt class= + "filename">/usr/pkgsrc/distfiles</tt>.</p> + </dd> + + <dt><span class="term">Port</span></dt> + + <dd> + <p>This is the term used by FreeBSD and OpenBSD + people for what we call a package. In NetBSD + terminology, “<span class= + "quote">port</span>” refers to a different + architecture.</p> + </dd> + + <dt><span class="term">Precompiled/binary + package</span></dt> + + <dd> + <p>A set of binaries built with pkgsrc from a + distfile and stuffed together in a single <tt class= + "filename">.tgz</tt> file so it can be installed on + machines of the same machine architecture without the + need to recompile. Packages are usually generated in + <tt class="filename">/usr/pkgsrc/packages</tt>; there + is also an archive on <a href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/" target= + "_top">ftp.NetBSD.org</a>.</p> + + <p>Sometimes, this is referred to by the term + “<span class="quote">package</span>” too, + especially in the context of precompiled + packages.</p> + </dd> + + <dt><span class="term">Program</span></dt> + + <dd> + <p>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.</p> + </dd> + </dl> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "typography" id= + "typography"></a>1.4. Typography</h2> + </div> + </div> + </div> + + <p>When giving examples for commands, shell prompts are + used to show if the command should/can be issued as root, + or if “<span class="quote">normal</span>” user + privileges are sufficient. We use a <tt class= + "prompt">#</tt> for root's shell prompt, and a <tt class= + "prompt">$</tt> for users' shell prompt, assuming they use + the C-shell or tcsh.</p> + </div> + </div> + + <div class="part" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h1 class="title"><a name="users-guide" id= + "users-guide"></a>pkgsrc user's guide</h1> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="chapter"><a href="#getting">2. Where to + get pkgsrc</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2495110">2.1. As + tar file</a></span></dt> + + <dt><span class="sect1"><a href="#id2495127">2.2. Via + SUP</a></span></dt> + + <dt><span class="sect1"><a href="#id2495159">2.3. Via + CVS</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#platforms">3. Using + pkgsrc on systems other than NetBSD</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2495269">3.1. + Bootstrapping pkgsrc</a></span></dt> + + <dt><span class="sect1"><a href="#id2495376">3.2. + Platform specific notes</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2495382">3.2.1. Darwin (Mac OS + X)</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2495681">3.2.2. FreeBSD</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496397">3.2.3. Interix</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496488">3.2.4. IRIX</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496605">3.2.5. OpenBSD</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496786">3.2.6. Solaris</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="chapter"><a href="#using">4. Using + pkgsrc</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href= + "#getting-started">4.1. Working with binary + packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2496922">4.1.1. Where to get binary + packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2496963">4.1.2. How to use binary + packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2497165">4.1.3. A word of + warning</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2497177">4.2. + Building packages from source</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2497187">4.2.1. Requirements</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2497275">4.2.2. Fetching + distfiles</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2497328">4.2.3. How to build and + install</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2498259">4.2.4. Selecting the + compiler</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="chapter"><a href="#binary">5. Creating + binary packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2498413">5.1. + Building a single binary package</a></span></dt> + + <dt><span class="sect1"><a href="#id2563208">5.2. + Settings for creation of binary + packages</a></span></dt> + + <dt><span class="sect1"><a href="#bulkbuild">5.3. + Doing a bulk build of all packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#binary.configuration">5.3.1. + Configuration</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563348">5.3.2. Other environmental + considerations</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563388">5.3.3. Operation</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563595">5.3.4. What it does</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563652">5.3.5. Disk space + requirements</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2563678">5.3.6. Setting up a sandbox for + chroot'ed builds</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2564042">5.3.7. Building a partial set of + packages</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2564085">5.4. + Creating a multiple CD-ROM packages + collection</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2564168">5.4.1. Example of + cdpack</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="chapter"><a href="#faq">6. Frequently + Asked Questions</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2564359">6.1. Is + there a mailing list for pkg-related + discussion?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564457">6.2. + Where's the pkgviews documentation?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564470">6.3. + Utilities for package management + (pkgtools)</a></span></dt> + + <dt><span class="sect1"><a href="#id2564695">6.4. How + to use pkgsrc as non-root</a></span></dt> + + <dt><span class="sect1"><a href="#id2564707">6.5. How + can I install/use XFree86 from + pkgsrc?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564803">6.6. How + can I install/use X.org from pkgsrc?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564830">6.7. How + to fetch files from behind a firewall</a></span></dt> + + <dt><span class="sect1"><a href="#id2564844">6.8. How + do I tell make fetch to do passive + FTP?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564896">6.9. How + to fetch all distfiles at once</a></span></dt> + + <dt><span class="sect1"><a href="#id2565104">6.10. + What does Don't know how to make + /usr/share/tmac/tmac.andoc mean?</a></span></dt> + + <dt><span class="sect1"><a href="#id2565142">6.11. + What does Could not find bsd.own.mk + mean?</a></span></dt> + + <dt><span class="sect1"><a href="#id2565200">6.12. + Using 'sudo' with pkgsrc</a></span></dt> + + <dt><span class="sect1"><a href="#faq.conf">6.13. + Configuration files handling and + placement</a></span></dt> + + <dt><span class="sect1"><a href= + "#audit-packages">6.14. Automated security + checks</a></span></dt> + </dl> + </dd> + </dl> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="getting" id= + "getting"></a>Chapter 2. Where to get + pkgsrc</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2495110">2.1. As + tar file</a></span></dt> + + <dt><span class="sect1"><a href="#id2495127">2.2. Via + SUP</a></span></dt> + + <dt><span class="sect1"><a href="#id2495159">2.3. Via + CVS</a></span></dt> + </dl> + </div> + + <p>There are three ways to get pkgsrc. Either as a tar + file, via SUP, or via CVS. All three ways are described + here.</p> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2495110" id="id2495110"></a>2.1. As tar + file</h2> + </div> + </div> + </div> + + <p>To get pkgsrc going, you need to get the pkgsrc.tar.gz + file from <a href= + "ftp://ftp.NetBSD.org/pub/NetBSD-current/tar_files/pkgsrc.tar.gz" + target="_top">ftp.NetBSD.org</a> and unpack it into + <tt class="filename">/usr/pkgsrc</tt>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2495127" id="id2495127"></a>2.2. Via + SUP</h2> + </div> + </div> + </div> + + <p>As an alternative to the tar file, you can get pkgsrc + via the Software Update Protocol, SUP. To do so, make + sure your supfile has a line</p> + <pre class="programlisting"> +release=pkgsrc +</pre> + + <p>in it, see the examples in <tt class= + "filename">/usr/share/examples/supfiles</tt>, and that + the <tt class="filename">/usr/pkgsrc</tt> directory + exists. Then, simply run <span><b class="command">sup -v + <i class= + "replaceable"><tt>/path/to/your/supfile</tt></i></b></span>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2495159" id="id2495159"></a>2.3. Via + CVS</h2> + </div> + </div> + </div> + + <p>To get pkgsrc via CVS, make sure you have + “<span class="quote">cvs</span>” 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:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>setenv CVSROOT anoncvs@anoncvs.NetBSD.org:/cvsroot</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>setenv CVS_RSH ssh</tt></b> +<tt class="prompt">%</tt> <b class="userinput"><tt>cd /usr</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cvs checkout -P pkgsrc</tt></b> +</pre> + + <p>This will create the <tt class="filename">pkgsrc</tt> + directory in your <tt class="filename">/usr</tt>, and all + the package source will be stored under <tt class= + "filename">/usr/pkgsrc</tt>. To update pkgsrc after the + initial checkout, make sure you have <tt class= + "varname">CVS_RSH</tt> set as above, then do:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cd /usr/pkgsrc</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cvs -q update -dP</tt></b> +</pre> + + <p>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.</p> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="platforms" id= + "platforms"></a>Chapter 3. Using pkgsrc on + systems other than NetBSD</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2495269">3.1. + Bootstrapping pkgsrc</a></span></dt> + + <dt><span class="sect1"><a href="#id2495376">3.2. + Platform specific notes</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href="#id2495382">3.2.1. + Darwin (Mac OS X)</a></span></dt> + + <dt><span class="sect2"><a href="#id2495681">3.2.2. + FreeBSD</a></span></dt> + + <dt><span class="sect2"><a href="#id2496397">3.2.3. + Interix</a></span></dt> + + <dt><span class="sect2"><a href="#id2496488">3.2.4. + IRIX</a></span></dt> + + <dt><span class="sect2"><a href="#id2496605">3.2.5. + OpenBSD</a></span></dt> + + <dt><span class="sect2"><a href="#id2496786">3.2.6. + Solaris</a></span></dt> + </dl> + </dd> + </dl> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2495269" id= + "id2495269"></a>3.1. Bootstrapping pkgsrc</h2> + </div> + </div> + </div> + + <p>For Operating Systems other than NetBSD, we provide a + bootstrap kit to build the required tools to use pkgsrc + on your platform. Besides support for native NetBSD, + pkgsrc and the bootstrap kit have support for the + following operating systems:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>Darwin (Mac OS X)</p> + </li> + + <li> + <p>FreeBSD</p> + </li> + + <li> + <p>Interix (Windows 2000, XP, 2003)</p> + </li> + + <li> + <p>IRIX</p> + </li> + + <li> + <p>Linux</p> + </li> + + <li> + <p>OpenBSD</p> + </li> + + <li> + <p>Solaris</p> + </li> + </ul> + </div> + + <p>Support for other platforms is under development.</p> + + <p>Installing the bootstrap kit should be as simple + as:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd pkgsrc/bootstrap</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>./bootstrap</tt></b> +</pre> + + <p>See <a href="#getting" title= + "Chapter 2. Where to get pkgsrc">Chapter 2, + <i>Where to get pkgsrc</i></a> for other ways to get + pkgsrc before bootstrapping. The given <span><b class= + "command">bootstrap</b></span> command will use the + defaults of <tt class="filename">/usr/pkg</tt> for the + <span class="emphasis"><em>prefix</em></span> where + programs will be installed in, and <tt class= + "filename">/var/db/pkg</tt> for the package database + directory where pkgsrc will do it's internal bookkeeping. + However, these can also be set using command-line + parameters.</p> + + <p>Binary packages for the pkgsrc tools and an initial + set of packages is available for supported platforms. An + up-to-date list of these can be found on <a href= + "http://www.pkgsrc.org/" target= + "_top">www.pkgsrc.org</a>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2495376" id="id2495376"></a>3.2. Platform + specific notes</h2> + </div> + </div> + </div> + + <p>Here are some platform-specific notes you should be + aware of.</p> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2495382" id= + "id2495382"></a>3.2.1. Darwin (Mac OS + X)</h3> + </div> + </div> + </div> + + <p>Darwin 5.x and 6.x are supported. There are two + methods of using pkgsrc on Mac OS X, by using a + <a href="#platform.osx-image" title= + "3.2.1.1. Using a disk image">disk image</a>, or a + <a href="#platform.osx-ufs" title= + "3.2.1.2. Using a UFS partition">UFS + partition</a>.</p> + + <p>Before you start, you will need to download and + install the Mac OS X Developer Tools from Apple's + Developer Connection. See <a href= + "http://developer.apple.com/macosx/" target= + "_top">http://developer.apple.com/macosx/</a> for + details. Also, make sure you install X11 for Mac OS X + and the X11 SDK from <a href= + "http://www.apple.com/macosx/x11/download/" target= + "_top">http://www.apple.com/macosx/x11/download/</a> if + you intend to build packages that use the X11 Window + System.</p> + + <p>If you already have a UFS partition, or have a spare + partition that you can format as UFS, it is recommended + to use that instead of the disk image. It'll be + somewhat faster and will mount automatically at boot + time, where you must manually mount a disk image.</p> + + <div class="note" style= + "margin-left: 0.5in; margin-right: 0.5in;"> + <h3 class="title">Note</h3> + + <p>You cannot use a HFS+ file system for pkgsrc, + because pkgsrc currently requires the filesystem to + be case-sensitive, and HFS+ is not.</p> + </div> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name="platform.osx-image" + id="platform.osx-image"></a>3.2.1.1. Using + a disk image</h4> + </div> + </div> + </div> + + <p>Create the disk image:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd pkgsrc/bootstrap</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>./ufsdiskimage create ~/Documents/NetBSD 512</tt></b> # megabytes - season to taste +<tt class="prompt">#</tt> <b class= +"userinput"><tt>./ufsdiskimage mount ~/Documents/NetBSD</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>sudo chown `id -u`:`id -g` /Volumes/NetBSD</tt></b> +</pre> + + <p>That's it!</p> + </div> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name="platform.osx-ufs" + id="platform.osx-ufs"></a>3.2.1.2. Using a + UFS partition</h4> + </div> + </div> + </div> + + <p>By default, <tt class="filename">/usr</tt> will be + on your root file system, normally HFS+. It is + possible to use the default <span class= + "emphasis"><em>prefix</em></span> of <tt class= + "filename">/usr/pkg</tt> by symlinking <tt class= + "filename">/usr/pkg</tt> to a directory on a UFS file + system. Obviously, another symlink is required if you + want to place the package database directory outside + the <span class="emphasis"><em>prefix</em></span>. + e.g.</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>./bootstrap --pkgdbdir=/usr/pkg/pkgdb --pkgsrcdir=/Volumes/ufs/pkgsrc</tt></b> +</pre> + + <p>If you created your partitions at the time of + installing Mac OS X and formatted the target + partition as UFS, it should automatically mount on + <tt class="filename">/Volumes/<volume + name></tt> when the machine boots. If you are + (re)formatting a partition as UFS, you need to ensure + that the partition map correctly reflects + “<span class="quote">Apple_UFS</span>” + and not “<span class= + "quote">Apple_HFS</span>”.</p> + + <p>The problem is that none of the disk tools will + let you touch a disk that is booted from. You can + unmount the partition, but even if you newfs it, the + partition type will be incorrect and the automounter + won't mount it. It can be mounted manually, but it + won't appear in Finder.</p> + + <p>You'll need to boot off of the OS X Installation + (User) CD. When the Installation program starts, go + up to the menu and select Disk Utility. Now, you will + be able to select the partition you want to be UFS, + and Format it Apple UFS. Quit the Disk Utility, quit + the installer which will reboot your machine. The new + UFS file system will appear in Finder.</p> + + <p>Be aware that the permissions on the new file + system will be writable by root only.</p> + + <p>This note is as of 10.2 (Jaguar) and applies to + earlier versions. Hopefully Apple will fix Disk + Utility in 10.3 (Panther).</p> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2495681" id= + "id2495681"></a>3.2.2. FreeBSD</h3> + </div> + </div> + </div> + + <p>FreeBSD 4.7 and 5.0 have been tested and are + supported, other versions may work.</p> + + <p>Care should be taken so that the tools that this kit + installs do not conflict with the FreeBSD userland + tools. There are several steps:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>FreeBSD stores its ports pkg database in + <tt class="filename">/var/db/pkg</tt>. It is + therefore recommended that you choose a different + location (e.g. <tt class= + "filename">/usr/pkgdb</tt>) by using the + --pkgdbdir option to the bootstrap script.</p> + </li> + + <li> + <p>If you do not intend to use the FreeBSD ports + tools, it's probably a good idea to move them out + of the way to avoid confusion, e.g.</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd /usr/sbin</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mv pkg_add pkg_add.orig</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mv pkg_create pkg_create.orig</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mv pkg_delete pkg_delete.orig</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mv pkg_info pkg_info.orig</tt></b> +</pre> + </li> + + <li> + <p>An example <tt class= + "filename">/etc/mk.conf</tt> file will be placed + in <tt class="filename">/etc/mk.conf.example</tt> + file when you use the bootstrap script.</p> + </li> + </ol> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2496397" id= + "id2496397"></a>3.2.3. Interix</h3> + </div> + </div> + </div> + + <p>Interix is a POSIX compatible subsystem for the + Windows NT kernel, providing a Unix-like environment + with a tighter kernel integration than available with + Cygwin. It is part of the Windows Services for Unix + package, available for free for any licensed copy of + Windows 2000, XP, or 2003. SFU can be downloaded from + <a href="http://www.microsoft.com/windows/sfu/" target= + "_top">http://www.microsoft.com/windows/sfu/</a>.</p> + + <p>Services for Unix 3.5, current as of this writing, + has been tested. 3.0 or 3.1 may work, but are not + officially supported. (The main difference in 3.0/3.1 + is lack of pthreads.)</p> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name= + "platform.interix-sfu-install" id= + "platform.interix-sfu-install"></a>3.2.3.1. When + Installing Interix/SFU</h4> + </div> + </div> + </div> + + <p>At an absolute minimum, the following packages + must be installed from the Windows Services for Unix + 3.5 distribution in order to use pkgsrc:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>Utilities -> Base Utilities</p> + </li> + + <li> + <p>Interix GNU Components -> (all)</p> + </li> + + <li> + <p>Remote Connectivity</p> + </li> + + <li> + <p>Interix SDK</p> + </li> + </ul> + </div> + + <p>When using pkgsrc on Interix, DO NOT install the + Utilities subcomponent "UNIX Perl". That is Perl 5.6 + without shared module support, installed to + /usr/local, and will only cause confusion. Instead, + install Perl 5.8 from pkgsrc (or from a binary + package).</p> + + <p>The Remote Connectivity subcomponent "Windows + Remote Shell Service" does not need to be installed, + but Remote Connectivity itself should be installed in + order to have a working inetd.</p> + + <p>Finally, during installation you may be asked + whether to enable setuid behavior for Interix + programs, and whether to make pathnames default to + case-sensitive. Setuid should be enabled, and + case-sensitivity MUST be enabled. (Without + case-sensitivity, a large number of packages + including perl will not build.)</p> + </div> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name= + "platform.interix-sfu-postinstall" id= + "platform.interix-sfu-postinstall"></a>3.2.3.2. What + to do if Interix/SFU is already installed</h4> + </div> + </div> + </div> + + <p>If SFU is already installed and you wish to alter + these settings to work with pkgsrc, note the + following things.</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>To uninstall UNIX Perl, use Add/Remove + Programs, select Microsoft Windows Services for + UNIX, then click Change. In the installer, + choose Add or Remove, then uncheck + Utilities->UNIX Perl.</p> + </li> + + <li> + <p>To enable case-sensitivity for the + filesystem, run REGEDIT.EXE, and change the + following registry key:</p> + + <p> + HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session + Manager\kernel</p> + + <p>Set the DWORD value "obcaseinsensitive" to + 0; then reboot.</p> + </li> + + <li> + <p>To enable setuid binaries (optional), run + REGEDIT.EXE, and change the following registry + key:</p> + + <p> + HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Services + for UNIX</p> + + <p>Set the DWORD value "EnableSetuidBinaries" + to 1; then reboot.</p> + </li> + </ul> + </div> + </div> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name= + "platform.interix-notes" id= + "platform.interix-notes"></a>3.2.3.3. Important + notes for using pkgsrc</h4> + </div> + </div> + </div> + + <p>The package imanager (either the pkgsrc "su" user, + or the user running "pkg_add") must be a member of + the local Administrators group. Such a user must also + be used to run the bootstrap. This is slightly + relaxed from the normal pkgsrc requirement of + "root".</p> + + <p>The package manager should use a umask of 002. + "make install" will automatically complain if this is + not the case. This ensures that directories written + in /var/db/pkg are Administrators-group + writeable.</p> + + <p>The popular Interix binary packages from + http://www.interopsystems.com/ use an older version + of pkgsrc's pkg_* tools. Ideally, these should NOT be + used in conjunction with pkgsrc. If you choose to use + them at the same time as the pkgsrc packages, ensure + that you use the proper pkg_* tools for each type of + binary package.</p> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2496488" id= + "id2496488"></a>3.2.4. IRIX</h3> + </div> + </div> + </div> + + <p>You will need a working C compiler, either gcc or + SGI's MIPS and MIPSpro compiler (cc/c89). Please set + the <tt class="varname">CC</tt> environment variable + according to your preference. If you do not have a + license for the MIPSpro compiler suite, you can + download a gcc tardist file from <a href= + "http://freeware.sgi.com/" target= + "_top">http://freeware.sgi.com/</a>.</p> + + <p>Please note that you will need IRIX 6.5.17 or + higher, as this is the earliest version of IRIX + providing support for if_indextoname(3), + if_nametoindex(3), etc.</p> + + <p>At this point in time, pkgsrc only supports one ABI. + That is, you can not switch between the old 32-bit ABI, + the new 32-bit ABI and the 64-bit ABI. If you start out + using "abi=n32", that's what all your packages will be + built with.</p> + + <p>Therefore, please make sure that you have no + conflicting <tt class="varname">CFLAGS</tt> in your + environment or the <tt class= + "filename">/etc/mk.conf</tt>. Particularly, make sure + that you do not try to link n32 object files with lib64 + or vice versa. Check your <tt class= + "filename">/etc/compiler.defaults</tt>!</p> + + <p>If you have the actual pkgsrc tree mounted via NFS + from a different host, please make sure to set + <tt class="varname">WRKOBJDIR</tt> to a local + directory, as it appears that IRIX linker occasionally + runs into issues when trying to link over a network + mounted filesystem.</p> + + <p>The bootstrapping process should set all the right + options for programs such as imake(1), but you may want + to set some options depending on your local setup. + Please see <tt class= + "filename">pkgsrc/mk/bsd.pkg.defaults.mk</tt> and, of + course, your compilers man pages for details.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2496605" id= + "id2496605"></a>3.2.5. OpenBSD</h3> + </div> + </div> + </div> + + <p>OpenBSD 3.0 and 3.2 are tested and supported.</p> + + <p>Care should be taken so that the tools that this kit + installs do not conflict with the OpenBSD userland + tools. There are several steps:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>OpenBSD stores its ports pkg database in + <tt class="filename">/var/db/pkg</tt>. It is + therefore recommended that you choose a different + location (e.g. <tt class= + "filename">/usr/pkgdb</tt>) by using the + --pkgdbdir option to the bootstrap script.</p> + </li> + + <li> + <p>If you do not intend to use the OpenBSD ports + tools, it's probably a good idea to move them out + of the way to avoid confusion, e.g.</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd /usr/sbin</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mv pkg_add pkg_add.orig</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mv pkg_create pkg_create.orig</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mv pkg_delete pkg_delete.orig</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mv pkg_info pkg_info.orig</tt></b> +</pre> + </li> + + <li> + <p>An example <tt class= + "filename">/etc/mk.conf</tt> file will be placed + in <tt class="filename">/etc/mk.conf.example</tt> + file when you use the bootstrap script. OpenBSD's + make program uses <tt class= + "filename">/etc/mk.conf</tt> as well. You can + work around this by enclosing all the pkgsrc + specific parts of the file with:</p> + <pre class="programlisting"> +.ifdef BSD_PKG_MK +# pkgsrc stuff, e.g. insert bsd.pkg.defaults.mk or similar here +.else +# OpenBSD stuff +.endif +</pre> + </li> + </ol> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2496786" id= + "id2496786"></a>3.2.6. Solaris</h3> + </div> + </div> + </div> + + <p>Solaris 2.6 through 9 are supported on both x86 and + sparc. You will need a working C compiler. Both gcc + 2.95.3 and Sun WorkShop 5 have been tested.</p> + + <p>The following packages are required on Solaris 8 for + the bootstrap process and to build packages.</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>SUNWsprot</p> + </li> + + <li> + <p>SUNWarc</p> + </li> + + <li> + <p>SUNWbtool</p> + </li> + + <li> + <p>SUNWtoo</p> + </li> + + <li> + <p>SUNWlibm</p> + </li> + </ul> + </div> + + <p>Please note the use of GNU binutils on Solaris is + <span class="emphasis"><em>not</em></span> + supported.</p> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name="id2496817" id= + "id2496817"></a>3.2.6.1. If you are using + gcc</h4> + </div> + </div> + </div> + + <p>It makes life much simpler if you only use the + same gcc consistently for building all packages.</p> + + <p>It is recommended that an external gcc be used + only for bootstrapping, then either build gcc from + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" + href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/lang/gcc/README.html" + class="pkgname">lang/gcc</a> or install a binary gcc + package, then remove gcc used during + bootstrapping.</p> + + <p>Binary packages of gcc can be found through + <a href= + "http://www.sun.com/bigadmin/common/freewareSearch.html" + target= + "_top">http://www.sun.com/bigadmin/common/freewareSearch.html</a>.</p> + </div> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name="id2496838" id= + "id2496838"></a>3.2.6.2. If you are using + Sun WorkShop</h4> + </div> + </div> + </div> + + <p>You will need at least the following packages + installed (from WorkShop 5.0)</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>SPROcc - Sun WorkShop Compiler C 5.0</p> + </li> + + <li> + <p>SPROcpl - Sun WorkShop Compiler C++ 5.0</p> + </li> + + <li> + <p>SPROild - Sun WorkShop Incremental + Linker</p> + </li> + + <li> + <p>SPROlang - Sun WorkShop Compilers common + components</p> + </li> + </ul> + </div> + + <p>You should set <tt class="varname">CC</tt>, + <tt class="varname">CXX</tt> and optionally, + <tt class="varname">CPP</tt> in <tt class= + "filename">/etc/mk.conf</tt>, eg.</p> + <pre class="programlisting"> +CC= cc +CXX= CC +CPP= /usr/ccs/lib/cpp +</pre> + + <p>You may also want to build 64-bit binaries, + eg.</p> + <pre class="programlisting"> +CFLAGS= -xtarget=ultra -xarch=v9 +</pre> + + <p>Whichever compiler you use, please ensure the + compiler tools and your $prefix are in your + <tt class="varname">PATH</tt>. This includes + <tt class="filename">/usr/ccs/{bin,lib}</tt> and eg. + <tt class="filename">/usr/pkg/{bin,sbin}</tt>.</p> + </div> + </div> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="using" id= + "using"></a>Chapter 4. Using pkgsrc</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#getting-started">4.1. + Working with binary packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href="#id2496922">4.1.1. + Where to get binary packages</a></span></dt> + + <dt><span class="sect2"><a href="#id2496963">4.1.2. + How to use binary packages</a></span></dt> + + <dt><span class="sect2"><a href="#id2497165">4.1.3. + A word of warning</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2497177">4.2. + Building packages from source</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href="#id2497187">4.2.1. + Requirements</a></span></dt> + + <dt><span class="sect2"><a href="#id2497275">4.2.2. + Fetching distfiles</a></span></dt> + + <dt><span class="sect2"><a href="#id2497328">4.2.3. + How to build and install</a></span></dt> + + <dt><span class="sect2"><a href="#id2498259">4.2.4. + Selecting the compiler</a></span></dt> + </dl> + </dd> + </dl> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "getting-started" id= + "getting-started"></a>4.1. Working with binary + packages</h2> + </div> + </div> + </div> + + <p>This section describes how to find, retrieve and + install a precompiled binary package that someone else + already prepared for your type of machine.</p> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2496922" id= + "id2496922"></a>4.1.1. Where to get binary + packages</h3> + </div> + </div> + </div> + + <p>Precompiled packages are stored on ftp.NetBSD.org + and its mirrors in the directory <tt class= + "filename">/pub/NetBSD/packages</tt> for anonymous FTP + access. Please pick the right subdirectory there as + indicated by <span><b class="command">uname + -p</b></span>. In that directory, there is a + subdirectory for each category plus a subdirectory + <tt class="filename">All</tt> which includes the actual + binaries in <tt class="filename">.tgz</tt> files. The + category subdirectories use symbolic links to those + files (this is the same directory layout as in + <tt class="filename">/usr/pkgsrc/packages</tt>).</p> + + <p>This same directory layout applies for CDROM + distributions, only that the directory may be rooted + somewhere else, probably somewhere below <tt class= + "filename">/cdrom</tt>. Please consult your CDROMs + documentation for the exact location.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2496963" id= + "id2496963"></a>4.1.2. How to use binary + packages</h3> + </div> + </div> + </div> + + <p>If you have the files on a CDROM or downloaded them + to your hard disk, youcan install them with the + following command (be sure to<span><b class= + "command">su</b></span> to root first):</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>pkg_add /path/to/package.tgz</tt></b> +</pre> + + <p>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 <span><b class= + "command">pkg_add</b></span> an FTP URL:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>pkg_add ftp://ftp.NetBSD.org/pub/NetBSD/packages/<OSvers>/<arch>/All/package.tgz</tt></b> +</pre> + + <p>If there is any doubt, the uname utility can be used + to determine the <OSvers>, and <arch> by + running <span><b class="command">uname + -rp</b></span>.</p> + + <p>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.</p> + + <p>After you've installed packages, be sure to have + <tt class="filename">/usr/pkg/bin</tt> in your + <tt class="varname">PATH</tt> so you can actually start + the just installed program.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2497165" id= + "id2497165"></a>4.1.3. A word of + warning</h3> + </div> + </div> + </div> + + <p>Please pay very careful attention to the warnings + expressed in the <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a> 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.</p> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2497177" id="id2497177"></a>4.2. Building + packages from source</h2> + </div> + </div> + </div> + + <p>This assumes that the package is already in pkgsrc. If + it is not, see <a href="#developers-guide" title= + "Part II. pkgsrc developer's guide">Part II, + “pkgsrc developer's guide”</a>.</p> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2497187" id= + "id2497187"></a>4.2.1. Requirements</h3> + </div> + </div> + </div> + + <p>To build packages from source on a NetBSD system the + “<span class="quote">comp</span>” and the + “<span class="quote">text</span>” + distribution sets must be installed. If you want to + build X11 related packages the “<span class= + "quote">xbase</span>” and “<span class= + "quote">xcomp</span>” distribution sets are + required, too.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2497275" id= + "id2497275"></a>4.2.2. Fetching + distfiles</h3> + </div> + </div> + </div> + + <p>The distfile (i.e. the unmodified source) must exist + on your system for the packages system to be able to + build it. If it does not exist, pkgsrc will use + <a href="http://netbsd.gw.com/cgi-bin/man-cgi?ftp+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">ftp</span>(1)</span></a> to fetch it + automatically.</p> + + <p>You can overwrite some of the major distribution + sites to fit to sites that are close to your own. Have + a look at <tt class= + "filename">pkgsrc/mk/bsd.pkg.defaults.mk</tt> to find + some examples - in particular, look for the <tt class= + "varname">MASTER_SORT</tt>, <tt class= + "varname">MASTER_SORT_REGEX</tt> and <tt class= + "varname">INET_COUNTRY</tt> definitions. This may save + some of your bandwidth and time.</p> + + <p>You can change these settings either in your shell's + environment, or, if you want to keep the settings, by + editing the <tt class="filename">/etc/mk.conf</tt> + file, and adding the definitions there.</p> + + <p>If you don't have a permanent Internet connection + and you want to know which files to download, + <span><b class="command">make fetch-list</b></span> + will tell you what you'll need. Put these distfiles + into <tt class= + "filename">/usr/pkgsrc/distfiles</tt>.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2497328" id= + "id2497328"></a>4.2.3. How to build and + install</h3> + </div> + </div> + </div> + + <p>Assuming that the distfile has been fetched (see + previous section), become root and change into the + relevant directory and running <span><b class= + "command">make</b></span>. For example, type</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cd misc/figlet</tt></b> +<tt class="prompt">%</tt> <b class="userinput"><tt>make</tt></b> +</pre> + + <p>at the shell prompt to build the various components + of the package, and</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make install</tt></b> +</pre> + + <p>to install the various components into the correct + places on your system. Installing the package on your + system requires you to be root. However, pkgsrc has a + <span class="emphasis"><em>just-in-time-su</em></span> + feature, which allows you to only become root for the + actual installation step</p> + + <p>Taking the figlet utility as an example, we can + install it on our system by building as shown in + <a href="#logs" title= + "Appendix B. Build logs">Appendix B, <i>Build + logs</i></a>.</p> + + <p>The program is installed under the default root of + the packages tree - <tt class="filename">/usr/pkg</tt>. + Should this not conform to your tastes, set the + <tt class="varname">LOCALBASE</tt> variable in your + environment, and it will use that value as the root of + your packages tree. So, to use <tt class= + "filename">/usr/local</tt>, set <tt class= + "varname">LOCALBASE=/usr/local</tt> in your + environment. Please note that you should use a + directory which is dedicated to packages and not shared + with other programs (ie, do not try and use <tt class= + "varname">LOCALBASE=/usr</tt>). Also, you should not + try to add any of your own files or directories (such + as <tt class="filename">src/</tt>, <tt class= + "filename">obj/</tt>, or <tt class= + "filename">pkgsrc/</tt>) below the <tt class= + "varname">LOCALBASE</tt> 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.</p> + + <p>Some packages look in <tt class= + "filename">/etc/mk.conf</tt> to alter some + configuration options at build time. Have a look at + <tt class="filename">pkgsrc/mk/bsd.pkg.defaults.mk</tt> + to get an overview of what will be set there by + default. Environment variables such as <tt class= + "varname">LOCALBASE</tt> can be set in <tt class= + "filename">/etc/mk.conf</tt> to save having to remember + to set them each time you want to use pkgsrc.</p> + + <p>Occasionally, people want to “<span class= + "quote">look under the covers</span>” 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.</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>If you invoke the <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">make</span>(1)</span></a> command + with <tt class="varname">PKG_DEBUG_LEVEL=2</tt>, + then a huge amount of information will be + displayed. For example,</p> + <pre class="screen"> +<b class="userinput"><tt>make patch PKG_DEBUG_LEVEL=2</tt></b> +</pre> + + <p>will show all the commands that are invoked, + up to and including the “<span class= + "quote">patch</span>” stage.</p> + </li> + + <li> + <p>If you want to know the value of a certain + make(1) definition, then the <tt class= + "varname">VARNAME</tt> definition should be used, + in conjunction with the show-var target. e.g. to + show the expansion of the <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">make</span>(1)</span></a> + variable <tt class="varname">DISTFILES</tt>:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>make show-var VARNAME=LOCALBASE</tt></b> +/usr/pkg +<tt class="prompt">%</tt> + +</pre> + </li> + </ol> + </div> + + <p>If you want to install a binary package that you've + either created yourself (see next section), that you + put into pkgsrc/packages manually or that is located on + a remote FTP server, you can use the the "bin-install" + target. This target will install a binary package - if + available - via <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a>, else do a + <span><b class="command">make package</b></span>. The + list of remote FTP sites searched is kept in the + variable <tt class="varname">BINPKG_SITE</tt>, which + defaults to ftp.NetBSD.org. Any flags that should be + added to <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a> can be put + into <tt class="varname">BIN_INSTALL_FLAGS</tt>. See + <tt class="filename">pkgsrc/mk/bsd.pkg.defaults.mk</tt> + for more details.</p> + + <p>A final word of warning: If you setup a system that + has a non-standard setting for <tt class= + "varname">LOCALBASE</tt>, 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 <tt class="varname">LOCALBASE</tt> of + <tt class="filename">/usr/pkg</tt>, and that you should + <span class="emphasis"><em>not</em></span> install any + if you use a non-standard <tt class= + "varname">LOCALBASE</tt>.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2498259" id= + "id2498259"></a>4.2.4. Selecting the + compiler</h3> + </div> + </div> + </div> + + <p>By default, pkgsrc will use GCC to build packages. + This may be overridden by setting the following + variables in /etc/mk.conf:</p> + + <div class="variablelist"> + <dl> + <dt><span class="term"><tt class= + "varname">PKGSRC_COMPILER</tt>:</span></dt> + + <dd> + <p>This is a list of values specifying the chain + of compilers to invoke when building packages. + Valid values are:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="varname">distcc</tt>: + distributed C/C++ (chainable)</p> + </li> + + <li> + <p><tt class="varname">ccache</tt>: + compiler cache (chainable)</p> + </li> + + <li> + <p><tt class="varname">gcc</tt>: GNU C/C++ + Compiler</p> + </li> + + <li> + <p><tt class="varname">mipspro</tt>: + Silicon Graphics, Inc. MIPSpro + (n32/n64)</p> + </li> + + <li> + <p><tt class="varname">mipspro</tt>: + Silicon Graphics, Inc. MIPSpro (o32)</p> + </li> + + <li> + <p><tt class="varname">sunpro</tt>: + Microsystems, Inc. WorkShip/Forte/Sun ONE + Studio</p> + </li> + </ul> + </div> + + <p>The default is “<span class= + "quote"><tt class= + "varname">gcc</tt></span>”. You can use + <tt class="varname">ccache</tt> and/or <tt class= + "varname">distcc</tt> with an appropriate + <tt class="varname">PKGSRC_COMPILER</tt> setting, + e.g. “<span class="quote"><tt class= + "varname">ccache gcc</tt></span>”. This + variable should always be terminated with a value + for a real compiler.</p> + </dd> + + <dt><span class="term"><tt class= + "varname">GCC_REQD</tt>:</span></dt> + + <dd> + <p>This specifies the minimum version of GCC to + use when building packages. If the system GCC + doesn't satisfy this requirement, then pkgsrc + will build and install one of the GCC packages to + use instead.</p> + </dd> + </dl> + </div> + </div> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="binary" id= + "binary"></a>Chapter 5. Creating binary + packages</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2498413">5.1. + Building a single binary package</a></span></dt> + + <dt><span class="sect1"><a href="#id2563208">5.2. + Settings for creation of binary + packages</a></span></dt> + + <dt><span class="sect1"><a href="#bulkbuild">5.3. Doing + a bulk build of all packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#binary.configuration">5.3.1. + Configuration</a></span></dt> + + <dt><span class="sect2"><a href="#id2563348">5.3.2. + Other environmental considerations</a></span></dt> + + <dt><span class="sect2"><a href="#id2563388">5.3.3. + Operation</a></span></dt> + + <dt><span class="sect2"><a href="#id2563595">5.3.4. + What it does</a></span></dt> + + <dt><span class="sect2"><a href="#id2563652">5.3.5. + Disk space requirements</a></span></dt> + + <dt><span class="sect2"><a href="#id2563678">5.3.6. + Setting up a sandbox for chroot'ed + builds</a></span></dt> + + <dt><span class="sect2"><a href="#id2564042">5.3.7. + Building a partial set of packages</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2564085">5.4. + Creating a multiple CD-ROM packages + collection</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href="#id2564168">5.4.1. + Example of cdpack</a></span></dt> + </dl> + </dd> + </dl> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2498413" id="id2498413"></a>5.1. Building a + single binary package</h2> + </div> + </div> + </div> + + <p>Once you have built and installed a package, you can + create a <span class="emphasis"><em>binary + package</em></span> which can be installed on another + system with <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a> This saves + having to build the same package on a group of hosts and + wasting CPU time. It also provides a simple means for + others to install your package, should you distribute + it.</p> + + <p>To create a binary package, change into the + appropriate directory in pkgsrc, and run <span><b class= + "command">make package</b></span>:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd misc/figlet</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make package</tt></b> +</pre> + + <p>This will build and install your package (if not + already done), and then build a binary package from what + was installed. You can then use the <span><b class= + "command">pkg_*</b></span> tools to manipulate it. Binary + packages are created by default in <tt class= + "filename">/usr/pkgsrc/packages</tt>, in the form of a + gzipped tar file. See <a href="#logs.package" title= + "B.2. Packaging figlet">Section B.2, + “Packaging figlet”</a> for a continuation of + the above <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/misc/figlet/README.html" + class="pkgname">misc/figlet</a> example.</p> + + <p>See <a href="#submit" title= + "Chapter 14. Submitting and Committing">Chapter + 14, <i>Submitting and Committing</i></a> for information + on how to submit such a binary package.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2563208" id="id2563208"></a>5.2. Settings + for creation of binary packages</h2> + </div> + </div> + </div> + + <p>See <a href="#build.helpful-targets" title= + "11.3. Other helpful targets">Section 11.3, + “Other helpful targets”</a>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "bulkbuild" id="bulkbuild"></a>5.3. Doing a + bulk build of all packages</h2> + </div> + </div> + </div> + + <p>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 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 <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?ftpd+8+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">ftpd</span>(8)</span></a> 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.</p> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="binary.configuration" + id= + "binary.configuration"></a>5.3.1. Configuration</h3> + </div> + </div> + </div> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name="binary.mk.conf" id= + "binary.mk.conf"></a>5.3.1.1. /etc/mk.conf</h4> + </div> + </div> + </div> + + <p>You may want to set things in <tt class= + "filename">/etc/mk.conf</tt>. Look at <tt class= + "filename">pkgsrc/mk/bsd.pkg.defaults.mk</tt> for + details of the default settings. You will want to + ensure that <tt class= + "varname">ACCEPTABLE_LICENSES</tt> meet your local + policy. As used in this example, <tt class= + "varname">_ACCEPTABLE=yes</tt> accepts <span class= + "emphasis"><em>all</em></span> licenses.</p> + <pre class="programlisting"> +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 +</pre> + </div> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name="id2563272" id= + "id2563272"></a>5.3.1.2. <tt class= + "filename">build.conf</tt></h4> + </div> + </div> + </div> + + <p>In <tt class="filename">pkgsrc/mk/bulk</tt>, copy + <tt class="filename">build.conf-example</tt> to + <tt class="filename">build.conf</tt> 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 to, where your pkgsrc tree is located and + which user to <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?su+8+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">su</span>(8)</span></a> to to do a + <span><b class="command">cvs update</b></span>.</p> + </div> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name="id2563308" id= + "id2563308"></a>5.3.1.3. <tt class= + "filename">pre-build.local</tt></h4> + </div> + </div> + </div> + + <p>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 <tt class= + "filename">pre-build.local</tt> exists in <tt class= + "filename">/usr/pkgsrc/mk/bulk</tt> it will be + executed (as a sh(1) script) at the end of the usual + pre-build stage. An example use of <tt class= + "filename">pre-build.local</tt> is to have the + line:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>echo "I do not have enough disk space to build this pig." \ + > pkgsrc/games/crafty-book-enormous/$BROKENF</tt></b> +</pre> + + <p>to prevent the system from trying to build a + particular package which requires nearly 3 GB of disk + space.</p> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2563348" id= + "id2563348"></a>5.3.2. Other environmental + considerations</h3> + </div> + </div> + </div> + + <p>As <tt class="filename">/usr/pkg</tt> will be + completely deleted at the start of bulk builds, make + sure your login shell is placed somewhere else. Either + drop it into <tt class="filename">/usr/local/bin</tt> + (and adjust your login shell in the passwd file), or + (re-)install it via <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a> from + <tt class="filename">/etc/rc.local</tt>, 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 NetBSD earlier than 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 + <tt class="filename">rc.local</tt>:</p> + <pre class="programlisting"> +( cd /usr/pkgsrc/security/ssh ; make bulk-install ) +if [ -f /usr/pkg/etc/rc.d/sshd ]; then + /usr/pkg/etc/rc.d/sshd +fi +</pre> + + <p>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! :)</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2563388" id= + "id2563388"></a>5.3.3. Operation</h3> + </div> + </div> + </div> + + <p>Make sure you don't need any of the packages still + installed.</p> + + <div class="warning" style= + "margin-left: 0.5in; margin-right: 0.5in;"> + <h3 class="title">Warning</h3> + + <p>During the bulk build, <span class= + "emphasis"><em>all packages will be + removed!</em></span></p> + </div> + + <p>Be sure to remove all other things that might + interfere with builds, like some libs installed in + <tt class="filename">/usr/local</tt>, etc. then become + root and type:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd /usr/pkgsrc</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>sh mk/bulk/build</tt></b> +</pre> + + <p>If for some reason your last build didn't complete + (power failure, system panic, ...), you can continue it + by running:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>sh mk/bulk/build restart</tt></b> +</pre> + + <p>At the end of the bulk build, you will get a summary + via mail, and find build logs in the directory + specified by <tt class="varname">FTP</tt> in the + <tt class="filename">build.conf</tt> file.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2563595" id= + "id2563595"></a>5.3.4. What it does</h3> + </div> + </div> + </div> + + <p>The bulk builds consist of three steps:</p> + + <div class="variablelist"> + <dl> + <dt><span class="term">1. pre-build</span></dt> + + <dd> + <p>The script updates your pkgsrc tree via + (anon)cvs, then cleans out any broken distfiles, + and removes all packages installed.</p> + </dd> + + <dt><span class="term">2. the bulk + build</span></dt> + + <dd> + <p>This is basically “<span class= + "quote">make bulk-package</span>” 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 + dependencies will be built later.</p> + </dd> + + <dt><span class="term">3. post-build</span></dt> + + <dd> + <p>Generates a report that's placed in the + directory specified in the <tt class= + "filename">build.conf</tt> file named <tt class= + "filename">broken.html</tt>, a short version of + that report will also be mailed to the build's + admin.</p> + </dd> + </dl> + </div> + + <p>During the build, a list of broken packages will be + compiled in <tt class= + "filename">/usr/pkgsrc/.broken</tt> (or <tt class= + "filename">.../.broken.${MACHINE}</tt> if <tt class= + "varname">OBJMACHINE</tt> 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.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2563652" id= + "id2563652"></a>5.3.5. Disk space + requirements</h3> + </div> + </div> + </div> + + <p>Currently, roughly the following requirements are + valid for NetBSD 2.0/i386:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>10 GB - distfiles (NFS ok)</p> + </li> + + <li> + <p>8 GB - full set of all binaries (NFS ok)</p> + </li> + + <li> + <p>5 GB - temp space for compiling (local disk + recommended)</p> + </li> + </ul> + </div> + + <p>Note that all pkgs will be de-installed as soon as + they are turned into a binary package, and that sources + are removed, so there is no excessively huge demand to + disk space. Afterwards, if the package is needed again, + it will be installed via <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a> instead of + building again, so there are no cycles wasted by + recompiling.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2563678" id= + "id2563678"></a>5.3.6. Setting up a sandbox + for chroot'ed builds</h3> + </div> + </div> + </div> + + <p>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.</p> + + <p>The first step to do so is setting up a chroot + sandbox, e.g. <tt class="filename">/usr/sandbox</tt>. + After extracting all the sets from a NetBSD + installation or doing a <span><b class="command">make + distribution DESTDIR=/usr/sandbox</b></span> in + <tt class="filename">/usr/src/etc</tt>, be sure the + following items are present and properly + configured:</p> + + <div class="procedure"> + <ol type="1"> + <li> + <p>Kernel</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cp /netbsd /usr/sandbox</tt></b> +</pre> + </li> + + <li> + <p><tt class="filename">/dev/*</tt></p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd /usr/sandbox/dev ; sh MAKEDEV all</tt></b> +</pre> + </li> + + <li> + <p><tt class="filename">/etc/resolv.conf</tt> + (for <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/security/smtpd/README.html" + class="pkgname">security/smtpd</a> and mail):</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cp /etc/resolv.conf /usr/sandbox/etc</tt></b> +</pre> + </li> + + <li> + <p>Working(!) mail config (hostname, + sendmail.cf):</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cp /etc/mail/sendmail.cf /usr/sandbox/etc/mail</tt></b> +</pre> + </li> + + <li> + <p><tt class="filename">/etc/localtime</tt> (for + <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/security/smtpd/README.html" + class="pkgname">security/smtpd</a>):</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>ln -sf /usr/share/zoneinfo/UTC /usr/sandbox/etc/localtime</tt></b> +</pre> + </li> + + <li> + <p><tt class="filename">/usr/src</tt> (system + sources, for <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/sysutils/aperture/README.html" + class="pkgname">sysutils/aperture</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/net/ppp-mppe/README.html" + class="pkgname">net/ppp-mppe</a>):</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>ln -s ../disk1/cvs .</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>ln -s cvs/src-1.6 src</tt></b> +</pre> + </li> + + <li> + <p>Create <tt class="filename">/var/db/pkg</tt> + (not part of default install):</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mkdir /usr/sandbox/var/db/pkg</tt></b> +</pre> + </li> + + <li> + <p>Create <tt class="filename">/usr/pkg</tt> (not + part of default install):</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mkdir /usr/sandbox/usr/pkg</tt></b> +</pre> + </li> + + <li> + <p>Checkout pkgsrc via cvs into <tt class= + "filename">/usr/sandbox/usr/pkgsrc</tt>:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd /usr/sandbox/usr</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -d -P pkgsrc</tt></b> +</pre> + + <p>Do not mount/link this to the copy of your + pkgsrc tree you do development in, as this will + likely cause problems!</p> + </li> + + <li> + <p>Make <tt class= + "filename">/usr/sandbox/usr/pkgsrc/packages</tt> + and <tt class="filename">.../distfiles</tt> point + somewhere appropriate. NFS- and/or nullfs-mounts + may come in handy!</p> + </li> + + <li> + <p>Edit <tt class="filename">/etc/mk.conf</tt>, + see <a href="#binary.mk.conf" title= + "5.3.1.1. /etc/mk.conf">Section 5.3.1.1, + “/etc/mk.conf”</a>.</p> + </li> + + <li> + <p>Adjust <tt class= + "filename">mk/bulk/build.conf</tt> to suit your + needs.</p> + </li> + + <li> + <p>If you have set <tt class= + "varname">CVS_USER</tt> in <tt class= + "filename">build.conf</tt>, make sure that + account exists and can do a <span><b class= + "command">cvs ${CVS_FLAGS} update</b></span> + properly!</p> + </li> + </ol> + </div> + + <p>When the chroot sandbox is setup, you can start the + build with the following steps:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd /usr/sandbox/usr/pkgsrc</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>sh mk/bulk/do-sandbox-build</tt></b> +</pre> + + <p>This will just jump inside the sandbox and start + building. At the end of the build, mail will be sent + with the results of the build. Created binary pkgs will + be in <tt class= + "filename">/usr/sandbox/usr/pkgsrc/packages</tt> + (wherever that points/mounts to/from).</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2564042" id= + "id2564042"></a>5.3.7. Building a partial + set of packages</h3> + </div> + </div> + </div> + + <p>In addition to building a complete set of all + packages in pkgsrc, the <tt class= + "filename">pkgsrc/mk/bulk/build</tt> script may be used + to build a subset of the packages contained in pkgsrc. + By setting defining <tt class= + "varname">SPECIFIC_PKGS</tt> in <tt class= + "filename">/etc/mk.conf</tt>, the variables</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>SITE_SPECIFIC_PKGS</p> + </li> + + <li> + <p>HOST_SPECIFIC_PKGS</p> + </li> + + <li> + <p>GROUP_SPECIFIC_PKGS</p> + </li> + + <li> + <p>USER_SPECIFIC_PKGS</p> + </li> + </ul> + </div> + + <p>will define the set of packages which should be + built. The bulk build code will also include any + packages which are needed as dependencies for the + explicitly listed packages.</p> + + <p>One use of this is to do a bulk build with + <tt class="varname">SPECIFIC_PKGS</tt> in a chroot + sandbox periodically to have a complete set of the + binary packages needed for your site available without + the overhead of building extra packages that are not + needed.</p> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564085" id="id2564085"></a>5.4. Creating a + multiple CD-ROM packages collection</h2> + </div> + </div> + </div> + + <p>After your pkgsrc bulk-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 <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/cdpack/README.html" + class="pkgname">pkgtools/cdpack</a> package provides a + simple tool for creating the ISO 9660 images. + <span><b class="command">cdpack</b></span> arranges the + packages on the CD-ROMs in a way that keeps all the + dependencies for given package on the same CD as that + package.</p> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2564168" id= + "id2564168"></a>5.4.1. Example of + cdpack</h3> + </div> + </div> + </div> + + <p>Complete documentation for cdpack is found in the + cdpack(1) manpage. The following short example assumes + that the binary packages are left in <tt class= + "filename">/usr/pkgsrc/packages/All</tt> and that + sufficient disk space exists in <tt class= + "filename">/u2</tt> to hold the ISO 9660 images.</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mkdir /u2/images</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>pkg_add /usr/pkgsrc/packages/All/cdpack</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cdpack /usr/pkgsrc/packages/All /u2/images</tt></b> +</pre> + + <p>If you wish to include a common set of files + (<tt class="filename">COPYRIGHT</tt>, <tt class= + "filename">README</tt>, etc.) on each CD in the + collection, then you need to create a directory which + contains these files. e.g.</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mkdir /tmp/common</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>echo "This is a README" > /tmp/common/README</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>echo "Another file" > /tmp/common/COPYING</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mkdir /tmp/common/bin</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>echo "#!/bin/sh" > /tmp/common/bin/myscript</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>echo "echo Hello world" >> /tmp/common/bin/myscript</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>chmod 755 /tmp/common/bin/myscript</tt></b> +</pre> + + <p>Now create the images:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cdpack -x /tmp/common /usr/pkgsrc/packages/All /u2/images</tt></b> +</pre> + + <p>Each image will contain <tt class= + "filename">README</tt>, <tt class= + "filename">COPYING</tt>, and <tt class= + "filename">bin/myscript</tt> in their root + directories.</p> + </div> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="faq" id= + "faq"></a>Chapter 6. Frequently Asked + Questions</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2564359">6.1. Is + there a mailing list for pkg-related + discussion?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564457">6.2. + Where's the pkgviews documentation?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564470">6.3. + Utilities for package management + (pkgtools)</a></span></dt> + + <dt><span class="sect1"><a href="#id2564695">6.4. How + to use pkgsrc as non-root</a></span></dt> + + <dt><span class="sect1"><a href="#id2564707">6.5. How + can I install/use XFree86 from pkgsrc?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564803">6.6. How + can I install/use X.org from pkgsrc?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564830">6.7. How + to fetch files from behind a firewall</a></span></dt> + + <dt><span class="sect1"><a href="#id2564844">6.8. How + do I tell make fetch to do passive FTP?</a></span></dt> + + <dt><span class="sect1"><a href="#id2564896">6.9. How + to fetch all distfiles at once</a></span></dt> + + <dt><span class="sect1"><a href="#id2565104">6.10. What + does Don't know how to make /usr/share/tmac/tmac.andoc + mean?</a></span></dt> + + <dt><span class="sect1"><a href="#id2565142">6.11. What + does Could not find bsd.own.mk mean?</a></span></dt> + + <dt><span class="sect1"><a href="#id2565200">6.12. + Using 'sudo' with pkgsrc</a></span></dt> + + <dt><span class="sect1"><a href="#faq.conf">6.13. + Configuration files handling and + placement</a></span></dt> + + <dt><span class="sect1"><a href="#audit-packages">6.14. + Automated security checks</a></span></dt> + </dl> + </div> + + <p>This section contains hints, tips & tricks on + special things in pkgsrc that we didn't find a better place + for in the previous chapters, and it contains items for + both pkgsrc users and developers.</p> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564359" id="id2564359"></a>6.1. Is there a + mailing list for pkg-related discussion?</h2> + </div> + </div> + </div> + + <p>Yes, <tt class="email"><<a href= + "mailto:tech-pkg@NetBSD.org">tech-pkg@NetBSD.org</a>></tt> + is the list for discussing package related issues. To + subscribe do:</p> + <pre class="programlisting"> +<tt class= +"prompt">%</tt> echo subscribe tech-pkg | mail majordomo@NetBSD.org +</pre> + + <p>An archive of the list is available at <a href= + "http://mail-index.NetBSD.org/tech-pkg/" target= + "_top">http://mail-index.NetBSD.org/tech-pkg/</a>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564457" id="id2564457"></a>6.2. Where's + the pkgviews documentation?</h2> + </div> + </div> + </div> + + <p>Pkgviews is tightly integrated with buildlink. You can + find a pkgviews User's guide in <tt class= + "filename">pkgsrc/mk/buildlink3/PKGVIEWS_UG</tt>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564470" id="id2564470"></a>6.3. Utilities + for package management (pkgtools)</h2> + </div> + </div> + </div> + + <p>The <tt class="filename">pkgsrc/pkgtools</tt> + directory pkgtools contains a number of useful utilities + for both users and developers of pkgsrc. This section + attempts only to make the reader aware of the utilities + and when they might be useful, and not to duplicate the + documentation that comes with each package.</p> + + <p>Utilities used by pkgsrc (automatically installed when + needed):</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/x11-links/README.html" + class="pkgname">pkgtools/x11-links</a>: symlinks + for use by buildlink</p> + </li> + </ul> + </div> + + <p>OS tool augmentation (automatically installed when + needed):</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/digest/README.html" + class="pkgname">pkgtools/digest</a>: calculates + SHA1 checksums (and other kinds)</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/libnbcompat/README.html" + class="pkgname">pkgtools/libnbcompat</a>: compat + library for pkg tools</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/mtree/README.html" + class="pkgname">pkgtools/mtree</a>: installed on + non-BSD systems due to lack of native mtree</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkg_install/README.html" + class="pkgname">pkgtools/pkg_install</a>: + up-to-date replacement for /usr/sbin/pkg_install, + or for use on operating systems where pkg_install + is not present</p> + </li> + </ul> + </div> + + <p>Utilities used by pkgsrc (not automatically + installed):</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkg_tarup/README.html" + class="pkgname">pkgtools/pkg_tarup</a>: create a + binary package from an already-installed package. + used by 'make replace' to save the old package</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/xpkgwedge/README.html" + class="pkgname">pkgtools/xpkgwedge</a>: put X11 + packages someplace else (enabled by default)</p> + </li> + </ul> + </div> + + <p>Utilities for keeping track of installed packages, + being up to date, etc:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkg_chk/README.html" + class="pkgname">pkgtools/pkg_chk</a>: installs + pkg_chk, which reports on packages whose installed + versions do not match the latest pkgsrc entries</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkgdep/README.html" + class="pkgname">pkgtools/pkgdep</a>: makes + dependency graphs of packages, to aid in choosing a + strategy for updating</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkgdepgraph/README.html" + class="pkgname">pkgtools/pkgdepgraph</a>: make + graph from above (uses graphviz)</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkglint/README.html" + class="pkgname">pkgtools/pkglint</a>: This provides + two distinct abilities: check a pkgsrc entry for + correctness (pkglint) check for and remove + out-of-date distfiles and binary packages + (lintpkgsrc)</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkgsurvey/README.html" + class="pkgname">pkgtools/pkgsurvey</a>: report what + packages you have installed</p> + </li> + </ul> + </div> + + <p>Utilities for people maintaining or creating + individual packages:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkgdiff/README.html" + class="pkgname">pkgtools/pkgdiff</a>: automate + making and maintaining patches for a package + (includes pkgdiff, pkgvi, mkpatches, ...)</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/rpm2pkg/README.html" + class="pkgname">pkgtools/rpm2pkg</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/url2pkg/README.html" + class="pkgname">pkgtools/url2pkg</a>: aids in + converting to pkgsrc</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/gensolpkg/README.html" + class="pkgname">pkgtools/gensolpkg</a>: convert + pkgsrc to a Solaris package</p> + </li> + </ul> + </div> + + <p>Utilities for people maintaining pkgsrc (or more + obscure pkg utilities)</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkgconflict/README.html" + class="pkgname">pkgtools/pkgconflict</a>: find + packages that conflict but aren't marked as + such</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkg_comp/README.html" + class="pkgname">pkgtools/pkg_comp</a>: build + packages in a chrooted area</p> + </li> + + <li> + <p><a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/libkver/README.html" + class="pkgname">pkgtools/libkver</a>: spoof kernel + version for chrooted cross builds</p> + </li> + </ul> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564695" id="id2564695"></a>6.4. How to use + pkgsrc as non-root</h2> + </div> + </div> + </div> + + <p>If you want to use pkgsrc as non-root user, you can + set some variables to make pkgsrc work under these + conditions. Please see <a href= + "http://mail-index.NetBSD.org/tech-pkg/2003/09/27/0023.html" + target="_top">this message</a> for more details.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564707" id="id2564707"></a>6.5. How can I + install/use XFree86 from pkgsrc?</h2> + </div> + </div> + </div> + + <p>If you want to use XFree86 from pkgsrc instead of your + system's own X11 (<tt class="filename">/usr/X11R6</tt>, + <tt class="filename">/usr/openwin</tt>, ...), you will + have to add the following lines into <tt class= + "filename">mk.conf</tt>:</p> + <pre class="programlisting"> + X11_TYPE=XFree86 + +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564803" id="id2564803"></a>6.6. How can I + install/use X.org from pkgsrc?</h2> + </div> + </div> + </div> + + <p>If you want to use X.org from pkgsrc instead of your + system's own X11 (<tt class="filename">/usr/X11R6</tt>, + <tt class="filename">/usr/openwin</tt>, ...) you will + have to add the following lines into <tt class= + "filename">mk.conf</tt>:</p> + <pre class="programlisting"> + X11_TYPE=xorg + +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564830" id="id2564830"></a>6.7. How to + fetch files from behind a firewall</h2> + </div> + </div> + </div> + + <p>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 “<span class= + "quote">orpheus.amdahl.com</span>” is one of the + firewalls, and it uses port 80 as the proxy port number. + So the proxy environment variables are:</p> + <pre class="programlisting"> + ftp_proxy=ftp://orpheus.amdahl.com:80/ +http_proxy=http://orpheus.amdahl.com:80/ +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564844" id="id2564844"></a>6.8. How do I + tell <span><b class="command">make fetch</b></span> + to do passive FTP?</h2> + </div> + </div> + </div> + + <p>This depends on which utility is used to retrieve + distfiles. From <tt class="filename">bsd.pkg.mk</tt>, + <tt class="varname">FETCH_CMD</tt> is assigned the first + available command from the following list:</p> + <pre class="programlisting"> +${LOCALBASE}/bin/ftp +/usr/bin/ftp +</pre> + + <p>On a default NetBSD installation, this will be + <tt class="filename">/usr/bin/ftp</tt>, 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 + <tt class="filename">/etc/mk.conf</tt> file: <tt class= + "varname">PASSIVE_FETCH=1</tt>.</p> + + <p>Having that option present will prevent <tt class= + "filename">/usr/bin/ftp</tt> from falling back to active + transfers.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2564896" id="id2564896"></a>6.9. How to + fetch all distfiles at once</h2> + </div> + </div> + </div> + + <p>You would like to download all the distfiles in a + single batch from work or university, where you can't run + a <span><b class="command">make fetch</b></span>. There + is an archive of distfiles on <a href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/distfiles/" + target="_top">ftp.NetBSD.org</a>, but downloading the + entire directory may not be appropriate.</p> + + <p>The answer here is to do a <span><b class= + "command">make fetch-list</b></span> in <tt class= + "filename">/usr/pkgsrc</tt> or one of it's + subdirectories, 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 <tt class="varname">FETCH_CMD</tt> to + something that fetches a URL:</p> + + <p>At home:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cd /usr/pkgsrc</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>make fetch-list FETCH_CMD=wget DISTDIR=/tmp/distfiles >/tmp/fetch.sh</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>scp /tmp/fetch.sh work:/tmp</tt></b> +</pre> + + <p>At work:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>sh /tmp/fetch.sh</tt></b> +</pre> + + <p>then tar up <tt class="filename">/tmp/distfiles</tt> + and take it home.</p> + + <p>If you have a machine running NetBSD, and you want to + get <span class="emphasis"><em>all</em></span> distfiles + (even ones that aren't for your machine architecture), + you can do so by using the above-mentioned + <span><b class="command">make fetch-list</b></span> + approach, or fetch the distfiles directly by running:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>make mirror-distfiles</tt></b> +</pre> + + <p>If you even decide to ignore <tt class= + "varname">NO_{SRC,BIN}_ON_{FTP,CDROM}</tt>, then you can + get everything by running:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>make fetch NO_SKIP=yes</tt></b> +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2565104" id="id2565104"></a>6.10. What does + “<span class="quote">Don't know how to make + /usr/share/tmac/tmac.andoc</span>” mean?</h2> + </div> + </div> + </div> + + <p>When compiling the <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkg_install/README.html" + class="pkgname">pkgtools/pkg_install</a> package, you get + the error from make that it doesn't know how to make + <tt class="filename">/usr/share/tmac/tmac.andoc</tt>? + This indicates that you don't have installed the + “<span class="quote">text</span>” set on your + machine (nroff, ...). It is recommended to do that to + format manpages.</p> + + <p>In the case of the <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkg_install/README.html" + class="pkgname">pkgtools/pkg_install</a> package, you can + get away with setting <tt class="varname">NOMAN=YES</tt> + either in the environment or in <tt class= + "filename">/etc/mk.conf</tt>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2565142" id="id2565142"></a>6.11. What does + “<span class="quote">Could not find + bsd.own.mk</span>” mean?</h2> + </div> + </div> + </div> + + <p>You didn't install the compiler set, <tt class= + "filename">comp.tgz</tt>, when you installed your NetBSD + machine. Please get it and install it, by extracting it + in <tt class="filename">/</tt>:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class="userinput"><tt>cd /</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>tar --unlink -zxvpf .../comp.tgz</tt></b> +</pre> + + <p><tt class="filename">comp.tgz</tt> is part of every + NetBSD release. Get the one that corresponds to your + release (determine via <span><b class="command">uname + -r</b></span>).</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2565200" id="id2565200"></a>6.12. Using + 'sudo' with pkgsrc</h2> + </div> + </div> + </div> + + <p>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 + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/security/sudo/README.html" + class="pkgname">security/sudo</a>) and then put the + following into your <tt class= + "filename">/etc/mk.conf</tt>:</p> + <pre class="programlisting"> + .if exists(/usr/pkg/bin/sudo) + SU_CMD=/usr/pkg/bin/sudo /bin/sh -c + .endif + +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "faq.conf" id= + "faq.conf"></a>6.13. Configuration files + handling and placement</h2> + </div> + </div> + </div> + + <p>The global variable <tt class= + "varname">PKG_SYSCONFBASE</tt> (and some others) can be + set by the system administrator in <tt class= + "filename">/etc/mk.conf</tt> 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 <tt class="filename">$PREFIX/share</tt> should go + there.</p> + + <p>We will take a look at available variables first + (<tt class="filename">bsd.pkg.mk</tt> contains more + information). <tt class="varname">PKG_SYSCONFDIR</tt> is + where the configuration files for a package may be found + (that is, the full path, e.g. <tt class= + "filename">/etc</tt> or <tt class= + "filename">/usr/pkg/etc</tt>). This value may be + customized in various ways:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p><tt class="varname">PKG_SYSCONFBASE</tt> is the + main config directory under which all package + configuration files are to be found. Users will + typically want to set it to <tt class= + "filename">/etc</tt>, or accept the default + location of <tt class= + "filename">$PREFIX/etc</tt>.</p> + </li> + + <li> + <p><tt class="varname">PKG_SYSCONFSUBDIR</tt> is + the subdirectory of <tt class= + "varname">PKG_SYSCONFBASE</tt> under which the + configuration files for a particular package may be + found. Defaults to <tt class= + "varname">${SYSCONFBASE}</tt>.</p> + </li> + + <li> + <p><tt class="varname">PKG_SYSCONFVAR</tt> is the + special suffix used to distinguish any overriding + values for a particular package (see next item). It + defaults to <tt class="varname">${PKGBASE}</tt>, + but for a collection of related packages that + should all have the same <tt class= + "varname">PKG_SYSCONFDIR</tt> value, it can be set + in each of the package Makefiles to a common + value.</p> + </li> + + <li> + <p><tt class= + "varname">PKG_SYSCONFDIR.${PKG_SYSCONFVAR}</tt> + overrides the value of <tt class= + "varname">${PKG_SYSCONFDIR}</tt> for packages with + the same value for <tt class= + "varname">PKG_SYSCONFVAR</tt>.</p> + + <p>As an example, all the various KDE packages may + want to set <tt class="varname">PKG_SYSCONFVAR</tt> + to “<span class="quote">kde</span>” so + admins can set <tt class= + "varname">PKG_SYSCONFDIR.kde</tt> in <tt class= + "filename">/etc/mk.conf</tt> to define where to + install KDE config files.</p> + </li> + </ol> + </div> + + <p>Programs' configuration directory should be defined + during the configure stage. Packages that use GNU + autoconf can usually do this by using the + “<span class="quote">--sysconfdir</span>” + 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 + <tt class="filename">share/examples/${PKGNAME}</tt> so + <tt class="filename">PLIST</tt> can register them.</p> + + <p>Once you have the required configuration files in + place (under the <tt class="filename">share/examples</tt> + directory) the variable <tt class= + "varname">CONF_FILES</tt> should be set to copy them into + <tt class="varname">PKG_SYSCONFDIR</tt>. 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 <tt class= + "filename">PLIST</tt>) 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 + <tt class="filename">INSTALL</tt>/<tt class= + "filename">DEINSTALL</tt> scripts which are created + automatically. The package <tt class= + "filename">Makefile</tt> must also set <tt class= + "varname">USE_PKGINSTALL=YES</tt> to use these + automatically generated scripts. The automatic copying of + config files can be toggled by setting the environment + variable <tt class="varname">PKG_CONFIG</tt> prior to + package installation.</p> + + <p>Here is an example, taken from mail/mutt/Makefile:</p> + <pre class="programlisting"> + EGDIR= ${PREFIX}/share/doc/mutt/samples +CONF_FILES= ${EGDIR}/Muttrc ${PKG_SYSCONFDIR}/Muttrc +</pre> + + <p>As you can see, this package installs configuration + files inside <tt class="varname">EGDIR</tt>, which are + registered by <tt class="filename">PLIST</tt>. After + that, the variable <tt class="varname">CONF_FILES</tt> + lists the installed file first and then the target file. + Users will also get an automatic message when files are + installed using this method.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "audit-packages" id= + "audit-packages"></a>6.14. Automated security + checks</h2> + </div> + </div> + </div> + + <p>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 <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/security/audit-packages/README.html" + class="pkgname">security/audit-packages</a> package. It + has two components:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>“<span class= + "quote">download-vulnerability-list</span>”, + 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:</p> + + <p><a href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/distfiles/pkg-vulnerabilities" + target= + "_top">ftp://ftp.NetBSD.org/pub/NetBSD/packages/distfiles/pkg-vulnerabilities</a></p> + </li> + + <li> + <p>“<span class= + "quote">audit-packages</span>”, 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.</p> + </li> + </ol> + </div> + + <p>Use of the audit-packages package is strongly + recommended!</p> + + <p>The following message is displayed as part of the + audit-packages installation procedure:</p> + <pre class="screen"> +=========================================================================== +$NetBSD: faq.xml,v 1.1.1.1 2004/10/21 14:27:43 grant Exp $ + +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. You may wish to do +this more often than once a day. + +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 + +=========================================================================== + +</pre> + </div> + </div> + </div> + + <div class="part" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h1 class="title"><a name="developers-guide" id= + "developers-guide"></a>pkgsrc developer's guide</h1> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="chapter"><a href="#components">7. + Package components - files, directories and + contents</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href= + "#components.Makefile">7.1. Makefile</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.distinfo">7.2. distinfo</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.patches">7.3. patches/*</a></span></dt> + + <dt><span class="sect1"><a href="#id2566375">7.4. + Other mandatory files</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.optional">7.5. Optional + files</a></span></dt> + + <dt><span class="sect1"><a href="#id2566569">7.6. + work*</a></span></dt> + + <dt><span class="sect1"><a href="#id2566657">7.7. + files/*</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#plist">8. PLIST + issues</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2566711">8.1. RCS + ID</a></span></dt> + + <dt><span class="sect1"><a href="#id2566726">8.2. + Semi-automatic PLIST generation</a></span></dt> + + <dt><span class="sect1"><a href="#print-PLIST">8.3. + Tweaking output of make print-PLIST</a></span></dt> + + <dt><span class="sect1"><a href="#plist.misc">8.4. + Variable substitution in PLIST</a></span></dt> + + <dt><span class="sect1"><a href="#id2567047">8.5. + Manpage-compression</a></span></dt> + + <dt><span class="sect1"><a href="#id2567089">8.6. + Changing PLIST source with PLIST_SRC</a></span></dt> + + <dt><span class="sect1"><a href="#id2567106">8.7. + Platform specific and differing + PLISTs</a></span></dt> + + <dt><span class="sect1"><a href= + "#faq.common-dirs">8.8. Sharing directories between + packages</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#buildlink">9. + Buildlink methodology</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2567378">9.1. + Converting packages to use buildlink3</a></span></dt> + + <dt><span class="sect1"><a href="#id2567637">9.2. + Writing buildlink3.mk files</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2567774">9.2.1. Anatomy of a buildlink3.mk + file</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2568283">9.2.2. Updating + BUILDLINK_DEPENDS.pkg in buildlink3.mk + files</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2568362">9.3. + Writing builtin.mk files</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2568512">9.3.1. Anatomy of a builtin.mk + file</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2568739">9.3.2. Global preferences for native + or pkgsrc software</a></span></dt> + </dl> + </dd> + </dl> + </dd> + + <dt><span class="chapter"><a href="#options">10. Options + handling</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2568811">10.1. + Global default options</a></span></dt> + + <dt><span class="sect1"><a href="#id2568826">10.2. + Converting packages to use + bsd.options.mk</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#build">11. The build + process</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#build.prefix">11.1. + Program location</a></span></dt> + + <dt><span class="sect1"><a href="#id2569571">11.2. + Main targets</a></span></dt> + + <dt><span class="sect1"><a href= + "#build.helpful-targets">11.3. Other helpful + targets</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#fixes">12. Notes on + fixes for packages</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2570968">12.1. + General operation</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2570971">12.1.1. How to pull in variables + from /etc/mk.conf</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571054">12.1.2. Restricted + packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#dependencies">12.1.3. Handling + dependencies</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571501">12.1.4. Handling conflicts with + other packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571620">12.1.5. Packages that cannot or + should not be built</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571645">12.1.6. Packages which should not be + deleted, once installed</a></span></dt> + + <dt><span class="sect2"><a href= + "#security-handling">12.1.7. Handling packages + with security problems</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571737">12.1.8. How to handle compiler + bugs</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571760">12.1.9. How to handle incrementing + versions when fixing an existing + package</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571809">12.1.10. Portability of + packages</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2571901">12.2. + Possible downloading issues</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2571905">12.2.1. Packages whose distfiles + aren't available for plain + downloading</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572036">12.2.2. How to handle modified + distfiles with the 'old' name</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572048">12.3. + Configuration gotchas</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#fixes.libtool">12.3.1. Shared libraries - + libtool</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572523">12.3.2. Using libtool on GNU + packages that already support + libtool</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572608">12.3.3. GNU + Autoconf/Automake</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572652">12.4. + Building considerations</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2572656">12.4.1. CPP defines</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572685">12.5. + Package specific actions</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2572689">12.5.1. Package configuration + files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572859">12.5.2. User + Interaction</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572904">12.5.3. Handling + licenses</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572987">12.5.4. Creating an account from a + package</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573049">12.5.5. Installing score + files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573093">12.5.6. Packages providing login + shells</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573424">12.5.7. Packages containing perl + scripts</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573442">12.5.8. Packages with hardcoded + paths to other interpreters</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573463">12.5.9. Packages installing perl + modules</a></span></dt> + + <dt><span class="sect2"><a href= + "#faq.info-files">12.5.10. Packages installing + info files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573751">12.5.11. Packages installing GConf2 + data files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573851">12.5.12. Packages installing + scrollkeeper data files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573902">12.5.13. Packages installing X11 + fonts</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574018">12.5.14. Packages installing GTK2 + modules</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574087">12.5.15. Packages installing SGML or + XML data</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574139">12.5.16. Packages installing + extensions to the MIME database</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574210">12.5.17. Packages using + intltool</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2574224">12.6. + Feedback to the author</a></span></dt> + </dl> + </dd> + + <dt><span class="chapter"><a href="#debug">13. + Debugging</a></span></dt> + + <dt><span class="chapter"><a href="#submit">14. + Submitting and Committing</a></span></dt> + + <dd> + <dl> + <dt><span class="sect1"><a href="#id2574685">14.1. + Submitting your packages</a></span></dt> + + <dt><span class="sect1"><a href="#id2574732">14.2. + Committing: Importing a package into + CVS</a></span></dt> + + <dt><span class="sect1"><a href="#id2575000">14.3. + Updating a Package to a Newer Version</a></span></dt> + + <dt><span class="sect1"><a href="#id2575019">14.4. + Moving a Package in pkgsrc</a></span></dt> + </dl> + </dd> + </dl> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="components" id= + "components"></a>Chapter 7. Package + components - files, directories and contents</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href= + "#components.Makefile">7.1. Makefile</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.distinfo">7.2. distinfo</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.patches">7.3. patches/*</a></span></dt> + + <dt><span class="sect1"><a href="#id2566375">7.4. Other + mandatory files</a></span></dt> + + <dt><span class="sect1"><a href= + "#components.optional">7.5. Optional + files</a></span></dt> + + <dt><span class="sect1"><a href="#id2566569">7.6. + work*</a></span></dt> + + <dt><span class="sect1"><a href="#id2566657">7.7. + files/*</a></span></dt> + </dl> + </div> + + <p>Whenever you're preparing a package, there are a number + of files involved which are described in the following + sections.</p> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "components.Makefile" id= + "components.Makefile"></a>7.1. <tt class= + "filename">Makefile</tt></h2> + </div> + </div> + </div> + + <p>Building, installation and creation of a binary + package are all controlled by the package's <tt class= + "filename">Makefile</tt>.</p> + + <p>There is a <tt class="filename">Makefile</tt> for each + package. This file includes the standard <tt class= + "filename">bsd.pkg.mk</tt> file (referenced as <tt class= + "filename">../../mk/bsd.pkg.mk</tt>), which sets all the + definitions and actions necessary for the package to + compile and install itself. The mandatory variables are + the <tt class="varname">DISTNAME</tt> which specifies the + base name of the distribution file to be downloaded from + the site on the Internet, <tt class= + "varname">MASTER_SITES</tt> which specifies that site, + <tt class="varname">CATEGORIES</tt> which denotes the + categories into which the package falls, <tt class= + "varname">PKGNAME</tt> which is the name of the package, + the <tt class="varname">MAINTAINER</tt>'s name, and the + <tt class="varname">COMMENT</tt> 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 package can + complain vigorously, or send chocolate as a sign of + appreciation.</p> + + <p>The <tt class="varname">MASTER_SITES</tt> may be set + to one of the predefined sites:</p> + <pre class="programlisting"> + ${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} +</pre> + + <p>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 <span class= + "emphasis"><em>must</em></span> use the following + construct to specify a subdirectory:</p> + <pre class="programlisting"> + ${MASTER_SITE_GNU:=subdirectory/name/} + ${MASTER_SITE_SOURCEFORGE:=project_name/} +</pre> + + <p>Note the trailing slash after the subdirectory + name.</p> + + <div class="note" style= + "margin-left: 0.5in; margin-right: 0.5in;"> + <h3 class="title">Note</h3> + + <p><tt class="varname">MASTER_SITE_SUBDIR</tt> has been + deprecated and <span class="emphasis"><em>should no + longer be used</em></span>.</p> + </div> + + <p>If the package has multiple <tt class= + "varname">DISTFILES</tt> or multiple <tt class= + "varname">PATCHFILES</tt> from different sites, set + <tt class="varname">SITES_foo</tt> to a list of URI's + where file “<span class="quote">foo</span>” + may be found. “<span class= + "quote">foo</span>” includes the suffix, e.g.</p> + <pre class="programlisting"> +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/ +</pre> + + <p>Note that the normal default setting of <tt class= + "varname">DISTFILES</tt> must be made explicit if you + want to add to it (rather than replace it), as you + usually would.</p> + + <p>Currently the following values are available for + <tt class="varname">CATEGORIES</tt>. If more than one is + used, they need to be separated by spaces:</p> + <pre class="programlisting"> +archivers cross geography meta-pkgs security +audio databases graphics misc shells +benchmarks devel ham multimedia sysutils +biology editors inputmethod net textproc +cad emulators lang news time +chat finance mail parallel wm +comms fonts math pkgtools www +converters games mbone print x11 +</pre> + + <p>Please pay attention to the following gotchas:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>Add <tt class="varname">MANCOMPRESSED</tt> if + manpages are installed in compressed form by the + package; see comment in <tt class= + "filename">bsd.pkg.mk</tt>.</p> + </li> + + <li> + <p>Replace <tt class="filename">/usr/local</tt> + with “<span class= + "quote">${PREFIX}</span>” in all files (see + patches, below).</p> + </li> + + <li> + <p>If the package installs any info files, see + <a href="#faq.info-files" title= + "12.5.10. Packages installing info files">Section + 12.5.10, “Packages installing info + files”</a>.</p> + </li> + + <li> + <p>Set <tt class="varname">MAINTAINER</tt> to be + yourself. If you really can't maintain the package + for future updates, set it to <tt class= + "email"><<a href= + "mailto:tech-pkg@NetBSD.org">tech-pkg@NetBSD.org</a>></tt>.</p> + </li> + + <li> + <p>If a home page for the software in question + exists, add the variable <tt class= + "varname">HOMEPAGE</tt> right after <tt class= + "varname">MAINTAINER</tt>. The value of this + variable should be the URL for the home page.</p> + </li> + + <li> + <p>Be sure to set the <tt class= + "varname">COMMENT</tt> variable to a short + description of the package, not containing the + pkg's name.</p> + </li> + </ul> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "components.distinfo" id= + "components.distinfo"></a>7.2. <tt class= + "filename">distinfo</tt></h2> + </div> + </div> + </div> + + <p>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 generated using the <span><b class= + "command">make makesum</b></span> 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 <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/digest/README.html" + class="pkgname">pkgtools/digest</a> utility calculates + all of the digests in the distinfo file, and it provides + various different algorithms. At the current time, the + algorithms provided are: <span class= + "emphasis"><em>md5</em></span>, <span class= + "emphasis"><em>rmd160</em></span>, <span class= + "emphasis"><em>sha1</em></span>, <span class= + "emphasis"><em>sha256</em></span>, <span class= + "emphasis"><em>sha384</em></span> and <span class= + "emphasis"><em>sha512</em></span>.</p> + + <p>Some packages have different sets of distfiles on a + per architecture basis, for example <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/www/navigator/README.html" + class="pkgname">www/navigator</a>). 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.</p> + + <p>The message digest/checksum for all the official + patches found in the <tt class="filename">patches/</tt> + directory (see <a href="#components.patches" title= + "7.3. patches/*">Section 7.3, + “patches/*”</a>) for the package is also + stored in the <tt class="filename">distinfo</tt> 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 <span><b class="command">make + makepatchsum</b></span> (or <span><b class="command">make + mps</b></span> if you're in a hurry).</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "components.patches" id= + "components.patches"></a>7.3. patches/*</h2> + </div> + </div> + </div> + + <p>This directory contains files that are used by the + <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?patch+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">patch</span>(1)</span></a> 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 “<span class= + "quote">patches/patch-*</span>” glob expansion), so + <tt class="filename">patch-aa</tt> is applied before + <tt class="filename">patch-ab</tt>, etc.</p> + + <p>Patch files which are optional and will depend on + local site configuration can be included with names + matching the pattern <tt class= + "filename">patches/patch-optional-*</tt>. Their suffixes + should match the configuration options. The selected + optional patch file names should be assigned to the + variable <tt class="varname">OPTIONAL_PATCHFILES</tt>. + They will not be applied by default.</p> + + <p>For example if a package data file needs patching to + indicate the default local printer paper size as + specified in the <tt class="varname">$PAPERSIZE</tt> file + you can include patches for all the possible paper sizes + other than the one the package comes configured for by + default. In this case you might have a patch called + "<tt class= + "filename">patch-optional-Letter-papersize</tt>" and/or + another patch called "<tt class= + "filename">patch-optional-A4-papersize</tt>". In your + <tt class="filename">Makefile</tt> you would select + between them with the following construct:</p> + <pre class="programlisting"> + + PATCHDIR= ${.CURDIR}/patches + .if exists(${PATCHDIR}/patch-optional-${PAPERSIZE}-papersize) + OPTIONAL_PATCHFILES+= ${PATCHDIR}/patch-optional-${PAPERSIZE}-papersize + .endif +</pre> + + <p>Note that you have to define the value of <tt class= + "varname">PATCHDIR</tt> in order to use it in a + “<span class="quote"><span><b class= + "command">.if</b></span></span>” statement like + this as otherwise it's not defined until too late during + the processing of the Makefile. You should use a + “<span class="quote"><span><b class= + "command">.if</b></span></span>” statement in order + to avoid problems should the configuration item + (<tt class="varname">$PAPERSIZE</tt> in this example) be + set to an unexpected value.</p> + + <p>The <tt class="filename">patch-*</tt> files should be + in <span><b class="command">diff -bu</b></span> format, + and apply without a fuzz to avoid problems. (To force + patches to apply with fuzz you can set <tt class= + "varname">PATCH_FUZZ_FACTOR=-F2</tt>). Furthermore, do + not put changes for more than one file into a single + patch-file, as this will make future modifications more + difficult.</p> + + <p>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.</p> + + <p>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. Use the <span><b class= + "command">pkgdiff</b></span> from the <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkgdiff/README.html" + class="pkgname">pkgtools/pkgdiff</a> package to avoid + these problems.</p> + + <p>For even more automation, we recommend using + <span><b class="command">mkpatches</b></span> from the + same package to make a whole set of patches. You just + have to backup files before you edit them to <tt class= + "filename">filename.orig</tt>, e.g. with <span><b class= + "command">cp -p filename filename.orig</b></span> or, + easier, by using <span><b class= + "command">pkgvi</b></span> again 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 <span><b class="command">patchdiff</b></span>.</p> + + <p>When you have finished a package, remember to generate + the checksums for the patch files by using the + <span><b class="command">make makepatchsum</b></span> + command, see <a href="#components.distinfo" title= + "7.2. distinfo">Section 7.2, + “distinfo”</a>.</p> + + <p>Patch files that are distributed by the author or + other maintainers can be listed in <tt class= + "varname">$PATCHFILES</tt>.</p> + + <p>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 <tt class= + "filename">$LOCALPATCHES</tt> directory. The directory + tree there is expected to have the same + “<span class="quote">category/package</span>” + structure as pkgsrc, and patches are expected to be + stored inside these dirs (also known as <tt class= + "filename">$LOCALPATCHES/$PKGPATH</tt>). For example if + you want to keep a private patch for <tt class= + "filename">pkgsrc/graphics/png</tt>, keep it in + <tt class="filename">$LOCALPATCHES/graphics/png/mypatch</tt>. + All files in the named directory are expected to be patch + files, and <span class="emphasis"><em>they are applied + after pkgsrc patches are applied</em></span>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2566375" id="id2566375"></a>7.4. Other + mandatory files</h2> + </div> + </div> + </div> + + <div class="variablelist"> + <dl> + <dt><span class="term"><tt class= + "filename">DESCR</tt></span></dt> + + <dd> + <p>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.</p> + </dd> + + <dt><span class="term"><tt class= + "filename">PLIST</tt></span></dt> + + <dd> + <p>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. See <a href="#plist" title= + "Chapter 8. PLIST issues">Chapter 8, + <i>PLIST issues</i></a> for more information.</p> + </dd> + </dl> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "components.optional" id= + "components.optional"></a>7.5. Optional + files</h2> + </div> + </div> + </div> + + <div class="variablelist"> + <dl> + <dt><span class="term"><tt class= + "filename">INSTALL</tt></span></dt> + + <dd> + <p>This shell script is invoked twice by <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a>. 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 <tt class="filename">PLIST</tt>. See + <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a> and + <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_create+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_create</span>(1)</span></a> for + more information.</p> + </dd> + + <dt><span class="term"><tt class= + "filename">DEINSTALL</tt></span></dt> + + <dd> + <p>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 <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_delete</span>(1)</span></a> and + <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_create+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_create</span>(1)</span></a> for + more information.</p> + </dd> + + <dt><span class="term"><tt class= + "filename">MESSAGE</tt></span></dt> + + <dd> + <p>Display this file after installation of the + package. Useful for things like legal notices on + almost-free software and hints for updating config + files after installing modules for apache, PHP etc. + Please note that you can modify variables in it + easily by using <tt class= + "varname">MESSAGE_SUBST</tt> in the package's + <tt class="filename">Makefile</tt>:</p> + <pre class="programlisting"> +MESSAGE_SUBST+= SOMEVAR="somevalue" +</pre> + + <p>replaces "${SOMEVAR}" with “<span class= + "quote">somevalue</span>” in <tt class= + "filename">MESSAGE</tt>.</p> + </dd> + </dl> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2566569" id="id2566569"></a>7.6. <tt class= + "filename">work*</tt></h2> + </div> + </div> + </div> + + <p>When you type <span><b class="command">make</b></span> + the distribution files are unpacked into this directory. + It can be removed by running <span><b class= + "command">make clean</b></span>. Besides the sources, + this directory is also used to keep various timestamp + files.</p> + + <p>If a package doesn't create a subdirectory for itself + (like GNU software does, for instance), but extracts + itself in the current directory, you should set + <tt class="varname">WRKSRC</tt> accordingly, e.g. + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/editors/sam/README.html" + class="pkgname">editors/sam</a> again, but the quick + answer is:</p> + <pre class="programlisting"> +WRKSRC= ${WRKDIR} +</pre> + + <p>Please note that the old <tt class= + "varname">NO_WRKSUBDIR</tt> has been deprecated and + should not be used. Also, if your package doesn't create + a subdir with the name of <tt class= + "varname">DISTNAME</tt> but some different name, set + <tt class="varname">WRKSRC</tt> to point to the proper + name in <tt class="filename">${WRKDIR}</tt>. See + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/lang/tcl/README.html" + class="pkgname">lang/tcl</a> and <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/x11/tk/README.html" + class="pkgname">x11/tk</a> for examples, and here is + another one:</p> + <pre class="programlisting"> +WRKSRC= ${WRKDIR}/${DISTNAME}/unix +</pre> + + <p>The name of the working directory created by pkgsrc is + <tt class="filename">work</tt> by default. If the same + pkgsrc tree should be used on several different + platforms, the variable <tt class= + "varname">OBJMACHINE</tt> can be set in /etc/mk.conf to + attach the platform to the directory name, e.g. + <tt class="filename">work.i386</tt> or <tt class= + "filename">work.sparc</tt>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2566657" id="id2566657"></a>7.7. <tt class= + "filename">files/*</tt></h2> + </div> + </div> + </div> + + <p>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 “<span class= + "quote">${CP}</span>” command in the + “<span class="quote">pre-configure</span>” + target to achieve this. Alternatively, you could simply + diff the file against <tt class="filename">/dev/null</tt> + and use the patch mechanism to manage the creation of + this file.</p> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="plist" id= + "plist"></a>Chapter 8. PLIST issues</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2566711">8.1. RCS + ID</a></span></dt> + + <dt><span class="sect1"><a href="#id2566726">8.2. + Semi-automatic PLIST generation</a></span></dt> + + <dt><span class="sect1"><a href="#print-PLIST">8.3. + Tweaking output of make print-PLIST</a></span></dt> + + <dt><span class="sect1"><a href="#plist.misc">8.4. + Variable substitution in PLIST</a></span></dt> + + <dt><span class="sect1"><a href="#id2567047">8.5. + Manpage-compression</a></span></dt> + + <dt><span class="sect1"><a href="#id2567089">8.6. + Changing PLIST source with PLIST_SRC</a></span></dt> + + <dt><span class="sect1"><a href="#id2567106">8.7. + Platform specific and differing PLISTs</a></span></dt> + + <dt><span class="sect1"><a href="#faq.common-dirs">8.8. + Sharing directories between packages</a></span></dt> + </dl> + </div> + + <p>The <tt class="filename">PLIST</tt> file contains a + package's “<span class="quote">packing + list</span>”, i.e. a list of files that belong to the + package (relative to the <tt class= + "filename">${PREFIX}</tt> directory it's been installed in) + plus some additional statements - see the <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_create+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_create</span>(1)</span></a> manpage for + a full list. This chapter addresses some issues that need + attention when dealing with the <tt class= + "filename">PLIST</tt> file (or files, see below!).</p> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2566711" id="id2566711"></a>8.1. RCS + ID</h2> + </div> + </div> + </div> + + <p>Be sure to add a RCS ID line as the first thing in any + <tt class="filename">PLIST</tt> file you write:</p> + <pre class="programlisting"> +@comment $NetBSD$ +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2566726" id= + "id2566726"></a>8.2. Semi-automatic <tt class= + "filename">PLIST</tt> generation</h2> + </div> + </div> + </div> + + <p>You can use the <span><b class="command">make + print-PLIST</b></span> command to output a PLIST that + matches any new files since the package was extracted. + See <a href="#build.helpful-targets" title= + "11.3. Other helpful targets">Section 11.3, + “Other helpful targets”</a> for more + information on this target.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "print-PLIST" id= + "print-PLIST"></a>8.3. Tweaking output of + <span><b class="command">make + print-PLIST</b></span></h2> + </div> + </div> + </div> + + <p>If you have used any of the *-dirs packages, as + explained in <a href="#faq.common-dirs" title= + "8.8. Sharing directories between packages">Section 8.8, + “Sharing directories between packages”</a>, + you may have noticed that <span><b class="command">make + print-PLIST</b></span> outputs a set of <tt class= + "varname">@comment</tt>s instead of real <tt class= + "varname">@dirrm</tt> lines. You can also do this for + specific directories and files, so that the results of + that command are very close to reality. This helps + <span class="emphasis"><em>a lot</em></span> during the + update of packages.</p> + + <p>The <tt class="varname">PRINT_PLIST_AWK</tt> variable + takes a set of AWK patterns and actions that are used to + filter the output of print-PLIST. You can <span class= + "emphasis"><em>append</em></span> any chunk of AWK + scripting you like to it, but be careful with + quoting.</p> + + <p>For example, to get all files inside the <tt class= + "filename">libdata/foo</tt> directory removed from the + resulting PLIST:</p> + <pre class="programlisting"> + PRINT_PLIST_AWK+= /^libdata\/foo/ { next; } + +</pre> + + <p>And to get all the <tt class="varname">@dirrm</tt> + lines referring to a specific (shared) directory + converted to <tt class="varname">@comment</tt>s:</p> + <pre class="programlisting"> + PRINT_PLIST_AWK+= /^@dirrm share\/specific/ { print "@comment " $$0; next; } + +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "plist.misc" id="plist.misc"></a>8.4. Variable + substitution in PLIST</h2> + </div> + </div> + </div> + + <p>A number of variables are substituted automatically in + PLISTs when a package is installed on a system. This + includes the following variables:</p> + + <div class="variablelist"> + <dl> + <dt><span class="term"><tt class= + "varname">${MACHINE_ARCH}</tt>, <tt class= + "varname">${MACHINE_GNU_ARCH}</tt></span></dt> + + <dd> + <p>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 + “<span class="quote"><tt class= + "varname">${MACHINE_ARCH}</tt></span>” will + be replaced by what <span><b class="command">uname + -p</b></span> gives. The same is done if the string + <tt class="varname">${MACHINE_GNU_ARCH}</tt> is + embedded in PLIST somewhere - use this on packages + that have GNU autoconf created configure + scripts.</p> + + <div class="note" style= + "margin-left: 0.5in; margin-right: 0.5in;"> + <h3 class="title">Legacy note</h3> + + <p>There used to be a symbol “<span class= + "quote"><tt class= + "varname">$ARCH</tt></span>” that was + replaced by the output of <span><b class= + "command">uname -m</b></span>, but that's no + longer supported and has been removed.</p> + </div> + </dd> + + <dt><span class="term"><tt class= + "varname">${OPSYS}</tt>, <tt class= + "varname">${LOWER_OPSYS}</tt>, <tt class= + "varname">${OS_VERSION}</tt></span></dt> + + <dd> + <p>Some packages want to embed the OS name and + version into some paths. To do this, use these + variables in the <tt class= + "filename">PLIST</tt>:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="varname">${OPSYS}</tt> - output + of “<span class="quote"><span><b class= + "command">uname + -s</b></span></span>”</p> + </li> + + <li> + <p><tt class="varname">${LOWER_OPSYS}</tt> - + lowercase common name (eg. + “<span class="quote">solaris</span>”)</p> + </li> + + <li> + <p><tt class="varname">${OS_VERSION}</tt> - + “<span class="quote"><span><b class= + "command">uname + -r</b></span></span>”</p> + </li> + </ul> + </div> + </dd> + + <dt><span class="term"><tt class= + "varname">${PKGLOCALEDIR}</tt></span></dt> + + <dd> + <p>Packages that install locale files should list + them in the PLIST as “<span class= + "quote">${PKGLOCALEDIR}/locale/de/LC_MESSAGES/...</span>” + instead of “<span class= + "quote">share/locale/de/LC_MESSAGES/...</span>”. + This properly handles the fact that different + operating systems expect locale files to be either + in <tt class="filename">share</tt> or <tt class= + "filename">lib</tt> by default.</p> + </dd> + </dl> + </div> + + <p>For a complete list of values which are replaced by + default, please look in <tt class= + "filename">bsd.pkg.mk</tt> (and search for <span class= + "emphasis"><em>PLIST_SUBST</em></span>).</p> + + <p>If you want to change other variables not listed + above, you can add variables and their expansions to this + variable in the following way, similar to <tt class= + "varname">MESSAGE_SUBST</tt> (see <a href= + "#components.optional" title= + "7.5. Optional files">Section 7.5, + “Optional files”</a>):</p> + <pre class="programlisting"> +PLIST_SUBST+= SOMEVAR="somevalue" +</pre> + + <p>This replaces all occurrences of “<span class= + "quote">${SOMEVAR}</span>” in the PLIST with + “<span class="quote">somevalue</span>”.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2567047" id= + "id2567047"></a>8.5. Manpage-compression</h2> + </div> + </div> + </div> + + <p>Manpages should be installed in compressed form if + <tt class="varname">MANZ</tt> is set (in <tt class= + "filename">bsd.own.mk</tt>), and uncompressed otherwise. + To handle this in the <tt class="filename">PLIST</tt> + file, the suffix “<span class= + "quote">.gz</span>” is appended/removed + automatically for manpages according to <tt class= + "varname">MANZ</tt> and <tt class= + "varname">MANCOMPRESSED</tt> being set or not, see above + for details. This modification of the <tt class= + "filename">PLIST</tt> file is done on a copy of it, not + <tt class="filename">PLIST</tt> itself.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2567089" id="id2567089"></a>8.6. Changing + PLIST source with <tt class= + "varname">PLIST_SRC</tt></h2> + </div> + </div> + </div> + + <p>To use one or more files as source for the <tt class= + "filename">PLIST</tt> used in generating the binary + package, set the variable <tt class= + "varname">PLIST_SRC</tt> to the names of that file(s). + The files are later concatenated using cat(1), and order + of things is important.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2567106" id="id2567106"></a>8.7. Platform + specific and differing PLISTs</h2> + </div> + </div> + </div> + + <p>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:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="filename">PLIST.common</tt></p> + </li> + + <li> + <p><tt class="filename">PLIST.${OPSYS}</tt></p> + </li> + + <li> + <p><tt class="filename">PLIST.common_end</tt></p> + </li> + </ul> + </div> + + <p>If <tt class="filename">PLIST.${OPSYS}</tt> exists, + these files are used instead of <tt class= + "filename">PLIST</tt>. This allows packages which behave + in this way to be handled gracefully. Manually overriding + <tt class="varname">PLIST_SRC</tt> for other more exotic + uses is also possible.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "faq.common-dirs" id= + "faq.common-dirs"></a>8.8. Sharing directories + between packages</h2> + </div> + </div> + </div> + + <p>A “<span class="quote">shared + directory</span>” is a directory where multiple + (and unrelated) packages install files. These directories + are problematic because you have to add special tricks in + the PLIST to conditionally remove them, or have some + centralized package handle them.</p> + + <p>Within pkgsrc, you'll find both approaches. If a + directory is shared by a few unrelated packages, it's + often not worth to add an extra package to remove it. + Therefore, one simply does:</p> + <pre class="programlisting"> + @unexec ${RMDIR} %D/path/to/shared/directory 2>/dev/null || ${TRUE} + +</pre> + + <p>in the PLISTs of all affected packages, instead of the + regular "@dirrm" line.</p> + + <p>However, if the directory is shared across many + packages, two different solutions are available:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>If the packages have a common dependency, the + directory can be removed in that. For example, see + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" + href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/textproc/scrollkeeper/README.html" + class="pkgname">textproc/scrollkeeper</a>, which + removes the shared directory <tt class= + "filename">share/omf</tt>.</p> + </li> + + <li> + <p>If the packages using the directory are not + related at all (they have no common dependencies), + a *-dirs package is used.</p> + </li> + </ol> + </div> + + <p>From now on, we'll discuss the second solution. To get + an idea of the *-dirs packages available, issue:</p> + <pre class="programlisting"> + <tt class="prompt">%</tt> cd .../pkgsrc + <tt class="prompt">%</tt> ls -d */*-dirs + +</pre> + + <p>Their use from other packages is very simple. The + <tt class="varname">USE_DIRS</tt> variable takes a list + of package names (without the “<span class= + "quote">-dirs</span>” part) together with the + required version number (always pick the latest one when + writting new packages).</p> + + <p>For example, if a package installs files under + <tt class="filename">share/applications</tt>, it should + have the following line in it:</p> + <pre class="programlisting"> + USE_DIRS+= xdg-1.1 + +</pre> + + <p>After regenerating the PLIST using <span><b class= + "command">make print-PLIST</b></span>, you should get the + right (commented out) lines.</p> + + <p>Note that, even if your package is using <tt class= + "filename">$X11BASE</tt>, it must not depend on the + *-x11-dirs packages. Just specify the name without that + part and pkgsrc (in particular, <tt class= + "filename">mk/dirs.mk</tt>) will take care of it.</p> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="buildlink" id= + "buildlink"></a>Chapter 9. Buildlink + methodology</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2567378">9.1. + Converting packages to use buildlink3</a></span></dt> + + <dt><span class="sect1"><a href="#id2567637">9.2. + Writing buildlink3.mk files</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href="#id2567774">9.2.1. + Anatomy of a buildlink3.mk file</a></span></dt> + + <dt><span class="sect2"><a href="#id2568283">9.2.2. + Updating BUILDLINK_DEPENDS.pkg in buildlink3.mk + files</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2568362">9.3. + Writing builtin.mk files</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href="#id2568512">9.3.1. + Anatomy of a builtin.mk file</a></span></dt> + + <dt><span class="sect2"><a href="#id2568739">9.3.2. + Global preferences for native or pkgsrc + software</a></span></dt> + </dl> + </dd> + </dl> + </div> + + <p>Buildlink is a framework in pkgsrc that controls what + headers and libraries are seen by a package's configure and + build processes. This is implemented in a two step + process:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Symlink headers and libraries for dependencies + into <tt class="varname">BUILDLINK_DIR</tt>, which by + default is a subdirectory of <tt class= + "varname">WRKDIR</tt>.</p> + </li> + + <li> + <p>Create wrapper scripts that are used in place of + the normal compiler tools that translate <tt class= + "option">-I${LOCALBASE}/include</tt> and <tt class= + "option">-L${LOCALBASE}/lib</tt> into references to + <tt class="varname">BUILDLINK_DIR</tt>. The wrapper + scripts also make native compiler on some operating + systems look like GCC, so that packages that expect + GCC won't require modifications to build with those + native compilers.</p> + </li> + </ol> + </div> + + <p>This normalizes the environment in which a package is + built so that the package may be built consistently despite + what other software may be installed. Please note that the + normal system header and library paths, e.g. <tt class= + "filename">/usr/include</tt>, <tt class= + "filename">/usr/lib</tt>, etc., are always searched -- + buildlink3 is designed to insulate the package build from + non-system-supplied software.</p> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2567378" id="id2567378"></a>9.1. Converting + packages to use buildlink3</h2> + </div> + </div> + </div> + + <p>The process of converting packages to use the + buildlink3 framework (“<span class= + "quote">bl3ifying</span>”) is fairly + straightforward. The things to keep in mind are:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Set <tt class="varname">USE_BUILDLINK3</tt> to + “<span class="quote">yes</span>”.</p> + </li> + + <li> + <p>Ensure that the build always calls the wrapper + scripts instead of the actual toolchain. Some + packages are tricky, and the only way to know for + sure is the check <tt class= + "filename">${WRKDIR}/.work.log</tt> to see if the + wrappers are being invoked.</p> + </li> + + <li> + <p>Don't override <tt class="varname">PREFIX</tt> + from within the package Makefile, e.g. Java VMs, + standalone shells, etc., because the code to + symlink files into <tt class= + "filename">${BUILDLINK_DIR}</tt> looks for files + relative to “<span class="quote">pkg_info -qp + <i class= + "replaceable"><tt>pkgname</tt></i></span>”.</p> + </li> + + <li> + <p>Remember that <span class= + "emphasis"><em>only</em></span> the <tt class= + "filename">buildlink3.mk</tt> files that you list + in a package's Makefile are added as dependencies + for that package.</p> + </li> + </ol> + </div> + + <p>If a dependency on a particular package is required + for its libraries and headers, then we replace:</p> + <pre class="programlisting"> +DEPENDS+= foo>=1.1.0:../../category/foo +</pre> + + <p>with</p> + <pre class="programlisting"> +.include "../../category/foo/buildlink3.mk" +</pre> + + <p>There are several <tt class= + "filename">buildlink3.mk</tt> files in <tt class= + "filename">pkgsrc/mk</tt> that handle special package + issues:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="filename">bdb.buildlink3.mk</tt> + chooses either the native or a pkgsrc Berkeley DB + implementation based on the values of <tt class= + "varname">BDB_ACCEPTED</tt> and <tt class= + "varname">BDB_DEFAULT</tt>.</p> + </li> + + <li> + <p><tt class="filename">curses.buildlink3.mk</tt> + If the system comes with neither Curses nor + NCurses, this will take care to install the + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" + href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/devel/ncurses/README.html" + class="pkgname">devel/ncurses</a> package.</p> + </li> + + <li> + <p><tt class="filename">krb5.buildlink3.mk</tt> + uses the value of <tt class= + "varname">KRB5_ACCEPTED</tt> to choose between + adding a dependency on Heimdal or MIT-krb5 for + packages that require a Kerberos 5 + implementation.</p> + </li> + + <li> + <p><tt class="filename">motif.buildlink3.mk</tt> + checks for a system-provided Motif installation or + adds a dependency on <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/x11/lesstif/README.html" + class="pkgname">x11/lesstif</a> or <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/x11/openmotif/README.html" + class="pkgname">x11/openmotif</a>;</p> + </li> + + <li> + <p><tt class="filename">ossaudio.buildlink3.mk</tt> + defines several variables that may be used by + packages that use the Open Sound System (OSS) + API;</p> + </li> + + <li> + <p><tt class="filename">pgsql.buildlink3.mk</tt> + will accept either Postgres 7.3 or 7.4, whichever + is found installed. See the file for more + information.</p> + </li> + + <li> + <p><tt class="filename">pthread.buildlink3.mk</tt> + uses the value of <tt class= + "varname">PTHREAD_OPTS</tt> and checks for native + pthreads or adds a dependency on <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/devel/pth/README.html" + class="pkgname">devel/pth</a> as needed;</p> + </li> + + <li> + <p><tt class="filename">xaw.buildlink3.mk</tt> uses + the value of <tt class="varname">XAW_TYPE</tt> to + choose a particular Athena widgets library.</p> + </li> + </ul> + </div> + + <p>The comments in those <tt class= + "filename">buildlink3.mk</tt> files provide a more + complete description of how to use them properly.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2567637" id="id2567637"></a>9.2. Writing + <tt class="filename">buildlink3.mk</tt> files</h2> + </div> + </div> + </div> + + <p>A package's <tt class="filename">buildlink3.mk</tt> + file is included by Makefiles to indicate the need to + compile and link against header files and libraries + provided by the package. A <tt class= + "filename">buildlink3.mk</tt> file should always provide + enough information to add the correct type of dependency + relationship and include any other <tt class= + "filename">buildlink3.mk</tt> files that it needs to find + headers and libraries that it needs in turn.</p> + + <p>To generate an initial <tt class= + "filename">buildlink3.mk</tt> file for further editing, + Rene Hexel's <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/createbuildlink/README.html" + class="pkgname">pkgtools/createbuildlink</a> package is + highly recommended. For most packages, the following + command will generate a good starting point for + <tt class="filename">buildlink3.mk</tt> files:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cd pkgsrc/<i class= +"replaceable"><tt>category</tt></i>/<i class= +"replaceable"><tt>pkgdir</tt></i> +<tt class= +"prompt">%</tt> createbuildlink -3 >buildlink3.mk</tt></b> +</pre> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2567774" id= + "id2567774"></a>9.2.1. Anatomy of a buildlink3.mk + file</h3> + </div> + </div> + </div> + + <p>The following real-life example <tt class= + "filename">buildlink3.mk</tt> is taken from <tt class= + "filename">pkgsrc/graphics/tiff</tt>:</p> + <pre class="programlisting"> +# $NetBSD: buildlink3.mk,v 1.7 2004/03/18 09:12:12 jlam Exp $ + +BUILDLINK_DEPTH:= ${BUILDLINK_DEPTH}+ +TIFF_BUILDLINK3_MK:= ${TIFF_BUILDLINK3_MK}+ + +.if !empty(BUILDLINK_DEPTH:M+) +BUILDLINK_DEPENDS+= tiff +.endif + +BUILDLINK_PACKAGES:= ${BUILDLINK_PACKAGES:Ntiff} +BUILDLINK_PACKAGES+= tiff + +.if !empty(TIFF_BUILDLINK3_MK:M+) +BUILDLINK_DEPENDS.tiff+= tiff>=3.6.1 +BUILDLINK_PKGSRCDIR.tiff?= ../../graphics/tiff +.endif # TIFF_BUILDLINK3_MK + +.include "../../devel/zlib/buildlink3.mk" +.include "../../graphics/jpeg/buildlink3.mk" + +BUILDLINK_DEPTH:= ${BUILDLINK_DEPTH:S/+$//} +</pre> + + <p>The header and footer manipulate <tt class= + "varname">BUILDLINK_DEPTH</tt>, which is common across + all <tt class="filename">buildlink3.mk</tt> files and + is used to track at what depth we are including + <tt class="filename">buildlink3.mk</tt> files.</p> + + <p>The first section controls if the dependency on + <i class="replaceable"><tt>pkg</tt></i> is added. + <tt class="varname">BUILDLINK_DEPENDS</tt> is the + global list of packages for which dependencies are + added by buildlink3.</p> + + <p>The second section advises pkgsrc that the + <tt class="filename">buildlink3.mk</tt> file for + <i class="replaceable"><tt>pkg</tt></i> has been + included at some point. <tt class= + "varname">BUILDLINK_PACKAGES</tt> is the global list of + packages for which <tt class= + "filename">buildlink3.mk</tt> files have been included. + It must <span class="emphasis"><em>always</em></span> + be appended to within a <tt class= + "filename">buildlink3.mk</tt> file.</p> + + <p>The third section is protected from multiple + inclusion and controls how the dependency on <i class= + "replaceable"><tt>pkg</tt></i> is added. Several + important variables are set in the section:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class= + "varname">BUILDLINK_DEPENDS.<i class="replaceable"> + <tt>pkg</tt></i></tt> is the actual dependency + recorded in the installed package; this should + always be set using <span><b class= + "command">+=</b></span> to ensure that we're + appending to any pre-existing list of values. + This variable should be set to the first version + of the package that had the last change in the + major number of a shared library or that had a + major API change.</p> + </li> + + <li> + <p><tt class= + "varname">BUILDLINK_PKGSRCDIR.<i class= + "replaceable"><tt>pkg</tt></i></tt> is the + location of the <i class= + "replaceable"><tt>pkg</tt></i> pkgsrc + directory;</p> + </li> + + <li> + <p><tt class= + "varname">BUILDLINK_DEPMETHOD.<i class= + "replaceable"><tt>pkg</tt></i></tt> (not shown + above) controls whether we use <tt class= + "varname">BUILD_DEPENDS</tt> or <tt class= + "varname">DEPENDS</tt> to add the dependency on + <i class="replaceable"><tt>pkg</tt></i>. The + build dependency is selected by setting + <tt class="varname">BUILDLINK_DEPMETHOD.<i class= + "replaceable"><tt>pkg</tt></i></tt> to + “<span class="quote">build</span>”. + By default, the full dependency is used.</p> + </li> + + <li> + <p><tt class= + "varname">BUILDLINK_INCDIRS.<i class="replaceable"> + <tt>pkg</tt></i></tt> and <tt class= + "varname">BUILDLINK_LIBDIRS.<i class= + "replaceable"><tt>pkg</tt></i></tt> (not shown + above) are lists of subdirectories of <tt class= + "filename">${BUILDLINK_PREFIX.<i class= + "replaceable"><tt>pkg</tt></i>}</tt> to add to + the header and library search paths. These + default to “<span class= + "quote">include</span>” and + “<span class="quote">lib</span>” + respectively.</p> + </li> + + <li> + <p><tt class= + "varname">BUILDLINK_CPPFLAGS.<i class= + "replaceable"><tt>pkg</tt></i></tt> (not shown + above) is the list of preprocessor flags to add + to <tt class="varname">CPPFLAGS</tt>, which are + passed on to the configure and build phases. The + “<span class="quote">-I</span>” + option should be avoided and instead be handled + using <tt class= + "varname">BUILDLINK_INCDIRS.<i class= + "replaceable"><tt>pkg</tt></i></tt> as above.</p> + </li> + </ul> + </div> + + <p>The following variables are all optionally defined + within this second section (protected against multiple + inclusion) and control which package files are + symlinked into <tt class= + "filename">${BUILDLINK_DIR}</tt> and how their names + are transformed during the symlinking:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="varname">BUILDLINK_FILES.<i class= + "replaceable"><tt>pkg</tt></i></tt> (not shown + above) is a shell glob pattern relative to + <tt class="filename">${BUILDLINK_PREFIX.<i class= + "replaceable"><tt>pkg</tt></i>}</tt> to be + symlinked into <tt class= + "filename">${BUILDLINK_DIR}</tt>, e.g. <tt class= + "filename">include/*.h</tt>.</p> + </li> + + <li> + <p><tt class= + "varname">BUILDLINK_FILES_CMD.<i class= + "replaceable"><tt>pkg</tt></i></tt> (not shown + above) is a shell pipeline that outputs to stdout + a list of files relative to <tt class= + "filename">${BUILDLINK_PREFIX.<i class= + "replaceable"><tt>pkg</tt></i>}</tt>. The + resulting files are to be symlinked into + <tt class="filename">${BUILDLINK_DIR}</tt>. By + default, this takes the <tt class= + "filename">+CONTENTS</tt> of a <i class= + "replaceable"><tt>pkg</tt></i> and filters it + through <tt class= + "varname">${BUILDLINK_CONTENTS_FILTER.<i class= + "replaceable"><tt>pkg</tt></i>}</tt>.</p> + </li> + + <li> + <p><tt class= + "varname">BUILDLINK_CONTENTS_FILTER.<i class= + "replaceable"><tt>pkg</tt></i></tt> (not shown + above) is a filter command that filters + <tt class="filename">+CONTENTS</tt> input into a + list of files relative to <tt class= + "filename">${BUILDLINK_PREFIX.<i class= + "replaceable"><tt>pkg</tt></i>}</tt> on stdout. + By default for overwrite packages, <tt class= + "varname">BUILDLINK_CONTENTS_FILTER.<i class= + "replaceable"><tt>pkg</tt></i></tt> outputs the + contents of the <tt class="filename">include</tt> + and <tt class="filename">lib</tt> directories in + the package <tt class="filename">+CONTENTS</tt>, + and for pkgviews packages, it outputs any libtool + archives in <tt class="filename">lib</tt> + directories.</p> + </li> + + <li> + <p><tt class= + "varname">BUILDLINK_TRANSFORM.<i class= + "replaceable"><tt>pkg</tt></i></tt> (not shown + above) is a list of sed arguments used to + transform the name of the source filename into a + destination filename, e.g. <span><b class= + "command">-e + "s|/curses.h|/ncurses.h|g"</b></span>.</p> + </li> + </ul> + </div> + + <p>The last section includes any <tt class= + "filename">buildlink3.mk</tt> needed for <i class= + "replaceable"><tt>pkg</tt></i>'s library dependencies. + Including these <tt class="filename">buildlink3.mk</tt> + files means that the headers and libraries for these + dependencies are also symlinked into <tt class= + "filename">${BUILDLINK_DIR}</tt> whenever the <i class= + "replaceable"><tt>pkg</tt></i> <tt class= + "filename">buildlink3.mk</tt> file is included.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2568283" id= + "id2568283"></a>9.2.2. Updating <tt class= + "varname">BUILDLINK_DEPENDS.<i class= + "replaceable"><tt>pkg</tt></i></tt> in <tt class= + "filename">buildlink3.mk</tt> files</h3> + </div> + </div> + </div> + + <p>There are two situations that require increasing the + dependency listed in <tt class= + "varname">BUILDLINK_DEPENDS.<i class= + "replaceable"><tt>pkg</tt></i></tt> after a package + update:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>if the sonames (major number of the library + version) of any installed shared libraries + change;</p> + </li> + + <li> + <p>if the API or interface to the header files + change.</p> + </li> + </ol> + </div> + + <p>In these cases, <tt class= + "varname">BUILDLINK_DEPENDS.<i class= + "replaceable"><tt>pkg</tt></i></tt> should be adjusted + to require at least the new package version. In some + cases, the packages that depend on this new version may + need their <tt class="varname">PKGREVISION</tt>s + increased and, if they have <tt class= + "filename">buildlink3.mk</tt> files, their <tt class= + "varname">BUILDLINK_DEPENDS.<i class= + "replaceable"><tt>pkg</tt></i></tt> adjusted, too. This + is needed so that binary packages made using it will + require the correct package dependency and not settle + for an older one which will not contain the necessary + shared libraries.</p> + + <p>Please take careful consideration before adjusting + <tt class="varname">BUILDLINK_DEPENDS.<i class= + "replaceable"><tt>pkg</tt></i></tt> as we don't want to + cause unneeded package deletions and rebuilds. In many + cases, new versions of packages work just fine with + older dependencies. See <a href="#dependencies" title= + "12.1.3. Handling dependencies">Section 12.1.3, + “Handling dependencies”</a> and <a href= + "#buildlink" title= + "Chapter 9. Buildlink methodology">Chapter 9, + <i>Buildlink methodology</i></a> for more information + about dependencies on other packages, including the + <tt class="varname">BUILDLINK_RECOMMENDED</tt> and + <tt class="varname">RECOMMENDED</tt> definitions.</p> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2568362" id="id2568362"></a>9.3. Writing + <tt class="filename">builtin.mk</tt> files</h2> + </div> + </div> + </div> + + <p>Some packages in pkgsrc install headers and libraries + that coincide with headers and libraries present in the + base system. Aside from a <tt class= + "filename">buildlink3.mk</tt> file, these packages should + also include a <tt class="filename">builtin.mk</tt> file + that includes the necessary checks to decide whether + using the built-in software or the pkgsrc software is + appropriate.</p> + + <p>The only requirements of a builtin.mk file for + <i class="replaceable"><tt>pkg</tt></i> are:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>It should set <tt class= + "varname">USE_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> to either + “<span class="quote">yes</span>” or + “<span class="quote">no</span>” after + it is included.</p> + </li> + + <li> + <p>It should <span class= + "emphasis"><em>not</em></span> override any + <tt class="varname">USE_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> which is + already set before the <tt class= + "filename">builtin.mk</tt> file is included.</p> + </li> + + <li> + <p>It should be written to allow multiple + inclusion. This is <span class= + "emphasis"><em>very</em></span> important and takes + careful attention to <tt class= + "filename">Makefile</tt> coding.</p> + </li> + </ol> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2568512" id= + "id2568512"></a>9.3.1. Anatomy of a + <tt class="filename">builtin.mk</tt> file</h3> + </div> + </div> + </div> + + <p>The following is the recommended template for + builtin.mk files:</p> + <pre class="programlisting"> +.if !defined(IS_BUILTIN.foo) +# +# IS_BUILTIN.foo is set to "yes" or "no" depending on whether "foo" +# genuinely exists in the system or not. +# +IS_BUILTIN.foo?= no + +# BUILTIN_PKG.foo should be set here if "foo" is built-in and its package +# version can be determined. +# +. if !empty(IS_BUILTIN.foo:M[yY][eE][sS]) +BUILTIN_PKG.foo?= foo-1.0 +. endif +.endif # IS_BUILTIN.foo + +.if !defined(USE_BUILTIN.foo) +USE_BUILTIN.foo?= ${IS_BUILTIN.foo} +. if defined(BUILTIN_PKG.foo) +. for _depend_ in ${BUILDLINK_DEPENDS.foo} +. if !empty(USE_BUILTIN.foo:M[yY][eE][sS]) +USE_BUILTIN.foo!= \ + if ${PKG_ADMIN} pmatch '${_depend_}' ${BUILTIN_PKG.foo}; then \ + ${ECHO} "yes"; \ + else \ + ${ECHO} "no"; \ + fi +. endif +. endfor +. endif +.endif # USE_BUILTIN.foo + +CHECK_BUILTIN.foo?= no +.if !empty(CHECK_BUILTIN.foo:M[nN][oO]) +# +# Here we place code that depends on whether USE_BUILTIN.foo is set to +# "yes" or "no". +# +.endif # CHECK_BUILTIN.foo + +</pre> + + <p>The first section sets <tt class= + "varname">IS_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> depending on if + <i class="replaceable"><tt>pkg</tt></i> really exists + in the base system. This should not be a base system + software with similar functionality to <i class= + "replaceable"><tt>pkg</tt></i>; it should only be + “<span class="quote">yes</span>” if the + actual package is included as part of the base system. + This variable is only used internally within the + <tt class="filename">builtin.mk</tt> file.</p> + + <p>The second section sets <tt class= + "varname">BUILTIN_PKG.<i class= + "replaceable"><tt>pkg</tt></i></tt> to the version of + <i class="replaceable"><tt>pkg</tt></i> in the base + system if it exists (if <tt class= + "varname">IS_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> is + “<span class="quote">yes</span>”). This + variable is only used internally within the <tt class= + "filename">builtin.mk</tt> file.</p> + + <p>The third section sets <tt class= + "varname">USE_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> and is <span class= + "emphasis"><em>required</em></span> in all <tt class= + "filename">builtin.mk</tt> files. The code in this + section must make the determination whether the + built-in software is adequate to satisfy the + dependencies listed in <tt class= + "varname">BUILDLINK_DEPENDS.<i class= + "replaceable"><tt>pkg</tt></i></tt>. This is typically + done by comparing <tt class= + "varname">BUILTIN_PKG.<i class= + "replaceable"><tt>pkg</tt></i></tt> against each of the + dependencies in <tt class= + "varname">BUILDLINK_DEPENDS.<i class= + "replaceable"><tt>pkg</tt></i></tt>. <tt class= + "varname">USE_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> <span class= + "emphasis"><em>must</em></span> be set to the correct + value by the end of the <tt class= + "filename">builtin.mk</tt> file. Note that <tt class= + "varname">USE_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> may be + “<span class="quote">yes</span>” even if + <tt class="varname">IS_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> is + “<span class="quote">no</span>” because we + may make the determination that the built-in version of + the software is similar enough to be used as a + replacement.</p> + + <p>The last section is guarded by <tt class= + "varname">CHECK_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt>, and includes code + that uses the value of <tt class= + "varname">USE_BUILTIN.<i class= + "replaceable"><tt>pkg</tt></i></tt> set in the previous + section. This typically includes, e.g., adding + additional dependency restrictions and listing + additional files to symlink into <tt class= + "filename">${BUILDLINK_DIR}</tt> (via <tt class= + "varname">BUILDLINK_FILES.<i class= + "replaceable"><tt>pkg</tt></i></tt>).</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2568739" id= + "id2568739"></a>9.3.2. Global preferences + for native or pkgsrc software</h3> + </div> + </div> + </div> + + <p>When building packages, it's possible to choose + whether to set a global preference for using either the + built-in (native) version or the pkgsrc version of + software to satisfy a dependency. This is controlled by + setting <tt class="varname">PREFER_PKGSRC</tt> and + <tt class="varname">PREFER_NATIVE</tt>. These variables + take values of either “<span class= + "quote">yes</span>”, “<span class= + "quote">no</span>”, or a list of packages. + <tt class="varname">PREFER_PKGSRC</tt> tells pkgsrc to + use the pkgsrc versions of software, while <tt class= + "varname">PREFER_NATIVE</tt> tells pkgsrc to use the + built-in versions. Preferences are determined by the + most specific instance of the package in either + <tt class="varname">PREFER_PKGSRC</tt> or <tt class= + "varname">PREFER_NATIVE</tt>. If a package is specified + in neither or in both variables, then <tt class= + "varname">PREFER_PKGSRC</tt> has precedence over + <tt class="varname">PREFER_NATIVE</tt>. For example, to + require using pkgsrc versions of software for all but + the most basic bits on a NetBSD system, you can + set:</p> + <pre class="programlisting"> + PREFER_PKGSRC= yes + PREFER_NATIVE= getopt skey tcp_wrappers + +</pre> + + <p>A package <span class= + "emphasis"><em>must</em></span> have a <tt class= + "filename">builtin.mk</tt> file to be listed in + <tt class="varname">PREFER_NATIVE</tt>, otherwise it is + simply ignored in that list.</p> + </div> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="options" id= + "options"></a>Chapter 10. Options + handling</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2568811">10.1. + Global default options</a></span></dt> + + <dt><span class="sect1"><a href="#id2568826">10.2. + Converting packages to use + bsd.options.mk</a></span></dt> + </dl> + </div> + + <p>Many packages have the ability to be built to support + different sets of features. <tt class= + "filename">bsd.options.mk</tt> is a framework in pkgsrc + that provides generic handling of those options that + determine different ways in which the packages can be + built. It's possible for the user to specify exactly which + sets of options will be built into a package or to allow a + set of global default options apply.</p> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2568811" id="id2568811"></a>10.1. Global + default options</h2> + </div> + </div> + </div> + + <p>Global default options are listed in <tt class= + "varname">PKG_DEFAULT_OPTIONS</tt>, which is a list of + the options that should be built into every package if + that option is supported. This variable should be set in + <tt class="filename">/etc/mk.conf</tt>.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2568826" id= + "id2568826"></a>10.2. Converting packages to + use <tt class="filename">bsd.options.mk</tt></h2> + </div> + </div> + </div> + + <p>The following example shows how <tt class= + "filename">bsd.options.mk</tt> should be use in a package + <tt class="filename">Makefile</tt>, or in a file, e.g. + <tt class="filename">options.mk</tt>, that is included by + the main package <tt class="filename">Makefile</tt>.</p> + <pre class="programlisting"> +# Global and legacy options +.if defined(WIBBLE_USE_OPENLDAP) && !empty(WIBBLE_USE_OPENLDAP:M[yY][eE][sS]) +PKG_DEFAULT_OPTIONS+= ldap +.endif +.if defined(USE_SASL2) && !empty(USE_SASL2:M[yY][eE][sS]) +PKG_DEFAULT_OPTIONS+= sasl +.endif + +PKG_OPTIONS_VAR= PKG_OPTIONS.wibble +PKG_SUPPORTED_OPTIONS= ldap sasl +# +# Default options for "wibble" package. +# +.if !defined(PKG_OPTIONS.wibble) +PKG_DEFAULT_OPTIONS+= sasl +endif +.include "../../mk/bsd.options.mk" + +# Package-specific option-handling + +### +### LDAP support +### +.if !empty(PKG_OPTIONS:Mldap) +. include "../../databases/openldap/buildlink3.mk" +CONFIGURE_ARGS+= --enable-ldap=${BUILDLINK_PREFIX.openldap} +.endif + +### +### SASL authentication +### +.if !empty(PKG_OPTIONS:Msasl) +. include "../../security/cyrus-sasl2/buildlink3.mk" +CONFIGURE_ARGS+= --enable-sasl=${BUILDLINK_PREFIX.sasl} +.endif + +</pre> + + <p>The first section only exists if you are converting a + package that had its own ad-hoc options handling to use + <tt class="filename">bsd.options.mk</tt>. It converts + global or legacy options variables into an equivalent + <tt class="varname">PKG_OPTIONS.<i class= + "replaceable"><tt>pkg</tt></i></tt> value. These sections + will be removed over time as the old options are in turn + deprecated and removed.</p> + + <p>The second section contains the information about + which build options are supported by the package, and any + default options settings if needed.</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p><tt class="varname">PKG_OPTIONS_VAR</tt> is a + list of the name of the <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">make</span>(1)</span></a> variables + that contain the options the user wishes to select. + The recommended value is “<span class= + "quote">PKG_OPTIONS.<i class= + "replaceable"><tt>pkg</tt></i></span>” but + any package-specific value may be used. This + variable should be set in a package Makefile.</p> + </li> + + <li> + <p><tt class="varname">PKG_SUPPORTED_OPTIONS</tt> + is a list of build options supported by the + package. This variable should be set in a package + Makefile.</p> + </li> + + <li> + <p><tt class="varname">${PKG_OPTIONS_VAR}</tt> (the + variables named in <tt class= + "varname">PKG_OPTIONS_VAR</tt>) are variables that + list the selected build options and override any + default options given in <tt class= + "varname">PKG_DEFAULT_OPTIONS</tt>. If any of the + options begin with a “<span class= + "quote">-</span>”, then that option is always + removed from the selected build options, e.g.</p> + <pre class="programlisting"> + PKG_DEFAULT_OPTIONS= kerberos ldap sasl + PKG_OPTIONS_VAR= WIBBLE_OPTIONS + WIBBLE_OPTIONS= ${PKG_DEFAULT_OPTIONS} -sasl + # implies PKG_OPTIONS == "kerberos ldap" + +</pre> + + <p>or</p> + <pre class="programlisting"> + PKG_OPTIONS_VAR= WIBBLE_OPTIONS + WIBBLE_OPTIONS= kerberos -ldap ldap + # implies PKG_OPTIONS == "kerberos" + +</pre> + + <p>This variable should be set in <tt class= + "filename">/etc/mk.conf</tt>.</p> + </li> + </ol> + </div> + + <p>After the inclusion of bsd.options.mk, the following + variables are set:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="varname">PKG_OPTIONS</tt> contains + the list of the selected build options, properly + filtered to remove unsupported and duplicate + options.</p> + </li> + </ul> + </div> + + <p>The remaining sections contain the logic that is + specific to each option. There should be a check for + every option listed in <tt class= + "varname">PKG_SUPPORTED_OPTIONS</tt>, and there should be + clear documentation on what turning on the option will do + in the comments preceding each section. The correct way + to check for an option is to check whether it is listed + in <tt class="varname">PKG_OPTIONS</tt>.</p> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="build" id= + "build"></a>Chapter 11. The build + process</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#build.prefix">11.1. + Program location</a></span></dt> + + <dt><span class="sect1"><a href="#id2569571">11.2. Main + targets</a></span></dt> + + <dt><span class="sect1"><a href= + "#build.helpful-targets">11.3. Other helpful + targets</a></span></dt> + </dl> + </div> + + <p>The basic steps for building a program are always the + same. First the program's source (<span class= + "emphasis"><em>distfile</em></span>) 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, <tt class= + "filename">pkgsrc/mk/bsd.pkg.mk</tt>.</p> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "build.prefix" id= + "build.prefix"></a>11.1. Program location</h2> + </div> + </div> + </div> + + <p>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.</p> + + <p>The automatic variable <tt class="varname">PREFIX</tt> + indicates where all files of the final program shall be + installed. It is usually set to <tt class= + "varname">LOCALBASE</tt> (<tt class= + "filename">/usr/pkg</tt>), or <tt class= + "varname">CROSSBASE</tt> for pkgs in the + “<span class="quote">cross</span>” category. + The value of <tt class="varname">PREFIX</tt> needs to be + put into the various places in the program's source where + paths to these files are encoded. See <a href= + "#components.patches" title= + "7.3. patches/*">Section 7.3, + “patches/*”</a> and <a href="#fixes.libtool" + title= + "12.3.1. Shared libraries - libtool">Section 12.3.1, + “Shared libraries - libtool”</a> for more + details.</p> + + <p>When choosing which of these variables to use, follow + the following rules:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="varname">PREFIX</tt> always points to + the location where the current pkg will be + installed. When referring to a pkg's own + installation path, use “<span class= + "quote">${PREFIX}</span>”.</p> + </li> + + <li> + <p><tt class="varname">LOCALBASE</tt> 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 “<span class= + "quote">${LOCALBASE}</span>”.</p> + </li> + + <li> + <p><tt class="varname">X11BASE</tt> is where the + actual X11 distribution (from xsrc, etc.) is + installed. When looking for <span class= + "emphasis"><em>standard</em></span> X11 includes + (not those installed by a pkg), use + “<span class= + "quote">${X11BASE}</span>”.</p> + </li> + + <li> + <p>X11 based are special in that they may be + installed in either <tt class= + "varname">X11BASE</tt> or <tt class= + "varname">LOCALBASE</tt>.</p> + + <p>Usually, X11 packages should be installed under + <tt class="varname">LOCALBASE</tt> whenever + possible. Note that you will need to set <tt class= + "varname">USE_X11</tt> in them to request the + presence of X11 and to get the right compilation + flags.</p> + + <p>Even though, there are some packages that cannot + be installed under <tt class= + "varname">LOCALBASE</tt>: those that come with + app-defaults files. These packages are special and + they must be placed under <tt class= + "varname">X11BASE</tt>. To accomplish this, set + either <tt class="varname">USE_X11BASE</tt> or + <tt class="varname">USE_IMAKE</tt> in your + package.</p> + + <p>Some notes: <tt class="varname">USE_X11</tt> and + <tt class="varname">USE_X11BASE</tt> are mutually + exclusive. If you need to find includes or + libraries installed by a pkg that has <tt class= + "varname">USE_IMAKE</tt> or <tt class= + "varname">USE_X11BASE</tt> in its pkg <tt class= + "filename">Makefile</tt>, you need to use + <span class="emphasis"><em>both</em></span> + <tt class="filename">${X11BASE}</tt> and <tt class= + "filename">${LOCALBASE}</tt>. To force installation + of all X11 packages in <tt class= + "varname">LOCALBASE</tt>, the <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/xpkgwedge/README.html" + class="pkgname">pkgtools/xpkgwedge</a> is enabled + by default.</p> + </li> + + <li> + <p><tt class="varname">X11PREFIX</tt> should be + used to refer to the installed location of an X11 + package. <tt class="varname">X11PREFIX</tt> will be + set to <tt class="varname">X11BASE</tt> if + xpkgwedge is not installed, and to <tt class= + "varname">LOCALBASE</tt> if xpkgwedge is + installed.</p> + </li> + + <li> + <p>If xpkgwedge is installed, it is possible to + have some packages installed in <tt class= + "varname">X11BASE</tt> and some in <tt class= + "varname">LOCALBASE</tt>. To determine the prefix + of an installed package, the <tt class= + "varname">EVAL_PREFIX</tt> definition can be used. + It takes pairs in the format “<span class= + "quote">DIRNAME=<package></span>”, and + the make(1) variable <tt class= + "varname">DIRNAME</tt> will be set to the prefix of + the installed package <package>, or + “<span class= + "quote">${X11PREFIX}</span>” if the package + is not installed.</p> + + <p>This is best illustrated by example.</p> + + <p>The following lines are taken from <tt class= + "filename">pkgsrc/wm/scwm/Makefile</tt>:</p> + <pre class="programlisting"> +EVAL_PREFIX+= GTKDIR=gtk+ +CONFIGURE_ARGS+= --with-guile-prefix=${LOCALBASE} \ + --with-gtk-prefix="${GTKDIR}" \ + --enable-multibyte +</pre> + + <p>Specific defaults can be defined for the + packages evaluated using <tt class= + "varname">EVAL_PREFIX</tt>, by using a definition + of the form:</p> + <pre class="programlisting"> +GTKDIR_DEFAULT= ${LOCALBASE} +</pre> + + <p>where <tt class="varname">GTKDIR</tt> + corresponds to the first definition in the + <tt class="varname">EVAL_PREFIX</tt> pair.</p> + </li> + + <li> + <p>Within <tt class="filename">${PREFIX}</tt>, + packages should install files according to hier(7), + with the exception that manual pages go into + <tt class="filename">${PREFIX}/man</tt>, not + <tt class="filename">${PREFIX}/share/man</tt>.</p> + </li> + </ul> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2569571" id="id2569571"></a>11.2. Main + targets</h2> + </div> + </div> + </div> + + <p>The main targets used during the build process defined + in <tt class="filename">bsd.pkg.mk</tt> are:</p> + + <div class="variablelist"> + <dl> + <dt><span class="term">fetch</span></dt> + + <dd> + <p>This will check if the file(s) given in the + variables <tt class="varname">DISTFILES</tt> and + <tt class="varname">PATCHFILES</tt> (as defined in + the package's Makefile) are present on the local + system in <tt class= + "filename">/usr/pkgsrc/distfiles</tt>. If they are + not present, an attempt will be made to fetch them + using commands of the form:</p> + <pre class="programlisting"> +${FETCH_CMD} ${FETCH_BEFORE_ARGS} ${site}${file} ${FETCH_AFTER_ARGS} +</pre> + + <p>where ${site} varies through several + possibilities in turn: first, <tt class= + "varname">MASTER_SITE_OVERRIDE</tt> is tried, then + the sites specified in either <tt class= + "varname">SITES_file</tt> if defined, else + <tt class="varname">MASTER_SITES</tt> or <tt class= + "varname">PATCH_SITES</tt>, as applies, then + finally the value of <tt class= + "varname">MASTER_SITE_BACKUP</tt>. The order of all + except the first can be optionally sorted by the + user, via setting either <tt class= + "varname">MASTER_SORT_AWK</tt> or <tt class= + "varname">MASTER_SORT_REGEX</tt>.</p> + </dd> + + <dt><span class="term">checksum</span></dt> + + <dd> + <p>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.</p> + </dd> + + <dt><span class="term">extract</span></dt> + + <dd> + <p>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 <tt class= + "filename">.tar.gz</tt>.</p> + + <p>If only some of the distfiles need to be + uncompressed, the files to be uncompressed should + be put into <tt class= + "varname">EXTRACT_ONLY</tt>.</p> + + <p>If the distfiles are not in <tt class= + "filename">.tar.gz</tt> format, they can be + extracted by setting either <tt class= + "varname">EXTRACT_SUFX</tt>, or <tt class= + "varname">EXTRACT_CMD</tt>, <tt class= + "varname">EXTRACT_BEFORE_ARGS</tt> and <tt class= + "varname">EXTRACT_AFTER_ARGS</tt>. In the former + case, pkgsrc knows how to extract a number of + suffixes (<tt class="filename">.tar.gz</tt>, + <tt class="filename">.tgz</tt>, <tt class= + "filename">.tar.gz2</tt>, <tt class= + "filename">.tbz</tt>, <tt class= + "filename">.tar.Z</tt>, <tt class= + "filename">.tar</tt>, <tt class= + "filename">.shar.gz</tt>, <tt class= + "filename">.shar.bz2</tt>, <tt class= + "filename">.shar.Z</tt>, <tt class= + "filename">.shar</tt>, <tt class= + "filename">.Z</tt>, <tt class="filename">.bz2</tt> + and <tt class="filename">.gz</tt>; see the + definition of the various <tt class= + "varname">DECOMPRESS_CMD</tt> variables <tt class= + "filename">bsd.pkg.mk</tt> for a complete list). + Here's an example on how to use the other variables + for a program that comes with a compressed shell + archive whose name ends in <tt class= + "filename">.msg.gz</tt>:</p> + <pre class="programlisting"> + EXTRACT_SUFX= .msg.gz + EXTRACT_CMD= zcat + EXTRACT_BEFORE_ARGS= + EXTRACT_AFTER_ARGS= |sh +</pre> + </dd> + + <dt><span class="term">patch</span></dt> + + <dd> + <p>After extraction, all the patches named by the + <tt class="varname">PATCHFILES</tt>, those present + in the patches subdirectory of the package as well + as in $LOCALPATCHES/$PKGPATH (e.g. <tt class= + "filename">/usr/local/patches/graphics/png</tt>) + are applied. Patchfiles ending in <tt class= + "filename">.Z</tt> or <tt class="filename">.gz</tt> + are uncompressed before they are applied, files + ending in <tt class="filename">.orig</tt> or + <tt class="filename">.rej</tt> are ignored. Any + special options to patch(1) can be handed in + <tt class="varname">PATCH_DIST_ARGS</tt>. See + <a href="#components.patches" title= + "7.3. patches/*">Section 7.3, + “patches/*”</a> for more details.</p> + + <p>By default patch(1) is given special args to + make it fail if the patches apply with some lines + of fuzz. Please fix (regen) the patches so that + they apply cleanly. The rationale behind this is + that patches that don't apply cleanly may end up + being applied in the wrong place, and cause severe + harm there.</p> + </dd> + + <dt><span class="term">configure</span></dt> + + <dd> + <p>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.</p> + + <p>If the program's distfile contains its own + configure script, this can be invoked by setting + <tt class="varname">HAS_CONFIGURE</tt>. If the + configure script is a GNU autoconf script, + <tt class="varname">GNU_CONFIGURE</tt> should be + specified instead. In either case, any arguments to + the configure script can be specified in the + <tt class="varname">CONFIGURE_ARGS</tt> variable, + and the configure script's name can be set in + <tt class="varname">CONFIGURE_SCRIPT</tt> if it + differs from the default “<span class= + "quote">configure</span>”. Here's an example + from the <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/sysutils/top/README.html" + class="pkgname">sysutils/top</a> package:</p> + <pre class="programlisting"> +HAS_CONFIGURE= yes +CONFIGURE_SCRIPT= Configure +CONFIGURE_ARGS+= netbsd13 +</pre> + + <p>If the program uses an Imakefile for + configuration, the appropriate steps can be invoked + by setting <tt class="varname">USE_IMAKE</tt> to + “<span class="quote">YES</span>”. (If + you only want the package installed in <tt class= + "varname">$X11PREFIX</tt> but xmkmf not being run, + set <tt class="varname">USE_X11BASE</tt> + instead!)</p> + </dd> + + <dt><span class="term">build</span></dt> + + <dd> + <p>Once configuration has taken place, the software + will be built by invoking <tt class= + "varname">$MAKE_PROGRAM</tt> on <tt class= + "varname">$MAKEFILE</tt> with <tt class= + "varname">$ALL_TARGET</tt> as the target to build. + The default <tt class="varname">MAKE_PROGRAM</tt> + is “<span class="quote">gmake</span>” + if <tt class="varname">USE_GMAKE</tt> is set, + “<span class="quote">make</span>” + otherwise. <tt class="varname">MAKEFILE</tt> is set + to “<span class= + "quote">Makefile</span>” by default, and + <tt class="varname">ALL_TARGET</tt> defaults to + “<span class="quote">all</span>”. Any + of these variables can be set in the package's + Makefile to change the default build process.</p> + </dd> + + <dt><span class="term">install</span></dt> + + <dd> + <p>Once the build stage has completed, the final + step is to install the software in public + directories, so users can access the programs and + files. As in the build-target, <tt class= + "varname">$MAKE_PROGRAM</tt> is invoked on + <tt class="varname">$MAKEFILE</tt> here, but with + the <tt class="varname">$INSTALL_TARGET</tt> + instead, the latter defaulting to + “<span class="quote">install</span>” + (plus “<span class= + "quote">install.man</span>”, if <tt class= + "varname">USE_IMAKE</tt> is set).</p> + </dd> + </dl> + </div> + + <p>If no target is specified, the default is + “<span class="quote">build</span>”. If a + subsequent stage is requested, all prior stages are made: + e.g. <span><b class="command">make build</b></span> will + also perform the equivalent of:</p> + <pre class="programlisting"> +make fetch +make checksum +make extract +make patch +make configure +make build +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "build.helpful-targets" id= + "build.helpful-targets"></a>11.3. Other + helpful targets</h2> + </div> + </div> + </div> + + <div class="variablelist"> + <dl> + <dt><span class="term">pre/post-*</span></dt> + + <dd> + <p>For any of the main targets described in the + previous section, two auxiliary targets exist with + “<span class="quote">pre-</span>” and + “<span class="quote">post-</span>” 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 be performed from a package's + Makefile, for example, which a program's configure + script or install target omitted.</p> + </dd> + + <dt><span class="term">do-*</span></dt> + + <dd> + <p>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.</p> + </dd> + + <dt><span class="term">reinstall</span></dt> + + <dd> + <p>If you did a <span><b class="command">make + install</b></span> and you noticed some file was + not installed properly, you can repeat the + installation with this target, which will ignore + the “<span class="quote">already + installed</span>” flag.</p> + </dd> + + <dt><span class="term">deinstall</span></dt> + + <dd> + <p>This target does a pkg_delete(1) in the current + directory, effectively de-installing the package. + The following variables can be used to tune the + behaviour:</p> + + <div class="variablelist"> + <dl> + <dt><span class="term"><tt class= + "varname">PKG_VERBOSE</tt></span></dt> + + <dd> + <p>Add a "-v" to the <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_delete</span>(1)</span></a> + command.</p> + </dd> + + <dt><span class="term"><tt class= + "varname">DEINSTALLDEPENDS</tt></span></dt> + + <dd> + <p>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 + <span><b class="command">make deinstall + DEINSTALLDEPENDS=1</b></span> is done in + <tt class="filename">pkgsrc/x11/kde</tt>, + this is likely to remove whole KDE. Works by + adding “<span class= + "quote">-R</span>” to the <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_delete</span>(1)</span></a> + command line.</p> + </dd> + </dl> + </div> + </dd> + + <dt><span class="term">update</span></dt> + + <dd> + <p>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 <span><b class= + "command">make deinstall</b></span> and + <span><b class="command">make install</b></span> + (or whatever <tt class="varname">UPDATE_TARGET</tt> + is set to) for these packages.</p> + + <p>You can use the “<span class= + "quote">update</span>” target to resume + package updating in case a previous <span><b class= + "command">make update</b></span> was interrupted + for some reason. However, in this case, make sure + you don't call <span><b class="command">make + clean</b></span> or otherwise remove the list of + dependent packages in <tt class= + "varname">WRKDIR</tt>. Otherwise you lose the + ability to automatically update the current package + along with the dependent packages you have + installed.</p> + + <p>Resuming an interrupted <span><b class= + "command">make update</b></span> 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 <span><b class= + "command">make update</b></span> will most + certainly fail!</p> + + <p>The following variables can be used either on + the command line or in <tt class= + "filename">/etc/mk.conf</tt> to alter the behaviour + of <span><b class="command">make + update</b></span>:</p> + + <div class="variablelist"> + <dl> + <dt><span class="term"><tt class= + "varname">UPDATE_TARGET</tt></span></dt> + + <dd> + <p>Install target to recursively use for the + updated package and the dependent packages. + Defaults to <tt class= + "varname">DEPENDS_TARGET</tt> if set, + “<span class= + "quote">install</span>” otherwise for + <span><b class="command">make + update</b></span>. e.g. <span><b class= + "command">make update + UPDATE_TARGET=package</b></span></p> + </dd> + + <dt><span class="term"><tt class= + "varname">NOCLEAN</tt></span></dt> + + <dd> + <p>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 + “<span class= + "quote">clean-update</span>” target + below) or you may run into troubles with old + source code still lying around on your next + <span><b class="command">make</b></span> or + <span><b class="command">make + update</b></span>.</p> + </dd> + + <dt><span class="term"><tt class= + "varname">REINSTALL</tt></span></dt> + + <dd> + <p>Deinstall each package before installing + (making <tt class= + "varname">DEPENDS_TARGET</tt>). This may be + necessary if the “<span class= + "quote">clean-update</span>” target + (see below) was called after interrupting a + running <span><b class="command">make + update</b></span>.</p> + </dd> + + <dt><span class="term"><tt class= + "varname">DEPENDS_TARGET</tt></span></dt> + + <dd> + <p>Allows you to disable recursion and + hardcode the target for packages. The default + is “<span class= + "quote">update</span>” for the update + target, facilitating a recursive update of + prerequisite packages. Only set <tt class= + "varname">DEPENDS_TARGET</tt> if you want to + disable recursive updates. Use <tt class= + "varname">UPDATE_TARGET</tt> instead to just + set a specific target for each package to be + installed during <span><b class= + "command">make update</b></span> (see + above).</p> + </dd> + </dl> + </div> + </dd> + + <dt><span class="term">clean-update</span></dt> + + <dd> + <p>Clean the source tree for all packages that + would get updated if <span><b class="command">make + update</b></span> 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 + <span><b class="command">make update</b></span>) or + you may lose some packages you intended to update. + As a rule of thumb: only use this target + <span class="emphasis"><em>before</em></span> the + first time you run <span><b class="command">make + update</b></span> and only if you have a dirty + package tree (e.g., if you used <tt class= + "varname">NOCLEAN</tt>).</p> + + <p>If you unsure about whether your tree is clean + you can either perform a <span><b class= + "command">make clean</b></span> at the top of the + tree, or use the following sequence of commands + from the directory of the package you want to + update (<span class= + "emphasis"><em>before</em></span> running + <span><b class="command">make update</b></span> for + the first time, otherwise you lose all the packages + you wanted to update!):</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make clean-update</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make clean CLEANDEPENDS=YES</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make update</tt></b> +</pre> + + <p>The following variables can be used either on + the command line or in <tt class= + "filename">/etc/mk.conf</tt> to alter the behaviour + of <span><b class="command">make + clean-update</b></span>:</p> + + <div class="variablelist"> + <dl> + <dt><span class="term"><tt class= + "varname">CLEAR_DIRLIST</tt></span></dt> + + <dd> + <p>After <span><b class="command">make + clean</b></span>, do not reconstruct the list + of directories to update for this package. + Only use this if <span><b class= + "command">make update</b></span> successfully + installed all packages you wanted to update. + Normally, this is done automatically on + <span><b class="command">make + update</b></span>, but may have been + suppressed by the <tt class= + "varname">NOCLEAN</tt> variable (see + above).</p> + </dd> + </dl> + </div> + </dd> + + <dt><span class="term">info</span></dt> + + <dd> + <p>This target invokes <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_info+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_info</span>(1)</span></a> for + the current package. You can use this to check + which version of a package is installed.</p> + </dd> + + <dt><span class="term">readme</span></dt> + + <dd> + <p>This target generates a <tt class= + "filename">README.html</tt> file, which can be + viewed using a browser such as <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/www/mozilla/README.html" + class="pkgname">www/mozilla</a> or <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/www/links/README.html" + class="pkgname">www/links</a>. The generated files + contain references to any packages which are in the + <tt class="varname">PACKAGES</tt> directory on the + local host. The generated files can be made to + refer to URLs based on <tt class= + "varname">FTP_PKG_URL_HOST</tt> and <tt class= + "varname">FTP_PKG_URL_DIR</tt>. For example, if I + wanted to generate <tt class= + "filename">README.html</tt> files which pointed to + binary packages on the local machine, in the + directory <tt class="filename">/usr/packages</tt>, + set <tt class= + "varname">FTP_PKG_URL_HOST=file://localhost</tt> + and <tt class= + "varname">FTP_PKG_URL_DIR=/usr/packages</tt>. The + <tt class="varname">${PACKAGES}</tt> directory and + its subdirectories will be searched for all the + binary packages.</p> + </dd> + + <dt><span class="term">readme-all</span></dt> + + <dd> + <p>Use this target to create a file <tt class= + "filename">README-all.html</tt> 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 <tt class= + "filename">pkgsrc/*/README.html</tt> files, so be + sure to run this <span class= + "emphasis"><em>after</em></span> a <span><b class= + "command">make readme</b></span>.</p> + </dd> + + <dt><span class="term">cdrom-readme</span></dt> + + <dd> + <p>This is very much the same as the + “<span class="quote">readme</span>” + target (see above), but is to be used when + generating a pkgsrc tree to be written to a CD-ROM. + This target also produces <tt class= + "filename">README.html</tt> files, and can be made + to refer to URLs based on <tt class= + "varname">CDROM_PKG_URL_HOST</tt> and <tt class= + "varname">CDROM_PKG_URL_DIR</tt>.</p> + </dd> + + <dt><span class="term">show-distfiles</span></dt> + + <dd> + <p>This target shows which distfiles and patchfiles + are needed to build the package. (<tt class= + "varname">DISTFILES</tt> and <tt class= + "varname">PATCHFILES</tt>, but not <tt class= + "filename">patches/*</tt>)</p> + </dd> + + <dt><span class="term">show-downlevel</span></dt> + + <dd> + <p>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.</p> + </dd> + + <dt><span class="term">show-pkgsrc-dir</span></dt> + + <dd> + <p>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 “<span class= + "quote">show-host-specific-pkgs</span>” + target.</p> + </dd> + + <dt><span class= + "term">show-installed-depends</span></dt> + + <dd> + <p>This target shows which installed packages match + the current package's <tt class= + "varname">DEPENDS</tt>. Useful if out of date + dependencies are causing build problems.</p> + </dd> + + <dt><span class="term">check-shlibs</span></dt> + + <dd> + <p>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 <tt class="varname">PKG_DEVELOPER</tt> + is set in <tt class= + "filename">/etc/mk.conf</tt>.</p> + </dd> + + <dt><span class="term">print-PLIST</span></dt> + + <dd> + <p>After a “<span class="quote">make + install</span>” from a new or upgraded pkg, + this prints out an attempt to generate a new + <tt class="filename">PLIST</tt> from a + <span><b class="command">find -newer + work/.extract_done</b></span>. An attempt is made + to care for shared libs etc., but it is + <span class="emphasis"><em>strongly</em></span> + recommended to review the result before putting it + into <tt class="filename">PLIST</tt>. On upgrades, + it's useful to diff the output of this command + against an already existing <tt class= + "filename">PLIST</tt> file.</p> + + <p>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 + <tt class="filename">PLIST</tt>, as the + “<span class="quote">find + -newer</span>” command used by this target + won't catch them!</p> + + <p>See <a href="#print-PLIST" title= + "8.3. Tweaking output of make print-PLIST">Section 8.3, + “Tweaking output of make + print-PLIST”</a> for more information on this + target.</p> + </dd> + + <dt><span class="term">bulk-package</span></dt> + + <dd> + <p>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 <tt class= + "varname">PKG_DEPENDS</tt> is set properly. See + <a href="#binary.configuration" title= + "5.3.1. Configuration">Section 5.3.1, + “Configuration”</a>. After creating the + binary package, the sources, the just-installed + package and it's required packages are removed, + preserving free disk space.</p> + + <p><span class="emphasis"><em>Beware that this + target may deinstall all packages installed on a + system!</em></span></p> + </dd> + + <dt><span class="term">bulk-install</span></dt> + + <dd> + <p>Used during bulk-installs to install required + packages. If an upto-date binary package is + available, it will be installed via <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a>. If + not, <span><b class="command">make + bulk-package</b></span> will be executed, but the + installed binary not be removed.</p> + + <p>A binary package is considered + “<span class="quote">upto-date</span>” + to be installed via <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_add</span>(1)</span></a> + if:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>None of the package's files (<tt class= + "filename">Makefile</tt>, ...) were modified + since it was built.</p> + </li> + + <li> + <p>None of the package's required (binary) + packages were modified since it was + built.</p> + </li> + </ul> + </div> + + <p><span class="emphasis"><em>Beware that this + target may deinstall all packages installed on a + system!</em></span></p> + </dd> + </dl> + </div> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="fixes" id= + "fixes"></a>Chapter 12. Notes on fixes for + packages</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2570968">12.1. + General operation</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2570971">12.1.1. How to pull in variables from + /etc/mk.conf</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571054">12.1.2. Restricted + packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#dependencies">12.1.3. Handling + dependencies</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571501">12.1.4. Handling conflicts with other + packages</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571620">12.1.5. Packages that cannot or should + not be built</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571645">12.1.6. Packages which should not be + deleted, once installed</a></span></dt> + + <dt><span class="sect2"><a href= + "#security-handling">12.1.7. Handling packages with + security problems</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571737">12.1.8. How to handle compiler + bugs</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571760">12.1.9. How to handle incrementing + versions when fixing an existing + package</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2571809">12.1.10. Portability of + packages</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2571901">12.2. + Possible downloading issues</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2571905">12.2.1. Packages whose distfiles + aren't available for plain + downloading</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572036">12.2.2. How to handle modified + distfiles with the 'old' name</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572048">12.3. + Configuration gotchas</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#fixes.libtool">12.3.1. Shared libraries - + libtool</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572523">12.3.2. Using libtool on GNU packages + that already support libtool</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572608">12.3.3. GNU + Autoconf/Automake</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572652">12.4. + Building considerations</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2572656">12.4.1. CPP defines</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2572685">12.5. + Package specific actions</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href= + "#id2572689">12.5.1. Package configuration + files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572859">12.5.2. User + Interaction</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572904">12.5.3. Handling + licenses</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2572987">12.5.4. Creating an account from a + package</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573049">12.5.5. Installing score + files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573093">12.5.6. Packages providing login + shells</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573424">12.5.7. Packages containing perl + scripts</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573442">12.5.8. Packages with hardcoded paths + to other interpreters</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573463">12.5.9. Packages installing perl + modules</a></span></dt> + + <dt><span class="sect2"><a href= + "#faq.info-files">12.5.10. Packages installing info + files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573751">12.5.11. Packages installing GConf2 + data files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573851">12.5.12. Packages installing + scrollkeeper data files</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2573902">12.5.13. Packages installing X11 + fonts</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574018">12.5.14. Packages installing GTK2 + modules</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574087">12.5.15. Packages installing SGML or + XML data</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574139">12.5.16. Packages installing + extensions to the MIME database</a></span></dt> + + <dt><span class="sect2"><a href= + "#id2574210">12.5.17. Packages using + intltool</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2574224">12.6. + Feedback to the author</a></span></dt> + </dl> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2570968" id="id2570968"></a>12.1. General + operation</h2> + </div> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2570971" id= + "id2570971"></a>12.1.1. How to pull in + variables from /etc/mk.conf</h3> + </div> + </div> + </div> + + <p>The problem with package-defined variables that can + be overridden via <tt class="varname">MAKECONF</tt> or + <tt class="filename">/etc/mk.conf</tt> is that <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">make</span>(1)</span></a> 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 <tt class= + "filename">/etc/mk.conf</tt>) in one of the .if* + statements, the file <tt class= + "filename">/etc/mk.conf</tt> must be included before + that .if* statement.</p> + + <p>Rather than have a number of ad-hoc ways of + including <tt class="filename">/etc/mk.conf</tt>, + should it exist, or <tt class="varname">MAKECONF</tt>, + should it exist, include the <tt class= + "filename">pkgsrc/mk/bsd.prefs.mk</tt> file in the + package Makefile before any preprocessor-like .if, + .ifdef, or .ifndef statements:</p> + <pre class="programlisting"> +.include "../../mk/bsd.prefs.mk" + + .if defined(USE_MENUS) + ... + .endif +</pre> + + <p>If you wish to set the <tt class= + "varname">CFLAGS</tt> variable in <tt class= + "filename">/etc/mk.conf</tt> please make sure to + use:</p> + <pre class="programlisting"> +CFLAGS+= -your -flags +</pre> + + <p>Using <tt class="varname">CFLAGS=</tt> (i.e. without + the “<span class="quote">+</span>”) may + lead to problems with packages that need to add their + own flags. Also, you may want to take a look at the + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" + href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/devel/cpuflags/README.html" + class="pkgname">devel/cpuflags</a> package if you're + interested in optimization for the current CPU.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2571054" id= + "id2571054"></a>12.1.2. Restricted + packages</h3> + </div> + </div> + </div> + + <p>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:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="varname">RESTRICTED</tt></p> + + <p>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.</p> + </li> + + <li> + <p><tt class="varname">NO_BIN_ON_CDROM</tt></p> + + <p>Binaries may not be placed on CD-ROM. Set this + variable to <tt class= + "varname">${RESTRICTED}</tt> whenever a binary + package may not be included on a CD-ROM.</p> + </li> + + <li> + <p><tt class="varname">NO_BIN_ON_FTP</tt></p> + + <p>Binaries may not be placed on an FTP server. + Set this variable to <tt class= + "varname">${RESTRICTED}</tt> whenever a binary + package may not not be made available on the + Internet.</p> + </li> + + <li> + <p><tt class="varname">NO_SRC_ON_CDROM</tt></p> + + <p>Distfiles may not be placed on CD-ROM. Set + this variable to <tt class= + "varname">${RESTRICTED}</tt> if re-distribution + of the source code or other distfile(s) is not + allowed on CD-ROMs.</p> + </li> + + <li> + <p><tt class="varname">NO_SRC_ON_FTP</tt></p> + + <p>Distfiles may not be placed on FTP. Set this + variable to <tt class= + "varname">${RESTRICTED}</tt> if re-distribution + of the source code or other distfile(s) via the + Internet is not allowed.</p> + </li> + </ul> + </div> + + <p>Please note that the use of <tt class= + "varname">NO_PACKAGE</tt>, <tt class= + "varname">IGNORE</tt>, <tt class= + "varname">NO_CDROM</tt>, or other generic make + variables to denote restrictions is deprecated, because + they unconditionally prevent users from generating + binary packages!</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="dependencies" id= + "dependencies"></a>12.1.3. Handling + dependencies</h3> + </div> + </div> + </div> + + <p>Your package may depend on some other package being + present - and there are various ways of expressing this + dependency. pkgsrc supports the <tt class= + "varname">BUILD_DEPENDS</tt> and <tt class= + "varname">DEPENDS</tt> definitions, as well as + dependencies via <tt class= + "filename">buildlink3.mk</tt>, which is the preferred + way to handle dependencies, and which uses the + variables named above. See <a href="#buildlink" title= + "Chapter 9. Buildlink methodology">Chapter 9, + <i>Buildlink methodology</i></a> for more + information.</p> + + <p>The basic difference between the two variables is as + follows: The <tt class="varname">DEPENDS</tt> + definition registers that pre-requisite in the binary + package so it will be pulled in when the binary package + is later installed, whilst the <tt class= + "varname">BUILD_DEPENDS</tt> definition does not, + marking a dependency that is only needed for building + the package.</p> + + <p>This means that if you only need a package present + whilst you are building, it should be noted as a + <tt class="varname">BUILD_DEPENDS</tt>.</p> + + <p>The format for a <tt class= + "varname">BUILD_DEPENDS</tt> and a <tt class= + "varname">DEPENDS</tt> definition is:</p> + <pre class="programlisting"> +<pre-req-package-name>:../../<category>/<pre-req-package> +</pre> + + <p>Please note that the “<span class= + "quote">pre-req-package-name</span>” may include + any of the wildcard version numbers recognised by + <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_info+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_info</span>(1)</span></a>.</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>If your package needs another package's + binaries or libraries to build or run, and if + that package has a <tt class= + "filename">buildlink3.mk</tt> file available, use + it:</p> + <pre class="programlisting"> + .include "../../graphics/jpeg/buildlink3.mk" + +</pre> + </li> + + <li> + <p>If your package needs to use another package + to build itself and there is no <tt class= + "filename">buildlink3.mk</tt> file available, use + the <tt class="varname">BUILD_DEPENDS</tt> + definition:</p> + <pre class="programlisting"> +BUILD_DEPENDS+= autoconf-2.13:../../devel/autoconf +</pre> + </li> + + <li> + <p>If your package needs a library with which to + link and again there is no <tt class= + "filename">buildlink3.mk</tt> file available, + this is specified using the <tt class= + "varname">DEPENDS</tt> definition. An example of + this is the <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/print/lyx/README.html" + class="pkgname">print/lyx</a> package, which uses + the xpm library, version 3.4j to build:</p> + <pre class="programlisting"> +DEPENDS+= xpm-3.4j:../../graphics/xpm +</pre> + + <p>You can also use wildcards in package + dependences:</p> + <pre class="programlisting"> +DEPENDS+= xpm-[0-9]*:../../graphics/xpm +</pre> + + <p>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.</p> + + <p>The “<span class= + "quote">-[0-9]*</span>” should be used + instead of “<span class= + "quote">-*</span>” to avoid potentially + ambiguous matches such as “<span class= + "quote">tk-postgresql</span>” matching a + “<span class="quote">tk-*</span>” + <tt class="varname">DEPENDS</tt>.</p> + + <p>Wildcards can also be used to specify that a + package will only build against a certain minimum + version of a pre-requisite:</p> + <pre class="programlisting"> +DEPENDS+= tiff>=3.5.4:../../graphics/tiff +</pre> + + <p>This means that the package will build against + version 3.5.4 of the tiff library or newer. Such + a dependency may be warranted if, for example, + the API of the library has changed with version + 3.5.4 and a package would not compile against an + earlier version of tiff.</p> + + <p>Please note that such dependencies should only + be updated if a package requires a newer + pre-requisite, but not to denote recommendations + such as security updates or ABI changes that do + not prevent a package from building correctly. + Such recommendations can be expressed using + <tt class="varname">RECOMMENDED</tt>:</p> + <pre class="programlisting"> +RECOMMENDED+= tiff>=3.6.1:../../graphics/tiff +</pre> + + <p>In addition to the above <tt class= + "varname">DEPENDS</tt> line, this denotes that + while a package will build against + tiff>=3.5.4, at least version 3.6.1 is + recommended. <tt class="varname">RECOMMENDED</tt> + entries will be turned into dependencies unless + explicitly ignored (in which case a warning will + be printed). Packages that are built with + recommendations ignored may not be uploaded to + ftp.NetBSD.org by developers and should not be + used across different systems that may have + different versions of binary packages + installed.</p> + + <p>For security fixes, please update the package + vulnerabilities file as well as setting + <tt class="varname">RECOMMENDED</tt>, see + <a href="#security-handling" title= + "12.1.7. Handling packages with security problems"> + Section 12.1.7, “Handling packages with + security problems”</a> for more + information.</p> + </li> + + <li> + <p>If your package needs some executable to be + able to run correctly and if there's agail no + <tt class="filename">buildlink3.mk</tt> file, + this is specified using the <tt class= + "varname">DEPENDS</tt> variable. The <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/print/lyx/README.html" + class="pkgname">print/lyx</a> package needs to be + able to execute the latex binary from the teTeX + package when it runs, and that is specified:</p> + <pre class="programlisting"> +DEPENDS+= teTeX-[0-9]*:../../print/teTeX +</pre> + + <p>The comment about wildcard dependencies from + previous paragraph applies here, too.</p> + </li> + </ol> + </div> + + <p>If your package needs files from another package to + build, see the first part of the “<span class= + "quote">do-configure</span>” target <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/print/ghostscript5/README.html" + class="pkgname">print/ghostscript5</a> package (it + relies on the jpeg sources being present in source form + during the build):</p> + <pre class="programlisting"> +if [ ! -e ${_PKGSRCDIR}/graphics/jpeg/${WRKDIR:T}/jpeg-6b ]; then \ + cd ${_PKGSRCDIR}/../../graphics/jpeg && ${MAKE} extract; \ + fi +</pre> + + <p>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:</p> + <pre class="programlisting"> +pre-clean: + cd ${_PKGSRCDIR}/../../graphics/jpeg && ${MAKE} clean +</pre> + + <p>Please also note the <tt class= + "varname">BUILD_USES_MSGFMT</tt> and <tt class= + "varname">BUILD_USES_GETTEXT_M4</tt> 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 <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/devel/gettext/README.html" + class="pkgname">devel/gettext</a> package. The latter + adds a build dependency on either an installed version + of an older gettext package, or if it isn't, installs + the <a xmlns="http://www.w3.org/TR/xhtml1/transitional" + href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/devel/gettext-m4/README.html" + class="pkgname">devel/gettext-m4</a> package.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2571501" id= + "id2571501"></a>12.1.4. Handling conflicts + with other packages</h3> + </div> + </div> + </div> + + <p>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.</p> + + <p>In this case you can set <tt class= + "varname">CONFLICTS</tt> to a space separated list of + packages (including version string) your package + conflicts with.</p> + + <p>For example <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/x11/Xaw3d/README.html" + class="pkgname">x11/Xaw3d</a> and <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/x11/Xaw-Xpm/README.html" + class="pkgname">x11/Xaw-Xpm</a> install provide the + same shared library, thus you set in <tt class= + "filename">pkgsrc/x11/Xaw3d/Makefile</tt>:</p> + <pre class="programlisting"> +CONFLICTS= Xaw-Xpm-[0-9]* +</pre> + + <p>and in <tt class= + "filename">pkgsrc/x11/Xaw-Xpm/Makefile</tt>:</p> + <pre class="programlisting"> +CONFLICTS= Xaw3d-[0-9]* +</pre> + + <p>Packages will automatically conflict with other + packages with the name prefix and a different version + string. “<span class= + "quote">Xaw3d-1.5</span>” e.g. will automatically + conflict with the older version “<span class= + "quote">Xaw3d-1.3</span>”.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2571620" id= + "id2571620"></a>12.1.5. Packages that cannot + or should not be built</h3> + </div> + </div> + </div> + + <p>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 <tt class= + "varname">NOT_FOR_PLATFORM</tt>. If the package builds + and runs on a small handful of platforms, set + <tt class="varname">ONLY_FOR_PLATFORM</tt> instead. If + the package should be skipped (for example, because it + provides functionality already provided by the system), + set <tt class="varname">PKG_SKIP_REASON</tt> to a + descriptive message. If the package should fail because + some preconditions are not met, set <tt class= + "varname">PKG_FAIL_REASON</tt> to a descriptive + message.</p> + + <p><tt class="varname">IGNORE</tt> is deprecated + because it didn't provide enough information to + determine whether the build should fail.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2571645" id= + "id2571645"></a>12.1.6. Packages which + should not be deleted, once installed</h3> + </div> + </div> + </div> + + <p>To ensure that a package may not be deleted, once it + has been installed, the <tt class= + "varname">PKG_PRESERVE</tt> definition should be set in + the package Makefile. This will be carried into any + binary package that is made from this pkgsrc entry. A + “<span class="quote">preserved</span>” + package will not be deleted using <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">pkg_delete</span>(1)</span></a> unless + the “<span class="quote">-f</span>” option + is used.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="security-handling" id= + "security-handling"></a>12.1.7. Handling + packages with security problems</h3> + </div> + </div> + </div> + + <p>When a vulnerability is found, this should be noted + in <tt class= + "filename">localsrc/security/advisories/pkg-vulnerabilities</tt>, + and after the commit of that file, it should be copied + to both <tt class= + "filename">/pub/NetBSD/packages/distfiles/pkg-vulnerabilities</tt> + and <tt class= + "filename">/pub/NetBSD/packages/distfiles/vulnerabilities</tt> + on ftp.NetBSD.org using <tt class= + "filename">localsrc/security/advisories/Makefile</tt>. + In addition, if a <tt class= + "filename">buildlink3.mk</tt> file exists for an + affected package, bumping <tt class= + "varname">PKGREVISION</tt> and creating a corresponding + <tt class="varname">BUILDLINK_RECOMMENDED.<i class= + "replaceable"><tt>pkg</tt></i></tt> entry should be + considered. See <a href="#buildlink" title= + "Chapter 9. Buildlink methodology">Chapter 9, + <i>Buildlink methodology</i></a> for more information + about writing <tt class="filename">buildlink3.mk</tt> + files and <tt class="varname">BUILDLINK_*</tt> + definitions.</p> + + <p>Also, if the fix should be applied to the stable + pkgsrc branch, be sure to submit a pullup request!</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2571737" id= + "id2571737"></a>12.1.8. How to handle + compiler bugs</h3> + </div> + </div> + </div> + + <p>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.</p> + + <p>Typically a workaround involves testing the + <tt class="varname">MACHINE_ARCH</tt> and compiler + version, disabling optimisation for that + file/<tt class="varname">MACHINE_ARCH</tt>/compiler + combination, and documenting it in <tt class= + "filename">pkgsrc/doc/HACKS</tt>. See that file for a + number of examples!</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2571760" id= + "id2571760"></a>12.1.9. How to handle + incrementing versions when fixing an existing + package</h3> + </div> + </div> + </div> + + <p>When making fixes to an existing package it can be + useful to change the version number in <tt class= + "varname">PKGNAME</tt>. To avoid conflicting with + future versions by the original author, a + “<span class="quote">nb1</span>”, + “<span class="quote">nb2</span>”, ... + suffix can be used on package versions by setting + <tt class="varname">PKGREVISION=1</tt> (2, ...). The + “<span class="quote">nb</span>” is treated + like a “<span class="quote">.</span>” by + the pkg tools. e.g.</p> + <pre class="programlisting"> + DISTNAME= foo-17.42 + PKGREVISION= 9 +</pre> + + <p>will result in a <tt class="varname">PKGNAME</tt> of + “<span class= + "quote">foo-17.42nb9</span>”.</p> + + <p>When a new release of the package is released, the + <tt class="varname">PKGREVISION</tt> should be removed. + e.g. on a new minor release of the above package, + things should be like:</p> + <pre class="programlisting"> +DISTNAME= foo-17.43 +</pre> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2571809" id= + "id2571809"></a>12.1.10. Portability of + packages</h3> + </div> + </div> + </div> + + <p>One appealing feature of pkgsrc is that it runs on + many different platforms. As a result, it is important + to ensure, where possible, that packages in pkgsrc are + portable. There are some particular details you should + pay attention to while working on pkgsrc.</p> + + <div class="sect3" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h4 class="title"><a name="id2571882" id= + "id2571882"></a>12.1.10.1. ${INSTALL}, + ${INSTALL_DATA_DIR}, ...</h4> + </div> + </div> + </div> + + <p>The BSD-compatible <span><b class= + "command">install</b></span> supplied with some + operating systems will not perform more than one + operation at a time. As such, you should call + “<span class="quote">${INSTALL}</span>”, + etc. like this:</p> + <pre class="programlisting"> +${INSTALL_DATA_DIR} ${PREFIX}/dir1 +${INSTALL_DATA_DIR} ${PREFIX}/dir2 +</pre> + </div> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2571901" id="id2571901"></a>12.2. Possible + downloading issues</h2> + </div> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2571905" id= + "id2571905"></a>12.2.1. Packages whose + distfiles aren't available for plain + downloading</h3> + </div> + </div> + </div> + + <p>If you need to download from a dynamic URL you can + set <tt class="varname">DYNAMIC_MASTER_SITES</tt> and a + <span><b class="command">make fetch</b></span> will + call <tt class="filename">files/getsite.sh</tt> 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. <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/graphics/ns-cult3d/README.html" + class="pkgname">graphics/ns-cult3d</a> is an example of + this usage.</p> + + <p>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 <tt class="varname">_FETCH_MESSAGE</tt> to a + macro which displays a message explaining the + situation. <tt class="varname">_FETCH_MESSAGE</tt> must + be executable shell commands, not just a message. + (Generally, it executes <tt class= + "varname">${ECHO}</tt>). As of this writing, the + following packages use this: <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/audio/realplayer/README.html" + class="pkgname">audio/realplayer</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/cad/simian/README.html" + class="pkgname">cad/simian</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/devel/ipv6socket/README.html" + class="pkgname">devel/ipv6socket</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/emulators/vmware-module/README.html" + class="pkgname">emulators/vmware-module</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/fonts/acroread-jpnfont/README.html" + class="pkgname">fonts/acroread-jpnfont</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/sysutils/storage-manager/README.html" + class="pkgname">sysutils/storage-manager</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/www/ap-aolserver/README.html" + class="pkgname">www/ap-aolserver</a>, <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/www/openacs/README.html" + class="pkgname">www/openacs</a>. Try to be consistent + with them.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2572036" id= + "id2572036"></a>12.2.2. How to handle + modified distfiles with the 'old' name</h3> + </div> + </div> + </div> + + <p>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 <tt class= + "filename">/pub/NetBSD/packages/distfiles</tt> + 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.</p> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2572048" id= + "id2572048"></a>12.3. Configuration + gotchas</h2> + </div> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="fixes.libtool" id= + "fixes.libtool"></a>12.3.1. Shared libraries + - libtool</h3> + </div> + </div> + </div> + + <p>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 <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/devel/libtool/README.html" + class="pkgname">devel/libtool</a> pkg can help here, as + it just “<span class="quote">knows</span>” + how to build both static and dynamic libraries from a + set of source files, thus being platform + independent.</p> + + <p>Here's how to use libtool in a pkg in seven simple + steps:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Add <tt class="varname">USE_LIBTOOL=yes</tt> + to the package Makefile.</p> + </li> + + <li> + <p>For library objects, use “<span class= + "quote">${LIBTOOL} --mode=compile + ${CC}</span>” in place of + “<span class="quote">${CC}</span>”. + You could even add it to the definition of + <tt class="varname">CC</tt>, 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.</p> + </li> + + <li> + <p>For the linking of the library, remove any + “<span class="quote">ar</span>”, + “<span class="quote">ranlib</span>”, + and “<span class="quote">ld + -Bshareable</span>” commands, and instead + use:</p> + <pre class="programlisting"> +${LIBTOOL} --mode=link ${CC} -o ${.TARGET:.a=.la} ${OBJS:.o=.lo} -rpath ${PREFIX}/lib -version-info major:minor +</pre> + + <p>Note that the library is changed to have a + <tt class="filename">.la</tt> extension, and the + objects are changed to have a <tt class= + "filename">.lo</tt> extension. Change <tt class= + "varname">OBJS</tt> as necessary. This + automatically creates all of the <tt class= + "filename">.a</tt>, <tt class= + "filename">.so.major.minor</tt>, and ELF symlinks + (if necessary) in the build directory. Be sure to + include “<span class= + "quote">-version-info</span>”, especially + when major and minor are zero, as libtool will + otherwise strip off the shared library + version.</p> + + <p>From the libtool manual:</p> + <pre class="programlisting"> + So, libtool library versions are described by three integers: + +CURRENT + The most recent interface number that this library implements. + +REVISION + The implementation number of the CURRENT interface. + +AGE + The difference between the newest and oldest interfaces that this + library implements. In other words, the library implements all the + interface numbers in the range from number `CURRENT - AGE' to + `CURRENT'. + + If two libraries have identical CURRENT and AGE numbers, then the +dynamic linker chooses the library with the greater REVISION number. +</pre> + + <p>The “<span class= + "quote">-release</span>” option will + produce different results for a.out and ELF + (excluding symlinks) in only one case. An ELF + library of the form “<span class= + "quote">libfoo-release.so.<span class= + "emphasis"><em>x</em></span>.<span class= + "emphasis"><em>y</em></span></span>” will + have a symlink of “<span class= + "quote">libfoo.so.<span class= + "emphasis"><em>x</em></span>.<span class= + "emphasis"><em>y</em></span></span>” on an + a.out platform. This is handled + automatically.</p> + + <p>The “<span class="quote">-rpath + argument</span>” is the install directory + of the library being built.</p> + + <p>In the <tt class="filename">PLIST</tt>, + include all of the <tt class="filename">.a</tt>, + <tt class="filename">.la</tt>, and <tt class= + "filename">.so</tt>, <tt class= + "filename">.so.<i class= + "replaceable"><tt>major</tt></i></tt> and + <tt class="filename">.so.<i class= + "replaceable"><tt>major</tt></i>.<i class= + "replaceable"><tt>minor</tt></i></tt> files.</p> + </li> + + <li> + <p>When linking shared object (<tt class= + "filename">.so</tt>) files, i.e. files that are + loaded via dlopen(3), NOT shared libraries, use + “<span class="quote">-module + -avoid-version</span>” to prevent them + getting version tacked on.</p> + + <p>The <tt class="filename">PLIST</tt> file gets + the <tt class="filename">foo.so</tt> entry.</p> + </li> + + <li> + <p>When linking programs that depend on these + libraries <span class= + "emphasis"><em>before</em></span> they are + installed, preface the <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?cc+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">cc</span>(1)</span></a> or + <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?ld+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">ld</span>(1)</span></a> line with + “<span class="quote">${LIBTOOL} + --mode=link</span>”, 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 + “<span class= + "quote">-L../somelib</span>”), because it + expects you to change that argument to be the + <tt class="filename">.la</tt> file. e.g.</p> + <pre class="programlisting"> +${LIBTOOL} --mode=link ${CC} -o someprog -L../somelib -lsomelib +</pre> + + <p>should be changed to:</p> + <pre class="programlisting"> +${LIBTOOL} --mode=link ${CC} -o <i class= +"replaceable"><tt>someprog</tt></i> <i class= +"replaceable"><tt>../somelib/somelib.la</tt></i> +</pre> + + <p>and it will do the right thing with the + libraries.</p> + </li> + + <li> + <p>When installing libraries, preface the + <a href="http://netbsd.gw.com/cgi-bin/man-cgi?install+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">install</span>(1)</span></a> or + <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?cp+1+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">cp</span>(1)</span></a> command + with “<span class="quote">${LIBTOOL} + --mode=install</span>”, and change the + library name to <tt class="filename">.la</tt>. + e.g.</p> + <pre class="programlisting"> +${LIBTOOL} --mode=install ${BSD_INSTALL_DATA} ${SOMELIB:.a=.la} ${PREFIX}/lib +</pre> + + <p>This will install the static <tt class= + "filename">.a</tt>, shared library, any needed + symlinks, and run <a href= + "http://netbsd.gw.com/cgi-bin/man-cgi?ldconfig+8+NetBSD-current"> + <span class="citerefentry"><span class= + "refentrytitle">ldconfig</span>(8)</span></a>.</p> + </li> + + <li> + <p>In your <tt class="filename">PLIST</tt>, + include all of the <tt class="filename">.a</tt>, + <tt class="filename">.la</tt>, and <tt class= + "filename">.so</tt>, <tt class= + "filename">.so.CURRENT</tt> and <tt class= + "filename">.so.CURRENT.REVISION</tt> files (this + is a change from the previous behaviour).</p> + </li> + </ol> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2572523" id= + "id2572523"></a>12.3.2. Using libtool on GNU + packages that already support libtool</h3> + </div> + </div> + </div> + + <p>Add <tt class="varname">USE_LIBTOOL=yes</tt> to the + package Makefile. This will override the package's own + libtool in most cases. 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 <span><b class="command">make + configure; find work*/ -name libtool</b></span>.</p> + + <p><tt class="varname">LIBTOOL_OVERRIDE</tt> specifies + which libtool scripts, relative to <tt class= + "varname">WRKSRC</tt>, to override. By default, it is + set to “<span class="quote">libtool */libtool + */*/libtool</span>”. If this does not match the + location of the package's libtool script(s), set it as + appropriate.</p> + + <p>If you do not need <tt class="filename">*.a</tt> + static libraries built and installed, then use + <tt class="varname">SHLIBTOOL_OVERRIDE</tt> + instead.</p> + + <p>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 buildlink3.mk (and set <tt class= + "varname">USE_BUILDLINK3=YES</tt>).</p> + + <p>Some packages use libtool incorrectly so that the + package may not work or build in some circumstances. + Some of the more common errors are:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>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:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>The shared object is named correctly, + i.e. <tt class="filename">libfoo.la</tt>, + not <tt class="filename">foo.la</tt></p> + </li> + + <li> + <p>The -dlopen option is used when linking + an executable.</p> + </li> + </ol> + </div> + </li> + + <li> + <p>The use of libltdl without the correct calls + to initialisation routines. The function + lt_dlinit() should be called and the macro + <tt class= + "varname">LTDL_SET_PRELOADED_SYMBOLS</tt> + included in executables.</p> + </li> + </ul> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2572608" id= + "id2572608"></a>12.3.3. GNU + Autoconf/Automake</h3> + </div> + </div> + </div> + + <p>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 <tt class= + "filename">pkgsrc/mk/autoconf.mk</tt> and <tt class= + "filename">pkgsrc/mk/automake.mk</tt> to help dealing + with these tools. See comments in these files for + details.</p> + + <p>For packages that need only autoconf:</p> + <pre class="programlisting"> +AUTOCONF_REQD= 2.50 # if default version is not good enough +... + +pre-configure: + cd ${WRKSRC}; ${AUTOCONF} + +... +.include "../../mk/autoconf.mk" +</pre> + + <p>and for packages that need automake and + autoconf:</p> + <pre class="programlisting"> +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" +</pre> + + <p>Packages which use GNU Automake will almost + certainly require GNU Make, but that's automatically + provided for you in <tt class= + "filename">mk/automake.mk</tt>.</p> + + <p>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 <tt class= + "varname">AUTOMAKE_OVERRIDE=NO</tt> in the package + Makefile.</p> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2572652" id="id2572652"></a>12.4. Building + considerations</h2> + </div> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2572656" id= + "id2572656"></a>12.4.1. CPP defines</h3> + </div> + </div> + </div> + + <p>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.</p> + + <p>To test whether you are working on a 4.4 BSD-derived + system, you should use the BSD definition, which is + defined in <tt class= + "filename"><sys/param.h></tt> on said + systems.</p> + <pre class="programlisting"> +#include <sys/param.h> +</pre> + + <p>and then you can surround the BSD-specific parts of + your package's C/C++ code using this conditional:</p> + <pre class="programlisting"> +#if (defined(BSD) && BSD >= 199306) + ... +#endif +</pre> + + <p>Please use the “<span class= + "quote">__NetBSD__</span>” definition sparingly - + it should only apply to features of NetBSD that are not + present in other 4.4-lite derived BSDs.</p> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2572685" id="id2572685"></a>12.5. Package + specific actions</h2> + </div> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2572689" id= + "id2572689"></a>12.5.1. Package + configuration files</h3> + </div> + </div> + </div> + + <p>Packages should be taught to look for their + configuration files in <tt class= + "varname">${PKG_SYSCONFDIR}</tt>, which is passed + through to the configure and build processes. + <tt class="varname">PKG_SYSCONFDIR</tt> may be + customized in various ways by setting other make + variables:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class="varname">PKG_SYSCONFBASE</tt> is + the main config directory under which all package + configuration files are to be found. This + defaults to <tt class= + "filename">${PREFIX}/etc</tt>, but may be + overridden in <tt class= + "filename">/etc/mk.conf</tt>.</p> + </li> + + <li> + <p><tt class="varname">PKG_SYSCONFSUBDIR</tt> is + the subdirectory of <tt class= + "varname">PKG_SYSCONFBASE</tt> under which the + configuration files for a particular package may + be found, e.g. the Apache configuration files may + all be found under the <tt class= + "filename">httpd/</tt> subdirectory of <tt class= + "varname">${PKG_SYSCONFBASE}</tt>. This should be + set in the package Makefile.</p> + </li> + + <li> + <p>By default, <tt class= + "varname">PKG_SYSCONFDIR</tt> is set to + <tt class="varname">${PKG_SYSCONFBASE}/${PKG_SYSCONFSUBDIR}</tt>, + but this may be overridden by setting <tt class= + "varname">PKG_SYSCONFDIR.${PKG_SYSCONFVAR}</tt> + for a particular package, where <tt class= + "varname">PKG_SYSCONFVAR</tt> defaults to + <tt class="varname">${PKGBASE}</tt>. This is not + meant to be set by a package Makefile, but is + reserved for users who wish to override the + <tt class="varname">PKG_SYSCONFDIR</tt> setting + for a particular package with a special + location.</p> + </li> + </ul> + </div> + + <p>The only variables that users should customize are + <tt class="varname">PKG_SYSCONFBASE</tt> and <tt class= + "varname">PKG_SYSCONFDIR.${PKG_SYSCONFVAR}</tt>. Users + will typically want to set <tt class= + "varname">PKG_SYSCONFBASE</tt> to <tt class= + "filename">/etc</tt>, or to accept the default location + of <tt class="filename">${PREFIX}/etc</tt>.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2572859" id= + "id2572859"></a>12.5.2. User + Interaction</h3> + </div> + </div> + </div> + + <p>Occasionally, packages require interaction from the + user, and this can be in a number of ways:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>help in fetching the distfiles</p> + </li> + + <li> + <p>help to configure the package before it is + built</p> + </li> + + <li> + <p>help during the build process</p> + </li> + + <li> + <p>help during the installation of a package</p> + </li> + </ul> + </div> + + <p>The <tt class="varname">INTERACTIVE_STAGE</tt> + 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 <tt class= + "filename">Makefile</tt>. e.g.</p> + <pre class="programlisting"> +INTERACTIVE_STAGE= build +</pre> + + <p>Multiple interactive stages can be specified:</p> + <pre class="programlisting"> +INTERACTIVE_STAGE= configure install +</pre> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2572904" id= + "id2572904"></a>12.5.3. Handling + licenses</h3> + </div> + </div> + </div> + + <p>A package may underly a license which the user has + or has not agreed to accept. Usually, packages that + underly well-known Open Source licenses (e.g. the GNU + Public License, GPL) won't have any special license + tags added in pkgsrc which require special action by + the user of such packages, but there are quite a number + of other licenses out there that pkgsrc users may not + be able to follow, for whatever reasons. For these + cases, pkgsrc contains a mechanism to note that a + package underlies a certain license, and the user has + to accept the license before the package can be + installed.</p> + + <p>Placing a certain package under a certain license + works by setting the <tt class="varname">LICENSE</tt> + variable to a string identifying the license, e.g. in + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" + href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/graphics/graphviz/README.html" + class="pkgname">graphics/graphviz</a>:</p> + <pre class="programlisting"> +LICENSE= graphviz-license +</pre> + + <p>When trying to build, the user will get a notice + that the package underlies a license which he hasn't + accepted (yet):</p> + <pre class="programlisting"> +<tt class="prompt">%</tt> <b class="userinput"><tt>make</tt></b> +===> graphviz-1.12 has an unacceptable license: graphviz-license. +===> To build this package, add this line to your /etc/mk.conf: +===> ACCEPTABLE_LICENSES+=graphviz-license +===> To view the license, enter "/usr/bin/make show-license". +*** Error code 1 +</pre> + + <p>The license can be viewed with <span><b class= + "command">make show-license</b></span>, and if it is + considered appropriate, the line printed above can be + added to <tt class="filename">/etc/mk.conf</tt> to + indicate acceptance of the particular license:</p> + <pre class="programlisting"> +ACCEPTABLE_LICENSES+=graphviz-license +</pre> + + <p>When adding a package with a new license, the + license text should be added to <tt class= + "filename">pkgsrc/licenses</tt> for displaying. A list + of known licenses can be seen in this directory as well + as by looking at the list of (commented out) <tt class= + "varname">ACCEPTABLE_LICENSES</tt> variable settings in + <tt class= + "filename">pkgsrc/mk/bsd.pkg.defaults.mk</tt>.</p> + + <p>Is there is a <span class= + "emphasis"><em>really</em></span> pressing need to + accept all licenses at once, like when trying to + download or mirror all distfiles or doing a bulk build + to test if all packages in pkgsrc build, this can be + done by setting <tt class= + "varname">_ACCEPTABLE=yes</tt>.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2572987" id= + "id2572987"></a>12.5.4. Creating an account + from a package</h3> + </div> + </div> + </div> + + <p>There are two make variables used to control the + creation of package-specific groups and users at + pre-install time. The first is <tt class= + "varname">PKG_GROUPS</tt>, which is a list of + group[:groupid] elements, where the groupid is + optional. The second is <tt class= + "varname">PKG_USERS</tt>, which is a list of elements + of the form:</p> + <pre class="programlisting"> +user:group[:[userid][:[description][:[home][:shell]]]] +</pre> + + <p>where only the user and group are required, the rest + being optional. A simple example is:</p> + <pre class="programlisting"> + PKG_GROUPS= foogroup + PKG_USERS= foouser:foogroup +</pre> + + <p>A more complex example is that creates two groups + and two users is:</p> + <pre class="programlisting"> + PKG_GROUPS= group1 group2:1005 + PKG_USERS= first:group1::First\\ User \ + second:group2::Second\\ User:/home/second:${SH} +</pre> + + <p>By default, a new user will have home directory + <tt class="filename">/nonexistent</tt>, and login shell + <tt class="filename">/sbin/nologin</tt> unless they are + specified as part of the user element.</p> + + <p>The package <tt class="filename">Makefile</tt> must + also set <tt class="varname">USE_PKGINSTALL=YES</tt>. + 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 <tt class= + "varname">PKG_CREATE_USERGROUP</tt> variable prior to + package installation.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2573049" id= + "id2573049"></a>12.5.5. Installing score + files</h3> + </div> + </div> + </div> + + <p>Certain packages, most of them in the games + category, install a score file that allows all users on + the system to record their highscores. In order for + this to work, the binaries need to be installed setgid + and the score files owned by the appropriate group + and/or owner (traditionally the "games" user/group). + The following variables, documented in more detail in + <tt class="filename">mk/bsd.pkg.defaults.mk</tt>, + control this behaviour: <tt class= + "varname">SETGIDGAME</tt>, <tt class= + "varname">GAMEDATAMODE</tt>, <tt class= + "varname">GAMEGRP</tt>, <tt class= + "varname">GAMEMODE</tt>, <tt class= + "varname">GAMEOWN</tt>.</p> + + <p>Note that per default, setgid installation of games + is disabled; setting <tt class= + "varname">SETGIDGAME=YES</tt> will set all the other + variables accordingly.</p> + + <p>A package should therefor never hard code file + ownership or access permissions but rely on <tt class= + "varname">INSTALL_GAME</tt> and <tt class= + "varname">INSTALL_GAME_DATA</tt> to set these + correctly.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2573093" id= + "id2573093"></a>12.5.6. Packages providing + login shells</h3> + </div> + </div> + </div> + + <p>If the purpose of the package is to provide a login + shell, the variable <tt class="varname">PKG_SHELL</tt> + should contain the full pathname of the shell + executable installed by this package. The package + <tt class="filename">Makefile</tt> must also set + <tt class="varname">USE_PKGINSTALL=YES</tt> to use the + automatically generated <tt class= + "filename">INSTALL</tt>/<tt class= + "filename">DEINSTALL</tt> scripts.</p> + + <p>An example taken from shells/zsh:</p> + <pre class="programlisting"> + USE_PKGINSTALL= YES + PKG_SHELL= ${PREFIX}/bin/zsh +</pre> + + <p>The shell is registered into <tt class= + "filename">/etc/shells</tt> file automatically in the + post-install target by the generated <tt class= + "filename">INSTALL</tt> script and removed in the + deinstall target by the <tt class= + "filename">DEINSTALL</tt> script.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2573424" id= + "id2573424"></a>12.5.7. Packages containing + perl scripts</h3> + </div> + </div> + </div> + + <p>If your package contains interpreted perl scripts, + set <tt class="varname">REPLACE_PERL</tt> to ensure + that the proper interpreter path is set. <tt class= + "varname">REPLACE_PERL</tt> should contain a list of + scripts, relative to <tt class="varname">WRKSRC</tt>, + that you want adjusted.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2573442" id= + "id2573442"></a>12.5.8. Packages with + hardcoded paths to other interpreters</h3> + </div> + </div> + </div> + + <p>Your package may also contain scripts with hardcoded + paths to other interpreters besides (or as well as) + perl. To correct the full pathname to the script + interpreter, you need to set the following definitions + in your <tt class="filename">Makefile</tt> (we shall + use <span><b class="command">tclsh</b></span> in this + example):</p> + <pre class="programlisting"> + REPLACE_INTERPRETER+= tcl + _REPLACE.tcl.old= .*/bin/tclsh + _REPLACE.tcl.new= ${PREFIX}/bin/tclsh + _REPLACE_FILES.tcl= ...list of tcl scripts which need to be fixed, + relative to ${WRKSRC}, just as in REPLACE_PERL +</pre> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2573463" id= + "id2573463"></a>12.5.9. Packages installing + perl modules</h3> + </div> + </div> + </div> + + <p>Makefiles of packages providing perl5 modules should + include the Makefile fragment <tt class= + "filename">../../lang/perl5/module.mk</tt>. It provides + a <span><b class="command">do-configure</b></span> + 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.</p> + + <p>Perl5 modules will install into different places + depending on the version of perl used during the build + process. To address this, pkgsrc will append lines to + the <tt class="filename">PLIST</tt> corresponding to + the files listed in the installed <tt class= + "filename">.packlist</tt> file generated by most perl5 + modules. This is invoked by defining <tt class= + "varname">PERL5_PACKLIST</tt> to a space-separated list + of paths to packlist files, e.g.:</p> + <pre class="programlisting"> +PERL5_PACKLIST= ${PERL5_SITEARCH}/auto/Pg/.packlist +</pre> + + <p>The variables <tt class= + "varname">PERL5_SITELIB</tt>, <tt class= + "varname">PERL5_SITEARCH</tt>, and <tt class= + "varname">PERL5_ARCHLIB</tt> 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 <tt class="filename">PLIST</tt>.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="faq.info-files" id= + "faq.info-files"></a>12.5.10. Packages + installing info files</h3> + </div> + </div> + </div> + + <p>Some packages install info files or use the + “<span class="quote">makeinfo</span>” or + “<span class="quote">install-info</span>” + commands. Each of the info files:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>is considered to be installed in the directory + <tt class= + "filename">${PREFIX}/${INFO_DIR}</tt>,</p> + </li> + + <li> + <p>is registered in the Info directory file + <tt class= + "filename">${PREFIX}/${INFO_DIR}/dir</tt>,</p> + </li> + + <li> + <p>and must be listed as a filename in the + <tt class="varname">INFO_FILES</tt> variable in + the package Makefile.</p> + </li> + </ul> + </div> + + <p><tt class="varname">INFO_DIR</tt> defaults to + “<span class="quote">info</span>” and can + be overridden in the package Makefile. <tt class= + "filename">INSTALL</tt> and <tt class= + "filename">DEINSTALL</tt> scripts will be generated to + handle registration of the info files in the Info + directory file. The “<span class= + "quote">install-info</span>” command used for the + info files registration is either provided by the + system, or by a special purpose package automatically + added as dependency if needed.</p> + + <p>A package which needs the “<span class= + "quote">makeinfo</span>” command at build time + must define the variable <tt class= + "varname">USE_MAKEINFO</tt> in its Makefile. If a + minimum version of the “<span class= + "quote">makeinfo</span>” command is needed it + should be noted with the <tt class= + "varname">TEXINFO_REQD</tt> variable in the package + <tt class="filename">Makefile</tt>. By default, a + minimum version of 3.12 is required. If the system does + not provide a <span><b class= + "command">makeinfo</b></span> command or if it does not + match the required minimum, a build dependency on the + <a xmlns="http://www.w3.org/TR/xhtml1/transitional" + href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/devel/gtexinfo/README.html" + class="pkgname">devel/gtexinfo</a> package will be + added automatically.</p> + + <p>The build and installation process of the software + provided by the package should not use the + <span><b class="command">install-info</b></span> + command as the registration of info files is the task + of the package <tt class="filename">INSTALL</tt> + script, and it must use the appropriate <span><b class= + "command">makeinfo</b></span> command.</p> + + <p>To achieve this goal the pkgsrc infrastructure + creates overriding scripts for the <span><b class= + "command">install-info</b></span> and <span><b class= + "command">makeinfo</b></span> commands in a directory + listed early in <tt class="varname">PATH</tt>.</p> + + <p>The script overriding <span><b class= + "command">install-info</b></span> has no effect except + the logging of a message. The script overriding + <span><b class="command">makeinfo</b></span> logs a + message and according to the value of <tt class= + "varname">USE_MAKEINFO</tt> and <tt class= + "varname">TEXINFO_REQD</tt> either run the appropriate + <span><b class="command">makeinfo</b></span> command or + exit on error.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2573751" id= + "id2573751"></a>12.5.11. Packages installing + GConf2 data files</h3> + </div> + </div> + </div> + + <p>If a package installs <tt class= + "filename">.schemas</tt> or <tt class= + "filename">.entries</tt> files, used by GConf2, you + need to take some extra steps to make sure they get + registered in the database:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Include <tt class= + "filename">../../devel/GConf2/schemas.mk</tt> + instead of its <tt class= + "filename">buildlink3.mk</tt> file. This takes + care of rebuilding the GConf2 database at + installation and deinstallation time, and tells + the package where to install GConf2 data files + using some standard configure arguments. It also + disallows any access to the database directly + from the package.</p> + </li> + + <li> + <p>Ensure that the package installs its + <tt class="filename">.schemas</tt> files under + <tt class= + "filename">${PREFIX}/share/gconf/schemas</tt>. If + they get installed under <tt class= + "filename">${PREFIX}/etc</tt>, you will need to + manually patch the package.</p> + </li> + + <li> + <p>Check the PLIST and remove any entries under + the etc/gconf directory, as they will be handled + automatically. See <a href="#faq.conf" title= + "6.13. Configuration files handling and placement"> + Section 6.13, “Configuration files + handling and placement”</a> for more + information.</p> + </li> + + <li> + <p>Define the <tt class= + "varname">GCONF2_SCHEMAS</tt> variable in your + <tt class="filename">Makefile</tt> with a list of + all <tt class="filename">.schemas</tt> files + installed by the package, if any. Names must not + contain any directories in them.</p> + </li> + + <li> + <p>Define the <tt class= + "varname">GCONF2_ENTRIES</tt> variable in your + <tt class="filename">Makefile</tt> with a list of + all <tt class="filename">.entries</tt> files + installed by the package, if any. Names must not + contain any directories in them.</p> + </li> + </ol> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2573851" id= + "id2573851"></a>12.5.12. Packages installing + scrollkeeper data files</h3> + </div> + </div> + </div> + + <p>If a package installs <tt class="filename">.omf</tt> + files, used by scrollkeeper, you need to take some + extra steps to make sure they get registered in the + database:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Include <tt class= + "filename">../../textproc/scrollkeeper/omf.mk</tt> + instead of its <tt class= + "filename">buildlink3.mk</tt> file. This takes + care of rebuilding the scrollkeeper database at + installation and deinstallation time, and + disallows any access to it directly from the + package.</p> + </li> + + <li> + <p>Check the PLIST and remove any entries under + the <tt class= + "filename">libdata/scrollkeeper</tt> directory, + as they will be handled automatically.</p> + </li> + + <li> + <p>Remove the <tt class="filename">share/omf</tt> + directory from the PLIST. It will be handled by + scrollkeeper.</p> + </li> + </ol> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2573902" id= + "id2573902"></a>12.5.13. Packages installing + X11 fonts</h3> + </div> + </div> + </div> + + <p>If a package installs font files, you will need to + rebuild the fonts database in the directory where they + get installed at installation and deinstallation time. + This can be automatically done by using <tt class= + "filename">mk/fonts.mk</tt>, which you need to include + in your <tt class="filename">Makefile</tt>.</p> + + <p>When the file is included, you can list the + directories where fonts are installed in the <tt class= + "varname">FONTS_<i class= + "replaceable"><tt>type</tt></i>_DIRS</tt> variables, + where <i class="replaceable"><tt>type</tt></i> can be + one of “<span class="quote">TTF</span>”, + “<span class="quote">TYPE1</span>” or + “<span class="quote">X11</span>”. Also make + sure that the database file <tt class= + "filename">fonts.dir</tt> is not listed in the + PLIST.</p> + + <p>Note that you should not create new directories for + fonts; instead use the standard ones to avoid that the + user needs to manually configure his X server to find + them.</p> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2574018" id= + "id2574018"></a>12.5.14. Packages installing + GTK2 modules</h3> + </div> + </div> + </div> + + <p>If a package installs gtk2 immodules or loaders, you + need to take some extra steps to get them registered in + the GTK2 database properly:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Include <tt class= + "filename">../../x11/gtk2/modules.mk</tt> instead + of its <tt class="filename">buildlink3.mk</tt> + file. This takes care of rebuilding the database + at installation and deinstallation time.</p> + </li> + + <li> + <p>Set <tt class= + "varname">GTK2_IMMODULES=YES</tt> if your package + installs GTK2 immodules.</p> + </li> + + <li> + <p>Set <tt class="varname">GTK2_LOADERS=YES</tt> + if your package installs GTK2 loaders.</p> + </li> + + <li> + <p>Patch the package to not touch any of the gtk2 + databases directly. These are:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p><tt class= + "filename">libdata/gtk-2.0/gdk-pixbuf.loaders</tt></p> + </li> + + <li> + <p><tt class= + "filename">libdata/gtk-2.0/gtk.immodules</tt></p> + </li> + </ul> + </div> + </li> + + <li> + <p>Check the PLIST and remove any entries under + the <tt class="filename">libdata/gtk-2.0</tt> + directory, as they will be handled + automatically.</p> + </li> + </ol> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2574087" id= + "id2574087"></a>12.5.15. Packages installing + SGML or XML data</h3> + </div> + </div> + </div> + + <p>If a package installs SGML or XML data files that + need to be registered in system-wide catalogs (like + DTDs, sub-catalogs, etc.), you need to take some extra + steps:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Include <tt class= + "filename">../../textproc/xmlcatmgr/catalogs.mk</tt> + in your <tt class="filename">Makefile</tt>, which + takes care of registering those files in + system-wide catalogs at installation and + deinstallation time.</p> + </li> + + <li> + <p>Set <tt class="varname">SGML_CATALOGS</tt> to + the full path of any SGML catalogs installed by + the package.</p> + </li> + + <li> + <p>Set <tt class="varname">XML_CATALOGS</tt> to + the full path of any XML catalogs installed by + the package.</p> + </li> + + <li> + <p>Set <tt class="varname">SGML_ENTRIES</tt> to + individual entries to be added to the SGML + catalog. These come in groups of three strings; + see xmlcatmgr(1) for more information + (specifically, arguments recognized by the 'add' + action). Note that you will normally not use this + variable.</p> + </li> + + <li> + <p>Set <tt class="varname">XML_ENTRIES</tt> to + individual entries to be added to the XML + catalog. These come in groups of three strings; + see xmlcatmgr(1) for more information + (specifically, arguments recognized by the 'add' + action). Note that you will normally not use this + variable.</p> + </li> + </ol> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2574139" id= + "id2574139"></a>12.5.16. Packages installing + extensions to the MIME database</h3> + </div> + </div> + </div> + + <p>If a package provides extensions to the MIME + database by installing <tt class="filename">.xml</tt> + files inside <tt class= + "filename">${PREFIX}/share/mime/packages</tt>, you need + to take some extra steps to ensure that the database is + kept consistent with respect to these new files:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Include <tt class= + "filename">../../databases/shared-mime-info/mimedb.mk</tt> + (avoid using the <tt class= + "filename">buildlink3.mk</tt> file from this same + directory, which is reserved for inclusion from + other <tt class="filename">buildlink3.mk</tt> + files). It takes care of rebuilding the MIME + database at installation and deinstallation time, + and disallows any access to it directly from the + package.</p> + </li> + + <li> + <p>Check the PLIST and remove any entries under + the <tt class="filename">share/mime</tt> + directory, <span class= + "emphasis"><em>except</em></span> for files saved + under <tt class= + "filename">share/mime/packages</tt>. The former + are handled automatically by the + update-mime-database program, but the later are + package-dependent and must be removed by the + package that installed them in the first + place.</p> + </li> + + <li> + <p>Remove any <tt class= + "filename">share/mime/*</tt> directories from the + PLIST. They will be handled by the + shared-mime-info package.</p> + </li> + </ol> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2574210" id= + "id2574210"></a>12.5.17. Packages using + intltool</h3> + </div> + </div> + </div> + + <p>If a package uses intltool during its build, include + the <tt class= + "filename">../../textproc/intltool/buildlink3.mk</tt> + file, which forces it to use the intltool package + provided by pkgsrc, instead of the one bundled with the + distribution file.</p> + + <p>This tracks intltool's build-time dependencies and + uses the latest available version; this way, the + package benefits of any bug fixes that may have + appeared since it was released.</p> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2574224" id="id2574224"></a>12.6. Feedback + to the author</h2> + </div> + </div> + </div> + + <p>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.</p> + + <p>Support the idea of free software!</p> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="debug" id= + "debug"></a>Chapter 13. Debugging</h2> + </div> + </div> + </div> + + <p>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.</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>Be sure to set <tt class= + "varname">PKG_DEVELOPER=1</tt> in <tt class= + "filename">/etc/mk.conf</tt></p> + </li> + + <li> + <p>Install <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/url2pkg/README.html" + class="pkgname">pkgtools/url2pkg</a>, create a + directory for a new package, change into it, then run + <span><b class="command">url2pkg</b></span>:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>mkdir /usr/pkgsrc/<i class= +"replaceable"><tt>category</tt></i>/<i class= +"replaceable"><tt>examplepkg</tt></i></tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cd /usr/pkgsrc/<i class= +"replaceable"><tt>category</tt></i>/<i class= +"replaceable"><tt>examplepkg</tt></i></tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>url2pkg http://www.example.com/path/to/distfile.tar.gz</tt></b> +</pre> + </li> + + <li> + <p>Edit the <tt class="filename">Makefile</tt> as + requested.</p> + </li> + + <li> + <p>Fill in the <tt class="filename">DESCR</tt> + file</p> + </li> + + <li> + <p>Run <span><b class="command">make + configure</b></span></p> + </li> + + <li> + <p>Add any dependencies glimpsed from documentation + and the configure step to the package's <tt class= + "filename">Makefile</tt>.</p> + </li> + + <li> + <p>Make the package compile, doing multiple rounds + of</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class="userinput"><tt>make</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>pkgvi ${WRKSRC}/some/file/that/does/not/compile</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>mkpatches</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>patchdiff</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>mv ${WRKDIR}/.newpatches/* patches</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>make mps</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>make clean</tt></b> +</pre> + + <p>Doing as non-root user will ensure that no files + are modified that shouldn't be, especially during the + build phase. <span><b class= + "command">mkpatches</b></span>, <span><b class= + "command">patchdiff</b></span> and <span><b class= + "command">pkgvi</b></span> are from the <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkgdiff/README.html" + class="pkgname">pkgtools/pkgdiff</a> package.</p> + </li> + + <li> + <p>Look at the <tt class="filename">Makefile</tt>, + fix if necessary; see <a href="#components.Makefile" + title="7.1. Makefile">Section 7.1, + “Makefile”</a>.</p> + </li> + + <li> + <p>Generate a <tt class="filename">PLIST</tt>:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make install</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make print-PLIST >PLIST</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make deinstall</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make install</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make deinstall</tt></b> +</pre> + + <p>You usually need to be <tt class= + "username">root</tt> to do this. Look if there are + any files left:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make print-PLIST</tt></b> +</pre> + + <p>If this reveals any files that are missing in + <tt class="filename">PLIST</tt>, add them.</p> + </li> + + <li> + <p>Now that the <tt class="filename">PLIST</tt> is + OK, install the package again and make a binary + package:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make reinstall</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make package</tt></b> +</pre> + </li> + + <li> + <p>Delete the installed package:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>pkg_delete blub</tt></b> +</pre> + </li> + + <li> + <p>Repeat the above <span><b class="command">make + print-PLIST</b></span> command, which shouldn't find + anything now:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make print-PLIST</tt></b> +</pre> + </li> + + <li> + <p>Reinstall the binary package:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>pkgadd .../blub.tgz</tt></b> +</pre> + </li> + + <li> + <p>Play with it. Make sure everything works.</p> + </li> + + <li> + <p>Run <span><b class="command">pkglint</b></span> + from <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkglint/README.html" + class="pkgname">pkgtools/pkglint</a>, and fix the + problems it reports:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class="userinput"><tt>pkglint</tt></b> +</pre> + </li> + + <li> + <p>Submit (or commit, if you have cvs access); see + <a href="#submit" title= + "Chapter 14. Submitting and Committing">Chapter 14, + <i>Submitting and Committing</i></a>.</p> + </li> + </ul> + </div> + </div> + + <div class="chapter" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="submit" id= + "submit"></a>Chapter 14. Submitting and + Committing</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2574685">14.1. + Submitting your packages</a></span></dt> + + <dt><span class="sect1"><a href="#id2574732">14.2. + Committing: Importing a package into + CVS</a></span></dt> + + <dt><span class="sect1"><a href="#id2575000">14.3. + Updating a Package to a Newer Version</a></span></dt> + + <dt><span class="sect1"><a href="#id2575019">14.4. + Moving a Package in pkgsrc</a></span></dt> + </dl> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2574685" id= + "id2574685"></a>14.1. Submitting your + packages</h2> + </div> + </div> + </div> + + <p>You have to separate between binary and + “<span class="quote">normal</span>” (source) + packages here:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>precompiled binary packages</p> + + <p>Our policy is that we accept binaries only from + pkgsrc 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.</p> + </li> + + <li> + <p>packages</p> + + <p>First, check that your package is complete, + compiles and runs well; see <a href="#debug" title= + "Chapter 13. Debugging">Chapter 13, + <i>Debugging</i></a> and the rest of this document. + Next, generate an uuencoded gzipped tar(1) archive, + preferably with all files in a single directory. + Finally, <span><b class= + "command">send-pr</b></span> with category + “<span class="quote">pkg</span>”, 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.</p> + + <p>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.</p> + + <p>Alternatively, you can also import new packages + into pkgsrc-wip (“<span class="quote">pkgsrc + work-in-progress</span>”); see the homepage + at <a href="http://pkgsrc-wip.sourceforge.net/" + target= + "_top">http://pkgsrc-wip.sourceforge.net/</a> for + details.</p> + </li> + </ul> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2574732" id= + "id2574732"></a>14.2. Committing: Importing a + package into CVS</h2> + </div> + </div> + </div> + + <p>This section is only of interest for pkgsrc developers + with write access to the pkgsrc repository. Please + remember that cvs imports files relative to the current + working directory, and that the pathname that you give + the <span><b class="command">cvs import</b></span> + 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 “<span class= + "quote">TNF</span>” and a release tag of + “<span class="quote">pkgsrc-base</span>”, + e.g:</p> + <pre class="programlisting"> + % cd .../pkgsrc/category/pkgname + % cvs import pkgsrc/category/pkgname TNF pkgsrc-base +</pre> + + <p>Remember to move the directory from which you imported + out of the way, or cvs will complain the next time you + “<span class="quote">cvs update</span>” your + source tree. Also don't forget to add the new package to + the category's <tt class="filename">Makefile</tt>.</p> + + <p>The commit message of the initial import should + include part of the <tt class="filename">DESCR</tt> file, + so people reading the mailing lists know what the package + is/does.</p> + + <p>Please note all package updates/additions in + <tt class="filename">pkgsrc/doc/CHANGES</tt>. 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 <a href= + "http://www.NetBSD.org/" target="_top">www.NetBSD.org</a> + and other sites. Additionally, check the pkgsrc/doc/TODO + file and remove the entry for the package you updated, in + case it was mentioned there.</p> + + <p>For new packages, “<span class="quote">cvs + import</span>” is preferred to “<span class= + "quote">cvs add</span>” because the former gets + everything with a single command, and provides a + consistent tag.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2575000" id="id2575000"></a>14.3. Updating + a Package to a Newer Version</h2> + </div> + </div> + </div> + + <p>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:</p> + + <div class="itemizedlist"> + <ul type="disc"> + <li> + <p>A URL is volatile, and can change over time. It + may go away completely or its information may be + overwritten by newer information.</p> + </li> + + <li> + <p>Having the change information between old and + new versions in our CVS repository is very useful + for people who use either cvs or anoncvs.</p> + </li> + + <li> + <p>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.</p> + </li> + </ul> + </div> + + <p>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.</p> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2575019" id="id2575019"></a>14.4. Moving a + Package in pkgsrc</h2> + </div> + </div> + </div> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Make a copy of the directory somewhere else.</p> + </li> + + <li> + <p>Remove all CVS dirs.</p> + + <p>Alternatively to the first two steps you can + also do:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cvs -d user@cvs.NetBSD.org:/cvsroot export -D today pkgsrc/category/package</tt></b> +</pre> + + <p>and use that for further work.</p> + </li> + + <li> + <p>Fix <tt class="varname">CATEGORIES</tt> and any + <tt class="varname">DEPENDS</tt> paths that just + did “<span class= + "quote">../package</span>” instead of + “<span class= + "quote">../../category/package</span>”.</p> + </li> + + <li> + <p><span><b class="command">cvs import</b></span> + the modified package in the new place.</p> + </li> + + <li> + <p>Check if any package depends on it:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cd /usr/pkgsrc</tt></b> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>grep /package */*/Makefile* */*/buildlink*</tt></b> +</pre> + </li> + + <li> + <p>Fix paths in packages from step 5 to point to + new location.</p> + </li> + + <li> + <p><span><b class="command">cvs rm (-f)</b></span> + the package at the old location.</p> + </li> + + <li> + <p>Remove from <tt class= + "filename">oldcategory/Makefile</tt>.</p> + </li> + + <li> + <p>Add to <tt class= + "filename">newcategory/Makefile</tt>.</p> + </li> + + <li> + <p>Commit the changed and removed files:</p> + <pre class="screen"> +<tt class="prompt">%</tt> <b class= +"userinput"><tt>cvs commit oldcategory/package oldcategory/Makefile newcategory/Makefile</tt></b> +</pre> + + <p>(and any packages from step 5, of course).</p> + </li> + </ol> + </div> + </div> + </div> + </div> + + <div class="appendix" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="examples" id= + "examples"></a>Appendix A. A simple example + package: bison</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#id2575177">A.1. + files</a></span></dt> + + <dd> + <dl> + <dt><span class="sect2"><a href="#id2575180">A.1.1. + Makefile</a></span></dt> + + <dt><span class="sect2"><a href="#id2575188">A.1.2. + DESCR</a></span></dt> + + <dt><span class="sect2"><a href="#id2575203">A.1.3. + PLIST</a></span></dt> + + <dt><span class="sect2"><a href="#id2575210">A.1.4. + Checking a package with pkglint</a></span></dt> + </dl> + </dd> + + <dt><span class="sect1"><a href="#id2575319">A.2. Steps + for building, installing, packaging</a></span></dt> + </dl> + </div> + + <p>We 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 <span><b class="command">bison</b></span> + when Berkeley <span><b class="command">yacc</b></span> is + already present in the tree is beyond us, but it's useful for + the purposes of this exercise.</p> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2575177" id="id2575177"></a>A.1. files</h2> + </div> + </div> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2575180" id= + "id2575180"></a>A.1.1. Makefile</h3> + </div> + </div> + </div> + <pre class="programlisting"> +# $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" +</pre> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2575188" id= + "id2575188"></a>A.1.2. DESCR</h3> + </div> + </div> + </div> + <pre class="programlisting"> +GNU version of yacc. Can make re-entrant parsers, and numerous other +improvements. Why you would want this when Berkeley <a href= +"http://netbsd.gw.com/cgi-bin/man-cgi?yacc+1+NetBSD-current"><span class="citerefentry"><span class="refentrytitle">yacc</span>(1)</span></a> is part +of the NetBSD source tree is beyond me. +</pre> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2575203" id= + "id2575203"></a>A.1.3. PLIST</h3> + </div> + </div> + </div> + <pre class="programlisting"> +@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 +</pre> + </div> + + <div class="sect2" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h3 class="title"><a name="id2575210" id= + "id2575210"></a>A.1.4. Checking a package with + <span><b class="command">pkglint</b></span></h3> + </div> + </div> + </div> + + <p>The NetBSD package system comes with <a xmlns= + "http://www.w3.org/TR/xhtml1/transitional" href= + "ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/pkgtools/pkglint/README.html" + class="pkgname">pkgtools/pkglint</a> 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 <span><b class= + "command">pkglint</b></span>:</p> + <pre class="screen"> +<tt class="prompt">$</tt> <b class="userinput"><tt>pkglint</tt></b> +OK: checking ./DESCR. +OK: checking Makefile. +OK: checking distinfo. +OK: checking patches/patch-aa. +looks fine. +</pre> + + <p>Depending on the supplied command line arguments (see + pkglint(1)) more verbose checks will be performed. Use + e.g. <span><b class="command">pkglint -v</b></span> for a + very verbose check.</p> + </div> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "id2575319" id="id2575319"></a>A.2. Steps for + building, installing, packaging</h2> + </div> + </div> + </div> + + <p>Create the directory where the package lives, plus any + auxiliary directories:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd /usr/pkgsrc/lang</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mkdir bison</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>cd bison</tt></b> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>mkdir patches</tt></b> +</pre> + + <p>Create <tt class="filename">Makefile</tt>, <tt class= + "filename">DESCR</tt> and <tt class="filename">PLIST</tt> + (see <a href="#components" title= + "Chapter 7. Package components - files, directories and contents"> + Chapter 7, <i>Package components - files, directories and + contents</i></a>) then continue with fetching the + distfile:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make fetch</tt></b> +>> 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. +</pre> + + <p>Generate the checksum of the distfile into <tt class= + "filename">distinfo</tt>:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make makesum</tt></b> +</pre> + + <p>Now compile:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class="userinput"><tt>make</tt></b> +>> 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 +</pre> + + <p>Everything seems OK, so install the files:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make install</tt></b> +>> 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 +</pre> + + <p>You can now use bison, and also - if you decide so - + remove it with <span><b class="command">pkg_delete + bison</b></span>. Should you decide that you want a binary + package, do this now:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make package</tt></b> +>> 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' +</pre> + + <p>Now that you don't need the source and object files any + more, clean up:</p> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make clean</tt></b> +===> Cleaning for bison-1.25 +</pre> + </div> + </div> + + <div class="appendix" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="logs" id= + "logs"></a>Appendix B. Build logs</h2> + </div> + </div> + </div> + + <div class="toc"> + <p><b>Table of Contents</b></p> + + <dl> + <dt><span class="sect1"><a href="#logs.building">B.1. + Building figlet</a></span></dt> + + <dt><span class="sect1"><a href="#logs.package">B.2. + Packaging figlet</a></span></dt> + </dl> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "logs.building" id= + "logs.building"></a>B.1. Building figlet</h2> + </div> + </div> + </div> + <pre class="screen"> +<tt class="prompt">#</tt> <b class="userinput"><tt>make</tt></b> +===> Checking for vulnerabilities in figlet-2.2.1nb2 +=> figlet221.tar.gz doesn't seem to exist on this system. +=> Attempting to fetch figlet221.tar.gz from ftp://ftp.figlet.org/pub/figlet/program/unix/. +=> [172219 bytes] +Connected to ftp.plig.net. +220 ftp.plig.org NcFTPd Server (licensed copy) ready. +331 Guest login ok, send your complete e-mail address as password. +230-You are user #5 of 500 simultaneous users allowed. +230- +230- ___ _ _ _ +230- | _| |_ ___ ___| |_|___ ___ ___ ___ +230- | _| _| . |_| . | | | . |_| . | _| . | +230- |_| |_| | _|_| _|_|_|_ |_|___|_| |_ | +230- |_| |_| |___| |___| +230- +230-** Welcome to ftp.plig.org ** +230- +230-Please note that all transfers from this FTP site are logged. If you +230-do not like this, please disconnect now. +230- +230-This arhive is available via +230- +230-HTTP: http://ftp.plig.org/ +230-FTP: ftp://ftp.plig.org/ (max 500 connections) +230-RSYNC: rsync://ftp.plig.org/ (max 30 connections) +230- +230-Please email comments, bug reports and requests for packages to be +230-mirrored to ftp-admin@plig.org. +230- +230- +230 Logged in anonymously. +Remote system type is UNIX. +Using binary mode to transfer files. +200 Type okay. +250 "/pub" is new cwd. +250-"/pub/figlet" is new cwd. +250- +250-Welcome to the figlet archive at ftp.figlet.org +250- +250- ftp://ftp.figlet.org/pub/figlet/ +250- +250-The official FIGlet web page is: +250- http://www.figlet.org/ +250- +250-If you have questions, please mailto:info@figlet.org. If you want to +250-contribute a font or something else, you can email us. +250 +250 "/pub/figlet/program" is new cwd. +250 "/pub/figlet/program/unix" is new cwd. +local: figlet221.tar.gz remote: figlet221.tar.gz +502 Unimplemented command. +227 Entering Passive Mode (195,40,6,41,246,104) +150 Data connection accepted from 84.128.86.72:65131; transfer starting for figlet221.tar.gz (172219 bytes). +38% |************** | 65800 64.16 KB/s 00:01 ETA +226 Transfer completed. +172219 bytes received in 00:02 (75.99 KB/s) +221 Goodbye. +=> Checksum OK for figlet221.tar.gz. +===> Extracting for figlet-2.2.1nb2 +===> Required installed package ccache-[0-9]*: ccache-2.3nb1 found +===> Patching for figlet-2.2.1nb2 +===> Applying pkgsrc patches for figlet-2.2.1nb2 +===> Overriding tools for figlet-2.2.1nb2 +===> Creating toolchain wrappers for figlet-2.2.1nb2 +===> Configuring for figlet-2.2.1nb2 +===> Building for figlet-2.2.1nb2 +gcc -O2 -DDEFAULTFONTDIR=\"/usr/pkg/share/figlet\" -DDEFAULTFONTFILE=\"standard.flf\" figlet.c zipio.c crc.c inflate.c -o figlet +chmod a+x figlet +gcc -O2 -o chkfont chkfont.c +=> Unwrapping files-to-be-installed. +<tt class="prompt">#</tt> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make install</tt></b> +===> Checking for vulnerabilities in figlet-2.2.1nb2 +===> Installing for figlet-2.2.1nb2 +install -d -o root -g wheel -m 755 /usr/pkg/bin +install -d -o root -g wheel -m 755 /usr/pkg/man/man6 +mkdir -p /usr/pkg/share/figlet +cp figlet /usr/pkg/bin +cp chkfont /usr/pkg/bin +chmod 555 figlist showfigfonts +cp figlist /usr/pkg/bin +cp showfigfonts /usr/pkg/bin +cp fonts/*.flf /usr/pkg/share/figlet +cp fonts/*.flc /usr/pkg/share/figlet +cp figlet.6 /usr/pkg/man/man6 +===> Registering installation for figlet-2.2.1nb2 +<tt class="prompt">#</tt> +</pre> + </div> + + <div class="sect1" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title" style="clear: both"><a name= + "logs.package" id= + "logs.package"></a>B.2. Packaging figlet</h2> + </div> + </div> + </div> + <pre class="screen"> +<tt class="prompt">#</tt> <b class= +"userinput"><tt>make package</tt></b> +===> Checking for vulnerabilities in figlet-2.2.1nb2 +===> Packaging figlet-2.2.1nb2 +===> Building binary package for figlet-2.2.1nb2 +Creating package /home/cvs/pkgsrc/packages/i386/All/figlet-2.2.1nb2.tgz +Using SrcDir value of /usr/pkg +Registering depends:. +<tt class="prompt">#</tt> +</pre> + </div> + </div> + + <div class="appendix" lang="en" xml:lang="en"> + <div class="titlepage"> + <div> + <div> + <h2 class="title"><a name="ftp-layout" id= + "ftp-layout"></a>Appendix C. Layout of the + FTP server's package archive</h2> + </div> + </div> + </div> + + <p>Layout for precompiled binary packages on + ftp.NetBSD.org:</p> + <pre class="programlisting"> +/pub/NetBSD/packages/ + distfiles/ + + # Unpacked pkgsrc trees + pkgsrc-current -> /pub/NetBSD/NetBSD-current/pkgsrc + pkgsrc-2003Q4 -> N/A + pkgsrc-2004Q1/pkgsrc + + # pkgsrc archives + pkgsrc-current.tar.gz -> ../NetBSD-current/tar_files/pkgsrc.tar.gz + pkgsrc-2003Q4.tar.gz -> N/A + pkgsrc-2004Q1.tar.gz -> N/A + + # Per pkgsrc-release/OS-release/arch package archives + pkgsrc-2003Q4/ + NetBSD-1.6.2/ + i386/ + All/ + archivers/ + foo -> ../All/foo + ... + pkgsrc-2004Q1/ + NetBSD-1.6.2/ + i386/ + All/ + ... + NetBSD-2.0/ + i386/ + All/ + ... + SunOS-5.9/ + sparc/ + All/ + ... + x86/ + All/ + ... + + # Per os-release package archive convenience links + NetBSD-1.6.2 -> 1.6.2 + 1.6.2/ + i386 -> ../pkgsrc-2004Q1/NetBSD-1.6.2/i386 + m68k/ + All/ + archivers/ + foo -> ../All/foo + ... + amiga -> m68k + atari -> m68k + ... + + 2.0 -> NetBSD-2.0 # backward compat, historic + NetBSD-2.0/ + i386 -> ../pkgsrc-2004Q1/NetBSD-2.0/i386 + SunOS-5.9/ + sparc -> ../pkgsrc-2004Q1/SunOS-5.9/sparc + x86 -> ../pkgsrc-2004Q1/SunOS-5.9/x86 + +</pre> + + <p>To create:</p> + + <div class="orderedlist"> + <ol type="1"> + <li> + <p>Run bulk build, see <a href="#bulkbuild" title= + "5.3. Doing a bulk build of all packages">Section + 5.3, “Doing a bulk build of all + packages”</a></p> + </li> + + <li> + <p>Upload /usr/pkgsrc/packages to</p> + <pre class="programlisting"> + ftp://ftp.NetBSD.org/pub/NetBSD/packages/\ + pkgsrc-2004Q3/\ # pkgsrc-branch + `uname -s`-`uname -r`/ # OS & version + `uname -p` # architecture + +</pre> + </li> + + <li> + <p>If necessary, create a symlink <span><b class= + "command">ln -s `uname -m` `uname -p`</b></span> (amiga + -> m68k, ...)</p> + </li> + </ol> + </div> + </div> + </div> +</body> +</html> |