11066 lines
648 KiB
HTML
11066 lines
648 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||
<html>
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||
<title>The pkgsrc guide</title>
|
||
<link rel="stylesheet" type="text/css" href="/global.css">
|
||
<meta name="generator" content="DocBook XSL Stylesheets VX.X.X">
|
||
<meta name="description" content="pkgsrc is a centralized package management system for Unix-like operating systems. This guide provides information for users and developers of pkgsrc. It covers installation of binary and source packages, creation of binary and source packages and a high-level overview about the infrastructure.">
|
||
</head>
|
||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="book">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div><h1 class="title">
|
||
<a name="the-pkgsrc-guide"></a>The pkgsrc guide</h1></div>
|
||
<div><h2 class="subtitle">Documentation on the NetBSD packages 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><code class="email"><<a class="email" href="mailto:agc@NetBSD.org">agc@NetBSD.org</a>></code></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><code class="email"><<a class="email" href="mailto:hubertf@NetBSD.org">hubertf@NetBSD.org</a>></code></p></div></div>
|
||
</div>
|
||
<h3 class="corpauthor">
|
||
The pkgsrc Developers
|
||
</h3>
|
||
</div></div>
|
||
<div><p class="copyright">Copyright © 1994-2016 The NetBSD Foundation, Inc</p></div>
|
||
<div><p class="pubdate">$NetBSD: pkgsrc.xml,v 1.29 2016/05/06 17:26:34 jnemeth Exp $</p></div>
|
||
<div><div class="abstract">
|
||
<p class="title"><b>Abstract</b></p>
|
||
<p>pkgsrc is a centralized package management system for
|
||
Unix-like operating systems. This guide provides information for
|
||
users and developers of pkgsrc. It covers installation of binary
|
||
and source packages, creation of binary and source packages and
|
||
a high-level overview about the infrastructure.</p>
|
||
</div></div>
|
||
</div>
|
||
<hr>
|
||
</div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="chapter"><a href="#introduction">1. What is pkgsrc?</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#introduction-section">1.1. Introduction</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#why-pkgsrc">1.1.1. Why pkgsrc?</a></span></dt>
|
||
<dt><span class="sect2"><a href="#intro.platforms">1.1.2. Supported platforms</a></span></dt>
|
||
</dl></dd>
|
||
<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>
|
||
<dd><dl><dt><span class="sect2"><a href="#term.roles">1.3.1. Roles involved in pkgsrc</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#typography">1.4. Typography</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="part"><a href="#users-guide">I. The pkgsrc user's guide</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="chapter"><a href="#getting">2. Where to get pkgsrc and how to keep it up-to-date</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#getting-first">2.1. Getting pkgsrc for the first time</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#getting-via-tar">2.1.1. As tar archive</a></span></dt>
|
||
<dt><span class="sect2"><a href="#getting-via-cvs">2.1.2. Via anonymous CVS</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#uptodate">2.2. Keeping pkgsrc up-to-date</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#uptodate-tar">2.2.1. Via tar files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#uptodate-cvs">2.2.2. Via CVS</a></span></dt>
|
||
</dl></dd>
|
||
</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="#binarydist">3.1. Binary distribution</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bootstrapping-pkgsrc">3.2. Bootstrapping pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-specific-notes">3.3. Platform-specific notes</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#cygwin">3.3.1. Cygwin</a></span></dt>
|
||
<dt><span class="sect2"><a href="#darwin">3.3.2. Darwin (Mac OS X)</a></span></dt>
|
||
<dt><span class="sect2"><a href="#freebsd">3.3.3. FreeBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gnukfreebsd">3.3.4. GNU/kFreeBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#interix">3.3.5. Interix</a></span></dt>
|
||
<dt><span class="sect2"><a href="#irix">3.3.6. IRIX</a></span></dt>
|
||
<dt><span class="sect2"><a href="#linux">3.3.7. Linux</a></span></dt>
|
||
<dt><span class="sect2"><a href="#mirbsd">3.3.8. MirBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#openbsd">3.3.9. OpenBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#solaris">3.3.10. 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="#using-pkg">4.1. Using binary packages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#finding-binary-packages">4.1.1. Finding binary packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#installing-binary-packages">4.1.2. Installing binary packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_delete">4.1.3. Deinstalling packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_info">4.1.4. Getting information about installed packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#vulnerabilities">4.1.5. Checking for security vulnerabilities in installed packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#pkg_versions">4.1.6. Finding if newer versions of your installed packages are in pkgsrc</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_admin">4.1.7. Other administrative functions</a></span></dt>
|
||
<dt><span class="sect2"><a href="#a-word-of-warning">4.1.8. A word of warning</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#building-packages-from-source">4.2. Building packages from source</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#requirements">4.2.1. Requirements</a></span></dt>
|
||
<dt><span class="sect2"><a href="#fetching-distfiles">4.2.2. Fetching distfiles</a></span></dt>
|
||
<dt><span class="sect2"><a href="#how-to-build-and-install">4.2.3. How to build and install</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#configuring">5. Configuring pkgsrc</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#general-configuration">5.1. General configuration</a></span></dt>
|
||
<dt><span class="sect1"><a href="#variables-affecting-build">5.2. Variables affecting the build process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#variables-affecting-installation">5.3. Variables affecting the installation process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#conf.compiler">5.4. Selecting and configuring the compiler</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#selecting-the-compiler">5.4.1. Selecting the compiler</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf.cflags">5.4.2. Additional flags to the compiler (<code class="varname">CFLAGS</code>)</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf.ldflags">5.4.3. Additional flags to the linker (<code class="varname">LDFLAGS</code>)</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#developer-advanced-settings">5.5. Developer/advanced settings</a></span></dt>
|
||
<dt><span class="sect1"><a href="#selecting-build-options">5.6. Selecting Build Options</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#binary">6. Creating binary packages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#building-a-single-binary-package">6.1. Building a single binary package</a></span></dt>
|
||
<dt><span class="sect1"><a href="#settings-for-creationg-of-binary-packages">6.2. Settings for creation of binary packages</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#bulk">7. Creating binary packages for everything in pkgsrc (bulk
|
||
builds)</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#bulk.pre">7.1. Preparations</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bulk.pbulk">7.2. Running a pbulk-style bulk build</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#bulk.pbulk.conf">7.2.1. Configuration</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#bulk.req">7.3. Requirements of a full bulk build</a></span></dt>
|
||
<dt><span class="sect1"><a href="#creating-cdroms">7.4. Creating a multiple CD-ROM packages collection</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#cdpack-example">7.4.1. Example of cdpack</a></span></dt></dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#files">8. Directory layout of the installed files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#files.localbase">8.1. File system layout in <code class="literal">${LOCALBASE}</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#files.varbase">8.2. File system layout in <code class="literal">${VARBASE}</code></a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#faq">9. Frequently Asked Questions</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#mailing-list-pointers">9.1. Are there any mailing lists for pkg-related discussion?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq-pkgtools">9.2. Utilities for package management (pkgtools)</a></span></dt>
|
||
<dt><span class="sect1"><a href="#non-root-pkgsrc">9.3. How to use pkgsrc as non-root</a></span></dt>
|
||
<dt><span class="sect1"><a href="#resume-transfers">9.4. How to resume transfers when fetching distfiles?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#x.org-from-pkgsrc">9.5. How can I install/use modular X.org from pkgsrc?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetch-behind-firewall">9.6. How to fetch files from behind a firewall</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetch-https">9.7. How to fetch files from HTTPS sites</a></span></dt>
|
||
<dt><span class="sect1"><a href="#passive-ftp">9.8. How do I tell <span class="command"><strong>make fetch</strong></span> to do passive FTP?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetching-all-distfiles">9.9. How to fetch all distfiles at once</a></span></dt>
|
||
<dt><span class="sect1"><a href="#tmac.andoc-missing">9.10. What does <span class="quote">“<span class="quote">Don't know how to make
|
||
/usr/share/tmac/tmac.andoc</span>”</span> mean?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bsd.own.mk-missing">9.11. What does <span class="quote">“<span class="quote">Could not find bsd.own.mk</span>”</span> mean?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#using-sudo-with-pkgsrc">9.12. Using 'sudo' with pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.conf">9.13. How do I change the location of configuration files?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#audit-packages">9.14. Automated security checks</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ufaq-cflags">9.15. Why do some packages ignore my <code class="varname">CFLAGS</code>?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ufaq-fail">9.16. A package does not build. What shall I do?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.rcs-conflicts">9.17. What does <span class="quote">“<span class="quote">Makefile appears to contain unresolved cvs/rcs/??? merge conflicts</span>”</span> mean?</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="part"><a href="#developers-guide">II. The pkgsrc developer's guide</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="chapter"><a href="#creating">10. Creating a new pkgsrc package from scratch</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#creating.common">10.1. Common types of packages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#creating.perl-module">10.1.1. Perl modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#creating.kde-app">10.1.2. KDE3 applications</a></span></dt>
|
||
<dt><span class="sect2"><a href="#creating.python-module">10.1.3. Python modules and programs</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#creating.examples">10.2. Examples</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#creating.nvu">10.2.1. How the www/nvu package came into pkgsrc</a></span></dt></dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#components">11. Package components - files, directories and contents</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#components.Makefile">11.1. <code class="filename">Makefile</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.distinfo">11.2. <code class="filename">distinfo</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.patches">11.3. patches/*</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#components.patch.structure">11.3.1. Structure of a single patch file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.caveats">11.3.2. Creating patch files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.sources">11.3.3. Sources where the patch files come from</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.guidelines">11.3.4. Patching guidelines</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.feedback">11.3.5. Feedback to the author</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#other-mandatory-files">11.4. Other mandatory files</a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.optional">11.5. Optional files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#components.optional.bin">11.5.1. Files affecting the binary package</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.optional.build">11.5.2. Files affecting the build process</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.optional.none">11.5.3. Files affecting nothing at all</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#work-dir">11.6. <code class="filename">work*</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#files-dir">11.7. <code class="filename">files/*</code></a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#makefile">12. Programming in <code class="filename">Makefile</code>s</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#makefile.style">12.1. Caveats</a></span></dt>
|
||
<dt><span class="sect1"><a href="#makefile.variables">12.2. <code class="filename">Makefile</code> variables</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#makefile.variables.names">12.2.1. Naming conventions</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#makefile.code">12.3. Code snippets</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#adding-to-list">12.3.1. Adding things to a list</a></span></dt>
|
||
<dt><span class="sect2"><a href="#converting-internal-to-external">12.3.2. Converting an internal list into an external list</a></span></dt>
|
||
<dt><span class="sect2"><a href="#passing-variable-to-shell">12.3.3. Passing variables to a shell command</a></span></dt>
|
||
<dt><span class="sect2"><a href="#quoting-guideline">12.3.4. Quoting guideline</a></span></dt>
|
||
<dt><span class="sect2"><a href="#bsd-make-bug-workaround">12.3.5. Workaround for a bug in BSD Make</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#plist">13. PLIST issues</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#rcs-id">13.1. RCS ID</a></span></dt>
|
||
<dt><span class="sect1"><a href="#automatic-plist-generation">13.2. Semi-automatic <code class="filename">PLIST</code> generation</a></span></dt>
|
||
<dt><span class="sect1"><a href="#print-PLIST">13.3. Tweaking output of <span class="command"><strong>make print-PLIST</strong></span></a></span></dt>
|
||
<dt><span class="sect1"><a href="#plist.misc">13.4. Variable substitution in PLIST</a></span></dt>
|
||
<dt><span class="sect1"><a href="#manpage-compression">13.5. Man page compression</a></span></dt>
|
||
<dt><span class="sect1"><a href="#using-PLIST_SRC">13.6. Changing PLIST source with <code class="varname">PLIST_SRC</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-specific-plist">13.7. Platform-specific and differing PLISTs</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build-plist">13.8. Build-specific PLISTs</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.common-dirs">13.9. Sharing directories between packages</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#buildlink">14. Buildlink methodology</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#converting-to-buildlink3">14.1. Converting packages to use buildlink3</a></span></dt>
|
||
<dt><span class="sect1"><a href="#creating-buildlink3.mk">14.2. Writing <code class="filename">buildlink3.mk</code> files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#anatomy-of-bl3">14.2.1. Anatomy of a buildlink3.mk file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#updating-buildlink-depends">14.2.2. Updating
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
and
|
||
<code class="varname">BUILDLINK_ABI_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
in <code class="filename">buildlink3.mk</code> files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#writing-builtin.mk">14.3. Writing <code class="filename">builtin.mk</code> files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#anatomy-of-builtin.mk">14.3.1. Anatomy of a <code class="filename">builtin.mk</code> file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#native-or-pkgsrc-preference">14.3.2. Global preferences for native or pkgsrc software</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#pkginstall">15. The pkginstall framework</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#files-and-dirs-outside-prefix">15.1. Files and directories outside the installation prefix</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#dirs-outside-prefix">15.1.1. Directory manipulation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#files-outside-prefix">15.1.2. File manipulation</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#conf-files">15.2. Configuration files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#conf-files-sysconfdir">15.2.1. How <code class="varname">PKG_SYSCONFDIR</code> is set</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-configure">15.2.2. Telling the software where configuration files are</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-patching">15.2.3. Patching installations</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-disable">15.2.4. Disabling handling of configuration files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#rcd-scripts">15.3. System startup scripts</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#rcd-scripts-disable">15.3.1. Disabling handling of system startup scripts</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#users-and-groups">15.4. System users and groups</a></span></dt>
|
||
<dt><span class="sect1"><a href="#shells">15.5. System shells</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#shells-disable">15.5.1. Disabling shell registration</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#fonts">15.6. Fonts</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#fonts-disable">15.6.1. Disabling automatic update of the fonts databases</a></span></dt></dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#options">16. Options handling</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#global-default-options">16.1. Global default options</a></span></dt>
|
||
<dt><span class="sect1"><a href="#converting-to-options">16.2. Converting packages to use <code class="filename">bsd.options.mk</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#option-names">16.3. Option Names</a></span></dt>
|
||
<dt><span class="sect1"><a href="#option-build">16.4. Determining the options of dependencies</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#build">17. The build process</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#build.intro">17.1. Introduction</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.prefix">17.2. Program location</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.builddirs">17.3. Directories used during the build process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.running">17.4. Running a phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.fetch">17.5. The <span class="emphasis"><em>fetch</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#build.fetch.what">17.5.1. What to fetch and where to get it from</a></span></dt>
|
||
<dt><span class="sect2"><a href="#build.fetch.how">17.5.2. How are the files fetched?</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#build.checksum">17.6. The <span class="emphasis"><em>checksum</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.extract">17.7. The <span class="emphasis"><em>extract</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.patch">17.8. The <span class="emphasis"><em>patch</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.tools">17.9. The <span class="emphasis"><em>tools</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.wrapper">17.10. The <span class="emphasis"><em>wrapper</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.configure">17.11. The <span class="emphasis"><em>configure</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.build">17.12. The <span class="emphasis"><em>build</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.test">17.13. The <span class="emphasis"><em>test</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.install">17.14. The <span class="emphasis"><em>install</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.package">17.15. The <span class="emphasis"><em>package</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.clean">17.16. Cleaning up</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.helpful-targets">17.17. Other helpful targets</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#tools">18. Tools needed for building or running</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#pkgsrc-tools">18.1. Tools for pkgsrc builds</a></span></dt>
|
||
<dt><span class="sect1"><a href="#package-tools">18.2. Tools needed by packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-tools">18.3. Tools provided by platforms</a></span></dt>
|
||
<dt><span class="sect1"><a href="#tools.questions">18.4. Questions regarding the tools</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#fixes">19. Making your package work</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#general-operation">19.1. General operation</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#portability-of-packages">19.1.1. Portability of packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#pulling-vars-from-etc-mk.conf">19.1.2. How to pull in user-settable variables from <code class="filename">mk.conf</code></a></span></dt>
|
||
<dt><span class="sect2"><a href="#user-interaction">19.1.3. User interaction</a></span></dt>
|
||
<dt><span class="sect2"><a href="#handling-licenses">19.1.4. Handling licenses</a></span></dt>
|
||
<dt><span class="sect2"><a href="#restricted-packages">19.1.5. Restricted packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#dependencies">19.1.6. Handling dependencies</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conflicts">19.1.7. Handling conflicts with other packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#not-building-packages">19.1.8. Packages that cannot or should not be built</a></span></dt>
|
||
<dt><span class="sect2"><a href="#undeletable-packages">19.1.9. Packages which should not be deleted, once installed</a></span></dt>
|
||
<dt><span class="sect2"><a href="#security-handling">19.1.10. Handling packages with security problems</a></span></dt>
|
||
<dt><span class="sect2"><a href="#bumping-pkgrevision">19.1.11. How to handle incrementing versions when fixing an existing package</a></span></dt>
|
||
<dt><span class="sect2"><a href="#fixes.subst">19.1.12. Substituting variable text in the package files (the SUBST framework)</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.fetch">19.2. Fixing problems in the <span class="emphasis"><em>fetch</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#no-plain-download">19.2.1. Packages whose distfiles aren't available for plain downloading</a></span></dt>
|
||
<dt><span class="sect2"><a href="#modified-distfiles-same-name">19.2.2. How to handle modified distfiles with the 'old' name</a></span></dt>
|
||
<dt><span class="sect2"><a href="#build.fetch.github">19.2.3. Packages hosted on github.com</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.configure">19.3. Fixing problems in the <span class="emphasis"><em>configure</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#fixes.libtool">19.3.1. Shared libraries - libtool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using-libtool">19.3.2. Using libtool on GNU packages that already support libtool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#autoconf-automake">19.3.3. GNU Autoconf/Automake</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#programming-languages">19.4. Programming languages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#basic-programming-languages">19.4.1. C, C++, and Fortran</a></span></dt>
|
||
<dt><span class="sect2"><a href="#java-programming-language">19.4.2. Java</a></span></dt>
|
||
<dt><span class="sect2"><a href="#perl-scripts">19.4.3. Packages containing perl scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#shell-scripts">19.4.4. Packages containing shell scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#other-programming-languages">19.4.5. Other programming languages</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.build">19.5. Fixing problems in the <span class="emphasis"><em>build</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#fixes.build.cpp">19.5.1. Compiling C and C++ code conditionally</a></span></dt>
|
||
<dt><span class="sect2"><a href="#compiler-bugs">19.5.2. How to handle compiler bugs</a></span></dt>
|
||
<dt><span class="sect2"><a href="#undefined-reference">19.5.3. Undefined reference to <span class="quote">“<span class="quote">...</span>”</span></a></span></dt>
|
||
<dt><span class="sect2"><a href="#out-of-memory">19.5.4. Running out of memory</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.install">19.6. Fixing problems in the <span class="emphasis"><em>install</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#install-scripts">19.6.1. Creating needed directories</a></span></dt>
|
||
<dt><span class="sect2"><a href="#where-to-install-documentation">19.6.2. Where to install documentation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#installing-score-files">19.6.3. Installing highscore files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#destdir-support">19.6.4. Adding DESTDIR support to packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#hardcoded-paths">19.6.5. Packages with hardcoded paths to other interpreters</a></span></dt>
|
||
<dt><span class="sect2"><a href="#perl-modules">19.6.6. Packages installing perl modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#faq.info-files">19.6.7. Packages installing info files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#manpages">19.6.8. Packages installing man pages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gconf-data-files">19.6.9. Packages installing GConf data files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#scrollkeeper-data-files">19.6.10. Packages installing scrollkeeper/rarian data files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#x11-fonts">19.6.11. Packages installing X11 fonts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gtk2-modules">19.6.12. Packages installing GTK2 modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#sgml-xml-data">19.6.13. Packages installing SGML or XML data</a></span></dt>
|
||
<dt><span class="sect2"><a href="#mime-database">19.6.14. Packages installing extensions to the MIME database</a></span></dt>
|
||
<dt><span class="sect2"><a href="#intltool">19.6.15. Packages using intltool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#startup-scripts">19.6.16. Packages installing startup scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#tex-packages">19.6.17. Packages installing TeX modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#emulation-packages">19.6.18. Packages supporting running binaries in
|
||
emulation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#hicolor-theme">19.6.19. Packages installing hicolor theme icons</a></span></dt>
|
||
<dt><span class="sect2"><a href="#desktop-files">19.6.20. Packages installing desktop files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#punting">19.7. Marking packages as having problems</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#debug">20. Debugging</a></span></dt>
|
||
<dt><span class="chapter"><a href="#submit">21. Submitting and Committing</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#submitting-binary-packages">21.1. Submitting binary packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#submitting-your-package">21.2. Submitting source packages (for non-NetBSD-developers)</a></span></dt>
|
||
<dt><span class="sect1"><a href="#general-notes-for-changes">21.3. General notes when adding, updating, or removing packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#committing-importing">21.4. Committing: Adding a package to CVS</a></span></dt>
|
||
<dt><span class="sect1"><a href="#updating-package">21.5. Updating a package to a newer version</a></span></dt>
|
||
<dt><span class="sect1"><a href="#renaming-package">21.6. Renaming a package in pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#moving-package">21.7. Moving a package in pkgsrc</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#devfaq">22. Frequently Asked Questions</a></span></dt>
|
||
<dt><span class="chapter"><a href="#gnome">23. GNOME packaging and porting</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#meta-packages">23.1. Meta packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#new-package">23.2. Packaging a GNOME application</a></span></dt>
|
||
<dt><span class="sect1"><a href="#full-update">23.3. Updating GNOME to a newer version</a></span></dt>
|
||
<dt><span class="sect1"><a href="#patching">23.4. Patching guidelines</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="part"><a href="#infrastructure">III. The pkgsrc infrastructure internals</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="chapter"><a href="#infr.design">24. Design of the pkgsrc infrastructure</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#infr.vardef">24.1. The meaning of variable definitions</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.vardef.problems">24.2. Avoiding problems before they arise</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.var">24.3. Variable evaluation</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.var.load">24.3.1. At load time</a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.var.run">24.3.2. At runtime</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#infr.varspec">24.4. How can variables be specified?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.design.intf">24.5. Designing interfaces for Makefile fragments</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.design.intf.proc">24.5.1. Procedures with parameters</a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.design.intf.action">24.5.2. Actions taken on behalf of parameters</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#infr.order">24.6. The order in which files are loaded</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.order.prefs">24.6.1. The order in <code class="filename">bsd.prefs.mk</code></a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.order.pkg">24.6.2. The order in <code class="filename">bsd.pkg.mk</code></a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#regression">25. Regression tests</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#regression.descr">25.1. The regression tests framework</a></span></dt>
|
||
<dt><span class="sect1"><a href="#regression.run">25.2. Running the regression tests</a></span></dt>
|
||
<dt><span class="sect1"><a href="#regression.new">25.3. Adding a new regression test</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#regression.fun.override">25.3.1. Overridable functions</a></span></dt>
|
||
<dt><span class="sect2"><a href="#regression.fun.helper">25.3.2. Helper functions</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#porting">26. Porting pkgsrc</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#porting.opsys">26.1. Porting pkgsrc to a new operating system</a></span></dt>
|
||
<dt><span class="sect1"><a href="#porting.compiler">26.2. Adding support for a new compiler</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="#example-files">A.1. files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#example-Makefile">A.1.1. Makefile</a></span></dt>
|
||
<dt><span class="sect2"><a href="#example-descr">A.1.2. DESCR</a></span></dt>
|
||
<dt><span class="sect2"><a href="#example-plist">A.1.3. PLIST</a></span></dt>
|
||
<dt><span class="sect2"><a href="#checking-package-with-pkglint">A.1.4. Checking a package with <span class="command"><strong>pkglint</strong></span></a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#steps-for-b-i-p">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. Directory layout of the pkgsrc FTP server</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#ftp-distfiles">C.1. <code class="filename">distfiles</code>: The distributed source files</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ftp-misc">C.2. <code class="filename">misc</code>: Miscellaneous things</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ftp-packages">C.3. <code class="filename">packages</code>: Binary packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ftp-reports">C.4. <code class="filename">reports</code>: Bulk build reports</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ftp-source">C.5. <code class="filename">current</code>,
|
||
<code class="filename">pkgsrc-20<em class="replaceable"><code>xx</code></em>Q<em class="replaceable"><code>y</code></em></code>:
|
||
source packages</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="appendix"><a href="#editing">D. Editing guidelines for the pkgsrc guide</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#targets">D.1. Make targets</a></span></dt>
|
||
<dt><span class="sect1"><a href="#procedure">D.2. Procedure</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
<div class="list-of-tables">
|
||
<p><b>List of Tables</b></p>
|
||
<dl>
|
||
<dt>1.1. <a href="#supported-platforms">Platforms supported by pkgsrc</a>
|
||
</dt>
|
||
<dt>11.1. <a href="#patch-examples">Patching examples</a>
|
||
</dt>
|
||
<dt>23.1. <a href="#plist-handling">PLIST handling for GNOME packages</a>
|
||
</dt>
|
||
</dl>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h1 class="title">
|
||
<a name="introduction"></a>Chapter 1. What is pkgsrc?</h1></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#introduction-section">1.1. Introduction</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#why-pkgsrc">1.1.1. Why pkgsrc?</a></span></dt>
|
||
<dt><span class="sect2"><a href="#intro.platforms">1.1.2. Supported platforms</a></span></dt>
|
||
</dl></dd>
|
||
<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>
|
||
<dd><dl><dt><span class="sect2"><a href="#term.roles">1.3.1. Roles involved in pkgsrc</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#typography">1.4. Typography</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="introduction-section"></a>1.1. Introduction</h2></div></div></div>
|
||
<p>There is a lot of software freely available for Unix-based
|
||
systems, which is usually available in form of the source code. Before
|
||
such software can be used, it needs to be configured to the local
|
||
system, compiled and installed, and this is exactly what The NetBSD
|
||
Packages Collection (pkgsrc) does. pkgsrc also has some basic commands
|
||
to handle binary packages, so that not every user has to build the
|
||
packages for himself, which is a time-costly task.</p>
|
||
<p>pkgsrc currently contains several thousand packages,
|
||
including:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/www/apache24/README.html" target="_top"><code class="filename">www/apache24</code></a> - The Apache
|
||
web server</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/www/firefox/README.html" target="_top"><code class="filename">www/firefox</code></a> - The Firefox
|
||
web browser</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/gnome/README.html" target="_top"><code class="filename">meta-pkgs/gnome</code></a> - The GNOME
|
||
Desktop Environment</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/kde4/README.html" target="_top"><code class="filename">meta-pkgs/kde4</code></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>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="why-pkgsrc"></a>1.1.1. Why pkgsrc?</h3></div></div></div>
|
||
<p>
|
||
pkgsrc provides the following key features:
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Easy building of software from source as well as the creation
|
||
and installation of binary packages. The source and latest
|
||
patches are retrieved from a master or mirror download site, checksum
|
||
verified, then built on your system. Support for binary-only
|
||
distributions is available for both native platforms and NetBSD
|
||
emulated platforms.</p></li>
|
||
<li class="listitem"><p>All packages are installed in a consistent directory tree,
|
||
including binaries, libraries, man pages and other
|
||
documentation.</p></li>
|
||
<li class="listitem"><p>Tracking of package dependencies automatically, including when
|
||
performing updates, to ensure required packages are installed. The
|
||
configuration files of various packages are handled automatically during
|
||
updates, so local changes are preserved.</p></li>
|
||
<li class="listitem"><p>Like NetBSD, pkgsrc is designed with portability in mind and
|
||
consists of highly portable code. This allows the greatest speed of
|
||
development when porting to a new platform. This portability also
|
||
ensures that pkgsrc is <span class="emphasis"><em>consistent across all
|
||
platforms</em></span>.</p></li>
|
||
<li class="listitem"><p>The installation prefix, acceptable software licenses,
|
||
international encryption requirements and build-time options for a
|
||
large number of packages are all set in a simple, central
|
||
configuration file.</p></li>
|
||
<li class="listitem"><p>The entire source (not including the distribution files) is
|
||
freely available under a BSD license, so you may extend and adapt
|
||
pkgsrc to your needs. Support for local packages and patches is
|
||
available right out of the box, so you can configure it specifically
|
||
for your environment.</p></li>
|
||
</ul></div>
|
||
<p>The following principles are basic to pkgsrc:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><span class="quote">“<span class="quote">It should only work if it's right.</span>”</span>
|
||
— That means, if a package contains bugs, it's better to find
|
||
them and to complain about them rather than to just install the package
|
||
and hope that it works. There are numerous checks in pkgsrc that try to
|
||
find such bugs: Static analysis tools (<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkglint/README.html" target="_top"><code class="filename">pkgtools/pkglint</code></a>), build-time checks (portability
|
||
of shell scripts), and post-installation checks (installed files,
|
||
references to shared libraries, script interpreters).</p></li>
|
||
<li class="listitem"><p><span class="quote">“<span class="quote">If it works, it should work everywhere</span>”</span>
|
||
— Like NetBSD has been ported to many hardware architectures,
|
||
pkgsrc has been ported to many operating systems. Care is taken that
|
||
packages behave the same on all platforms.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="intro.platforms"></a>1.1.2. Supported platforms</h3></div></div></div>
|
||
<p>pkgsrc consists of both a source distribution and a binary
|
||
distribution for these operating systems. After retrieving the required
|
||
source or binaries, you can be up and running with pkgsrc in just
|
||
minutes!</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="table">
|
||
<a name="supported-platforms"></a><p class="title"><b>Table 1.1. Platforms supported by pkgsrc</b></p>
|
||
<div class="table-contents"><table class="table" summary="Platforms supported by pkgsrc" border="1">
|
||
<colgroup>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
</colgroup>
|
||
<thead><tr>
|
||
<th>Platform</th>
|
||
<th>Date Support Added</th>
|
||
<th>Notes</th>
|
||
</tr></thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.NetBSD.org/" target="_top">NetBSD</a></td>
|
||
<td align="center">Aug 1997</td>
|
||
<td class="auto-generated"> </td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://wwws.sun.com/software/solaris/" target="_top">Solaris</a></td>
|
||
<td align="center">Mar 1999</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.Solaris" target="_top">README.Solaris</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.kernel.org/" target="_top">Linux</a></td>
|
||
<td align="center">Jun 1999</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.Linux" target="_top">README.Linux</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
<a class="ulink" href="http://developer.apple.com/darwin/" target="_top">Darwin</a>
|
||
(<a class="ulink" href="http://developer.apple.com/macosx/" target="_top">Mac OS X</a>)
|
||
</td>
|
||
<td align="center">Oct 2001</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.MacOSX" target="_top">README.MacOSX</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.freebsd.org/" target="_top">FreeBSD</a></td>
|
||
<td align="center">Nov 2002</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.FreeBSD" target="_top">README.FreeBSD</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.openbsd.org/" target="_top">OpenBSD</a></td>
|
||
<td align="center">Nov 2002</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.OpenBSD" target="_top">README.OpenBSD</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.sgi.com/software/irix/" target="_top">IRIX</a></td>
|
||
<td align="center">Dec 2002</td>
|
||
<td>
|
||
<a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.IRIX" target="_top">README.IRIX</a>
|
||
<a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.IRIX5.3" target="_top">README.IRIX5.3</a>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>BSD/OS</td>
|
||
<td align="center">Dec 2003</td>
|
||
<td class="auto-generated"> </td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www-1.ibm.com/servers/aix/" target="_top">AIX</a></td>
|
||
<td align="center">Dec 2003</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.AIX" target="_top">README.AIX</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
<a class="ulink" href="http://www.microsoft.com/windows/sfu/" target="_top">Interix</a>
|
||
(Microsoft Windows Services for Unix)
|
||
</td>
|
||
<td align="center">Mar 2004</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.Interix" target="_top">README.Interix</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.dragonflybsd.org/" target="_top">DragonFlyBSD</a></td>
|
||
<td align="center">Oct 2004</td>
|
||
<td class="auto-generated"> </td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.tru64.org/" target="_top">OSF/1</a></td>
|
||
<td align="center">Nov 2004</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.OSF1" target="_top">README.OSF1</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.hp.com/products1/unix/" target="_top">HP-UX</a></td>
|
||
<td align="center">Apr 2007</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.HPUX" target="_top">README.HPUX</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.haiku-os.org/" target="_top">Haiku</a></td>
|
||
<td align="center">Sep 2010</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.Haiku" target="_top">README.Haiku</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.mirbsd.org/" target="_top">MirBSD</a></td>
|
||
<td align="center">Jan 2011</td>
|
||
<td class="auto-generated"> </td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.minix3.org/" target="_top">Minix3</a></td>
|
||
<td align="center">Nov 2011</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.Minix3" target="_top">README.Minix3</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://cygwin.com/" target="_top">Cygwin</a></td>
|
||
<td align="center">Mar 2013</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.Cygwin" target="_top">README.Cygwin</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.debian.org/ports/kfreebsd-gnu/" target="_top">GNU/kFreeBSD</a></td>
|
||
<td align="center">Jul 2013</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.GNUkFreeBSD" target="_top">README.GNUkFreeBSD</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="ulink" href="http://www.bitrig.org/" target="_top">Bitrig</a></td>
|
||
<td align="center">Jun 2014</td>
|
||
<td><a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/bootstrap/README.Bitrig" target="_top">README.Bitrig</a></td>
|
||
</tr>
|
||
</tbody>
|
||
</table></div>
|
||
</div>
|
||
<br class="table-break">
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="overview"></a>1.2. Overview</h2></div></div></div>
|
||
<p>This document is divided into three parts. The first,
|
||
<a class="link" href="#users-guide" title="Part I. The pkgsrc user's guide">The 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 class="link" href="#developers-guide" title="Part II. The pkgsrc developer's guide">The 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. The third part,
|
||
<a class="link" href="#infrastructure" title="Part III. The pkgsrc infrastructure internals">The pkgsrc infrastructure internals</a>
|
||
is intended for those who want to understand how pkgsrc is
|
||
implemented.</p>
|
||
<p>This document is available in various formats:
|
||
<span class="simplelist"><a class="ulink" href="index.html" target="_top">HTML</a>, <a class="ulink" href="pkgsrc.pdf" target="_top">PDF</a>, <a class="ulink" href="pkgsrc.ps" target="_top">PS</a>, <a class="ulink" href="pkgsrc.txt" target="_top">TXT</a></span>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="terminology"></a>1.3. Terminology</h2></div></div></div>
|
||
<p>There has been a lot of talk about <span class="quote">“<span class="quote">ports</span>”</span>,
|
||
<span class="quote">“<span class="quote">packages</span>”</span>, etc. so far. Here is a description of all the
|
||
terminology used within this document.</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<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
|
||
<code class="filename">/usr/pkgsrc</code>.</p></dd>
|
||
<dt><span class="term">The NetBSD package system</span></dt>
|
||
<dd><p>This is the former name of <span class="quote">“<span class="quote">pkgsrc</span>”</span>. It
|
||
is part of the NetBSD operating system and can be bootstrapped
|
||
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
|
||
<code class="filename">/usr/pkgsrc/distfiles</code>.</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">“<span class="quote">port</span>”</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 <code class="filename">.tgz</code>
|
||
file so it can be installed on machines of the same
|
||
machine architecture without the need to
|
||
recompile. Packages are usually generated in
|
||
<code class="filename">/usr/pkgsrc/packages</code>; there is also
|
||
an archive on <a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/" target="_top">ftp.NetBSD.org</a>.</p>
|
||
<p>Sometimes, this is referred to by the term <span class="quote">“<span class="quote">package</span>”</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 class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="term.roles"></a>1.3.1. Roles involved in pkgsrc</h3></div></div></div>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term">pkgsrc users</span></dt>
|
||
<dd>
|
||
<p>The
|
||
pkgsrc users are people who use the packages provided by pkgsrc.
|
||
Typically they are system administrators. The people using the
|
||
software that is inside the packages (maybe called <span class="quote">“<span class="quote">end
|
||
users</span>”</span>) are not covered by the pkgsrc guide.</p>
|
||
<p>There are two kinds of pkgsrc users: Some only want to
|
||
install pre-built binary packages. Others build the pkgsrc
|
||
packages from source, either for installing them directly or for
|
||
building binary packages themselves. For pkgsrc users <a class="xref" href="#users-guide" title="Part I. The pkgsrc user's guide">Part I, “The pkgsrc user's guide”</a> should provide all necessary
|
||
documentation.</p>
|
||
</dd>
|
||
<dt><span class="term">package maintainers</span></dt>
|
||
<dd><p>A
|
||
package maintainer creates packages as described in <a class="xref" href="#developers-guide" title="Part II. The pkgsrc developer's guide">Part II, “The pkgsrc developer's guide”</a>.</p></dd>
|
||
<dt><span class="term">infrastructure developers</span></dt>
|
||
<dd><p>These people are involved in all those files
|
||
that live in the <code class="filename">mk/</code> directory and below.
|
||
Only these people should need to read through <a class="xref" href="#infrastructure" title="Part III. The pkgsrc infrastructure internals">Part III, “The pkgsrc infrastructure internals”</a>, though others might be curious,
|
||
too.</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="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">“<span class="quote">normal</span>”</span> user privileges are sufficient. We use a
|
||
<code class="prompt">#</code> for root's shell prompt, and a <code class="prompt">%</code> for users'
|
||
shell prompt, assuming they use the C-shell or tcsh.</p>
|
||
</div>
|
||
</div>
|
||
<div class="part">
|
||
<div class="titlepage"><div><div><h1 class="title">
|
||
<a name="users-guide"></a>Part I. The pkgsrc user's guide</h1></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="chapter"><a href="#getting">2. Where to get pkgsrc and how to keep it up-to-date</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#getting-first">2.1. Getting pkgsrc for the first time</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#getting-via-tar">2.1.1. As tar archive</a></span></dt>
|
||
<dt><span class="sect2"><a href="#getting-via-cvs">2.1.2. Via anonymous CVS</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#uptodate">2.2. Keeping pkgsrc up-to-date</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#uptodate-tar">2.2.1. Via tar files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#uptodate-cvs">2.2.2. Via CVS</a></span></dt>
|
||
</dl></dd>
|
||
</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="#binarydist">3.1. Binary distribution</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bootstrapping-pkgsrc">3.2. Bootstrapping pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-specific-notes">3.3. Platform-specific notes</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#cygwin">3.3.1. Cygwin</a></span></dt>
|
||
<dt><span class="sect2"><a href="#darwin">3.3.2. Darwin (Mac OS X)</a></span></dt>
|
||
<dt><span class="sect2"><a href="#freebsd">3.3.3. FreeBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gnukfreebsd">3.3.4. GNU/kFreeBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#interix">3.3.5. Interix</a></span></dt>
|
||
<dt><span class="sect2"><a href="#irix">3.3.6. IRIX</a></span></dt>
|
||
<dt><span class="sect2"><a href="#linux">3.3.7. Linux</a></span></dt>
|
||
<dt><span class="sect2"><a href="#mirbsd">3.3.8. MirBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#openbsd">3.3.9. OpenBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#solaris">3.3.10. 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="#using-pkg">4.1. Using binary packages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#finding-binary-packages">4.1.1. Finding binary packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#installing-binary-packages">4.1.2. Installing binary packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_delete">4.1.3. Deinstalling packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_info">4.1.4. Getting information about installed packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#vulnerabilities">4.1.5. Checking for security vulnerabilities in installed packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#pkg_versions">4.1.6. Finding if newer versions of your installed packages are in pkgsrc</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_admin">4.1.7. Other administrative functions</a></span></dt>
|
||
<dt><span class="sect2"><a href="#a-word-of-warning">4.1.8. A word of warning</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#building-packages-from-source">4.2. Building packages from source</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#requirements">4.2.1. Requirements</a></span></dt>
|
||
<dt><span class="sect2"><a href="#fetching-distfiles">4.2.2. Fetching distfiles</a></span></dt>
|
||
<dt><span class="sect2"><a href="#how-to-build-and-install">4.2.3. How to build and install</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#configuring">5. Configuring pkgsrc</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#general-configuration">5.1. General configuration</a></span></dt>
|
||
<dt><span class="sect1"><a href="#variables-affecting-build">5.2. Variables affecting the build process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#variables-affecting-installation">5.3. Variables affecting the installation process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#conf.compiler">5.4. Selecting and configuring the compiler</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#selecting-the-compiler">5.4.1. Selecting the compiler</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf.cflags">5.4.2. Additional flags to the compiler (<code class="varname">CFLAGS</code>)</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf.ldflags">5.4.3. Additional flags to the linker (<code class="varname">LDFLAGS</code>)</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#developer-advanced-settings">5.5. Developer/advanced settings</a></span></dt>
|
||
<dt><span class="sect1"><a href="#selecting-build-options">5.6. Selecting Build Options</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#binary">6. Creating binary packages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#building-a-single-binary-package">6.1. Building a single binary package</a></span></dt>
|
||
<dt><span class="sect1"><a href="#settings-for-creationg-of-binary-packages">6.2. Settings for creation of binary packages</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#bulk">7. Creating binary packages for everything in pkgsrc (bulk
|
||
builds)</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#bulk.pre">7.1. Preparations</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bulk.pbulk">7.2. Running a pbulk-style bulk build</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#bulk.pbulk.conf">7.2.1. Configuration</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#bulk.req">7.3. Requirements of a full bulk build</a></span></dt>
|
||
<dt><span class="sect1"><a href="#creating-cdroms">7.4. Creating a multiple CD-ROM packages collection</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#cdpack-example">7.4.1. Example of cdpack</a></span></dt></dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#files">8. Directory layout of the installed files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#files.localbase">8.1. File system layout in <code class="literal">${LOCALBASE}</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#files.varbase">8.2. File system layout in <code class="literal">${VARBASE}</code></a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#faq">9. Frequently Asked Questions</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#mailing-list-pointers">9.1. Are there any mailing lists for pkg-related discussion?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq-pkgtools">9.2. Utilities for package management (pkgtools)</a></span></dt>
|
||
<dt><span class="sect1"><a href="#non-root-pkgsrc">9.3. How to use pkgsrc as non-root</a></span></dt>
|
||
<dt><span class="sect1"><a href="#resume-transfers">9.4. How to resume transfers when fetching distfiles?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#x.org-from-pkgsrc">9.5. How can I install/use modular X.org from pkgsrc?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetch-behind-firewall">9.6. How to fetch files from behind a firewall</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetch-https">9.7. How to fetch files from HTTPS sites</a></span></dt>
|
||
<dt><span class="sect1"><a href="#passive-ftp">9.8. How do I tell <span class="command"><strong>make fetch</strong></span> to do passive FTP?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetching-all-distfiles">9.9. How to fetch all distfiles at once</a></span></dt>
|
||
<dt><span class="sect1"><a href="#tmac.andoc-missing">9.10. What does <span class="quote">“<span class="quote">Don't know how to make
|
||
/usr/share/tmac/tmac.andoc</span>”</span> mean?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bsd.own.mk-missing">9.11. What does <span class="quote">“<span class="quote">Could not find bsd.own.mk</span>”</span> mean?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#using-sudo-with-pkgsrc">9.12. Using 'sudo' with pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.conf">9.13. How do I change the location of configuration files?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#audit-packages">9.14. Automated security checks</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ufaq-cflags">9.15. Why do some packages ignore my <code class="varname">CFLAGS</code>?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ufaq-fail">9.16. A package does not build. What shall I do?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.rcs-conflicts">9.17. What does <span class="quote">“<span class="quote">Makefile appears to contain unresolved cvs/rcs/??? merge conflicts</span>”</span> mean?</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="getting"></a>Chapter 2. Where to get pkgsrc and how to keep it up-to-date</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#getting-first">2.1. Getting pkgsrc for the first time</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#getting-via-tar">2.1.1. As tar archive</a></span></dt>
|
||
<dt><span class="sect2"><a href="#getting-via-cvs">2.1.2. Via anonymous CVS</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#uptodate">2.2. Keeping pkgsrc up-to-date</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#uptodate-tar">2.2.1. Via tar files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#uptodate-cvs">2.2.2. Via CVS</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
<p>Before you download and extract the files, you need to decide
|
||
where you want to extract them. When using pkgsrc as root user, pkgsrc
|
||
is usually installed in <code class="filename">/usr/pkgsrc</code>. You are though
|
||
free to install the sources and binary packages wherever you want in
|
||
your filesystem, provided that the pathname does not contain white-space
|
||
or other characters that are interpreted specially by the shell and some
|
||
other programs. A safe bet is to use only letters, digits, underscores
|
||
and dashes.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="getting-first"></a>2.1. Getting pkgsrc for the first time</h2></div></div></div>
|
||
<p>Before you download any pkgsrc files, you should decide
|
||
whether you want the <span class="emphasis"><em>current</em></span> branch or the
|
||
<span class="emphasis"><em>stable</em></span> branch. The latter is forked on a
|
||
quarterly basis from the current branch and only gets modified
|
||
for security updates. The names of the stable branches are built
|
||
from the year and the quarter, for example
|
||
<code class="literal">2014Q3</code>.</p>
|
||
<p>The second step is to decide <span class="emphasis"><em>how</em></span> you
|
||
want to download pkgsrc. You can get it as a tar file or via CVS.
|
||
Both ways are described here.</p>
|
||
<p>Note that tar archive contains CVS working copy.
|
||
Thus you can switch to using CVS at any later time.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="getting-via-tar"></a>2.1.1. As tar archive</h3></div></div></div>
|
||
<p>The primary download location for all pkgsrc files is
|
||
<a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/" target="_top">http://ftp.NetBSD.org/pub/pkgsrc/</a> or
|
||
<a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/" target="_top">ftp://ftp.NetBSD.org/pub/pkgsrc/</a>
|
||
(it points to the same location).
|
||
There are a number of subdirectories for different purposes,
|
||
which are described in detail in <a class="xref" href="#ftp-layout" title="Appendix C. Directory layout of the pkgsrc FTP server">Appendix C, <i>Directory layout of the pkgsrc FTP server</i></a>.</p>
|
||
<p>The tar archive for the current branch is in the directory
|
||
<code class="filename">current</code> and is called <a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc.tar.gz" target="_top"><code class="filename">pkgsrc.tar.gz</code></a>.
|
||
It is autogenerated daily.</p>
|
||
<p>To save download time we provide bzip2- and
|
||
xz-compressed archives which are published at
|
||
<a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc.tar.bz2" target="_top"><code class="filename">pkgsrc.tar.bz2</code></a>
|
||
and
|
||
<a class="ulink" href="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc.tar.xz" target="_top"><code class="filename">pkgsrc.tar.xz</code></a>
|
||
respectively.
|
||
</p>
|
||
<p>You can fetch the same files using FTP.</p>
|
||
<p>The tar file for the stable branch 2014Q3 is in the
|
||
directory <code class="filename">pkgsrc-2014Q3</code> and is also called <a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/pkgsrc-2014Q3/pkgsrc.tar.gz" target="_top"><code class="filename">pkgsrc.tar.gz</code></a>.</p>
|
||
<p>To download a pkgsrc stable tarball, run:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">$</code> <strong class="userinput"><code>ftp ftp://ftp.NetBSD.org/pub/pkgsrc/<em class="replaceable"><code>pkgsrc-20xxQy</code></em>/pkgsrc.tar.gz</code></strong></pre>
|
||
<p>Where <em class="replaceable"><code>pkgsrc-20xxQy</code></em> is the
|
||
stable branch to be downloaded, for example,
|
||
<span class="quote">“<span class="quote">pkgsrc-2014Q3</span>”</span>.</p>
|
||
<p>If you prefer, you can also fetch it using "wget", "curl",
|
||
or your web browser.</p>
|
||
<p>Then, extract it with:</p>
|
||
<pre class="screen"><code class="prompt">$</code> <strong class="userinput"><code>tar -xzf pkgsrc.tar.gz -C /usr</code></strong></pre>
|
||
<p>This will create the directory <code class="filename">pkgsrc/</code>
|
||
in <code class="filename">/usr/</code> and all the package source will be
|
||
stored under <code class="filename">/usr/pkgsrc/</code>.</p>
|
||
<p>To download pkgsrc-current, run:</p>
|
||
<pre class="screen"><code class="prompt">$</code> <strong class="userinput"><code>ftp ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc.tar.gz</code></strong></pre>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="getting-via-cvs"></a>2.1.2. Via anonymous CVS</h3></div></div></div>
|
||
<p>To fetch a specific pkgsrc stable branch, run:</p>
|
||
<pre class="screen"><code class="prompt">$</code> <strong class="userinput"><code>cd /usr && cvs -q -z2 -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -r <em class="replaceable"><code>pkgsrc-20xxQy</code></em> -P pkgsrc</code></strong>
|
||
</pre>
|
||
<p>Where <em class="replaceable"><code>pkgsrc-20xxQy</code></em> is the stable
|
||
branch to be checked out, for example, <span class="quote">“<span class="quote">pkgsrc-2014Q3</span>”</span></p>
|
||
<p>This will create the directory <code class="filename">pkgsrc/</code>
|
||
in your <code class="filename">/usr/</code> directory and all the package source
|
||
will be stored under <code class="filename">/usr/pkgsrc/</code>.</p>
|
||
<p>To fetch the pkgsrc current branch, run:</p>
|
||
<pre class="screen"><code class="prompt">$</code> <strong class="userinput"><code>cd /usr && cvs -q -z2 -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -P pkgsrc</code></strong>
|
||
</pre>
|
||
<p>Refer to the <a class="ulink" href="http://www.NetBSD.org/mirrors/#anoncvs" target="_top">list of available mirrors</a> to choose a faster CVS mirror, if needed.</p>
|
||
<p>If you get error messages from <code class="literal">rsh</code>, you need to set CVS_RSH variable. E.g.:</p>
|
||
<pre class="screen"><code class="prompt">$</code> <strong class="userinput"><code>cd /usr && env CVS_RSH=ssh cvs -q -z2 -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -P pkgsrc</code></strong>
|
||
</pre>
|
||
<p>Refer to documentation on your command shell how to set CVS_RSH=ssh permanently.
|
||
For Bourne shells, you can set it in your <code class="filename">.profile</code>
|
||
or better globally in <code class="filename">/etc/profile</code>:</p>
|
||
<pre class="programlisting">
|
||
# set CVS remote shell command
|
||
CVS_RSH=ssh
|
||
export CVS_RSH
|
||
</pre>
|
||
<p>By default, CVS doesn't do things like most people would expect it to do.
|
||
But there is a way to convince CVS, by creating a file called <code class="filename">.cvsrc</code>
|
||
in your home directory and saving the following lines to it.
|
||
This file will save you lots of headache and some bug reports, so we strongly recommend it.
|
||
You can find an explanation of this file in the CVS documentation.</p>
|
||
<pre class="programlisting">
|
||
# recommended CVS configuration file from the pkgsrc guide
|
||
cvs -q -z2
|
||
checkout -P
|
||
update -dP
|
||
diff -upN
|
||
rdiff -u
|
||
release -d
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="uptodate"></a>2.2. Keeping pkgsrc up-to-date</h2></div></div></div>
|
||
<p>The preferred way to keep pkgsrc up-to-date is via CVS
|
||
(which also works if you have first installed it via a tar
|
||
file). It saves bandwidth and hard disk activity, compared to
|
||
downloading the tar file again.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="uptodate-tar"></a>2.2.1. Via tar files</h3></div></div></div>
|
||
<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Warning</h3>
|
||
<p>When updating from a tar file, you first need to
|
||
completely remove the old pkgsrc directory. Otherwise those
|
||
files that have been removed from pkgsrc in the mean time will
|
||
not be removed on your local disk, resulting in inconsistencies.
|
||
When removing the old files, any changes that you have done to
|
||
the pkgsrc files will be lost after updating. Therefore updating
|
||
via CVS is strongly recommended.</p>
|
||
</div>
|
||
<p>Note that by default the distfiles and the binary packages
|
||
are saved in the pkgsrc tree, so don't forget to rescue them
|
||
before updating. You can also configure pkgsrc to store distfiles
|
||
and packages in directories outside the pkgsrc tree by setting the
|
||
<code class="varname">DISTDIR</code> and <code class="varname">PACKAGES</code>
|
||
variables. See <a class="xref" href="#configuring" title="Chapter 5. Configuring pkgsrc">Chapter 5, <i>Configuring pkgsrc</i></a> for the details.</p>
|
||
<p>To update pkgsrc from a tar file, download the tar file as
|
||
explained above. Then, make sure that you have not made any
|
||
changes to the files in the pkgsrc directory. Remove the pkgsrc
|
||
directory and extract the new tar file. Done.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="uptodate-cvs"></a>2.2.2. Via CVS</h3></div></div></div>
|
||
<p>To update pkgsrc via CVS, change to the <code class="filename">pkgsrc</code> directory and run cvs:</p>
|
||
<pre class="screen"><code class="prompt">$</code> <strong class="userinput"><code>cd /usr/pkgsrc && cvs update -dP</code></strong>
|
||
</pre>
|
||
<p>If you get error messages from <code class="literal">rsh</code>, you need to set CVS_RSH variable as described above. E.g.:</p>
|
||
<pre class="screen"><code class="prompt">$</code> <strong class="userinput"><code>cd /usr/pkgsrc && env CVS_RSH=ssh cvs up -dP</code></strong>
|
||
</pre>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="uptodate-cvs-switch"></a>2.2.2.1. Switching between different pkgsrc branches</h4></div></div></div>
|
||
<p>When updating pkgsrc, the CVS program keeps track of the
|
||
branch you selected. But if you, for whatever reason, want to
|
||
switch from the stable branch to the current one, you can do it
|
||
by adding the option <span class="quote">“<span class="quote">-A</span>”</span> after the
|
||
<span class="quote">“<span class="quote">update</span>”</span> keyword. To switch from the current branch
|
||
back to the stable branch, add the
|
||
<span class="quote">“<span class="quote">-rpkgsrc-2014Q3</span>”</span> option.</p>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="uptodate-cvs-changes"></a>2.2.2.2. What happens to my changes when updating?</h4></div></div></div>
|
||
<p>When you update pkgsrc, the CVS program will only touch
|
||
those files that are registered in the CVS repository. That
|
||
means that any packages that you created on your own will stay
|
||
unmodified. If you change files that are managed by CVS, later
|
||
updates will try to merge your changes with those that have been
|
||
done by others. See the CVS manual, chapter
|
||
<span class="quote">“<span class="quote">update</span>”</span> for details.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="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 class="toc">
|
||
<dt><span class="sect1"><a href="#binarydist">3.1. Binary distribution</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bootstrapping-pkgsrc">3.2. Bootstrapping pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-specific-notes">3.3. Platform-specific notes</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#cygwin">3.3.1. Cygwin</a></span></dt>
|
||
<dt><span class="sect2"><a href="#darwin">3.3.2. Darwin (Mac OS X)</a></span></dt>
|
||
<dt><span class="sect2"><a href="#freebsd">3.3.3. FreeBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gnukfreebsd">3.3.4. GNU/kFreeBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#interix">3.3.5. Interix</a></span></dt>
|
||
<dt><span class="sect2"><a href="#irix">3.3.6. IRIX</a></span></dt>
|
||
<dt><span class="sect2"><a href="#linux">3.3.7. Linux</a></span></dt>
|
||
<dt><span class="sect2"><a href="#mirbsd">3.3.8. MirBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#openbsd">3.3.9. OpenBSD</a></span></dt>
|
||
<dt><span class="sect2"><a href="#solaris">3.3.10. Solaris</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="binarydist"></a>3.1. Binary distribution</h2></div></div></div>
|
||
<p>See <a class="xref" href="#using-pkg" title="4.1. Using binary packages">Section 4.1, “Using binary packages”</a>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="bootstrapping-pkgsrc"></a>3.2. Bootstrapping pkgsrc</h2></div></div></div>
|
||
<p>pkgsrc can be bootstrapped for use in two different modes:
|
||
privileged and unprivileged one. In unprivileged mode in contrast
|
||
to privileged one all programs are installed under one particular user
|
||
and cannot utilise privileged operations (packages don't create
|
||
special users and all special file permissions like setuid are ignored).
|
||
</p>
|
||
<p>Installing the bootstrap kit from source should be as simple as:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -P pkgsrc</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>cd pkgsrc/bootstrap</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>./bootstrap</code></strong>
|
||
</pre>
|
||
<p>To bootstrap in unprivileged mode pass <span class="quote">“<span class="quote">--unprivileged</span>”</span> flag to <span class="command"><strong>bootstrap</strong></span></p>
|
||
<p>By default, in privileged mode pkgsrc uses
|
||
<code class="filename">/usr/pkg</code> for <span class="emphasis"><em>prefix</em></span>
|
||
where programs will be installed in,
|
||
and <code class="filename">/var/db/pkg</code> for the package database
|
||
directory where pkgsrc will do its internal bookkeeping,
|
||
<code class="filename">/var</code> is used as <span class="emphasis"><em>varbase</em></span>,
|
||
where packages install their persistent data.
|
||
In unprivileged mode pkgsrc uses
|
||
<code class="filename">~/pkg</code> for <span class="emphasis"><em>prefix</em></span>,
|
||
<code class="filename">~/pkg/var/db/pkg</code> for the package database,
|
||
and <code class="filename">~/pkg/var</code> for <span class="emphasis"><em>varbase</em></span>.
|
||
</p>
|
||
<p>You can change default layout using command-line arguments.
|
||
Run <span class="quote">“<span class="quote">./bootstrap --help</span>”</span> to get details.
|
||
</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>The bootstrap installs a <span class="command"><strong>bmake</strong></span> tool.
|
||
Use this <span class="command"><strong>bmake</strong></span> when building via pkgsrc.
|
||
For examples in this guide, use <span class="command"><strong>bmake</strong></span>
|
||
instead of <span class="quote">“<span class="quote">make</span>”</span>.</p>
|
||
</div>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>It is possible to bootstrap multiple instances of pkgsrc
|
||
using non-intersecting directories. Use <span class="command"><strong>bmake</strong></span>
|
||
corresponding to the installation you're working with to build
|
||
and install packages.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="platform-specific-notes"></a>3.3. Platform-specific notes</h2></div></div></div>
|
||
<p>Here are some platform-specific notes you should be aware of.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="cygwin"></a>3.3.1. Cygwin</h3></div></div></div>
|
||
<p>Cygwin 1.7.x and later are supported.</p>
|
||
<p>You need to install minimal base packages in `Base' category
|
||
plus any of compiler, gcc, gcc4, and/or clang.
|
||
For gcc and gcc4, C and C++ compiler will be installed by default,
|
||
but you can install Fortran compiler additionally
|
||
because it will be required to use libtool.
|
||
If it is not installed (or too old), Fortran compiler will be
|
||
installed with pkgsrc automatically.</p>
|
||
<p>As noted in
|
||
<a class="ulink" href="http://cygwin.com/faq-nochunks.html#faq.using.su" target="_top">Cygwin FAQ: `Why doesn't su work?'</a>,
|
||
su(1) command has been in Cygwin distribution, but it has never worked.
|
||
Unless you bootstrap pkgsrc with the --unprivileged option, workaround is:
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>Right click "Cygwin Terminal" in your Start Menu,
|
||
then pick "Run as administrator".</p></li></ul></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="darwin"></a>3.3.2. Darwin (Mac OS X)</h3></div></div></div>
|
||
<p>Darwin 8.x and up are supported.</p>
|
||
<p>Before you start, you need to download and install
|
||
the Mac OS X Developer Tools from Apple's Developer Connection.
|
||
This requires (free) membership. See
|
||
<a class="ulink" href="http://developer.apple.com/macosx/" target="_top">http://developer.apple.com/macosx/</a>
|
||
for details. Also, make sure you install X11 (an optional
|
||
package included with the Developer Tools) if you intend
|
||
to build packages that use the X11 Window System.
|
||
(If you don't want or need the full Xcode GUI,
|
||
download and install Command Line Tools for Xcode.)</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="freebsd"></a>3.3.3. FreeBSD</h3></div></div></div>
|
||
<p>FreeBSD 8.3 and 9.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 class="orderedlist" type="1">
|
||
<li class="listitem"><p>FreeBSD stores its ports pkg database in
|
||
<code class="filename">/var/db/pkg</code>. It is therefore
|
||
recommended that you choose a different location (e.g.
|
||
<code class="filename">/usr/pkgdb</code>) by
|
||
using the --pkgdbdir option to the bootstrap script.</p></li>
|
||
<li class="listitem">
|
||
<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">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>cd /usr/sbin</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mv pkg_add pkg_add.orig</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mv pkg_create pkg_create.orig</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mv pkg_delete pkg_delete.orig</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mv pkg_info pkg_info.orig</code></strong>
|
||
</pre>
|
||
</li>
|
||
<li class="listitem"><p>An example <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> file will be placed in
|
||
<code class="filename">/etc/mk.conf.example</code> file
|
||
when you use the bootstrap script.</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="gnukfreebsd"></a>3.3.4. GNU/kFreeBSD</h3></div></div></div>
|
||
<p>Debian GNU/kFreeBSD is the only GNU/kFreeBSD distribution now.
|
||
Debian GNU/kFreeBSD 7.0 or later is tested and supported.</p>
|
||
<p> You should install ncurses (libncurses and libncurses-dev)
|
||
packages.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="interix"></a>3.3.5. 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
|
||
(not including XP Home), or 2003. SFU can be downloaded from <a class="ulink" href="http://www.microsoft.com/windows/sfu/" target="_top">http://www.microsoft.com/windows/sfu/</a>.</p>
|
||
<p>Services for Unix 3.5 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, but other parts of libc may also be lacking.)</p>
|
||
<p>Services for Unix Applications (aka SUA) is an integrated
|
||
component of Windows Server 2003 R2 (5.2), Windows Vista and
|
||
Windows Server 2008 (6.0), Windows 7 and Windows Server 2008 R2
|
||
(6.1). As of this writing, the SUA's Interix 6.0 (32bit) and
|
||
6.1 (64bit) subsystems have been tested. Other versions may
|
||
work as well. The Interix 5.x subsystem has not yet been tested
|
||
with pkgsrc.</p>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="platform.interix-sfu-install"></a>3.3.5.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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Utilities -> Base Utilities</p></li>
|
||
<li class="listitem"><p>Interix GNU Components -> (all)</p></li>
|
||
<li class="listitem"><p>Remote Connectivity</p></li>
|
||
<li class="listitem"><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>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>
|
||
<p>NOTE: Newer Windows service packs change the way binary execution
|
||
works (via the Data Execution Prevention feature). In order to use
|
||
pkgsrc and other gcc-compiled binaries reliably, a hotfix containing
|
||
POSIX.EXE, PSXDLL.DLL, PSXRUN.EXE, and PSXSS.EXE (899522 or newer)
|
||
must be installed. Hotfixes are available from Microsoft through a
|
||
support contract; however, Debian Interix Port has made most Interix
|
||
hotfixes available for personal use from <a class="ulink" href="http://www.debian-interix.net/hotfixes/" target="_top">http://www.debian-interix.net/hotfixes/</a>.</p>
|
||
<p>In addition to the hotfix noted above, it may be necessary to
|
||
disable Data Execution Prevention entirely to make Interix functional.
|
||
This may happen only with certain types of CPUs; the cause is not fully
|
||
understood at this time. If gcc or other applications still segfault
|
||
repeatedly after installing one of the hotfixes note above, the
|
||
following option can be added to the appropriate "boot.ini" line on the
|
||
Windows boot drive: /NoExecute=AlwaysOff
|
||
(WARNING, this will disable DEP completely, which may be a security
|
||
risk if applications are often run as a user in the Administrators
|
||
group!)</p>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="platform.interix-sfu-postinstall"></a>3.3.5.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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><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 class="listitem">
|
||
<p>To enable case-sensitivity for the file system, 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 class="listitem">
|
||
<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">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="platform.interix-notes"></a>3.3.5.3. Important notes for using pkgsrc</h4></div></div></div>
|
||
<p>The package manager (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>
|
||
<p>The TERM setting used for DOS-type console windows (including those
|
||
invoked by the csh and ksh startup shortcuts) is "interix". Most systems
|
||
don't have a termcap/terminfo entry for it, but the following .termcap
|
||
entry provides adequate emulation in most cases:</p>
|
||
<pre class="programlisting">
|
||
interix:kP=\E[S:kN=\E[T:kH=\E[U:dc@:DC@:tc=pcansi:
|
||
</pre>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="platform.interix-limits"></a>3.3.5.4. Limitations of the Interix platform</h4></div></div></div>
|
||
<p>Though Interix suffices as a familiar and flexible substitute
|
||
for a full Unix-like platform, it has some drawbacks that should
|
||
be noted for those desiring to make the most of Interix.</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem">
|
||
<p><span class="strong"><strong>X11:</strong></span></p>
|
||
<p>Interix comes with the standard set of X11R6 client libraries,
|
||
and can run X11 based applications, but it does
|
||
<span class="emphasis"><em>not</em></span> come with an X server. Some options are
|
||
<a class="ulink" href="http://www.starnet.com/products/xwin32/" target="_top">StarNet X-Win32</a>,
|
||
<a class="ulink" href="http://connectivity.hummingbird.com/products/nc/exceed/" target="_top">Hummingbird Exceed</a>
|
||
(available in a trimmed version for Interix from Interop Systems as the
|
||
<a class="ulink" href="http://www.interopsystems.com/InteropXserver.htm" target="_top">Interop X Server</a>),
|
||
and the free X11 server included with
|
||
<a class="ulink" href="http://x.cygwin.com/" target="_top">Cygwin</a>.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><span class="strong"><strong>X11 acceleration:</strong></span></p>
|
||
<p>Because Interix runs in a completely different NT subsystem from
|
||
Win32 applications, it does not currently support various X11
|
||
protocol extensions for acceleration (such as MIT-SHM or DGA).
|
||
Most interactive applications to a local X server will run
|
||
reasonably fast, but full motion video and other graphics
|
||
intensive applications may require a faster-than-expected CPU.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><span class="strong"><strong>Audio:</strong></span></p>
|
||
<p>Interix has no native support for audio output. For audio
|
||
support, pkgsrc uses the <span class="command"><strong>esound</strong></span> client/server
|
||
audio system on Interix. Unlike on most platforms, the
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/audio/esound/README.html" target="_top"><code class="filename">audio/esound</code></a> package does
|
||
<span class="emphasis"><em>not</em></span> contain the <span class="command"><strong>esd</strong></span>
|
||
server component. To output audio via an Interix host, the
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/emulators/cygwin_esound/README.html" target="_top"><code class="filename">emulators/cygwin_esound</code></a> package
|
||
must also be installed.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><span class="strong"><strong>CD/DVDs, USB, and SCSI:</strong></span></p>
|
||
<p>Direct device access is not currently supported in Interix, so it
|
||
is not currently possible to access CD/DVD drives, USB devices,
|
||
or SCSI devices through non-filesystem means. Among other things,
|
||
this makes it impossible to use Interix directly for CD/DVD
|
||
burning.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><span class="strong"><strong>Tape drives:</strong></span></p>
|
||
<p>Due to the same limitations as for CD-ROMs and SCSI devices, tape
|
||
drives are also not directly accessible in Interix. However,
|
||
support is in work to make tape drive access possible by using
|
||
Cygwin as a bridge (similarly to audio bridged via Cygwin's
|
||
esound server).</p>
|
||
</li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="platform.interix-knownissues"></a>3.3.5.5. Known issues for pkgsrc on Interix</h4></div></div></div>
|
||
<p>It is not necessary, in general, to have a "root" user on the
|
||
Windows system; any member of the local Administrators group will
|
||
suffice. However, some packages currently assume that the user
|
||
named "root" is the privileged user. To accommodate these, you
|
||
may create such a user; make sure it is in the local group
|
||
Administrators (or your language equivalent).</p>
|
||
<p><span class="command"><strong>pkg_add</strong></span> creates directories of mode
|
||
0755, not 0775, in <code class="filename">$PKG_DBDIR</code>. For the
|
||
time being, install packages as the local Administrator (or
|
||
your language equivalent), or run the following command after
|
||
installing a package to work around the issue:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>chmod -R g+w $PKG_DBDIR</code></strong>
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="irix"></a>3.3.6. 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 <code class="varname">CC</code> 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 class="ulink" 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 <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?if_indextoname+3+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">if_indextoname</span>(3)</span></a>, <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?if_nametoindex+3+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">if_nametoindex</span>(3)</span></a>,
|
||
etc.</p>
|
||
<p>At this point in time, pkgsrc only supports one ABI at a time. That is, you cannot
|
||
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
|
||
<code class="varname">CFLAGS</code> in your environment or the
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>. Particularly, make sure that you do not
|
||
try to link n32 object files with lib64 or vice versa. Check your
|
||
<code class="filename">/etc/compiler.defaults</code>!</p>
|
||
<p>If you have the actual pkgsrc tree mounted via NFS from a different host,
|
||
please make sure to set <code class="varname">WRKOBJDIR</code> to a local directory,
|
||
as it appears that IRIX linker occasionally runs into issues when trying to
|
||
link over a network-mounted file system.</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 <code class="filename">pkgsrc/mk/defaults/mk.conf</code> and, of
|
||
course, your compiler's man pages for details.</p>
|
||
<p>If you are using SGI's MIPSPro compiler, please set
|
||
|
||
</p>
|
||
<pre class="programlisting">
|
||
PKGSRC_COMPILER= mipspro
|
||
</pre>
|
||
<p>
|
||
|
||
in <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>. Otherwise, pkgsrc will assume you
|
||
are using gcc and may end up passing invalid flags to the compiler. Note that
|
||
bootstrap should create an appropriate <code class="filename">mk.conf.example</code> by
|
||
default.</p>
|
||
<p>If you have both the MIPSPro compiler chain installed as well as gcc,
|
||
but want to make sure that MIPSPro is used, please set your <code class="varname">PATH</code>
|
||
to <span class="emphasis"><em>not</em></span> include the location of gcc (often
|
||
<code class="filename">/usr/freeware/bin</code>), and (important) pass the
|
||
'--preserve-path' flag.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="linux"></a>3.3.7. Linux</h3></div></div></div>
|
||
<p>Some versions of Linux (for example Debian GNU/Linux) need
|
||
either libtermcap or libcurses (libncurses). Installing the
|
||
distributions libncurses-dev package (or equivalent) should fix
|
||
the problem.</p>
|
||
<p>pkgsrc supports both gcc (GNU Compiler Collection) and icc
|
||
(Intel C++ Compiler). gcc is the default. icc 8.0 and 8.1 on
|
||
i386 have been tested.</p>
|
||
<p>To bootstrap using icc, assuming the default icc installation
|
||
directory:</p>
|
||
<pre class="programlisting">
|
||
env ICCBASE=/opt/intel/cc/10.1.008 ./bootstrap --compiler=icc
|
||
</pre>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>For icc 8.0 you must add `LDFLAGS=-static-libcxa' to this.</p>
|
||
<p>For icc 8.1 you must add `LDFLAGS=-i-static' instead.</p>
|
||
<p>For icc 10.1 neither of these appears to be necessary.</p>
|
||
</div>
|
||
<p>Use a value for ICCBASE that corresponds to the directory
|
||
where icc is installed. After bootstrapping, set
|
||
<code class="varname">ICCBASE</code> in <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>:</p>
|
||
<pre class="programlisting">
|
||
ICCBASE= /opt/intel/cc/10.1.008
|
||
</pre>
|
||
<p>The pkgsrc default for <code class="varname">ICCBASE</code> is
|
||
<code class="filename">/opt/intel_cc_80</code>. This is the default
|
||
install directory for icc 8.0. If you are using a more recent
|
||
version, be sure to set the correct path explicitly.
|
||
</p>
|
||
<p>pkgsrc uses the static linking method of the runtime libraries
|
||
provided by icc, so binaries can be run on other systems which do not
|
||
have the shared libraries installed.</p>
|
||
<p>Libtool, however, extracts a list of libraries from the
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?ld+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">ld</span>(1)</span></a> command run when linking a C++ shared library and
|
||
records it, throwing away the -Bstatic and -Bdynamic options
|
||
interspersed between the libraries. This means that
|
||
libtool-linked C++ shared libraries will have a runtime
|
||
dependency on the icc libraries until this is fixed in
|
||
libtool.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="mirbsd"></a>3.3.8. MirBSD</h3></div></div></div>
|
||
<p>pkgsrc has been tested on MirBSD #10-current (2011 and newer).
|
||
Older versions might also work. Releases before #10 are not
|
||
supported.</p>
|
||
<p>The package tools of the (older) native ports tree,
|
||
<a class="ulink" href="//www.mirbsd.org/ports.htm" target="_top">MirPorts</a>,
|
||
have the same names as the ones used by pkgsrc. Care should be taken
|
||
that the right tools are used. When installing packages from source,
|
||
use the <code class="filename">bmake</code> command for pkgsrc and
|
||
<code class="filename">mmake</code> for MirPorts.</p>
|
||
<p>pkgsrc and MirPorts use the same location for the package
|
||
database, <code class="filename">/var/db/pkg</code>. It is strongly recommended
|
||
to use <code class="filename">/usr/pkg/db</code> instead, so that the pkgsrc
|
||
tree is self-contained. This is also the default setting used in the
|
||
binary package builds.</p>
|
||
<p>Binary packages for MirBSD/i386 can be found on the pkgsrc ftp
|
||
server. The bootstrap kit there already contains the
|
||
<span class="command"><strong>pkgin</strong></span> package manager. See the
|
||
<a class="ulink" href="https://www.mirbsd.org/pkgsrc.htm" target="_top">pkgsrc on MirOS</a>
|
||
page for more details.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="openbsd"></a>3.3.9. OpenBSD</h3></div></div></div>
|
||
<p>OpenBSD 5.1 has been tested and supported,
|
||
other versions may work.</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 class="orderedlist" type="1">
|
||
<li class="listitem"><p>OpenBSD stores its ports pkg database in
|
||
<code class="filename">/var/db/pkg</code>. It is therefore
|
||
recommended that you choose a different location (e.g.
|
||
<code class="filename">/usr/pkgdb</code>) by
|
||
using the --pkgdbdir option to the bootstrap script.</p></li>
|
||
<li class="listitem">
|
||
<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">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>cd /usr/sbin</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mv pkg_add pkg_add.orig</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mv pkg_create pkg_create.orig</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mv pkg_delete pkg_delete.orig</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mv pkg_info pkg_info.orig</code></strong>
|
||
</pre>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>An example <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> file will be placed in
|
||
<code class="filename">/etc/mk.conf.example</code> file
|
||
when you use the bootstrap script. OpenBSD's make program uses
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>
|
||
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 defaults/mk.conf or similar here
|
||
.else
|
||
# OpenBSD stuff
|
||
.endif
|
||
</pre>
|
||
</li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="solaris"></a>3.3.10. Solaris</h3></div></div></div>
|
||
<p>Solaris 2.6 through 10 are supported on both x86 and sparc.
|
||
You will need a working C compiler. Both gcc 4.5.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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>SUNWsprot</p></li>
|
||
<li class="listitem"><p>SUNWarc</p></li>
|
||
<li class="listitem"><p>SUNWbtool</p></li>
|
||
<li class="listitem"><p>SUNWtoo</p></li>
|
||
<li class="listitem"><p>SUNWlibm</p></li>
|
||
</ul></div>
|
||
<p>Please note that the use of GNU binutils on Solaris is
|
||
<span class="emphasis"><em>not</em></span> supported, as of June 2006.</p>
|
||
<p>Whichever compiler you use, please ensure the compiler tools and
|
||
your $prefix are in your <code class="varname">PATH</code>. This includes
|
||
<code class="filename">/usr/ccs/{bin,lib}</code>
|
||
and e.g. <code class="filename">/usr/pkg/{bin,sbin}</code>.</p>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="solaris-gcc-note"></a>3.3.10.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 href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/lang/gcc46/README.html" target="_top"><code class="filename">lang/gcc46</code></a> or install a binary gcc
|
||
package, then remove gcc used during bootstrapping.</p>
|
||
<p>Binary packages of gcc can be found through <a class="ulink" href="http://www.sunfreeware.com/" target="_top">http://www.sunfreeware.com/</a>.</p>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="solaris-sun-workshop-note"></a>3.3.10.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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>SPROcc
|
||
- Sun WorkShop Compiler C 5.0</p></li>
|
||
<li class="listitem"><p>SPROcpl
|
||
- Sun WorkShop Compiler C++ 5.0</p></li>
|
||
<li class="listitem"><p>SPROild
|
||
- Sun WorkShop Incremental Linker</p></li>
|
||
<li class="listitem"><p>SPROlang
|
||
- Sun WorkShop Compilers common components</p></li>
|
||
</ul></div>
|
||
<p>You should set the following variables in your
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> file:</p>
|
||
<pre class="programlisting">
|
||
CC= cc
|
||
CXX= CC
|
||
CPP= cc -E
|
||
CXXCPP= CC -E
|
||
</pre>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>The <code class="varname">CPP</code> setting might break some
|
||
packages that use the C preprocessor for processing things other
|
||
than C source code.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="solaris-sunpro-64"></a>3.3.10.3. Building 64-bit binaries with SunPro</h4></div></div></div>
|
||
<p>To build 64-bit packages, you just need to have the
|
||
following lines in your <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> file:</p>
|
||
<pre class="programlisting">
|
||
PKGSRC_COMPILER= sunpro
|
||
ABI= 64
|
||
</pre>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>This setting has been tested for the SPARC
|
||
architecture. Intel and AMD machines need some more
|
||
work.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="plat.sunos.problems"></a>3.3.10.4. Common problems</h4></div></div></div>
|
||
<p>Sometimes, when using <span class="command"><strong>libtool</strong></span>,
|
||
<code class="filename">/bin/ksh</code> crashes with a segmentation fault.
|
||
The workaround is to use another shell for the configure
|
||
scripts, for example by installing <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/shells/bash/README.html" target="_top"><code class="filename">shells/bash</code></a> and adding the following lines
|
||
to your <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>:</p>
|
||
<pre class="programlisting">
|
||
CONFIG_SHELL= ${LOCALBASE}/bin/bash
|
||
WRAPPER_SHELL= ${LOCALBASE}/bin/bash
|
||
</pre>
|
||
<p>Then, rebuild the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/libtool-base/README.html" target="_top"><code class="filename">devel/libtool-base</code></a> package.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="using"></a>Chapter 4. Using pkgsrc</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#using-pkg">4.1. Using binary packages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#finding-binary-packages">4.1.1. Finding binary packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#installing-binary-packages">4.1.2. Installing binary packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_delete">4.1.3. Deinstalling packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_info">4.1.4. Getting information about installed packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#vulnerabilities">4.1.5. Checking for security vulnerabilities in installed packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#pkg_versions">4.1.6. Finding if newer versions of your installed packages are in pkgsrc</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using.pkg_admin">4.1.7. Other administrative functions</a></span></dt>
|
||
<dt><span class="sect2"><a href="#a-word-of-warning">4.1.8. A word of warning</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#building-packages-from-source">4.2. Building packages from source</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#requirements">4.2.1. Requirements</a></span></dt>
|
||
<dt><span class="sect2"><a href="#fetching-distfiles">4.2.2. Fetching distfiles</a></span></dt>
|
||
<dt><span class="sect2"><a href="#how-to-build-and-install">4.2.3. How to build and install</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
<p>Basically, there are two ways of using pkgsrc. The first
|
||
is to only install the package tools and to use binary packages
|
||
that someone else has prepared. This is the <span class="quote">“<span class="quote">pkg</span>”</span>
|
||
in pkgsrc. The second way is to install the <span class="quote">“<span class="quote">src</span>”</span>
|
||
of pkgsrc, too. Then you are able to build your own packages,
|
||
and you can still use binary packages from someone else.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="using-pkg"></a>4.1. Using binary packages</h2></div></div></div>
|
||
<p>On the <a class="ulink" href="ftp://ftp.NetBSD.org/" target="_top">ftp.NetBSD.org</a>
|
||
server and its mirrors, there are collections of binary packages,
|
||
ready to be installed. These binary packages have been built using the
|
||
default settings for the directories, that is:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="filename">/usr/pkg</code> for <code class="varname">LOCALBASE</code>, where most of the files are installed,</p></li>
|
||
<li class="listitem"><p><code class="filename">/usr/pkg/etc</code> for configuration files,</p></li>
|
||
<li class="listitem"><p><code class="filename">/var</code> for <code class="varname">VARBASE</code>, where those files are installed that may change after installation.</p></li>
|
||
</ul></div>
|
||
<p>If you cannot use these directories for whatever reasons (maybe
|
||
because you're not root), you cannot use these binary packages, but
|
||
have to build the packages yourself, which is explained in <a class="xref" href="#bootstrapping-pkgsrc" title="3.2. Bootstrapping pkgsrc">Section 3.2, “Bootstrapping pkgsrc”</a>.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="finding-binary-packages"></a>4.1.1. Finding binary packages</h3></div></div></div>
|
||
<p>To install binary packages, you first need to know from where
|
||
to get them. The first place where you should look is on the main
|
||
pkgsrc FTP server in the directory <a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/" target="_top"><code class="filename">/pub/pkgsrc/packages</code></a>.</p>
|
||
<p>This directory contains binary packages for multiple
|
||
platforms. First, select your operating system. (Ignore the
|
||
directories with version numbers attached to it, they just exist for
|
||
legacy reasons.) Then, select your hardware architecture, and in the
|
||
third step, the OS version and the <span class="quote">“<span class="quote">version</span>”</span> of pkgsrc.</p>
|
||
<p>In this directory, you often find a file called
|
||
<code class="filename">bootstrap.tar.gz</code> which contains the package
|
||
management tools. If the file is missing, it is likely that your
|
||
operating system already provides those tools. Download the file and
|
||
extract it in the <code class="filename">/</code> directory. It will create
|
||
the directories <code class="filename">/usr/pkg</code> (containing the tools
|
||
for managing binary packages) and <code class="filename">/var/db/pkg</code>
|
||
(the database of installed packages).</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="installing-binary-packages"></a>4.1.2. Installing binary packages</h3></div></div></div>
|
||
<p>In the directory from the last section, there is a
|
||
subdirectory called <code class="filename">All/</code>, which contains all the
|
||
binary packages that are available for the platform, excluding those
|
||
that may not be distributed via FTP or CDROM (depending on which
|
||
medium you are using).</p>
|
||
<p>To install packages directly from an FTP or HTTP server, run
|
||
the following commands in a Bourne-compatible shell (be sure to
|
||
<span class="command"><strong>su</strong></span> to root first):</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>PATH="/usr/pkg/sbin:$PATH"</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>PKG_PATH="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/<em class="replaceable"><code>OPSYS</code></em>/<em class="replaceable"><code>ARCH</code></em>/<em class="replaceable"><code>VERSIONS</code></em>/All/"</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>export PATH PKG_PATH</code></strong>
|
||
</pre>
|
||
<p>Instead of URLs, you can also use local paths, for example if
|
||
you are installing from a set of CDROMs, DVDs or an NFS-mounted
|
||
repository. If you want to install packages from multiple sources,
|
||
you can separate them by a semicolon in
|
||
<code class="varname">PKG_PATH</code>.</p>
|
||
<p>After these preparations, installing a package is very
|
||
easy:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>pkg_add openoffice2</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>pkg_add kde-3.5.7</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>pkg_add ap2-php5-*</code></strong>
|
||
</pre>
|
||
<p>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>Adding packages might install vulnerable packages.
|
||
Thus you should run <span class="command"><strong>pkg_admin audit</strong></span>
|
||
regularly, especially after installing new packages, and verify
|
||
that the vulnerabilities are acceptable for your configuration.</p>
|
||
<p>After you've installed packages, be sure to have
|
||
<code class="filename">/usr/pkg/bin</code> and <code class="filename">/usr/pkg/sbin</code> in your
|
||
<code class="varname">PATH</code> so you can actually start the just
|
||
installed program.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="using.pkg_delete"></a>4.1.3. Deinstalling packages</h3></div></div></div>
|
||
<p>To deinstall a package, it does not matter whether it was
|
||
installed from source code or from a binary package. The
|
||
<span class="command"><strong>pkg_delete</strong></span> command does not know it anyway.
|
||
To delete a package, you can just run <span class="command"><strong>pkg_delete
|
||
<em class="replaceable"><code>package-name</code></em></strong></span>. The package
|
||
name can be given with or without version number. Wildcards can
|
||
also be used to deinstall a set of packages, for example
|
||
<code class="literal">*emacs*</code>. Be sure to include them in quotes,
|
||
so that the shell does not expand them before
|
||
<code class="literal">pkg_delete</code> sees them.</p>
|
||
<p>The <code class="option">-r</code> option is very powerful: it
|
||
removes all the packages that require the package in question
|
||
and then removes the package itself. For example:
|
||
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>pkg_delete -r jpeg</code></strong>
|
||
</pre>
|
||
<p>
|
||
|
||
will remove jpeg and all the packages that used it; this allows
|
||
upgrading the jpeg package.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="using.pkg_info"></a>4.1.4. Getting information about installed packages</h3></div></div></div>
|
||
<p>The <span class="command"><strong>pkg_info</strong></span> shows information about
|
||
installed packages or binary package files.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="vulnerabilities"></a>4.1.5. Checking for security vulnerabilities in installed packages</h3></div></div></div>
|
||
<p>
|
||
The NetBSD Security-Officer and Packages Groups maintain a list of
|
||
known security vulnerabilities to packages which are (or have been)
|
||
included in pkgsrc. The list is available from the NetBSD
|
||
FTP site at <a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/vulnerabilities" target="_top">ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/vulnerabilities</a>.
|
||
</p>
|
||
<p>
|
||
Through <span class="command"><strong>pkg_admin fetch-pkg-vulnerabilities</strong></span>,
|
||
this list can be downloaded
|
||
automatically, and a security audit of all packages installed on a system
|
||
can take place.
|
||
</p>
|
||
<p>
|
||
There are two components to auditing. The first
|
||
step, <span class="command"><strong>pkg_admin fetch-pkg-vulnerabilities</strong></span>,
|
||
is for downloading
|
||
the list of vulnerabilities from the NetBSD FTP site. The second
|
||
step, <span class="command"><strong>pkg_admin audit</strong></span>, checks to see if any of your
|
||
installed packages are vulnerable. If a package is vulnerable, you
|
||
will see output similar to the following:
|
||
</p>
|
||
<pre class="screen">Package samba-2.0.9 has a local-root-shell vulnerability, see
|
||
http://www.samba.org/samba/whatsnew/macroexploit.html</pre>
|
||
<p>
|
||
You may wish to have the
|
||
<a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/vulnerabilities" target="_top">vulnerabilities</a>
|
||
file downloaded daily so that
|
||
it remains current. This may be done by adding an appropriate entry
|
||
to the root users <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?crontab+5+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">crontab</span>(5)</span></a> entry. For example the entry
|
||
</p>
|
||
<pre class="screen">
|
||
# download vulnerabilities file
|
||
0 3 * * * /usr/sbin/pkg_admin fetch-pkg-vulnerabilities >/dev/null 2>&1
|
||
</pre>
|
||
<p>
|
||
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
|
||
line to <code class="filename">/etc/security.local</code>:
|
||
</p>
|
||
<pre class="screen">
|
||
/usr/sbin/pkg_admin audit
|
||
</pre>
|
||
<p>
|
||
</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="pkg_versions"></a>4.1.6. Finding if newer versions of your installed packages are in pkgsrc</h3></div></div></div>
|
||
<p>
|
||
Install <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/lintpkgsrc/README.html" target="_top"><code class="filename">pkgtools/lintpkgsrc</code></a> and run
|
||
<span class="command"><strong>lintpkgsrc</strong></span> with the <span class="quote">“<span class="quote">-i</span>”</span>
|
||
argument to check if your packages are up-to-date, e.g.
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="prompt">%</code> <strong class="userinput"><code>lintpkgsrc -i</code></strong>
|
||
...
|
||
Version mismatch: 'tcsh' 6.09.00 vs 6.10.00
|
||
</pre>
|
||
<p>You can then use <span class="command"><strong>make update</strong></span> to update the
|
||
package on your system and rebuild any dependencies.
|
||
</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="using.pkg_admin"></a>4.1.7. Other administrative functions</h3></div></div></div>
|
||
<p>The <span class="command"><strong>pkg_admin</strong></span> executes various
|
||
administrative functions on the package system.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="a-word-of-warning"></a>4.1.8. A word of warning</h3></div></div></div>
|
||
<p>Please pay very careful attention to the warnings
|
||
expressed in the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-5.0.1+i386"><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>
|
||
<p>The same warning of course applies to every package you
|
||
install from source when you haven't completely read and
|
||
understood the source code of the package, the compiler that
|
||
is used to build the package and all the other tools that are
|
||
involved.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="building-packages-from-source"></a>4.2. Building packages from source</h2></div></div></div>
|
||
<p>After obtaining pkgsrc, the <code class="filename">pkgsrc</code>
|
||
directory now contains a set of packages, organized into
|
||
categories. You can browse the online index of packages, or run
|
||
<span class="command"><strong>make readme</strong></span> from the <code class="filename">pkgsrc</code>
|
||
directory to build local <code class="filename">README.html</code> files for
|
||
all packages, viewable with any web browser such as <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/www/lynx/README.html" target="_top"><code class="filename">www/lynx</code></a> or <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/www/firefox/README.html" target="_top"><code class="filename">www/firefox</code></a>.</p>
|
||
<p>The default <span class="emphasis"><em>prefix</em></span> for installed packages
|
||
is <code class="filename">/usr/pkg</code>. If you wish to change this, you
|
||
should do so by setting <code class="varname">LOCALBASE</code> in
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>. You should not try to use multiple
|
||
different <code class="varname">LOCALBASE</code> definitions on the same
|
||
system (inside a chroot is an exception). </p>
|
||
<p>The rest of this chapter assumes that the package is already
|
||
in pkgsrc. If it is not, see <a class="xref" href="#developers-guide" title="Part II. The pkgsrc developer's guide">Part II, “The pkgsrc developer's guide”</a> for
|
||
instructions how to create your own packages.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="requirements"></a>4.2.1. Requirements</h3></div></div></div>
|
||
<p>To build packages from source, you need a working C
|
||
compiler. On NetBSD, you need to install the
|
||
<span class="quote">“<span class="quote">comp</span>”</span> and the <span class="quote">“<span class="quote">text</span>”</span> distribution
|
||
sets. If you want to build X11-related packages, the
|
||
<span class="quote">“<span class="quote">xbase</span>”</span> and <span class="quote">“<span class="quote">xcomp</span>”</span> distribution
|
||
sets are required, too.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="fetching-distfiles"></a>4.2.2. Fetching distfiles</h3></div></div></div>
|
||
<p>The first step for building a package is downloading the
|
||
distfiles (i.e. the unmodified source). If they have not yet been
|
||
downloaded, pkgsrc will fetch them automatically.</p>
|
||
<p>If you have all files that you need in the
|
||
<code class="filename">distfiles</code> directory,
|
||
you don't need to connect. If the distfiles are on CD-ROM, you can
|
||
mount the CD-ROM on <code class="filename">/cdrom</code> and add:
|
||
</p>
|
||
<pre class="screen">DISTDIR=/cdrom/pkgsrc/distfiles</pre>
|
||
<p>
|
||
to your <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>.</p>
|
||
<p>By default a list of distribution sites will be randomly
|
||
intermixed to prevent huge load on servers which holding popular
|
||
packages (for example, SourceForge.net mirrors). Thus, every
|
||
time when you need to fetch yet another distfile all the mirrors
|
||
will be tried in new (random) order. You can turn this feature
|
||
off by setting <code class="varname">MASTER_SORT_RANDOM=NO</code> (for
|
||
<code class="varname">PKG_DEVELOPER</code>s it's already disabled).</p>
|
||
<p>You can overwrite some of the major distribution sites to
|
||
fit to sites that are close to your own. By setting one or two
|
||
variables you can modify the order in which the master sites are
|
||
accessed. <code class="varname">MASTER_SORT</code> contains a whitespace
|
||
delimited list of domain suffixes.
|
||
<code class="varname">MASTER_SORT_REGEX</code> is even more flexible, it
|
||
contains a whitespace delimited list of regular expressions. It
|
||
has higher priority than <code class="varname">MASTER_SORT</code>. Have a
|
||
look at <code class="filename">pkgsrc/mk/defaults/mk.conf</code> to find
|
||
some examples. 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
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> file,
|
||
and adding the definitions there.</p>
|
||
<p>
|
||
If a package depends on many other packages (such as
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/kde3/README.html" target="_top"><code class="filename">meta-pkgs/kde3</code></a>), the build process may
|
||
alternate between periods of
|
||
downloading source, and compiling. To ensure you have all the source
|
||
downloaded initially you can run the command:
|
||
</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>make fetch-list | sh</code></strong></pre>
|
||
<p>
|
||
which will output and run a set of shell commands to fetch the
|
||
necessary files into the <code class="filename">distfiles</code> directory. You can
|
||
also choose to download the files manually.
|
||
</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="how-to-build-and-install"></a>4.2.3. How to build and install</h3></div></div></div>
|
||
<p>
|
||
Once the software has downloaded, any patches will be applied, then it
|
||
will be compiled for you. This may take some time depending on your
|
||
computer, and how many other packages the software depends on and their
|
||
compile time.
|
||
</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>If using bootstrap or pkgsrc on a non-NetBSD system,
|
||
use the pkgsrc <span class="command"><strong>bmake</strong></span> command instead of
|
||
<span class="quote">“<span class="quote">make</span>”</span> in the examples in this guide.</p>
|
||
</div>
|
||
<p>For example, type</p>
|
||
<pre class="screen">
|
||
<code class="prompt">%</code> <strong class="userinput"><code>cd misc/figlet</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make</code></strong>
|
||
</pre>
|
||
<p>at the shell prompt to build the various components of the
|
||
package.</p>
|
||
<p>The next stage is to actually install the newly compiled
|
||
program onto your system. Do this by entering:
|
||
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make install</code></strong>
|
||
</pre>
|
||
<p>
|
||
|
||
while you are still in the directory for whatever package you
|
||
are installing.</p>
|
||
<p>Installing the package on your system may require 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>That's it, the software should now be installed and setup for use.
|
||
You can now enter:
|
||
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make clean</code></strong>
|
||
</pre>
|
||
<p>
|
||
|
||
to remove the compiled files in the work directory, as you shouldn't need
|
||
them any more. If other packages were also added to your system
|
||
(dependencies) to allow your program to compile, you can tidy these up
|
||
also with the command:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make clean-depends</code></strong>
|
||
</pre>
|
||
<p>Taking the figlet utility as an example, we can install it on our
|
||
system by building as shown in <a class="xref" 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 - <code class="filename">/usr/pkg</code>. Should this not
|
||
conform to your tastes, set the <code class="varname">LOCALBASE</code>
|
||
variable in your environment, and it will use that value as the
|
||
root of your packages tree. So, to use
|
||
<code class="filename">/usr/local</code>, set
|
||
<code class="varname">LOCALBASE=/usr/local</code> in your environment.
|
||
Please note that you should use a directory which is dedicated to
|
||
packages and not shared with other programs (i.e., do not try and
|
||
use <code class="varname">LOCALBASE=/usr</code>). Also, you should not try
|
||
to add any of your own files or directories (such as
|
||
<code class="filename">src/</code>, <code class="filename">obj/</code>, or
|
||
<code class="filename">pkgsrc/</code>) below the
|
||
<code class="varname">LOCALBASE</code> 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 <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> to
|
||
alter some configuration options at build time. Have a look at
|
||
<code class="filename">pkgsrc/mk/defaults/mk.conf</code> to get an overview
|
||
of what will be set there by default. Environment variables such
|
||
as <code class="varname">LOCALBASE</code> can be set in
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> to save having to remember to
|
||
set them each time you want to use pkgsrc.</p>
|
||
<p>Occasionally, people want to <span class="quote">“<span class="quote">look under the
|
||
covers</span>”</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 class="orderedlist" type="1">
|
||
<li class="listitem">
|
||
<p>If you invoke the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> command with
|
||
<code class="varname">PKG_DEBUG_LEVEL=2</code>, then a huge amount of
|
||
information will be displayed. For example,</p>
|
||
<pre class="screen"><strong class="userinput"><code>make patch PKG_DEBUG_LEVEL=2</code></strong></pre>
|
||
<p>will show all the commands that are invoked, up to and
|
||
including the <span class="quote">“<span class="quote">patch</span>”</span> stage.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>If you want to know the value of a certain <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a>
|
||
definition, then the <code class="varname">VARNAME</code> definition
|
||
should be used, in conjunction with the show-var
|
||
target. e.g. to show the expansion of the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a>
|
||
variable <code class="varname">LOCALBASE</code>:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make show-var VARNAME=LOCALBASE</code></strong>
|
||
/usr/pkg
|
||
<code class="prompt">%</code>
|
||
</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 "bin-install" target. This target will
|
||
install a binary package - if available - via <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_add</span>(1)</span></a>,
|
||
else do a <span class="command"><strong>make package</strong></span>. The list of remote FTP
|
||
sites searched is kept in the variable
|
||
<code class="varname">BINPKG_SITES</code>, which defaults to
|
||
ftp.NetBSD.org. Any flags that should be added to <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_add</span>(1)</span></a>
|
||
can be put into <code class="varname">BIN_INSTALL_FLAGS</code>. See
|
||
<code class="filename">pkgsrc/mk/defaults/mk.conf</code> for more
|
||
details.</p>
|
||
<p>A final word of warning: If you set up a system that has a
|
||
non-standard setting for <code class="varname">LOCALBASE</code>, be sure to
|
||
set that before any packages are installed, as you cannot 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 <code class="varname">LOCALBASE</code> of
|
||
<code class="filename">/usr/pkg</code>, and that you should
|
||
<span class="emphasis"><em>not</em></span> install any if you use a non-standard
|
||
<code class="varname">LOCALBASE</code>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="configuring"></a>Chapter 5. Configuring pkgsrc</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#general-configuration">5.1. General configuration</a></span></dt>
|
||
<dt><span class="sect1"><a href="#variables-affecting-build">5.2. Variables affecting the build process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#variables-affecting-installation">5.3. Variables affecting the installation process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#conf.compiler">5.4. Selecting and configuring the compiler</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#selecting-the-compiler">5.4.1. Selecting the compiler</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf.cflags">5.4.2. Additional flags to the compiler (<code class="varname">CFLAGS</code>)</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf.ldflags">5.4.3. Additional flags to the linker (<code class="varname">LDFLAGS</code>)</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#developer-advanced-settings">5.5. Developer/advanced settings</a></span></dt>
|
||
<dt><span class="sect1"><a href="#selecting-build-options">5.6. Selecting Build Options</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<a name="mk.conf"></a><p>The whole pkgsrc system is configured in a single file, usually
|
||
called <code class="filename">mk.conf</code>. In which directory pkgsrc looks for
|
||
that file depends on the installation. On NetBSD, when you use
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> from the base system, it is in the directory
|
||
<code class="filename">/etc/</code>. In all other cases the default location is
|
||
<code class="literal">${PREFIX}/etc/</code>, depending on where you told the
|
||
bootstrap program to install the binary packages.</p>
|
||
<p>During the bootstrap, an example configuration file is created. To
|
||
use that, you have to create the directory
|
||
<code class="filename">${PREFIX}/etc</code> and copy the example file
|
||
there.</p>
|
||
<p>The format of the configuration file is that of the usual
|
||
BSD-style <code class="filename">Makefile</code>s. The whole pkgsrc configuration
|
||
is done by setting variables in this file. Note that you can define all
|
||
kinds of variables, and no special error checking (for example for
|
||
spelling mistakes) takes place, so you have to try it out to see if it
|
||
works.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="general-configuration"></a>5.1. General configuration</h2></div></div></div>
|
||
<p>In this section, you can find some variables that apply to all
|
||
pkgsrc packages. A complete list of the variables that can be
|
||
configured by the user is available in
|
||
<code class="filename">mk/defaults/mk.conf</code>, together with some
|
||
comments that describe each variable's intent.</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">LOCALBASE</code>: Where
|
||
packages will be installed. The default is
|
||
<code class="filename">/usr/pkg</code>. Do not mix binary packages
|
||
with different <code class="varname">LOCALBASE</code>s!</p></li>
|
||
<li class="listitem"><p><code class="varname">CROSSBASE</code>: Where
|
||
<span class="quote">“<span class="quote">cross</span>”</span> category packages will be
|
||
installed. The default is
|
||
<code class="filename">${LOCALBASE}/cross</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">X11BASE</code>: Where
|
||
X11 is installed on the system. The default is
|
||
<code class="filename">/usr/X11R7</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">DISTDIR</code>: Where to store the
|
||
downloaded copies of the original source distributions used
|
||
for building pkgsrc packages. The default is
|
||
<code class="filename">${PKGSRCDIR}/distfiles</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_DBDIR</code>: Where the
|
||
database about installed packages is stored. The default is
|
||
<code class="filename">/var/db/pkg</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">MASTER_SITE_OVERRIDE</code>:
|
||
If set, override the packages'
|
||
<code class="varname">MASTER_SITES</code> with this value.</p></li>
|
||
<li class="listitem"><p><code class="varname">MASTER_SITE_BACKUP</code>:
|
||
Backup location(s) for distribution files and patch files
|
||
if not found locally or in
|
||
<code class="filename">${MASTER_SITES}</code> or
|
||
<code class="filename">${PATCH_SITES}</code> respectively.
|
||
The defaults are
|
||
<code class="filename">ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/${DIST_SUBDIR}/</code>
|
||
and
|
||
<code class="filename">ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">BINPKG_SITES</code>:
|
||
List of sites carrying binary pkgs. <em class="replaceable"><code>rel</code></em> and
|
||
<em class="replaceable"><code>arch</code></em> are replaced with OS
|
||
release (<span class="quote">“<span class="quote">2.0</span>”</span>, etc.) and architecture
|
||
(<span class="quote">“<span class="quote">mipsel</span>”</span>, etc.).</p></li>
|
||
<li class="listitem"><p><code class="varname">ACCEPTABLE_LICENSES</code>:
|
||
List of acceptable licenses. License names are case-sensitive.
|
||
Whenever you try to build a package whose license is not in this
|
||
list, you will get an error message. If the license condition is
|
||
simple enough, the error message will include specific
|
||
instructions on how to change this variable.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="variables-affecting-build"></a>5.2. Variables affecting the build process</h2></div></div></div>
|
||
<p>XXX
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">PACKAGES</code>: The top level
|
||
directory for the binary packages. The default is
|
||
<code class="filename">${PKGSRCDIR}/packages</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">WRKOBJDIR</code>:
|
||
The top level directory where, if defined, the separate
|
||
working directories will get created, and symbolically
|
||
linked to from <code class="filename">${WRKDIR}</code> (see below).
|
||
This is useful for building packages on several
|
||
architectures, then <code class="filename">${PKGSRCDIR}</code>
|
||
can be NFS-mounted while <code class="filename">${WRKOBJDIR}</code>
|
||
is local to every architecture. (It should be noted that
|
||
<code class="varname">PKGSRCDIR</code> should not be set by the user
|
||
— it is an internal definition which refers to the
|
||
root of the pkgsrc tree. It is possible to have many
|
||
pkgsrc tree instances.)</p></li>
|
||
<li class="listitem"><p><code class="varname">LOCALPATCHES</code>:
|
||
Directory for local patches that aren't part of pkgsrc.
|
||
See <a class="xref" href="#components.patches" title="11.3. patches/*">Section 11.3, “patches/*”</a> for more
|
||
information.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKGMAKECONF</code>: Location of
|
||
the <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> file used by a package's
|
||
BSD-style Makefile. If this is not set,
|
||
<code class="varname">MAKECONF</code> is set to
|
||
<code class="filename">/dev/null</code> to avoid picking up
|
||
settings used by builds in <code class="filename">/usr/src</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">DEPENDS_TARGET</code>:
|
||
By default, dependencies are only installed, and no binary
|
||
package is created for them. You can set this variable to
|
||
<code class="literal">package-install</code> to automatically create binary
|
||
packages after installing dependencies. Please note that the
|
||
<code class="varname">PKGSRC_KEEP_BIN_PKGS</code> can be set to
|
||
<code class="literal">yes</code> to preserve binary packages when
|
||
using the <code class="literal">install</code> as well.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="variables-affecting-installation"></a>5.3. Variables affecting the installation process</h2></div></div></div>
|
||
<p>Packages have to support installation into a
|
||
subdirectory of <code class="varname">WRKDIR</code>. This allows a package
|
||
to be built, before the actual filesystem is touched. DESTDIR
|
||
support exists in two variations:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Basic DESTDIR support means that the package
|
||
installation and packaging is still run as root.</p></li>
|
||
<li class="listitem"><p>Full DESTDIR support can run the complete
|
||
build, installation and packaging as normal user. Root
|
||
privileges are only needed to add packages.</p></li>
|
||
</ul></div>
|
||
<p>With basic DESTDIR support, <strong class="userinput"><code>make
|
||
clean</code></strong> needs to be run as root.</p>
|
||
<p>Considering the <code class="filename">foo/bar</code> package,
|
||
DESTDIR full support can be tested using the following commands
|
||
|
||
</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> id
|
||
uid=1000(myusername) gid=100(users) groups=100(users),0(wheel)
|
||
<code class="prompt">$</code> mkdir $HOME/packages
|
||
<code class="prompt">$</code> cd $PKGSRCDIR/foo/bar
|
||
</pre>
|
||
<p>
|
||
|
||
Verify <code class="varname">DESTDIR</code> full support, no root privileges
|
||
should be needed
|
||
|
||
</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> make stage-install
|
||
</pre>
|
||
<p>
|
||
|
||
Create a package without root privileges
|
||
|
||
</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> make PACKAGES=$HOME/packages package
|
||
</pre>
|
||
<p>
|
||
|
||
For the following command, you must be able to gain root
|
||
privileges using <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?su+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">su</span>(1)</span></a>
|
||
|
||
</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> make PACKAGES=$HOME/packages install
|
||
</pre>
|
||
<p>
|
||
|
||
Then, as a simple user
|
||
|
||
</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> make clean
|
||
</pre>
|
||
<p>
|
||
|
||
</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="conf.compiler"></a>5.4. Selecting and configuring the compiler</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="selecting-the-compiler"></a>5.4.1. 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 class="variablelist">
|
||
<dt><span class="term"><code class="varname">PKGSRC_COMPILER</code>:</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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">ccc</code>:
|
||
Compaq C Compilers (Tru64)</p></li>
|
||
<li class="listitem"><p><code class="varname">ccache</code>:
|
||
compiler cache (chainable)</p></li>
|
||
<li class="listitem"><p><code class="varname">clang</code>:
|
||
Clang C and Objective-C compiler</p></li>
|
||
<li class="listitem"><p><code class="varname">distcc</code>:
|
||
distributed C/C++ (chainable)</p></li>
|
||
<li class="listitem"><p><code class="varname">f2c</code>:
|
||
Fortran 77 to C compiler (chainable)</p></li>
|
||
<li class="listitem"><p><code class="varname">icc</code>:
|
||
Intel C++ Compiler (Linux)</p></li>
|
||
<li class="listitem"><p><code class="varname">ido</code>:
|
||
SGI IRIS Development Option cc (IRIX 5)</p></li>
|
||
<li class="listitem"><p><code class="varname">gcc</code>:
|
||
GNU C/C++ Compiler</p></li>
|
||
<li class="listitem"><p><code class="varname">hp</code>:
|
||
HP-UX C/aC++ compilers</p></li>
|
||
<li class="listitem"><p><code class="varname">mipspro</code>:
|
||
Silicon Graphics, Inc. MIPSpro (n32/n64)</p></li>
|
||
<li class="listitem"><p><code class="varname">mipspro-ucode</code>:
|
||
Silicon Graphics, Inc. MIPSpro (o32)</p></li>
|
||
<li class="listitem"><p><code class="varname">sunpro</code>:
|
||
Sun Microsystems, Inc. WorkShip/Forte/Sun ONE Studio</p></li>
|
||
<li class="listitem"><p><code class="varname">xlc</code>:
|
||
IBM's XL C/C++ compiler suite (Darwin/MacOSX)</p></li>
|
||
</ul></div>
|
||
<p>The default is
|
||
<span class="quote">“<span class="quote"><code class="varname">gcc</code></span>”</span>. You can use
|
||
<code class="varname">ccache</code> and/or
|
||
<code class="varname">distcc</code> with an appropriate
|
||
<code class="varname">PKGSRC_COMPILER</code> setting,
|
||
e.g. <span class="quote">“<span class="quote"><code class="varname">ccache gcc</code></span>”</span>. This
|
||
variable should always be terminated with a value for
|
||
a real compiler. Note that only one real compiler
|
||
should be listed (e.g. <span class="quote">“<span class="quote"><code class="varname">sunpro gcc</code></span>”</span>
|
||
is not allowed).</p>
|
||
</dd>
|
||
<dt><span class="term"><code class="varname">GCC_REQD</code>:</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 class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="conf.cflags"></a>5.4.2. Additional flags to the compiler (<code class="varname">CFLAGS</code>)</h3></div></div></div>
|
||
<p>If you wish to set the <code class="varname">CFLAGS</code> variable,
|
||
please make sure to use the <code class="literal">+=</code> operator
|
||
instead of the <code class="literal">=</code> operator:</p>
|
||
<pre class="programlisting">
|
||
CFLAGS+= -your -flags
|
||
</pre>
|
||
<p>Using <code class="varname">CFLAGS=</code> (i.e. without the
|
||
<span class="quote">“<span class="quote">+</span>”</span>) may lead to problems with packages that
|
||
need to add their own flags. You may want to take a look
|
||
at the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/cpuflags/README.html" target="_top"><code class="filename">devel/cpuflags</code></a>
|
||
package if you're interested in optimization specifically
|
||
for the current CPU. </p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="conf.ldflags"></a>5.4.3. Additional flags to the linker (<code class="varname">LDFLAGS</code>)</h3></div></div></div>
|
||
<p>If you want to pass flags to the linker, both in the configure
|
||
step and the build step, you can do this in two ways. Either set
|
||
<code class="varname">LDFLAGS</code> or <code class="varname">LIBS</code>. The difference
|
||
between the two is that <code class="varname">LIBS</code> will be appended to
|
||
the command line, while <code class="varname">LDFLAGS</code> come earlier.
|
||
<code class="varname">LDFLAGS</code> is pre-loaded with rpath settings for ELF
|
||
machines depending on the setting of <code class="varname">USE_IMAKE</code> or
|
||
the inclusion of <code class="filename">mk/x11.buildlink3.mk</code>. As with
|
||
<code class="varname">CFLAGS</code>, if you do not wish to override these
|
||
settings, use the <code class="literal">+=</code> operator:</p>
|
||
<pre class="programlisting">
|
||
LDFLAGS+= -your -linkerflags
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="developer-advanced-settings"></a>5.5. Developer/advanced settings</h2></div></div></div>
|
||
<p>
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem">
|
||
<p><code class="varname">PKG_DEVELOPER</code>:
|
||
Run some sanity checks that package developers want:
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
|
||
<li class="listitem"><p>make sure patches apply with zero
|
||
fuzz</p></li>
|
||
<li class="listitem"><p>run check-shlibs to see that all
|
||
binaries will find their shared libs.</p></li>
|
||
</ul></div>
|
||
<p>
|
||
</p>
|
||
</li>
|
||
<li class="listitem"><p><code class="varname">PKG_DEBUG_LEVEL</code>: The level
|
||
of debugging output which is displayed whilst making and
|
||
installing the package. The default value for this is 0,
|
||
which will not display the commands as they are executed
|
||
(normal, default, quiet operation); the value 1 will display
|
||
all shell commands before their invocation, and the value 2
|
||
will display both the shell commands before their invocation,
|
||
and their actual execution progress with <span class="command"><strong>set
|
||
-x</strong></span> will be displayed.</p></li>
|
||
</ul></div>
|
||
<p>
|
||
</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="selecting-build-options"></a>5.6. Selecting Build Options</h2></div></div></div>
|
||
<p>Some packages have build time options, usually to select
|
||
between different dependencies, enable optional support for big
|
||
dependencies or enable experimental features.</p>
|
||
<p>To see which options, if any, a package supports, and which
|
||
options are mutually exclusive, run <span class="command"><strong>make
|
||
show-options</strong></span>, for example:</p>
|
||
<pre class="programlisting">
|
||
The following options are supported by this package:
|
||
ssl Enable SSL support.
|
||
Exactly one of the following gecko options is required:
|
||
firefox Use firefox as gecko rendering engine.
|
||
mozilla Use mozilla as gecko rendering engine.
|
||
At most one of the following database options may be selected:
|
||
mysql Enable support for MySQL database.
|
||
pgsql Enable support for PostgreSQL database.
|
||
|
||
These options are enabled by default: firefox
|
||
These options are currently enabled: mozilla ssl
|
||
</pre>
|
||
<p>The following variables can be defined in
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> to select which options to
|
||
enable for a package: <code class="varname">PKG_DEFAULT_OPTIONS</code>,
|
||
which can be used to select or disable options for all packages
|
||
that support them, and
|
||
<code class="varname">PKG_OPTIONS.<em class="replaceable"><code>pkgbase</code></em></code>,
|
||
which can be used to select or disable options specifically for
|
||
package <em class="replaceable"><code>pkgbase</code></em>. Options listed in
|
||
these variables are selected, options preceded by <span class="quote">“<span class="quote">-</span>”</span>
|
||
are disabled. A few examples:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">$</code> <span class="command"><strong>grep "PKG.*OPTION" <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a></strong></span>
|
||
PKG_DEFAULT_OPTIONS= -arts -dvdread -esound
|
||
PKG_OPTIONS.kdebase= debug -sasl
|
||
PKG_OPTIONS.apache= suexec </pre>
|
||
<p>It is important to note that options that were specifically
|
||
suggested by the package maintainer must be explicitly removed if
|
||
you do not wish to include the option. If you are unsure you can view
|
||
the current state with <span class="command"><strong>make show-options</strong></span>.</p>
|
||
<p>The following settings are consulted in the order given, and
|
||
the last setting that selects or disables an option is
|
||
used:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>the default options as suggested by the package
|
||
maintainer</p></li>
|
||
<li class="listitem"><p>the options implied by the settings of legacy
|
||
variables (see below)</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_DEFAULT_OPTIONS</code></p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_OPTIONS.<em class="replaceable"><code>pkgbase</code></em></code></p></li>
|
||
</ol></div>
|
||
<p>For groups of mutually exclusive options, the last option
|
||
selected is used, all others are automatically disabled. If an
|
||
option of the group is explicitly disabled, the previously
|
||
selected option, if any, is used. It is an error if no option
|
||
from a required group of options is selected, and building the
|
||
package will fail.</p>
|
||
<p>Before the options framework was introduced, build options
|
||
were selected by setting a variable (often named
|
||
<code class="varname">USE_<em class="replaceable"><code>FOO</code></em></code>) in
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> for each option. To ease
|
||
transition to the options framework for the user, these legacy
|
||
variables are converted to the appropriate options setting
|
||
(<code class="varname">PKG_OPTIONS.<em class="replaceable"><code>pkgbase</code></em></code>)
|
||
automatically. A warning is issued to prompt the user to update
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> to use the options framework
|
||
directly. Support for the legacy variables will be removed
|
||
eventually.</p>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="binary"></a>Chapter 6. Creating binary packages</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#building-a-single-binary-package">6.1. Building a single binary package</a></span></dt>
|
||
<dt><span class="sect1"><a href="#settings-for-creationg-of-binary-packages">6.2. Settings for creation of binary packages</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="building-a-single-binary-package"></a>6.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 class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-5.0.1+i386"><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 class="command"><strong>make
|
||
package</strong></span>:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>cd misc/figlet</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make package</code></strong>
|
||
</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 class="command"><strong>pkg_*</strong></span> tools to manipulate
|
||
it. Binary packages are created by default in
|
||
<code class="filename">/usr/pkgsrc/packages</code>, in the form of a
|
||
gzipped tar file. See <a class="xref" href="#logs.package" title="B.2. Packaging figlet">Section B.2, “Packaging figlet”</a> for a
|
||
continuation of the above <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/misc/figlet/README.html" target="_top"><code class="filename">misc/figlet</code></a> example.</p>
|
||
<p>See <a class="xref" href="#submit" title="Chapter 21. Submitting and Committing">Chapter 21, <i>Submitting and Committing</i></a> for information on how to submit
|
||
such a binary package.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="settings-for-creationg-of-binary-packages"></a>6.2. Settings for creation of binary packages</h2></div></div></div>
|
||
<p>See <a class="xref" href="#build.helpful-targets" title="17.17. Other helpful targets">Section 17.17, “Other helpful targets”</a>.</p>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="bulk"></a>Chapter 7. Creating binary packages for everything in pkgsrc (bulk
|
||
builds)</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#bulk.pre">7.1. Preparations</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bulk.pbulk">7.2. Running a pbulk-style bulk build</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#bulk.pbulk.conf">7.2.1. Configuration</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#bulk.req">7.3. Requirements of a full bulk build</a></span></dt>
|
||
<dt><span class="sect1"><a href="#creating-cdroms">7.4. Creating a multiple CD-ROM packages collection</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#cdpack-example">7.4.1. Example of cdpack</a></span></dt></dl></dd>
|
||
</dl>
|
||
</div>
|
||
<p>For a number of reasons you may want to build binary packages
|
||
for a large selected set of packages in pkgsrc or even for all pkgsrc packages.
|
||
For instance, when you have multiple machines that should run the same software,
|
||
it is wasted time if they all build their packages themselves from source.
|
||
Or you may want to build a list of packages you want and check them before
|
||
deploying onto production system.
|
||
There is a way of getting a set of binary packages:
|
||
The bulk build system, or pbulk ("p" stands for "parallel).
|
||
This chapter describes how to set it up so that the packages
|
||
are most likely to be usable later.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="bulk.pre"></a>7.1. Preparations</h2></div></div></div>
|
||
<p>First of all, you have to decide whether you build all packages
|
||
or a limited set of them. Full bulk builds usually consume a lot more resources,
|
||
both space and time, than builds for some practical sets of packages.
|
||
There exists a number of particularly heavy packages that are not actually
|
||
interesting to a wide audience.
|
||
|
||
For a limited bulk builds you need to make a list of packages you want to build.
|
||
Note, that all their dependencies will be built, so you don't need to track them manually.
|
||
</p>
|
||
<p>During bulk builds various packages are installed and deinstalled
|
||
in <code class="filename">/usr/pkg</code> (or whatever <code class="filename">LOCALBASE</code> is),
|
||
so make sure that you don't need any package during the builds.
|
||
Essentially, you should provide fresh system, either a chroot environment
|
||
or something even more restrictive, depending on what the operating system provides,
|
||
or dedicate the whole physical machine.
|
||
As a useful side effect this makes sure that bulk builds cannot
|
||
break anything in your system. There have been numerous cases where
|
||
certain packages tried to install files outside the
|
||
<code class="filename">LOCALBASE</code> or wanted to edit some files in
|
||
<code class="filename">/etc</code>.
|
||
</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="bulk.pbulk"></a>7.2. Running a pbulk-style bulk build</h2></div></div></div>
|
||
<p>Running a pbulk-style bulk build works roughly as follows:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>First, build the pbulk infrastructure in a fresh pkgsrc location.</p></li>
|
||
<li class="listitem"><p>Then, build each of the packages from a clean installation directory using the infrastructure.</p></li>
|
||
</ul></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="bulk.pbulk.conf"></a>7.2.1. Configuration</h3></div></div></div>
|
||
<p>To simplify configuration we provide helper script <code class="filename">mk/pbulk/pbulk.sh</code>.</p>
|
||
<p>In order to use it, prepare a clear system (real one, chroot environment, jail, zone, virtual machine).
|
||
Configure network access to fetch distribution files.
|
||
Create user with name "pbulk".</p>
|
||
<p>Fetch and extract pkgsrc. Use a command like one of these:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>(cd /usr && ftp -o - http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc.tar.gz | tar -zxf-)</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>(cd /usr && fetch -o - http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc.tar.gz | tar -zxf-)</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>(cd /usr && cvs -Q -z3 -d anoncvs@anoncvs.NetBSD.org:/cvsroot get -P pkgsrc)</code></strong>
|
||
</pre>
|
||
<p>Or any other way that fits (e.g., curl, wget).</p>
|
||
<p>Deploy and configure pbulk tools, e.g.:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>sh pbulk.sh -n # native (NetBSD)</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>sh pbulk.sh -n -c mk.conf.frag # native, apply settings from given mk.conf fragment</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>sh pbulk.sh -nlc mk.conf.frag # native, apply settings, configure for limited build</code></strong>
|
||
</pre>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p><code class="filename">mk.conf.frag</code> is a fragment of
|
||
<code class="filename">mk.conf</code> that contains settings you want to
|
||
apply to packages you build. For instance,</p>
|
||
<pre class="programlisting">
|
||
PKG_DEVELOPER= yes # perform more checks
|
||
X11_TYPE= modular # use pkgsrc X11
|
||
SKIP_LICENSE_CHECK= yes # accept all licences (useful when building all packages)
|
||
</pre>
|
||
</div>
|
||
<p>If configured for limited list, replace the list in <code class="filename">/usr/pbulk/etc/pbulk.list</code>
|
||
with your list of packages one per line without empty lines or comments. E.g.:</p>
|
||
<pre class="programlisting">
|
||
www/firefox
|
||
mail/thunderbird
|
||
misc/libreoffice4
|
||
</pre>
|
||
<p>At this point you can also review configuration in <code class="filename">/usr/pbulk/etc</code>
|
||
and make final amendments, if wanted.</p>
|
||
<p>Start it:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>/usr/pbulk/bin/bulkbuild</code></strong>
|
||
</pre>
|
||
<p>After it finishes, you'll have <code class="filename">/mnt</code> filled with distribution files, binary packages, and reports,
|
||
plain text summary in <code class="filename">/mnt/bulklog/meta/report.txt</code>
|
||
</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>The <code class="filename">pbulk.sh</code> script does not cover all possible use cases.
|
||
While being ready to run, it serves as a good starting point to understand and build more complex setups.
|
||
The script is kept small enough for better understanding.</p>
|
||
</div>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>The <code class="filename">pbulk.sh</code> script supports running
|
||
unprivileged bulk build and helps configuring distributed bulk builds.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="bulk.req"></a>7.3. Requirements of a full bulk build</h2></div></div></div>
|
||
<p>A complete bulk build requires lots of disk space. Some of the
|
||
disk space can be read-only, some other must be writable. Some can be on
|
||
remote filesystems (such as NFS) and some should be local. Some can be
|
||
temporary filesystems, others must survive a sudden reboot.</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>40 GB for the distfiles (read-write, remote, temporary)</p></li>
|
||
<li class="listitem"><p>30 GB for the binary packages (read-write, remote, permanent)</p></li>
|
||
<li class="listitem"><p>1 GB for the pkgsrc tree (read-only, remote, permanent)</p></li>
|
||
<li class="listitem"><p>5 GB for <code class="filename">LOCALBASE</code> (read-write, local, temporary)</p></li>
|
||
<li class="listitem"><p>10 GB for the log files (read-write, remote, permanent)</p></li>
|
||
<li class="listitem"><p>5 GB for temporary files (read-write, local, temporary)</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="creating-cdroms"></a>7.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 href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/cdpack/README.html" target="_top"><code class="filename">pkgtools/cdpack</code></a> package provides
|
||
a simple tool for creating the ISO 9660 images.
|
||
<span class="command"><strong>cdpack</strong></span> arranges the packages on the CD-ROMs in a
|
||
way that keeps all the dependencies for a given package on the same
|
||
CD as that package.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="cdpack-example"></a>7.4.1. Example of cdpack</h3></div></div></div>
|
||
<p>Complete documentation for cdpack is found in the cdpack(1)
|
||
man page. The following short example assumes that the binary
|
||
packages are left in
|
||
<code class="filename">/usr/pkgsrc/packages/All</code> and that
|
||
sufficient disk space exists in <code class="filename">/u2</code> to
|
||
hold the ISO 9660 images.</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mkdir /u2/images</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>pkg_add /usr/pkgsrc/packages/All/cdpack</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>cdpack /usr/pkgsrc/packages/All /u2/images</code></strong>
|
||
</pre>
|
||
<p>If you wish to include a common set of files
|
||
(<code class="filename">COPYRIGHT</code>, <code class="filename">README</code>,
|
||
etc.) on each CD in the collection, then you need to create a
|
||
directory which contains these files. e.g.</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mkdir /tmp/common</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>echo "This is a README" > /tmp/common/README</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>echo "Another file" > /tmp/common/COPYING</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mkdir /tmp/common/bin</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>echo "#!/bin/sh" > /tmp/common/bin/myscript</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>echo "echo Hello world" >> /tmp/common/bin/myscript</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>chmod 755 /tmp/common/bin/myscript</code></strong>
|
||
</pre>
|
||
<p>Now create the images:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>cdpack -x /tmp/common /usr/pkgsrc/packages/All /u2/images</code></strong></pre>
|
||
<p>Each image will contain <code class="filename">README</code>,
|
||
<code class="filename">COPYING</code>, and <code class="filename">bin/myscript</code>
|
||
in their root directories.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="files"></a>Chapter 8. Directory layout of the installed files</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#files.localbase">8.1. File system layout in <code class="literal">${LOCALBASE}</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#files.varbase">8.2. File system layout in <code class="literal">${VARBASE}</code></a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<p>The files that are installed by pkgsrc are organized in a way that
|
||
is similar to what you find in the <code class="filename">/usr</code> directory
|
||
of the base system. But some details are different. This is because
|
||
pkgsrc initially came from FreeBSD and had adopted its file system
|
||
hierarchy. Later it was largely influenced by NetBSD. But no matter
|
||
which operating system you are using pkgsrc with, you can expect the
|
||
same layout for pkgsrc.</p>
|
||
<p>There are mainly four root directories for pkgsrc, which are all
|
||
configurable in the <code class="filename">bootstrap/bootstrap</code> script.
|
||
When pkgsrc has been installed as root, the default locations
|
||
are:</p>
|
||
<pre class="programlisting">
|
||
LOCALBASE= /usr/pkg
|
||
PKG_SYSCONFBASE= /usr/pkg/etc
|
||
VARBASE= /var
|
||
PKG_DBDIR= /var/db/pkg
|
||
</pre>
|
||
<p>In unprivileged mode (when pkgsrc has been installed as any other
|
||
user), the default locations are:</p>
|
||
<pre class="programlisting">
|
||
LOCALBASE= ${HOME}/pkg
|
||
PKG_SYSCONFBASE= ${HOME}/pkg/etc
|
||
VARBASE= ${HOME}/pkg/var
|
||
PKG_DBDIR= ${HOME}/pkg/var/db/pkg
|
||
</pre>
|
||
<p>What these four directories are for, and what they look like is
|
||
explained below.</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">LOCALBASE</code> corresponds to the
|
||
<code class="filename">/usr</code> directory in the base system. It is the
|
||
<span class="quote">“<span class="quote">main</span>”</span> directory where the files are installed and contains
|
||
the well-known subdirectories like <code class="filename">bin</code>,
|
||
<code class="filename">include</code>, <code class="filename">lib</code>,
|
||
<code class="filename">share</code> and
|
||
<code class="filename">sbin</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">VARBASE</code> corresponds to
|
||
<code class="filename">/var</code> in the base system. Some programs (especially
|
||
games, network daemons) need write access to it during normal
|
||
operation.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_SYSCONFDIR</code> corresponds to
|
||
<code class="filename">/etc</code> in the base system. It contains configuration
|
||
files of the packages, as well as pkgsrc's <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>
|
||
itself.</p></li>
|
||
</ul></div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="files.localbase"></a>8.1. File system layout in <code class="literal">${LOCALBASE}</code>
|
||
</h2></div></div></div>
|
||
<p>The following directories exist in a typical pkgsrc installation
|
||
in <code class="filename">${LOCALBASE}</code>.</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="filename">bin</code></span></dt>
|
||
<dd><p>Contains executable programs that are intended to be
|
||
directly used by the end user.</p></dd>
|
||
<dt><span class="term"><code class="filename">emul</code></span></dt>
|
||
<dd><p>Contains files for the emulation layers of various other
|
||
operating systems, especially for
|
||
NetBSD.</p></dd>
|
||
<dt><span class="term"><code class="filename">etc</code> (the usual location of
|
||
<code class="filename">${PKG_SYSCONFDIR}</code>)</span></dt>
|
||
<dd><p>Contains
|
||
the configuration files.</p></dd>
|
||
<dt><span class="term"><code class="filename">include</code></span></dt>
|
||
<dd><p>Contains headers for the C and C++ programming
|
||
languages.</p></dd>
|
||
<dt><span class="term"><code class="filename">info</code></span></dt>
|
||
<dd><p>Contains GNU info files of various
|
||
packages.</p></dd>
|
||
<dt><span class="term"><code class="filename">lib</code></span></dt>
|
||
<dd><p>Contains shared and static
|
||
libraries.</p></dd>
|
||
<dt><span class="term"><code class="filename">libdata</code></span></dt>
|
||
<dd><p>Contains data files that don't change after
|
||
installation. Other data files belong into
|
||
<code class="filename">${VARBASE}</code>.</p></dd>
|
||
<dt><span class="term"><code class="filename">libexec</code></span></dt>
|
||
<dd><p>Contains programs that are not intended to be used by
|
||
end users, such as helper programs or network
|
||
daemons.</p></dd>
|
||
<dt><span class="term"><code class="filename">libexec/cgi-bin</code></span></dt>
|
||
<dd><p>Contains programs that are intended to be executed as
|
||
CGI scripts by a web server.</p></dd>
|
||
<dt><span class="term"><code class="filename">man</code> (the usual value of
|
||
<code class="filename">${PKGMANDIR}</code>)</span></dt>
|
||
<dd><p>Contains brief
|
||
documentation in form of manual pages.</p></dd>
|
||
<dt><span class="term"><code class="filename">sbin</code></span></dt>
|
||
<dd><p>Contains programs that are intended to be used only by
|
||
the super-user.</p></dd>
|
||
<dt><span class="term"><code class="filename">share</code></span></dt>
|
||
<dd><p>Contains platform-independent data files that don't
|
||
change after installation.</p></dd>
|
||
<dt><span class="term"><code class="filename">share/doc</code></span></dt>
|
||
<dd><p>Contains documentation files provided by the
|
||
packages.</p></dd>
|
||
<dt><span class="term"><code class="filename">share/examples</code></span></dt>
|
||
<dd><p>Contains example files provided by the packages. Among
|
||
others, the original configuration files are saved here and copied to
|
||
<code class="filename">${PKG_SYSCONFDIR}</code> during
|
||
installation.</p></dd>
|
||
<dt><span class="term"><code class="filename">share/examples/rc.d</code></span></dt>
|
||
<dd><p>Contains the original files for rc.d
|
||
scripts.</p></dd>
|
||
<dt><span class="term"><code class="filename">var</code> (the usual location of
|
||
<code class="filename">${VARBASE}</code>)</span></dt>
|
||
<dd><p>Contains files
|
||
that may be modified after
|
||
installation.</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="files.varbase"></a>8.2. File system layout in <code class="literal">${VARBASE}</code>
|
||
</h2></div></div></div>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="filename">db/pkg</code> (the usual location of
|
||
<code class="filename">${PKG_DBDIR}</code>)</span></dt>
|
||
<dd><p>Contains
|
||
information about the currently installed
|
||
packages.</p></dd>
|
||
<dt><span class="term"><code class="filename">games</code></span></dt>
|
||
<dd><p>Contains highscore
|
||
files.</p></dd>
|
||
<dt><span class="term"><code class="filename">log</code></span></dt>
|
||
<dd><p>Contains log files.</p></dd>
|
||
<dt><span class="term"><code class="filename">run</code></span></dt>
|
||
<dd><p>Contains informational files about daemons that are
|
||
currently running.</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="faq"></a>Chapter 9. Frequently Asked Questions</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#mailing-list-pointers">9.1. Are there any mailing lists for pkg-related discussion?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq-pkgtools">9.2. Utilities for package management (pkgtools)</a></span></dt>
|
||
<dt><span class="sect1"><a href="#non-root-pkgsrc">9.3. How to use pkgsrc as non-root</a></span></dt>
|
||
<dt><span class="sect1"><a href="#resume-transfers">9.4. How to resume transfers when fetching distfiles?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#x.org-from-pkgsrc">9.5. How can I install/use modular X.org from pkgsrc?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetch-behind-firewall">9.6. How to fetch files from behind a firewall</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetch-https">9.7. How to fetch files from HTTPS sites</a></span></dt>
|
||
<dt><span class="sect1"><a href="#passive-ftp">9.8. How do I tell <span class="command"><strong>make fetch</strong></span> to do passive FTP?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#fetching-all-distfiles">9.9. How to fetch all distfiles at once</a></span></dt>
|
||
<dt><span class="sect1"><a href="#tmac.andoc-missing">9.10. What does <span class="quote">“<span class="quote">Don't know how to make
|
||
/usr/share/tmac/tmac.andoc</span>”</span> mean?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#bsd.own.mk-missing">9.11. What does <span class="quote">“<span class="quote">Could not find bsd.own.mk</span>”</span> mean?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#using-sudo-with-pkgsrc">9.12. Using 'sudo' with pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.conf">9.13. How do I change the location of configuration files?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#audit-packages">9.14. Automated security checks</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ufaq-cflags">9.15. Why do some packages ignore my <code class="varname">CFLAGS</code>?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ufaq-fail">9.16. A package does not build. What shall I do?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.rcs-conflicts">9.17. What does <span class="quote">“<span class="quote">Makefile appears to contain unresolved cvs/rcs/??? merge conflicts</span>”</span> mean?</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">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="mailing-list-pointers"></a>9.1. Are there any mailing lists for pkg-related discussion?</h2></div></div></div>
|
||
<p>The following mailing lists may be of interest to pkgsrc users:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><a class="ulink" href="http://www.NetBSD.org/mailinglists/index.html#pkgsrc-users" target="_top">pkgsrc-users</a>:
|
||
This is a general purpose list for most issues regarding
|
||
pkgsrc, regardless of platform, e.g. soliciting user help
|
||
for pkgsrc configuration, unexpected build failures, using
|
||
particular packages, upgrading pkgsrc installations,
|
||
questions regarding the pkgsrc release branches, etc. General announcements or
|
||
proposals for changes that impact the pkgsrc user community,
|
||
e.g. major infrastructure changes, new features, package
|
||
removals, etc., may also be posted.</p></li>
|
||
<li class="listitem"><p><a class="ulink" href="http://www.NetBSD.org/mailinglists/index.html#pkgsrc-bulk" target="_top">pkgsrc-bulk</a>:
|
||
A list where the results of pkgsrc bulk builds are sent and
|
||
discussed.</p></li>
|
||
<li class="listitem"><p><a class="ulink" href="http://www.NetBSD.org/mailinglists/index.html#pkgsrc-changes" target="_top">pkgsrc-changes</a>:
|
||
This list is for those who are interested in getting a
|
||
commit message for every change committed to pkgsrc. It is
|
||
also available in digest form, meaning one daily message
|
||
containing all commit messages for changes to the package
|
||
source tree in that 24 hour period.</p></li>
|
||
</ul></div>
|
||
<p>To subscribe, do:</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">%</code> echo subscribe <em class="replaceable"><code>listname</code></em> | mail majordomo@NetBSD.org
|
||
</pre>
|
||
<p>Archives for all these mailing lists are available from
|
||
<a class="ulink" href="http://mail-index.NetBSD.org/" target="_top">http://mail-index.NetBSD.org/</a>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="faq-pkgtools"></a>9.2. Utilities for package management (pkgtools)</h2></div></div></div>
|
||
<p>The directory <code class="filename">pkgsrc/pkgtools</code> 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 class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/x11-links/README.html" target="_top"><code class="filename">pkgtools/x11-links</code></a>:
|
||
Symlinks for use by buildlink.</p></li></ul></div>
|
||
<p>OS tool augmentation (automatically installed when needed):</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/digest/README.html" target="_top"><code class="filename">pkgtools/digest</code></a>:
|
||
Calculates various kinds of checksums (including SHA1).</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/libnbcompat/README.html" target="_top"><code class="filename">pkgtools/libnbcompat</code></a>:
|
||
Compatibility library for pkgsrc tools.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/mtree/README.html" target="_top"><code class="filename">pkgtools/mtree</code></a>: Installed on
|
||
non-BSD systems due to lack of native mtree.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_install/README.html" target="_top"><code class="filename">pkgtools/pkg_install</code></a>:
|
||
Up-to-date replacement for
|
||
<code class="filename">/usr/sbin/pkg_install</code>, 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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_tarup/README.html" target="_top"><code class="filename">pkgtools/pkg_tarup</code></a>:
|
||
Create a binary package from an
|
||
already-installed package. Used by <span class="command"><strong>make replace</strong></span> to
|
||
save the old package.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/dfdisk/README.html" target="_top"><code class="filename">pkgtools/dfdisk</code></a>:
|
||
Adds extra functionality to pkgsrc, allowing it to fetch distfiles
|
||
from multiple locations. It currently supports the following
|
||
methods: multiple CD-ROMs and network FTP/HTTP connections.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/cpuflags/README.html" target="_top"><code class="filename">devel/cpuflags</code></a>: Determine
|
||
the best compiler flags to optimise code for your current
|
||
CPU and compiler. </p></li>
|
||
</ul></div>
|
||
<p>Utilities for keeping track of installed packages, being up to date,
|
||
etc:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgin/README.html" target="_top"><code class="filename">pkgtools/pkgin</code></a>: A package
|
||
update tool similar to apt(1). Download, install, and upgrade
|
||
binary packages easily.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_chk/README.html" target="_top"><code class="filename">pkgtools/pkg_chk</code></a>: Reports on
|
||
packages whose installed versions do not match the latest pkgsrc
|
||
entries.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgdep/README.html" target="_top"><code class="filename">pkgtools/pkgdep</code></a>: Makes
|
||
dependency graphs of packages, to aid in choosing a strategy for
|
||
updating.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgdepgraph/README.html" target="_top"><code class="filename">pkgtools/pkgdepgraph</code></a>: Makes
|
||
graphs from the output of <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgdep/README.html" target="_top"><code class="filename">pkgtools/pkgdep</code></a> (uses graphviz).</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkglint/README.html" target="_top"><code class="filename">pkgtools/pkglint</code></a>: The
|
||
pkglint(1) program checks a pkgsrc entry for errors.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/lintpkgsrc/README.html" target="_top"><code class="filename">pkgtools/lintpkgsrc</code></a>: The lintpkgsrc(1) program
|
||
does various checks on the complete pkgsrc system.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgsurvey/README.html" target="_top"><code class="filename">pkgtools/pkgsurvey</code></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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgdiff/README.html" target="_top"><code class="filename">pkgtools/pkgdiff</code></a>: Automate
|
||
making and maintaining patches for a package (includes pkgdiff,
|
||
pkgvi, mkpatches, etc.).</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/url2pkg/README.html" target="_top"><code class="filename">pkgtools/url2pkg</code></a>: Aids in
|
||
converting to pkgsrc.</p></li>
|
||
</ul></div>
|
||
<p>Utilities for people maintaining pkgsrc (or: more obscure pkg
|
||
utilities)</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_comp/README.html" target="_top"><code class="filename">pkgtools/pkg_comp</code></a>: Build
|
||
packages in a chrooted area.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/libkver/README.html" target="_top"><code class="filename">pkgtools/libkver</code></a>: Spoof
|
||
kernel version for chrooted cross builds.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="non-root-pkgsrc"></a>9.3. 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. At the very least,
|
||
you need to set <code class="varname">UNPRIVILEGED</code> to <span class="quote">“<span class="quote">yes</span>”</span>; this
|
||
will turn on unprivileged mode and set multiple related variables to allow
|
||
installation of packages as non-root.</p>
|
||
<p>In case the defaults are not enough, you may want to tune some other
|
||
variables used. For example, if the automatic user/group detection leads
|
||
to incorrect values (or not the ones you would like to use), you can change
|
||
them by setting <code class="varname">UNPRIVILEGED_USER</code> and
|
||
<code class="varname">UNPRIVILEGED_GROUP</code> respectively.</p>
|
||
<p>As regards bootstrapping, please note that the
|
||
<span class="command"><strong>bootstrap</strong></span> script will ease non-root configuration when
|
||
given the <span class="quote">“<span class="quote">--ignore-user-check</span>”</span> flag, as it will choose and
|
||
use multiple default directories under <code class="filename">~/pkg</code> as the
|
||
installation targets. These directories can be overridden by the
|
||
<span class="quote">“<span class="quote">--prefix</span>”</span> flag provided by the script, as well as some others
|
||
that allow finer tuning of the tree layout.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="resume-transfers"></a>9.4. How to resume transfers when fetching distfiles?</h2></div></div></div>
|
||
<p>By default, resuming transfers in pkgsrc is disabled, but you can
|
||
enable this feature by adding the option
|
||
<code class="varname">PKG_RESUME_TRANSFERS=YES</code> into
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>. If, during a fetch step, an incomplete
|
||
distfile is found, pkgsrc will try to resume it.</p>
|
||
<p>You can also
|
||
use a different program than the platform default program by changing the
|
||
<code class="varname">FETCH_USING</code> variable. You can specify the program by
|
||
using of ftp, fetch, wget or curl. Alternatively, fetching can be disabled
|
||
by using the value manual. A value of custom disables the system defaults
|
||
and dependency tracking for the fetch program. In that case you have to
|
||
provide <code class="varname">FETCH_CMD</code>, <code class="varname">FETCH_BEFORE_ARGS</code>,
|
||
<code class="varname">FETCH_RESUME_ARGS</code>, <code class="varname">FETCH_OUTPUT_ARGS</code>,
|
||
<code class="varname">FETCH_AFTER_ARGS</code>.</p>
|
||
<p>For example, if you want to use
|
||
<code class="filename">wget</code> to download, you'll have to use something
|
||
like:</p>
|
||
<pre class="programlisting">
|
||
FETCH_USING= wget
|
||
</pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="x.org-from-pkgsrc"></a>9.5. How can I install/use modular X.org from pkgsrc?</h2></div></div></div>
|
||
<p>If you want to use modular X.org from pkgsrc instead of your system's own X11
|
||
(<code class="filename">/usr/X11R6</code>, <code class="filename">/usr/openwin</code>, ...)
|
||
you will have to add the following line into
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>:</p>
|
||
<pre class="programlisting">
|
||
X11_TYPE=modular
|
||
</pre>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>The DragonFly operating system defaults to using modular X.org from pkgsrc.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fetch-behind-firewall"></a>9.6. 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">“<span class="quote">orpheus.amdahl.com</span>”</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">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fetch-https"></a>9.7. How to fetch files from HTTPS sites</h2></div></div></div>
|
||
<p>Some fetch tools are not prepared to support HTTPS by default
|
||
(for example, the one in NetBSD 6.0), or the one installed by the
|
||
pkgsrc bootstrap (to avoid an openssl dependency that low in the
|
||
dependency graph).</p>
|
||
<p>Usually you won't notice, because distribution files are
|
||
mirrored weekly to <span class="quote">“<span class="quote">ftp.NetBSD.org</span>”</span>, but that might not
|
||
be often enough if you are following pkgsrc-current. In that case, set
|
||
<code class="varname">FETCH_USING</code> in your <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> file to
|
||
<span class="quote">“<span class="quote">curl</span>”</span> or <span class="quote">“<span class="quote">wget</span>”</span>, which are both compiled
|
||
with HTTPS support by default. Of course, these tools need to be
|
||
installed before you can use them this way.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="passive-ftp"></a>9.8. How do I tell <span class="command"><strong>make fetch</strong></span> to do passive FTP?</h2></div></div></div>
|
||
<p>This depends on which utility is used to retrieve distfiles. From
|
||
<code class="filename">bsd.pkg.mk</code>, <code class="varname">FETCH_CMD</code> is assigned
|
||
the first available command from the following list:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="filename">${LOCALBASE}/bin/ftp</code></p></li>
|
||
<li class="listitem"><p><code class="filename">/usr/bin/ftp</code></p></li>
|
||
</ul></div>
|
||
<p>On a default NetBSD installation, this will be
|
||
<code class="filename">/usr/bin/ftp</code>, 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
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> file:
|
||
<code class="varname">PASSIVE_FETCH=1</code>.</p>
|
||
<p>Having that option present will prevent
|
||
<code class="filename">/usr/bin/ftp</code> from falling back to active
|
||
transfers.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fetching-all-distfiles"></a>9.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 class="command"><strong>make
|
||
fetch</strong></span>. There is an archive of distfiles on <a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/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 class="command"><strong>make fetch-list</strong></span> in
|
||
<code class="filename">/usr/pkgsrc</code> or one of its subdirectories, carry the
|
||
resulting list to your machine at work/school and use it there. If you
|
||
don't have a NetBSD-compatible <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?ftp+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">ftp</span>(1)</span></a> (like tnftp) at work, don't
|
||
forget to set <code class="varname">FETCH_CMD</code> to something that fetches a
|
||
URL:</p>
|
||
<p>At home:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>cd /usr/pkgsrc</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make fetch-list FETCH_CMD=wget DISTDIR=/tmp/distfiles >/tmp/fetch.sh</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>scp /tmp/fetch.sh work:/tmp</code></strong></pre>
|
||
<p>At work:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>sh /tmp/fetch.sh</code></strong></pre>
|
||
<p>then tar up <code class="filename">/tmp/distfiles</code> 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 class="command"><strong>make fetch-list</strong></span> approach, or fetch the distfiles
|
||
directly by running:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>make mirror-distfiles</code></strong></pre>
|
||
<p>If you even decide to ignore
|
||
<code class="varname">NO_{SRC,BIN}_ON_{FTP,CDROM}</code>, then you can get everything
|
||
by running:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>make fetch NO_SKIP=yes</code></strong></pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="tmac.andoc-missing"></a>9.10. What does <span class="quote">“<span class="quote">Don't know how to make
|
||
/usr/share/tmac/tmac.andoc</span>”</span> mean?</h2></div></div></div>
|
||
<p>When compiling the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_install/README.html" target="_top"><code class="filename">pkgtools/pkg_install</code></a>
|
||
package, you get the error from make that it doesn't know how to make
|
||
<code class="filename">/usr/share/tmac/tmac.andoc</code>? This indicates that
|
||
you don't have installed the <span class="quote">“<span class="quote">text</span>”</span> set (nroff, ...) from
|
||
the NetBSD base distribution on your machine. It is recommended to do
|
||
that to format man pages.</p>
|
||
<p>In the case of the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_install/README.html" target="_top"><code class="filename">pkgtools/pkg_install</code></a> package, you
|
||
can get away with setting <code class="varname">NOMAN=YES</code> either in the
|
||
environment or in <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="bsd.own.mk-missing"></a>9.11. What does <span class="quote">“<span class="quote">Could not find bsd.own.mk</span>”</span> mean?</h2></div></div></div>
|
||
<p>You didn't install the compiler set, <code class="filename">comp.tgz</code>,
|
||
when you installed your NetBSD machine. Please get and install it, by
|
||
extracting it in <code class="filename">/</code>:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>cd /</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>tar --unlink -zxvpf .../comp.tgz</code></strong></pre>
|
||
<p><code class="filename">comp.tgz</code> is part of every NetBSD release. Get
|
||
the one that corresponds to your release (determine via <span class="command"><strong>uname
|
||
-r</strong></span>).</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="using-sudo-with-pkgsrc"></a>9.12. Using 'sudo' with pkgsrc</h2></div></div></div>
|
||
<p>When installing packages as non-root user and using the just-in-time
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?su+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">su</span>(1)</span></a> 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 href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/security/sudo/README.html" target="_top"><code class="filename">security/sudo</code></a>) and then put the
|
||
following into your <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>, somewhere
|
||
<span class="emphasis"><em>after</em></span> the definition of the
|
||
<code class="varname">LOCALBASE</code> variable:</p>
|
||
<pre class="programlisting">
|
||
.if exists(${LOCALBASE}/bin/sudo)
|
||
SU_CMD= ${LOCALBASE}/bin/sudo /bin/sh -c
|
||
.endif
|
||
</pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="faq.conf"></a>9.13. How do I change the location of configuration files?</h2></div></div></div>
|
||
<p>As the system administrator, you can choose where configuration files
|
||
are installed. The default settings make all these files go into
|
||
<code class="filename">${PREFIX}/etc</code> or some of its subdirectories; this may
|
||
be suboptimal depending on your expectations (e.g., a read-only,
|
||
NFS-exported <code class="varname">PREFIX</code> with a need of per-machine
|
||
configuration of the provided packages).</p>
|
||
<p>In order to change the defaults, you can modify the
|
||
<code class="varname">PKG_SYSCONFBASE</code> variable (in
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>) to point to your preferred configuration
|
||
directory; some common examples include <code class="filename">/etc</code> or
|
||
<code class="filename">/etc/pkg</code>.</p>
|
||
<p>Furthermore, you can change this value on a per-package basis by
|
||
setting the <code class="varname">PKG_SYSCONFDIR.${PKG_SYSCONFVAR}</code> variable.
|
||
<code class="varname">PKG_SYSCONFVAR</code>'s value usually matches the name of the
|
||
package you would like to modify, that is, the contents of
|
||
<code class="varname">PKGBASE</code>.</p>
|
||
<p>Note that after changing these settings, you must rebuild and
|
||
reinstall any affected packages.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="audit-packages"></a>9.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, refer to the following two tools (installed as part of the
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_install/README.html" target="_top"><code class="filename">pkgtools/pkg_install</code></a> package):</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem">
|
||
<p><span class="command"><strong>pkg_admin fetch-pkg-vulnerabilities</strong></span>, an easy way to
|
||
download a list of the security vulnerabilities information. This list
|
||
is kept up to date by the pkgsrc security team, and is distributed
|
||
from the NetBSD ftp server:</p>
|
||
<p><a class="ulink" href="ftp://ftp.NetBSD.org/pkgsrc/distfiles/pkg-vulnerabilities" target="_top">ftp://ftp.NetBSD.org/pkgsrc/distfiles/pkg-vulnerabilities</a></p>
|
||
</li>
|
||
<li class="listitem"><p><span class="command"><strong>pkg_admin audit</strong></span>, an easy way to audit the
|
||
current machine, checking each known vulnerability. 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 these tools is strongly recommended! After
|
||
<span class="quote">“<span class="quote">pkg_install</span>”</span> is installed, please read
|
||
the package's message, which you can get by running <strong class="userinput"><code>pkg_info -D
|
||
pkg_install</code></strong>.</p>
|
||
<p>If this package is installed, pkgsrc builds will use it to
|
||
perform a security check before building any package. See <a class="xref" href="#variables-affecting-build" title="5.2. Variables affecting the build process">Section 5.2, “Variables affecting the build process”</a> for ways to control this
|
||
check.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="ufaq-cflags"></a>9.15. Why do some packages ignore my <code class="varname">CFLAGS</code>?</h2></div></div></div>
|
||
<p>When you add your own preferences to the
|
||
<code class="varname">CFLAGS</code> variable in your
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>, these flags are passed in
|
||
environment variables to the <code class="filename">./configure</code>
|
||
scripts and to <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a>. Some package authors ignore the
|
||
<code class="varname">CFLAGS</code> from the environment variable by
|
||
overriding them in the <code class="filename">Makefile</code>s of their
|
||
package.</p>
|
||
<p>Currently there is no solution to this problem. If you
|
||
really need the package to use your <code class="varname">CFLAGS</code>
|
||
you should run <span class="command"><strong>make patch</strong></span> in the package
|
||
directory and then inspect any <code class="filename">Makefile</code> and
|
||
<code class="filename">Makefile.in</code> for whether they define
|
||
<code class="varname">CFLAGS</code> explicitly. Usually you can remove
|
||
these lines. But be aware that some <span class="quote">“<span class="quote">smart</span>”</span>
|
||
programmers write so bad code that it only works for the
|
||
specific combination of <code class="varname">CFLAGS</code> they have
|
||
chosen.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="ufaq-fail"></a>9.16. A package does not build. What shall I do?</h2></div></div></div>
|
||
<div class="procedure"><ol class="procedure" type="1">
|
||
<li class="step"><p>Make sure that your copy of pkgsrc is consistent. A
|
||
case that occurs often is that people only update pkgsrc in
|
||
parts, because of performance reasons. Since pkgsrc is one large
|
||
system, not a collection of many small systems, there are
|
||
sometimes changes that only work when the whole pkgsrc tree is
|
||
updated.</p></li>
|
||
<li class="step"><p>Make sure that you don't have any CVS conflicts.
|
||
Search for <span class="quote">“<span class="quote"><<<<<<</span>”</span> or
|
||
<span class="quote">“<span class="quote">>>>>>></span>”</span> in all your pkgsrc
|
||
files.</p></li>
|
||
<li class="step"><p>Make sure that you don't have old copies of the packages
|
||
extracted. Run <span class="command"><strong>make clean clean-depends</strong></span> to
|
||
verify this.</p></li>
|
||
<li class="step"><p>If the problem still exists, write a mail to the
|
||
<code class="literal">pkgsrc-users</code> mailing list.</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="faq.rcs-conflicts"></a>9.17. What does <span class="quote">“<span class="quote">Makefile appears to contain unresolved cvs/rcs/??? merge conflicts</span>”</span> mean?</h2></div></div></div>
|
||
<p>You have modified a file from pkgsrc, and someone else has
|
||
modified that same file afterwards in the CVS repository. Both changes
|
||
are in the same region of the file, so when you updated pkgsrc, the
|
||
<code class="literal">cvs</code> command marked the conflicting changes in the
|
||
file. Because of these markers, the file is no longer a valid
|
||
<code class="filename">Makefile</code>.</p>
|
||
<p>Have a look at that file, and if you don't need your local changes
|
||
anymore, you can remove that file and run <span class="command"><strong>cvs -q update
|
||
-dP</strong></span> in that directory to download the current version.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="part">
|
||
<div class="titlepage"><div><div><h1 class="title">
|
||
<a name="developers-guide"></a>Part II. The pkgsrc developer's guide</h1></div></div></div>
|
||
<div class="partintro">
|
||
<div></div>
|
||
<p>This part of the book deals with creating and
|
||
modifying packages. It starts with a <span class="quote">“<span class="quote">HOWTO</span>”</span>-like
|
||
guide on creating a new package. The remaining chapters are more
|
||
like a reference manual for pkgsrc.</p>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="chapter"><a href="#creating">10. Creating a new pkgsrc package from scratch</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#creating.common">10.1. Common types of packages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#creating.perl-module">10.1.1. Perl modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#creating.kde-app">10.1.2. KDE3 applications</a></span></dt>
|
||
<dt><span class="sect2"><a href="#creating.python-module">10.1.3. Python modules and programs</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#creating.examples">10.2. Examples</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#creating.nvu">10.2.1. How the www/nvu package came into pkgsrc</a></span></dt></dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#components">11. Package components - files, directories and contents</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#components.Makefile">11.1. <code class="filename">Makefile</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.distinfo">11.2. <code class="filename">distinfo</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.patches">11.3. patches/*</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#components.patch.structure">11.3.1. Structure of a single patch file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.caveats">11.3.2. Creating patch files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.sources">11.3.3. Sources where the patch files come from</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.guidelines">11.3.4. Patching guidelines</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.feedback">11.3.5. Feedback to the author</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#other-mandatory-files">11.4. Other mandatory files</a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.optional">11.5. Optional files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#components.optional.bin">11.5.1. Files affecting the binary package</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.optional.build">11.5.2. Files affecting the build process</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.optional.none">11.5.3. Files affecting nothing at all</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#work-dir">11.6. <code class="filename">work*</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#files-dir">11.7. <code class="filename">files/*</code></a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#makefile">12. Programming in <code class="filename">Makefile</code>s</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#makefile.style">12.1. Caveats</a></span></dt>
|
||
<dt><span class="sect1"><a href="#makefile.variables">12.2. <code class="filename">Makefile</code> variables</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#makefile.variables.names">12.2.1. Naming conventions</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#makefile.code">12.3. Code snippets</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#adding-to-list">12.3.1. Adding things to a list</a></span></dt>
|
||
<dt><span class="sect2"><a href="#converting-internal-to-external">12.3.2. Converting an internal list into an external list</a></span></dt>
|
||
<dt><span class="sect2"><a href="#passing-variable-to-shell">12.3.3. Passing variables to a shell command</a></span></dt>
|
||
<dt><span class="sect2"><a href="#quoting-guideline">12.3.4. Quoting guideline</a></span></dt>
|
||
<dt><span class="sect2"><a href="#bsd-make-bug-workaround">12.3.5. Workaround for a bug in BSD Make</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#plist">13. PLIST issues</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#rcs-id">13.1. RCS ID</a></span></dt>
|
||
<dt><span class="sect1"><a href="#automatic-plist-generation">13.2. Semi-automatic <code class="filename">PLIST</code> generation</a></span></dt>
|
||
<dt><span class="sect1"><a href="#print-PLIST">13.3. Tweaking output of <span class="command"><strong>make print-PLIST</strong></span></a></span></dt>
|
||
<dt><span class="sect1"><a href="#plist.misc">13.4. Variable substitution in PLIST</a></span></dt>
|
||
<dt><span class="sect1"><a href="#manpage-compression">13.5. Man page compression</a></span></dt>
|
||
<dt><span class="sect1"><a href="#using-PLIST_SRC">13.6. Changing PLIST source with <code class="varname">PLIST_SRC</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-specific-plist">13.7. Platform-specific and differing PLISTs</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build-plist">13.8. Build-specific PLISTs</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.common-dirs">13.9. Sharing directories between packages</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#buildlink">14. Buildlink methodology</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#converting-to-buildlink3">14.1. Converting packages to use buildlink3</a></span></dt>
|
||
<dt><span class="sect1"><a href="#creating-buildlink3.mk">14.2. Writing <code class="filename">buildlink3.mk</code> files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#anatomy-of-bl3">14.2.1. Anatomy of a buildlink3.mk file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#updating-buildlink-depends">14.2.2. Updating
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
and
|
||
<code class="varname">BUILDLINK_ABI_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
in <code class="filename">buildlink3.mk</code> files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#writing-builtin.mk">14.3. Writing <code class="filename">builtin.mk</code> files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#anatomy-of-builtin.mk">14.3.1. Anatomy of a <code class="filename">builtin.mk</code> file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#native-or-pkgsrc-preference">14.3.2. Global preferences for native or pkgsrc software</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#pkginstall">15. The pkginstall framework</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#files-and-dirs-outside-prefix">15.1. Files and directories outside the installation prefix</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#dirs-outside-prefix">15.1.1. Directory manipulation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#files-outside-prefix">15.1.2. File manipulation</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#conf-files">15.2. Configuration files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#conf-files-sysconfdir">15.2.1. How <code class="varname">PKG_SYSCONFDIR</code> is set</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-configure">15.2.2. Telling the software where configuration files are</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-patching">15.2.3. Patching installations</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-disable">15.2.4. Disabling handling of configuration files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#rcd-scripts">15.3. System startup scripts</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#rcd-scripts-disable">15.3.1. Disabling handling of system startup scripts</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#users-and-groups">15.4. System users and groups</a></span></dt>
|
||
<dt><span class="sect1"><a href="#shells">15.5. System shells</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#shells-disable">15.5.1. Disabling shell registration</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#fonts">15.6. Fonts</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#fonts-disable">15.6.1. Disabling automatic update of the fonts databases</a></span></dt></dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#options">16. Options handling</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#global-default-options">16.1. Global default options</a></span></dt>
|
||
<dt><span class="sect1"><a href="#converting-to-options">16.2. Converting packages to use <code class="filename">bsd.options.mk</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#option-names">16.3. Option Names</a></span></dt>
|
||
<dt><span class="sect1"><a href="#option-build">16.4. Determining the options of dependencies</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#build">17. The build process</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#build.intro">17.1. Introduction</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.prefix">17.2. Program location</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.builddirs">17.3. Directories used during the build process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.running">17.4. Running a phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.fetch">17.5. The <span class="emphasis"><em>fetch</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#build.fetch.what">17.5.1. What to fetch and where to get it from</a></span></dt>
|
||
<dt><span class="sect2"><a href="#build.fetch.how">17.5.2. How are the files fetched?</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#build.checksum">17.6. The <span class="emphasis"><em>checksum</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.extract">17.7. The <span class="emphasis"><em>extract</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.patch">17.8. The <span class="emphasis"><em>patch</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.tools">17.9. The <span class="emphasis"><em>tools</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.wrapper">17.10. The <span class="emphasis"><em>wrapper</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.configure">17.11. The <span class="emphasis"><em>configure</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.build">17.12. The <span class="emphasis"><em>build</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.test">17.13. The <span class="emphasis"><em>test</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.install">17.14. The <span class="emphasis"><em>install</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.package">17.15. The <span class="emphasis"><em>package</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.clean">17.16. Cleaning up</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.helpful-targets">17.17. Other helpful targets</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#tools">18. Tools needed for building or running</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#pkgsrc-tools">18.1. Tools for pkgsrc builds</a></span></dt>
|
||
<dt><span class="sect1"><a href="#package-tools">18.2. Tools needed by packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-tools">18.3. Tools provided by platforms</a></span></dt>
|
||
<dt><span class="sect1"><a href="#tools.questions">18.4. Questions regarding the tools</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#fixes">19. Making your package work</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#general-operation">19.1. General operation</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#portability-of-packages">19.1.1. Portability of packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#pulling-vars-from-etc-mk.conf">19.1.2. How to pull in user-settable variables from <code class="filename">mk.conf</code></a></span></dt>
|
||
<dt><span class="sect2"><a href="#user-interaction">19.1.3. User interaction</a></span></dt>
|
||
<dt><span class="sect2"><a href="#handling-licenses">19.1.4. Handling licenses</a></span></dt>
|
||
<dt><span class="sect2"><a href="#restricted-packages">19.1.5. Restricted packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#dependencies">19.1.6. Handling dependencies</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conflicts">19.1.7. Handling conflicts with other packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#not-building-packages">19.1.8. Packages that cannot or should not be built</a></span></dt>
|
||
<dt><span class="sect2"><a href="#undeletable-packages">19.1.9. Packages which should not be deleted, once installed</a></span></dt>
|
||
<dt><span class="sect2"><a href="#security-handling">19.1.10. Handling packages with security problems</a></span></dt>
|
||
<dt><span class="sect2"><a href="#bumping-pkgrevision">19.1.11. How to handle incrementing versions when fixing an existing package</a></span></dt>
|
||
<dt><span class="sect2"><a href="#fixes.subst">19.1.12. Substituting variable text in the package files (the SUBST framework)</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.fetch">19.2. Fixing problems in the <span class="emphasis"><em>fetch</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#no-plain-download">19.2.1. Packages whose distfiles aren't available for plain downloading</a></span></dt>
|
||
<dt><span class="sect2"><a href="#modified-distfiles-same-name">19.2.2. How to handle modified distfiles with the 'old' name</a></span></dt>
|
||
<dt><span class="sect2"><a href="#build.fetch.github">19.2.3. Packages hosted on github.com</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.configure">19.3. Fixing problems in the <span class="emphasis"><em>configure</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#fixes.libtool">19.3.1. Shared libraries - libtool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using-libtool">19.3.2. Using libtool on GNU packages that already support libtool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#autoconf-automake">19.3.3. GNU Autoconf/Automake</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#programming-languages">19.4. Programming languages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#basic-programming-languages">19.4.1. C, C++, and Fortran</a></span></dt>
|
||
<dt><span class="sect2"><a href="#java-programming-language">19.4.2. Java</a></span></dt>
|
||
<dt><span class="sect2"><a href="#perl-scripts">19.4.3. Packages containing perl scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#shell-scripts">19.4.4. Packages containing shell scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#other-programming-languages">19.4.5. Other programming languages</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.build">19.5. Fixing problems in the <span class="emphasis"><em>build</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#fixes.build.cpp">19.5.1. Compiling C and C++ code conditionally</a></span></dt>
|
||
<dt><span class="sect2"><a href="#compiler-bugs">19.5.2. How to handle compiler bugs</a></span></dt>
|
||
<dt><span class="sect2"><a href="#undefined-reference">19.5.3. Undefined reference to <span class="quote">“<span class="quote">...</span>”</span></a></span></dt>
|
||
<dt><span class="sect2"><a href="#out-of-memory">19.5.4. Running out of memory</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.install">19.6. Fixing problems in the <span class="emphasis"><em>install</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#install-scripts">19.6.1. Creating needed directories</a></span></dt>
|
||
<dt><span class="sect2"><a href="#where-to-install-documentation">19.6.2. Where to install documentation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#installing-score-files">19.6.3. Installing highscore files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#destdir-support">19.6.4. Adding DESTDIR support to packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#hardcoded-paths">19.6.5. Packages with hardcoded paths to other interpreters</a></span></dt>
|
||
<dt><span class="sect2"><a href="#perl-modules">19.6.6. Packages installing perl modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#faq.info-files">19.6.7. Packages installing info files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#manpages">19.6.8. Packages installing man pages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gconf-data-files">19.6.9. Packages installing GConf data files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#scrollkeeper-data-files">19.6.10. Packages installing scrollkeeper/rarian data files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#x11-fonts">19.6.11. Packages installing X11 fonts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gtk2-modules">19.6.12. Packages installing GTK2 modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#sgml-xml-data">19.6.13. Packages installing SGML or XML data</a></span></dt>
|
||
<dt><span class="sect2"><a href="#mime-database">19.6.14. Packages installing extensions to the MIME database</a></span></dt>
|
||
<dt><span class="sect2"><a href="#intltool">19.6.15. Packages using intltool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#startup-scripts">19.6.16. Packages installing startup scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#tex-packages">19.6.17. Packages installing TeX modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#emulation-packages">19.6.18. Packages supporting running binaries in
|
||
emulation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#hicolor-theme">19.6.19. Packages installing hicolor theme icons</a></span></dt>
|
||
<dt><span class="sect2"><a href="#desktop-files">19.6.20. Packages installing desktop files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#punting">19.7. Marking packages as having problems</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#debug">20. Debugging</a></span></dt>
|
||
<dt><span class="chapter"><a href="#submit">21. Submitting and Committing</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#submitting-binary-packages">21.1. Submitting binary packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#submitting-your-package">21.2. Submitting source packages (for non-NetBSD-developers)</a></span></dt>
|
||
<dt><span class="sect1"><a href="#general-notes-for-changes">21.3. General notes when adding, updating, or removing packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#committing-importing">21.4. Committing: Adding a package to CVS</a></span></dt>
|
||
<dt><span class="sect1"><a href="#updating-package">21.5. Updating a package to a newer version</a></span></dt>
|
||
<dt><span class="sect1"><a href="#renaming-package">21.6. Renaming a package in pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#moving-package">21.7. Moving a package in pkgsrc</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#devfaq">22. Frequently Asked Questions</a></span></dt>
|
||
<dt><span class="chapter"><a href="#gnome">23. GNOME packaging and porting</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#meta-packages">23.1. Meta packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#new-package">23.2. Packaging a GNOME application</a></span></dt>
|
||
<dt><span class="sect1"><a href="#full-update">23.3. Updating GNOME to a newer version</a></span></dt>
|
||
<dt><span class="sect1"><a href="#patching">23.4. Patching guidelines</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="creating"></a>Chapter 10. Creating a new pkgsrc package from scratch</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#creating.common">10.1. Common types of packages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#creating.perl-module">10.1.1. Perl modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#creating.kde-app">10.1.2. KDE3 applications</a></span></dt>
|
||
<dt><span class="sect2"><a href="#creating.python-module">10.1.3. Python modules and programs</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#creating.examples">10.2. Examples</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#creating.nvu">10.2.1. How the www/nvu package came into pkgsrc</a></span></dt></dl></dd>
|
||
</dl>
|
||
</div>
|
||
<p>When you find a package that is not yet in pkgsrc, you
|
||
most likely have a URL from where you can download the source
|
||
code. Starting with this URL, creating a package involves only a
|
||
few steps.</p>
|
||
<div class="procedure"><ol class="procedure" type="1">
|
||
<li class="step"><p>First, install the packages <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/url2pkg/README.html" target="_top"><code class="filename">pkgtools/url2pkg</code></a> and <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkglint/README.html" target="_top"><code class="filename">pkgtools/pkglint</code></a>.</p></li>
|
||
<li class="step"><p>Then, choose one of the top-level directories as the
|
||
category in which you want to place your package. You can also create a
|
||
directory of your own (maybe called <code class="filename">local</code>). In that
|
||
category directory, create another directory for your package and change
|
||
into it.</p></li>
|
||
<li class="step"><p>Run the program <span class="command"><strong>url2pkg</strong></span>, which will ask
|
||
you for a URL. Enter the URL of the distribution file (in most cases a
|
||
<code class="filename">.tar.gz</code> file) and watch how the basic ingredients
|
||
of your package are created automatically. The distribution file is
|
||
extracted automatically to fill in some details in the
|
||
<code class="filename">Makefile</code> that would otherwise have to be done
|
||
manually.</p></li>
|
||
<li class="step">
|
||
<p>Examine the extracted files to determine the dependencies of
|
||
your package. Ideally, this is mentioned in some
|
||
<code class="filename">README</code> file, but things may differ. For each of
|
||
these dependencies, look where it exists in pkgsrc, and if there is a
|
||
file called <code class="filename">buildlink3.mk</code> in that directory, add a
|
||
line to your package <code class="filename">Makefile</code> which includes that
|
||
file just before the last line. If the
|
||
<code class="filename">buildlink3.mk</code> file does not exist, it must be
|
||
created first. The <code class="filename">buildlink3.mk</code> file makes sure that the package's include files and libraries are provided.</p>
|
||
<p>If you just need binaries from a package, add a
|
||
<code class="varname">DEPENDS</code> line to the Makefile, which specifies the
|
||
version of the dependency and where it can be found in pkgsrc. This line
|
||
should be placed in the third paragraph. If the dependency is only
|
||
needed for building the package, but not when using it, use
|
||
<code class="varname">BUILD_DEPENDS</code> instead of <code class="varname">DEPENDS</code>.
|
||
Your package may then look like this:</p>
|
||
<pre class="programlisting">
|
||
[...]
|
||
|
||
BUILD_DEPENDS+= libxslt-[0-9]*:../../textproc/libxslt
|
||
DEPENDS+= screen-[0-9]*:../../misc/screen
|
||
DEPENDS+= screen>=4.0:../../misc/screen
|
||
|
||
[...]
|
||
|
||
.include "../../<em class="replaceable"><code>category</code></em>/<em class="replaceable"><code>package</code></em>/buildlink3.mk"
|
||
.include "../../devel/glib2/buildlink3.mk"
|
||
.include "../../mk/bsd.pkg.mk"
|
||
</pre>
|
||
</li>
|
||
<li class="step"><p>Run <span class="command"><strong>pkglint</strong></span> to see what things still need
|
||
to be done to make your package a <span class="quote">“<span class="quote">good</span>”</span> one. If you don't
|
||
know what pkglint's warnings want to tell you, try <span class="command"><strong>pkglint
|
||
--explain</strong></span> or <span class="command"><strong>pkglint
|
||
-e</strong></span>, which outputs additional
|
||
explanations.</p></li>
|
||
<li class="step"><p>In many cases the package is not yet ready to build. You can
|
||
find instructions for the most common cases in the next section, <a class="xref" href="#creating.common" title="10.1. Common types of packages">Section 10.1, “Common types of packages”</a>. After you have followed the instructions
|
||
over there, you can hopefully continue here.</p></li>
|
||
<li class="step"><p>Run <span class="command"><strong>bmake clean</strong></span> to clean the working
|
||
directory from the extracted files. Besides these files, a lot of cache
|
||
files and other system information has been saved in the working
|
||
directory, which may become wrong after you edited the
|
||
<code class="filename">Makefile</code>.</p></li>
|
||
<li class="step"><p>Now, run <span class="command"><strong>bmake</strong></span> to build the package. For
|
||
the various things that can go wrong in this phase, consult <a class="xref" href="#fixes" title="Chapter 19. Making your package work">Chapter 19, <i>Making your package work</i></a>.</p></li>
|
||
<li class="step"><p>When the package builds fine, the next step is to install
|
||
the package. Run <span class="command"><strong>bmake install</strong></span> and hope that
|
||
everything works.</p></li>
|
||
<li class="step"><p>Up to now, the file <code class="filename">PLIST</code>, which
|
||
contains a list of the files that are installed by the package, is
|
||
nearly empty. Run <span class="command"><strong>bmake print-PLIST
|
||
>PLIST</strong></span> to generate a probably correct list. Check
|
||
the file using your preferred text editor to see if the list of
|
||
files looks plausible.</p></li>
|
||
<li class="step"><p>Run <span class="command"><strong>pkglint</strong></span> again to see if the generated
|
||
<code class="filename">PLIST</code> contains garbage or not.</p></li>
|
||
<li class="step"><p>When you ran <span class="command"><strong>bmake install</strong></span>, the package
|
||
has been registered in the database of installed files, but with an
|
||
empty list of files. To fix this, run <span class="command"><strong>bmake deinstall</strong></span>
|
||
and <span class="command"><strong>bmake install</strong></span> again. Now the package is
|
||
registered with the list of files from
|
||
<code class="filename">PLIST</code>.</p></li>
|
||
<li class="step"><p>Run <span class="command"><strong>bmake package</strong></span> to create a binary
|
||
package from the set of installed files.</p></li>
|
||
</ol></div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="creating.common"></a>10.1. Common types of packages</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="creating.perl-module"></a>10.1.1. Perl modules</h3></div></div></div>
|
||
<p>Simple Perl modules are handled automatically by
|
||
<span class="command"><strong>url2pkg</strong></span>, including dependencies.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="creating.kde-app"></a>10.1.2. KDE3 applications</h3></div></div></div>
|
||
<p>KDE3 applications should always include
|
||
<code class="filename">meta-pkgs/kde3/kde3.mk</code>, which contains numerous
|
||
settings that are typical of KDE3 packages.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="creating.python-module"></a>10.1.3. Python modules and programs</h3></div></div></div>
|
||
<p>Python modules and programs packages are easily created using a
|
||
set of predefined variables.</p>
|
||
<p>
|
||
If some Python versions are not supported by the software, set the
|
||
<code class="varname">PYTHON_VERSIONS_INCOMPATIBLE</code> variable to the Python versions
|
||
that are not supported, e.g.
|
||
</p>
|
||
<pre class="programlisting">
|
||
PYTHON_VERSIONS_INCOMPATIBLE= 27
|
||
</pre>
|
||
<p>
|
||
If the packaged software is a Python module, include one of
|
||
<code class="filename">../../lang/python/egg.mk</code>,
|
||
<code class="filename">../../lang/python/distutils.mk</code>, or
|
||
<code class="filename">../../lang/python/extension.mk</code>.</p>
|
||
<p>Most Python packages use either <span class="quote">“<span class="quote">distutils</span>”</span> or
|
||
easy-setup/setuptools (<span class="quote">“<span class="quote">eggs</span>”</span>).
|
||
if the packaged software is using setuptools, you only need
|
||
to include <span class="quote">“<span class="quote"><code class="filename">../../lang/python/egg.mk</code></span>”</span>.
|
||
Otherwise, if the software uses <span class="quote">“<span class="quote">distutils</span>”</span>, include
|
||
<span class="quote">“<span class="quote"><code class="filename">../../lang/python/distutils.mk</code></span>”</span>.
|
||
so pkgsrc will use this framework.
|
||
<span class="quote">“<span class="quote">distutils</span>”</span> uses a script called <code class="filename">setup.py</code>,
|
||
if the <span class="quote">“<span class="quote">distutils</span>”</span> driver is not called
|
||
<code class="filename">setup.py</code>, set the <code class="varname">PYSETUP</code> variable
|
||
to the name of the script.</p>
|
||
<p>Either way, the package directory should be called
|
||
<span class="quote">“<span class="quote">py-software</span>”</span> and <code class="varname">PKGNAME</code> should be set to
|
||
<span class="quote">“<span class="quote">${PYPKGPREFIX}-${DISTNAME}</span>”</span>, e.g.
|
||
</p>
|
||
<pre class="programlisting">
|
||
DISTNAME= foopymodule-1.2.10
|
||
PKGNAME= ${PYPKGPREFIX}-${DISTNAME}
|
||
</pre>
|
||
<p>If it is an application, include
|
||
<span class="quote">“<span class="quote"><code class="filename">../../lang/python/application.mk</code></span>”</span>.
|
||
In order to correctly set the path to the Python interpreter, use the
|
||
<code class="varname">REPLACE_PYTHON</code> variable and set it to the list of files
|
||
(paths relative to <code class="varname">WRKSRC</code>) that must be corrected.
|
||
For example:
|
||
</p>
|
||
<pre class="programlisting">
|
||
REPLACE_PYTHON= *.py
|
||
</pre>
|
||
<p>Some Python modules have separate distributions for Python-2.x
|
||
and Python-3.x support. In pkgsrc this is handled by the
|
||
<code class="filename">versioned_dependencies.mk</code> file. Set
|
||
<code class="varname">PYTHON_VERSIONED_DEPENDENCIES</code> to the list of
|
||
packages that should be depended upon and include
|
||
<span class="quote">“<span class="quote"><code class="filename">../../lang/python/versioned_dependencies.mk</code></span>”</span>,
|
||
then the pkgsrc infrastructure will depend on the appropriate package
|
||
version. For example:
|
||
</p>
|
||
<pre class="programlisting">
|
||
PYTHON_VERSIONED_DEPENDENCIES=dateutil dns
|
||
</pre>
|
||
<p>
|
||
Look inside <code class="filename">versioned_dependencies.mk</code> for a list
|
||
of supported packages.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="creating.examples"></a>10.2. Examples</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="creating.nvu"></a>10.2.1. How the www/nvu package came into pkgsrc</h3></div></div></div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="creating.nvu.init"></a>10.2.1.1. The initial package</h4></div></div></div>
|
||
<p>Looking at the file <code class="filename">pkgsrc/doc/TODO</code>, I saw
|
||
that the <span class="quote">“<span class="quote">nvu</span>”</span> package has not yet been imported into
|
||
pkgsrc. As the description says it has to do with the web, the obvious
|
||
choice for the category is <span class="quote">“<span class="quote">www</span>”</span>.</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> mkdir www/nvu
|
||
<code class="prompt">$</code> cd www/nvu
|
||
</pre>
|
||
<p>The web site says that the sources are available as a tar file, so
|
||
I fed that URL to the <span class="command"><strong>url2pkg</strong></span> program:</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> url2pkg http://cvs.nvu.com/download/nvu-1.0-sources.tar.bz2
|
||
</pre>
|
||
<p>My editor popped up, and I added a <code class="varname">PKGNAME</code> line
|
||
below the <code class="varname">DISTNAME</code> line, as the package name should
|
||
not have the word <span class="quote">“<span class="quote">sources</span>”</span> in it. I also filled in the
|
||
<code class="varname">MAINTAINER</code>, <code class="varname">HOMEPAGE</code> and
|
||
<code class="varname">COMMENT</code> fields. Then the package
|
||
<code class="filename">Makefile</code> looked like that:</p>
|
||
<pre class="programlisting">
|
||
# $NetBSD$
|
||
#
|
||
|
||
DISTNAME= nvu-1.0-sources
|
||
PKGNAME= nvu-1.0
|
||
CATEGORIES= www
|
||
MASTER_SITES= http://cvs.nvu.com/download/
|
||
EXTRACT_SUFX= .tar.bz2
|
||
|
||
MAINTAINER= rillig@NetBSD.org
|
||
HOMEPAGE= http://cvs.nvu.com/
|
||
COMMENT= Web Authoring System
|
||
|
||
# url2pkg-marker (please do not remove this line.)
|
||
.include "../../mk/bsd.pkg.mk"
|
||
</pre>
|
||
<p>Then, I quit the editor and watched pkgsrc downloading a large
|
||
source archive:</p>
|
||
<pre class="programlisting">
|
||
url2pkg> Running "make makesum" ...
|
||
=> Required installed package digest>=20010302: digest-20060826 found
|
||
=> Fetching nvu-1.0-sources.tar.bz2
|
||
Requesting http://cvs.nvu.com/download/nvu-1.0-sources.tar.bz2
|
||
100% |*************************************| 28992 KB 150.77 KB/s00:00 ETA
|
||
29687976 bytes retrieved in 03:12 (150.77 KB/s)
|
||
url2pkg> Running "make extract" ...
|
||
=> Required installed package digest>=20010302: digest-20060826 found
|
||
=> Checksum SHA1 OK for nvu-1.0-sources.tar.bz2
|
||
=> Checksum RMD160 OK for nvu-1.0-sources.tar.bz2
|
||
work.bacc -> /tmp/roland/pkgsrc/www/nvu/work.bacc
|
||
===> Installing dependencies for nvu-1.0
|
||
===> Overriding tools for nvu-1.0
|
||
===> Extracting for nvu-1.0
|
||
url2pkg> Adjusting the Makefile.
|
||
|
||
Remember to correct CATEGORIES, HOMEPAGE, COMMENT, and DESCR when you're done!
|
||
|
||
Good luck! (See pkgsrc/doc/pkgsrc.txt for some more help :-)
|
||
</pre>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="creating.nvu.problems"></a>10.2.1.2. Fixing all kinds of problems to make the package work</h4></div></div></div>
|
||
<p>Now that the package has been extracted, let's see what's inside
|
||
it. The package has a <code class="filename">README.txt</code>, but that only
|
||
says something about mozilla, so it's probably useless for seeing what
|
||
dependencies this package has. But since there is a GNU configure script
|
||
in the package, let's hope that it will complain about everything it
|
||
needs.</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> bmake
|
||
=> Required installed package digest>=20010302: digest-20060826 found
|
||
=> Checksum SHA1 OK for nvu-1.0-sources.tar.bz2
|
||
=> Checksum RMD160 OK for nvu-1.0-sources.tar.bz2
|
||
===> Patching for nvu-1.0
|
||
===> Creating toolchain wrappers for nvu-1.0
|
||
===> Configuring for nvu-1.0
|
||
[...]
|
||
configure: error: Perl 5.004 or higher is required.
|
||
[...]
|
||
WARNING: Please add USE_TOOLS+=perl to the package Makefile.
|
||
[...]
|
||
</pre>
|
||
<p>That worked quite well. So I opened the package Makefile in my
|
||
editor, and since it already has a <code class="varname">USE_TOOLS</code> line, I
|
||
just appended <span class="quote">“<span class="quote">perl</span>”</span> to it. Since the dependencies of the
|
||
package have changed now, and since a perl wrapper is automatically
|
||
installed in the <span class="quote">“<span class="quote">tools</span>”</span> phase, I need to build the package
|
||
from scratch.</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> bmake clean
|
||
===> Cleaning for nvu-1.0
|
||
<code class="prompt">$</code> bmake
|
||
[...]
|
||
*** /tmp/roland/pkgsrc/www/nvu/work.bacc/.tools/bin/make is not \
|
||
GNU Make. You will not be able to build Mozilla without GNU Make.
|
||
[...]
|
||
</pre>
|
||
<p>So I added <span class="quote">“<span class="quote">gmake</span>”</span> to the
|
||
<code class="varname">USE_TOOLS</code> line and tried again (from scratch).</p>
|
||
<pre class="programlisting">
|
||
[...]
|
||
checking for GTK - version >= 1.2.0... no
|
||
*** Could not run GTK test program, checking why...
|
||
[...]
|
||
</pre>
|
||
<p>Now to the other dependencies. The first question is: Where is the
|
||
GTK package hidden in pkgsrc?</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> echo ../../*/gtk*
|
||
[many packages ...]
|
||
<code class="prompt">$</code> echo ../../*/gtk
|
||
../../x11/gtk
|
||
<code class="prompt">$</code> echo ../../*/gtk2
|
||
../../x11/gtk2
|
||
<code class="prompt">$</code> echo ../../*/gtk2/bui*
|
||
../../x11/gtk2/buildlink3.mk
|
||
</pre>
|
||
<p>The first try was definitely too broad. The second one had exactly
|
||
one result, which is very good. But there is one pitfall with GNOME
|
||
packages. Before GNOME 2 had been released, there were already many
|
||
GNOME 1 packages in pkgsrc. To be able to continue to use these
|
||
packages, the GNOME 2 packages were imported as separate packages, and
|
||
their names usually have a <span class="quote">“<span class="quote">2</span>”</span> appended. So I checked
|
||
whether this was the case here, and indeed it was.</p>
|
||
<p>Since the GTK2 package has a <code class="filename">buildlink3.mk</code>
|
||
file, adding the dependency is very easy. I just inserted an
|
||
<code class="literal">.include</code> line before the last line of the package
|
||
<code class="filename">Makefile</code>, so that it now looks like this:</p>
|
||
<pre class="programlisting">
|
||
[...]
|
||
.include "../../x11/gtk2/buildlink3.mk"
|
||
.include "../../mk/bsd.pkg.mk
|
||
</pre>
|
||
<p>After another <span class="command"><strong>bmake clean && bmake</strong></span>, the answer
|
||
was:</p>
|
||
<pre class="programlisting">
|
||
[...]
|
||
checking for gtk-config... /home/roland/pkg/bin/gtk-config
|
||
checking for GTK - version >= 1.2.0... no
|
||
*** Could not run GTK test program, checking why...
|
||
*** The test program failed to compile or link. See the file config.log for the
|
||
*** exact error that occured. This usually means GTK was incorrectly installed
|
||
*** or that you have moved GTK since it was installed. In the latter case, you
|
||
*** may want to edit the gtk-config script: /home/roland/pkg/bin/gtk-config
|
||
configure: error: Test for GTK failed.
|
||
[...]
|
||
</pre>
|
||
<p>In this particular case, the assumption that <span class="quote">“<span class="quote">every package
|
||
prefers GNOME 2</span>”</span> had been wrong. The first of the lines above
|
||
told me that this package really wanted to have the GNOME 1 version of
|
||
GTK. If the package had looked for GTK2, it would have looked for
|
||
<span class="command"><strong>pkg-config</strong></span> instead of <span class="command"><strong>gtk-config</strong></span>.
|
||
So I changed the <code class="literal">x11/gtk2</code> to
|
||
<code class="literal">x11/gtk</code> in the package <code class="filename">Makefile</code>,
|
||
and tried again.</p>
|
||
<pre class="programlisting">
|
||
[...]
|
||
cc -o xpidl.o -c -DOSTYPE=\"NetBSD3\" -DOSARCH=\"NetBSD\" [...]
|
||
In file included from xpidl.c:42:
|
||
xpidl.h:53:24: libIDL/IDL.h: No such file or directory
|
||
In file included from xpidl.c:42:
|
||
xpidl.h:132: error: parse error before "IDL_ns"
|
||
[...]
|
||
</pre>
|
||
<p>The package still does not find all of its dependencies. Now the
|
||
question is: Which package provides the
|
||
<code class="filename">libIDL/IDL.h</code> header file?</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> echo ../../*/*idl*
|
||
../../devel/py-idle ../../wip/idled ../../x11/acidlaunch
|
||
<code class="prompt">$</code> echo ../../*/*IDL*
|
||
../../net/libIDL
|
||
</pre>
|
||
<p>Let's take the one from the second try. So I included the
|
||
<code class="filename">../../net/libIDL/buildlink3.mk</code> file and tried
|
||
again. But the error didn't change. After digging through some of the
|
||
code, I concluded that the build process of the package was broken and
|
||
couldn't have ever worked, but since the Mozilla source tree is quite
|
||
large, I didn't want to fix it. So I added the following to the package
|
||
<code class="filename">Makefile</code> and tried again:</p>
|
||
<pre class="programlisting">
|
||
CPPFLAGS+= -I${BUILDLINK_PREFIX.libIDL}/include/libIDL-2.0
|
||
BUILDLINK_TRANSFORM+= -l:IDL:IDL-2
|
||
</pre>
|
||
<p>The latter line is needed because the package expects the library
|
||
<code class="filename">libIDL.so</code>, but only
|
||
<code class="filename">libIDL-2.so</code> is available. So I told the compiler
|
||
wrapper to rewrite that on the fly.</p>
|
||
<p>The next problem was related to a recent change of the FreeType
|
||
interface. I looked up in <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/www/seamonkey/README.html" target="_top"><code class="filename">www/seamonkey</code></a>
|
||
which patch files were relevant for this issue and copied them to the
|
||
<code class="filename">patches</code> directory. Then I retried, fixed the
|
||
patches so that they applied cleanly and retried again. This time,
|
||
everything worked.</p>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="creating.nvu.inst"></a>10.2.1.3. Installing the package</h4></div></div></div>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> bmake CHECK_FILES=no install
|
||
[...]
|
||
<code class="prompt">$</code> bmake print-PLIST >PLIST
|
||
<code class="prompt">$</code> bmake deinstall
|
||
<code class="prompt">$</code> bmake install
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="components"></a>Chapter 11. Package components - files, directories and contents</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#components.Makefile">11.1. <code class="filename">Makefile</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.distinfo">11.2. <code class="filename">distinfo</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.patches">11.3. patches/*</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#components.patch.structure">11.3.1. Structure of a single patch file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.caveats">11.3.2. Creating patch files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.sources">11.3.3. Sources where the patch files come from</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.guidelines">11.3.4. Patching guidelines</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.patches.feedback">11.3.5. Feedback to the author</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#other-mandatory-files">11.4. Other mandatory files</a></span></dt>
|
||
<dt><span class="sect1"><a href="#components.optional">11.5. Optional files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#components.optional.bin">11.5.1. Files affecting the binary package</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.optional.build">11.5.2. Files affecting the build process</a></span></dt>
|
||
<dt><span class="sect2"><a href="#components.optional.none">11.5.3. Files affecting nothing at all</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#work-dir">11.6. <code class="filename">work*</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#files-dir">11.7. <code class="filename">files/*</code></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">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="components.Makefile"></a>11.1. <code class="filename">Makefile</code>
|
||
</h2></div></div></div>
|
||
<p>Building, installation and creation of a binary package are all
|
||
controlled by the package's <code class="filename">Makefile</code>.
|
||
The <code class="filename">Makefile</code> describes various things about
|
||
a package, for example from where to get it, how to configure,
|
||
build, and install it.</p>
|
||
<p>A package <code class="filename">Makefile</code> contains several
|
||
sections that describe the package.</p>
|
||
<p>In the first section there are the following variables, which
|
||
should appear exactly in the order given here. The order and
|
||
grouping of the variables is mostly historical and has no further
|
||
meaning.</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">DISTNAME</code> is the basename of the
|
||
distribution file to be downloaded from the package's
|
||
website.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKGNAME</code> is the name of the
|
||
package, as used by pkgsrc. You need to provide it if
|
||
<code class="varname">DISTNAME</code> (which is the default) is not a good
|
||
name for the package in pkgsrc or <code class="varname">DISTNAME</code> is not
|
||
provided (no distribution file is required). Usually it is the pkgsrc
|
||
directory name together with the version number. It must match the
|
||
regular expression
|
||
<code class="varname">^[A-Za-z0-9][A-Za-z0-9-_.+]*$</code>, that is, it
|
||
starts with a letter or digit, and contains only letters, digits,
|
||
dashes, underscores, dots and plus signs.</p></li>
|
||
<li class="listitem">
|
||
<p><code class="varname">CATEGORIES</code> is a list of categories
|
||
which the package fits in. You can choose any of the top-level
|
||
directories of pkgsrc for it.</p>
|
||
<p>Currently the following values are available for
|
||
<code class="varname">CATEGORIES</code>. 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>
|
||
</li>
|
||
<li class="listitem"><p><code class="varname">MASTER_SITES</code>,
|
||
<code class="varname">DYNAMIC_MASTER_SITES</code>,
|
||
<code class="varname">DIST_SUBDIR</code>, <code class="varname">EXTRACT_SUFX</code>
|
||
and <code class="varname">DISTFILES</code> are discussed in detail in
|
||
<a class="xref" href="#build.fetch" title="17.5. The fetch phase">Section 17.5, “The <span class="emphasis"><em>fetch</em></span> phase”</a>.</p></li>
|
||
</ul></div>
|
||
<p>The second section contains information about separately
|
||
downloaded patches, if any.
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">PATCHFILES</code>:
|
||
Name(s) of additional files that contain distribution patches.
|
||
There is no default. pkgsrc will look for them at
|
||
<code class="varname">PATCH_SITES</code>.
|
||
They will automatically be uncompressed before patching if
|
||
the names end with <code class="filename">.gz</code> or
|
||
<code class="filename">.Z</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">PATCH_SITES</code>:
|
||
Primary location(s) for distribution patch files (see
|
||
<code class="varname">PATCHFILES</code> above) if not found locally.</p></li>
|
||
<li class="listitem"><p><code class="varname">PATCH_DIST_STRIP</code>:
|
||
an argument to <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?patch+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">patch</span>(1)</span></a> that sets the pathname strip count to
|
||
help find the correct files to patch. It defaults to
|
||
<span class="command"><strong>-p0</strong></span>.</p></li>
|
||
</ul></div>
|
||
<p>The third section contains the following variables.
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">MAINTAINER</code> is the email
|
||
address of the person who feels responsible for this package,
|
||
and who is most likely to look at problems or questions regarding
|
||
this package which have been reported with <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?send-pr+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">send-pr</span>(1)</span></a>.
|
||
Other developers may contact the <code class="varname">MAINTAINER</code>
|
||
before making changes to the package, but are not required to
|
||
do so. When packaging a new program, set <code class="varname">MAINTAINER</code>
|
||
to yourself. If you really can't maintain the package for future
|
||
updates, set it to
|
||
<code class="email"><<a class="email" href="mailto:pkgsrc-users@NetBSD.org">pkgsrc-users@NetBSD.org</a>></code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">OWNER</code> should be used instead
|
||
of <code class="varname">MAINTAINER</code> when you do not want other
|
||
developers to update or change the package without contacting
|
||
you first. A package Makefile should contain one of
|
||
<code class="varname">MAINTAINER</code> or <code class="varname">OWNER</code>, but
|
||
not both. </p></li>
|
||
<li class="listitem"><p><code class="varname">HOMEPAGE</code> is a URL where users can
|
||
find more information about the package.</p></li>
|
||
<li class="listitem"><p><code class="varname">COMMENT</code> is a one-line
|
||
description of the package (should not include the package
|
||
name).</p></li>
|
||
</ul></div>
|
||
<p>Other variables that affect the build:
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||
<p><code class="varname">WRKSRC</code>: The directory where the
|
||
interesting distribution files of the package are found. The
|
||
default is <code class="filename">${WRKDIR}/${DISTNAME}</code>, which
|
||
works for most packages.</p>
|
||
<p>If a package doesn't create a subdirectory for itself
|
||
(most GNU software does, for instance), but extracts itself in
|
||
the current directory, you should set
|
||
<code class="varname">WRKSRC=${WRKDIR}</code>.</p>
|
||
<p>If a package doesn't create a subdirectory with the
|
||
name of <code class="varname">DISTNAME</code> but some different name,
|
||
set <code class="varname">WRKSRC</code> to point to the proper name in
|
||
<code class="filename">${WRKDIR}</code>, for example
|
||
<code class="varname">WRKSRC=${WRKDIR}/${DISTNAME}/unix</code>. See
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/lang/tcl/README.html" target="_top"><code class="filename">lang/tcl</code></a> and <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/x11/tk/README.html" target="_top"><code class="filename">x11/tk</code></a> for other examples.</p>
|
||
<p>The name of the working directory created by pkgsrc is
|
||
taken from the <code class="varname">WRKDIR_BASENAME</code>
|
||
variable. By default, its value is
|
||
<code class="filename">work</code>. If you want to use the same
|
||
pkgsrc tree for building different kinds of binary packages,
|
||
you can change the variable according to your needs. Two
|
||
other variables handle common cases of setting
|
||
<code class="varname">WRKDIR_BASENAME</code> individually. If
|
||
<code class="varname">OBJHOSTNAME</code> is defined in
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>, the first component of
|
||
the host's name is attached to the directory name. If
|
||
<code class="varname">OBJMACHINE</code> is defined, the platform name
|
||
is attached, which might look like
|
||
<code class="filename">work.i386</code> or
|
||
<code class="filename">work.sparc</code>.</p>
|
||
</li></ul></div>
|
||
<p>Please pay attention to the following gotchas:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Add <code class="varname">MANCOMPRESSED</code> if man pages are
|
||
installed in compressed form by the package. For packages using
|
||
BSD-style makefiles which honor MANZ, there is
|
||
<code class="varname">MANCOMPRESSED_IF_MANZ</code>.</p></li>
|
||
<li class="listitem"><p>Replace <code class="filename">/usr/local</code> with
|
||
<span class="quote">“<span class="quote">${PREFIX}</span>”</span> in all files (see patches,
|
||
below).</p></li>
|
||
<li class="listitem"><p>If the package installs any info files, see <a class="xref" href="#faq.info-files" title="19.6.7. Packages installing info files">Section 19.6.7, “Packages installing info files”</a>.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="components.distinfo"></a>11.2. <code class="filename">distinfo</code>
|
||
</h2></div></div></div>
|
||
<p>The <code class="filename">distinfo</code> file contains the message
|
||
digest, or checksum, of each distfile needed for the package. This
|
||
ensures that the distfiles retrieved from the Internet have not been
|
||
corrupted during transfer or altered by a malign force to introduce
|
||
a security hole. Due to recent rumor about weaknesses of digest
|
||
algorithms, all distfiles are protected using both SHA1 and RMD160
|
||
message digests, as well as the file size.</p>
|
||
<p>The <code class="filename">distinfo</code> file also contains the
|
||
checksums for all the patches found in the
|
||
<code class="filename">patches</code> directory (see <a class="xref" href="#components.patches" title="11.3. patches/*">Section 11.3, “patches/*”</a>).</p>
|
||
<p>To regenerate the <code class="filename">distinfo</code> file, use the
|
||
<span class="command"><strong>make makedistinfo</strong></span> or <span class="command"><strong>make mdi</strong></span>
|
||
command.</p>
|
||
<p>Some packages have different sets of distfiles depending on
|
||
the platform, for example <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/lang/openjdk7/README.html" target="_top"><code class="filename">lang/openjdk7</code></a>. These are kept in the same
|
||
<code class="filename">distinfo</code> file and care should be taken when
|
||
upgrading such a package to ensure distfile information is not
|
||
lost.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="components.patches"></a>11.3. patches/*</h2></div></div></div>
|
||
<p>Many packages still don't work out-of-the box on the various
|
||
platforms that are supported by pkgsrc. Therefore, a number of custom
|
||
patch files are needed to make the package work. These patch files are
|
||
found in the <code class="filename">patches/</code> directory.</p>
|
||
<p>In the <span class="emphasis"><em>patch</em></span> phase, these patches are
|
||
applied to the files in <code class="varname">WRKSRC</code> directory after
|
||
extracting them, in <a class="ulink" href="http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_13_03" target="_top">alphabetic
|
||
order</a>.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="components.patch.structure"></a>11.3.1. Structure of a single patch file</h3></div></div></div>
|
||
<p>The <code class="filename">patch-*</code> files should be in
|
||
<span class="command"><strong>diff -bu</strong></span> format, and apply without a fuzz to avoid
|
||
problems. (To force patches to apply with fuzz you can set
|
||
<code class="varname">PATCH_FUZZ_FACTOR=-F2</code>). Furthermore, each patch
|
||
should contain only changes for a single file, and no file should be
|
||
patched by more than one patch file. This helps to keep future
|
||
modifications simple.</p>
|
||
<p>Each patch file is structured as follows: In the first line,
|
||
there is the RCS Id of the patch itself. The second line should be
|
||
empty for aesthetic reasons. After that, there should be a comment for
|
||
each change that the patch does. There are a number of standard
|
||
cases:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Patches for commonly known vulnerabilities should
|
||
mention the vulnerability ID (CAN, CVE).</p></li>
|
||
<li class="listitem"><p>Patches that change source code should mention the
|
||
platform and other environment (for example, the compiler) that the
|
||
patch is needed for.</p></li>
|
||
</ul></div>
|
||
<p>In all, the patch should be commented so that any
|
||
developer who knows the code of the application can make some use of
|
||
the patch. Special care should be taken for the upstream developers,
|
||
since we generally want that they accept our patches, so we have less
|
||
work in the future.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="components.patches.caveats"></a>11.3.2. Creating patch files</h3></div></div></div>
|
||
<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 class="command"><strong>pkgdiff</strong></span> command from the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgdiff/README.html" target="_top"><code class="filename">pkgtools/pkgdiff</code></a> package to avoid these
|
||
problems.</p>
|
||
<p>For even more automation, we recommend using
|
||
<span class="command"><strong>mkpatches</strong></span> from the same package to make a
|
||
whole set of patches. You just have to backup files before you
|
||
edit them to <code class="filename">filename.orig</code>, e.g. with
|
||
<span class="command"><strong>cp -p filename filename.orig</strong></span> or, easier, by
|
||
using <span class="command"><strong>pkgvi</strong></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 class="command"><strong>patchdiff</strong></span>. The files in <code class="filename">patches</code>
|
||
are replaced by new files, so carefully check if you want to take all
|
||
the changes.</p>
|
||
<p>When you have finished a package, remember to generate
|
||
the checksums for the patch files by using the <span class="command"><strong>make
|
||
makepatchsum</strong></span> command, see <a class="xref" href="#components.distinfo" title="11.2. distinfo">Section 11.2, “<code class="filename">distinfo</code>”</a>.</p>
|
||
<p>When adding a patch that corrects a problem in the
|
||
distfile (rather than e.g. enforcing pkgsrc's view of where
|
||
man pages should go), send the patch as a bug report to the
|
||
maintainer. This benefits non-pkgsrc users of the package,
|
||
and usually makes it possible to remove the patch in future
|
||
version.</p>
|
||
<p>The file names of the patch files are usually of the form
|
||
<code class="filename">patch-<em class="replaceable"><code>path_to_file__with__underscores.c</code></em></code>.
|
||
Many packages still use the previous convention
|
||
<code class="filename">patch-<em class="replaceable"><code>[a-z][a-z]</code></em></code>,
|
||
but new patches should be of the form containing the filename.
|
||
<span class="command"><strong>mkpatches</strong></span> included in <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgdiff/README.html" target="_top"><code class="filename">pkgtools/pkgdiff</code></a> takes care of the name
|
||
automatically.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="components.patches.sources"></a>11.3.3. Sources where the patch files come from</h3></div></div></div>
|
||
<p>If you want to share patches between multiple packages
|
||
in pkgsrc, e.g. because they use the same distfiles, set
|
||
<code class="varname">PATCHDIR</code> to the path where the patch files
|
||
can be found, e.g.:</p>
|
||
<pre class="programlisting">
|
||
PATCHDIR= ${.CURDIR}/../xemacs/patches
|
||
</pre>
|
||
<p>Patch files that are distributed by the author or other
|
||
maintainers can be listed in
|
||
<code class="varname">PATCHFILES</code>.</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 <code class="filename">$LOCALPATCHES</code> directory. The
|
||
directory tree there is expected to have the same
|
||
<span class="quote">“<span class="quote">category/package</span>”</span> structure as pkgsrc, and
|
||
patches are expected to be stored inside these dirs (also
|
||
known as <code class="filename">$LOCALPATCHES/$PKGPATH</code>). For
|
||
example, if you want to keep a private patch for
|
||
<code class="filename">pkgsrc/graphics/png</code>, keep it in
|
||
<code class="filename">$LOCALPATCHES/graphics/png/mypatch</code>. 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="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="components.patches.guidelines"></a>11.3.4. Patching guidelines</h3></div></div></div>
|
||
<p>When fixing a portability issue in the code do not use
|
||
preprocessor magic to check for the current operating system nor
|
||
platform. Doing so hurts portability to other platforms because
|
||
the OS-specific details are not abstracted appropriately.</p>
|
||
<p>The general rule to follow is: instead of checking for the
|
||
operating system the application is being built on, check for the
|
||
specific <span class="emphasis"><em>features</em></span> you need. For example,
|
||
instead of assuming that kqueue is available under NetBSD and
|
||
using the <code class="varname">__NetBSD__</code> macro to conditionalize
|
||
kqueue support, add a check that detects kqueue itself —
|
||
yes, this generally involves patching the
|
||
<span class="command"><strong>configure</strong></span> script. There is absolutely nothing
|
||
that prevents some OSes from adopting interfaces from other OSes
|
||
(e.g. Linux implementing kqueue), something that the above checks
|
||
cannot take into account.</p>
|
||
<p>Of course, checking for features generally involves more
|
||
work on the developer's side, but the resulting changes are
|
||
cleaner and there are chances they will work on many other
|
||
platforms. Not to mention that there are higher chances of being
|
||
later integrated into the mainstream sources. Remember:
|
||
<span class="emphasis"><em>It doesn't work unless it is right!</em></span></p>
|
||
<p>Some typical examples:</p>
|
||
<div class="table">
|
||
<a name="patch-examples"></a><p class="title"><b>Table 11.1. Patching examples</b></p>
|
||
<div class="table-contents"><table class="table" summary="Patching examples" border="1">
|
||
<colgroup>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
</colgroup>
|
||
<thead><tr>
|
||
<th>Where</th>
|
||
<th>Incorrect</th>
|
||
<th>Correct</th>
|
||
</tr></thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>configure script</td>
|
||
<td>
|
||
<pre class="programlisting">
|
||
case ${target_os} in
|
||
netbsd*) have_kvm=yes ;;
|
||
*) have_kvm=no ;;
|
||
esac
|
||
</pre>
|
||
</td>
|
||
<td>
|
||
<pre class="programlisting">
|
||
AC_CHECK_LIB(kvm, kvm_open, have_kvm=yes, have_kvm=no)
|
||
</pre>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>C source file</td>
|
||
<td>
|
||
<pre class="programlisting">
|
||
#if defined(__NetBSD__)
|
||
# include <sys/event.h>
|
||
#endif
|
||
</pre>
|
||
</td>
|
||
<td>
|
||
<pre class="programlisting">
|
||
#if defined(HAVE_SYS_EVENT_H)
|
||
# include <sys/event.h>
|
||
#endif
|
||
</pre>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>C source file</td>
|
||
<td>
|
||
<pre class="programlisting">
|
||
int
|
||
monitor_file(...)
|
||
{
|
||
#if defined(__NetBSD__)
|
||
int fd = kqueue();
|
||
...
|
||
#else
|
||
...
|
||
#endif
|
||
}
|
||
</pre>
|
||
</td>
|
||
<td>
|
||
<pre class="programlisting">
|
||
int
|
||
monitor_file(...)
|
||
{
|
||
#if defined(HAVE_KQUEUE)
|
||
int fd = kqueue();
|
||
...
|
||
#else
|
||
...
|
||
#endif
|
||
}
|
||
</pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table></div>
|
||
</div>
|
||
<br class="table-break"><p>For more information, please read the <span class="emphasis"><em>Making
|
||
packager-friendly software</em></span> article (<a class="ulink" href="http://www.onlamp.com/pub/a/onlamp/2005/03/31/packaging.html" target="_top">part
|
||
1</a>, <a class="ulink" href="http://www.oreillynet.com/pub/a/onlamp/2005/04/28/packaging2.html" target="_top">part
|
||
2</a>). It summarizes multiple details on how to make
|
||
software easier to package; all the suggestions in it were
|
||
collected from our experience in pkgsrc work, so they are possibly
|
||
helpful when creating patches too.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="components.patches.feedback"></a>11.3.5. Feedback to the author</h3></div></div></div>
|
||
<p>Always, always, <span class="strong"><strong>always</strong></span>
|
||
feed back any <span class="emphasis"><em>portability fixes</em></span> or
|
||
improvements you do to a package to the mainstream developers.
|
||
This is the only way to get their attention on portability issues
|
||
and to ensure that future versions can be built out-of-the box on
|
||
NetBSD. Furthermore, any user that gets newer distfiles will get
|
||
the fixes straight from the packaged code.</p>
|
||
<p>This generally involves cleaning up the patches
|
||
(because sometimes the patches that are
|
||
added to pkgsrc are quick hacks), filing bug reports in the
|
||
appropriate trackers for the projects and working with the
|
||
mainstream authors to accept your changes. It is
|
||
<span class="emphasis"><em>extremely important</em></span> that you do it so that
|
||
the packages in pkgsrc are kept simple and thus further changes
|
||
can be done without much hassle.</p>
|
||
<p>When you have done this, please add a URL to the upstream
|
||
bug report to the patch comment.</p>
|
||
<p>Support the idea of free software!</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="other-mandatory-files"></a>11.4. Other mandatory files</h2></div></div></div>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="filename">DESCR</code></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"><code class="filename">PLIST</code></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 class="xref" href="#plist" title="Chapter 13. PLIST issues">Chapter 13, <i>PLIST issues</i></a> for more
|
||
information.</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="components.optional"></a>11.5. Optional files</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="components.optional.bin"></a>11.5.1. Files affecting the binary package</h3></div></div></div>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="filename">INSTALL</code></span></dt>
|
||
<dd>
|
||
<p>This shell script is invoked twice by <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-5.0.1+i386"><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
|
||
<code class="filename">PLIST</code>. See <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_add</span>(1)</span></a> and
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_create+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_create</span>(1)</span></a> for more information. See also <a class="xref" href="#files-and-dirs-outside-prefix" title="15.1. Files and directories outside the installation prefix">Section 15.1, “Files and directories outside the installation prefix”</a>.
|
||
Please note that you can modify variables in it easily by using
|
||
<code class="varname">FILES_SUBST</code> in the package's
|
||
<code class="filename">Makefile</code>:</p>
|
||
<pre class="programlisting">
|
||
FILES_SUBST+= SOMEVAR="somevalue"
|
||
</pre>
|
||
<p>replaces "@SOMEVAR@" with <span class="quote">“<span class="quote">somevalue</span>”</span> in the
|
||
<code class="filename">INSTALL</code>. By default, substitution is
|
||
performed for <code class="varname">PREFIX</code>,
|
||
<code class="varname">LOCALBASE</code>, <code class="varname">X11BASE</code>,
|
||
<code class="varname">VARBASE</code>, and a few others, type
|
||
<span class="command"><strong>make help topic=FILES_SUBST</strong></span> for a
|
||
complete list.</p>
|
||
</dd>
|
||
<dt><span class="term"><code class="filename">DEINSTALL</code></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 class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_delete</span>(1)</span></a>
|
||
and <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_create+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_create</span>(1)</span></a> for more information.
|
||
The same methods to replace variables can be used as for
|
||
the <code class="filename">INSTALL</code> file.</p></dd>
|
||
<dt><span class="term"><code class="filename">MESSAGE</code></span></dt>
|
||
<dd>
|
||
<p>This file is displayed 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
|
||
<code class="varname">MESSAGE_SUBST</code> in the package's
|
||
<code class="filename">Makefile</code>:</p>
|
||
<pre class="programlisting">
|
||
MESSAGE_SUBST+= SOMEVAR="somevalue"
|
||
</pre>
|
||
<p>replaces "${SOMEVAR}" with <span class="quote">“<span class="quote">somevalue</span>”</span> in
|
||
<code class="filename">MESSAGE</code>. By default, substitution is
|
||
performed for <code class="varname">PKGNAME</code>,
|
||
<code class="varname">PKGBASE</code>, <code class="varname">PREFIX</code>,
|
||
<code class="varname">LOCALBASE</code>, <code class="varname">X11BASE</code>,
|
||
<code class="varname">PKG_SYSCONFDIR</code>,
|
||
<code class="varname">ROOT_GROUP</code>, and
|
||
<code class="varname">ROOT_USER</code>.</p>
|
||
<p>You can display a different or additional files by
|
||
setting the <code class="varname">MESSAGE_SRC</code> variable. Its
|
||
default is <code class="filename">MESSAGE</code>, if the file
|
||
exists.</p>
|
||
</dd>
|
||
<dt><span class="term"><code class="filename">ALTERNATIVES</code></span></dt>
|
||
<dd>
|
||
<p>This file is used by the alternatives framework.
|
||
It creates, configures, and destroys generic wrappers used to
|
||
run programs with similar interfaces.
|
||
See pkg_alternatives(8) from pkgtools/pkg_alternatives
|
||
for more information.</p>
|
||
<p>Each line of the file contains two filenames, first
|
||
the wrapper and then the alternative provided by the package.
|
||
Both paths are relative to <code class="varname">PREFIX</code>.</p>
|
||
</dd>
|
||
</dl></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="components.optional.build"></a>11.5.2. Files affecting the build process</h3></div></div></div>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="filename">Makefile.common</code></span></dt>
|
||
<dd><p>This file contains arbitrary things that could
|
||
also go into a <code class="filename">Makefile</code>, but its purpose is
|
||
to be used by more than one package. This file should only be
|
||
used when the packages that will use the file are known in
|
||
advance. For other purposes it is often better to write a
|
||
<code class="filename">*.mk</code> file and give it a good name that
|
||
describes what it does.</p></dd>
|
||
<dt><span class="term"><code class="filename">buildlink3.mk</code></span></dt>
|
||
<dd><p>This file contains the dependency information
|
||
for the buildlink3 framework (see <a class="xref" href="#buildlink" title="Chapter 14. Buildlink methodology">Chapter 14, <i>Buildlink methodology</i></a>).</p></dd>
|
||
<dt><span class="term"><code class="filename">hacks.mk</code></span></dt>
|
||
<dd><p>This file contains workarounds for compiler bugs
|
||
and similar things. It is included automatically by the pkgsrc
|
||
infrastructure, so you don't need an extra
|
||
<code class="literal">.include</code> line for
|
||
it.</p></dd>
|
||
<dt><span class="term"><code class="filename">options.mk</code></span></dt>
|
||
<dd><p>This file contains the code for the
|
||
package-specific options (see <a class="xref" href="#options" title="Chapter 16. Options handling">Chapter 16, <i>Options handling</i></a>) that can be
|
||
selected by the user. If a package has only one or two options,
|
||
it is equally acceptable to put the code directly into the
|
||
<code class="filename">Makefile</code>.</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="components.optional.none"></a>11.5.3. Files affecting nothing at all</h3></div></div></div>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="filename">README*</code></span></dt>
|
||
<dd><p>These files do not take place in the creation of
|
||
a package and thus are purely informative to the package
|
||
developer.</p></dd>
|
||
<dt><span class="term"><code class="filename">TODO</code></span></dt>
|
||
<dd><p>This file contains things that need to be done
|
||
to make the package even
|
||
better.</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="work-dir"></a>11.6. <code class="filename">work*</code>
|
||
</h2></div></div></div>
|
||
<p>When you type <span class="command"><strong>make</strong></span>, the distribution files are
|
||
unpacked into the directory denoted by
|
||
<code class="varname">WRKDIR</code>. It can be removed by running
|
||
<span class="command"><strong>make clean</strong></span>. Besides the sources, this
|
||
directory is also used to keep various timestamp files.
|
||
The directory gets <span class="emphasis"><em>removed completely</em></span> on clean.
|
||
The default is <code class="filename">${.CURDIR}/work</code>
|
||
or <code class="filename">${.CURDIR}/work.${MACHINE_ARCH}</code>
|
||
if <code class="varname">OBJMACHINE</code> is set.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="files-dir"></a>11.7. <code class="filename">files/*</code>
|
||
</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="command"><strong>${CP}</strong></span> command in the
|
||
<span class="quote">“<span class="quote">pre-configure</span>”</span> target to achieve
|
||
this. Alternatively, you could simply diff the file against
|
||
<code class="filename">/dev/null</code> and use the patch mechanism to manage
|
||
the creation of this file.</p>
|
||
<p>If you want to share files in this way with other
|
||
packages, set the <code class="varname">FILESDIR</code> variable to point
|
||
to the other package's <code class="filename">files</code> directory,
|
||
e.g.:</p>
|
||
<pre class="programlisting">
|
||
FILESDIR=${.CURDIR}/../xemacs/files
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="makefile"></a>Chapter 12. Programming in <code class="filename">Makefile</code>s</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#makefile.style">12.1. Caveats</a></span></dt>
|
||
<dt><span class="sect1"><a href="#makefile.variables">12.2. <code class="filename">Makefile</code> variables</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#makefile.variables.names">12.2.1. Naming conventions</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#makefile.code">12.3. Code snippets</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#adding-to-list">12.3.1. Adding things to a list</a></span></dt>
|
||
<dt><span class="sect2"><a href="#converting-internal-to-external">12.3.2. Converting an internal list into an external list</a></span></dt>
|
||
<dt><span class="sect2"><a href="#passing-variable-to-shell">12.3.3. Passing variables to a shell command</a></span></dt>
|
||
<dt><span class="sect2"><a href="#quoting-guideline">12.3.4. Quoting guideline</a></span></dt>
|
||
<dt><span class="sect2"><a href="#bsd-make-bug-workaround">12.3.5. Workaround for a bug in BSD Make</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
<p>Pkgsrc consists of many <code class="filename">Makefile</code> fragments,
|
||
each of which forms a well-defined part of the pkgsrc system. Using
|
||
the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> system as a programming language for a big system
|
||
like pkgsrc requires some discipline to keep the code correct and
|
||
understandable.</p>
|
||
<p>The basic ingredients for <code class="filename">Makefile</code>
|
||
programming are variables (which are actually macros) and shell
|
||
commands. Among these shell commands may even be more complex ones
|
||
like <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?awk+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">awk</span>(1)</span></a> programs. To make sure that every shell command runs
|
||
as intended it is necessary to quote all variables correctly when they
|
||
are used.</p>
|
||
<p>This chapter describes some patterns, that appear quite often in
|
||
<code class="filename">Makefile</code>s, including the pitfalls that come along
|
||
with them.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="makefile.style"></a>12.1. Caveats</h2></div></div></div>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||
<p>When you are creating a file as a
|
||
target of a rule, always write the data to a temporary file first
|
||
and finally rename that file. Otherwise there might occur an error
|
||
in the middle of generating the file, and when the user runs
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> for the second time, the file exists and will not be
|
||
regenerated properly. Example:</p>
|
||
<pre class="programlisting">
|
||
wrong:
|
||
@echo "line 1" > ${.TARGET}
|
||
@echo "line 2" >> ${.TARGET}
|
||
@false
|
||
|
||
correct:
|
||
@echo "line 1" > ${.TARGET}.tmp
|
||
@echo "line 2" >> ${.TARGET}.tmp
|
||
@false
|
||
@mv ${.TARGET}.tmp ${.TARGET}
|
||
</pre>
|
||
<p>When you run <span class="command"><strong>make wrong</strong></span> twice, the file
|
||
<code class="filename">wrong</code> will exist, although there was an error
|
||
message in the first run. On the other hand, running <span class="command"><strong>make
|
||
correct</strong></span> gives an error message twice, as expected.</p>
|
||
<p>You might remember that <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> sometimes removes
|
||
<code class="literal">${.TARGET}</code> in case of error, but this only
|
||
happens when it is interrupted, for example by pressing
|
||
<code class="literal">^C</code>. This does <span class="emphasis"><em>not</em></span> happen
|
||
when one of the commands fails (like <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?false+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">false</span>(1)</span></a> above).</p>
|
||
</li></ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="makefile.variables"></a>12.2. <code class="filename">Makefile</code> variables</h2></div></div></div>
|
||
<p><code class="filename">Makefile</code> variables contain strings that
|
||
can be processed using the five operators ``='', ``+='', ``?='',
|
||
``:='', and ``!='', which are described in the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> man
|
||
page.</p>
|
||
<p>When a variable's value is parsed from a
|
||
<code class="filename">Makefile</code>, the hash character ``#'' and the
|
||
backslash character ``\'' are handled specially. If a backslash is
|
||
followed by a newline, any whitespace immediately in front of the
|
||
backslash, the backslash, the newline, and any whitespace
|
||
immediately behind the newline are replaced with a single space. A
|
||
backslash character and an immediately following hash character are
|
||
replaced with a single hash character. Otherwise, the backslash is
|
||
passed as is. In a variable assignment, any hash character that is
|
||
not preceded by a backslash starts a comment that continues upto the
|
||
end of the logical line.</p>
|
||
<p><span class="emphasis"><em>Note:</em></span> Because of this parsing algorithm
|
||
the only way to create a variable consisting of a single backslash
|
||
is using the ``!='' operator, for example: <code class="varname">BACKSLASH!=echo "\\"</code>.</p>
|
||
<p>So far for defining variables. The other thing you can do with
|
||
variables is evaluating them. A variable is evaluated when it is
|
||
part of the right side of the ``:='' or the ``!='' operator, or
|
||
directly before executing a shell command which the variable is part
|
||
of. In all other cases, <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> performs lazy evaluation, that
|
||
is, variables are not evaluated until there's no other way. The
|
||
``modifiers'' mentioned in the man page also evaluate the
|
||
variable.</p>
|
||
<p>Some of the modifiers split the string into words and then
|
||
operate on the words, others operate on the string as a whole. When
|
||
a string is split into words, it is split as you would expect
|
||
it from <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?sh+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">sh</span>(1)</span></a>.</p>
|
||
<p>No rule without exception—the <span class="command"><strong>.for</strong></span>
|
||
loop does not follow the shell quoting rules but splits at sequences
|
||
of whitespace.</p>
|
||
<p>There are several types of variables that should be handled
|
||
differently. Strings and two types of lists.</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><span class="emphasis"><em>Strings</em></span> can contain arbitrary
|
||
characters. Nevertheless, you should restrict yourself to only
|
||
using printable characters. Examples are
|
||
<code class="varname">PREFIX</code> and
|
||
<code class="varname">COMMENT</code>.</p></li>
|
||
<li class="listitem"><p><span class="emphasis"><em>Internal lists</em></span> are lists that
|
||
are never exported to any shell command. Their elements are
|
||
separated by whitespace. Therefore, the elements themselves cannot
|
||
have embedded whitespace. Any other characters are allowed.
|
||
Internal lists can be used in <span class="command"><strong>.for</strong></span> loops.
|
||
Examples are <code class="varname">DEPENDS</code> and
|
||
<code class="varname">BUILD_DEPENDS</code>.</p></li>
|
||
<li class="listitem"><p><span class="emphasis"><em>External lists</em></span> are lists that
|
||
may be exported to a shell command. Their elements can contain any
|
||
characters, including whitespace. That's why they cannot be used
|
||
in <span class="command"><strong>.for</strong></span> loops. Examples are
|
||
<code class="varname">DISTFILES</code> and
|
||
<code class="varname">MASTER_SITES</code>.</p></li>
|
||
</ul></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="makefile.variables.names"></a>12.2.1. Naming conventions</h3></div></div></div>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>All variable names starting with an underscore
|
||
are reserved for use by the pkgsrc infrastructure. They shall
|
||
not be used by package
|
||
<code class="filename">Makefile</code>s.</p></li>
|
||
<li class="listitem"><p>In <span class="command"><strong>.for</strong></span> loops you should use
|
||
lowercase variable names for the iteration
|
||
variables.</p></li>
|
||
<li class="listitem"><p>All list variables should have a ``plural''
|
||
name, e.g. <code class="varname">PKG_OPTIONS</code> or
|
||
<code class="varname">DISTFILES</code>.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="makefile.code"></a>12.3. Code snippets</h2></div></div></div>
|
||
<p>This section presents you with some code snippets you should
|
||
use in your own code. If you don't find anything appropriate here,
|
||
you should test your code and add it here.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="adding-to-list"></a>12.3.1. Adding things to a list</h3></div></div></div>
|
||
<pre class="programlisting">
|
||
STRING= foo * bar `date`
|
||
INT_LIST= # empty
|
||
ANOTHER_INT_LIST= apache-[0-9]*:../../www/apache
|
||
EXT_LIST= # empty
|
||
ANOTHER_EXT_LIST= a=b c=d
|
||
|
||
INT_LIST+= ${STRING} # 1
|
||
INT_LIST+= ${ANOTHER_INT_LIST} # 2
|
||
EXT_LIST+= ${STRING:Q} # 3
|
||
EXT_LIST+= ${ANOTHER_EXT_LIST} # 4
|
||
</pre>
|
||
<p>When you add a string to an external list (example 3), it
|
||
must be quoted. In all other cases, you must not add a quoting
|
||
level. You must not merge internal and external lists, unless you
|
||
are sure that all entries are correctly interpreted in both
|
||
lists.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="converting-internal-to-external"></a>12.3.2. Converting an internal list into an external list</h3></div></div></div>
|
||
<pre class="programlisting">
|
||
EXT_LIST= # empty
|
||
.for i in ${INT_LIST}
|
||
EXT_LIST+= ${i:Q}""
|
||
.endfor
|
||
</pre>
|
||
<p>This code converts the internal list
|
||
<code class="varname">INT_LIST</code> into the external list
|
||
<code class="varname">EXT_LIST</code>. As the elements of an internal list
|
||
are unquoted they must be quoted here. The reason for appending
|
||
<code class="varname">""</code> is explained below.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="passing-variable-to-shell"></a>12.3.3. Passing variables to a shell command</h3></div></div></div>
|
||
<p>Sometimes you may want to print an arbitrary string. There
|
||
are many ways to get it wrong and only few that can handle every
|
||
nastiness.</p>
|
||
<pre class="programlisting">
|
||
STRING= foo bar < > * `date` $$HOME ' "
|
||
EXT_LIST= string=${STRING:Q} x=second\ item
|
||
|
||
all:
|
||
echo ${STRING} # 1
|
||
echo "${STRING}" # 2
|
||
echo "${STRING:Q}" # 3
|
||
echo ${STRING:Q} # 4
|
||
echo x${STRING:Q} | sed 1s,.,, # 5
|
||
printf "%s\\n" ${STRING:Q}"" # 6
|
||
env ${EXT_LIST} /bin/sh -c 'echo "$$string"; echo "$$x"'
|
||
</pre>
|
||
<p>Example 1 leads to a syntax error in the shell, as the
|
||
characters are just copied.</p>
|
||
<p>Example 2 leads to a syntax error too, and if you leave out
|
||
the last " character from <code class="varname">${STRING}</code>,
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?date+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">date</span>(1)</span></a> will be executed. The <code class="varname">$HOME</code> shell
|
||
variable would be evaluated, too.</p>
|
||
<p>Example 3 outputs each space character preceded by a
|
||
backslash (or not), depending on the implementation of the
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?echo+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">echo</span>(1)</span></a> command.</p>
|
||
<p>Example 4 handles correctly every string that does not start
|
||
with a dash. In that case, the result depends on the
|
||
implementation of the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?echo+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">echo</span>(1)</span></a> command. As long as you can
|
||
guarantee that your input does not start with a dash, this form is
|
||
appropriate.</p>
|
||
<p>Example 5 handles even the case of a leading dash
|
||
correctly.</p>
|
||
<p>Example 6 also works with every string and is the
|
||
light-weight solution, since it does not involve a pipe, which has
|
||
its own problems.</p>
|
||
<p>The <code class="varname">EXT_LIST</code> does not need to be quoted
|
||
because the quoting has already been done when adding elements to
|
||
the list.</p>
|
||
<p>As internal lists shall not be passed to the shell, there is
|
||
no example for it.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="quoting-guideline"></a>12.3.4. Quoting guideline</h3></div></div></div>
|
||
<p>There are many possible sources of wrongly quoted variables.
|
||
This section lists some of the commonly known ones.</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem">
|
||
<p>Whenever you use the value of a list, think
|
||
about what happens to leading or trailing whitespace. If the
|
||
list is a well-formed shell expression, you can apply the
|
||
<code class="varname">:M*</code> modifier to strip leading and trailing
|
||
whitespace from each word. The <code class="varname">:M</code> operator
|
||
first splits its argument according to the rules of the shell,
|
||
and then creates a new list consisting of all words that match
|
||
the shell glob expression <code class="varname">*</code>, that is: all.
|
||
One class of situations where this is needed is when adding a
|
||
variable like <code class="varname">CPPFLAGS</code> to
|
||
<code class="varname">CONFIGURE_ARGS</code>. If the configure script
|
||
invokes other configure scripts, it strips the leading and
|
||
trailing whitespace from the variable and then passes it to the
|
||
other configure scripts. But these configure scripts expect the
|
||
(child) <code class="varname">CPPFLAGS</code> variable to be the same as
|
||
the parent <code class="varname">CPPFLAGS</code>. That's why we better
|
||
pass the <code class="varname">CPPFLAGS</code> value properly trimmed. And
|
||
here is how we do it:</p>
|
||
<pre class="programlisting">
|
||
CPPFLAGS= # empty
|
||
CPPFLAGS+= -Wundef -DPREFIX=\"${PREFIX:Q}\"
|
||
CPPFLAGS+= ${MY_CPPFLAGS}
|
||
|
||
CONFIGURE_ARGS+= CPPFLAGS=${CPPFLAGS:M*:Q}
|
||
|
||
all:
|
||
echo x${CPPFLAGS:Q}x # leading and trailing whitespace
|
||
echo x${CONFIGURE_ARGS}x # properly trimmed
|
||
</pre>
|
||
</li>
|
||
<li class="listitem"><p>The example above contains one bug: The
|
||
<code class="varname">${PREFIX}</code> is a properly quoted shell
|
||
expression, but there is the C compiler after it, which also
|
||
expects a properly quoted string (this time in C syntax). The
|
||
version above is therefore only correct if
|
||
<code class="varname">${PREFIX}</code> does not have embedded backslashes
|
||
or double quotes. If you want to allow these, you have to add
|
||
another layer of quoting to each variable that is used as a C
|
||
string literal. You cannot use the <code class="varname">:Q</code>
|
||
operator for it, as this operator only works for the
|
||
shell.</p></li>
|
||
<li class="listitem">
|
||
<p>Whenever a variable can be empty, the
|
||
<code class="varname">:Q</code> operator can have surprising results. Here
|
||
are two completely different cases which can be solved with the
|
||
same trick.</p>
|
||
<pre class="programlisting">
|
||
EMPTY= # empty
|
||
empty_test:
|
||
for i in a ${EMPTY:Q} c; do \
|
||
echo "$$i"; \
|
||
done
|
||
|
||
for_test:
|
||
.for i in a:\ a:\test.txt
|
||
echo ${i:Q}
|
||
echo "foo"
|
||
.endfor
|
||
</pre>
|
||
<p>The first example will only print two of the three lines
|
||
we might have expected. This is because
|
||
<code class="varname">${EMPTY:Q}</code> expands to the empty string, which
|
||
the shell cannot see. The workaround is to write
|
||
<code class="varname">${EMPTY:Q}""</code>. This pattern can be often found
|
||
as <code class="varname">${TEST} -z ${VAR:Q}</code> or as <code class="varname">${TEST}
|
||
-f ${FNAME:Q}</code> (both of these are wrong).</p>
|
||
<p>The second example will only print three lines instead of
|
||
four. The first line looks like <code class="varname">a:\ echo foo</code>.
|
||
This is because the backslash of the value
|
||
<code class="varname">a:\</code> is interpreted as a line-continuation by
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a>, which makes the second line the arguments of the
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?echo+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">echo</span>(1)</span></a> command from the first line. To avoid this, write
|
||
<code class="varname">${i:Q}""</code>.</p>
|
||
</li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="bsd-make-bug-workaround"></a>12.3.5. Workaround for a bug in BSD Make</h3></div></div></div>
|
||
<p>The pkgsrc bmake program does not handle the following
|
||
assignment correctly. In case <code class="varname">_othervar_</code>
|
||
contains a ``-'' character, one of the closing braces is included
|
||
in <code class="varname">${VAR}</code> after this code executes.</p>
|
||
<pre class="programlisting">
|
||
VAR:= ${VAR:N${_othervar_:C/-//}}
|
||
</pre>
|
||
<p>For a more complex code snippet and a workaround, see the
|
||
package <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/regress/make-quoting/README.html" target="_top"><code class="filename">regress/make-quoting</code></a>, testcase
|
||
<code class="varname">bug1</code>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="plist"></a>Chapter 13. PLIST issues</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#rcs-id">13.1. RCS ID</a></span></dt>
|
||
<dt><span class="sect1"><a href="#automatic-plist-generation">13.2. Semi-automatic <code class="filename">PLIST</code> generation</a></span></dt>
|
||
<dt><span class="sect1"><a href="#print-PLIST">13.3. Tweaking output of <span class="command"><strong>make print-PLIST</strong></span></a></span></dt>
|
||
<dt><span class="sect1"><a href="#plist.misc">13.4. Variable substitution in PLIST</a></span></dt>
|
||
<dt><span class="sect1"><a href="#manpage-compression">13.5. Man page compression</a></span></dt>
|
||
<dt><span class="sect1"><a href="#using-PLIST_SRC">13.6. Changing PLIST source with <code class="varname">PLIST_SRC</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-specific-plist">13.7. Platform-specific and differing PLISTs</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build-plist">13.8. Build-specific PLISTs</a></span></dt>
|
||
<dt><span class="sect1"><a href="#faq.common-dirs">13.9. Sharing directories between packages</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<p>The <code class="filename">PLIST</code> file contains a package's
|
||
<span class="quote">“<span class="quote">packing list</span>”</span>, i.e. a list of files that belong to
|
||
the package (relative to the <code class="filename">${PREFIX}</code>
|
||
directory it's been installed in) plus some additional statements
|
||
- see the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_create+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_create</span>(1)</span></a> man page for a full list.
|
||
This chapter addresses some issues that need attention when
|
||
dealing with the <code class="filename">PLIST</code> file (or files, see
|
||
below!).</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="rcs-id"></a>13.1. RCS ID</h2></div></div></div>
|
||
<p>Be sure to add a RCS ID line as the first thing in any
|
||
<code class="filename">PLIST</code> file you write:</p>
|
||
<pre class="programlisting">
|
||
@comment $NetBSD$
|
||
</pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="automatic-plist-generation"></a>13.2. Semi-automatic <code class="filename">PLIST</code> generation</h2></div></div></div>
|
||
<p>You can use the <span class="command"><strong>make print-PLIST</strong></span> command
|
||
to output a PLIST that matches any new files since the package
|
||
was extracted. See <a class="xref" href="#build.helpful-targets" title="17.17. Other helpful targets">Section 17.17, “Other helpful targets”</a> for
|
||
more information on this target.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="print-PLIST"></a>13.3. Tweaking output of <span class="command"><strong>make print-PLIST</strong></span>
|
||
</h2></div></div></div>
|
||
<p>The <code class="varname">PRINT_PLIST_AWK</code> 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
|
||
<code class="filename">libdata/foo</code> directory removed from the
|
||
resulting PLIST:</p>
|
||
<pre class="programlisting">
|
||
PRINT_PLIST_AWK+= /^libdata\/foo/ { next; }
|
||
</pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="plist.misc"></a>13.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 class="variablelist">
|
||
<dt><span class="term"><code class="varname">${MACHINE_ARCH}</code>, <code class="varname">${MACHINE_GNU_ARCH}</code></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 files. To handle this
|
||
case, PLIST will be preprocessed before actually used, and
|
||
the symbol
|
||
<span class="quote">“<span class="quote"><code class="varname">${MACHINE_ARCH}</code></span>”</span> will be
|
||
replaced by what <span class="command"><strong>uname -p</strong></span> gives. The
|
||
same is done if the string
|
||
<code class="varname">${MACHINE_GNU_ARCH}</code> 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">“<span class="quote"><code class="varname">$ARCH</code></span>”</span> that
|
||
was replaced by the output of <span class="command"><strong>uname
|
||
-m</strong></span>, but that's no longer supported and has
|
||
been removed.</p>
|
||
</div>
|
||
</dd>
|
||
<dt><span class="term"><code class="varname">${OPSYS}</code>, <code class="varname">${LOWER_OPSYS}</code>, <code class="varname">${OS_VERSION}</code></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
|
||
<code class="filename">PLIST</code>:
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">${OPSYS}</code> - output of <span class="quote">“<span class="quote"><span class="command"><strong>uname -s</strong></span></span>”</span></p></li>
|
||
<li class="listitem"><p><code class="varname">${LOWER_OPSYS}</code> - lowercase common name (eg. <span class="quote">“<span class="quote">solaris</span>”</span>)</p></li>
|
||
<li class="listitem"><p><code class="varname">${OS_VERSION}</code> - <span class="quote">“<span class="quote"><span class="command"><strong>uname -r</strong></span></span>”</span></p></li>
|
||
</ul></div>
|
||
</dd>
|
||
</dl></div>
|
||
<p>For a list of values which are replaced by
|
||
default, the output of <span class="command"><strong>make help topic=PLIST_SUBST</strong></span> as
|
||
well as searching the <code class="filename">pkgsrc/mk</code> directory with <span class="command"><strong>grep</strong></span> for
|
||
<code class="varname">PLIST_SUBST</code> should help.</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 <code class="varname">MESSAGE_SUBST</code> (see <a class="xref" href="#components.optional" title="11.5. Optional files">Section 11.5, “Optional files”</a>):</p>
|
||
<pre class="programlisting">
|
||
PLIST_SUBST+= SOMEVAR="somevalue"
|
||
</pre>
|
||
<p>This replaces all occurrences of <span class="quote">“<span class="quote">${SOMEVAR}</span>”</span>
|
||
in the <code class="filename">PLIST</code> with
|
||
<span class="quote">“<span class="quote">somevalue</span>”</span>.</p>
|
||
<p>The <code class="varname">PLIST_VARS</code> variable can be used to simplify
|
||
the common case of conditionally including some
|
||
<code class="filename">PLIST</code> entries. It can be done by adding
|
||
<code class="literal"><code class="varname">PLIST_VARS</code>+=foo</code> and
|
||
setting the corresponding <code class="varname">PLIST.foo</code> variable
|
||
to <code class="literal">yes</code> if the entry should be included.
|
||
This will substitute <span class="quote">“<span class="quote"><code class="varname">${PLIST.foo}</code></span>”</span>
|
||
in the <code class="filename">PLIST</code> with either
|
||
<span class="quote">“<span class="quote"><code class="literal">""</code></span>”</span> or
|
||
<span class="quote">“<span class="quote"><code class="literal">"@comment "</code></span>”</span>.
|
||
For example, in <code class="filename">Makefile</code>:</p>
|
||
<pre class="programlisting">
|
||
PLIST_VARS+= foo
|
||
.if <em class="replaceable"><code>condition</code></em>
|
||
PLIST.foo= yes
|
||
.else
|
||
</pre>
|
||
<p>And then in <code class="filename">PLIST</code>:</p>
|
||
<pre class="programlisting">
|
||
@comment $NetBSD$
|
||
bin/bar
|
||
man/man1/bar.1
|
||
${PLIST.foo}bin/foo
|
||
${PLIST.foo}man/man1/foo.1
|
||
${PLIST.foo}share/bar/foo.data
|
||
</pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="manpage-compression"></a>13.5. Man page compression</h2></div></div></div>
|
||
<p>Man pages should be installed in compressed form if
|
||
<code class="varname">MANZ</code> is set (in <code class="filename">bsd.own.mk</code>),
|
||
and uncompressed otherwise. To handle this in the
|
||
<code class="filename">PLIST</code> file, the suffix <span class="quote">“<span class="quote">.gz</span>”</span> is
|
||
appended/removed automatically for man pages according to
|
||
<code class="varname">MANZ</code> and <code class="varname">MANCOMPRESSED</code> being set
|
||
or not, see above for details. This modification of the
|
||
<code class="filename">PLIST</code> file is done on a copy of it, not
|
||
<code class="filename">PLIST</code> itself.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="using-PLIST_SRC"></a>13.6. Changing PLIST source with <code class="varname">PLIST_SRC</code>
|
||
</h2></div></div></div>
|
||
<p>To use one or more files as source for the <code class="filename">PLIST</code> used
|
||
in generating the binary package, set the variable
|
||
<code class="varname">PLIST_SRC</code> to the names of that file(s).
|
||
The files are later concatenated using <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?cat+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">cat</span>(1)</span></a>, and the order of things is
|
||
important. The default for <code class="varname">PLIST_SRC</code> is
|
||
<code class="filename">${PKGDIR}/PLIST</code>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="platform-specific-plist"></a>13.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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="filename">PLIST.common</code></p></li>
|
||
<li class="listitem"><p><code class="filename">PLIST.${OPSYS}</code></p></li>
|
||
<li class="listitem"><p><code class="filename">PLIST.${MACHINE_ARCH}</code></p></li>
|
||
<li class="listitem"><p><code class="filename">PLIST.${OPSYS}-${MACHINE_ARCH}</code></p></li>
|
||
<li class="listitem"><p><code class="filename">PLIST.common_end</code></p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build-plist"></a>13.8. Build-specific PLISTs</h2></div></div></div>
|
||
<p>Some packages decide to generate hard-to-guess file names
|
||
during installation that are hard to wire down.</p>
|
||
<p>In such cases, you can set the
|
||
<code class="varname">GENERATE_PLIST</code> variable to shell code
|
||
terminated (with a semicolon) that will output PLIST entries which
|
||
will be appended to the PLIST</p>
|
||
<p>You can find one example in editors/xemacs:</p>
|
||
<pre class="programlisting">
|
||
GENERATE_PLIST+= ${ECHO} bin/${DISTNAME}-`${WRKSRC}/src/xemacs -sd`.dmp ;
|
||
</pre>
|
||
<p>which will append something like
|
||
<code class="filename">bin/xemacs-21.4.23-54e8ea71.dmp</code> to the
|
||
<code class="filename">PLIST</code>.
|
||
</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="faq.common-dirs"></a>13.9. Sharing directories between packages</h2></div></div></div>
|
||
<p>A <span class="quote">“<span class="quote">shared directory</span>”</span> is a directory where
|
||
multiple (and unrelated) packages install files. These
|
||
directories were problematic because you had to add special
|
||
tricks in the PLIST to conditionally remove them, or have some
|
||
centralized package handle them.</p>
|
||
<p>In pkgsrc, it is now easy: Each package should create
|
||
directories and install files as needed; <span class="command"><strong>pkg_delete</strong></span>
|
||
will remove any directories left empty after uninstalling a
|
||
package.</p>
|
||
<p>If a package needs an empty directory to work, create
|
||
the directory during installation as usual, and also add an
|
||
entry to the PLIST:
|
||
</p>
|
||
<pre class="programlisting">
|
||
@pkgdir path/to/empty/directory
|
||
</pre>
|
||
<p>
|
||
or take a look at <code class="varname">MAKE_DIRS</code> and
|
||
<code class="varname">OWN_DIRS</code>.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="buildlink"></a>Chapter 14. Buildlink methodology</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#converting-to-buildlink3">14.1. Converting packages to use buildlink3</a></span></dt>
|
||
<dt><span class="sect1"><a href="#creating-buildlink3.mk">14.2. Writing <code class="filename">buildlink3.mk</code> files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#anatomy-of-bl3">14.2.1. Anatomy of a buildlink3.mk file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#updating-buildlink-depends">14.2.2. Updating
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
and
|
||
<code class="varname">BUILDLINK_ABI_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
in <code class="filename">buildlink3.mk</code> files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#writing-builtin.mk">14.3. Writing <code class="filename">builtin.mk</code> files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#anatomy-of-builtin.mk">14.3.1. Anatomy of a <code class="filename">builtin.mk</code> file</a></span></dt>
|
||
<dt><span class="sect2"><a href="#native-or-pkgsrc-preference">14.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 class="orderedlist" type="1">
|
||
<li class="listitem"><p>Symlink headers and libraries for dependencies into
|
||
<code class="varname">BUILDLINK_DIR</code>, which by default is a subdirectory
|
||
of <code class="varname">WRKDIR</code>.</p></li>
|
||
<li class="listitem"><p>Create wrapper scripts that are used in place of the normal compiler
|
||
tools that translate <code class="option">-I${LOCALBASE}/include</code> and
|
||
<code class="option">-L${LOCALBASE}/lib</code> into references to
|
||
<code class="varname">BUILDLINK_DIR</code>. 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. <code class="filename">/usr/include</code>,
|
||
<code class="filename">/usr/lib</code>, etc., are always searched -- buildlink3 is
|
||
designed to insulate the package build from non-system-supplied
|
||
software.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="converting-to-buildlink3"></a>14.1. Converting packages to use buildlink3</h2></div></div></div>
|
||
<p>The process of converting packages to use the buildlink3
|
||
framework (<span class="quote">“<span class="quote">bl3ifying</span>”</span>) is fairly straightforward.
|
||
The things to keep in mind are:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><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
|
||
<code class="filename">${WRKDIR}/.work.log</code> to see if the
|
||
wrappers are being invoked.</p></li>
|
||
<li class="listitem"><p>Don't override <code class="varname">PREFIX</code> from within
|
||
the package Makefile, e.g. Java VMs, standalone shells,
|
||
etc., because the code to symlink files into
|
||
<code class="filename">${BUILDLINK_DIR}</code> looks for files
|
||
relative to <span class="quote">“<span class="quote">pkg_info -qp <em class="replaceable"><code>pkgname</code></em></span>”</span>.
|
||
</p></li>
|
||
<li class="listitem"><p>Remember that <span class="emphasis"><em>only</em></span> the
|
||
<code class="filename">buildlink3.mk</code> 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>The buildlink3.mk files usually define the required dependencies.
|
||
If you need a newer version of the dependency when using buildlink3.mk
|
||
files, then you can define it in your Makefile; for example:</p>
|
||
<pre class="programlisting">
|
||
BUILDLINK_API_DEPENDS.foo+= foo>=1.1.0
|
||
.include "../../category/foo/buildlink3.mk"
|
||
</pre>
|
||
<p>There are several <code class="filename">buildlink3.mk</code>
|
||
files in <code class="filename">pkgsrc/mk</code>
|
||
that handle special package issues:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="filename">bdb.buildlink3.mk</code> chooses either
|
||
the native or a pkgsrc Berkeley DB implementation based on
|
||
the values of <code class="varname">BDB_ACCEPTED</code> and
|
||
<code class="varname">BDB_DEFAULT</code>.</p></li>
|
||
<li class="listitem"><p><code class="filename">curses.buildlink3.mk</code>: If the system
|
||
comes with neither Curses nor NCurses, this will take care
|
||
to install the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/ncurses/README.html" target="_top"><code class="filename">devel/ncurses</code></a> package.</p></li>
|
||
<li class="listitem"><p><code class="filename">krb5.buildlink3.mk</code> uses the value
|
||
of <code class="varname">KRB5_ACCEPTED</code> to choose between
|
||
adding a dependency on Heimdal or MIT-krb5 for packages that
|
||
require a Kerberos 5 implementation.</p></li>
|
||
<li class="listitem"><p><code class="filename">motif.buildlink3.mk</code> checks for a
|
||
system-provided Motif installation or adds a dependency on
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/x11/lesstif/README.html" target="_top"><code class="filename">x11/lesstif</code></a>, <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/x11/motif/README.html" target="_top"><code class="filename">x11/motif</code></a> or <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/x11/openmotif/README.html" target="_top"><code class="filename">x11/openmotif</code></a>. The user can set
|
||
<code class="varname">MOTIF_TYPE</code> to <span class="quote">“<span class="quote">dt</span>”</span>,
|
||
<span class="quote">“<span class="quote">lesstif</span>”</span>, <span class="quote">“<span class="quote">motif</span>”</span> or
|
||
<span class="quote">“<span class="quote">openmotif</span>”</span> to choose
|
||
which Motif version will be used.</p></li>
|
||
<li class="listitem"><p><code class="filename">readline.buildlink3.mk</code> checks for a
|
||
system-provided GNU readline or editline (libedit) installation,
|
||
or adds a dependency on <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/readline/README.html" target="_top"><code class="filename">devel/readline</code></a>,
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/editline/README.html" target="_top"><code class="filename">devel/editline</code></a>. The user can set
|
||
<code class="varname">READLINE_DEFAULT</code> to choose readline implementation.
|
||
If your package really needs GNU readline library, its Makefile
|
||
should include <code class="filename">devel/readline/buildlink3.mk</code>
|
||
instead of <code class="filename">readline.buildlink3.mk</code>.</p></li>
|
||
<li class="listitem"><p><code class="filename">oss.buildlink3.mk</code> defines several
|
||
variables that may be used by packages that use the
|
||
Open Sound System (OSS) API.</p></li>
|
||
<li class="listitem"><p><code class="filename">pgsql.buildlink3.mk</code> will accept
|
||
any of the Postgres versions in the variable
|
||
<code class="varname">PGSQL_VERSIONS_ACCEPTED</code> and default to
|
||
the version <code class="varname">PGSQL_VERSION_DEFAULT</code>. See
|
||
the file for more information.</p></li>
|
||
<li class="listitem"><p><code class="filename">pthread.buildlink3.mk</code> uses the value of
|
||
<code class="varname">PTHREAD_OPTS</code> and checks for native pthreads or adds
|
||
a dependency on <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/pth/README.html" target="_top"><code class="filename">devel/pth</code></a> as needed.</p></li>
|
||
<li class="listitem"><p><code class="filename">xaw.buildlink3.mk</code> uses the value of
|
||
<code class="varname">XAW_TYPE</code> to choose a particular Athena widgets
|
||
library.</p></li>
|
||
</ul></div>
|
||
<p>The comments in those <code class="filename">buildlink3.mk</code>
|
||
files provide a more complete
|
||
description of how to use them properly.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="creating-buildlink3.mk"></a>14.2. Writing <code class="filename">buildlink3.mk</code> files</h2></div></div></div>
|
||
<a name="buildlink3.mk"></a><p>A package's <code class="filename">buildlink3.mk</code> file is
|
||
included by Makefiles to indicate the need to compile and link
|
||
against header files and libraries provided by the package. A
|
||
<code class="filename">buildlink3.mk</code> file should always provide
|
||
enough information to add the correct type of dependency
|
||
relationship and include any other
|
||
<code class="filename">buildlink3.mk</code> files that it needs to find
|
||
headers and libraries that it needs in turn.</p>
|
||
<p>To generate an initial <code class="filename">buildlink3.mk</code>
|
||
file for further editing, Rene Hexel's <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/createbuildlink/README.html" target="_top"><code class="filename">pkgtools/createbuildlink</code></a>
|
||
package is highly recommended. For most packages, the following
|
||
command will generate a good starting point for
|
||
<code class="filename">buildlink3.mk</code> files:</p>
|
||
<pre class="screen">
|
||
<code class="prompt">%</code> <strong class="userinput"><code>cd pkgsrc/<em class="replaceable"><code>category</code></em>/<em class="replaceable"><code>pkgdir</code></em>
|
||
<code class="prompt">%</code> createbuildlink >buildlink3.mk</code></strong>
|
||
</pre>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="anatomy-of-bl3"></a>14.2.1. Anatomy of a buildlink3.mk file</h3></div></div></div>
|
||
<p>The following real-life example
|
||
<code class="filename">buildlink3.mk</code> is taken
|
||
from <code class="filename">pkgsrc/graphics/tiff</code>:</p>
|
||
<pre class="programlisting">
|
||
# $NetBSD: buildlink3.mk,v 1.16 2009/03/20 19:24:45 joerg Exp $
|
||
|
||
BUILDLINK_TREE+= tiff
|
||
|
||
.if !defined(TIFF_BUILDLINK3_MK)
|
||
TIFF_BUILDLINK3_MK:=
|
||
|
||
BUILDLINK_API_DEPENDS.tiff+= tiff>=3.6.1
|
||
BUILDLINK_ABI_DEPENDS.tiff+= tiff>=3.7.2nb1
|
||
BUILDLINK_PKGSRCDIR.tiff?= ../../graphics/tiff
|
||
|
||
.include "../../devel/zlib/buildlink3.mk"
|
||
.include "../../graphics/jpeg/buildlink3.mk"
|
||
.endif # TIFF_BUILDLINK3_MK
|
||
|
||
BUILDLINK_TREE+= -tiff
|
||
</pre>
|
||
<p>The header and footer manipulate
|
||
<code class="varname">BUILDLINK_TREE</code>, which is common across all
|
||
<code class="filename">buildlink3.mk</code> files and is used to track
|
||
the dependency tree.</p>
|
||
<p>The main section is protected from multiple inclusion
|
||
and controls how the dependency on <em class="replaceable"><code>pkg</code></em> is
|
||
added. Several important variables are set in the section:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
is the actual dependency recorded in the installed
|
||
package; this should always be set using
|
||
<span class="command"><strong>+=</strong></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 an backwards-incompatible API change.
|
||
</p></li>
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_PKGSRCDIR.<em class="replaceable"><code>pkg</code></em></code>
|
||
is the location of the <em class="replaceable"><code>pkg</code></em>
|
||
pkgsrc directory.</p></li>
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_DEPMETHOD.<em class="replaceable"><code>pkg</code></em></code>
|
||
(not shown above) controls whether we use
|
||
<code class="varname">BUILD_DEPENDS</code> or
|
||
<code class="varname">DEPENDS</code> to add the dependency on
|
||
<em class="replaceable"><code>pkg</code></em>. The build dependency is
|
||
selected by setting
|
||
<code class="varname">BUILDLINK_DEPMETHOD.<em class="replaceable"><code>pkg</code></em></code>
|
||
to <span class="quote">“<span class="quote">build</span>”</span>. By default, the full dependency is
|
||
used.</p></li>
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_INCDIRS.<em class="replaceable"><code>pkg</code></em></code>
|
||
and
|
||
<code class="varname">BUILDLINK_LIBDIRS.<em class="replaceable"><code>pkg</code></em></code>
|
||
(not shown above) are lists of subdirectories of
|
||
<code class="filename">${BUILDLINK_PREFIX.<em class="replaceable"><code>pkg</code></em>}</code>
|
||
to add to the header and library search paths. These
|
||
default to <span class="quote">“<span class="quote">include</span>”</span> and <span class="quote">“<span class="quote">lib</span>”</span>
|
||
respectively.</p></li>
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_CPPFLAGS.<em class="replaceable"><code>pkg</code></em></code>
|
||
(not shown above) is the list of preprocessor flags to add
|
||
to <code class="varname">CPPFLAGS</code>, which are passed on to the
|
||
configure and build phases. The <span class="quote">“<span class="quote">-I</span>”</span> option
|
||
should be avoided and instead be handled using
|
||
<code class="varname">BUILDLINK_INCDIRS.<em class="replaceable"><code>pkg</code></em></code> 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
|
||
<code class="filename">${BUILDLINK_DIR}</code> and how their names are
|
||
transformed during the symlinking:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_FILES.<em class="replaceable"><code>pkg</code></em></code>
|
||
(not shown above) is a shell glob pattern relative to
|
||
<code class="filename">${BUILDLINK_PREFIX.<em class="replaceable"><code>pkg</code></em>}</code>
|
||
to be symlinked into
|
||
<code class="filename">${BUILDLINK_DIR}</code>,
|
||
e.g. <code class="filename">include/*.h</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_FILES_CMD.<em class="replaceable"><code>pkg</code></em></code>
|
||
(not shown above) is a shell pipeline that
|
||
outputs to stdout a list of files relative to
|
||
<code class="filename">${BUILDLINK_PREFIX.<em class="replaceable"><code>pkg</code></em>}</code>.
|
||
The resulting files are to be symlinked
|
||
into <code class="filename">${BUILDLINK_DIR}</code>. By default,
|
||
this takes the <code class="filename">+CONTENTS</code> of a
|
||
<em class="replaceable"><code>pkg</code></em> and filters it through
|
||
<code class="varname">${BUILDLINK_CONTENTS_FILTER.<em class="replaceable"><code>pkg</code></em>}</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_CONTENTS_FILTER.<em class="replaceable"><code>pkg</code></em></code>
|
||
(not shown above) is a filter command that filters
|
||
<code class="filename">+CONTENTS</code> input into a list of files
|
||
relative to
|
||
<code class="filename">${BUILDLINK_PREFIX.<em class="replaceable"><code>pkg</code></em>}</code>
|
||
on stdout. By default,
|
||
<code class="varname">BUILDLINK_CONTENTS_FILTER.<em class="replaceable"><code>pkg</code></em></code>
|
||
outputs the contents of the <code class="filename">include</code>
|
||
and <code class="filename">lib</code> directories in the package
|
||
<code class="filename">+CONTENTS</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">BUILDLINK_FNAME_TRANSFORM.<em class="replaceable"><code>pkg</code></em></code>
|
||
(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 class="command"><strong>-e
|
||
"s|/curses.h|/ncurses.h|g"</strong></span>.</p></li>
|
||
</ul></div>
|
||
<p>This section can additionally include any
|
||
<code class="filename">buildlink3.mk</code> needed for
|
||
<em class="replaceable"><code>pkg</code></em>'s library dependencies.
|
||
Including these <code class="filename">buildlink3.mk</code> files
|
||
means that the headers and libraries for these
|
||
dependencies are also symlinked into
|
||
<code class="filename">${BUILDLINK_DIR}</code>
|
||
whenever the <em class="replaceable"><code>pkg</code></em>
|
||
<code class="filename">buildlink3.mk</code>
|
||
file is included. Dependencies are only added for directly
|
||
include <code class="filename">buildlink3.mk</code> files.</p>
|
||
<p>When providing a <code class="filename">buildlink3.mk</code> and
|
||
including other <code class="filename">buildlink3.mk</code> files in it,
|
||
please only add necessary ones, i.e., those whose libraries or
|
||
header files are automatically exposed when the package is
|
||
use.</p>
|
||
<p>In particular, if only an executable
|
||
(<code class="filename">bin/foo</code>) is linked against a library, that
|
||
library does not need to be propagated in the
|
||
<code class="filename">buildlink3.mk</code> file.</p>
|
||
<p>The following steps should help you decide if a
|
||
<code class="filename">buildlink3.mk</code> file needs to be included:
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Look at the installed header files: What
|
||
headers do they include? The packages providing these files
|
||
must be buildlinked.</p></li>
|
||
<li class="listitem"><p>Run <code class="filename">ldd</code> on all installed
|
||
libraries and look against what other libraries they link.
|
||
Some of the packages providing these probably need to be
|
||
buildlinked; however, it's not automatic, since e.g. GTK on
|
||
some systems pulls in the X libraries, so they will show up in
|
||
the <code class="filename">ldd</code> output, while on others (like OS
|
||
X) it won't. <code class="filename">ldd</code> output can thus only be
|
||
used as a hint.</p></li>
|
||
</ul></div>
|
||
<p>
|
||
</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="updating-buildlink-depends"></a>14.2.2. Updating
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
and
|
||
<code class="varname">BUILDLINK_ABI_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
in <code class="filename">buildlink3.mk</code> files</h3></div></div></div>
|
||
<p>These two variables differ in that one describes source
|
||
compatibility (API) and the other binary compatibility (ABI).
|
||
The difference is that a change in the API breaks compilation of
|
||
programs while changes in the ABI stop compiled programs from
|
||
running.</p>
|
||
<p>Changes to the
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
variable in a <code class="filename">buildlink3.mk</code> file happen
|
||
very rarely. One possible reason is that all packages depending
|
||
on this already need a newer version. In case it is bumped see
|
||
the description below.</p>
|
||
<p>The most common example of an ABI change is that the major
|
||
version of a shared library is increased. In this case,
|
||
<code class="varname">BUILDLINK_ABI_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
should be adjusted to require at least the new package version.
|
||
Then the packages that depend on this package need their
|
||
<code class="varname">PKGREVISION</code>s increased and, if they have
|
||
<code class="filename">buildlink3.mk</code> files, their
|
||
<code class="varname">BUILDLINK_ABI_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
adjusted, too. This is needed so pkgsrc will require the correct
|
||
package dependency and not settle for an older one when building
|
||
the source.</p>
|
||
<p>See <a class="xref" href="#dependencies" title="19.1.6. Handling dependencies">Section 19.1.6, “Handling dependencies”</a> for
|
||
more information about dependencies on other packages,
|
||
including the <code class="varname">BUILDLINK_ABI_DEPENDS</code> and
|
||
<code class="varname">ABI_DEPENDS</code> definitions.</p>
|
||
<p>Please take careful consideration before adjusting
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
or
|
||
<code class="varname">BUILDLINK_ABI_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
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.</p>
|
||
<p>Also it is not needed to set
|
||
<code class="varname">BUILDLINK_ABI_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>
|
||
when it is identical to
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>. </p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="writing-builtin.mk"></a>14.3. Writing <code class="filename">builtin.mk</code> 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 <code class="filename">buildlink3.mk</code> file, these
|
||
packages should also include a <code class="filename">builtin.mk</code>
|
||
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
|
||
<em class="replaceable"><code>pkg</code></em> are:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>It should set
|
||
<code class="varname">USE_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
to either <span class="quote">“<span class="quote">yes</span>”</span> or <span class="quote">“<span class="quote">no</span>”</span>
|
||
after it is included.</p></li>
|
||
<li class="listitem"><p>It should <span class="emphasis"><em>not</em></span> override any
|
||
<code class="varname">USE_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
which is already set before the
|
||
<code class="filename">builtin.mk</code> file is included.</p></li>
|
||
<li class="listitem"><p>It should be written to allow multiple inclusion. This
|
||
is <span class="emphasis"><em>very</em></span> important and takes careful
|
||
attention to <code class="filename">Makefile</code> coding.</p></li>
|
||
</ol></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="anatomy-of-builtin.mk"></a>14.3.1. Anatomy of a <code class="filename">builtin.mk</code> 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_API_DEPENDS.foo}
|
||
. if !empty(USE_BUILTIN.foo:M[yY][eE][sS])
|
||
USE_BUILTIN.foo!= \
|
||
${PKG_ADMIN} pmatch '${_depend_}' ${BUILTIN_PKG.foo} \
|
||
&& ${ECHO} "yes" || ${ECHO} "no"
|
||
. 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
|
||
<code class="varname">IS_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
depending on if <em class="replaceable"><code>pkg</code></em> really exists
|
||
in the base system. This should not be a base system software
|
||
with similar functionality to <em class="replaceable"><code>pkg</code></em>;
|
||
it should only be <span class="quote">“<span class="quote">yes</span>”</span> if the actual package is
|
||
included as part of the base system. This variable is only
|
||
used internally within the <code class="filename">builtin.mk</code>
|
||
file.</p>
|
||
<p>The second section sets
|
||
<code class="varname">BUILTIN_PKG.<em class="replaceable"><code>pkg</code></em></code>
|
||
to the version of <em class="replaceable"><code>pkg</code></em> in the base
|
||
system if it exists (if
|
||
<code class="varname">IS_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
is <span class="quote">“<span class="quote">yes</span>”</span>). This variable is only used internally
|
||
within the <code class="filename">builtin.mk</code> file.</p>
|
||
<p>The third section sets
|
||
<code class="varname">USE_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
and is <span class="emphasis"><em>required</em></span> in all
|
||
<code class="filename">builtin.mk</code> files. The code in this
|
||
section must make the determination whether the built-in
|
||
software is adequate to satisfy the dependencies listed in
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>.
|
||
This is typically done by comparing
|
||
<code class="varname">BUILTIN_PKG.<em class="replaceable"><code>pkg</code></em></code>
|
||
against each of the dependencies in
|
||
<code class="varname">BUILDLINK_API_DEPENDS.<em class="replaceable"><code>pkg</code></em></code>.
|
||
<code class="varname">USE_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
<span class="emphasis"><em>must</em></span> be set to the correct value by the
|
||
end of the <code class="filename">builtin.mk</code> file. Note that
|
||
<code class="varname">USE_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
may be <span class="quote">“<span class="quote">yes</span>”</span> even if
|
||
<code class="varname">IS_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
is <span class="quote">“<span class="quote">no</span>”</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
|
||
<code class="varname">CHECK_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>,
|
||
and includes code that uses the value of
|
||
<code class="varname">USE_BUILTIN.<em class="replaceable"><code>pkg</code></em></code>
|
||
set in the previous section. This typically includes, e.g.,
|
||
adding additional dependency restrictions and listing additional
|
||
files to symlink into <code class="filename">${BUILDLINK_DIR}</code> (via
|
||
<code class="varname">BUILDLINK_FILES.<em class="replaceable"><code>pkg</code></em></code>).</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="native-or-pkgsrc-preference"></a>14.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
|
||
<code class="varname">PREFER_PKGSRC</code> and
|
||
<code class="varname">PREFER_NATIVE</code>. These variables take values
|
||
of either <span class="quote">“<span class="quote">yes</span>”</span>, <span class="quote">“<span class="quote">no</span>”</span>, or a list of
|
||
packages. <code class="varname">PREFER_PKGSRC</code> tells pkgsrc to
|
||
use the pkgsrc versions of software, while
|
||
<code class="varname">PREFER_NATIVE</code> tells pkgsrc to use the
|
||
built-in versions. Preferences are determined by the most
|
||
specific instance of the package in either
|
||
<code class="varname">PREFER_PKGSRC</code> or
|
||
<code class="varname">PREFER_NATIVE</code>. If a package is specified
|
||
in neither or in both variables, then
|
||
<code class="varname">PREFER_PKGSRC</code> has precedence over
|
||
<code class="varname">PREFER_NATIVE</code>. 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
|
||
<code class="filename">builtin.mk</code>
|
||
file to be listed in <code class="varname">PREFER_NATIVE</code>,
|
||
otherwise it is simply ignored in that list.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="pkginstall"></a>Chapter 15. The pkginstall framework</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#files-and-dirs-outside-prefix">15.1. Files and directories outside the installation prefix</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#dirs-outside-prefix">15.1.1. Directory manipulation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#files-outside-prefix">15.1.2. File manipulation</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#conf-files">15.2. Configuration files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#conf-files-sysconfdir">15.2.1. How <code class="varname">PKG_SYSCONFDIR</code> is set</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-configure">15.2.2. Telling the software where configuration files are</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-patching">15.2.3. Patching installations</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conf-files-disable">15.2.4. Disabling handling of configuration files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#rcd-scripts">15.3. System startup scripts</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#rcd-scripts-disable">15.3.1. Disabling handling of system startup scripts</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#users-and-groups">15.4. System users and groups</a></span></dt>
|
||
<dt><span class="sect1"><a href="#shells">15.5. System shells</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#shells-disable">15.5.1. Disabling shell registration</a></span></dt></dl></dd>
|
||
<dt><span class="sect1"><a href="#fonts">15.6. Fonts</a></span></dt>
|
||
<dd><dl><dt><span class="sect2"><a href="#fonts-disable">15.6.1. Disabling automatic update of the fonts databases</a></span></dt></dl></dd>
|
||
</dl>
|
||
</div>
|
||
<p>This chapter describes the framework known as
|
||
<code class="literal">pkginstall</code>, whose key features are:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Generic installation and manipulation of directories and files
|
||
outside the pkgsrc-handled tree, <code class="varname">LOCALBASE</code>.</p></li>
|
||
<li class="listitem"><p>Automatic handling of configuration files during installation,
|
||
provided that packages are correctly designed.</p></li>
|
||
<li class="listitem"><p>Generation and installation of system startup scripts.</p></li>
|
||
<li class="listitem"><p>Registration of system users and groups.</p></li>
|
||
<li class="listitem"><p>Registration of system shells.</p></li>
|
||
<li class="listitem"><p>Automatic updating of fonts databases.</p></li>
|
||
</ul></div>
|
||
<p>The following sections inspect each of the above points in detail.</p>
|
||
<p>You may be thinking that many of the things described here could be
|
||
easily done with simple code in the package's post-installation target
|
||
(<code class="literal">post-install</code>). <span class="emphasis"><em>This is incorrect</em></span>,
|
||
as the code in them is only executed when building from source. Machines
|
||
using binary packages could not benefit from it at all (as the code itself
|
||
could be unavailable). Therefore, the only way to achieve any of the items
|
||
described above is by means of the installation scripts, which are
|
||
automatically generated by pkginstall.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="files-and-dirs-outside-prefix"></a>15.1. Files and directories outside the installation prefix</h2></div></div></div>
|
||
<p>As you already know, the <code class="filename">PLIST</code> file holds a list
|
||
of files and directories that belong to a package. The names used in it
|
||
are relative to the installation prefix (<code class="filename">${PREFIX}</code>),
|
||
which means that it cannot register files outside this directory (absolute
|
||
path names are not allowed). Despite this restriction, some packages need
|
||
to install files outside this location; e.g., under
|
||
<code class="filename">${VARBASE}</code> or
|
||
<code class="filename">${PKG_SYSCONFDIR}</code>. The only way to achieve this
|
||
is to create such files during installation time by using
|
||
installation scripts.</p>
|
||
<p>The generic installation scripts are shell scripts that can
|
||
contain arbitrary code. The list of scripts to execute is taken from
|
||
the <code class="varname">INSTALL_FILE</code> variable, which defaults to
|
||
<code class="filename">INSTALL</code>. A similar variable exists for package
|
||
removal (<code class="varname">DEINSTALL_FILE</code>, whose default is
|
||
<code class="filename">DEINSTALL</code>). These scripts can run arbitrary
|
||
commands, so they have the potential to create and manage files
|
||
anywhere in the file system.</p>
|
||
<p>Using these general installation files is not recommended, but
|
||
may be needed in some special cases. One reason for avoiding them is
|
||
that the user has to trust the packager that there is no unwanted or
|
||
simply erroneous code included in the installation script. Also,
|
||
previously there were many similar scripts for the same functionality,
|
||
and fixing a common error involved finding and changing all of
|
||
them.</p>
|
||
<p>The pkginstall framework offers another, standardized way. It
|
||
provides generic scripts to abstract the manipulation of such files
|
||
and directories based on variables set in the package's
|
||
<code class="filename">Makefile</code>. The rest of this section describes
|
||
these variables.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="dirs-outside-prefix"></a>15.1.1. Directory manipulation</h3></div></div></div>
|
||
<p>The following variables can be set to request the creation of
|
||
directories anywhere in the file system:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">MAKE_DIRS</code> and <code class="varname">OWN_DIRS</code>
|
||
contain a list of directories that should be created and should attempt
|
||
to be destroyed by the installation scripts. The difference between
|
||
the two is that the latter prompts the administrator to remove any
|
||
directories that may be left after deinstallation (because they were
|
||
not empty), while the former does not.</p></li>
|
||
<li class="listitem">
|
||
<p><code class="varname">MAKE_DIRS_PERMS</code> and
|
||
<code class="varname">OWN_DIRS_PERMS</code> contain a list of tuples describing
|
||
which directories should be created and should attempt to be destroyed
|
||
by the installation scripts. Each tuple holds the following values,
|
||
separated by spaces: the directory name, its owner, its group and its
|
||
numerical mode. For example:</p>
|
||
<pre class="programlisting">
|
||
MAKE_DIRS_PERMS+= ${VARBASE}/foo/private ${ROOT_USER} ${ROOT_GROUP} 0700
|
||
</pre>
|
||
<p>The difference between the two is exactly the same as their
|
||
non-<code class="varname">PERMS</code> counterparts.</p>
|
||
</li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="files-outside-prefix"></a>15.1.2. File manipulation</h3></div></div></div>
|
||
<p>Creating non-empty files outside the installation prefix is tricky
|
||
because the <code class="filename">PLIST</code> forces all files to be inside it.
|
||
To overcome this problem, the only solution is to extract the file in the
|
||
known place (i.e., inside the installation prefix) and copy it to the
|
||
appropriate location during installation (done by the installation scripts
|
||
generated by pkginstall). We will call the former the <span class="emphasis"><em>master
|
||
file</em></span> in the following paragraphs, which describe the variables
|
||
that can be used to automatically and consistently handle files outside the
|
||
installation prefix:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem">
|
||
<p><code class="varname">CONF_FILES</code> and
|
||
<code class="varname">REQD_FILES</code> are pairs of master and target files.
|
||
During installation time, the master file is copied to the target one
|
||
if and only if the latter does not exist. Upon deinstallation, the
|
||
target file is removed provided that it was not modified by the
|
||
installation.</p>
|
||
<p>The difference between the two is that the latter prompts the
|
||
administrator to remove any files that may be left after
|
||
deinstallation (because they were not empty), while the former does
|
||
not.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><code class="varname">CONF_FILES_PERMS</code> and
|
||
<code class="varname">REQD_FILES_PERMS</code> contain tuples describing master
|
||
files as well as their target locations. For each of them, it also
|
||
specifies their owner, their group and their numeric permissions, in
|
||
this order. For example:</p>
|
||
<pre class="programlisting">
|
||
REQD_FILES_PERMS+= ${PREFIX}/share/somefile ${VARBASE}/somefile ${ROOT_USER} ${ROOT_GROUP} 0700
|
||
</pre>
|
||
<p>The difference between the two is exactly the same as their
|
||
non-<code class="varname">PERMS</code> counterparts.</p>
|
||
</li>
|
||
</ul></div>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="conf-files"></a>15.2. Configuration files</h2></div></div></div>
|
||
<p>Configuration files are special in the sense that they are installed
|
||
in their own specific directory, <code class="varname">PKG_SYSCONFDIR</code>, and
|
||
need special treatment during installation (most of which is automated by
|
||
pkginstall). The main concept you must bear in mind is that files marked
|
||
as configuration files are automatically copied to the right place (somewhere
|
||
inside <code class="varname">PKG_SYSCONFDIR</code>) during installation <span class="emphasis"><em>if
|
||
and only if</em></span> they didn't exist before. Similarly, they will not
|
||
be removed if they have local modifications. This ensures that
|
||
administrators never lose any custom changes they may have made.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="conf-files-sysconfdir"></a>15.2.1. How <code class="varname">PKG_SYSCONFDIR</code> is set</h3></div></div></div>
|
||
<p>As said before, the <code class="varname">PKG_SYSCONFDIR</code> variable
|
||
specifies where configuration files shall be installed. Its contents are
|
||
set based upon the following variables:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">PKG_SYSCONFBASE</code>: The configuration's root
|
||
directory. Defaults to <code class="filename">${PREFIX}/etc</code> although it may
|
||
be overridden by the user to point to his preferred location (e.g.,
|
||
<code class="filename">/etc</code>, <code class="filename">/etc/pkg</code>, etc.).
|
||
Packages must not use it directly.</p></li>
|
||
<li class="listitem">
|
||
<p><code class="varname">PKG_SYSCONFSUBDIR</code>: A subdirectory of
|
||
<code class="varname">PKG_SYSCONFBASE</code> under which the configuration files
|
||
for the package being built shall be installed. The definition of this
|
||
variable only makes sense in the package's
|
||
<code class="filename">Makefile</code> (i.e., it is not user-customizable).</p>
|
||
<p>As an example, consider the Apache package,
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/www/apache24/README.html" target="_top"><code class="filename">www/apache24</code></a>, which places its
|
||
configuration files under the
|
||
<code class="filename">httpd/</code> subdirectory of
|
||
<code class="varname">PKG_SYSCONFBASE</code>. This should be set in the package
|
||
Makefile.</p>
|
||
</li>
|
||
<li class="listitem"><p><code class="varname">PKG_SYSCONFVAR</code>: Specifies the name of the
|
||
variable that holds this package's configuration directory (if
|
||
different from <code class="varname">PKG_SYSCONFBASE</code>). It defaults to
|
||
<code class="varname">PKGBASE</code>'s value, and is always prefixed with
|
||
<code class="literal">PKG_SYSCONFDIR</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_SYSCONFDIR.${PKG_SYSCONFVAR}</code>: Holds the
|
||
directory where the configuration files for the package identified by
|
||
<code class="varname">PKG_SYSCONFVAR</code>'s shall be placed.</p></li>
|
||
</ul></div>
|
||
<p>Based on the above variables, pkginstall determines the value of
|
||
<code class="varname">PKG_SYSCONFDIR</code>, which is the <span class="emphasis"><em>only</em></span>
|
||
variable that can be used within a package to refer to its configuration
|
||
directory. The algorithm used to set its value is basically the
|
||
following:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>If <code class="varname">PKG_SYSCONFDIR.${PKG_SYSCONFVAR}</code> is set,
|
||
its value is used.</p></li>
|
||
<li class="listitem"><p>If the previous variable is not defined but
|
||
<code class="varname">PKG_SYSCONFSUBDIR</code> is set in the package's
|
||
<code class="filename">Makefile</code>, the resulting value is
|
||
<code class="filename">${PKG_SYSCONFBASE}/${PKG_SYSCONFSUBDIR}</code>.</p></li>
|
||
<li class="listitem"><p>Otherwise, it is set to
|
||
<code class="filename">${PKG_SYSCONFBASE}</code>.</p></li>
|
||
</ol></div>
|
||
<p>It is worth mentioning that <code class="filename">${PKG_SYSCONFDIR}</code> is
|
||
automatically added to <code class="filename">OWN_DIRS</code>. See <a class="xref" href="#dirs-outside-prefix" title="15.1.1. Directory manipulation">Section 15.1.1, “Directory manipulation”</a> what this means. This does not apply to
|
||
subdirectories of <code class="filename">${PKG_SYSCONFDIR}</code>, they still have to
|
||
be created with OWN_DIRS or MAKE_DIRS.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="conf-files-configure"></a>15.2.2. Telling the software where configuration files are</h3></div></div></div>
|
||
<p>Given that pkgsrc (and users!) expect configuration files to be in a
|
||
known place, you need to teach each package where it shall install its
|
||
files. In some cases you will have to patch the package Makefiles to
|
||
achieve it. If you are lucky, though, it may be as easy as passing an
|
||
extra flag to the configuration script; this is the case of GNU Autoconf-
|
||
generated files:</p>
|
||
<pre class="programlisting">
|
||
CONFIGURE_ARGS+= --sysconfdir=${PKG_SYSCONFDIR}
|
||
</pre>
|
||
<p>Note that this specifies where the package has to <span class="emphasis"><em>look
|
||
for</em></span> its configuration files, not where they will be originally
|
||
installed (although the difference is never explicit,
|
||
unfortunately).</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="conf-files-patching"></a>15.2.3. Patching installations</h3></div></div></div>
|
||
<p>As said before, pkginstall automatically handles configuration files.
|
||
This means that <span class="strong"><strong>the packages themselves must not
|
||
touch the contents of <code class="filename">${PKG_SYSCONFDIR}</code>
|
||
directly</strong></span>. Bad news is that many software installation scripts
|
||
will, out of the box, mess with the contents of that directory. So what is
|
||
the correct procedure to fix this issue?</p>
|
||
<p>You must teach the package (usually by manually patching it) to
|
||
install any configuration files under the examples hierarchy,
|
||
<code class="filename">share/examples/${PKGBASE}/</code>. This way, the
|
||
<code class="filename">PLIST</code> registers them and the administrator always
|
||
has the original copies available.</p>
|
||
<p>Once the required configuration files are in place (i.e., under the
|
||
examples hierarchy), the pkginstall framework can use them as master copies
|
||
during the package installation to update what is in
|
||
<code class="filename">${PKG_SYSCONFDIR}</code>. To achieve this, the variables
|
||
<code class="varname">CONF_FILES</code> and <code class="varname">CONF_FILES_PERMS</code> are
|
||
used. Check out <a class="xref" href="#files-outside-prefix" title="15.1.2. File manipulation">Section 15.1.2, “File manipulation”</a> for information
|
||
about their syntax and their purpose. Here is an example, taken from the
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/mail/mutt/README.html" target="_top"><code class="filename">mail/mutt</code></a> package:</p>
|
||
<pre class="programlisting">
|
||
EGDIR= ${PREFIX}/share/doc/mutt/samples
|
||
CONF_FILES= ${EGDIR}/Muttrc ${PKG_SYSCONFDIR}/Muttrc
|
||
</pre>
|
||
<p>Note that the <code class="varname">EGDIR</code> variable is specific to that
|
||
package and has no meaning outside it.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="conf-files-disable"></a>15.2.4. Disabling handling of configuration files</h3></div></div></div>
|
||
<p>The automatic copying of config files can be toggled by setting the
|
||
environment variable <code class="varname">PKG_CONFIG</code> prior to package
|
||
installation.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="rcd-scripts"></a>15.3. System startup scripts</h2></div></div></div>
|
||
<p>System startup scripts are special files because they must be
|
||
installed in a place known by the underlying OS, usually outside the
|
||
installation prefix. Therefore, the same rules described in <a class="xref" href="#files-and-dirs-outside-prefix" title="15.1. Files and directories outside the installation prefix">Section 15.1, “Files and directories outside the installation prefix”</a> apply, and the same solutions
|
||
can be used. However, pkginstall provides a special mechanism to handle
|
||
these files.</p>
|
||
<p>In order to provide system startup scripts, the package has
|
||
to:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Store the script inside <code class="filename">${FILESDIR}</code>, with
|
||
the <code class="literal">.sh</code> suffix appended. Considering the
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/print/cups/README.html" target="_top"><code class="filename">print/cups</code></a> package as an example, it has a
|
||
<code class="filename">cupsd.sh</code> in its files directory.</p></li>
|
||
<li class="listitem">
|
||
<p>Tell pkginstall to handle it, appending the name of the script,
|
||
without its extension, to the <code class="varname">RCD_SCRIPTS</code> variable.
|
||
Continuing the previous example:</p>
|
||
<pre class="programlisting">
|
||
RCD_SCRIPTS+= cupsd
|
||
</pre>
|
||
</li>
|
||
</ol></div>
|
||
<p>Once this is done, pkginstall will do the following steps for each
|
||
script in an automated fashion:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Process the file found in the files directory applying all the
|
||
substitutions described in the <code class="filename">FILES_SUBST</code>
|
||
variable.</p></li>
|
||
<li class="listitem"><p>Copy the script from the files directory to the examples
|
||
hierarchy, <code class="filename">${PREFIX}/share/examples/rc.d/</code>. Note
|
||
that this master file must be explicitly registered in the
|
||
<code class="filename">PLIST</code>.</p></li>
|
||
<li class="listitem"><p>Add code to the installation scripts to copy the startup script
|
||
from the examples hierarchy into the system-wide startup scripts
|
||
directory.</p></li>
|
||
</ol></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="rcd-scripts-disable"></a>15.3.1. Disabling handling of system startup scripts</h3></div></div></div>
|
||
<p>The automatic copying of config files can be toggled by setting the
|
||
environment variable <code class="varname">PKG_RCD_SCRIPTS</code> prior to package
|
||
installation. Note that the scripts will be always copied inside the
|
||
examples hierarchy, <code class="filename">${PREFIX}/share/examples/rc.d/</code>, no
|
||
matter what the value of this variable is.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="users-and-groups"></a>15.4. System users and groups</h2></div></div></div>
|
||
<p>If a package needs to create special users and/or groups during
|
||
installation, it can do so by using the pkginstall framework.</p>
|
||
<p>Users can be created by adding entries to the
|
||
<code class="varname">PKG_USERS</code> variable. Each entry has the following
|
||
syntax:</p>
|
||
<pre class="programlisting">
|
||
user:group
|
||
</pre>
|
||
<p>Further specification of user details may be done by setting
|
||
per-user variables.
|
||
<code class="varname">PKG_UID.<em class="replaceable"><code>user</code></em></code> is the
|
||
numeric UID for the user.
|
||
<code class="varname">PKG_GECOS.<em class="replaceable"><code>user</code></em></code> is the
|
||
user's description or comment.
|
||
<code class="varname">PKG_HOME.<em class="replaceable"><code>user</code></em></code> is the
|
||
user's home directory, and defaults to
|
||
<code class="filename">/nonexistent</code> if not specified.
|
||
<code class="varname">PKG_SHELL.<em class="replaceable"><code>user</code></em></code> is the
|
||
user's shell, and defaults to <code class="filename">/sbin/nologin</code> if
|
||
not specified.</p>
|
||
<p>Similarly, groups can be created by adding entries to the
|
||
<code class="varname">PKG_GROUPS</code> variable, whose syntax is:</p>
|
||
<pre class="programlisting">
|
||
group
|
||
</pre>
|
||
<p>The numeric GID of the group may be set by defining
|
||
<code class="varname">PKG_GID.<em class="replaceable"><code>group</code></em></code>.</p>
|
||
<p>If a package needs to create the users and groups at an earlier
|
||
stage, then it can set <code class="varname">USERGROUP_PHASE</code> to
|
||
either <code class="literal">configure</code> or <code class="literal">build</code> to
|
||
indicate the phase before which the users and groups are created. In
|
||
this case, the numeric UIDs and GIDs of the created users and groups
|
||
are automatically hardcoded into the final installation scripts.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="shells"></a>15.5. System shells</h2></div></div></div>
|
||
<p>Packages that install system shells should register them in the shell
|
||
database, <code class="filename">/etc/shells</code>, to make things easier to the
|
||
administrator. This must be done from the installation scripts to keep
|
||
binary packages working on any system. pkginstall provides an easy way to
|
||
accomplish this task.</p>
|
||
<p>When a package provides a shell interpreter, it has to set the
|
||
<code class="varname">PKG_SHELL</code> variable to its absolute file name. This will
|
||
add some hooks to the installation scripts to handle it. Consider the
|
||
following example, taken from <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/shells/zsh/README.html" target="_top"><code class="filename">shells/zsh</code></a>:</p>
|
||
<pre class="programlisting">
|
||
PKG_SHELL= ${PREFIX}/bin/zsh
|
||
</pre>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="shells-disable"></a>15.5.1. Disabling shell registration</h3></div></div></div>
|
||
<p>The automatic registration of shell interpreters can be disabled by
|
||
the administrator by setting the <code class="filename">PKG_REGISTER_SHELLS</code>
|
||
environment variable to <code class="literal">NO</code>.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fonts"></a>15.6. Fonts</h2></div></div></div>
|
||
<p>Packages that install X11 fonts should update the database files
|
||
that index the fonts within each fonts directory. This can easily be
|
||
accomplished within the pkginstall framework.</p>
|
||
<p>When a package installs X11 fonts, it must list the directories in
|
||
which fonts are installed in the
|
||
<code class="varname">FONTS_DIRS.<em class="replaceable"><code>type</code></em></code> variables,
|
||
where <em class="replaceable"><code>type</code></em> can be one of <span class="quote">“<span class="quote">ttf</span>”</span>,
|
||
<span class="quote">“<span class="quote">type1</span>”</span> or <span class="quote">“<span class="quote">x11</span>”</span>. This will add hooks to the
|
||
installation scripts to run the appropriate commands to update the fonts
|
||
database files within each of those directories. For convenience, if the
|
||
directory path is relative, it is taken to be relative to the package's
|
||
installation prefix. Consider the following example, taken from <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/fonts/dbz-ttf/README.html" target="_top"><code class="filename">fonts/dbz-ttf</code></a>:</p>
|
||
<pre class="programlisting">
|
||
FONTS_DIRS.ttf= ${PREFIX}/share/fonts/X11/TTF
|
||
</pre>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="fonts-disable"></a>15.6.1. Disabling automatic update of the fonts databases</h3></div></div></div>
|
||
<p>The automatic update of fonts databases can be disabled by
|
||
the administrator by setting the <code class="filename">PKG_UPDATE_FONTS_DB</code>
|
||
environment variable to <code class="literal">NO</code>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="options"></a>Chapter 16. Options handling</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#global-default-options">16.1. Global default options</a></span></dt>
|
||
<dt><span class="sect1"><a href="#converting-to-options">16.2. Converting packages to use <code class="filename">bsd.options.mk</code></a></span></dt>
|
||
<dt><span class="sect1"><a href="#option-names">16.3. Option Names</a></span></dt>
|
||
<dt><span class="sect1"><a href="#option-build">16.4. Determining the options of dependencies</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<p>Many packages have the ability to be built to support different
|
||
sets of features. <code class="filename">bsd.options.mk</code> 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>
|
||
<p>There are two broad classes of behaviors that one might want to
|
||
control via options. One is whether some particular feature is
|
||
enabled in a program that will be built anyway, often by including or
|
||
not including a dependency on some other package. The other is
|
||
whether or not an additional program will be built as part of the
|
||
package. Generally, it is better to make a split package for such
|
||
additional programs instead of using options, because it enables
|
||
binary packages to be built which can then be added separately. For
|
||
example, the foo package might have minimal dependencies (those
|
||
packages without which foo doesn't make sense), and then the foo-gfoo
|
||
package might include the GTK frontend program gfoo. This is better
|
||
than including a gtk option to foo that adds gfoo, because either that
|
||
option is default, in which case binary users can't get foo without
|
||
gfoo, or not default, in which case they can't get gfoo. With split
|
||
packages, they can install foo without having GTK, and later decide to
|
||
install gfoo (pulling in GTK at that time). This is an advantage to
|
||
source users too, avoiding the need for rebuilds.</p>
|
||
<p>Plugins with widely varying dependencies should usually be split
|
||
instead of options.</p>
|
||
<p>It is often more work to maintain split packages, especially if
|
||
the upstream package does not support this. The decision of split
|
||
vs. option should be made based on the likelihood that users will want
|
||
or object to the various pieces, the size of the dependencies that are
|
||
included, and the amount of work.</p>
|
||
<p>A further consideration is licensing. Non-free parts, or parts
|
||
that depend on non-free dependencies (especially plugins) should
|
||
almost always be split if feasible.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="global-default-options"></a>16.1. Global default options</h2></div></div></div>
|
||
<p>Global default options are listed in
|
||
<code class="varname">PKG_DEFAULT_OPTIONS</code>, 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 <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="converting-to-options"></a>16.2. Converting packages to use <code class="filename">bsd.options.mk</code>
|
||
</h2></div></div></div>
|
||
<p>The following example shows how
|
||
<code class="filename">bsd.options.mk</code> should be used
|
||
by the hypothetical ``wibble'' package, either in the package
|
||
<code class="filename">Makefile</code>, or in a file,
|
||
e.g. <code class="filename">options.mk</code>, that is included by the
|
||
main package <code class="filename">Makefile</code>.</p>
|
||
<pre class="programlisting">
|
||
PKG_OPTIONS_VAR= PKG_OPTIONS.wibble
|
||
PKG_SUPPORTED_OPTIONS= wibble-foo ldap
|
||
PKG_OPTIONS_OPTIONAL_GROUPS= database
|
||
PKG_OPTIONS_GROUP.database= mysql pgsql
|
||
PKG_SUGGESTED_OPTIONS= wibble-foo
|
||
PKG_OPTIONS_LEGACY_VARS+= WIBBLE_USE_OPENLDAP:ldap
|
||
PKG_OPTIONS_LEGACY_OPTS+= foo:wibble-foo
|
||
|
||
.include "../../mk/bsd.prefs.mk"
|
||
|
||
# this package was previously named wibble2
|
||
.if defined(PKG_OPTIONS.wibble2)
|
||
PKG_LEGACY_OPTIONS+= ${PKG_OPTIONS.wibble2}
|
||
PKG_OPTIONS_DEPRECATED_WARNINGS+= \
|
||
"Deprecated variable PKG_OPTIONS.wibble2 used, use ${PKG_OPTIONS_VAR} instead."
|
||
.endif
|
||
|
||
.include "../../mk/bsd.options.mk"
|
||
|
||
# Package-specific option-handling
|
||
|
||
###
|
||
### FOO support
|
||
###
|
||
.if !empty(PKG_OPTIONS:Mwibble-foo)
|
||
CONFIGURE_ARGS+= --enable-foo
|
||
.endif
|
||
|
||
###
|
||
### LDAP support
|
||
###
|
||
.if !empty(PKG_OPTIONS:Mldap)
|
||
. include "../../databases/openldap-client/buildlink3.mk"
|
||
CONFIGURE_ARGS+= --enable-ldap=${BUILDLINK_PREFIX.openldap-client}
|
||
.endif
|
||
|
||
###
|
||
### database support
|
||
###
|
||
.if !empty(PKG_OPTIONS:Mmysql)
|
||
. include "../../mk/mysql.buildlink3.mk"
|
||
.endif
|
||
.if !empty(PKG_OPTIONS:Mpgsql)
|
||
. include "../../mk/pgsql.buildlink3.mk"
|
||
.endif
|
||
</pre>
|
||
<p>The first 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 class="orderedlist" type="1">
|
||
<li class="listitem"><p><code class="varname">PKG_OPTIONS_VAR</code> is the name of the
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> variable that the user can set to override the default
|
||
options. It should be set to
|
||
PKG_OPTIONS.<em class="replaceable"><code>pkgbase</code></em>. Do not set it to
|
||
PKG_OPTIONS.${PKGBASE}, since <code class="varname">PKGBASE</code> is not defined
|
||
at the point where the options are processed.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_SUPPORTED_OPTIONS</code> is a list of
|
||
build options supported by the package.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_OPTIONS_OPTIONAL_GROUPS</code> is a
|
||
list of names of groups of mutually exclusive options. The options in
|
||
each group are listed in
|
||
<code class="varname">PKG_OPTIONS_GROUP.<em class="replaceable"><code>groupname</code></em></code>.
|
||
The most specific setting of any option from the group takes
|
||
precedence over all other options in the group. Options from the
|
||
groups will be automatically added to
|
||
<code class="varname">PKG_SUPPORTED_OPTIONS</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_OPTIONS_REQUIRED_GROUPS</code> is like
|
||
<code class="varname">PKG_OPTIONS_OPTIONAL_GROUPS</code>, but building the
|
||
packages will fail if no option from the group is
|
||
selected.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_OPTIONS_NONEMPTY_SETS</code> is a list
|
||
of names of sets of options. At least one option from each set must
|
||
be selected. The options in each set are listed in
|
||
<code class="varname">PKG_OPTIONS_SET.<em class="replaceable"><code>setname</code></em></code>.
|
||
Options from the sets will be automatically added to
|
||
<code class="varname">PKG_SUPPORTED_OPTIONS</code>. Building the package will
|
||
fail if no option from the set is selected.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_SUGGESTED_OPTIONS</code> is a list of
|
||
build options which are enabled by default.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_OPTIONS_LEGACY_VARS</code> is a list
|
||
of
|
||
<span class="quote">“<span class="quote"><em class="replaceable"><code>USE_VARIABLE</code></em>:<em class="replaceable"><code>option</code></em></span>”</span>
|
||
pairs that map legacy <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> variables to
|
||
their option counterparts. Pairs should be added with
|
||
<span class="quote">“<span class="quote">+=</span>”</span> to keep the listing of global legacy variables. A
|
||
warning will be issued if the user uses a legacy
|
||
variable.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_OPTIONS_LEGACY_OPTS</code> is a list
|
||
of
|
||
<span class="quote">“<span class="quote"><em class="replaceable"><code>old-option</code></em>:<em class="replaceable"><code>new-option</code></em></span>”</span>
|
||
pairs that map options that have been renamed to their new
|
||
counterparts. Pairs should be added with <span class="quote">“<span class="quote">+=</span>”</span> to keep
|
||
the listing of global legacy options. A warning will be issued if
|
||
the user uses a legacy option.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_LEGACY_OPTIONS</code> is a list of
|
||
options implied by deprecated variables used. This can be used for
|
||
cases that neither <code class="varname">PKG_OPTIONS_LEGACY_VARS</code> nor
|
||
<code class="varname">PKG_OPTIONS_LEGACY_OPTS</code> can handle, e. g. when
|
||
<code class="varname">PKG_OPTIONS_VAR</code> is renamed.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_OPTIONS_DEPRECATED_WARNINGS</code> is
|
||
a list of warnings about deprecated variables or options used, and
|
||
what to use instead.</p></li>
|
||
</ol></div>
|
||
<p>A package should never modify
|
||
<code class="varname">PKG_DEFAULT_OPTIONS</code> or the variable named in
|
||
<code class="varname">PKG_OPTIONS_VAR</code>. These are strictly user-settable.
|
||
To suggest a default set of options, use
|
||
<code class="varname">PKG_SUGGESTED_OPTIONS</code>.</p>
|
||
<p><code class="varname">PKG_OPTIONS_VAR</code> must be defined before
|
||
including <code class="filename">bsd.options.mk</code>. If none of
|
||
<code class="varname">PKG_SUPPORTED_OPTIONS</code>,
|
||
<code class="varname">PKG_OPTIONS_OPTIONAL_GROUPS</code>, and
|
||
<code class="varname">PKG_OPTIONS_REQUIRED_GROUPS</code> are defined (as can
|
||
happen with platform-specific options if none of them is supported on
|
||
the current platform), <code class="varname">PKG_OPTIONS</code> is set to the
|
||
empty list and the package is otherwise treated as not using the
|
||
options framework.</p>
|
||
<p>After the inclusion of <code class="filename">bsd.options.mk</code>, the
|
||
variable <code class="varname">PKG_OPTIONS</code> contains the list of selected
|
||
build options, properly filtered to remove unsupported and duplicate
|
||
options.</p>
|
||
<p>The remaining sections contain the logic that is specific to
|
||
each option. The correct way to check for an option is to check
|
||
whether it is listed in <code class="varname">PKG_OPTIONS</code>:</p>
|
||
<pre class="programlisting">
|
||
.if !empty(PKG_OPTIONS:M<em class="replaceable"><code>option</code></em>)
|
||
</pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="option-names"></a>16.3. Option Names</h2></div></div></div>
|
||
<p>Options that enable similar features in different packages (like
|
||
optional support for a library) should use a common name in all
|
||
packages that support it (like the name of the library). If another
|
||
package already has an option with the same meaning, use the same
|
||
name.</p>
|
||
<p>Options that enable features specific to one package, where it's
|
||
unlikely that another (unrelated) package has the same (or a similar)
|
||
optional feature, should use a name prefixed with
|
||
<code class="varname"><em class="replaceable"><code>pkgname</code></em>-</code>.</p>
|
||
<p>If a group of related packages share an optional feature
|
||
specific to that group, prefix it with the name of the
|
||
<span class="quote">“<span class="quote">main</span>”</span> package
|
||
(e. g. <code class="varname">djbware-errno-hack</code>).</p>
|
||
<p>For new options, add a line to
|
||
<code class="filename">mk/defaults/options.description</code>. Lines have two
|
||
fields, separated by tab. The first field is the option name, the
|
||
second its description. The description should be a whole sentence
|
||
(starting with an uppercase letter and ending with a period) that
|
||
describes what enabling the option does. E. g. <span class="quote">“<span class="quote">Enable ispell
|
||
support.</span>”</span> The file is sorted by option names.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="option-build"></a>16.4. Determining the options of dependencies</h2></div></div></div>
|
||
<p>When writing <a class="link" href="#buildlink3.mk"><code class="filename">buildlink3.mk</code></a> files, it is often necessary to list
|
||
different dependencies based on the options with which the package was
|
||
built. For querying these options, the file
|
||
<code class="filename">pkgsrc/mk/pkg-build-options.mk</code> should be used. A
|
||
typical example looks like this:</p>
|
||
<pre class="programlisting">
|
||
pkgbase := libpurple
|
||
.include "../../mk/pkg-build-options.mk"
|
||
|
||
.if !empty(PKG_BUILD_OPTIONS.libpurple:Mdbus)
|
||
...
|
||
.endif
|
||
</pre>
|
||
<p>Including <code class="filename">pkg-build-options.mk</code> here will set
|
||
the variable <code class="varname">PKG_BUILD_OPTIONS.libpurple</code> to the build
|
||
options of the libpurple package, which can then be queried like
|
||
<code class="varname">PKG_OPTIONS</code> in the <code class="filename">options.mk</code>
|
||
file. See the file <code class="filename">pkg-build-options.mk</code> for more
|
||
details.</p>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="build"></a>Chapter 17. The build process</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#build.intro">17.1. Introduction</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.prefix">17.2. Program location</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.builddirs">17.3. Directories used during the build process</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.running">17.4. Running a phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.fetch">17.5. The <span class="emphasis"><em>fetch</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#build.fetch.what">17.5.1. What to fetch and where to get it from</a></span></dt>
|
||
<dt><span class="sect2"><a href="#build.fetch.how">17.5.2. How are the files fetched?</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#build.checksum">17.6. The <span class="emphasis"><em>checksum</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.extract">17.7. The <span class="emphasis"><em>extract</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.patch">17.8. The <span class="emphasis"><em>patch</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.tools">17.9. The <span class="emphasis"><em>tools</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.wrapper">17.10. The <span class="emphasis"><em>wrapper</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.configure">17.11. The <span class="emphasis"><em>configure</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.build">17.12. The <span class="emphasis"><em>build</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.test">17.13. The <span class="emphasis"><em>test</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.install">17.14. The <span class="emphasis"><em>install</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.package">17.15. The <span class="emphasis"><em>package</em></span> phase</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.clean">17.16. Cleaning up</a></span></dt>
|
||
<dt><span class="sect1"><a href="#build.helpful-targets">17.17. Other helpful targets</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.intro"></a>17.1. Introduction</h2></div></div></div>
|
||
<p>This chapter gives a detailed description on how a package is
|
||
built. Building a package is separated into different
|
||
<span class="emphasis"><em>phases</em></span> (for example <code class="varname">fetch</code>,
|
||
<code class="varname">build</code>, <code class="varname">install</code>), all of which are
|
||
described in the following sections. Each phase is split into
|
||
so-called <span class="emphasis"><em>stages</em></span>, which take the name of the
|
||
containing phase, prefixed by one of <code class="varname">pre-</code>,
|
||
<code class="varname">do-</code> or <code class="varname">post-</code>. (Examples are
|
||
<code class="varname">pre-configure</code>, <code class="varname">post-build</code>.) Most
|
||
of the actual work is done in the <code class="varname">do-*</code> stages.</p>
|
||
<p>Never override the regular targets (like
|
||
<code class="varname">fetch</code>), if you have to, override the
|
||
<code class="varname">do-*</code> ones instead.</p>
|
||
<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 pkgsrc-specific patches
|
||
to compile properly 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.</p>
|
||
<p>To get more details about what is happening at each step,
|
||
you can set the <code class="varname">PKG_VERBOSE</code> variable, or the
|
||
<code class="varname">PATCH_DEBUG</code> variable if you are just interested
|
||
in more details about the <span class="emphasis"><em>patch</em></span> step.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.prefix"></a>17.2. 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 <code class="varname">PREFIX</code> indicates
|
||
where all files of the final program shall be installed. It is
|
||
usually set to <code class="varname">LOCALBASE</code>
|
||
(<code class="filename">/usr/pkg</code>), or <code class="varname">CROSSBASE</code>
|
||
for pkgs in the <code class="filename">cross</code> category. The value of
|
||
<code class="varname">PREFIX</code> needs to be put
|
||
into the various places in the program's source where paths to
|
||
these files are encoded. See <a class="xref" href="#components.patches" title="11.3. patches/*">Section 11.3, “patches/*”</a> and <a class="xref" href="#fixes.libtool" title="19.3.1. Shared libraries - libtool">Section 19.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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">PREFIX</code> 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">“<span class="quote">${PREFIX}</span>”</span>.</p></li>
|
||
<li class="listitem"><p><code class="varname">LOCALBASE</code> 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">“<span class="quote">${LOCALBASE}</span>”</span>. The name
|
||
<code class="varname">LOCALBASE</code> stems from FreeBSD, which
|
||
installed all packages in <code class="filename">/usr/local</code>. As
|
||
pkgsrc leaves <code class="filename">/usr/local</code> for the system
|
||
administrator, this variable is a misnomer.</p></li>
|
||
<li class="listitem"><p><code class="varname">X11BASE</code> 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 package), use <span class="quote">“<span class="quote">${X11BASE}</span>”</span>.</p></li>
|
||
<li class="listitem"><p>X11-based packages using imake must set
|
||
<code class="varname">USE_IMAKE</code> to be installed correctly under
|
||
<code class="varname">LOCALBASE</code>.</p></li>
|
||
<li class="listitem">
|
||
<p>To determine the prefix of an
|
||
installed package, the <code class="varname">EVAL_PREFIX</code>
|
||
definition can be used. It takes pairs in the format
|
||
<span class="quote">“<span class="quote">DIRNAME=<package></span>”</span>, and the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a>
|
||
variable <code class="varname">DIRNAME</code> will be set to the prefix
|
||
of the installed package <package>, or
|
||
<span class="quote">“<span class="quote">${PREFIX}</span>”</span> if the package is not
|
||
installed.</p>
|
||
<p>This is best illustrated by example.</p>
|
||
<p>The following lines are taken from
|
||
<code class="filename">pkgsrc/wm/scwm/Makefile</code>:</p>
|
||
<pre class="programlisting">
|
||
EVAL_PREFIX+= GTKDIR=gtk+
|
||
CONFIGURE_ARGS+= --with-guile-prefix=${LOCALBASE:Q}
|
||
CONFIGURE_ARGS+= --with-gtk-prefix=${GTKDIR:Q}
|
||
CONFIGURE_ARGS+= --enable-multibyte
|
||
</pre>
|
||
<p>Specific defaults can be defined for the packages
|
||
evaluated using <code class="varname">EVAL_PREFIX</code>, by using a
|
||
definition of the form:</p>
|
||
<pre class="programlisting">
|
||
GTKDIR_DEFAULT= ${LOCALBASE}
|
||
</pre>
|
||
<p>where <code class="varname">GTKDIR</code> corresponds
|
||
to the first definition in
|
||
the <code class="varname">EVAL_PREFIX</code> pair.</p>
|
||
</li>
|
||
<li class="listitem"><p>Within <code class="filename">${PREFIX}</code>, packages should
|
||
install files according to <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?hier+7+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">hier</span>(7)</span></a>, with the exception that
|
||
manual pages go into <code class="filename">${PREFIX}/man</code>, not
|
||
<code class="filename">${PREFIX}/share/man</code>.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.builddirs"></a>17.3. Directories used during the build process</h2></div></div></div>
|
||
<p>When building a package, various directories are used to store
|
||
source files, temporary files, pkgsrc-internal files, and so on. These
|
||
directories are explained here.</p>
|
||
<p>Some of the directory variables contain relative pathnames. There
|
||
are two common base directories for these relative directories:
|
||
<code class="varname">PKGSRCDIR/PKGPATH</code> is used for directories that are
|
||
pkgsrc-specific. <code class="varname">WRKSRC</code> is used for directories
|
||
inside the package itself.</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">PKGSRCDIR</code></span></dt>
|
||
<dd><p>This is an absolute pathname that points to the pkgsrc
|
||
root directory. Generally, you don't need
|
||
it.</p></dd>
|
||
<dt><span class="term"><code class="varname">PKGDIR</code></span></dt>
|
||
<dd><p>This is an absolute pathname that points to the
|
||
current package.</p></dd>
|
||
<dt><span class="term"><code class="varname">PKGPATH</code></span></dt>
|
||
<dd><p>This is a pathname relative to
|
||
<code class="varname">PKGSRCDIR</code> that points to the current
|
||
package.</p></dd>
|
||
<dt><span class="term"><code class="varname">WRKDIR</code></span></dt>
|
||
<dd><p>This is an absolute pathname pointing to the directory
|
||
where all work takes place. The distfiles are extracted to this
|
||
directory. It also contains temporary directories and log files used by
|
||
the various pkgsrc frameworks, like <span class="emphasis"><em>buildlink</em></span> or
|
||
the <span class="emphasis"><em>wrappers</em></span>.</p></dd>
|
||
<dt><span class="term"><code class="varname">WRKSRC</code></span></dt>
|
||
<dd><p>This is an absolute pathname pointing to the directory
|
||
where the distfiles are extracted. It is usually a direct subdirectory
|
||
of <code class="varname">WRKDIR</code>, and often it's the only directory entry
|
||
that isn't hidden. This variable may be changed by a package
|
||
<code class="filename">Makefile</code>.</p></dd>
|
||
</dl></div>
|
||
<p>The <code class="varname">CREATE_WRKDIR_SYMLINK</code> definition takes either
|
||
the value <span class="emphasis"><em>yes</em></span> or <span class="emphasis"><em>no</em></span> and defaults
|
||
to <span class="emphasis"><em>no</em></span>. It indicates whether a symbolic link to the
|
||
<code class="varname">WRKDIR</code> is to be created in the pkgsrc entry's directory.
|
||
If users would like to have their pkgsrc trees behave in a
|
||
read-only manner, then the value of
|
||
<code class="varname">CREATE_WRKDIR_SYMLINK</code> should be set to
|
||
<span class="emphasis"><em>no</em></span>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.running"></a>17.4. Running a phase</h2></div></div></div>
|
||
<p>You can run a particular phase by typing <span class="command"><strong>make
|
||
phase</strong></span>, where <span class="emphasis"><em>phase</em></span> is the name of the
|
||
phase. This will automatically run all phases that are required for this
|
||
phase. The default phase is <code class="varname">build</code>, that is, when you
|
||
run <span class="command"><strong>make</strong></span> without parameters in a package directory,
|
||
the package will be built, but not installed.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.fetch"></a>17.5. The <span class="emphasis"><em>fetch</em></span> phase</h2></div></div></div>
|
||
<p>The first step in building a package is to fetch the
|
||
distribution files (distfiles) from the sites that are providing
|
||
them. This is the task of the <span class="emphasis"><em>fetch</em></span>
|
||
phase.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="build.fetch.what"></a>17.5.1. What to fetch and where to get it from</h3></div></div></div>
|
||
<p>In simple cases, <code class="varname">MASTER_SITES</code>
|
||
defines all URLs from where the distfile, whose name is
|
||
derived from the <code class="varname">DISTNAME</code> variable, is
|
||
fetched. The more complicated cases are described
|
||
below.</p>
|
||
<p>The variable <code class="varname">DISTFILES</code> specifies
|
||
the list of distfiles that have to be fetched. Its value
|
||
defaults to <code class="literal">${DEFAULT_DISTFILES}</code> and
|
||
its value is <code class="literal">${DISTNAME}${EXTRACT_SUFX}</code>,
|
||
so that most packages don't need to define it at all.
|
||
<code class="varname">EXTRACT_SUFX</code> is
|
||
<code class="literal">.tar.gz</code> by default, but can be changed
|
||
freely. Note that if your package requires additional
|
||
distfiles to the default one, you cannot just append the
|
||
additional filenames using the <code class="literal">+=</code>
|
||
operator, but you have write for example:</p>
|
||
<pre class="programlisting">
|
||
DISTFILES= ${DEFAULT_DISTFILES} additional-files.tar.gz
|
||
</pre>
|
||
<p>Each distfile is fetched from a list of sites, usually
|
||
<code class="varname">MASTER_SITES</code>. If the package has multiple
|
||
<code class="varname">DISTFILES</code> or multiple
|
||
<code class="varname">PATCHFILES</code> from different sites, you can
|
||
set
|
||
<code class="varname">SITES.<em class="replaceable"><code>distfile</code></em></code>
|
||
to the list of URLs where the file
|
||
<code class="filename"><em class="replaceable"><code>distfile</code></em></code>
|
||
(including the suffix) can be found.</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>When actually fetching the distfiles, each item from
|
||
<code class="varname">MASTER_SITES</code> or
|
||
<code class="varname">SITES.*</code> gets the name of each distfile
|
||
appended to it, without an intermediate slash. Therefore,
|
||
all site values have to end with a slash or other separator
|
||
character. This allows for example to set
|
||
<code class="varname">MASTER_SITES</code> to a URL of a CGI script
|
||
that gets the name of the distfile as a parameter. In this
|
||
case, the definition would look like:</p>
|
||
<pre class="programlisting">
|
||
MASTER_SITES= http://www.example.com/download.cgi?file=
|
||
</pre>
|
||
<p> The exception to this rule are URLs starting with a dash.
|
||
In that case the URL is taken as is, fetched and the result
|
||
stored under the name of the distfile. You can use this style
|
||
for the case when the download URL style does not match the
|
||
above common case. For example, if permanent download URL is a
|
||
redirector to the real download URL, or the download file name
|
||
is offered by an HTTP Content-Disposition header. In the
|
||
following example, <code class="filename">foo-1.0.0.tar.gz</code> will be
|
||
created instead of the default
|
||
<code class="filename">v1.0.0.tar.gz</code>.</p>
|
||
<pre class="programlisting">
|
||
DISTNAME= foo-1.0.0
|
||
MASTER_SITES= -http://www.example.com/archive/v1.0.0.tar.gz
|
||
</pre>
|
||
<p>There are some predefined values for
|
||
<code class="varname">MASTER_SITES</code>, which can be used in
|
||
packages. The names of the variables should speak for
|
||
themselves.</p>
|
||
<pre class="programlisting">
|
||
${MASTER_SITE_APACHE}
|
||
${MASTER_SITE_BACKUP}
|
||
${MASTER_SITE_CYGWIN}
|
||
${MASTER_SITE_DEBIAN}
|
||
${MASTER_SITE_FREEBSD}
|
||
${MASTER_SITE_FREEBSD_LOCAL}
|
||
${MASTER_SITE_GENTOO}
|
||
${MASTER_SITE_GNOME}
|
||
${MASTER_SITE_GNU}
|
||
${MASTER_SITE_GNUSTEP}
|
||
${MASTER_SITE_HASKELL_HACKAGE}
|
||
${MASTER_SITE_IFARCHIVE}
|
||
${MASTER_SITE_KDE}
|
||
${MASTER_SITE_MOZILLA}
|
||
${MASTER_SITE_MOZILLA_ALL}
|
||
${MASTER_SITE_MOZILLA_ESR}
|
||
${MASTER_SITE_MYSQL}
|
||
${MASTER_SITE_NETLIB}
|
||
${MASTER_SITE_OPENOFFICE}
|
||
${MASTER_SITE_OSDN}
|
||
${MASTER_SITE_PERL_CPAN}
|
||
${MASTER_SITE_PGSQL}
|
||
${MASTER_SITE_RUBYGEMS}
|
||
${MASTER_SITE_R_CRAN}
|
||
${MASTER_SITE_SOURCEFORGE}
|
||
${MASTER_SITE_SUNSITE}
|
||
${MASTER_SITE_SUSE}
|
||
${MASTER_SITE_TEX_CTAN}
|
||
${MASTER_SITE_XCONTRIB}
|
||
${MASTER_SITE_XEMACS}
|
||
${MASTER_SITE_XORG}
|
||
</pre>
|
||
<p>Some explanations for the less self-explaining ones:
|
||
<code class="varname">MASTER_SITE_BACKUP</code> contains backup sites
|
||
for packages that are maintained in <a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/%24%7BDIST_SUBDIR%7D" target="_top">ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/${DIST_SUBDIR}</a>. <code class="varname">MASTER_SITE_LOCAL</code> contains local
|
||
package source distributions that are maintained in <a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/LOCAL_PORTS/" target="_top">ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/LOCAL_PORTS/</a>.</p>
|
||
<p>If you choose one of these predefined sites, you may
|
||
want 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_SITES= ${MASTER_SITE_GNU:=subdirectory/name/}
|
||
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=project_name/}
|
||
</pre>
|
||
<p>Note the trailing slash after the subdirectory
|
||
name.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="build.fetch.how"></a>17.5.2. How are the files fetched?</h3></div></div></div>
|
||
<p>The <span class="emphasis"><em>fetch</em></span> phase makes sure that
|
||
all the distfiles exist in a local directory
|
||
(<code class="varname">DISTDIR</code>, which can be set by the pkgsrc
|
||
user). If the files do not exist, they are fetched using
|
||
commands of the form</p>
|
||
<pre class="programlisting">
|
||
${FETCH_CMD} ${FETCH_BEFORE_ARGS} ${site}${file} ${FETCH_AFTER_ARGS}
|
||
</pre>
|
||
<p>where <code class="literal">${site}</code> varies through
|
||
several possibilities in turn: first,
|
||
<code class="varname">MASTER_SITE_OVERRIDE</code> is tried, then the
|
||
sites specified in either <code class="varname">SITES.file</code> if
|
||
defined, else <code class="varname">MASTER_SITES</code> or
|
||
<code class="varname">PATCH_SITES</code>, as applies, then finally the
|
||
value of <code class="varname">MASTER_SITE_BACKUP</code>. The order of
|
||
all except the first and the last can be optionally sorted
|
||
by the user, via setting either
|
||
<code class="varname">MASTER_SORT_RANDOM</code>, and
|
||
<code class="varname">MASTER_SORT_AWK</code> or
|
||
<code class="varname">MASTER_SORT_REGEX</code>.</p>
|
||
<p> The specific command and arguments used depend on the
|
||
<code class="varname">FETCH_USING</code> parameter. The example above is
|
||
for <code class="literal">FETCH_USING=custom</code>.</p>
|
||
<p>The distfiles mirror run by the NetBSD Foundation uses the
|
||
<span class="emphasis"><em>mirror-distfiles</em></span> target to mirror the
|
||
distfiles, if they are freely distributable. Packages setting
|
||
<code class="varname">NO_SRC_ON_FTP</code> (usually to
|
||
<span class="quote">“<span class="quote">${RESTRICTED}</span>”</span>) will not have their distfiles
|
||
mirrored.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.checksum"></a>17.6. The <span class="emphasis"><em>checksum</em></span> phase</h2></div></div></div>
|
||
<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>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.extract"></a>17.7. The <span class="emphasis"><em>extract</em></span> phase</h2></div></div></div>
|
||
<p>When the distfiles are present on the local system, they
|
||
need to be extracted, as they usually come in the form of some
|
||
compressed archive format.</p>
|
||
<p>By default, all <code class="varname">DISTFILES</code> are
|
||
extracted. If you only need some of them, you can set the
|
||
<code class="varname">EXTRACT_ONLY</code> variable to the list of those
|
||
files.</p>
|
||
<p>Extracting the files is usually done by a little
|
||
program, <code class="filename">mk/extract/extract</code>, which
|
||
already knows how to extract various archive formats, so most
|
||
likely you will not need to change anything here. But if you
|
||
need, the following variables may help you:</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">EXTRACT_OPTS_{BIN,LHA,PAX,RAR,TAR,ZIP,ZOO}</code></span></dt>
|
||
<dd><p>Use these variables to override the default
|
||
options for an extract command, which are defined in
|
||
<code class="filename">mk/extract/extract</code>.</p></dd>
|
||
<dt><span class="term"><code class="varname">EXTRACT_USING</code></span></dt>
|
||
<dd><p>This variable can be set to
|
||
<code class="literal">bsdtar</code>, <code class="literal">gtar</code>, <code class="literal">nbtar</code>
|
||
(which is the default value), <code class="literal">pax</code>, or an
|
||
absolute pathname pointing to the command with which tar
|
||
archives should be extracted. It is preferred to choose bsdtar over gtar
|
||
if NetBSD's pax-as-tar is not good enough.</p></dd>
|
||
</dl></div>
|
||
<p>If the <code class="filename">extract</code> program doesn't
|
||
serve your needs, you can also override the
|
||
<code class="varname">EXTRACT_CMD</code> variable, which holds the
|
||
command used for extracting the files. This command is
|
||
executed in the <code class="filename">${WRKSRC}</code>
|
||
directory. During execution of this command, the shell
|
||
variable <code class="varname">extract_file</code> holds the absolute
|
||
pathname of the file that is going to be extracted.</p>
|
||
<p>And if that still does not suffice, you can override the
|
||
<code class="varname">do-extract</code> target in the package
|
||
Makefile.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.patch"></a>17.8. The <span class="emphasis"><em>patch</em></span> phase</h2></div></div></div>
|
||
<p>After extraction, all the patches named by the
|
||
<code class="varname">PATCHFILES</code>, those present in the patches
|
||
subdirectory of the package as well as in
|
||
$LOCALPATCHES/$PKGPATH (e.g.
|
||
<code class="filename">/usr/local/patches/graphics/png</code>) are
|
||
applied. Patchfiles ending in <code class="filename">.Z</code> or
|
||
<code class="filename">.gz</code> are uncompressed before they are
|
||
applied, files ending in <code class="filename">.orig</code> or
|
||
<code class="filename">.rej</code> are ignored. Any special options to
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?patch+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">patch</span>(1)</span></a> can be handed in
|
||
<code class="varname">PATCH_DIST_ARGS</code>. See <a class="xref" href="#components.patches" title="11.3. patches/*">Section 11.3, “patches/*”</a> for more details.</p>
|
||
<p>By default <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?patch+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">patch</span>(1)</span></a> 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>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.tools"></a>17.9. The <span class="emphasis"><em>tools</em></span> phase</h2></div></div></div>
|
||
<p>This is covered in <a class="xref" href="#tools" title="Chapter 18. Tools needed for building or running">Chapter 18, <i>Tools needed for building or running</i></a>.
|
||
</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.wrapper"></a>17.10. The <span class="emphasis"><em>wrapper</em></span> phase</h2></div></div></div>
|
||
<p>This phase creates wrapper programs for the compilers and
|
||
linkers. The following variables can be used to tweak the
|
||
wrappers.</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">ECHO_WRAPPER_MSG</code></span></dt>
|
||
<dd><p>The command used to print progress
|
||
messages. Does nothing by default. Set to
|
||
<code class="literal">${ECHO}</code> to see the progress
|
||
messages.</p></dd>
|
||
<dt><span class="term"><code class="varname">WRAPPER_DEBUG</code></span></dt>
|
||
<dd><p>This variable can be set to
|
||
<code class="literal">yes</code> (default) or <code class="literal">no</code>,
|
||
depending on whether you want additional information in the
|
||
wrapper log file.</p></dd>
|
||
<dt><span class="term"><code class="varname">WRAPPER_UPDATE_CACHE</code></span></dt>
|
||
<dd><p>This variable can be set to
|
||
<code class="literal">yes</code> or <code class="literal">no</code>, depending
|
||
on whether the wrapper should use its cache, which will
|
||
improve the speed. The default value is
|
||
<code class="literal">yes</code>, but is forced to
|
||
<code class="literal">no</code> if the platform does not support
|
||
it.</p></dd>
|
||
<dt><span class="term"><code class="varname">WRAPPER_REORDER_CMDS</code></span></dt>
|
||
<dd><p>A list of reordering commands. A reordering
|
||
command has the form
|
||
<code class="literal">reorder:l:<em class="replaceable"><code>lib1</code></em>:<em class="replaceable"><code>lib2</code></em></code>.
|
||
It ensures that that
|
||
<code class="literal">-l<em class="replaceable"><code>lib1</code></em></code> occurs
|
||
before <code class="literal">-l<em class="replaceable"><code>lib2</code></em></code>.
|
||
</p></dd>
|
||
<dt><span class="term"><code class="varname">WRAPPER_TRANSFORM_CMDS</code></span></dt>
|
||
<dd><p>A list of transformation commands. [TODO:
|
||
investigate further]</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.configure"></a>17.11. The <span class="emphasis"><em>configure</em></span> phase</h2></div></div></div>
|
||
<p>Most pieces of software need information on the header
|
||
files, system calls, and library routines which are available
|
||
on the platform they run on. The process of determining this
|
||
information is known as configuration, and is usually
|
||
automated. In most cases, a script is supplied with the
|
||
distfiles, and its invocation results in generation of header
|
||
files, Makefiles, etc.</p>
|
||
<p>If the package contains a configure script, this can be
|
||
invoked by setting <code class="varname">HAS_CONFIGURE</code> to
|
||
<span class="quote">“<span class="quote">yes</span>”</span>. If the configure script is a GNU autoconf
|
||
script, you should set <code class="varname">GNU_CONFIGURE</code> to
|
||
<span class="quote">“<span class="quote">yes</span>”</span> instead. What happens in the
|
||
<span class="emphasis"><em>configure</em></span> phase is roughly:</p>
|
||
<pre class="programlisting">
|
||
.for d in ${CONFIGURE_DIRS}
|
||
cd ${WRKSRC} \
|
||
&& cd ${d} \
|
||
&& env ${CONFIGURE_ENV} ${CONFIGURE_SCRIPT} ${CONFIGURE_ARGS}
|
||
.endfor
|
||
</pre>
|
||
<p><code class="varname">CONFIGURE_DIRS</code> (default:
|
||
<span class="quote">“<span class="quote">.</span>”</span>) is a list of pathnames relative to
|
||
<code class="varname">WRKSRC</code>. In each of these directories, the
|
||
configure script is run with the environment
|
||
<code class="varname">CONFIGURE_ENV</code> and arguments
|
||
<code class="varname">CONFIGURE_ARGS</code>. The variables
|
||
<code class="varname">CONFIGURE_ENV</code>,
|
||
<code class="varname">CONFIGURE_SCRIPT</code> (default:
|
||
<span class="quote">“<span class="quote">./configure</span>”</span>) and
|
||
<code class="varname">CONFIGURE_ARGS</code> may all be changed by the
|
||
package.</p>
|
||
<p>If the program uses the Perl way of configuration (mainly Perl
|
||
modules, but not only), i.e. a file called
|
||
<code class="filename">Makefile.PL</code>, it should include
|
||
<code class="filename">../../lang/perl5/module.mk</code>. To set any parameter for
|
||
<code class="filename">Makefile.PL</code> use the <code class="varname">MAKE_PARAMS</code>
|
||
variable (e.g., <code class="literal">MAKE_PARAMS+=foo=bar</code></p>
|
||
<p>If the program uses an <code class="filename">Imakefile</code>
|
||
for configuration, the appropriate steps can be invoked by
|
||
setting <code class="varname">USE_IMAKE</code> to
|
||
<span class="quote">“<span class="quote">yes</span>”</span>. If you only need xmkmf, add it to <code class="varname">USE_TOOLS</code>.
|
||
You can add variables to xmkmf's environment by adding them to the
|
||
<code class="varname">SCRIPTS_ENV</code> variable.</p>
|
||
<p>If the program uses <code class="filename">cmake</code>
|
||
for configuration, the appropriate steps can be invoked by
|
||
setting <code class="varname">USE_CMAKE</code> to <span class="quote">“<span class="quote">yes</span>”</span>.
|
||
You can add variables to cmake's environment by adding them to the
|
||
<code class="varname">CONFIGURE_ENV</code> variable and arguments to cmake
|
||
by adding them to the <code class="varname">CMAKE_ARGS</code> variable.
|
||
The top directory argument is given by the
|
||
<code class="varname">CMAKE_ARG_PATH</code> variable, that defaults to
|
||
<span class="quote">“<span class="quote">.</span>”</span> (relative to <code class="varname">CONFIGURE_DIRS</code>)</p>
|
||
<p>If there is no configure step at all, set
|
||
<code class="varname">NO_CONFIGURE</code> to <span class="quote">“<span class="quote">yes</span>”</span>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.build"></a>17.12. The <span class="emphasis"><em>build</em></span> phase</h2></div></div></div>
|
||
<p>For building a package, a rough equivalent of the
|
||
following code is executed.</p>
|
||
<pre class="programlisting">
|
||
.for d in ${BUILD_DIRS}
|
||
cd ${WRKSRC} \
|
||
&& cd ${d} \
|
||
&& env ${MAKE_ENV} \
|
||
${MAKE_PROGRAM} ${BUILD_MAKE_FLAGS} \
|
||
-f ${MAKE_FILE} \
|
||
${BUILD_TARGET}
|
||
.endfor
|
||
</pre>
|
||
<p><code class="varname">BUILD_DIRS</code> (default:
|
||
<span class="quote">“<span class="quote">.</span>”</span>) is a list of pathnames relative to
|
||
<code class="varname">WRKSRC</code>. In each of these directories,
|
||
<code class="varname">MAKE_PROGRAM</code> is run with the environment
|
||
<code class="varname">MAKE_ENV</code> and arguments
|
||
<code class="varname">BUILD_MAKE_FLAGS</code>. The variables
|
||
<code class="varname">MAKE_ENV</code>,
|
||
<code class="varname">BUILD_MAKE_FLAGS</code>,
|
||
<code class="varname">MAKE_FILE</code> and
|
||
<code class="varname">BUILD_TARGET</code> may all be changed by the
|
||
package.</p>
|
||
<p>The default value of <code class="varname">MAKE_PROGRAM</code> is
|
||
<span class="quote">“<span class="quote">gmake</span>”</span> if <code class="varname">USE_TOOLS</code> contains
|
||
<span class="quote">“<span class="quote">gmake</span>”</span>, <span class="quote">“<span class="quote">make</span>”</span> otherwise. The
|
||
default value of <code class="varname">MAKE_FILE</code> is
|
||
<span class="quote">“<span class="quote">Makefile</span>”</span>, and <code class="varname">BUILD_TARGET</code>
|
||
defaults to <span class="quote">“<span class="quote">all</span>”</span>.</p>
|
||
<p>If there is no build step at all, set
|
||
<code class="varname">NO_BUILD</code> to <span class="quote">“<span class="quote">yes</span>”</span>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.test"></a>17.13. The <span class="emphasis"><em>test</em></span> phase</h2></div></div></div>
|
||
<p>[TODO]</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.install"></a>17.14. The <span class="emphasis"><em>install</em></span> phase</h2></div></div></div>
|
||
<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.</p>
|
||
<p>In the <span class="emphasis"><em>install</em></span> phase, a rough
|
||
equivalent of the following code is executed. Additionally,
|
||
before and after this code, much magic is performed to do
|
||
consistency checks, registering the package, and so on.</p>
|
||
<pre class="programlisting">
|
||
.for d in ${INSTALL_DIRS}
|
||
cd ${WRKSRC} \
|
||
&& cd ${d} \
|
||
&& env ${MAKE_ENV} \
|
||
${MAKE_PROGRAM} ${INSTALL_MAKE_FLAGS} \
|
||
-f ${MAKE_FILE} \
|
||
${INSTALL_TARGET}
|
||
.endfor
|
||
</pre>
|
||
<p>The variable's meanings are analogous to the ones in the
|
||
<span class="emphasis"><em>build</em></span> phase.
|
||
<code class="varname">INSTALL_DIRS</code> defaults to
|
||
<code class="varname">BUILD_DIRS</code>. <code class="varname">INSTALL_TARGET</code>
|
||
is <span class="quote">“<span class="quote">install</span>”</span> by default, plus
|
||
<span class="quote">“<span class="quote">install.man</span>”</span> if <code class="varname">USE_IMAKE</code> is
|
||
defined and <code class="varname">NO_INSTALL_MANPAGES</code> is not
|
||
defined.</p>
|
||
<p>In the <span class="emphasis"><em>install</em></span> phase, the following
|
||
variables are useful. They are all variations of the
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?install+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">install</span>(1)</span></a> command that have the owner, group and
|
||
permissions preset. <code class="varname">INSTALL</code> is the plain
|
||
install command. The specialized variants, together with their
|
||
intended use, are:</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">INSTALL_PROGRAM_DIR</code></span></dt>
|
||
<dd><p>directories that contain
|
||
binaries</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_SCRIPT_DIR</code></span></dt>
|
||
<dd><p>directories that contain
|
||
scripts</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_LIB_DIR</code></span></dt>
|
||
<dd><p>directories that contain shared and static
|
||
libraries</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_DATA_DIR</code></span></dt>
|
||
<dd><p>directories that contain data
|
||
files</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_MAN_DIR</code></span></dt>
|
||
<dd><p>directories that contain man
|
||
pages</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_GAME_DIR</code></span></dt>
|
||
<dd><p>directories that contain data files for games
|
||
</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_PROGRAM</code></span></dt>
|
||
<dd><p>binaries that can be stripped from debugging
|
||
symbols</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_SCRIPT</code></span></dt>
|
||
<dd><p>binaries that cannot be
|
||
stripped</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_GAME</code></span></dt>
|
||
<dd><p>game
|
||
binaries</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_LIB</code></span></dt>
|
||
<dd><p>shared and static
|
||
libraries</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_DATA</code></span></dt>
|
||
<dd><p>data files</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_GAME_DATA</code></span></dt>
|
||
<dd><p>data files for
|
||
games</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALL_MAN</code></span></dt>
|
||
<dd><p>man pages</p></dd>
|
||
</dl></div>
|
||
<p>Some other variables are:</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">INSTALL_UNSTRIPPED</code></span></dt>
|
||
<dd><p>If set to <code class="literal">yes</code>, do not run <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?strip+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">strip</span>(1)</span></a>
|
||
when installing binaries. Any debugging sections and symbols present in
|
||
binaries will be preserved.
|
||
</p></dd>
|
||
<dt><span class="term"><code class="varname">INSTALLATION_DIRS</code></span></dt>
|
||
<dd><p>A list of directories relative to
|
||
<code class="varname">PREFIX</code> that are created by pkgsrc at the
|
||
beginning of the <span class="emphasis"><em>install</em></span> phase.
|
||
The package is supposed to create all needed directories itself
|
||
before installing files to it and list all other directories here.
|
||
</p></dd>
|
||
</dl></div>
|
||
<p>In the rare cases that a package shouldn't install anything,
|
||
set <code class="varname">NO_INSTALL</code> to <span class="quote">“<span class="quote">yes</span>”</span>. This is
|
||
mostly relevant for packages in the <code class="filename">regress</code>
|
||
category.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.package"></a>17.15. The <span class="emphasis"><em>package</em></span> phase</h2></div></div></div>
|
||
<p>Once the install stage has completed, a binary package of
|
||
the installed files can be built. These binary packages can be
|
||
used for quick installation without previous compilation, e.g. by
|
||
the <span class="command"><strong>make bin-install</strong></span> or by using
|
||
<span class="command"><strong>pkg_add</strong></span>.</p>
|
||
<p>By default, the binary packages are created in
|
||
<code class="filename">${PACKAGES}/All</code> and symlinks are created in
|
||
<code class="filename">${PACKAGES}/<em class="replaceable"><code>category</code></em></code>,
|
||
one for each category in the <code class="varname">CATEGORIES</code>
|
||
variable. <code class="varname">PACKAGES</code> defaults to
|
||
<code class="filename">pkgsrc/packages</code>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.clean"></a>17.16. Cleaning up</h2></div></div></div>
|
||
<p>Once you're finished with a package, you can clean the work
|
||
directory by running <span class="command"><strong>make clean</strong></span>. If you want
|
||
to clean the work directories of all dependencies too, use
|
||
<span class="command"><strong>make clean-depends</strong></span>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="build.helpful-targets"></a>17.17. Other helpful targets</h2></div></div></div>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<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">“<span class="quote">pre-</span>”</span> and <span class="quote">“<span class="quote">post-</span>”</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 class="command"><strong>make install</strong></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">“<span class="quote">already installed</span>”</span> flag.</p>
|
||
<p>This is the default value of
|
||
<code class="varname">DEPENDS_TARGET</code> except in the case of
|
||
<span class="command"><strong>make update</strong></span> and <span class="command"><strong>make
|
||
package</strong></span>, where the defaults are
|
||
<span class="quote">“<span class="quote">package</span>”</span> and <span class="quote">“<span class="quote">update</span>”</span>,
|
||
respectively.</p>
|
||
</dd>
|
||
<dt><span class="term">deinstall</span></dt>
|
||
<dd>
|
||
<p>This target does a <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_delete</span>(1)</span></a> in the
|
||
current directory, effectively de-installing the
|
||
package. The following variables can be used to tune the
|
||
behaviour:</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">PKG_VERBOSE</code></span></dt>
|
||
<dd><p>Add a "-v" to the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_delete</span>(1)</span></a> command.</p></dd>
|
||
<dt><span class="term"><code class="varname">DEINSTALLDEPENDS</code></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 class="command"><strong>make deinstall
|
||
DEINSTALLDEPENDS=1</strong></span> is done in
|
||
<code class="filename">pkgsrc/x11/kde</code>, this is
|
||
likely to remove whole KDE. Works by adding
|
||
<span class="quote">“<span class="quote">-R</span>”</span> to the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_delete</span>(1)</span></a>
|
||
command line.</p></dd>
|
||
</dl></div>
|
||
</dd>
|
||
<dt><span class="term">bin-install</span></dt>
|
||
<dd><p>Install a binary package from local disk and via FTP
|
||
from a list of sites (see the
|
||
<code class="varname">BINPKG_SITES</code> variable), and do a
|
||
<span class="command"><strong>make package</strong></span> if no binary package is
|
||
available anywhere. The arguments given to
|
||
<span class="command"><strong>pkg_add</strong></span> can be set via
|
||
<code class="varname">BIN_INSTALL_FLAGS</code> e.g., to do verbose
|
||
operation, etc.</p></dd>
|
||
<dt><span class="term">install-clean</span></dt>
|
||
<dd><p>This target removes the state files for the "install" and later
|
||
phases so that the "install" target may be re-invoked. This can be
|
||
used after editing the PLIST to install the package without
|
||
rebuilding it.</p></dd>
|
||
<dt><span class="term">build-clean</span></dt>
|
||
<dd><p>This target removes the state files for the "build" and later
|
||
phases so that the "build" target may be re-invoked.</p></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 class="command"><strong>make deinstall</strong></span> and
|
||
<span class="command"><strong>make install</strong></span> (or whatever
|
||
<code class="varname">UPDATE_TARGET</code> is set to) for these
|
||
packages.</p>
|
||
<p>You can use the <span class="quote">“<span class="quote">update</span>”</span> target to
|
||
resume package updating in case a previous <span class="command"><strong>make
|
||
update</strong></span> was interrupted for some reason.
|
||
However, in this case, make sure you don't call
|
||
<span class="command"><strong>make clean</strong></span> or otherwise remove the
|
||
list of dependent packages in <code class="varname">WRKDIR</code>.
|
||
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 class="command"><strong>make
|
||
update</strong></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 class="command"><strong>make update</strong></span> will most certainly
|
||
fail!</p>
|
||
<p>The following variables can be used either on the
|
||
command line or in <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> to
|
||
alter the behaviour of <span class="command"><strong>make
|
||
update</strong></span>:</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">UPDATE_TARGET</code></span></dt>
|
||
<dd><p>Install target to recursively use for the
|
||
updated package and the dependent packages.
|
||
Defaults to <code class="varname">DEPENDS_TARGET</code> if
|
||
set, <span class="quote">“<span class="quote">install</span>”</span> otherwise for
|
||
<span class="command"><strong>make update</strong></span>. Other good
|
||
targets are <span class="quote">“<span class="quote">package</span>”</span> or
|
||
<span class="quote">“<span class="quote">bin-install</span>”</span>. Do not set this to
|
||
<span class="quote">“<span class="quote">update</span>”</span> or you will get stuck in an
|
||
endless loop!</p></dd>
|
||
<dt><span class="term"><code class="varname">NOCLEAN</code></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">“<span class="quote">clean-update</span>”</span> target below)
|
||
or you may run into troubles with old source code
|
||
still lying around on your next
|
||
<span class="command"><strong>make</strong></span> or <span class="command"><strong>make
|
||
update</strong></span>.</p></dd>
|
||
<dt><span class="term"><code class="varname">REINSTALL</code></span></dt>
|
||
<dd><p>Deinstall each package before installing
|
||
(making <code class="varname">DEPENDS_TARGET</code>). This
|
||
may be necessary if the
|
||
<span class="quote">“<span class="quote">clean-update</span>”</span> target (see below) was
|
||
called after interrupting a running <span class="command"><strong>make
|
||
update</strong></span>.</p></dd>
|
||
<dt><span class="term"><code class="varname">DEPENDS_TARGET</code></span></dt>
|
||
<dd><p>Allows you to disable recursion and hardcode
|
||
the target for packages. The default is
|
||
<span class="quote">“<span class="quote">update</span>”</span> for the update target,
|
||
facilitating a recursive update of prerequisite
|
||
packages. Only set
|
||
<code class="varname">DEPENDS_TARGET</code> if you want to
|
||
disable recursive updates. Use
|
||
<code class="varname">UPDATE_TARGET</code> instead to just
|
||
set a specific target for each package to be
|
||
installed during <span class="command"><strong>make update</strong></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 class="command"><strong>make update</strong></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 class="command"><strong>make update</strong></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 class="command"><strong>make update</strong></span>
|
||
and only if you have a dirty package tree (e.g., if you
|
||
used <code class="varname">NOCLEAN</code>).</p>
|
||
<p>If you are unsure about whether your tree is
|
||
clean, you can either perform a <span class="command"><strong>make
|
||
clean</strong></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 class="command"><strong>make update</strong></span> for the first
|
||
time, otherwise you lose all the packages you wanted to
|
||
update!):</p>
|
||
<pre class="screen">
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make clean-update</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make clean CLEANDEPENDS=YES</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make update</code></strong>
|
||
</pre>
|
||
<p>The following variables can be used either on the
|
||
command line or in <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> to alter the behaviour of
|
||
<span class="command"><strong>make clean-update</strong></span>:</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">CLEAR_DIRLIST</code></span></dt>
|
||
<dd><p>After <span class="command"><strong>make clean</strong></span>, do not
|
||
reconstruct the list of directories to update for
|
||
this package. Only use this if <span class="command"><strong>make
|
||
update</strong></span> successfully installed all
|
||
packages you wanted to update. Normally, this is
|
||
done automatically on <span class="command"><strong>make
|
||
update</strong></span>, but may have been suppressed by
|
||
the <code class="varname">NOCLEAN</code> variable (see
|
||
above).</p></dd>
|
||
</dl></div>
|
||
</dd>
|
||
<dt><span class="term">replace</span></dt>
|
||
<dd>
|
||
<p>Update the installation of the current package. This
|
||
differs from update in that it does not replace dependent
|
||
packages. You will need to install <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_tarup/README.html" target="_top"><code class="filename">pkgtools/pkg_tarup</code></a> for this
|
||
target to work.</p>
|
||
<p><span class="emphasis"><em>Be careful when using this
|
||
target!</em></span> There are no guarantees that dependent
|
||
packages will still work, in particular they will most
|
||
certainly break if you <span class="command"><strong>make replace</strong></span> a
|
||
library package whose shared library major version changed
|
||
between your installed version and the new one. For this
|
||
reason, this target is not officially supported and only
|
||
recommended for advanced users.</p>
|
||
</dd>
|
||
<dt><span class="term">info</span></dt>
|
||
<dd><p>This target invokes <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_info+1+NetBSD-5.0.1+i386"><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">index</span></dt>
|
||
<dd>
|
||
<p>This is a top-level command, i.e. it should be used in
|
||
the <code class="filename">pkgsrc</code> directory. It creates a
|
||
database of all packages in the local pkgsrc tree, including
|
||
dependencies, comment, maintainer, and some other useful
|
||
information. Individual entries are created by running
|
||
<span class="command"><strong>make describe</strong></span> in the packages'
|
||
directories. This index file is saved as
|
||
<code class="filename">pkgsrc/INDEX</code>. It can be displayed in
|
||
verbose format by running <span class="command"><strong>make
|
||
print-index</strong></span>. You can search in it with
|
||
<span class="command"><strong>make search
|
||
key=<em class="replaceable"><code>something</code></em></strong></span>. You can
|
||
extract a list of all packages that depend on a particular
|
||
one by running <span class="command"><strong>make show-deps
|
||
PKG=<em class="replaceable"><code>somepackage</code></em></strong></span>.</p>
|
||
<p>Running this command takes a very long time, some
|
||
hours even on fast machines!</p>
|
||
</dd>
|
||
<dt><span class="term">readme</span></dt>
|
||
<dd>
|
||
<p>This target generates a
|
||
<code class="filename">README.html</code> file, which can be
|
||
viewed using a browser such as <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/www/firefox/README.html" target="_top"><code class="filename">www/firefox</code></a> or <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/www/links/README.html" target="_top"><code class="filename">www/links</code></a>. The generated files
|
||
contain references to any packages which are in the
|
||
<code class="varname">PACKAGES</code> directory on the local
|
||
host. The generated files can be made to refer to URLs
|
||
based on <code class="varname">FTP_PKG_URL_HOST</code> and
|
||
<code class="varname">FTP_PKG_URL_DIR</code>. For example, if I
|
||
wanted to generate <code class="filename">README.html</code>
|
||
files which pointed to binary packages on the local
|
||
machine, in the directory
|
||
<code class="filename">/usr/packages</code>, set
|
||
<code class="varname">FTP_PKG_URL_HOST=file://localhost</code> and
|
||
<code class="varname">FTP_PKG_URL_DIR=/usr/packages</code>. The
|
||
<code class="varname">${PACKAGES}</code> directory and its
|
||
subdirectories will be searched for all the binary
|
||
packages.</p>
|
||
<p>The target can be run at the toplevel or in category
|
||
directories, in which case it descends recursively.</p>
|
||
</dd>
|
||
<dt><span class="term">readme-all</span></dt>
|
||
<dd><p>This is a top-level command, run it in
|
||
<code class="filename">pkgsrc</code>. Use this target to create a
|
||
file <code class="filename">README-all.html</code> 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
|
||
<code class="filename">pkgsrc/*/README.html</code> files, so be sure
|
||
to run this <span class="emphasis"><em>after</em></span> a <span class="command"><strong>make
|
||
readme</strong></span>.</p></dd>
|
||
<dt><span class="term">cdrom-readme</span></dt>
|
||
<dd><p>This is very much the same as the
|
||
<span class="quote">“<span class="quote">readme</span>”</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
|
||
<code class="filename">README.html</code> files, and can be made
|
||
to refer to URLs based on
|
||
<code class="varname">CDROM_PKG_URL_HOST</code> and
|
||
<code class="varname">CDROM_PKG_URL_DIR</code>.</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
|
||
(<code class="varname">ALLFILES</code>, which contains all
|
||
<code class="varname">DISTFILES</code> and
|
||
<code class="varname">PATCHFILES</code>, but not
|
||
<code class="filename">patches/*</code>).</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">“<span class="quote">show-host-specific-pkgs</span>”</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 <code class="varname">DEPENDS</code>. Useful
|
||
if out of date dependencies are causing build
|
||
problems.</p></dd>
|
||
<dt><span class="term">print-build-depends-list</span></dt>
|
||
<dd><p>This target shows the list of packages that the current package
|
||
depends on for building.</p></dd>
|
||
<dt><span class="term">print-run-depends-list</span></dt>
|
||
<dd><p>This target shows the list of packages that the current package
|
||
depends on for running.</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 <code class="varname">PKG_DEVELOPER</code> is set in <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>.</p></dd>
|
||
<dt><span class="term">print-PLIST</span></dt>
|
||
<dd>
|
||
<p>After a <span class="quote">“<span class="quote">make install</span>”</span> from a new or
|
||
upgraded pkg, this prints out an attempt to generate a
|
||
new <code class="filename">PLIST</code> from a <span class="command"><strong>find
|
||
-newer work/.extract_done</strong></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
|
||
<code class="filename">PLIST</code>. On upgrades, it's useful to
|
||
diff the output of this command against an already
|
||
existing <code class="filename">PLIST</code> file.</p>
|
||
<p>If the package installs files via <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?tar+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">tar</span>(1)</span></a> or
|
||
other methods that don't update file access times, be
|
||
sure to add these files manually to your
|
||
<code class="filename">PLIST</code>, as the <span class="quote">“<span class="quote">find
|
||
-newer</span>”</span> command used by this target won't catch
|
||
them!</p>
|
||
<p>See <a class="xref" href="#print-PLIST" title="13.3. Tweaking output of make print-PLIST">Section 13.3, “Tweaking output of <span class="command"><strong>make print-PLIST</strong></span>”</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 its
|
||
depends, if <code class="varname">PKG_DEPENDS</code> is set
|
||
properly. See <a class="xref" href="#bulk" title="Chapter 7. Creating binary packages for everything in pkgsrc (bulk builds)">Chapter 7, <i>Creating binary packages for everything in pkgsrc (bulk
|
||
builds)</i></a>).
|
||
After creating the binary package, the sources, the
|
||
just-installed package and its 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 up-to-date binary package is available,
|
||
it will be installed via <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_add</span>(1)</span></a>. If not,
|
||
<span class="command"><strong>make bulk-package</strong></span> will be executed,
|
||
but the installed binary won't be removed.</p>
|
||
<p>A binary package is considered
|
||
<span class="quote">“<span class="quote">up-to-date</span>”</span> to be installed via
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_add+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_add</span>(1)</span></a> if:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>None of the package's files
|
||
(<code class="filename">Makefile</code>, ...) were modified
|
||
since it was built.</p></li>
|
||
<li class="listitem"><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">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="tools"></a>Chapter 18. Tools needed for building or running</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#pkgsrc-tools">18.1. Tools for pkgsrc builds</a></span></dt>
|
||
<dt><span class="sect1"><a href="#package-tools">18.2. Tools needed by packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#platform-tools">18.3. Tools provided by platforms</a></span></dt>
|
||
<dt><span class="sect1"><a href="#tools.questions">18.4. Questions regarding the tools</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<p>The <code class="varname">USE_TOOLS</code> definition is used both internally
|
||
by pkgsrc and also for individual packages to define what commands
|
||
are needed for building a package (like <code class="varname">BUILD_DEPENDS</code>)
|
||
or for later run-time of an installed packaged (such as
|
||
<code class="varname">DEPENDS</code>).
|
||
If the native system provides an adequate tool, then in many cases, a pkgsrc
|
||
package will not be used.</p>
|
||
<p>When building a package, the replacement tools are
|
||
made available in a directory (as symlinks or wrapper scripts)
|
||
that is early in the executable search path. Just like the buildlink
|
||
system, this helps with consistent builds.</p>
|
||
<p>A tool may be needed to help build a specific package. For example,
|
||
perl, GNU make (gmake) or yacc may be needed.</p>
|
||
<p>Also a tool may be needed, for example, because the native system's supplied
|
||
tool may be inefficient for building a package with pkgsrc.
|
||
For example, a package may need GNU awk, bison (instead of
|
||
yacc) or a better sed.</p>
|
||
<p>The tools used by a package can be listed by running
|
||
<span class="command"><strong>make show-tools</strong></span>.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="pkgsrc-tools"></a>18.1. Tools for pkgsrc builds</h2></div></div></div>
|
||
<p>The default set of tools used by pkgsrc is defined in
|
||
<code class="filename">bsd.pkg.mk</code>. This includes standard Unix tools,
|
||
such as: <span class="command"><strong>cat</strong></span>, <span class="command"><strong>awk</strong></span>,
|
||
<span class="command"><strong>chmod</strong></span>, <span class="command"><strong>test</strong></span>, and so on.
|
||
These can be seen by running:
|
||
<span class="command"><strong>make show-var VARNAME=USE_TOOLS</strong></span>.</p>
|
||
<p>If a package needs a specific program to build
|
||
then the <code class="varname">USE_TOOLS</code> variable can be used
|
||
to define the tools needed.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="package-tools"></a>18.2. Tools needed by packages</h2></div></div></div>
|
||
<p>In the following examples, the :run means that it is needed at
|
||
run-time (and becomes a DEPENDS).
|
||
The default is a build dependency which can be set with
|
||
:build. (So in this example, it is the same as gmake:build
|
||
and pkg-config:build.)</p>
|
||
<pre class="programlisting">
|
||
USE_TOOLS+= gmake perl:run pkg-config
|
||
</pre>
|
||
<p>When using the tools framework, a
|
||
<code class="varname">TOOLS_PATH.foo</code> variable is defined
|
||
which contains the full path to the appropriate tool. For example,
|
||
<code class="varname">TOOLS_PATH.bash</code> could be <span class="quote">“<span class="quote">/bin/bash</span>”</span>
|
||
on Linux systems.</p>
|
||
<p>If you always need a pkgsrc version of the
|
||
tool at run-time, then just use <code class="varname">DEPENDS</code> instead.
|
||
</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="platform-tools"></a>18.3. Tools provided by platforms</h2></div></div></div>
|
||
<p>When improving or porting pkgsrc to a new platform, have a look
|
||
at (or create) the corresponding platform specific make file fragment under
|
||
<code class="filename">pkgsrc/mk/tools/tools.${OPSYS}.mk</code> which defines
|
||
the name of the common tools. For example:</p>
|
||
<pre class="programlisting">
|
||
.if exists(/usr/bin/bzcat)
|
||
TOOLS_PLATFORM.bzcat?= /usr/bin/bzcat
|
||
.elif exists(/usr/bin/bzip2)
|
||
TOOLS_PLATFORM.bzcat?= /usr/bin/bzip2 -cd
|
||
.endif
|
||
|
||
TOOLS_PLATFORM.true?= true # shell builtin
|
||
</pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="tools.questions"></a>18.4. Questions regarding the tools</h2></div></div></div>
|
||
<div class="qandaset">
|
||
<a name="idm80579472"></a><dl>
|
||
<dt>18.4.1. <a href="#tools.new">How do I add a new tool?</a>
|
||
</dt>
|
||
<dt>18.4.2. <a href="#tools.listall">How do I get a list of all available
|
||
tools?</a>
|
||
</dt>
|
||
<dt>18.4.3. <a href="#tools.used">How can I get a list of all the tools that a
|
||
package is using while being built? I want to know whether it
|
||
uses sed or not.</a>
|
||
</dt>
|
||
</dl>
|
||
<table border="0" style="width: 100%;">
|
||
<colgroup>
|
||
<col align="left" width="1%">
|
||
<col>
|
||
</colgroup>
|
||
<tbody>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="tools.new"></a><a name="idm80579088"></a><p><b>18.4.1.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>How do I add a new tool?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p>TODO</p></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="tools.listall"></a><a name="idm80578064"></a><p><b>18.4.2.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>How do I get a list of all available
|
||
tools?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p>TODO</p></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="tools.used"></a><a name="idm80577040"></a><p><b>18.4.3.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>How can I get a list of all the tools that a
|
||
package is using while being built? I want to know whether it
|
||
uses sed or not.</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p>Currently, you can't. (TODO: But I want to be able
|
||
to do it.)</p></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="fixes"></a>Chapter 19. Making your package work</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#general-operation">19.1. General operation</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#portability-of-packages">19.1.1. Portability of packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#pulling-vars-from-etc-mk.conf">19.1.2. How to pull in user-settable variables from <code class="filename">mk.conf</code></a></span></dt>
|
||
<dt><span class="sect2"><a href="#user-interaction">19.1.3. User interaction</a></span></dt>
|
||
<dt><span class="sect2"><a href="#handling-licenses">19.1.4. Handling licenses</a></span></dt>
|
||
<dt><span class="sect2"><a href="#restricted-packages">19.1.5. Restricted packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#dependencies">19.1.6. Handling dependencies</a></span></dt>
|
||
<dt><span class="sect2"><a href="#conflicts">19.1.7. Handling conflicts with other packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#not-building-packages">19.1.8. Packages that cannot or should not be built</a></span></dt>
|
||
<dt><span class="sect2"><a href="#undeletable-packages">19.1.9. Packages which should not be deleted, once installed</a></span></dt>
|
||
<dt><span class="sect2"><a href="#security-handling">19.1.10. Handling packages with security problems</a></span></dt>
|
||
<dt><span class="sect2"><a href="#bumping-pkgrevision">19.1.11. How to handle incrementing versions when fixing an existing package</a></span></dt>
|
||
<dt><span class="sect2"><a href="#fixes.subst">19.1.12. Substituting variable text in the package files (the SUBST framework)</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.fetch">19.2. Fixing problems in the <span class="emphasis"><em>fetch</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#no-plain-download">19.2.1. Packages whose distfiles aren't available for plain downloading</a></span></dt>
|
||
<dt><span class="sect2"><a href="#modified-distfiles-same-name">19.2.2. How to handle modified distfiles with the 'old' name</a></span></dt>
|
||
<dt><span class="sect2"><a href="#build.fetch.github">19.2.3. Packages hosted on github.com</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.configure">19.3. Fixing problems in the <span class="emphasis"><em>configure</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#fixes.libtool">19.3.1. Shared libraries - libtool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#using-libtool">19.3.2. Using libtool on GNU packages that already support libtool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#autoconf-automake">19.3.3. GNU Autoconf/Automake</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#programming-languages">19.4. Programming languages</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#basic-programming-languages">19.4.1. C, C++, and Fortran</a></span></dt>
|
||
<dt><span class="sect2"><a href="#java-programming-language">19.4.2. Java</a></span></dt>
|
||
<dt><span class="sect2"><a href="#perl-scripts">19.4.3. Packages containing perl scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#shell-scripts">19.4.4. Packages containing shell scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#other-programming-languages">19.4.5. Other programming languages</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.build">19.5. Fixing problems in the <span class="emphasis"><em>build</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#fixes.build.cpp">19.5.1. Compiling C and C++ code conditionally</a></span></dt>
|
||
<dt><span class="sect2"><a href="#compiler-bugs">19.5.2. How to handle compiler bugs</a></span></dt>
|
||
<dt><span class="sect2"><a href="#undefined-reference">19.5.3. Undefined reference to <span class="quote">“<span class="quote">...</span>”</span></a></span></dt>
|
||
<dt><span class="sect2"><a href="#out-of-memory">19.5.4. Running out of memory</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#fixes.install">19.6. Fixing problems in the <span class="emphasis"><em>install</em></span> phase</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#install-scripts">19.6.1. Creating needed directories</a></span></dt>
|
||
<dt><span class="sect2"><a href="#where-to-install-documentation">19.6.2. Where to install documentation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#installing-score-files">19.6.3. Installing highscore files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#destdir-support">19.6.4. Adding DESTDIR support to packages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#hardcoded-paths">19.6.5. Packages with hardcoded paths to other interpreters</a></span></dt>
|
||
<dt><span class="sect2"><a href="#perl-modules">19.6.6. Packages installing perl modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#faq.info-files">19.6.7. Packages installing info files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#manpages">19.6.8. Packages installing man pages</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gconf-data-files">19.6.9. Packages installing GConf data files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#scrollkeeper-data-files">19.6.10. Packages installing scrollkeeper/rarian data files</a></span></dt>
|
||
<dt><span class="sect2"><a href="#x11-fonts">19.6.11. Packages installing X11 fonts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#gtk2-modules">19.6.12. Packages installing GTK2 modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#sgml-xml-data">19.6.13. Packages installing SGML or XML data</a></span></dt>
|
||
<dt><span class="sect2"><a href="#mime-database">19.6.14. Packages installing extensions to the MIME database</a></span></dt>
|
||
<dt><span class="sect2"><a href="#intltool">19.6.15. Packages using intltool</a></span></dt>
|
||
<dt><span class="sect2"><a href="#startup-scripts">19.6.16. Packages installing startup scripts</a></span></dt>
|
||
<dt><span class="sect2"><a href="#tex-packages">19.6.17. Packages installing TeX modules</a></span></dt>
|
||
<dt><span class="sect2"><a href="#emulation-packages">19.6.18. Packages supporting running binaries in
|
||
emulation</a></span></dt>
|
||
<dt><span class="sect2"><a href="#hicolor-theme">19.6.19. Packages installing hicolor theme icons</a></span></dt>
|
||
<dt><span class="sect2"><a href="#desktop-files">19.6.20. Packages installing desktop files</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#punting">19.7. Marking packages as having problems</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="general-operation"></a>19.1. General operation</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="portability-of-packages"></a>19.1.1. 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. This
|
||
chapter mentions some particular details you should pay
|
||
attention to while working on pkgsrc.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="pulling-vars-from-etc-mk.conf"></a>19.1.2. How to pull in user-settable variables from <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>
|
||
</h3></div></div></div>
|
||
<p>The pkgsrc user can configure pkgsrc by overriding several
|
||
variables in the file pointed to by <code class="varname">MAKECONF</code>,
|
||
which is <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> by default. When you
|
||
want to use those variables in the preprocessor directives of
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> (for example <code class="literal">.if</code> or
|
||
<code class="literal">.for</code>), you need to include the file
|
||
<code class="filename">../../mk/bsd.prefs.mk</code> before, which in turn
|
||
loads the user preferences.</p>
|
||
<p>But note that some variables may not be completely defined
|
||
after <code class="filename">../../mk/bsd.prefs.mk</code> has been
|
||
included, as they may contain references to variables that are
|
||
not yet defined. In shell commands this is no problem, since
|
||
variables are actually macros, which are only expanded when they
|
||
are used. But in the preprocessor directives mentioned above and
|
||
in dependency lines (of the form <code class="literal">target:
|
||
dependencies</code>) the variables are expanded at load
|
||
time.</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>Currently there is no exhaustive list of all
|
||
variables that tells you whether they can be used at load time
|
||
or only at run time, but it is in preparation.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="user-interaction"></a>19.1.3. 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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>When fetching the distfiles, some packages require user
|
||
interaction such as entering username/password or accepting a
|
||
license on a web page.</p></li>
|
||
<li class="listitem"><p>When extracting the distfiles, some packages may ask for
|
||
passwords.</p></li>
|
||
<li class="listitem"><p>help to configure the package before it is built</p></li>
|
||
<li class="listitem"><p>help during the build process</p></li>
|
||
<li class="listitem"><p>help during the installation of a package</p></li>
|
||
</ul></div>
|
||
<p>The <code class="varname">INTERACTIVE_STAGE</code> 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
|
||
<code class="filename">Makefile</code>, 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>
|
||
<p>The user can then decide to skip this package by setting the
|
||
<code class="varname">BATCH</code> variable.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="handling-licenses"></a>19.1.4. Handling licenses</h3></div></div></div>
|
||
<p>Authors of software can choose the licence under which
|
||
software can be copied. This is due to copyright law, and reasons
|
||
for license choices are outside the scope of pkgsrc. The pkgsrc
|
||
system recognizes that there are a number of licenses which some
|
||
users may find objectionable or difficult or impossible to comply
|
||
with. The Free Software Foundation has declared some licenses
|
||
"Free", and the Open Source Initiative has a definition of "Open
|
||
Source". The pkgsrc system, as a policy choice, does not label
|
||
packages which have licenses that are Free or Open Source.
|
||
However, packages without a license meeting either of those tests
|
||
are labeled with a license tag denoting the license. Note that a
|
||
package with no license to copy trivially does not meet either the
|
||
Free or Open Source test.</p>
|
||
<p>For packages which are not Free or Open Source, pkgsrc will
|
||
not build the package unless the user has indicated to pkgsrc that
|
||
packages with that particular license may be built. Note that
|
||
this documentation avoids the term "accepted the license". The
|
||
pkgsrc system is merely providing a mechanism to avoid
|
||
accidentally building a package with a non-free license;
|
||
judgement and responsibility remain with the user. (Installation
|
||
of binary packages are not currently subject to this mechanism;
|
||
this is a bug.)</p>
|
||
<p>One might want to only install packages with a BSD license,
|
||
or the GPL, and not the other. The free licenses are added to the
|
||
default <code class="varname">ACCEPTABLE_LICENSES</code> variable. The
|
||
user can override the default by setting the
|
||
<code class="varname">ACCEPTABLE_LICENSES</code> variable with "=" instead
|
||
of "+=". The licenses accepted by default are:
|
||
</p>
|
||
<pre class="programlisting">
|
||
apache-1.1 apache-2.0
|
||
arphic-public
|
||
artistic artistic-2.0
|
||
boost-license
|
||
cc-by-sa-v3.0
|
||
cc0-1.0-universal
|
||
cddl-1.0
|
||
cpl-1.0
|
||
epl-v1.0
|
||
gnu-fdl-v1.1 gnu-fdl-v1.2 gnu-fdl-v1.3
|
||
gnu-gpl-v1
|
||
gnu-gpl-v2 gnu-lgpl-v2 gnu-lgpl-v2.1
|
||
gnu-gpl-v3 gnu-lgpl-v3
|
||
ibm-public-license-1.0
|
||
ipafont
|
||
isc
|
||
lppl-1.3c
|
||
lucent
|
||
miros
|
||
mit
|
||
mpl-1.0 mpl-1.1 mpl-2.0
|
||
mplusfont
|
||
ofl-v1.0 ofl-v1.1
|
||
original-bsd modified-bsd 2-clause-bsd
|
||
php
|
||
png-license
|
||
postgresql-license
|
||
public-domain
|
||
python-software-foundation
|
||
qpl-v1.0
|
||
sgi-free-software-b-v2.0
|
||
sleepycat-public
|
||
unlicense
|
||
x11
|
||
zlib
|
||
zpl
|
||
</pre>
|
||
<p>
|
||
</p>
|
||
<p>The license tag mechanism is intended to address
|
||
copyright-related issues surrounding building, installing and
|
||
using a package, and not to address redistribution issues (see
|
||
<code class="varname">RESTRICTED</code> and
|
||
<code class="varname">NO_SRC_ON_FTP</code>, etc.).
|
||
Packages with redistribution restrictions should set these
|
||
tags.</p>
|
||
<p>Denoting that a package may be copied according to a
|
||
particular license is done by placing the license in
|
||
<code class="filename">pkgsrc/licenses</code> and setting the
|
||
<code class="varname">LICENSE</code> variable to a string identifying the
|
||
license, e.g. in <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/graphics/xv/README.html" target="_top"><code class="filename">graphics/xv</code></a>:</p>
|
||
<pre class="programlisting">
|
||
LICENSE= xv-license
|
||
</pre>
|
||
<p>When trying to build, the user will get a notice that the
|
||
package is covered by a license which has not been placed in the
|
||
<code class="varname">ACCEPTABLE_LICENSES</code> variable:</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make</code></strong>
|
||
===> xv-3.10anb9 has an unacceptable license: xv-license.
|
||
===> To view the license, enter "/usr/bin/make show-license".
|
||
===> To indicate acceptance, add this line to your /etc/mk.conf:
|
||
===> ACCEPTABLE_LICENSES+=xv-license
|
||
*** Error code 1
|
||
</pre>
|
||
<p>The license can be viewed with <span class="command"><strong>make
|
||
show-license</strong></span>, and if the user so chooses, the line
|
||
printed above can be added to <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> to
|
||
convey to pkgsrc that it should not in the future fail because of
|
||
that license:</p>
|
||
<pre class="programlisting">
|
||
ACCEPTABLE_LICENSES+=xv-license
|
||
</pre>
|
||
<p>When adding a package with a new license, the following steps
|
||
are required:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem">
|
||
<p>Check if the file can avoid the -license filename tag as described above by referencing <a class="ulink" href="http://www.gnu.org/licenses/license-list.html" target="_top">Various Licenses and Comments about Them</a> and <a class="ulink" href="http://opensource.org/licenses/alphabetical" target="_top">Licenses by Name | Open Source Initiative</a>. If this is the case, additionally add the license filename to:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>DEFAULT_ACCEPTABLE_LICENSES in <code class="filename">pkgsrc/mk/license.mk</code></p></li>
|
||
<li class="listitem"><p>default_acceptable_licenses in <code class="filename">pkgsrc/pkgtools/pkg_install/files/lib/license.c</code></p></li>
|
||
<li class="listitem"><p>the ACCEPTABLE_LICENSES list in <code class="filename">pkgsrc/doc/guide/files/fixes.xml</code></p></li>
|
||
</ul></div>
|
||
<p>with the proper syntax as demonstrated in those files, respectively.</p>
|
||
</li>
|
||
<li class="listitem"><p>The license text should be added to <code class="filename">pkgsrc/licenses</code> for displaying. A list of known licenses can be seen in this directory.</p></li>
|
||
</ol></div>
|
||
<p>When the license changes (in a way other than formatting),
|
||
please make sure that the new license has a different name (e.g.,
|
||
append the version number if it exists, or the date). Just
|
||
because a user told pkgsrc to build programs under a previous
|
||
version of a license does not mean that pkgsrc should build
|
||
programs under the new licenses. The higher-level point is that
|
||
pkgsrc does not evaluate licenses for reasonableness; the only
|
||
test is a mechanistic test of whether a particular text has been
|
||
approved by either of two bodies.</p>
|
||
<p>The use of <code class="varname">LICENSE=shareware</code>,
|
||
<code class="varname">LICENSE=no-commercial-use</code>, and similar language
|
||
is deprecated because it does not crisply refer to a particular
|
||
license text. Another problem with such usage is that it does not
|
||
enable a user to tell pkgsrc to proceed for a single package
|
||
without also telling pkgsrc to proceed for all packages with that
|
||
tag.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="restricted-packages"></a>19.1.5. Restricted packages</h3></div></div></div>
|
||
<p>Some licenses restrict how software may be re-distributed.
|
||
Because a license tag is required unless the package is Free or
|
||
Open Source, all packages with restrictions should have license
|
||
tags. By declaring the restrictions, package tools can
|
||
automatically refrain from e.g. placing binary packages on FTP
|
||
sites.</p>
|
||
<p>There are four restrictions that may be encoded, which are
|
||
the cross product of sources (distfiles) and binaries not being
|
||
placed on FTP sites and CD-ROMs. Because this is rarely the exact
|
||
language in any license, and because non-Free licenses tend to be
|
||
different from each other, pkgsrc adopts a definition of FTP and
|
||
CD-ROM. Pkgsrc uses "FTP" to mean that the source or binary file
|
||
should not be made available over the Internet at no charge.
|
||
Pkgsrc uses "CD-ROM" to mean that the source or binary may not be
|
||
made available on some kind of media, together with other source
|
||
and binary packages, and which is sold for a distribution charge.
|
||
</p>
|
||
<p>In order to encode these restrictions, the package system
|
||
defines five make variables that can be set to note these
|
||
restrictions:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem">
|
||
<p><code class="varname">RESTRICTED</code></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. It should
|
||
be understood that those wanting to understand the restriction
|
||
will have to read the license, and perhaps seek advice of
|
||
counsel.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><code class="varname">NO_BIN_ON_CDROM</code></p>
|
||
<p>Binaries may not be placed on CD-ROM containing other
|
||
binary packages, for which a distribution charge may be made.
|
||
In this case, set this variable to
|
||
<code class="varname">${RESTRICTED}</code>.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><code class="varname">NO_BIN_ON_FTP</code></p>
|
||
<p>Binaries may not made available on the Internet without
|
||
charge. In this case, set this variable to
|
||
<code class="varname">${RESTRICTED}</code>. If this variable is set,
|
||
binary packages will not be included on ftp.NetBSD.org.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><code class="varname">NO_SRC_ON_CDROM</code></p>
|
||
<p>Distfiles may not be placed on CD-ROM, together with
|
||
other distfiles, for which a fee may be charged. In this
|
||
case, set this variable to <code class="varname">${RESTRICTED}</code>.
|
||
</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p><code class="varname">NO_SRC_ON_FTP</code></p>
|
||
<p>Distfiles may not made available via FTP at no charge.
|
||
In this case, set this variable to
|
||
<code class="varname">${RESTRICTED}</code>. If this variable is set,
|
||
the distfile(s) will not be mirrored on ftp.NetBSD.org.</p>
|
||
</li>
|
||
</ul></div>
|
||
<p>Please note that packages will to be removed from pkgsrc
|
||
when the distfiles are not distributable and cannot be obtained
|
||
for a period of one full quarter branch. Packages with manual /
|
||
interactive fetch must have a maintainer and it is his/her
|
||
responsibility to ensure this.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="dependencies"></a>19.1.6. 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 <code class="varname">BUILD_DEPENDS</code> and
|
||
<code class="varname">DEPENDS</code> definitions, the
|
||
<code class="varname">USE_TOOLS</code> definition, as well as dependencies
|
||
via <code class="filename">buildlink3.mk</code>, which is the preferred way
|
||
to handle dependencies, and which uses the variables named above.
|
||
See <a class="xref" href="#buildlink" title="Chapter 14. Buildlink methodology">Chapter 14, <i>Buildlink methodology</i></a> for more information.</p>
|
||
<p>The basic difference between the two variables is as
|
||
follows: The <code class="varname">DEPENDS</code> definition registers
|
||
that pre-requisite in the binary package so it will be pulled in
|
||
when the binary package is later installed, whilst the
|
||
<code class="varname">BUILD_DEPENDS</code> 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
|
||
<code class="varname">BUILD_DEPENDS</code>.</p>
|
||
<p>The format for a <code class="varname">BUILD_DEPENDS</code> and a
|
||
<code class="varname">DEPENDS</code> definition is:</p>
|
||
<pre class="programlisting">
|
||
<pre-req-package-name>:../../<category>/<pre-req-package>
|
||
</pre>
|
||
<p>Please note that the <span class="quote">“<span class="quote">pre-req-package-name</span>”</span>
|
||
may include any of the wildcard version numbers recognized by
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_info+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_info</span>(1)</span></a>.</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem">
|
||
<p>If your package needs another package's binaries or
|
||
libraries to build and run, and if that package has a
|
||
<code class="filename">buildlink3.mk</code> file available, use it:</p>
|
||
<pre class="programlisting">
|
||
.include "../../graphics/jpeg/buildlink3.mk"
|
||
</pre>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>If your package needs another package's binaries or
|
||
libraries only for building, and if that package has a
|
||
<code class="filename">buildlink3.mk</code> file available, use it:</p>
|
||
<pre class="programlisting">
|
||
.include "../../graphics/jpeg/buildlink3.mk"
|
||
</pre>
|
||
<p>but set
|
||
<code class="varname">BUILDLINK_DEPMETHOD.<em class="replaceable"><code>jpeg</code></em>?=build</code>
|
||
to make it a build dependency only. This case is rather
|
||
rare.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>If your package needs binaries from another package to build,
|
||
use the <code class="varname">BUILD_DEPENDS</code> definition:</p>
|
||
<pre class="programlisting">
|
||
BUILD_DEPENDS+= scons-[0-9]*:../../devel/scons
|
||
</pre>
|
||
</li>
|
||
<li class="listitem"><p>If your package needs a library with which to link and
|
||
there is no <code class="filename">buildlink3.mk</code> file
|
||
available, create one. Using
|
||
<code class="varname">DEPENDS</code> won't be sufficient because the
|
||
include files and libraries will be hidden from the compiler.</p></li>
|
||
<li class="listitem">
|
||
<p>If your package needs some executable to be able to run
|
||
correctly and if there's no
|
||
<code class="filename">buildlink3.mk</code> file, this is specified
|
||
using the <code class="varname">DEPENDS</code> variable. The
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/print/lyx/README.html" target="_top"><code class="filename">print/lyx</code></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>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>You can use wildcards in package dependencies. 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">“<span class="quote">-[0-9]*</span>”</span> should be used instead of
|
||
<span class="quote">“<span class="quote">-*</span>”</span> to avoid potentially ambiguous matches
|
||
such as <span class="quote">“<span class="quote">tk-postgresql</span>”</span> matching a
|
||
<span class="quote">“<span class="quote">tk-*</span>”</span> <code class="varname">DEPENDS</code>.</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+= ImageMagick>=6.0:../../graphics/ImageMagick
|
||
</pre>
|
||
<p>This means that the package will build using version 6.0
|
||
of ImageMagick or newer. Such a dependency may be warranted
|
||
if, for example, the command line options of an executable
|
||
have changed.</p>
|
||
<p>If you need to depend on minimum versions of libraries,
|
||
see the buildlink section of the pkgsrc guide.</p>
|
||
<p>For security fixes, please update the package
|
||
vulnerabilities file. See <a class="xref" href="#security-handling" title="19.1.10. Handling packages with security problems">Section 19.1.10, “Handling packages with security problems”</a> for more
|
||
information.</p>
|
||
</li>
|
||
</ol></div>
|
||
<p>If your package needs files from another package to build,
|
||
add the relevant distribution files to
|
||
<code class="varname">DISTFILES</code>, so they will be extracted
|
||
automatically. See the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/print/ghostscript/README.html" target="_top"><code class="filename">print/ghostscript</code></a> package for an example.
|
||
(It relies on the jpeg sources being present in source form
|
||
during the build.)</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="conflicts"></a>19.1.7. 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 as another package in the pkgsrc
|
||
tree or has the same <code class="varname">PKGNAME</code>.</p>
|
||
<p>These cases are handled automatically by the packaging tools
|
||
at package installation time and do not need to be handled
|
||
manually.</p>
|
||
<p>In case the conflicts can not be recognized automatically
|
||
(e.g., packages using the same config file location but no other
|
||
shared files), you can set <code class="varname">CONFLICTS</code> to a
|
||
space-separated list of packages (including version string) your
|
||
package conflicts with.</p>
|
||
<p>For example, if both <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/foo/bar/README.html" target="_top"><code class="filename">foo/bar</code></a>
|
||
and <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/foo/baz/README.html" target="_top"><code class="filename">foo/baz</code></a>
|
||
use the same config file, you would set in
|
||
<code class="filename">foo/bar/Makefile</code>:</p>
|
||
<pre class="programlisting">
|
||
CONFLICTS= baz-[0-9]*
|
||
</pre>
|
||
<p>and in <code class="filename">pkgsrc/foo/baz/Makefile</code>:</p>
|
||
<pre class="programlisting">
|
||
CONFLICTS= bar-[0-9]*
|
||
</pre>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="not-building-packages"></a>19.1.8. 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 <code class="varname">BROKEN_ON_PLATFORM</code>. If
|
||
the package builds and runs on a small handful of platforms,
|
||
set <code class="varname">BROKEN_EXCEPT_ON_PLATFORM</code> instead.
|
||
Both <code class="varname">BROKEN_ON_PLATFORM</code> and
|
||
<code class="varname">BROKEN_EXCEPT_ON_PLATFORM</code> are OS triples
|
||
(OS-version-platform) that can use glob-style
|
||
wildcards.</p>
|
||
<p>If a package is not appropriate for some platforms (as
|
||
oopposed to merely broken), a different set of variables should be
|
||
used as this affects failure reporting and statistics.
|
||
If the package is appropriate for most platforms, the exceptions
|
||
should be noted with <code class="varname">NOT_FOR_PLATFORM</code>. If
|
||
the package is appropriate for only a small handful of platforms
|
||
(often exactly one), set <code class="varname">ONLY_FOR_PLATFORM</code> instead.
|
||
Both <code class="varname">ONLY_FOR_PLATFORM</code> and
|
||
<code class="varname">NOT_FOR_PLATFORM</code> are OS triples
|
||
(OS-version-platform) that can use glob-style
|
||
wildcards.</p>
|
||
<p>Some packages are tightly bound to a specific version of an
|
||
operating system, e.g. LKMs or <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/sysutils/lsof/README.html" target="_top"><code class="filename">sysutils/lsof</code></a>. Such binary packages are not
|
||
backwards compatible with other versions of the OS, and should be
|
||
uploaded to a version specific directory on the FTP server. Mark
|
||
these packages by setting <code class="varname">OSVERSION_SPECIFIC</code> to
|
||
<span class="quote">“<span class="quote">yes</span>”</span>. This variable is not currently used by any of
|
||
the package system internals, but may be used in the
|
||
future.</p>
|
||
<p>If the package should be skipped (for example, because it
|
||
provides functionality already provided by the system), set
|
||
<code class="varname">PKG_SKIP_REASON</code> to a descriptive message. If
|
||
the package should fail because some preconditions are not met,
|
||
set <code class="varname">PKG_FAIL_REASON</code> to a descriptive
|
||
message.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="undeletable-packages"></a>19.1.9. 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 <code class="varname">PKG_PRESERVE</code> 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">“<span class="quote">preserved</span>”</span> package will
|
||
not be deleted using <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_delete+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_delete</span>(1)</span></a> unless the
|
||
<span class="quote">“<span class="quote">-f</span>”</span> option is used.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="security-handling"></a>19.1.10. Handling packages with security problems</h3></div></div></div>
|
||
<p>When a vulnerability is found, this should be noted in
|
||
<code class="filename">localsrc/security/advisories/pkg-vulnerabilities</code>,
|
||
and after committing that file, ask pkgsrc-security@NetBSD.org to
|
||
update the file on ftp.NetBSD.org.</p>
|
||
<p>After fixing the vulnerability by a patch, its
|
||
<code class="varname">PKGREVISION</code> should be increased (this is of
|
||
course not necessary if the problem is fixed by using a newer
|
||
release of the software), and the pattern in the
|
||
pkg-vulnerabilities file must be updated.</p>
|
||
<p>Also, if the fix should be applied to the stable pkgsrc
|
||
branch, be sure to submit a pullup request!</p>
|
||
<p>Binary packages already on ftp.NetBSD.org will be handled
|
||
semi-automatically by a weekly cron job.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="bumping-pkgrevision"></a>19.1.11. 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 <code class="varname">PKGNAME</code>. To
|
||
avoid conflicting with future versions by the original author, a
|
||
<span class="quote">“<span class="quote">nb1</span>”</span>, <span class="quote">“<span class="quote">nb2</span>”</span>, ... suffix can be used
|
||
on package versions by setting <code class="varname">PKGREVISION=1</code>
|
||
(2, ...). The <span class="quote">“<span class="quote">nb</span>”</span> is treated like a
|
||
<span class="quote">“<span class="quote">.</span>”</span> by the package tools. e.g.</p>
|
||
<pre class="programlisting">
|
||
DISTNAME= foo-17.42
|
||
PKGREVISION= 9
|
||
</pre>
|
||
<p>will result in a <code class="varname">PKGNAME</code> of
|
||
<span class="quote">“<span class="quote">foo-17.42nb9</span>”</span>. If you want to use the original
|
||
value of <code class="varname">PKGNAME</code> without the <span class="quote">“<span class="quote">nbX</span>”</span>
|
||
suffix, e.g. for setting <code class="varname">DIST_SUBDIR</code>, use
|
||
<code class="varname">PKGNAME_NOREV</code>.</p>
|
||
<p>When a new release of the package is released, the
|
||
<code class="varname">PKGREVISION</code> 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>
|
||
<p><code class="varname">PKGREVISION</code> should be incremented for any
|
||
non-trivial change in the resulting binary package. Without a
|
||
<code class="varname">PKGREVISION</code> bump, someone with the previous
|
||
version installed has no way of knowing that their package is out
|
||
of date. Thus, changes without increasing
|
||
<code class="varname">PKGREVISION</code> are essentially labeled "this is so
|
||
trivial that no reasonable person would want to upgrade", and this
|
||
is the rough test for when increasing
|
||
<code class="varname">PKGREVISION</code> is appropriate. Examples of
|
||
changes that do not merit increasing
|
||
<code class="varname">PKGREVISION</code> are:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Changing <code class="varname">HOMEPAGE</code>,
|
||
<code class="varname">MAINTAINER</code>, <code class="varname">OWNER</code>,
|
||
or comments in Makefile.</p></li>
|
||
<li class="listitem"><p>
|
||
Changing build variables if the resulting binary package is the same.</p></li>
|
||
<li class="listitem"><p>
|
||
Changing <code class="filename">DESCR</code>.</p></li>
|
||
<li class="listitem"><p>
|
||
Adding <code class="varname">PKG_OPTIONS</code> if the default options don't change.</p></li>
|
||
</ul></div>
|
||
<p>Examples of changes that do merit an increase to
|
||
<code class="varname">PKGREVISION</code> include:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>
|
||
Security fixes</p></li>
|
||
<li class="listitem"><p>
|
||
Changes or additions to a patch file</p></li>
|
||
<li class="listitem"><p>
|
||
Changes to the <code class="filename">PLIST</code></p></li>
|
||
<li class="listitem"><p>A dependency is changed or renamed.</p></li>
|
||
</ul></div>
|
||
<p>PKGREVISION must also be incremented when dependencies have ABI
|
||
changes.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="fixes.subst"></a>19.1.12. Substituting variable text in the package files (the SUBST framework)</h3></div></div></div>
|
||
<p>When you want to replace the same text in multiple files
|
||
or when the replacement text varies, patches alone cannot help.
|
||
This is where the SUBST framework comes in. It provides an
|
||
easy-to-use interface for replacing text in files.
|
||
Example:</p>
|
||
<pre class="programlisting">
|
||
SUBST_CLASSES+= fix-paths
|
||
SUBST_STAGE.fix-paths= pre-configure
|
||
SUBST_MESSAGE.fix-paths= Fixing absolute paths.
|
||
SUBST_FILES.fix-paths= src/*.c
|
||
SUBST_FILES.fix-paths+= scripts/*.sh
|
||
SUBST_SED.fix-paths= -e 's,"/usr/local,"${PREFIX},g'
|
||
SUBST_SED.fix-paths+= -e 's,"/var/log,"${VARBASE}/log,g'
|
||
</pre>
|
||
<p><code class="varname">SUBST_CLASSES</code> is a list of identifiers
|
||
that are used to identify the different SUBST blocks that are
|
||
defined. The SUBST framework is heavily used by pkgsrc, so it is
|
||
important to always use the <code class="literal">+=</code> operator with
|
||
this variable. Otherwise some substitutions may be
|
||
skipped.</p>
|
||
<p>The remaining variables of each SUBST block are
|
||
parameterized with the identifier from the first line
|
||
(<code class="literal">fix-paths</code> in this case.) They can be seen as
|
||
parameters to a function call.</p>
|
||
<p><code class="varname">SUBST_STAGE.*</code> specifies the stage at
|
||
which the replacement will take place. All combinations of
|
||
<code class="literal">pre-</code>, <code class="literal">do-</code> and
|
||
<code class="literal">post-</code> together with a phase name are
|
||
possible, though only few are actually used. Most commonly used
|
||
are <code class="literal">post-patch</code> and
|
||
<code class="literal">pre-configure</code>. Of these two,
|
||
<code class="literal">pre-configure</code> should be preferred because
|
||
then it is possible to run <span class="command"><strong>bmake patch</strong></span> and
|
||
have the state after applying the patches but before making any
|
||
other changes. This is especially useful when you are debugging
|
||
a package in order to create new patches for it. Similarly,
|
||
<code class="literal">post-build</code> is preferred over
|
||
<code class="literal">pre-install</code>, because the install phase should
|
||
generally be kept as simple as possible. When you use
|
||
<code class="literal">post-build</code>, you have the same files in the
|
||
working directory that will be installed later, so you can check
|
||
if the substitution has succeeded.</p>
|
||
<p><code class="varname">SUBST_MESSAGE.*</code> is an optional text
|
||
that is printed just before the substitution is done.</p>
|
||
<p><code class="varname">SUBST_FILES.*</code> is the list of shell
|
||
globbing patterns that specifies the files in which the
|
||
substitution will take place. The patterns are interpreted
|
||
relatively to the <code class="varname">WRKSRC</code> directory.</p>
|
||
<p><code class="varname">SUBST_SED.*</code> is a list of arguments to
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?sed+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">sed</span>(1)</span></a> that specify the actual substitution. Every sed
|
||
command should be prefixed with <code class="literal">-e</code>, so that
|
||
all SUBST blocks look uniform.</p>
|
||
<p>There are some more variables, but they are so seldomly
|
||
used that they are only documented in the
|
||
<code class="filename">mk/subst.mk</code> file.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fixes.fetch"></a>19.2. Fixing problems in the <span class="emphasis"><em>fetch</em></span> phase</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="no-plain-download"></a>19.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
|
||
<code class="varname">DYNAMIC_MASTER_SITES</code> and a <span class="command"><strong>make
|
||
fetch</strong></span> will call <code class="filename">files/getsite.sh</code>
|
||
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 href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/graphics/ns-cult3d/README.html" target="_top"><code class="filename">graphics/ns-cult3d</code></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
|
||
<code class="varname">FETCH_MESSAGE</code> to a list of lines that are
|
||
displayed to the user before aborting the build. Example:</p>
|
||
<pre class="programlisting">
|
||
FETCH_MESSAGE= "Please download the files"
|
||
FETCH_MESSAGE+= " "${DISTFILES:Q}
|
||
FETCH_MESSAGE+= "manually from "${MASTER_SITES:Q}"."
|
||
</pre>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="modified-distfiles-same-name"></a>19.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 checksum will
|
||
no longer match. The contents of the new distfile should be
|
||
compared against the old one before changing anything, to make
|
||
sure the distfile was really updated on purpose, and that
|
||
no trojan horse or so crept in.
|
||
Please mention that the distfiles were compared and what was found
|
||
in your commit message.</p>
|
||
<p>Then, the correct way to work around this is to
|
||
set <code class="varname">DIST_SUBDIR</code> to a unique directory name,
|
||
usually based on <code class="varname">PKGNAME_NOREV</code>. All
|
||
<code class="varname">DISTFILES</code> and
|
||
<code class="varname">PATCHFILES</code> for this package will be put in that
|
||
subdirectory of the local distfiles directory.
|
||
(See <a class="xref" href="#bumping-pkgrevision" title="19.1.11. How to handle incrementing versions when fixing an existing package">Section 19.1.11, “How to handle incrementing versions when fixing an existing package”</a> for more details.)
|
||
In case this
|
||
happens more often, <code class="varname">PKGNAME</code> can be used (thus
|
||
including the <code class="filename">nbX</code> suffix) or a date stamp
|
||
can be appended, like <code class="varname">${PKGNAME_NOREV}-YYYYMMDD</code>.</p>
|
||
<p><code class="varname">DIST_SUBDIR</code> is also used when a distfile's name does not contain a version and the distfile is apt to change. In cases where the likelihood of this is very small, <code class="varname">DIST_SUBDIR</code> might not be required. Additionally, <code class="varname">DIST_SUBDIR</code> must not be removed unless the distfile name changes, even if a package is being moved or renamed.</p>
|
||
<p>Do not forget regenerating the <code class="filename">distinfo</code> file
|
||
after that, since it contains the <code class="varname">DIST_SUBDIR</code>
|
||
path in the filenames.
|
||
Also, increase the PKGREVISION if the installed package is different.
|
||
Furthermore, a mail to the package's authors seems appropriate
|
||
telling them that changing distfiles after releases without
|
||
changing the file names is not good practice.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="build.fetch.github"></a>19.2.3. Packages hosted on github.com</h3></div></div></div>
|
||
<p>Helper methods exist for packages hosted on github.com which will often have distfile names that clash with other packages, for example <code class="filename">1.0.tar.gz</code>. Use one of the three recipes from below:
|
||
</p>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="build.fetch.github.tag"></a>19.2.3.1. Fetch based on a tagged release</h4></div></div></div>
|
||
<p>
|
||
If your distfile URL looks similar to <code class="literal">http://github.com/username/exampleproject/archive/v1.0.zip</code>, then you are packaging a tagged release.
|
||
</p>
|
||
<pre class="programlisting">
|
||
DISTNAME= exampleproject-1.0
|
||
MASTER_SITES= ${MASTER_SITE_GITHUB:=username/}
|
||
#GITHUB_PROJECT= # can be omitted if same as DISTNAME
|
||
GITHUB_TAG= v${PKGVERSION_NOREV}
|
||
EXTRACT_SUFX= .zip
|
||
</pre>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="build.fetch.github.commit"></a>19.2.3.2. Fetch based on a specific commit</h4></div></div></div>
|
||
<p>
|
||
If your distfile URL looks similar to <code class="literal">http://github.com/example/example/archive/988881adc9fc3655077dc2d4d757d480b5ea0e11.tar.gz</code>, then you are packaging a specific commit not tied to a release.
|
||
</p>
|
||
<pre class="programlisting">
|
||
DISTNAME= example-1.0
|
||
MASTER_SITES= ${MASTER_SITE_GITHUB:=example/}
|
||
#GITHUB_PROJECT= # can be omitted if same as DISTNAME
|
||
GITHUB_TAG= 988881adc9fc3655077dc2d4d757d480b5ea0e11
|
||
</pre>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="build.fetch.github.release"></a>19.2.3.3. Fetch based on release</h4></div></div></div>
|
||
<p>
|
||
If your distfile URL looks similar to <code class="literal">http://github.com/username/exampleproject/releases/download/rel-1.6/offensive-1.6.zip</code>, then you are packaging a release.
|
||
</p>
|
||
<pre class="programlisting">
|
||
DISTNAME= offensive-1.6
|
||
PKGNAME= ${DISTNAME:S/offensive/proper/}
|
||
MASTER_SITES= ${MASTER_SITE_GITHUB:=username/}
|
||
GITHUB_PROJECT= exampleproject
|
||
GITHUB_RELEASE= rel-${PKGVERSION_NOREV} # usually just set this to ${DISTNAME}
|
||
EXTRACT_SUFX= .zip
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fixes.configure"></a>19.3. Fixing problems in the <span class="emphasis"><em>configure</em></span> phase</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="fixes.libtool"></a>19.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 href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/libtool/README.html" target="_top"><code class="filename">devel/libtool</code></a> pkg
|
||
can help here, as it just <span class="quote">“<span class="quote">knows</span>”</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 package in seven simple
|
||
steps:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Add <code class="varname">USE_LIBTOOL=yes</code> to the package
|
||
Makefile.</p></li>
|
||
<li class="listitem"><p>For library objects, use <span class="quote">“<span class="quote">${LIBTOOL} --mode=compile
|
||
${CC}</span>”</span> in place of <span class="quote">“<span class="quote">${CC}</span>”</span>. You could even
|
||
add it to the definition of <code class="varname">CC</code>, 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 class="listitem">
|
||
<p>For the linking of the library, remove any
|
||
<span class="quote">“<span class="quote">ar</span>”</span>, <span class="quote">“<span class="quote">ranlib</span>”</span>, and <span class="quote">“<span class="quote">ld
|
||
-Bshareable</span>”</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
|
||
<code class="filename">.la</code> extension, and the objects are
|
||
changed to have a <code class="filename">.lo</code>
|
||
extension. Change <code class="varname">OBJS</code> as
|
||
necessary. This automatically creates all of the
|
||
<code class="filename">.a</code>,
|
||
<code class="filename">.so.major.minor</code>, and ELF symlinks (if
|
||
necessary) in the build directory. Be sure to include
|
||
<span class="quote">“<span class="quote">-version-info</span>”</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">“<span class="quote">-release</span>”</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">“<span class="quote">libfoo-release.so.<span class="emphasis"><em>x</em></span>.<span class="emphasis"><em>y</em></span></span>”</span>
|
||
will have a symlink of
|
||
<span class="quote">“<span class="quote">libfoo.so.<span class="emphasis"><em>x</em></span>.<span class="emphasis"><em>y</em></span></span>”</span>
|
||
on an a.out platform. This is handled
|
||
automatically.</p>
|
||
<p>The <span class="quote">“<span class="quote">-rpath argument</span>”</span> is the install
|
||
directory of the library being built.</p>
|
||
<p>In the <code class="filename">PLIST</code>, include only the
|
||
<code class="filename">.la</code> file, the other files will be
|
||
added automatically.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>When linking shared object (<code class="filename">.so</code>)
|
||
files, i.e. files that are loaded via <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?dlopen+3+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">dlopen</span>(3)</span></a>, NOT
|
||
shared libraries, use <span class="quote">“<span class="quote">-module
|
||
-avoid-version</span>”</span> to prevent them getting version
|
||
tacked on.</p>
|
||
<p>The <code class="filename">PLIST</code> file gets the
|
||
<code class="filename">foo.so</code> entry.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>When linking programs that depend on these libraries
|
||
<span class="emphasis"><em>before</em></span> they are installed, preface
|
||
the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?cc+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">cc</span>(1)</span></a> or <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?ld+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">ld</span>(1)</span></a> line with <span class="quote">“<span class="quote">${LIBTOOL}
|
||
--mode=link</span>”</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">“<span class="quote">-L../somelib</span>”</span>), because it
|
||
expects you to change that argument to be the
|
||
<code class="filename">.la</code> 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 <em class="replaceable"><code>someprog</code></em> <em class="replaceable"><code>../somelib/somelib.la</code></em>
|
||
</pre>
|
||
<p>and it will do the right thing with the libraries.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>When installing libraries, preface the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?install+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">install</span>(1)</span></a>
|
||
or <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?cp+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">cp</span>(1)</span></a> command with <span class="quote">“<span class="quote">${LIBTOOL}
|
||
--mode=install</span>”</span>, and change the library name to
|
||
<code class="filename">.la</code>. e.g.</p>
|
||
<pre class="programlisting">
|
||
${LIBTOOL} --mode=install ${BSD_INSTALL_LIB} ${SOMELIB:.a=.la} ${PREFIX}/lib
|
||
</pre>
|
||
<p>This will install the static <code class="filename">.a</code>,
|
||
shared library, any needed symlinks, and run
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?ldconfig+8+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">ldconfig</span>(8)</span></a>.</p>
|
||
</li>
|
||
<li class="listitem"><p>In your <code class="filename">PLIST</code>, include only
|
||
the <code class="filename">.la</code>
|
||
file (this is a change from previous behaviour).</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="using-libtool"></a>19.3.2. Using libtool on GNU packages that already support libtool</h3></div></div></div>
|
||
<p>Add <code class="varname">USE_LIBTOOL=yes</code> 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 class="command"><strong>make
|
||
configure; find work*/ -name libtool</strong></span>.</p>
|
||
<p><code class="varname">LIBTOOL_OVERRIDE</code> specifies which libtool
|
||
scripts, relative to <code class="varname">WRKSRC</code>, to override. By
|
||
default, it is set to <span class="quote">“<span class="quote">libtool */libtool
|
||
*/*/libtool</span>”</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 <code class="filename">*.a</code> static
|
||
libraries built and installed, then use
|
||
<code class="varname">SHLIBTOOL_OVERRIDE</code> 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 devel/libltdl/buildlink3.mk.</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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem">
|
||
<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 class="orderedlist" type="1">
|
||
<li class="listitem"><p>The shared object is named correctly, i.e.
|
||
<code class="filename">libfoo.la</code>, not
|
||
<code class="filename">foo.la</code></p></li>
|
||
<li class="listitem"><p>The -dlopen option is used when linking an executable.</p></li>
|
||
</ol></div>
|
||
</li>
|
||
<li class="listitem"><p>The use of libltdl without the correct calls to initialisation routines.
|
||
The function lt_dlinit() should be called and the macro
|
||
<code class="varname">LTDL_SET_PRELOADED_SYMBOLS</code> included in
|
||
executables.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="autoconf-automake"></a>19.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.</p>
|
||
<p>For packages that need only autoconf:</p>
|
||
<pre class="programlisting">
|
||
AUTOCONF_REQD= 2.50 # if default version is not good enough
|
||
USE_TOOLS+= autoconf # use "autoconf213" for autoconf-2.13
|
||
...
|
||
|
||
pre-configure:
|
||
cd ${WRKSRC} && autoconf
|
||
|
||
...
|
||
</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
|
||
USE_TOOLS+= automake # use "automake14" for automake-1.4
|
||
...
|
||
|
||
pre-configure:
|
||
set -e; cd ${WRKSRC}; \
|
||
aclocal; autoheader; automake -a --foreign -i; autoconf
|
||
|
||
...
|
||
</pre>
|
||
<p>Packages which use GNU Automake will almost certainly
|
||
require GNU Make.</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
|
||
<code class="varname">AUTOMAKE_OVERRIDE=NO</code> in the package
|
||
Makefile.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="programming-languages"></a>19.4. Programming languages</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="basic-programming-languages"></a>19.4.1. C, C++, and Fortran</h3></div></div></div>
|
||
<p>Compilers for the C, C++, and Fortran languages comes with
|
||
the NetBSD base system. By default, pkgsrc assumes that a package
|
||
is written in C and will hide all other compilers (via the wrapper
|
||
framework, see <a class="xref" href="#buildlink" title="Chapter 14. Buildlink methodology">Chapter 14, <i>Buildlink methodology</i></a>).</p>
|
||
<p>To declare which language's compiler a package needs, set
|
||
the <code class="varname">USE_LANGUAGES</code> variable. Allowed values
|
||
currently are <span class="quote">“<span class="quote">c</span>”</span>, <span class="quote">“<span class="quote">c++</span>”</span>, and
|
||
<span class="quote">“<span class="quote">fortran</span>”</span> (and any combination). The default is
|
||
<span class="quote">“<span class="quote">c</span>”</span>. Packages using GNU configure scripts, even if
|
||
written in C++, usually need a C compiler for the configure
|
||
phase.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="java-programming-language"></a>19.4.2. Java</h3></div></div></div>
|
||
<p>If a program is written in Java, use the Java framework in
|
||
pkgsrc. The package must include
|
||
<code class="filename">../../mk/java-vm.mk</code>. This Makefile fragment
|
||
provides the following variables:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">USE_JAVA</code> defines if a build
|
||
dependency on the JDK is added. If
|
||
<code class="varname">USE_JAVA</code> is set to <span class="quote">“<span class="quote">run</span>”</span>, then
|
||
there is only a runtime dependency on the JDK. The default is
|
||
<span class="quote">“<span class="quote">yes</span>”</span>, which also adds a build dependency on the
|
||
JDK.</p></li>
|
||
<li class="listitem"><p>Set <code class="varname">USE_JAVA2</code> to declare that
|
||
a package needs a Java2 implementation. The supported values
|
||
are <span class="quote">“<span class="quote">yes</span>”</span>, <span class="quote">“<span class="quote">1.4</span>”</span>, and
|
||
<span class="quote">“<span class="quote">1.5</span>”</span>. <span class="quote">“<span class="quote">yes</span>”</span> accepts any Java2
|
||
implementation, <span class="quote">“<span class="quote">1.4</span>”</span> insists on versions 1.4 or
|
||
above, and <span class="quote">“<span class="quote">1.5</span>”</span> only accepts versions 1.5 or
|
||
above. This variable is not set by default.</p></li>
|
||
<li class="listitem"><p><code class="varname">PKG_JAVA_HOME</code> is
|
||
automatically set to the runtime location of the used Java
|
||
implementation dependency. It may be used to set
|
||
<code class="varname">JAVA_HOME</code> to a good value if the program
|
||
needs this variable to be defined.
|
||
</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="perl-scripts"></a>19.4.3. Packages containing perl scripts</h3></div></div></div>
|
||
<p>If your package contains interpreted perl scripts, add
|
||
<span class="quote">“<span class="quote">perl</span>”</span> to the <code class="varname">USE_TOOLS</code> variable
|
||
and set <code class="varname">REPLACE_PERL</code> to ensure that the proper
|
||
interpreter path is set. <code class="varname">REPLACE_PERL</code> should
|
||
contain a list of scripts, relative to <code class="varname">WRKSRC</code>,
|
||
that you want adjusted. Every occurrence of
|
||
<code class="filename">*/bin/perl</code> in a she-bang line will be
|
||
replaced with the full path to the perl executable.</p>
|
||
<p>If a particular version of perl is needed, set the
|
||
<code class="varname">PERL5_REQD</code> variable to the version number. The
|
||
default is <span class="quote">“<span class="quote">5.0</span>”</span>.</p>
|
||
<p>See <a class="xref" href="#perl-modules" title="19.6.6. Packages installing perl modules">Section 19.6.6, “Packages installing perl modules”</a> for information
|
||
about handling perl modules.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="shell-scripts"></a>19.4.4. Packages containing shell scripts</h3></div></div></div>
|
||
<p><code class="varname">REPLACE_SH</code>,
|
||
<code class="varname">REPLACE_BASH</code>, <code class="varname">REPLACE_CSH</code>,
|
||
and <code class="varname">REPLACE_KSH</code> can be used to replace shell
|
||
hash bangs in files. Please use the appropriate one, prefering
|
||
<code class="varname">REPLACE_SH</code> in case this shell is sufficient.
|
||
Each should contain a list of scripts, relative to
|
||
<code class="varname">WRKSRC</code>, that you want adjusted. Every
|
||
occurrence of the matching shell in a she-bang line will be
|
||
replaced with the full path to the shell executable.
|
||
When using <code class="varname">REPLACE_BASH</code>, don't forget to add
|
||
<code class="filename">bash</code> to <code class="varname">USE_TOOLS</code>.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="other-programming-languages"></a>19.4.5. Other programming languages</h3></div></div></div>
|
||
<p>Currently, there is no special handling for other languages
|
||
in pkgsrc. If a compiler package provides a
|
||
<code class="filename">buildlink3.mk</code> file, include that, otherwise
|
||
just add a (build) dependency on the appropriate compiler
|
||
package.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fixes.build"></a>19.5. Fixing problems in the <span class="emphasis"><em>build</em></span> phase</h2></div></div></div>
|
||
<p>The most common failures when building a package are that
|
||
some platforms do not provide certain header files, functions or
|
||
libraries, or they provide the functions in a library that the
|
||
original package author didn't know. To work around this, you
|
||
can rewrite the source code in most cases so that it does not
|
||
use the missing functions or provides a replacement function.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="fixes.build.cpp"></a>19.5.1. Compiling C and C++ code conditionally</h3></div></div></div>
|
||
<p>If a package already comes with a GNU configure script, the
|
||
preferred way to fix the build failure is to change the
|
||
configure script, not the code. In the other cases, you can
|
||
utilize the C preprocessor, which defines certain macros
|
||
depending on the operating system and hardware architecture it
|
||
compiles for. These macros can be queried using for example
|
||
<code class="varname">#if defined(__i386)</code>. Almost every operating
|
||
system, hardware architecture and compiler has its own macro.
|
||
For example, if the macros <code class="varname">__GNUC__</code>,
|
||
<code class="varname">__i386__</code> and <code class="varname">__NetBSD__</code>
|
||
are all defined, you know that you are using NetBSD on an i386
|
||
compatible CPU, and your compiler is GCC.</p>
|
||
<p>The list of the following macros for hardware and
|
||
operating system depends on the compiler that is used. For
|
||
example, if you want to conditionally compile code on Solaris,
|
||
don't use <code class="varname">__sun__</code>, as the SunPro compiler
|
||
does not define it. Use <code class="varname">__sun</code> instead.</p>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="fixes.build.cpp.os"></a>19.5.1.1. C preprocessor macros to identify the operating system</h4></div></div></div>
|
||
<p>To distinguish between 4.4 BSD-derived systems and the
|
||
rest of the world, you should use the following code.</p>
|
||
<pre class="programlisting">
|
||
#include <sys/param.h>
|
||
#if (defined(BSD) && BSD >= 199306)
|
||
/* BSD-specific code goes here */
|
||
#else
|
||
/* non-BSD-specific code goes here */
|
||
#endif
|
||
</pre>
|
||
<p>If this distinction is not fine enough, you can also test
|
||
for the following macros.</p>
|
||
<pre class="programlisting">
|
||
Cygwin __CYGWIN__
|
||
DragonFly __DragonFly__
|
||
FreeBSD __FreeBSD__
|
||
Haiku __HAIKU__
|
||
Interix __INTERIX
|
||
IRIX __sgi (TODO: get a definite source for this)
|
||
Linux linux, __linux, __linux__
|
||
Mac OS X __APPLE__
|
||
MirBSD __MirBSD__ (__OpenBSD__ is also defined)
|
||
Minix3 __minix
|
||
NetBSD __NetBSD__
|
||
OpenBSD __OpenBSD__
|
||
Solaris sun, __sun
|
||
</pre>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="fixes.build.cpp.arch"></a>19.5.1.2. C preprocessor macros to identify the hardware architecture</h4></div></div></div>
|
||
<pre class="programlisting">
|
||
i386 i386, __i386, __i386__
|
||
MIPS __mips
|
||
SPARC sparc, __sparc
|
||
</pre>
|
||
</div>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="fixes.build.cpp.compiler"></a>19.5.1.3. C preprocessor macros to identify the compiler</h4></div></div></div>
|
||
<pre class="programlisting">
|
||
GCC __GNUC__ (major version), __GNUC_MINOR__
|
||
MIPSpro _COMPILER_VERSION (0x741 for MIPSpro 7.41)
|
||
SunPro __SUNPRO_C (0x570 for Sun C 5.7)
|
||
SunPro C++ __SUNPRO_CC (0x580 for Sun C++ 5.8)
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="compiler-bugs"></a>19.5.2. 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
|
||
<code class="varname">MACHINE_ARCH</code> and compiler version, disabling
|
||
optimisation for that combination of file,
|
||
<code class="varname">MACHINE_ARCH</code> and compiler.</p>
|
||
<p>This used to be a big problem in the past, but is rarely
|
||
needed now as compiler technology has matured. If you still need
|
||
to add a compiler specific workaround, please do so in the file
|
||
<code class="filename">hacks.mk</code> and describe the symptom and
|
||
compiler version as detailed as possible.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="undefined-reference"></a>19.5.3. Undefined reference to <span class="quote">“<span class="quote">...</span>”</span>
|
||
</h3></div></div></div>
|
||
<p>This error message often means that a package did not
|
||
link to a shared library it needs. The following functions are
|
||
known to cause this error message over and over.</p>
|
||
<div class="informaltable">
|
||
<a name="undefined-reference-functions"></a><table class="informaltable" border="1">
|
||
<colgroup>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
</colgroup>
|
||
<thead><tr>
|
||
<th>Function</th>
|
||
<th>Library</th>
|
||
<th>Affected platforms</th>
|
||
</tr></thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>accept, bind, connect</td>
|
||
<td>-lsocket</td>
|
||
<td>Solaris</td>
|
||
</tr>
|
||
<tr>
|
||
<td>crypt</td>
|
||
<td>-lcrypt</td>
|
||
<td>DragonFly, NetBSD</td>
|
||
</tr>
|
||
<tr>
|
||
<td>dlopen, dlsym</td>
|
||
<td>-ldl</td>
|
||
<td>Linux</td>
|
||
</tr>
|
||
<tr>
|
||
<td>gethost*</td>
|
||
<td>-lnsl</td>
|
||
<td>Solaris</td>
|
||
</tr>
|
||
<tr>
|
||
<td>inet_aton</td>
|
||
<td>-lresolv</td>
|
||
<td>Solaris</td>
|
||
</tr>
|
||
<tr>
|
||
<td>nanosleep, sem_*, timer_*</td>
|
||
<td>-lrt</td>
|
||
<td>Solaris</td>
|
||
</tr>
|
||
<tr>
|
||
<td>openpty</td>
|
||
<td>-lutil</td>
|
||
<td>Linux</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<p>To fix these linker errors, it is often sufficient to say
|
||
<code class="literal">LIBS.<em class="replaceable"><code>OperatingSystem</code></em>+=
|
||
-l<em class="replaceable"><code>foo</code></em></code> to the package
|
||
<code class="filename">Makefile</code> and then say <span class="command"><strong>bmake clean;
|
||
bmake</strong></span>.</p>
|
||
<div class="sect3">
|
||
<div class="titlepage"><div><div><h4 class="title">
|
||
<a name="undefined-reference-sunpro"></a>19.5.3.1. Special issue: The SunPro compiler</h4></div></div></div>
|
||
<p>When you are using the SunPro compiler, there is another
|
||
possibility. That compiler cannot handle the following code:</p>
|
||
<pre class="programlisting">
|
||
extern int extern_func(int);
|
||
|
||
static inline int
|
||
inline_func(int x)
|
||
{
|
||
return extern_func(x);
|
||
}
|
||
|
||
int main(void)
|
||
{
|
||
return 0;
|
||
}
|
||
</pre>
|
||
<p>It generates the code for <code class="function">inline_func</code> even if
|
||
that function is never used. This code then refers to
|
||
<code class="function">extern_func</code>, which can usually not be resolved. To
|
||
solve this problem you can try to tell the package to disable inlining
|
||
of functions.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="out-of-memory"></a>19.5.4. Running out of memory</h3></div></div></div>
|
||
<p>Sometimes packages fail to build because the compiler runs
|
||
into an operating system specific soft limit. With the
|
||
<code class="varname">UNLIMIT_RESOURCES</code> variable pkgsrc can be told
|
||
to unlimit the resources. Currently, the allowed values are any combination of
|
||
<span class="quote">“<span class="quote">cputime</span>”</span>, <span class="quote">“<span class="quote">datasize</span>”</span>,
|
||
<span class="quote">“<span class="quote">memorysize</span>”</span>, and <span class="quote">“<span class="quote">stacksize</span>”</span>.
|
||
Setting this variable is similar to running the shell builtin
|
||
<span class="command"><strong>ulimit</strong></span> command to raise the maximum data
|
||
segment size or maximum stack size of a process, respectively, to
|
||
their hard limits.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fixes.install"></a>19.6. Fixing problems in the <span class="emphasis"><em>install</em></span> phase</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="install-scripts"></a>19.6.1. Creating needed directories</h3></div></div></div>
|
||
<p>The BSD-compatible <span class="command"><strong>install</strong></span> supplied
|
||
with some operating systems cannot create more than one
|
||
directory at a time. As such, you should call
|
||
<code class="literal">${INSTALL_*_DIR}</code> like this:</p>
|
||
<pre class="programlisting">
|
||
${INSTALL_DATA_DIR} ${PREFIX}/dir1
|
||
${INSTALL_DATA_DIR} ${PREFIX}/dir2
|
||
</pre>
|
||
<p>You can also just append <span class="quote">“<span class="quote"><code class="literal">dir1
|
||
dir2</code></span>”</span> to the
|
||
<code class="varname">INSTALLATION_DIRS</code> variable, which will
|
||
automatically do the right thing.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="where-to-install-documentation"></a>19.6.2. Where to install documentation</h3></div></div></div>
|
||
<p>In general, documentation should be installed into
|
||
<code class="filename">${PREFIX}/share/doc/${PKGBASE}</code> or
|
||
<code class="filename">${PREFIX}/share/doc/${PKGNAME}</code> (the latter
|
||
includes the version number of the package).</p>
|
||
<p>Many modern packages using GNU autoconf allow to set the
|
||
directory where HTML documentation is installed with the
|
||
<span class="quote">“<span class="quote">--with-html-dir</span>”</span> option. Sometimes using this flag
|
||
is needed because otherwise the documentation ends up in
|
||
<code class="filename">${PREFIX}/share/doc/html</code> or other
|
||
places.</p>
|
||
<p>An exception to the above is that library API documentation
|
||
generated with the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/textproc/gtk-doc/README.html" target="_top"><code class="filename">textproc/gtk-doc</code></a> tools, for use by special
|
||
browsers (devhelp) should be left at their default location, which
|
||
is <code class="filename">${PREFIX}/share/gtk-doc</code>. Such
|
||
documentation can be recognized from files ending in
|
||
<code class="filename">.devhelp</code> or <code class="filename">.devhelp2</code>.
|
||
(It is also acceptable to install such files in
|
||
<code class="filename">${PREFIX}/share/doc/${PKGBASE}</code> or
|
||
<code class="filename">${PREFIX}/share/doc/${PKGNAME}</code>; the
|
||
<code class="filename">.devhelp*</code> file must be directly in that
|
||
directory then, no additional subdirectory level is allowed in
|
||
this case. This is usually achieved by using
|
||
<span class="quote">“<span class="quote">--with-html-dir=${PREFIX}/share/doc</span>”</span>.
|
||
<code class="filename">${PREFIX}/share/gtk-doc</code> is preferred
|
||
though.)</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="installing-score-files"></a>19.6.3. Installing highscore 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). Set
|
||
<code class="varname">USE_GAMESGROUP</code> to yes to support this. The
|
||
following variables, documented in more detail in
|
||
<code class="filename">mk/defaults/mk.conf</code>, control this
|
||
behaviour: <code class="varname">GAMEDATAMODE</code>,
|
||
<code class="varname">GAMEDIRMODE</code>, <code class="varname">GAMES_GROUP</code>,
|
||
<code class="varname">GAMEMODE</code>, <code class="varname">GAME_USER</code>.
|
||
Other useful variables are: <code class="varname">GAMEDIR_PERMS</code>,
|
||
<code class="varname">GAMEDATA_PERMS</code> and
|
||
<code class="varname">SETGID_GAMES_PERMS</code>.</p>
|
||
<p>An example that illustrates some of the variables described above is
|
||
<code class="filename">games/moon-buggy</code>. <code class="varname">OWN_DIRS_PERMS</code> is
|
||
used to properly set directory permissions of the directory where the
|
||
scorefile is saved, <code class="varname">REQD_FILES_PERMS</code> is used to create a
|
||
dummy scorefile (<code class="filename">mbscore</code>) with the proper permissions
|
||
and <code class="varname">SPECIAL_PERMS</code> is used to install setgid the game
|
||
binary:</p>
|
||
<pre class="programlisting">
|
||
USE_GAMESGROUP= yes
|
||
|
||
BUILD_DEFS+= VARBASE
|
||
|
||
OWN_DIRS_PERMS+= ${VARBASE}/games/moon-buggy ${GAMEDIR_PERMS}
|
||
REQD_FILES_PERMS+= /dev/null ${VARBASE}/games/moon-buggy/mbscore ${GAMEDATA_PERMS}
|
||
SPECIAL_PERMS+= ${PREFIX}/bin/moon-buggy ${SETGID_GAMES_PERMS}
|
||
</pre>
|
||
<p>Various <code class="varname">INSTALL_*</code> variables are also available:
|
||
<code class="varname">INSTALL_GAME</code> to install setgid game binaries,
|
||
<code class="varname">INSTALL_GAME_DIR</code> to install game directories that are
|
||
needed to be accessed by setgid games and
|
||
<code class="varname">INSTALL_GAME_DATA</code> to install scorefiles.</p>
|
||
<p>A package should therefore never hard code file ownership or
|
||
access permissions but rely on <code class="varname">*_PERMS</code> as described above
|
||
or alternatively on <code class="varname">INSTALL_GAME</code>,
|
||
<code class="varname">INSTALL_GAME_DATA</code> and
|
||
<code class="varname">INSTALL_GAME_DIR</code> to set these correctly.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="destdir-support"></a>19.6.4. Adding DESTDIR support to packages</h3></div></div></div>
|
||
<p><code class="varname">DESTDIR</code> support means that a package
|
||
installs into a staging directory, not the final location of the
|
||
files. Then a binary package is created which can be used for
|
||
installation as usual. There are two ways: Either the package must
|
||
install as root (<span class="quote">“<span class="quote">destdir</span>”</span>) or the package can
|
||
install as non-root user (<span class="quote">“<span class="quote">user-destdir</span>”</span>).</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">PKG_DESTDIR_SUPPORT</code> has to be
|
||
set to <span class="quote">“<span class="quote">none</span>”</span>, <span class="quote">“<span class="quote">destdir</span>”</span>, or
|
||
<span class="quote">“<span class="quote">user-destdir</span>”</span>. By default <code class="varname">PKG_DESTDIR_SUPPORT</code>
|
||
is set to <span class="quote">“<span class="quote">user-destdir</span>”</span> to help catching more
|
||
potential packaging problems. If bsd.prefs.mk is included in the Makefile,
|
||
<code class="varname">PKG_DESTDIR_SUPPORT</code> needs to be set before
|
||
the inclusion.</p></li>
|
||
<li class="listitem"><p>All installation operations have to be prefixed with
|
||
<code class="filename">${DESTDIR}</code>.</p></li>
|
||
<li class="listitem"><p>automake gets this DESTDIR mostly right
|
||
automatically. Many manual rules and pre/post-install often are
|
||
incorrect; fix them.</p></li>
|
||
<li class="listitem"><p>If files are installed with special owner/group
|
||
use <code class="varname">SPECIAL_PERMS</code>.</p></li>
|
||
<li class="listitem"><p>In general, packages should support
|
||
<code class="varname">UNPRIVILEGED</code> to be able to use
|
||
DESTDIR.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="hardcoded-paths"></a>19.6.5. 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 <code class="filename">Makefile</code> (we
|
||
shall use <span class="command"><strong>tclsh</strong></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 class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>Before March 2006, these variables were called
|
||
<code class="varname">_REPLACE.*</code> and
|
||
<code class="varname">_REPLACE_FILES.*</code>.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="perl-modules"></a>19.6.6. Packages installing perl modules</h3></div></div></div>
|
||
<p>Makefiles of packages providing perl5 modules should include
|
||
the Makefile fragment
|
||
<code class="filename">../../lang/perl5/module.mk</code>. It provides a
|
||
<span class="command"><strong>do-configure</strong></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
|
||
<code class="filename">PLIST</code> corresponding to the files listed in
|
||
the installed <code class="filename">.packlist</code> file generated by
|
||
most perl5 modules. This is invoked by defining
|
||
<code class="varname">PERL5_PACKLIST</code> to a space-separated list of
|
||
packlist files relative to <code class="varname">PERL5_PACKLIST_DIR</code>
|
||
(<code class="varname">PERL5_INSTALLVENDORARCH</code> by default),
|
||
e.g.:</p>
|
||
<pre class="programlisting">
|
||
PERL5_PACKLIST= auto/Pg/.packlist
|
||
</pre>
|
||
<p>The perl5 config variables
|
||
<code class="varname">installarchlib</code>,
|
||
<code class="varname">installscript</code>,
|
||
<code class="varname">installvendorbin</code>,
|
||
<code class="varname">installvendorscript</code>,
|
||
<code class="varname">installvendorarch</code>,
|
||
<code class="varname">installvendorlib</code>,
|
||
<code class="varname">installvendorman1dir</code>, and
|
||
<code class="varname">installvendorman3dir</code> represent those
|
||
locations in which components of perl5 modules may be installed,
|
||
provided as variable with uppercase and prefixed with
|
||
<code class="varname">PERL5_</code>, e.g. <code class="varname">PERL5_INSTALLARCHLIB</code>
|
||
and may be used by perl5 packages that don't have a packlist.
|
||
These variables are also substituted for in the
|
||
<code class="filename">PLIST</code> as uppercase prefixed with
|
||
<code class="varname">PERL5_SUB_</code>.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="faq.info-files"></a>19.6.7. Packages installing info files</h3></div></div></div>
|
||
<p>Some packages install info files or use the
|
||
<span class="quote">“<span class="quote">makeinfo</span>”</span> or <span class="quote">“<span class="quote">install-info</span>”</span>
|
||
commands. <code class="varname">INFO_FILES</code> should be defined in
|
||
the package Makefile so that <code class="filename">INSTALL</code> and
|
||
<code class="filename">DEINSTALL</code> scripts will be generated to
|
||
handle registration of the info files in the Info directory
|
||
file. The <span class="quote">“<span class="quote">install-info</span>”</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><code class="varname">PKGINFODIR</code> is the directory under
|
||
<code class="filename">${PREFIX}</code> where info files are primarily
|
||
located. <code class="varname">PKGINFODIR</code> defaults to
|
||
<span class="quote">“<span class="quote">info</span>”</span> and can be overridden by the user.</p>
|
||
<p>The info files for the package should be listed in the
|
||
package <code class="filename">PLIST</code>; however any split info files
|
||
need not be listed.</p>
|
||
<p>A package which needs the <span class="quote">“<span class="quote">makeinfo</span>”</span> command
|
||
at build time must add <span class="quote">“<span class="quote">makeinfo</span>”</span> to
|
||
<code class="varname">USE_TOOLS</code> in its Makefile. If a minimum
|
||
version of the <span class="quote">“<span class="quote">makeinfo</span>”</span> command is needed it
|
||
should be noted with the <code class="varname">TEXINFO_REQD</code>
|
||
variable in the package <code class="filename">Makefile</code>. By
|
||
default, a minimum version of 3.12 is required. If the system
|
||
does not provide a <span class="command"><strong>makeinfo</strong></span> command or if it
|
||
does not match the required minimum, a build dependency on the
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/devel/gtexinfo/README.html" target="_top"><code class="filename">devel/gtexinfo</code></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 class="command"><strong>install-info</strong></span> command as the registration of
|
||
info files is the task of the package
|
||
<code class="filename">INSTALL</code> script, and it must use the
|
||
appropriate <span class="command"><strong>makeinfo</strong></span> command.</p>
|
||
<p>To achieve this goal, the pkgsrc infrastructure creates
|
||
overriding scripts for the <span class="command"><strong>install-info</strong></span> and
|
||
<span class="command"><strong>makeinfo</strong></span> commands in a directory listed early
|
||
in <code class="varname">PATH</code>.</p>
|
||
<p>The script overriding <span class="command"><strong>install-info</strong></span> has
|
||
no effect except the logging of a message. The script overriding
|
||
<span class="command"><strong>makeinfo</strong></span> logs a message and according to the
|
||
value of <code class="varname">TEXINFO_REQD</code> either runs the appropriate
|
||
<span class="command"><strong>makeinfo</strong></span> command or exit on error.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="manpages"></a>19.6.8. Packages installing man pages</h3></div></div></div>
|
||
<p>All packages that install manual pages should install them
|
||
into the same directory, so that there is one common place to look
|
||
for them. In pkgsrc, this place is
|
||
<code class="literal">${PREFIX}/${PKGMANDIR}</code>, and this expression
|
||
should be used in packages. The default for
|
||
<code class="varname">PKGMANDIR</code> is
|
||
<span class="quote">“<span class="quote"><code class="filename">man</code></span>”</span>. Another often-used value
|
||
is <span class="quote">“<span class="quote"><code class="filename">share/man</code></span>”</span>.</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>The support for a custom <code class="varname">PKGMANDIR</code>
|
||
is far from complete.</p>
|
||
</div>
|
||
<p>The <code class="filename">PLIST</code> files can just use
|
||
<code class="filename">man/</code> as the top level directory for the man
|
||
page file entries, and the pkgsrc framework will convert as
|
||
needed. In all other places, the correct
|
||
<code class="varname">PKGMANDIR</code> must be used.</p>
|
||
<p>Packages that are
|
||
configured with <code class="varname">GNU_CONFIGURE</code> set as
|
||
<span class="quote">“<span class="quote">yes</span>”</span>, by default will use the
|
||
<code class="filename">./configure</code>
|
||
--mandir switch to set where the man pages should be installed.
|
||
The path is <code class="varname">GNU_CONFIGURE_MANDIR</code> which defaults
|
||
to <code class="varname">${PREFIX}/${PKGMANDIR}</code>.</p>
|
||
<p>Packages that use <code class="varname">GNU_CONFIGURE</code> but do not
|
||
use --mandir, can set <code class="varname">CONFIGURE_HAS_MANDIR</code>
|
||
to <span class="quote">“<span class="quote">no</span>”</span>.
|
||
Or if the <code class="filename">./configure</code> script uses
|
||
a non-standard use of --mandir, you can set
|
||
<code class="varname">GNU_CONFIGURE_MANDIR</code> as needed.</p>
|
||
<p>See <a class="xref" href="#manpage-compression" title="13.5. Man page compression">Section 13.5, “Man page compression”</a> for
|
||
information on installation of compressed manual pages.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="gconf-data-files"></a>19.6.9. Packages installing GConf data files</h3></div></div></div>
|
||
<p>If a package installs <code class="filename">.schemas</code> or
|
||
<code class="filename">.entries</code> files, used by GConf,
|
||
you need to take some extra steps to make sure they get registered
|
||
in the database:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Include <code class="filename">../../devel/GConf/schemas.mk</code>
|
||
instead of its <code class="filename">buildlink3.mk</code> file. This
|
||
takes care of rebuilding the GConf database at installation and
|
||
deinstallation time, and tells the package where to install
|
||
GConf data files using some standard configure arguments. It
|
||
also disallows any access to the database directly from the
|
||
package.</p></li>
|
||
<li class="listitem"><p>Ensure that the package installs its
|
||
<code class="filename">.schemas</code> files under
|
||
<code class="filename">${PREFIX}/share/gconf/schemas</code>. If they get
|
||
installed under <code class="filename">${PREFIX}/etc</code>, you will
|
||
need to manually patch the package.</p></li>
|
||
<li class="listitem"><p>Check the PLIST and remove any entries under the etc/gconf
|
||
directory, as they will be handled automatically. See
|
||
<a class="xref" href="#faq.conf" title="9.13. How do I change the location of configuration files?">Section 9.13, “How do I change the location of configuration files?”</a> for more information.</p></li>
|
||
<li class="listitem"><p>Define the <code class="varname">GCONF_SCHEMAS</code> variable in
|
||
your <code class="filename">Makefile</code> with a list of all
|
||
<code class="filename">.schemas</code> files installed by the package, if
|
||
any. Names must not contain any directories in them.</p></li>
|
||
<li class="listitem"><p>Define the <code class="varname">GCONF_ENTRIES</code> variable in
|
||
your <code class="filename">Makefile</code> with a
|
||
list of all <code class="filename">.entries</code> files installed by the
|
||
package, if any. Names must not contain any directories in
|
||
them.</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="scrollkeeper-data-files"></a>19.6.10. Packages installing scrollkeeper/rarian data files</h3></div></div></div>
|
||
<p>If a package installs <code class="filename">.omf</code> files, used by
|
||
scrollkeeper/rarian, you need to take some extra steps to make sure they
|
||
get registered in the database:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Include
|
||
<code class="filename">../../mk/omf-scrollkeeper.mk</code>
|
||
instead of rarian's <code class="filename">buildlink3.mk</code> 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 class="listitem"><p>Check the PLIST and remove any entries under the
|
||
<code class="filename">libdata/scrollkeeper</code> directory, as they
|
||
will be handled automatically.</p></li>
|
||
<li class="listitem"><p>Remove the <code class="filename">share/omf</code> directory from
|
||
the PLIST. It will be handled by rarian. (<span class="command"><strong>make
|
||
print-PLIST</strong></span> does this automatically.)</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="x11-fonts"></a>19.6.11. 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 the pkginstall framework.</p>
|
||
<p>You can list the directories where fonts are installed in the
|
||
<code class="varname">FONTS_DIRS.<em class="replaceable"><code>type</code></em></code>
|
||
variables, where <em class="replaceable"><code>type</code></em> can be one of
|
||
<span class="quote">“<span class="quote">ttf</span>”</span>, <span class="quote">“<span class="quote">type1</span>”</span> or <span class="quote">“<span class="quote">x11</span>”</span>.
|
||
Also make sure that the database file
|
||
<code class="filename">fonts.dir</code> 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">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="gtk2-modules"></a>19.6.12. 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 class="orderedlist" type="1">
|
||
<li class="listitem"><p>Include
|
||
<code class="filename">../../x11/gtk2/modules.mk</code> instead of its
|
||
<code class="filename">buildlink3.mk</code> file. This takes care of
|
||
rebuilding the database at installation and deinstallation time.</p></li>
|
||
<li class="listitem"><p>Set <code class="varname">GTK2_IMMODULES=YES</code> if
|
||
your package installs GTK2 immodules.</p></li>
|
||
<li class="listitem"><p>Set <code class="varname">GTK2_LOADERS=YES</code> if your package installs
|
||
GTK2 loaders.</p></li>
|
||
<li class="listitem">
|
||
<p>Patch the package to not touch any of the GTK2
|
||
databases directly. These are:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="filename">libdata/gtk-2.0/gdk-pixbuf.loaders</code></p></li>
|
||
<li class="listitem"><p><code class="filename">libdata/gtk-2.0/gtk.immodules</code></p></li>
|
||
</ul></div>
|
||
</li>
|
||
<li class="listitem"><p>Check the <code class="filename">PLIST</code> and remove
|
||
any entries under the <code class="filename">libdata/gtk-2.0</code>
|
||
directory, as they will be handled automatically.</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="sgml-xml-data"></a>19.6.13. 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 class="orderedlist" type="1">
|
||
<li class="listitem"><p>Include
|
||
<code class="filename">../../textproc/xmlcatmgr/catalogs.mk</code> in
|
||
your <code class="filename">Makefile</code>, which takes care of
|
||
registering those files in system-wide catalogs at
|
||
installation and deinstallation time.</p></li>
|
||
<li class="listitem"><p>Set <code class="varname">SGML_CATALOGS</code> to the full path of
|
||
any SGML catalogs installed by the package.</p></li>
|
||
<li class="listitem"><p>Set <code class="varname">XML_CATALOGS</code> to the full path of
|
||
any XML catalogs installed by the package.</p></li>
|
||
<li class="listitem"><p>Set <code class="varname">SGML_ENTRIES</code> 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 class="listitem"><p>Set <code class="varname">XML_ENTRIES</code> 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">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="mime-database"></a>19.6.14. Packages installing extensions to the MIME database</h3></div></div></div>
|
||
<p>If a package provides extensions to the MIME database by
|
||
installing <code class="filename">.xml</code> files inside
|
||
<code class="filename">${PREFIX}/share/mime/packages</code>, 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 class="orderedlist" type="1">
|
||
<li class="listitem"><p>Include
|
||
<code class="filename">../../databases/shared-mime-info/mimedb.mk</code>
|
||
(avoid using the <code class="filename">buildlink3.mk</code> file from
|
||
this same directory, which is reserved for inclusion from
|
||
other <code class="filename">buildlink3.mk</code> 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 class="listitem"><p>Check the PLIST and remove any entries under the
|
||
<code class="filename">share/mime</code> directory,
|
||
<span class="emphasis"><em>except</em></span> for files saved under
|
||
<code class="filename">share/mime/packages</code>. The former are
|
||
handled automatically by
|
||
the update-mime-database program, but the latter are
|
||
package-dependent and must be removed by the package that
|
||
installed them in the first place.</p></li>
|
||
<li class="listitem"><p>Remove any <code class="filename">share/mime/*</code> directories
|
||
from the PLIST. They will be handled by the shared-mime-info
|
||
package.</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="intltool"></a>19.6.15. Packages using intltool</h3></div></div></div>
|
||
<p>If a package uses intltool during its build, add
|
||
<code class="literal">intltool</code> to the <code class="varname">USE_TOOLS</code>,
|
||
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 class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="startup-scripts"></a>19.6.16. Packages installing startup scripts</h3></div></div></div>
|
||
<p>If a package contains a rc.d script, it won't be copied into
|
||
the startup directory by default, but you can enable it, by adding
|
||
the option <code class="varname">PKG_RCD_SCRIPTS=YES</code> in
|
||
<a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>. This option will copy the scripts
|
||
into <code class="filename">/etc/rc.d</code> when a package is installed, and
|
||
it will automatically remove the scripts when the package is
|
||
deinstalled.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="tex-packages"></a>19.6.17. Packages installing TeX modules</h3></div></div></div>
|
||
<p>If a package installs TeX packages into the texmf tree,
|
||
the <code class="filename">ls-R</code> database of the tree needs to be
|
||
updated.</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>Except the main TeX packages such as kpathsea,
|
||
packages should install files
|
||
into <code class="filename">${PREFIX}/share/texmf-dist</code>,
|
||
not <code class="filename">${PREFIX}/share/texmf</code>.</p>
|
||
</div>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Include
|
||
<code class="filename">../../print/kpathsea/texmf.mk</code>. This
|
||
takes care of rebuilding the <code class="filename">ls-R</code>
|
||
database at installation and deinstallation time.</p></li>
|
||
<li class="listitem">
|
||
<p>If your package installs files into a texmf
|
||
tree other than the one
|
||
at <code class="filename">${PREFIX}/share/texmf-dist</code>,
|
||
set <code class="varname">TEX_TEXMF_DIRS</code> to the list of all texmf
|
||
trees that need database update.</p>
|
||
<p>If your package also installs font map files that need
|
||
to be registered using <span class="command"><strong>updmap</strong></span>,
|
||
include <code class="filename">../../print/tex-tetex/map.mk</code> and
|
||
set <code class="varname">TEX_MAP_FILES</code> and/or
|
||
<code class="varname">TEX_MIXEDMAP_FILES</code> to the list of all
|
||
such font map files. Then <span class="command"><strong>updmap</strong></span> will
|
||
be run automatically at installation/deinstallation to
|
||
enable/disable font map files for TeX output
|
||
drivers.</p>
|
||
</li>
|
||
<li class="listitem"><p>Make sure that none of <code class="filename">ls-R</code>
|
||
databases are included in <code class="filename">PLIST</code>, as
|
||
they will be removed only by the kpathsea package.</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="emulation-packages"></a>19.6.18. Packages supporting running binaries in
|
||
emulation</h3></div></div></div>
|
||
<p>There are some packages that provide libraries and
|
||
executables for running binaries from a one operating system
|
||
on a different one (if the latter supports it). One example
|
||
is running Linux binaries on NetBSD.</p>
|
||
<p>The <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/rpm2pkg/README.html" target="_top"><code class="filename">pkgtools/rpm2pkg</code></a>
|
||
helps in extracting and packaging Linux rpm packages.</p>
|
||
<p>The <code class="varname">CHECK_SHLIBS</code> can be set to no to
|
||
avoid the <span class="command"><strong>check-shlibs</strong></span> target, which tests
|
||
if all libraries for each installed executable can be found by
|
||
the dynamic linker. Since the standard dynamic linker is run,
|
||
this fails for emulation packages, because the libraries used
|
||
by the emulation are not in the standard directories.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="hicolor-theme"></a>19.6.19. Packages installing hicolor theme icons</h3></div></div></div>
|
||
<p>If a package installs images under the
|
||
<code class="filename">share/icons/hicolor</code> and/or updates the
|
||
<code class="filename">share/icons/hicolor/icon-theme.cache</code>
|
||
database, you need to take some extra steps to make sure that the
|
||
shared theme directory is handled appropriately and that the cache
|
||
database is rebuilt:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Include
|
||
<code class="filename">../../graphics/hicolor-icon-theme/buildlink3.mk</code>.</p></li>
|
||
<li class="listitem"><p>Check the <code class="filename">PLIST</code> and remove the
|
||
entry that refers to the theme cache.</p></li>
|
||
<li class="listitem"><p>Ensure that the PLIST does not remove the shared icon
|
||
directories from the <code class="filename">share/icons/hicolor</code>
|
||
hierarchy because they will be handled automatically.</p></li>
|
||
</ol></div>
|
||
<p>The best way to verify that the PLIST is correct with
|
||
respect to the last two points is to regenerate it using
|
||
<span class="command"><strong>make print-PLIST</strong></span>.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="desktop-files"></a>19.6.20. Packages installing desktop files</h3></div></div></div>
|
||
<p>If a package installs <code class="filename">.desktop</code> files
|
||
under <code class="filename">share/applications</code> and these include
|
||
MIME information (MimeType key), you need to take extra steps to
|
||
ensure that they are registered into the MIME database:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Include
|
||
<code class="filename">../../sysutils/desktop-file-utils/desktopdb.mk</code>.</p></li>
|
||
<li class="listitem"><p>Check the PLIST and remove the entry that refers to the
|
||
<code class="filename">share/applications/mimeinfo.cache</code> file.
|
||
It will be handled automatically.</p></li>
|
||
</ol></div>
|
||
<p>The best way to verify that the PLIST is correct with
|
||
respect to the last point is to regenerate it using <span class="command"><strong>make
|
||
print-PLIST</strong></span>.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="punting"></a>19.7. Marking packages as having problems</h2></div></div></div>
|
||
<p>In some cases one does not have the time to solve a problem
|
||
immediately. In this case, one can plainly mark a package as broken. For
|
||
this, one just sets the variable <code class="varname">BROKEN</code> to the
|
||
reason why the package is broken (similar to the
|
||
<code class="varname">RESTRICTED</code> variable). A user trying to build
|
||
the package will immediately be shown this message, and the build
|
||
will not be even tried.</p>
|
||
<p><code class="varname">BROKEN</code> packages are removed from pkgsrc in irregular
|
||
intervals.</p>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="debug"></a>Chapter 20. 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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Be sure to set <code class="varname">PKG_DEVELOPER=yes</code> in <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>.</p></li>
|
||
<li class="listitem">
|
||
<p>Install <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/url2pkg/README.html" target="_top"><code class="filename">pkgtools/url2pkg</code></a>,
|
||
create a directory for a new package, change into it, then run
|
||
<span class="command"><strong>url2pkg</strong></span>:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>mkdir /usr/pkgsrc/<em class="replaceable"><code>category</code></em>/<em class="replaceable"><code>examplepkg</code></em></code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>cd /usr/pkgsrc/<em class="replaceable"><code>category</code></em>/<em class="replaceable"><code>examplepkg</code></em></code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>url2pkg http://www.example.com/path/to/distfile.tar.gz</code></strong></pre>
|
||
</li>
|
||
<li class="listitem"><p>Edit the <code class="filename">Makefile</code> as requested.</p></li>
|
||
<li class="listitem"><p>Fill in the <code class="filename">DESCR</code> file</p></li>
|
||
<li class="listitem"><p>Run <span class="command"><strong>make configure</strong></span></p></li>
|
||
<li class="listitem"><p>Add any dependencies glimpsed from documentation and the
|
||
configure step to the package's
|
||
<code class="filename">Makefile</code>.</p></li>
|
||
<li class="listitem">
|
||
<p>Make the package compile, doing multiple rounds of</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>make</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>pkgvi ${WRKSRC}/some/file/that/does/not/compile</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>mkpatches</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>patchdiff</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>mv ${WRKDIR}/.newpatches/* patches</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make mps</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>make clean</code></strong></pre>
|
||
<p>Doing this step as non-root user will ensure that no files
|
||
are modified that shouldn't be, especially during the build
|
||
phase. <span class="command"><strong>mkpatches</strong></span>,
|
||
<span class="command"><strong>patchdiff</strong></span> and <span class="command"><strong>pkgvi</strong></span> are
|
||
from the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkgdiff/README.html" target="_top"><code class="filename">pkgtools/pkgdiff</code></a>
|
||
package.</p>
|
||
</li>
|
||
<li class="listitem"><p>Look at the <code class="filename">Makefile</code>, fix if
|
||
necessary; see <a class="xref" href="#components.Makefile" title="11.1. Makefile">Section 11.1, “<code class="filename">Makefile</code>”</a>.</p></li>
|
||
<li class="listitem">
|
||
<p>Generate a <code class="filename">PLIST</code>:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make install</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make print-PLIST >PLIST</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make deinstall</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make install</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make deinstall</code></strong></pre>
|
||
<p>You usually need to be <code class="username">root</code> to do
|
||
this. Look if there are any files left:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make print-PLIST</code></strong></pre>
|
||
<p>If this reveals any files that are missing in
|
||
<code class="filename">PLIST</code>, add them.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>Now that the <code class="filename">PLIST</code> is OK, install the
|
||
package again and make a binary package:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make reinstall</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make package</code></strong></pre>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>Delete the installed package:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>pkg_delete <em class="replaceable"><code>examplepkg</code></em></code></strong></pre>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>Repeat the above <span class="command"><strong>make print-PLIST</strong></span>
|
||
command, which shouldn't find anything now:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make print-PLIST</code></strong></pre>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>Reinstall the binary package:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>pkg_add .../<em class="replaceable"><code>examplepkg</code></em>.tgz</code></strong></pre>
|
||
</li>
|
||
<li class="listitem"><p>Play with it. Make sure everything works.</p></li>
|
||
<li class="listitem">
|
||
<p>Run <span class="command"><strong>pkglint</strong></span> from <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkglint/README.html" target="_top"><code class="filename">pkgtools/pkglint</code></a>, and fix the problems it
|
||
reports:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>pkglint</code></strong></pre>
|
||
</li>
|
||
<li class="listitem"><p>Submit (or commit, if you have cvs access); see <a class="xref" href="#submit" title="Chapter 21. Submitting and Committing">Chapter 21, <i>Submitting and Committing</i></a>.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="submit"></a>Chapter 21. Submitting and Committing</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#submitting-binary-packages">21.1. Submitting binary packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#submitting-your-package">21.2. Submitting source packages (for non-NetBSD-developers)</a></span></dt>
|
||
<dt><span class="sect1"><a href="#general-notes-for-changes">21.3. General notes when adding, updating, or removing packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#committing-importing">21.4. Committing: Adding a package to CVS</a></span></dt>
|
||
<dt><span class="sect1"><a href="#updating-package">21.5. Updating a package to a newer version</a></span></dt>
|
||
<dt><span class="sect1"><a href="#renaming-package">21.6. Renaming a package in pkgsrc</a></span></dt>
|
||
<dt><span class="sect1"><a href="#moving-package">21.7. Moving a package in pkgsrc</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="submitting-binary-packages"></a>21.1. Submitting binary packages</h2></div></div></div>
|
||
<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 annoy anyone 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. NetBSD
|
||
developers doing bulk builds and wanting to upload them please
|
||
see <a class="xref" href="#bulk" title="Chapter 7. Creating binary packages for everything in pkgsrc (bulk builds)">Chapter 7, <i>Creating binary packages for everything in pkgsrc (bulk
|
||
builds)</i></a>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="submitting-your-package"></a>21.2. Submitting source packages (for non-NetBSD-developers)</h2></div></div></div>
|
||
<p>First, check that your package is complete, compiles and
|
||
runs well; see <a class="xref" href="#debug" title="Chapter 20. Debugging">Chapter 20, <i>Debugging</i></a> and the rest of this
|
||
document. Next, generate an uuencoded gzipped <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?tar+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">tar</span>(1)</span></a>
|
||
archive that contains all files that make up the package.
|
||
Finally, send this package to the pkgsrc bug tracking system,
|
||
either with the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?send-pr+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">send-pr</span>(1)</span></a> command, or if you don't have
|
||
that, go to the web page
|
||
<a class="ulink" href="http://www.NetBSD.org/support/send-pr.html" target="_top">http://www.NetBSD.org/support/send-pr.html</a>,
|
||
which contains some instructions and a link to a form where you
|
||
can submit packages. The
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/sysutils/gtk-send-pr/README.html" target="_top"><code class="filename">sysutils/gtk-send-pr</code></a> package is
|
||
also available as a substitute for either of the above two tools.
|
||
</p>
|
||
<p>In the form of the problem report, the category should be
|
||
<span class="quote">“<span class="quote">pkg</span>”</span>, the synopsis should include the package name
|
||
and version number, and the description field should contain a
|
||
short description of your package (contents of the COMMENT
|
||
variable or DESCR file are OK). The uuencoded package data should
|
||
go into the <span class="quote">“<span class="quote">fix</span>”</span> field.</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">“<span class="quote">pkgsrc work-in-progress</span>”</span>); see the
|
||
homepage at <a class="ulink" href="http://pkgsrc.org/wip/" target="_top">http://pkgsrc.org/wip/</a>
|
||
for details.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="general-notes-for-changes"></a>21.3. General notes when adding, updating, or removing packages</h2></div></div></div>
|
||
<p>Please note all package additions, updates, moves, and
|
||
removals in <code class="filename">pkgsrc/doc/CHANGES-<em class="replaceable"><code>YYYY</code></em></code>. 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 class="ulink" href="http://www.NetBSD.org/" target="_top">www.NetBSD.org</a> and other
|
||
sites. Additionally, check the
|
||
<code class="filename">pkgsrc/doc/TODO</code> file and remove the entry
|
||
for the package you updated or removed, in case it was mentioned
|
||
there.</p>
|
||
<p>When the <code class="varname">PKGREVISION</code> of a package is
|
||
bumped, the change should appear in
|
||
<code class="filename">pkgsrc/doc/CHANGES-<em class="replaceable"><code>YYYY</code></em></code> if it is security
|
||
related or otherwise relevant. Mass bumps that result from a
|
||
dependency being updated should not be mentioned. In all other
|
||
cases it's the developer's decision.</p>
|
||
<p>There is a make target that helps in creating proper
|
||
<code class="filename">CHANGES-<em class="replaceable"><code>YYYY</code></em></code> entries: <span class="command"><strong>make
|
||
changes-entry</strong></span>. It uses the optional <code class="varname">CTYPE</code>
|
||
and <code class="varname">NETBSD_LOGIN_NAME</code> variables. The general
|
||
usage is to first make sure that your <code class="filename">CHANGES-<em class="replaceable"><code>YYYY</code></em></code>
|
||
file is up-to-date (to avoid having to resolve conflicts later-on)
|
||
and then to <span class="command"><strong>cd</strong></span> to the package directory. For
|
||
package updates, <span class="command"><strong>make changes-entry</strong></span> is enough.
|
||
For new packages, or package moves or removals, set the
|
||
<code class="varname">CTYPE</code> variable on the command line to "Added",
|
||
"Moved", or "Removed". You can set <code class="varname">NETBSD_LOGIN_NAME</code>
|
||
in <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a> if your local login name is
|
||
not the same as your NetBSD login name. The target also automatically
|
||
removes possibly existing entries for the package in the
|
||
<code class="filename">TODO</code> file. Don't forget to commit
|
||
the changes, e.g. by using <span class="command"><strong>make commit-changes-entry</strong></span>!
|
||
If you are not using a checkout directly from cvs.NetBSD.org, but e.g.
|
||
a local copy of the repository, you can set USE_NETBSD_REPO=yes. This
|
||
makes the cvs commands use the main repository.
|
||
</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="committing-importing"></a>21.4. Committing: Adding a package to CVS</h2></div></div></div>
|
||
<p>This section is only of interest for pkgsrc developers with write
|
||
access to the pkgsrc repository.</p>
|
||
<p>When the package is finished, <span class="quote">“<span class="quote">cvs add</span>”</span> the files.
|
||
Start by adding the directory and then files in the directory. Don't
|
||
forget to add the new package to the category's
|
||
<code class="filename">Makefile</code>. Make sure you don't forget any files;
|
||
you can check by running <span class="quote">“<span class="quote">cvs status</span>”</span>. An example:</p>
|
||
<pre class="programlisting">
|
||
<code class="prompt">$</code> cd .../pkgsrc/category
|
||
<code class="prompt">$</code> cvs add pkgname
|
||
<code class="prompt">$</code> cd pkgname
|
||
<code class="prompt">$</code> cvs add DESCR Makefile PLIST distinfo buildlink3.mk patches
|
||
<code class="prompt">$</code> cvs add patches/p*
|
||
<code class="prompt">$</code> cvs status | less
|
||
<code class="prompt">$</code> cvs commit
|
||
<code class="prompt">$</code> cd ..
|
||
<code class="prompt">$</code> vi Makefile # add SUBDIRS+=pkgname line
|
||
<code class="prompt">$</code> cvs commit Makefile
|
||
<code class="prompt">$</code> cd pkgname
|
||
<code class="prompt">$</code> make CTYPE=Added commit-changes-entry
|
||
</pre>
|
||
<p>The commit message of the initial import should include part of the
|
||
<code class="filename">DESCR</code> file, so people reading the mailing lists know
|
||
what the package is/does.</p>
|
||
<p>Also mention the new package in
|
||
<code class="filename">pkgsrc/doc/CHANGES-20xx</code>.</p>
|
||
<p>Previously, <span class="quote">“<span class="quote">cvs import</span>”</span> was suggested, but it was
|
||
much easier to get wrong than <span class="quote">“<span class="quote">cvs add</span>”</span>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="updating-package"></a>21.5. 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 class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><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 class="listitem"><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 class="listitem"><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 recognize 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">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="renaming-package"></a>21.6. Renaming a package in pkgsrc</h2></div></div></div>
|
||
<p>Renaming packages is not recommended.</p>
|
||
<p>When renaming packages, be sure to fix any references to old name
|
||
in other Makefiles, options, buildlink files, etc.</p>
|
||
<p>Also When renaming a package, please define
|
||
<code class="varname">SUPERSEDES</code> to the package name and dewey version
|
||
pattern(s) of the previous package name.
|
||
This may be repeated for multiple renames.
|
||
The new package would be an exact replacement.
|
||
</p>
|
||
<p>Note that <span class="quote">“<span class="quote">successor</span>”</span> in the
|
||
CHANGES-<em class="replaceable"><code>YYYY</code></em> file doesn't necessarily
|
||
mean that it <span class="emphasis"><em>supersedes</em></span>, as that successor may
|
||
not be an exact replacement but is a suggestion for the replaced
|
||
functionality.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="moving-package"></a>21.7. Moving a package in pkgsrc</h2></div></div></div>
|
||
<p>It is preferred that packages are not renamed or moved, but if needed
|
||
please follow these steps.
|
||
</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem"><p>Make a copy of the directory somewhere else.</p></li>
|
||
<li class="listitem">
|
||
<p>Remove all CVS dirs.</p>
|
||
<p>Alternatively to the first two steps you can also do:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>cvs -d user@cvs.NetBSD.org:/cvsroot export -D today pkgsrc/category/package</code></strong></pre>
|
||
<p>and use that for further work.</p>
|
||
</li>
|
||
<li class="listitem"><p>Fix <code class="varname">CATEGORIES</code> and any
|
||
<code class="varname">DEPENDS</code> paths that just did <span class="quote">“<span class="quote">../package</span>”</span>
|
||
instead of <span class="quote">“<span class="quote">../../category/package</span>”</span>.</p></li>
|
||
<li class="listitem"><p>In the modified package's Makefile, consider setting
|
||
<code class="varname">PREV_PKGPATH</code> to the previous category/package
|
||
pathname. The <code class="varname">PREV_PKGPATH</code> can be used by tools
|
||
for doing an update using pkgsrc building; for example, it can
|
||
search the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?pkg_summary+5+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">pkg_summary</span>(5)</span></a> database for <code class="varname">PREV_PKGPATH</code>
|
||
(if no <code class="varname">SUPERSEDES</code>) and then use the corresponding
|
||
new <code class="varname">PKGPATH</code> for that moved package. Note that
|
||
it may have multiple matches, so the tool should also check on the
|
||
<code class="varname">PKGBASE</code> too. The <code class="varname">PREV_PKGPATH</code>
|
||
probably has no value unless <code class="varname">SUPERSEDES</code> is not
|
||
set, i.e. <code class="varname">PKGBASE</code> stays the same. </p></li>
|
||
<li class="listitem"><p><span class="command"><strong>cvs import</strong></span> the modified package in the new
|
||
place.</p></li>
|
||
<li class="listitem">
|
||
<p>Check if any package depends on it:
|
||
</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>cd /usr/pkgsrc</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>grep /package */*/Makefile* */*/buildlink*</code></strong></pre>
|
||
</li>
|
||
<li class="listitem"><p>Fix paths in packages from step 5 to point to new location.</p></li>
|
||
<li class="listitem"><p><span class="command"><strong>cvs rm (-f)</strong></span> the package at the old location.</p></li>
|
||
<li class="listitem"><p>Remove from <code class="filename">oldcategory/Makefile</code>.</p></li>
|
||
<li class="listitem"><p>Add to <code class="filename">newcategory/Makefile</code>.</p></li>
|
||
<li class="listitem">
|
||
<p>Commit the changed and removed files:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>cvs commit oldcategory/package oldcategory/Makefile newcategory/Makefile</code></strong></pre>
|
||
<p>(and any packages from step 5, of course).</p>
|
||
</li>
|
||
</ol></div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="devfaq"></a>Chapter 22. Frequently Asked Questions</h2></div></div></div>
|
||
<p>This section contains the answers to questions that may
|
||
arise when you are writing a package. If you don't find your
|
||
question answered here, first have a look in the other chapters,
|
||
and if you still don't have the answer, ask on the
|
||
<code class="literal">pkgsrc-users</code> mailing list.</p>
|
||
<div class="qandaset">
|
||
<a name="idm80019600"></a><dl>
|
||
<dt>22.1. <a href="#devfaq.makeflags">What is the difference between
|
||
MAKEFLAGS, .MAKEFLAGS and
|
||
MAKE_FLAGS?</a>
|
||
</dt>
|
||
<dt>22.2. <a href="#devfaq.make">What is the difference between
|
||
MAKE, GMAKE and
|
||
MAKE_PROGRAM?</a>
|
||
</dt>
|
||
<dt>22.3. <a href="#devfaq.cc">What is the difference between
|
||
CC, PKG_CC and
|
||
PKGSRC_COMPILER?</a>
|
||
</dt>
|
||
<dt>22.4. <a href="#devfaq.bl3flags">What is the difference between
|
||
BUILDLINK_LDFLAGS,
|
||
BUILDLINK_LDADD and
|
||
BUILDLINK_LIBS?</a>
|
||
</dt>
|
||
<dt>22.5. <a href="#devfaq.bl3prefix">Why does make show-var
|
||
VARNAME=BUILDLINK_PREFIX.foo
|
||
say it's empty?</a>
|
||
</dt>
|
||
<dt>22.6. <a href="#devfaq.master_sites">What does
|
||
${MASTER_SITE_SOURCEFORGE:=package/} mean? I
|
||
don't understand the := inside
|
||
it.</a>
|
||
</dt>
|
||
<dt>22.7. <a href="#devfaq.mailinglists">Which mailing lists are there for package
|
||
developers?</a>
|
||
</dt>
|
||
<dt>22.8. <a href="#devfaq.documentation">Where is the pkgsrc
|
||
documentation?</a>
|
||
</dt>
|
||
<dt>22.9. <a href="#devfaq.too-much-time">I have a little time to kill. What shall I
|
||
do?</a>
|
||
</dt>
|
||
</dl>
|
||
<table border="0" style="width: 100%;">
|
||
<colgroup>
|
||
<col align="left" width="1%">
|
||
<col>
|
||
</colgroup>
|
||
<tbody>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.makeflags"></a><a name="idm80019216"></a><p><b>22.1.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>What is the difference between
|
||
<code class="varname">MAKEFLAGS</code>, <code class="varname">.MAKEFLAGS</code> and
|
||
<code class="varname">MAKE_FLAGS</code>?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p><code class="varname">MAKEFLAGS</code> are the flags passed
|
||
to the pkgsrc-internal invocations of <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a>, while
|
||
<code class="varname">MAKE_FLAGS</code> are the flags that are passed to
|
||
the <code class="varname">MAKE_PROGRAM</code> when building the
|
||
package. [FIXME: What is .MAKEFLAGS for?]</p></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.make"></a><a name="idm80015248"></a><p><b>22.2.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>What is the difference between
|
||
<code class="varname">MAKE</code>, <code class="varname">GMAKE</code> and
|
||
<code class="varname">MAKE_PROGRAM</code>?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p><code class="varname">MAKE</code> is the path to the
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> program that is used in the pkgsrc
|
||
infrastructure. <code class="varname">GMAKE</code> is the path to GNU
|
||
Make, but you need to say <code class="varname">USE_TOOLS+=gmake</code> to
|
||
use that. <code class="varname">MAKE_PROGRAM</code> is the path to the
|
||
Make program that is used for building the
|
||
package.</p></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.cc"></a><a name="idm80002576"></a><p><b>22.3.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>What is the difference between
|
||
<code class="varname">CC</code>, <code class="varname">PKG_CC</code> and
|
||
<code class="varname">PKGSRC_COMPILER</code>?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p><code class="varname">CC</code> is the path to the real C
|
||
compiler, which can be configured by the pkgsrc user.
|
||
<code class="varname">PKG_CC</code> is the path to the compiler wrapper.
|
||
<code class="varname">PKGSRC_COMPILER</code> is <span class="emphasis"><em>not</em></span> a
|
||
path to a compiler, but the type of compiler that should be
|
||
used. See <code class="filename">mk/compiler.mk</code> for more
|
||
information about the latter variable.</p></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.bl3flags"></a><a name="idm79998480"></a><p><b>22.4.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>What is the difference between
|
||
<code class="varname">BUILDLINK_LDFLAGS</code>,
|
||
<code class="varname">BUILDLINK_LDADD</code> and
|
||
<code class="varname">BUILDLINK_LIBS</code>?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p>[FIXME]</p></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.bl3prefix"></a><a name="idm79996176"></a><p><b>22.5.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>Why does <span class="command"><strong>make show-var
|
||
VARNAME=BUILDLINK_PREFIX.<em class="replaceable"><code>foo</code></em></strong></span>
|
||
say it's empty?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p>For optimization reasons, some variables are only
|
||
available in the <span class="quote">“<span class="quote">wrapper</span>”</span> phase and later. To
|
||
<span class="quote">“<span class="quote">simulate</span>”</span> the wrapper phase, append
|
||
<span class="command"><strong>PKG_PHASE=wrapper</strong></span> to the above
|
||
command.</p></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.master_sites"></a><a name="idm79993104"></a><p><b>22.6.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>What does
|
||
<code class="literal">${MASTER_SITE_SOURCEFORGE:=package/}</code> mean? I
|
||
don't understand the <code class="literal">:=</code> inside
|
||
it.</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><p>The <code class="literal">:=</code> is not really an
|
||
assignment operator, like you might expect at first sight.
|
||
Instead, it is a degenerate form of
|
||
<code class="literal">${LIST:<em class="replaceable"><code>old_string</code></em>=<em class="replaceable"><code>new_string</code></em>}</code>,
|
||
which is documented in the <a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?make+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">make</span>(1)</span></a> man page and which you
|
||
may have seen as in <code class="literal">${SRCS:.c=.o}</code>. In the
|
||
case of <code class="varname">MASTER_SITE_*</code>,
|
||
<em class="replaceable"><code>old_string</code></em> is the empty string and
|
||
<em class="replaceable"><code>new_string</code></em> is
|
||
<code class="literal">package/</code>. That's where the
|
||
<code class="literal">:</code> and the <code class="literal">=</code> fall
|
||
together.</p></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.mailinglists"></a><a name="idm79985040"></a><p><b>22.7.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>Which mailing lists are there for package
|
||
developers?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top"><div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><a class="ulink" href="http://www.NetBSD.org/mailinglists/index.html#tech-pkg" target="_top">tech-pkg</a></span></dt>
|
||
<dd><p>This is a list for technical discussions related
|
||
to pkgsrc development, e.g. soliciting feedback for changes to
|
||
pkgsrc infrastructure, proposed new features, questions related
|
||
to porting pkgsrc to a new platform, advice for maintaining a
|
||
package, patches that affect many packages, help requests moved
|
||
from pkgsrc-users when an infrastructure bug is found,
|
||
etc.</p></dd>
|
||
<dt><span class="term"><a class="ulink" href="http://www.NetBSD.org/mailinglists/index.html#pkgsrc-bugs" target="_top">pkgsrc-bugs</a></span></dt>
|
||
<dd><p>All bug reports in category "pkg" sent with
|
||
<a class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?send-pr+1+NetBSD-5.0.1+i386"><span class="citerefentry"><span class="refentrytitle">send-pr</span>(1)</span></a> appear here. Please do not report your bugs here
|
||
directly; use one of the other mailing
|
||
lists.</p></dd>
|
||
</dl></div></td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.documentation"></a><a name="idm79981328"></a><p><b>22.8.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>Where is the pkgsrc
|
||
documentation?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top">
|
||
<p>There are many places where you can find
|
||
documentation about pkgsrc:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>The pkgsrc guide (this document) is a collection
|
||
of chapters that explain large parts of pkgsrc, but some
|
||
chapters tend to be outdated. Which ones they are is hard to
|
||
say.</p></li>
|
||
<li class="listitem"><p>On the mailing list archives (see <a class="ulink" href="http://mail-index.NetBSD.org/" target="_top">http://mail-index.NetBSD.org/</a>), you can find discussions
|
||
about certain features, announcements of new parts of the pkgsrc
|
||
infrastructure and sometimes even announcements that a certain
|
||
feature has been marked as obsolete. The benefit here is that
|
||
each message has a date appended to it.</p></li>
|
||
<li class="listitem"><p>Many of the files in the
|
||
<code class="filename">mk/</code> directory start with a comment that
|
||
describes the purpose of the file and how it can be used by the
|
||
pkgsrc user and package authors. An easy way to find this
|
||
documentation is to run <span class="command"><strong>bmake
|
||
help</strong></span>.</p></li>
|
||
<li class="listitem"><p>The CVS log messages are a rich source of
|
||
information, but they tend to be highly abbreviated, especially
|
||
for actions that occur often. Some contain a detailed
|
||
description of what has changed, but they are geared towards the
|
||
other pkgsrc developers, not towards an average pkgsrc user.
|
||
They also only document <span class="emphasis"><em>changes</em></span>, so if you
|
||
don't know what has been before, these messages may not be worth
|
||
too much to you.</p></li>
|
||
<li class="listitem"><p>Some parts of pkgsrc are only <span class="quote">“<span class="quote">implicitly
|
||
documented</span>”</span>, that is the documentation exists only in the
|
||
mind of the developer who wrote the code. To get this
|
||
information, use the <span class="command"><strong>cvs annotate</strong></span> command
|
||
to see who has written it and ask on the
|
||
<code class="literal">tech-pkg</code> mailing list, so that others can
|
||
find your questions later (see above). To be sure that the
|
||
developer in charge reads the mail, you may CC him or
|
||
her.</p></li>
|
||
</ul></div>
|
||
</td>
|
||
</tr>
|
||
<tr class="question">
|
||
<td align="left" valign="top">
|
||
<a name="devfaq.too-much-time"></a><a name="idm79974800"></a><p><b>22.9.</b></p>
|
||
</td>
|
||
<td align="left" valign="top"><p>I have a little time to kill. What shall I
|
||
do?</p></td>
|
||
</tr>
|
||
<tr class="answer">
|
||
<td align="left" valign="top"></td>
|
||
<td align="left" valign="top">
|
||
<p>This is not really an FAQ yet, but here's the answer
|
||
anyway.</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>Run <span class="command"><strong>pkg_chk -N</strong></span> (from the
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_chk/README.html" target="_top"><code class="filename">pkgtools/pkg_chk</code></a> package). It
|
||
will tell you about newer versions of installed packages that are
|
||
available, but not yet updated in pkgsrc.</p></li>
|
||
<li class="listitem"><p>Browse <code class="filename">pkgsrc/doc/TODO</code>
|
||
— it contains a list of suggested new packages and a list of
|
||
cleanups and enhancements for pkgsrc that would be nice to
|
||
have.</p></li>
|
||
<li class="listitem"><p>Review packages for which review was requested on
|
||
the <a class="ulink" href="http://www.NetBSD.org/mailinglists/index.html#tech-pkg" target="_top">tech-pkg</a>
|
||
mailing list.</p></li>
|
||
</ul></div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="gnome"></a>Chapter 23. GNOME packaging and porting</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#meta-packages">23.1. Meta packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#new-package">23.2. Packaging a GNOME application</a></span></dt>
|
||
<dt><span class="sect1"><a href="#full-update">23.3. Updating GNOME to a newer version</a></span></dt>
|
||
<dt><span class="sect1"><a href="#patching">23.4. Patching guidelines</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<p>Quoting <a class="ulink" href="http://www.gnome.org/" target="_top">GNOME's web
|
||
site</a>:</p>
|
||
<div class="blockquote"><blockquote class="blockquote"><p>The GNOME project provides two things: The GNOME desktop
|
||
environment, an intuitive and attractive desktop for users, and the
|
||
GNOME development platform, an extensive framework for building
|
||
applications that integrate into the rest of the desktop.</p></blockquote></div>
|
||
<p>pkgsrc provides a seamless way to automatically build and install
|
||
a complete GNOME environment <span class="emphasis"><em>under many different
|
||
platforms</em></span>. We can say with confidence that pkgsrc is one of
|
||
the most advanced build and packaging systems for GNOME due to its
|
||
included technologies buildlink3, the wrappers and tools framework and
|
||
automatic configuration file management. Lots of efforts are put into
|
||
achieving a completely clean deinstallation of installed software
|
||
components.</p>
|
||
<p>Given that pkgsrc is <a class="ulink" href="http://www.NetBSD.org/" target="_top">NetBSD</a>'s official packaging system,
|
||
the above also means that great efforts are put into making GNOME work
|
||
under this operating system. Recently, <a class="ulink" href="http://www.dragonflybsd.org/" target="_top">DragonFly BSD</a> also adopted
|
||
pkgsrc as its preferred packaging system, contributing lots of
|
||
portability fixes to make GNOME build and install under it.</p>
|
||
<p>This chapter is aimed at pkgsrc developers and other people
|
||
interested in helping our GNOME porting and packaging efforts. It
|
||
provides instructions on how to manage the existing packages and some
|
||
important information regarding their internals.</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">We need your help!</h3>
|
||
<p>Should you have some spare cycles to devote to NetBSD, pkgsrc
|
||
and GNOME and are willing to learn new exciting stuff, please jump
|
||
straight to the <a class="ulink" href="http://www.NetBSD.org/contrib/projects.html#gnome" target="_top">pending
|
||
work</a> list! There is still a long way to go to get a
|
||
fully-functional GNOME desktop under NetBSD and we need your help to
|
||
achieve it!</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="meta-packages"></a>23.1. Meta packages</h2></div></div></div>
|
||
<p>pkgsrc includes three GNOME-related meta packages:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/gnome-base/README.html" target="_top"><code class="filename">meta-pkgs/gnome-base</code></a>: Provides
|
||
the core GNOME desktop environment. It only includes the necessary
|
||
bits to get it to boot correctly, although it may lack important
|
||
functionality for daily operation. The idea behind this package is
|
||
to let end users build their own configurations on top of this one,
|
||
first installing this meta package to achieve a functional setup and
|
||
then adding individual applications.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/gnome/README.html" target="_top"><code class="filename">meta-pkgs/gnome</code></a>: Provides a
|
||
complete installation of the GNOME platform and desktop as defined
|
||
by the GNOME project; this is based on the components distributed in
|
||
the <code class="filename">platform/x.y/x.y.z/sources</code> and
|
||
<code class="filename">desktop/x.y/x.y.z/sources</code> directories of the
|
||
official FTP server. Developer-only tools found in those
|
||
directories are not installed unless required by some other
|
||
component to work properly. Similarly, packages from the bindings
|
||
set (<code class="filename">bindings/x.y/x.y.z/sources</code>) are not pulled
|
||
in unless required as a dependency for an end-user component. This
|
||
package "extends" <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/gnome-base/README.html" target="_top"><code class="filename">meta-pkgs/gnome-base</code></a>.</p></li>
|
||
<li class="listitem"><p><a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/gnome-devel/README.html" target="_top"><code class="filename">meta-pkgs/gnome-devel</code></a>:
|
||
Installs all the tools required to build a GNOME component when
|
||
fetched from the CVS repository. These are required to let the
|
||
<span class="command"><strong>autogen.sh</strong></span> scripts work appropriately.</p></li>
|
||
</ul></div>
|
||
<p>In all these packages, the <code class="varname">DEPENDS</code> lines are
|
||
sorted in a way that eases updates: a package may depend on other
|
||
packages listed before it but not on any listed after it. It is very
|
||
important to keep this order to ease updates so... <span class="emphasis"><em>do not
|
||
change it to alphabetical sorting!</em></span></p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="new-package"></a>23.2. Packaging a GNOME application</h2></div></div></div>
|
||
<p>Almost all GNOME applications are written in C and use a common
|
||
set of tools as their build system. Things get different with the new
|
||
bindings to other languages (such as Python), but the following will
|
||
give you a general idea on the minimum required tools:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem">
|
||
<p>Almost all GNOME applications use the GNU Autotools as their
|
||
build system. As a general rule you will need to tell this to your
|
||
package:</p>
|
||
<pre class="programlisting">
|
||
GNU_CONFIGURE=yes
|
||
USE_LIBTOOL=yes
|
||
USE_TOOLS+=gmake
|
||
</pre>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>If the package uses pkg-config to detect dependencies, add this
|
||
tool to the list of required utilities:</p>
|
||
<pre class="programlisting">USE_TOOLS+=pkg-config</pre>
|
||
<p>Also use <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/verifypc/README.html" target="_top"><code class="filename">pkgtools/verifypc</code></a> at
|
||
the end of the build process to ensure that you did not miss to
|
||
specify any dependency in your package and that the version
|
||
requirements are all correct.</p>
|
||
</li>
|
||
<li class="listitem"><p>If the package uses intltool, be sure to add
|
||
<code class="literal">intltool</code> to the <code class="varname">USE_TOOLS</code>
|
||
to handle dependencies and to force the package to use the latest
|
||
available version.</p></li>
|
||
<li class="listitem">
|
||
<p>If the package uses gtk-doc (a documentation generation
|
||
utility), do <span class="emphasis"><em>not</em></span> add a dependency on it. The
|
||
tool is rather big and the distfile should come with pregenerated
|
||
documentation anyway; if it does not, it is a bug that you ought to
|
||
report. For such packages you should disable gtk-doc (unless it is
|
||
the default):</p>
|
||
<pre class="programlisting">CONFIGURE_ARGS+=--disable-gtk-doc</pre>
|
||
<p>The default location of installed HTML files
|
||
(<code class="filename">share/gtk-doc/<package-name></code>) is correct
|
||
and should not be changed unless the package insists on installing
|
||
them somewhere else. Otherwise programs as
|
||
<span class="command"><strong>devhelp</strong></span> will not be able to open them. You can
|
||
do that with an entry similar to:</p>
|
||
<pre class="programlisting">CONFIGURE_ARGS+=--with-html-dir=${PREFIX}/share/gtk-doc/...</pre>
|
||
</li>
|
||
</ul></div>
|
||
<p>GNOME uses multiple <span class="emphasis"><em>shared</em></span> directories and
|
||
files under the installation prefix to maintain databases. In this
|
||
context, shared means that those exact same directories and files are
|
||
used among several different packages, leading to conflicts in the
|
||
<code class="filename">PLIST</code>. pkgsrc currently includes functionality to
|
||
handle the most common cases, so you have to forget about using
|
||
<code class="literal">@unexec ${RMDIR}</code> lines in your file lists and
|
||
omitting shared files from them. If you find yourself doing those,
|
||
<span class="emphasis"><em>your package is most likely incorrect</em></span>.</p>
|
||
<p>The following table lists the common situations that result in
|
||
using shared directories or files. For each of them, the appropriate
|
||
solution is given. After applying the solution be sure to
|
||
<span class="emphasis"><em>regenerate the package's file list</em></span> with
|
||
<span class="command"><strong>make print-PLIST</strong></span> and ensure it is correct.</p>
|
||
<div class="table">
|
||
<a name="plist-handling"></a><p class="title"><b>Table 23.1. PLIST handling for GNOME packages</b></p>
|
||
<div class="table-contents"><table class="table" summary="PLIST handling for GNOME packages" border="1">
|
||
<colgroup>
|
||
<col>
|
||
<col>
|
||
</colgroup>
|
||
<thead><tr>
|
||
<th>If the package...</th>
|
||
<th>Then...</th>
|
||
</tr></thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>Installs OMF files under <code class="filename">share/omf</code>.</td>
|
||
<td>See <a class="xref" href="#scrollkeeper-data-files" title="19.6.10. Packages installing scrollkeeper/rarian data files">Section 19.6.10, “Packages installing scrollkeeper/rarian data files”</a>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Installs icons under the
|
||
<code class="filename">share/icons/hicolor</code> hierarchy or updates
|
||
<code class="filename">share/icons/hicolor/icon-theme.cache</code>.</td>
|
||
<td>See <a class="xref" href="#hicolor-theme" title="19.6.19. Packages installing hicolor theme icons">Section 19.6.19, “Packages installing hicolor theme icons”</a>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Installs files under
|
||
<code class="filename">share/mime/packages</code>.</td>
|
||
<td>See <a class="xref" href="#mime-database" title="19.6.14. Packages installing extensions to the MIME database">Section 19.6.14, “Packages installing extensions to the MIME database”</a>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Installs <code class="filename">.desktop</code> files under
|
||
<code class="filename">share/applications</code> and these include MIME
|
||
information.</td>
|
||
<td>See <a class="xref" href="#desktop-files" title="19.6.20. Packages installing desktop files">Section 19.6.20, “Packages installing desktop files”</a>.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table></div>
|
||
</div>
|
||
<br class="table-break">
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="full-update"></a>23.3. Updating GNOME to a newer version</h2></div></div></div>
|
||
<p>When seeing GNOME as a whole, there are two kinds of
|
||
updates:</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term">Major update</span></dt>
|
||
<dd>
|
||
<p>Given that there is still a very long way for GNOME 3 (if it
|
||
ever appears), we consider a major update one that goes from a
|
||
<code class="literal">2.X</code> version to a <code class="literal">2.Y</code> one,
|
||
where <code class="literal">Y</code> is even and greater than
|
||
<code class="literal">X</code>. These are hard to achieve because they
|
||
introduce lots of changes in the components' code and almost all
|
||
GNOME distfiles are updated to newer versions. Some of them can
|
||
even break API and ABI compatibility with the previous major
|
||
version series. As a result, the update needs to be done all at
|
||
once to minimize breakage.</p>
|
||
<p>A major update typically consists of around 80 package
|
||
updates and the addition of some new ones.</p>
|
||
</dd>
|
||
<dt><span class="term">Minor update</span></dt>
|
||
<dd>
|
||
<p>We consider a minor update one that goes from a
|
||
<code class="literal">2.A.X</code> version to a <code class="literal">2.A.Y</code>
|
||
one where <code class="literal">Y</code> is greater than
|
||
<code class="literal">X</code>. These are easy to achieve because they do
|
||
not update all GNOME components, can be done in an incremental way
|
||
and do not break API nor ABI compatibility.</p>
|
||
<p>A minor update typically consists of around 50 package
|
||
updates, although the numbers here may vary a lot.</p>
|
||
</dd>
|
||
</dl></div>
|
||
<p>In order to update the GNOME components in pkgsrc to a new stable
|
||
release (either major or minor), the following steps should be
|
||
followed:</p>
|
||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||
<li class="listitem">
|
||
<p>Get a list of all the tarballs that form the new release by
|
||
using the following commands. These will leave the full list of the
|
||
components' distfiles into the <code class="filename">list.txt</code>
|
||
file:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>echo ls "*.tar.bz2" | \
|
||
ftp -V ftp://ftp.gnome.org/pub/gnome/platform/x.y/x.y.z/sources/ | \
|
||
awk '{ print $9 }' >list.txt</code></strong>
|
||
<code class="prompt">%</code> <strong class="userinput"><code>echo ls "*.tar.bz2" | \
|
||
ftp -V ftp://ftp.gnome.org/pub/gnome/desktop/x.y/x.y.z/sources/ | \
|
||
awk '{ print $9 }' >>list.txt</code></strong></pre>
|
||
</li>
|
||
<li class="listitem"><p>Open each meta package's <code class="filename">Makefile</code> and
|
||
bump their version to the release you are updating them to. The
|
||
three meta packages should be always consistent with versioning.
|
||
Obviously remove any <code class="varname">PKGREVISION</code>s that might be
|
||
in them.</p></li>
|
||
<li class="listitem">
|
||
<p>For each meta package, update all its
|
||
<code class="varname">DEPENDS</code> lines to match the latest versions as
|
||
shown by the above commands. Do <span class="emphasis"><em>not</em></span> list any
|
||
newer version (even if found in the FTP) because the meta packages
|
||
are supposed to list the exact versions that form a specific GNOME
|
||
release. Exceptions are permitted here if a newer version solves a
|
||
serious issue in the overall desktop experience; these typically
|
||
come in the form of a revision bump in pkgsrc, not in newer versions
|
||
from the developers.</p>
|
||
<p>Packages not listed in the <code class="filename">list.txt</code> file
|
||
should be updated to the latest version available (if found in
|
||
pkgsrc). This is the case, for example, of the dependencies on the
|
||
GNU Autotools in the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/gnome-devel/README.html" target="_top"><code class="filename">meta-pkgs/gnome-devel</code></a> meta package.</p>
|
||
</li>
|
||
<li class="listitem">
|
||
<p>Generate a patch from the modified meta packages and extract the
|
||
list of "new" lines. This will provide you an outline on what
|
||
packages need to be updated in pkgsrc and in what order:</p>
|
||
<pre class="screen"><code class="prompt">%</code> <strong class="userinput"><code>cvs diff -u gnome-devel gnome-base gnome | grep '^+D' >todo.txt</code></strong></pre>
|
||
</li>
|
||
<li class="listitem"><p>For major desktop updates it is recommended to zap all your
|
||
installed packages and start over from scratch at this point.</p></li>
|
||
<li class="listitem"><p>Now comes the longest step by far: iterate over the contents
|
||
of <code class="filename">todo.txt</code> and update the packages listed in
|
||
it in order. For major desktop updates none of these should be
|
||
committed until the entire set is completed because there are chances
|
||
of breaking not-yet-updated packages.</p></li>
|
||
<li class="listitem"><p>Once the packages are up to date and working, commit them to
|
||
the tree one by one with appropriate log messages. At the end,
|
||
commit the three meta package updates and all the corresponding
|
||
changes to the <code class="filename">doc/CHANGES-<YEAR></code> and
|
||
<a href="http://cvsweb.NetBSD.org/bsdweb.cgi/pkgsrc/doc/TODO?rev=HEAD&content-type=text/x-cvsweb-markup" target="_top"><code class="filename">pkgsrc/doc/TODO</code></a> files.</p></li>
|
||
</ol></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="patching"></a>23.4. Patching guidelines</h2></div></div></div>
|
||
<p>GNOME is a very big component in pkgsrc which approaches 100
|
||
packages. Please, it is very important that you always, always,
|
||
<span class="strong"><strong>always</strong></span> feed back any portability
|
||
fixes you do to a GNOME package to the mainstream developers (see <a class="xref" href="#components.patches.feedback" title="11.3.5. Feedback to the author">Section 11.3.5, “Feedback to the author”</a>). This is the only way to get
|
||
their attention on portability issues and to ensure that future versions
|
||
can be built out-of-the box on NetBSD. The less custom patches in
|
||
pkgsrc, the easier further updates are. Those developers in charge of
|
||
issuing major GNOME updates will be grateful if you do that.</p>
|
||
<p>The most common places to report bugs are the <a class="ulink" href="http://bugzilla.gnome.org/" target="_top">GNOME's Bugzilla</a> and the <a class="ulink" href="http://bugzilla.freedesktop.org/" target="_top">freedesktop.org's
|
||
Bugzilla</a>. Not all components use these to track bugs, but most
|
||
of them do. Do not be short on your reports: always provide detailed
|
||
explanations of the current failure, how it can be improved to achieve
|
||
maximum portability and, if at all possible, provide a patch against CVS
|
||
head. The more verbose you are, the higher chances of your patch being
|
||
accepted.</p>
|
||
<p>Also, please avoid using preprocessor magic to fix portability
|
||
issues. While the FreeBSD GNOME people are doing a great job in porting
|
||
GNOME to their operating system, the official GNOME sources are now
|
||
plagued by conditionals that check for <code class="varname">__FreeBSD__</code>
|
||
and similar macros. This hurts portability. Please see our patching
|
||
guidelines (<a class="xref" href="#components.patches.guidelines" title="11.3.4. Patching guidelines">Section 11.3.4, “Patching guidelines”</a>) for more
|
||
details.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="part">
|
||
<div class="titlepage"><div><div><h1 class="title">
|
||
<a name="infrastructure"></a>Part III. The pkgsrc infrastructure internals</h1></div></div></div>
|
||
<div class="partintro">
|
||
<div></div>
|
||
<p>This part of the guide deals with everything
|
||
from the infrastructure that is behind the interfaces described
|
||
in the developer's guide. A casual package maintainer should not
|
||
need anything from this part.</p>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="chapter"><a href="#infr.design">24. Design of the pkgsrc infrastructure</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#infr.vardef">24.1. The meaning of variable definitions</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.vardef.problems">24.2. Avoiding problems before they arise</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.var">24.3. Variable evaluation</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.var.load">24.3.1. At load time</a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.var.run">24.3.2. At runtime</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#infr.varspec">24.4. How can variables be specified?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.design.intf">24.5. Designing interfaces for Makefile fragments</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.design.intf.proc">24.5.1. Procedures with parameters</a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.design.intf.action">24.5.2. Actions taken on behalf of parameters</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#infr.order">24.6. The order in which files are loaded</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.order.prefs">24.6.1. The order in <code class="filename">bsd.prefs.mk</code></a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.order.pkg">24.6.2. The order in <code class="filename">bsd.pkg.mk</code></a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#regression">25. Regression tests</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#regression.descr">25.1. The regression tests framework</a></span></dt>
|
||
<dt><span class="sect1"><a href="#regression.run">25.2. Running the regression tests</a></span></dt>
|
||
<dt><span class="sect1"><a href="#regression.new">25.3. Adding a new regression test</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#regression.fun.override">25.3.1. Overridable functions</a></span></dt>
|
||
<dt><span class="sect2"><a href="#regression.fun.helper">25.3.2. Helper functions</a></span></dt>
|
||
</dl></dd>
|
||
</dl></dd>
|
||
<dt><span class="chapter"><a href="#porting">26. Porting pkgsrc</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect1"><a href="#porting.opsys">26.1. Porting pkgsrc to a new operating system</a></span></dt>
|
||
<dt><span class="sect1"><a href="#porting.compiler">26.2. Adding support for a new compiler</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="infr.design"></a>Chapter 24. Design of the pkgsrc infrastructure</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#infr.vardef">24.1. The meaning of variable definitions</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.vardef.problems">24.2. Avoiding problems before they arise</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.var">24.3. Variable evaluation</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.var.load">24.3.1. At load time</a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.var.run">24.3.2. At runtime</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#infr.varspec">24.4. How can variables be specified?</a></span></dt>
|
||
<dt><span class="sect1"><a href="#infr.design.intf">24.5. Designing interfaces for Makefile fragments</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.design.intf.proc">24.5.1. Procedures with parameters</a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.design.intf.action">24.5.2. Actions taken on behalf of parameters</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#infr.order">24.6. The order in which files are loaded</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#infr.order.prefs">24.6.1. The order in <code class="filename">bsd.prefs.mk</code></a></span></dt>
|
||
<dt><span class="sect2"><a href="#infr.order.pkg">24.6.2. The order in <code class="filename">bsd.pkg.mk</code></a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
<p>The pkgsrc infrastructure consists of many small Makefile
|
||
fragments. Each such fragment needs a properly specified
|
||
interface. This chapter explains how such an interface looks
|
||
like.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="infr.vardef"></a>24.1. The meaning of variable definitions</h2></div></div></div>
|
||
<p>Whenever a variable is defined in the pkgsrc
|
||
infrastructure, the location and the way of definition provide
|
||
much information about the intended use of that variable.
|
||
Additionally, more documentation may be found in a header
|
||
comment or in this pkgsrc guide.</p>
|
||
<p>A special file is
|
||
<code class="filename">mk/defaults/mk.conf</code>, which lists all
|
||
variables that are intended to be user-defined. They are either
|
||
defined using the <code class="literal">?=</code> operator or they are
|
||
left undefined because defining them to anything would
|
||
effectively mean <span class="quote">“<span class="quote">yes</span>”</span>. All these variables may be
|
||
overridden by the pkgsrc user in the <code class="varname">MAKECONF</code>
|
||
file.</p>
|
||
<p>Outside this file, the following conventions apply:
|
||
Variables that are defined using the <code class="literal">?=</code>
|
||
operator may be overridden by a package.</p>
|
||
<p>Variables that are defined using the <code class="literal">=</code>
|
||
operator may be used read-only at run-time.</p>
|
||
<p>Variables whose name starts with an underscore must not be
|
||
accessed outside the pkgsrc infrastructure at all. They may
|
||
change without further notice.</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>These conventions are currently not applied
|
||
consistently to the complete pkgsrc
|
||
infrastructure.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="infr.vardef.problems"></a>24.2. Avoiding problems before they arise</h2></div></div></div>
|
||
<p>All variables that contain lists of things should default
|
||
to being empty. Two examples that do not follow this rule are
|
||
<code class="varname">USE_LANGUAGES</code> and
|
||
<code class="varname">DISTFILES</code>. These variables cannot simply be
|
||
modified using the <code class="literal">+=</code> operator in package
|
||
<code class="filename">Makefile</code>s (or other files included by
|
||
them), since there is no guarantee whether the variable is
|
||
already set or not, and what its value is. In the case of
|
||
<code class="varname">DISTFILES</code>, the packages <span class="quote">“<span class="quote">know</span>”</span>
|
||
the default value and just define it as in the following
|
||
example.</p>
|
||
<pre class="programlisting">
|
||
DISTFILES= ${DISTNAME}${EXTRACT_SUFX} additional-files.tar.gz
|
||
</pre>
|
||
<p>Because of the selection of this default value, the same
|
||
value appears in many package Makefiles. Similarly for
|
||
<code class="varname">USE_LANGUAGES</code>, but in this case the default
|
||
value (<span class="quote">“<span class="quote"><code class="literal">c</code></span>”</span>) is so short that it
|
||
doesn't stand out. Nevertheless it is mentioned in many
|
||
files.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="infr.var"></a>24.3. Variable evaluation</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="infr.var.load"></a>24.3.1. At load time</h3></div></div></div>
|
||
<p>Variable evaluation takes place either at load time or at
|
||
runtime, depending on the context in which they occur. The
|
||
contexts where variables are evaluated at load time are:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p>The right hand side of the <code class="literal">:=</code>
|
||
and <code class="literal">!=</code> operators,</p></li>
|
||
<li class="listitem"><p>Make directives like <code class="literal">.if</code> or
|
||
<code class="literal">.for</code>,</p></li>
|
||
<li class="listitem"><p>Dependency lines.</p></li>
|
||
</ul></div>
|
||
<p>A special exception are references to the iteration
|
||
variables of <code class="literal">.for</code> loops, which are expanded
|
||
inline, no matter in which context they appear.</p>
|
||
<p>As the values of variables may change during load time,
|
||
care must be taken not to evaluate them by accident. Typical
|
||
examples for variables that should not be evaluated at load time
|
||
are <code class="varname">DEPENDS</code> and
|
||
<code class="varname">CONFIGURE_ARGS</code>. To make the effect more
|
||
clear, here is an example:</p>
|
||
<pre class="programlisting">
|
||
CONFIGURE_ARGS= # none
|
||
CFLAGS= -O
|
||
CONFIGURE_ARGS+= CFLAGS=${CFLAGS:Q}
|
||
|
||
CONFIGURE_ARGS:= ${CONFIGURE_ARGS}
|
||
|
||
CFLAGS+= -Wall
|
||
</pre>
|
||
<p>This code shows how the use of the <code class="literal">:=</code>
|
||
operator can quickly lead to unexpected results. The first
|
||
paragraph is fairly common code. The second paragraph evaluates
|
||
the <code class="varname">CONFIGURE_ARGS</code> variable, which results in
|
||
<code class="literal">CFLAGS=-O</code>. In the third paragraph, the
|
||
<code class="literal">-Wall</code> is appended to the
|
||
<code class="varname">CFLAGS</code>, but this addition will not appear in
|
||
<code class="varname">CONFIGURE_ARGS</code>. In actual code, the three
|
||
paragraphs from above typically occur in completely unrelated
|
||
files.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="infr.var.run"></a>24.3.2. At runtime</h3></div></div></div>
|
||
<p>After all the files have been loaded, the values of the
|
||
variables cannot be changed anymore. Variables that are used in
|
||
the shell commands are expanded at this point.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="infr.varspec"></a>24.4. How can variables be specified?</h2></div></div></div>
|
||
<p>There are many ways in which the definition and use of a
|
||
variable can be restricted in order to detect bugs and
|
||
violations of the (mostly unwritten) policies. See the
|
||
<code class="literal">pkglint</code> developer's documentation for further
|
||
details.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="infr.design.intf"></a>24.5. Designing interfaces for Makefile fragments</h2></div></div></div>
|
||
<p>Most of the <code class="filename">.mk</code> files fall into one
|
||
of the following classes. Cases where a file falls into more
|
||
than one class should be avoided as it often leads to subtle
|
||
bugs.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="infr.design.intf.proc"></a>24.5.1. Procedures with parameters</h3></div></div></div>
|
||
<p>In a traditional imperative programming language some of
|
||
the <code class="filename">.mk</code> files could be described as
|
||
procedures. They take some input parameters and—after
|
||
inclusion—provide a result in output parameters. Since all
|
||
variables in <code class="filename">Makefile</code>s have global scope
|
||
care must be taken not to use parameter names that have already
|
||
another meaning. For example, <code class="varname">PKGNAME</code> is a
|
||
bad choice for a parameter name.</p>
|
||
<p>Procedures are completely evaluated at preprocessing time.
|
||
That is, when calling a procedure all input parameters must be
|
||
completely resolvable. For example,
|
||
<code class="varname">CONFIGURE_ARGS</code> should never be an input
|
||
parameter since it is very likely that further text will be
|
||
added after calling the procedure, which would effectively apply
|
||
the procedure to only a part of the variable. Also, references
|
||
to other variables wit will be modified after calling the
|
||
procedure.</p>
|
||
<p>A procedure can declare its output parameters either as
|
||
suitable for use in preprocessing directives or as only
|
||
available at runtime. The latter alternative is for variables
|
||
that contain references to other runtime variables.</p>
|
||
<p>Procedures shall be written such that it is possible to
|
||
call the procedure more than once. That is, the file must not
|
||
contain multiple-inclusion guards.</p>
|
||
<p>Examples for procedures are
|
||
<code class="filename">mk/bsd.options.mk</code> and
|
||
<code class="filename">mk/buildlink3/bsd.builtin.mk</code>. To express
|
||
that the parameters are evaluated at load time, they should be
|
||
assigned using the <code class="literal">:=</code> operator, which should
|
||
be used only for this purpose.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="infr.design.intf.action"></a>24.5.2. Actions taken on behalf of parameters</h3></div></div></div>
|
||
<p>Action files take some input parameters and may define
|
||
runtime variables. They shall not define loadtime variables.
|
||
There are action files that are included implicitly by the
|
||
pkgsrc infrastructure, while other must be included
|
||
explicitly.</p>
|
||
<p>An example for action files is
|
||
<code class="filename">mk/subst.mk</code>.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="infr.order"></a>24.6. The order in which files are loaded</h2></div></div></div>
|
||
<p>Package <code class="filename">Makefile</code>s usually consist of
|
||
a set of variable definitions, and include the file
|
||
<code class="filename">../../mk/bsd.pkg.mk</code> in the very last line.
|
||
Before that, they may also include various other
|
||
<code class="filename">*.mk</code> files if they need to query the
|
||
availability of certain features like the type of compiler or
|
||
the X11 implementation. Due to the heavy use of preprocessor
|
||
directives like <code class="literal">.if</code> and
|
||
<code class="literal">.for</code>, the order in which the files are loaded
|
||
matters.</p>
|
||
<p>This section describes at which point the various files
|
||
are loaded and gives reasons for that order.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="infr.order.prefs"></a>24.6.1. The order in <code class="filename">bsd.prefs.mk</code>
|
||
</h3></div></div></div>
|
||
<p>The very first action in <code class="filename">bsd.prefs.mk</code>
|
||
is to define some essential variables like
|
||
<code class="varname">OPSYS</code>, <code class="varname">OS_VERSION</code> and
|
||
<code class="varname">MACHINE_ARCH</code>.</p>
|
||
<p>Then, the user settings are loaded from the file specified
|
||
in <code class="varname">MAKECONF</code>, which is usually <a class="link" href="#mk.conf"><code class="filename">mk.conf</code></a>.
|
||
After that, those variables
|
||
that have not been overridden by the user are loaded from
|
||
<code class="filename">mk/defaults/mk.conf</code>.</p>
|
||
<p>After the user settings, the system settings and platform
|
||
settings are loaded, which may override the user
|
||
settings.</p>
|
||
<p>Then, the tool definitions are loaded. The tool wrappers
|
||
are not yet in effect. This only happens when building a
|
||
package, so the proper variables must be used instead of the
|
||
direct tool names.</p>
|
||
<p>As the last steps, some essential variables from the
|
||
wrapper and the package system flavor are loaded, as well as the
|
||
variables that have been cached in earlier phases of a package
|
||
build.</p>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="infr.order.pkg"></a>24.6.2. The order in <code class="filename">bsd.pkg.mk</code>
|
||
</h3></div></div></div>
|
||
<p>First, <code class="filename">bsd.prefs.mk</code> is loaded.</p>
|
||
<p>Then, the various <code class="filename">*-vars.mk</code> files are
|
||
loaded, which fill default values for those variables that have
|
||
not been defined by the package. These variables may later
|
||
be used even in unrelated files.</p>
|
||
<p>Then, the file <code class="filename">bsd.pkg.error.mk</code>
|
||
provides the target <code class="literal">error-check</code> that is added
|
||
as a special dependency to all other targets that use
|
||
<code class="varname">DELAYED_ERROR_MSG</code> or
|
||
<code class="varname">DELAYED_WARNING_MSG</code>.</p>
|
||
<p>Then, the package-specific hacks from
|
||
<code class="filename">hacks.mk</code> are included.</p>
|
||
<p>Then, various other files follow. Most of them don't have
|
||
any dependencies on what they need to have included before or
|
||
after them, though some do.</p>
|
||
<p>The code to check <code class="varname">PKG_FAIL_REASON</code> and
|
||
<code class="varname">PKG_SKIP_REASON</code> is then executed, which
|
||
restricts the use of these variables to all the files that have
|
||
been included before. Appearances in later files will be
|
||
silently ignored.</p>
|
||
<p>Then, the files for the main targets are included, in the
|
||
order of later execution, though the actual order should not
|
||
matter.</p>
|
||
<p>At last, some more files are included that don't set any
|
||
interesting variables but rather just define make targets to be
|
||
executed.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="regression"></a>Chapter 25. Regression tests</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#regression.descr">25.1. The regression tests framework</a></span></dt>
|
||
<dt><span class="sect1"><a href="#regression.run">25.2. Running the regression tests</a></span></dt>
|
||
<dt><span class="sect1"><a href="#regression.new">25.3. Adding a new regression test</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#regression.fun.override">25.3.1. Overridable functions</a></span></dt>
|
||
<dt><span class="sect2"><a href="#regression.fun.helper">25.3.2. Helper functions</a></span></dt>
|
||
</dl></dd>
|
||
</dl>
|
||
</div>
|
||
<p>The pkgsrc infrastructure consists of a large codebase,
|
||
and there are many corners where every little bit of a file is
|
||
well thought out, making pkgsrc likely to fail as soon as
|
||
anything is changed near those parts. To prevent most changes
|
||
from breaking anything, a suite of regression tests should go
|
||
along with every important part of the pkgsrc infrastructure.
|
||
This chapter describes how regression tests work in pkgsrc and
|
||
how you can add new tests.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="regression.descr"></a>25.1. The regression tests framework</h2></div></div></div>
|
||
<p></p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="regression.run"></a>25.2. Running the regression tests</h2></div></div></div>
|
||
<p>You first need to install the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkg_regress/README.html" target="_top"><code class="filename">pkgtools/pkg_regress</code></a> package, which
|
||
provides the <span class="command"><strong>pkg_regress</strong></span> command. Then you
|
||
can simply run that command, which will run all tests in the
|
||
<code class="filename">regress</code> category.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="regression.new"></a>25.3. Adding a new regression test</h2></div></div></div>
|
||
<p>Every directory in the <code class="filename">regress</code>
|
||
category that contains a file called <code class="filename">spec</code>
|
||
is considered a regression test. This file is a shell program
|
||
that is included by the <span class="command"><strong>pkg_regress</strong></span> command.
|
||
The following functions can be overridden to suit your
|
||
needs.</p>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="regression.fun.override"></a>25.3.1. Overridable functions</h3></div></div></div>
|
||
<p>These functions do not take any parameters. They are all
|
||
called in <span class="quote">“<span class="quote">set -e</span>”</span> mode, so you should be careful
|
||
to check the exitcodes of any commands you run in the
|
||
test.</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">do_setup()</code></span></dt>
|
||
<dd><p>This function prepares the environment for the
|
||
test. By default it does nothing.</p></dd>
|
||
<dt><span class="term"><code class="varname">do_test()</code></span></dt>
|
||
<dd><p>This function runs the actual test. By default,
|
||
it calls <code class="varname">TEST_MAKE</code> with the arguments
|
||
<code class="varname">MAKEARGS_TEST</code> and writes its output including
|
||
error messages into the file
|
||
<code class="varname">TEST_OUTFILE</code>.</p></dd>
|
||
<dt><span class="term"><code class="varname">check_result()</code></span></dt>
|
||
<dd><p>This function is run after the test and is
|
||
typically used to compare the actual output from the one that is
|
||
expected. It can make use of the various helper functions from
|
||
the next section.</p></dd>
|
||
<dt><span class="term"><code class="varname">do_cleanup()</code></span></dt>
|
||
<dd><p>This function cleans everything up after the
|
||
test has been run. By default it does nothing.</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="regression.fun.helper"></a>25.3.2. Helper functions</h3></div></div></div>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="varname">exit_status(expected)</code></span></dt>
|
||
<dd><p>This function compares the exitcode of the
|
||
<span class="command"><strong>do_test()</strong></span> function with its first parameter.
|
||
If they differ, the test will fail.</p></dd>
|
||
<dt><span class="term"><code class="varname">output_require(regex...)</code></span></dt>
|
||
<dd><p>This function checks for each of its parameters
|
||
if the output from <span class="command"><strong>do_test()</strong></span> matches the
|
||
extended regular expression. If it does not, the test will
|
||
fail.</p></dd>
|
||
<dt><span class="term"><code class="varname">output_prohibit(regex...)</code></span></dt>
|
||
<dd><p>This function checks for each of its parameters
|
||
if the output from <span class="command"><strong>do_test()</strong></span> does
|
||
<span class="emphasis"><em>not</em></span> match the extended regular expression.
|
||
If any of the regular expressions matches, the test will
|
||
fail.</p></dd>
|
||
</dl></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chapter">
|
||
<div class="titlepage"><div><div><h2 class="title">
|
||
<a name="porting"></a>Chapter 26. Porting pkgsrc</h2></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#porting.opsys">26.1. Porting pkgsrc to a new operating system</a></span></dt>
|
||
<dt><span class="sect1"><a href="#porting.compiler">26.2. Adding support for a new compiler</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<p>The pkgsrc system has already been ported to many
|
||
operating systems, hardware architectures and compilers. This
|
||
chapter explains the necessary steps to make pkgsrc even more
|
||
portable.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="porting.opsys"></a>26.1. Porting pkgsrc to a new operating system</h2></div></div></div>
|
||
<p>To port pkgsrc to a new operating system (called
|
||
<code class="literal">MyOS</code> in this example), you need to touch the
|
||
following files:</p>
|
||
<div class="variablelist"><dl class="variablelist">
|
||
<dt><span class="term"><code class="filename">pkgtools/bootstrap-mk-files/files/mods/<em class="replaceable"><code>MyOS</code></em>.sys.mk</code></span></dt>
|
||
<dd><p>This file contains some basic definitions, for
|
||
example the name of the C
|
||
compiler.</p></dd>
|
||
<dt><span class="term"><code class="filename">mk/bsd.prefs.mk</code></span></dt>
|
||
<dd><p>Insert code that defines the variables
|
||
<code class="varname">OPSYS</code>, <code class="varname">OS_VERSION</code>,
|
||
<code class="varname">LOWER_OS_VERSION</code>,
|
||
<code class="varname">LOWER_VENDOR</code>,
|
||
<code class="varname">MACHINE_ARCH</code>, <code class="varname">OBJECT_FMT</code>,
|
||
<code class="varname">APPEND_ELF</code>, and the other variables that
|
||
appear in this file.</p></dd>
|
||
<dt><span class="term"><code class="filename">mk/platform/<em class="replaceable"><code>MyOS</code></em>.mk</code></span></dt>
|
||
<dd><p>This file contains the platform-specific
|
||
definitions that are used by pkgsrc. Start by copying one of the
|
||
other files and edit it to your
|
||
needs.</p></dd>
|
||
<dt><span class="term"><code class="filename">mk/tools/tools.<em class="replaceable"><code>MyOS</code></em>.mk</code></span></dt>
|
||
<dd><p>This file defines the paths to all the tools
|
||
that are needed by one or the other package in pkgsrc, as well
|
||
as by pkgsrc itself. Find out where these tools are on your
|
||
platform and add them.</p></dd>
|
||
</dl></div>
|
||
<p>Now, you should be able to build some basic packages, like
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/lang/perl5/README.html" target="_top"><code class="filename">lang/perl5</code></a>, <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/shells/bash/README.html" target="_top"><code class="filename">shells/bash</code></a>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="porting.compiler"></a>26.2. Adding support for a new compiler</h2></div></div></div>
|
||
<p>TODO</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="appendix">
|
||
<div class="titlepage"><div><div><h1 class="title">
|
||
<a name="examples"></a>Appendix A. A simple example package: bison</h1></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#example-files">A.1. files</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="sect2"><a href="#example-Makefile">A.1.1. Makefile</a></span></dt>
|
||
<dt><span class="sect2"><a href="#example-descr">A.1.2. DESCR</a></span></dt>
|
||
<dt><span class="sect2"><a href="#example-plist">A.1.3. PLIST</a></span></dt>
|
||
<dt><span class="sect2"><a href="#checking-package-with-pkglint">A.1.4. Checking a package with <span class="command"><strong>pkglint</strong></span></a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="sect1"><a href="#steps-for-b-i-p">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 class="command"><strong>bison</strong></span> when Berkeley <span class="command"><strong>yacc</strong></span> is already
|
||
present in the tree is beyond us, but it's useful for the purposes of
|
||
this exercise.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="example-files"></a>A.1. files</h2></div></div></div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="example-Makefile"></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= pkgsrc-users@NetBSD.org
|
||
HOMEPAGE= http://www.gnu.org/software/bison/bison.html
|
||
COMMENT= GNU yacc clone
|
||
|
||
GNU_CONFIGURE= yes
|
||
INFO_FILES= yes
|
||
|
||
.include "../../mk/bsd.pkg.mk"
|
||
</pre>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="example-descr"></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 class="citerefentry" href="http://netbsd.gw.com/cgi-bin/man-cgi?yacc+1+NetBSD-5.0.1+i386"><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">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="example-plist"></a>A.1.3. PLIST</h3></div></div></div>
|
||
<pre class="programlisting">
|
||
@comment $NetBSD$
|
||
bin/bison
|
||
man/man1/bison.1.gz
|
||
share/bison.simple
|
||
share/bison.hairy
|
||
</pre>
|
||
</div>
|
||
<div class="sect2">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="checking-package-with-pkglint"></a>A.1.4. Checking a package with <span class="command"><strong>pkglint</strong></span>
|
||
</h3></div></div></div>
|
||
<p>The NetBSD package system comes with
|
||
<a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/pkgtools/pkglint/README.html" target="_top"><code class="filename">pkgtools/pkglint</code></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 class="command"><strong>pkglint</strong></span>:</p>
|
||
<pre class="screen"><code class="prompt">$</code> <strong class="userinput"><code>pkglint</code></strong>
|
||
looks fine.</pre>
|
||
<p>Depending on the supplied command line arguments (see pkglint(1)),
|
||
more checks will be performed. Use e.g. <span class="command"><strong>pkglint -Call
|
||
-Wall</strong></span> for a very thorough check.</p>
|
||
</div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="steps-for-b-i-p"></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"><code class="prompt">#</code> <strong class="userinput"><code>cd /usr/pkgsrc/lang</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mkdir bison</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>cd bison</code></strong>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>mkdir patches</code></strong></pre>
|
||
<p>Create <code class="filename">Makefile</code>, <code class="filename">DESCR</code> and
|
||
<code class="filename">PLIST</code> (see <a class="xref" href="#components" title="Chapter 11. Package components - files, directories and contents">Chapter 11, <i>Package components - files, directories and contents</i></a>)
|
||
then continue with fetching the distfile:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make fetch</code></strong>
|
||
>> 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
|
||
<code class="filename">distinfo</code>:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make makedistinfo</code></strong></pre>
|
||
<p>Now compile:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make</code></strong>
|
||
>> 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"><code class="prompt">#</code> <strong class="userinput"><code>make install</code></strong>
|
||
>> 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 class="command"><strong>pkg_delete bison</strong></span>. Should you decide that you want a
|
||
binary package, do this now:</p>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make package</code></strong>
|
||
>> 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"><code class="prompt">#</code> <strong class="userinput"><code>make clean</code></strong>
|
||
===> Cleaning for bison-1.25</pre>
|
||
</div>
|
||
</div>
|
||
<div class="appendix">
|
||
<div class="titlepage"><div><div><h1 class="title">
|
||
<a name="logs"></a>Appendix B. Build logs</h1></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<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">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="logs.building"></a>B.1. Building figlet</h2></div></div></div>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make</code></strong>
|
||
===> 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 archive 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.
|
||
<code class="prompt">#</code>
|
||
<code class="prompt">#</code> <strong class="userinput"><code>make install</code></strong>
|
||
===> 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
|
||
<code class="prompt">#</code></pre>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="logs.package"></a>B.2. Packaging figlet</h2></div></div></div>
|
||
<pre class="screen"><code class="prompt">#</code> <strong class="userinput"><code>make package</code></strong>
|
||
===> 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:.
|
||
<code class="prompt">#</code></pre>
|
||
</div>
|
||
</div>
|
||
<div class="appendix">
|
||
<div class="titlepage"><div><div><h1 class="title">
|
||
<a name="ftp-layout"></a>Appendix C. Directory layout of the pkgsrc FTP server</h1></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#ftp-distfiles">C.1. <code class="filename">distfiles</code>: The distributed source files</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ftp-misc">C.2. <code class="filename">misc</code>: Miscellaneous things</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ftp-packages">C.3. <code class="filename">packages</code>: Binary packages</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ftp-reports">C.4. <code class="filename">reports</code>: Bulk build reports</a></span></dt>
|
||
<dt><span class="sect1"><a href="#ftp-source">C.5. <code class="filename">current</code>,
|
||
<code class="filename">pkgsrc-20<em class="replaceable"><code>xx</code></em>Q<em class="replaceable"><code>y</code></em></code>:
|
||
source packages</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<p>As in other big projects, the directory layout of pkgsrc
|
||
is quite complex for newbies. This chapter explains where you
|
||
find things on the FTP server. The base directory on
|
||
<code class="filename">ftp.NetBSD.org</code> is <a class="ulink" href="ftp://ftp.NetBSD.org/pub/pkgsrc/" target="_top"><code class="filename">/pub/pkgsrc/</code></a>.
|
||
On other servers it may be different, but inside this directory,
|
||
everything should look the same, no matter on which server you
|
||
are. This directory contains some subdirectories, which are
|
||
explained below.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="ftp-distfiles"></a>C.1. <code class="filename">distfiles</code>: The distributed source files</h2></div></div></div>
|
||
<p>The directory <code class="filename">distfiles</code> contains lots
|
||
of archive files from all pkgsrc packages, which are mirrored
|
||
here. The subdirectories are called after their package names
|
||
and are used when the distributed files have names that don't
|
||
explicitly contain a version number or are otherwise too generic
|
||
(for example <code class="filename">release.tar.gz</code>).</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="ftp-misc"></a>C.2. <code class="filename">misc</code>: Miscellaneous things</h2></div></div></div>
|
||
<p>This directory contains things that individual pkgsrc
|
||
developers find worth publishing.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="ftp-packages"></a>C.3. <code class="filename">packages</code>: Binary packages</h2></div></div></div>
|
||
<p>This directory contains binary packages for the various
|
||
platforms that are supported by pkgsrc.
|
||
Each subdirectory is of the form <em class="replaceable"><code>OPSYS</code></em>/<em class="replaceable"><code>ARCH</code></em>/<em class="replaceable"><code>OSVERSION_TAG</code></em>. The meaning of these variables is:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="varname">OPSYS</code> is the name of the
|
||
operating system for which the packages have been built. The
|
||
name is taken from the output of the <span class="command"><strong>uname</strong></span>
|
||
command, so it may differ from the one you are used to
|
||
hear.</p></li>
|
||
<li class="listitem"><p><code class="varname">ARCH</code> is the hardware
|
||
architecture of the platform for which the packages have been
|
||
built. It also includes the <code class="varname">ABI</code> (Application
|
||
Binary Interface) for platforms that have several of
|
||
them.</p></li>
|
||
<li class="listitem"><p><code class="varname">OSVERSION</code> is the version of
|
||
the operating system. For version numbers that change often (for
|
||
example NetBSD-current), the often-changing part should be
|
||
replaced with an <code class="literal">x</code>, for example
|
||
<code class="literal">4.99.x</code>.</p></li>
|
||
<li class="listitem"><p><code class="varname">TAG</code> is either
|
||
<code class="literal">20<em class="replaceable"><code>xx</code></em>Q<em class="replaceable"><code>y</code></em></code>
|
||
for a stable branch, or <code class="literal">head</code> for packages
|
||
built from the HEAD branch. The latter should only be used when
|
||
the packages are updated on a regular basis. Otherwise the date
|
||
from checking out pkgsrc should be appended, for example
|
||
<code class="literal">head_20071015</code>.</p></li>
|
||
</ul></div>
|
||
<p>The rationale for exactly this scheme is that the pkgsrc users looking for binary packages
|
||
can quickly click through the directories on the
|
||
server and find the best binary packages for their machines. Since they
|
||
usually know the operating system and the hardware architecture, OPSYS
|
||
and ARCH are placed first. After these choices, they can select the
|
||
best combination of OSVERSION and TAG together, since it is usually the
|
||
case that packages stay compatible between different version of the
|
||
operating system.</p>
|
||
<p>In each of these directories, there is a
|
||
whole binary packages collection for a specific platform. It has a directory called
|
||
<code class="filename">All</code> which contains all binary packages.
|
||
Besides that, there are various category directories that
|
||
contain symbolic links to the real binary packages.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="ftp-reports"></a>C.4. <code class="filename">reports</code>: Bulk build reports</h2></div></div></div>
|
||
<p>Here are the reports from bulk builds, for those who want
|
||
to fix packages that didn't build on some of the platforms. The
|
||
structure of subdirectories should look like the one in <a class="xref" href="#ftp-packages" title="C.3. packages: Binary packages">Section C.3, “<code class="filename">packages</code>: Binary packages”</a>.</p>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="ftp-source"></a>C.5. <code class="filename">current</code>,
|
||
<code class="filename">pkgsrc-20<em class="replaceable"><code>xx</code></em>Q<em class="replaceable"><code>y</code></em></code>:
|
||
source packages</h2></div></div></div>
|
||
<p>These directories contain the <span class="quote">“<span class="quote">real</span>”</span> pkgsrc,
|
||
that is the files that define how to create binary packages from
|
||
source archives.</p>
|
||
<p>The directory <code class="filename">pkgsrc</code> contains a
|
||
snapshot of the CVS repository, which is updated regularly. The
|
||
file <code class="filename">pkgsrc.tar.gz</code> contains the same as the
|
||
directory, ready to be downloaded as a whole.</p>
|
||
<p>In the directories for the quarterly branches, there is an
|
||
additional file called
|
||
<code class="filename">pkgsrc-20<em class="replaceable"><code>xx</code></em>Q<em class="replaceable"><code>y</code></em>.tar.gz</code>,
|
||
which contains the state of pkgsrc when it was branched.</p>
|
||
</div>
|
||
</div>
|
||
<div class="appendix">
|
||
<div class="titlepage"><div><div><h1 class="title">
|
||
<a name="editing"></a>Appendix D. Editing guidelines for the pkgsrc guide</h1></div></div></div>
|
||
<div class="toc">
|
||
<p><b>Table of Contents</b></p>
|
||
<dl class="toc">
|
||
<dt><span class="sect1"><a href="#targets">D.1. Make targets</a></span></dt>
|
||
<dt><span class="sect1"><a href="#procedure">D.2. Procedure</a></span></dt>
|
||
</dl>
|
||
</div>
|
||
<p>This section contains information on editing the pkgsrc
|
||
guide itself.</p>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="targets"></a>D.1. Make targets</h2></div></div></div>
|
||
<p>The pkgsrc guide's source code is stored in
|
||
<code class="filename">pkgsrc/doc/guide/files</code>, and several files
|
||
are created from it:</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem"><p><code class="filename">pkgsrc/doc/pkgsrc.txt</code></p></li>
|
||
<li class="listitem"><p><code class="filename">pkgsrc/doc/pkgsrc.html</code></p></li>
|
||
<li class="listitem"><p><a class="ulink" href="http://www.NetBSD.org/docs/pkgsrc/" target="_top">http://www.NetBSD.org/docs/pkgsrc/</a></p></li>
|
||
<li class="listitem"><p><a class="ulink" href="http://www.NetBSD.org/docs/pkgsrc/pkgsrc.pdf" target="_top">http://www.NetBSD.org/docs/pkgsrc/pkgsrc.pdf</a>:
|
||
The PDF version of the pkgsrc guide.</p></li>
|
||
<li class="listitem"><p><a class="ulink" href="http://www.NetBSD.org/docs/pkgsrc/pkgsrc.ps" target="_top">http://www.NetBSD.org/docs/pkgsrc/pkgsrc.ps</a>:
|
||
PostScript version of the pkgsrc guide.</p></li>
|
||
</ul></div>
|
||
</div>
|
||
<div class="sect1">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="procedure"></a>D.2. Procedure</h2></div></div></div>
|
||
<p>The procedure to edit the pkgsrc guide is:</p>
|
||
<div class="procedure"><ol class="procedure" type="1">
|
||
<li class="step"><p>Make sure you have the packages needed to
|
||
regenerate the pkgsrc guide (and other XML-based NetBSD
|
||
documentation) installed. These are automatically installed when
|
||
you install the <a href="ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/meta-pkgs/pkgsrc-guide-tools/README.html" target="_top"><code class="filename">meta-pkgs/pkgsrc-guide-tools</code></a> package.</p></li>
|
||
<li class="step"><p>Run <span class="command"><strong>cd doc/guide</strong></span> to get to the
|
||
right directory. All further steps will take place
|
||
here.</p></li>
|
||
<li class="step"><p>Edit the XML file(s) in
|
||
<code class="filename">files/</code>.</p></li>
|
||
<li class="step"><p>Run <span class="command"><strong>bmake</strong></span> to check the pkgsrc
|
||
guide for valid XML and to build the final output files. If you
|
||
get any errors at this stage, you can just edit the files, as
|
||
there are only symbolic links in the working directory, pointing
|
||
to the files in <code class="filename">files/</code>.</p></li>
|
||
<li class="step"><p><span class="command"><strong>(cd files && cvs
|
||
commit)</strong></span></p></li>
|
||
<li class="step"><p>Run <span class="command"><strong>bmake clean && bmake</strong></span> to
|
||
regenerate the output files with the proper RCS
|
||
Ids.</p></li>
|
||
<li class="step">
|
||
<p>Run <span class="command"><strong>bmake regen</strong></span> to install and
|
||
commit the files in both <code class="filename">pkgsrc/doc</code> and
|
||
<code class="filename">htdocs</code>.</p>
|
||
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
|
||
<h3 class="title">Note</h3>
|
||
<p>If you have added, removed or renamed some chapters,
|
||
you need to synchronize them using <span class="command"><strong>cvs add</strong></span> or
|
||
<span class="command"><strong>cvs delete</strong></span> in the htdocs
|
||
directory.</p>
|
||
</div>
|
||
</li>
|
||
</ol></div>
|
||
</div>
|
||
</div>
|
||
</div></body>
|
||
</html>
|