source: trunk/doc/guide/new/xml/portfiledev.xml @ 29107

Last change on this file since 29107 was 29107, checked in by markd@…, 12 years ago

Refine patch section; add a TODO item in "best practices" section.

File size: 25.8 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
4<chapter id="development">
5  <title>Portfile Development</title>
6
7  <para>This chapter covers a brief introduction to Portfiles, how to create a
8  local Portfile repository for development, and creating Portfiles.</para>
9
10  <section id="development.introduction">
11    <title>Portfile Introduction</title>
12
13    <para>A MacPorts Portfile is a <ulink
14    url="http://en.wikipedia.org/wiki/Tcl">TCL</ulink> script that usually
15    contains only the simple keyword/value combinations and Tcl extensions as
16    described in the <link linkend="reference">Portfile Reference</link>
17    chapter, though it may also contain arbitrary TCL code. Every port has a
18    corresponding Portfile, but Portfiles do not completely define a port's
19    installation behavior since MacPorts base has default port installation
20    characteristics coded within it. Therefore Portfiles need only specify
21    required options, though some ports may require non-default
22    options.</para>
23
24    <para>A common way for Portfiles to augment or override MacPorts base
25    default installation phase characteristics is by using
26    <filename>Portfile</filename> phase declaration(s). If you use Portfile
27    phase declaration(s), you should know how to identify the "global" section
28    of a Portfile. Any statements not contained within a phase declaration, no
29    matter where they are located in a Portfile, are said to be in the global
30    section of the Portfile; therefore the global section need not be
31    contiguous. Likewise, to remove statements from the global section they
32    must be placed within a phase declaration.</para>
33
34    <para>The main phases you need to be aware of when making a Portfile are
35    these:</para>
36
37    <itemizedlist>
38      <listitem>
39        <para>Fetch</para>
40      </listitem>
41
42      <listitem>
43        <para>Extract</para>
44      </listitem>
45
46      <listitem>
47        <para>Patch</para>
48      </listitem>
49
50      <listitem>
51        <para>Configure</para>
52      </listitem>
53
54      <listitem>
55        <para>Build</para>
56      </listitem>
57
58      <listitem>
59        <para>Destroot</para>
60      </listitem>
61    </itemizedlist>
62
63    <para>The default installation phase behavior performed by the MacPorts
64    base works fine for applications that use the standard
65    <command>configure</command>, <command>make</command>, and <command>make
66    install</command> steps, which conform to phases configure, build, and
67    destroot respectively. For applications that do not conform to this
68    standard behavior, any installation phase may be augmented using <link
69    linkend="development.examples.pre-post">pre- and/or post- phases</link>,
70    or even <link linkend="development.examples.override">overridden</link> or
71    <link linkend="development.examples.eliminate">eliminated</link>. See
72    <link linkend="development.examples">Example Portfiles</link>
73    below.</para>
74
75    <note>
76      <para>For a detailed description of all port phases, see the <link
77      linkend="reference">Portfile Reference</link> chapter.</para>
78    </note>
79  </section>
80
81  <section id="development.local-repositories">
82    <title>Local Portfile Repositories</title>
83
84    <para>To create and test Portfiles that are not yet committed to
85    subversion, you may create a local Portfile repository as shown. Replace
86    the hypothetical user <filename>julesverne</filename> with your username
87    in the example below.</para>
88
89    <orderedlist>
90      <listitem>
91        <para>Open the <filename>sources.conf</filename> file in a text
92        editor.</para>
93
94        <programlisting><prompt>%%</prompt> <userinput>cd ${prefix}/etc/macports/</userinput>
95<prompt>%%</prompt> <userinput>pico sources.conf</userinput></programlisting>
96      </listitem>
97
98      <listitem>
99        <para>Insert a URL pointing to your local repository location before
100        the rsync URL as shown.</para>
101
102        <programlisting>file:///Users/julesverne/ports
103rsync://rsync.macports.org/release/ports
104</programlisting>
105
106        <note>
107          <para>The file URL should always appear before the rsync URL so that
108          local Portfiles can be tested that are duplicated in the MacPorts
109          tree, because the <command>port</command> command will always
110          operate on the first Portfile it encounters.</para>
111        </note>
112      </listitem>
113
114      <listitem>
115        <para>Place the Portfiles you create inside a directory whose name
116        matches the port, which should in turn be placed inside a directory
117        that reflect the port's primary category (the first category entry in
118        the Portfile).</para>
119
120        <programlisting><prompt>%%</prompt> <userinput>cd /Users/julesverne</userinput>
121<prompt>%%</prompt> <userinput>mkdir -p ports/games/bestevergame</userinput>
122<prompt>%%</prompt> <userinput>cd ports/games/bestevergame</userinput>
123<prompt>%%</prompt> <userinput>touch Portfile</userinput></programlisting>
124      </listitem>
125
126      <listitem>
127        <para>After a Portfile is created (see below), use the MacPorts
128        <command>portindex</command> command in the local repository's
129        directory to install it into the
130        <filename>Portindex</filename>.</para>
131
132        <programlisting>%% <userinput>cd /Users/julesverne/ports</userinput>
133%% <userinput>portindex</userinput></programlisting>
134
135        <screen>Creating software index in /Users/julesverne/ports
136Adding port games/bestevergame
137
138Total number of ports parsed:   1
139Ports successfully parsed:      1       
140Ports failed:                   0</screen>
141      </listitem>
142    </orderedlist>
143
144    <para>Once the local port is added to the <filename>Portindex</filename>,
145    it becomes available for searching or installation as with any other
146    Portfile in the MacPorts tree as shown.</para>
147
148    <programlisting><prompt>%%</prompt> <userinput>port search bestever</userinput></programlisting>
149
150    <screen>bestevergame   games/bestevergame 1.1   The Best Ever Game</screen>
151  </section>
152
153  <section id="development.creating-portfile">
154    <title>Creating a Portfile</title>
155
156    <para>Here we list the individual Portfile components for an application
157    that conforms to the the standard <command> configure</command>,
158    <command>make</command>, and <command>make install</command> steps of most
159    open source application installs.</para>
160
161    <orderedlist>
162      <listitem>
163        <para>Subversion ID tag line</para>
164
165        <para>The first line of a new Portfile must be set as shown. When a
166        port is committed to subversion, ID tags are expanded to include the
167        last person to commit and the commit time.</para>
168
169        <programlisting># $Id$</programlisting>
170      </listitem>
171
172      <listitem>
173        <para>PortSystem line</para>
174
175        <para>This statement is required for all ports.</para>
176
177        <programlisting>PortSystem        1.0</programlisting>
178      </listitem>
179
180      <listitem>
181        <para>Port name</para>
182
183        <programlisting>name              rrdtool</programlisting>
184      </listitem>
185
186      <listitem>
187        <para>Port version</para>
188
189        <programlisting>version           1.2.23</programlisting>
190      </listitem>
191
192      <listitem>
193        <para>Port categories</para>
194
195        <para>A port may belong to more than one category, but the first
196        (primary) category should match the directory name in the ports tree
197        where the Portfile is to reside.</para>
198
199        <programlisting>categories        net</programlisting>
200      </listitem>
201
202      <listitem>
203        <para>Port maintainers</para>
204
205        <para>A port's maintainer is a person or persons who take
206        responsibility for keeping the port up-to-date, and the maintainer
207        keyword lists maintainer email addresses(s). To hide these addresses
208        from spambots, see the more full explanation of the maintainer keyword
209        in the <link linkend="reference.keywords.global">Global
210        Keywords</link> section of the <link linkend="reference">Portfile
211        Reference</link> chapter.</para>
212
213        <programlisting>maintainers       julesverne@example.org</programlisting>
214
215        <note>
216          <para>The address <email>nomaintainer@macports.org</email>, or in
217          hidden form <email>nomaintainer</email>, designates a port that may
218          be modified by any committer.</para>
219        </note>
220      </listitem>
221
222      <listitem>
223        <para>Port description</para>
224
225        <programlisting>description       Round Robin Database</programlisting>
226      </listitem>
227
228      <listitem>
229        <para>Port long_description</para>
230
231        <programlisting>long_description  RRDtool is a system to store and display time-series data</programlisting>
232      </listitem>
233
234      <listitem>
235        <para>A port's application homepage</para>
236
237        <programlisting>homepage          http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/</programlisting>
238      </listitem>
239
240      <listitem>
241        <para>Platform statement</para>
242
243        <programlisting>platforms         darwin</programlisting>
244      </listitem>
245
246      <listitem>
247        <para>A port's download URLs</para>
248
249        <programlisting>master_sites      http://oss.oetiker.ch/rrdtool/pub/ \
250                  ftp://ftp.pucpr.br/rrdtool/</programlisting>
251      </listitem>
252
253      <listitem>
254        <para>Port checksums</para>
255
256        <para>The checksums specified in a Portfile are checked with the
257        fetched tarball for security. For the best security, use md5, sha1,
258        and rmd160 checksum types.</para>
259
260        <programlisting>checksums         md5 dafa161bc9c61e57636a6085c87c1fe8 \
261                  sha1 5da610e1c8bc01b80abc21ab9e98e004363b429c \
262                  rmd160 0c1147242adf476f5e93f4d59b553ee3ea378b23</programlisting>
263
264        <para>To find the correct checksums for a port's distribution file,
265        follow this example:</para>
266
267        <programlisting><prompt>%%</prompt> <userinput>md5 rrdtool-1.2.23.tar.gz</userinput>
268<prompt>%%</prompt> <userinput>openssl sha1 rrdtool-1.2.23.tar.gz</userinput>
269<prompt>%%</prompt> <userinput>openssl rmd160 rrdtool-1.2.23.tar.gz</userinput></programlisting>
270
271        <screen>MD5 ( ... rrdtool-1.2.23.tar.gz) = dafa161bc9c61e57636a6085c87c1fe8
272
273SHA1( ... rrdtool-1.2.23.tar.gz)= 5da610e1c8bc01b80abc21ab9e98e004363b429c
274
275RIPEMD160( ... rrdtool-1.2.23.tar.gz)= 0c1147242adf476f5e93f4d59b553ee3ea378b23</screen>
276      </listitem>
277
278      <listitem>
279        <para>Port dependencies</para>
280
281        <para>A port's dependencies are ports that must be installed before
282        another port is installed.</para>
283
284        <programlisting>depends_lib       port:perl5.8 \
285                  port:tcl \
286                  port:zlib</programlisting>
287      </listitem>
288
289      <listitem>
290        <para>Port configure arguments (optional)</para>
291
292        <programlisting>configure.args    --prefix=${prefix} \
293                  --enable-perl-site-install \
294                  --mandir=${prefix}/share/man</programlisting>
295      </listitem>
296    </orderedlist>
297  </section>
298
299  <section id="development.examples">
300    <title>Example Portfiles</title>
301
302    <para>In this section we begin by taking a look at a complete simple
303    Portfile; then we see how to <link
304    linkend="development.examples.augment">augment default phases</link> by
305    defining pre- and post- phases, how to <link
306    linkend="development.examples.override">override default phases</link>,
307    and finally how to <link
308    linkend="development.examples.eliminate">eliminate port
309    phases</link>.</para>
310
311    <section id="development.examples.basic">
312      <title>A Basic Portfile</title>
313
314      <programlisting># Id$
315PortSystem      1.0
316
317name                    rrdtool
318version                 1.2.23
319categories              net
320maintainers             julesverne
321description             Round Robin Database
322long_description        RRDtool is a system to store and display time-series data
323homepage                http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/
324platforms               darwin
325master_sites            http://oss.oetiker.ch/rrdtool/pub/ \
326                        ftp://ftp.pucpr.br/rrdtool/
327
328checksums               md5 dafa161bc9c61e57636a6085c87c1fe8 \
329                        sha1 5da610e1c8bc01b80abc21ab9e98e004363b429c \
330                        rmd160 0c1147242adf476f5e93f4d59b553ee3ea378b23
331
332depends_lib             port:perl5.8 \
333                        port:tcl \
334                        port:zlib
335
336configure.args          --prefix=${prefix} \
337                        --enable-perl-site-install \
338                        --mandir=${prefix}/share/man</programlisting>
339    </section>
340
341    <section id="development.examples.augment">
342      <title>Augment Phases Using pre- / post-</title>
343
344      <para>To augment a port's installation phase, and not override it, you
345      may use pre- and post- installation phases as shown in this
346      example.</para>
347
348      <programlisting>post-destroot {
349# Install example files not installed by the Makefile
350        file mkdir ${destroot}${prefix}/share/doc/${name}/examples
351        file copy ${worksrcpath}/examples/ \
352             ${destroot}${prefix}/share/doc/${name}/examples
353}</programlisting>
354    </section>
355
356    <section id="development.examples.override">
357      <title>Overriding Phases</title>
358
359      <para>To override the automatic MacPorts installation phase processing,
360      define your own installation phases as shown in this example.</para>
361
362      <programlisting>destroot {
363        xinstall -m 755 -d ${destroot}${prefix}/bin
364        xinstall -m 755 ${worksrcpath}/cdpr ${destroot}${prefix}/bin
365}</programlisting>
366    </section>
367
368    <section id="development.examples.eliminate">
369      <title>Eliminating Phases</title>
370
371      <para>To eliminate a default phase, simply define a phase with no
372      contents as shown.</para>
373
374      <programlisting>build {}</programlisting>
375
376      <note>
377        <para>Because many software packages do not use
378        <option>configure</option>, a keyword is provided to eliminate the
379        <option>configure</option> phase. See the chapter <link
380        linkend="reference">Portfile Reference</link> for full
381        information.</para>
382      </note>
383    </section>
384
385    <section id="development.examples.startupitem">
386      <title>Creating a StartupItem</title>
387
388      <para>Startupitems may be placed in the global section of a
389      Portfile.</para>
390
391      <programlisting>startupitem.create      yes
392startupitem.name        nmicmpd
393startupitem.executable  "${prefix}/bin/nmicmpd"</programlisting>
394
395      <para>Startupitems keywords may also be used within a variant definition
396      to make their installation conditional.</para>
397
398      <programlisting>variant server {
399    startupitem.create    yes
400    startupitem.start "${prefix}/share/${name}/vm-pop3d.init start"
401    startupitem.stop "${prefix}/share/${name}/vm-pop3d.init stop"
402}</programlisting>
403    </section>
404  </section>
405
406  <section id="development.variants">
407    <title>Port Variants</title>
408
409    <para>Variants are a way for port authors to provide options that may be
410    invoked at install time. They are declared in the global section of a
411    Portfile using the "variant" keyword and may provide a description.</para>
412
413    <section id="development.variants.options">
414      <title>Variants to Modify Options</title>
415
416      <para>The most common use for a variant is to add or remove
417      dependencies, configure arguments, and build arguments from the global
418      Portfile section. Here is an example of a port providing four variants
419      that add additional configure arguments to a port.</para>
420
421      <programlisting>variant pop     { configure.args-append --enable-pop }
422variant imap    { configure.args-append --enable-imap }
423variant ssl     { configure.args-append --with-ssl }
424variant debug   { configure.args-append --enable-debug }</programlisting>
425
426      <para>In the example variant declaration, the configure argument
427      <literal>--without-x</literal> is removed and a numner of others are
428      appended.</para>
429
430      <programlisting>variant x11 description {Builds port as an X11 program with Lucid widgets} {
431    configure.args-delete   --without-x
432    configure.args-append   --with-x-toolkit=lucid \
433                            --without-carbon \
434                            --with-xpm \
435                            --with-jpeg \
436                            --with-tiff \
437                            --with-gif \
438                            --with-png
439    depends_lib-append      lib:libX11:XFree86 \
440                            lib:libXpm:XFree86 \
441                            port:jpeg \
442                            port:tiff \
443                            port:libungif \
444                            port:libpng
445}</programlisting>
446    </section>
447
448    <section id="development.variants.phase">
449      <title>Variant Actions in a Phase</title>
450
451      <para>If a variant requires options in addition to those provided by
452      keywords using -append and/or -delete, in other words, any actions that
453      would normally take place within a port installation phase, do not try
454      to do this within the variant declaration. Rather, modify the behavior
455      of any affected phases when the variant is invoked using the
456      variant_isset keyword.</para>
457
458      <programlisting>post-destroot {
459    xinstall -m 755 -d ${destroot}${prefix}/etc/
460    xinstall ${worksrcpath}/examples/foo.conf \
461        ${destroot}${prefix}/etc/
462
463    if {[variant_isset] carbon]} {
464        delete ${destroot}${prefix}/bin/emacs
465        delete ${destroot}${prefix}/bin/emacs-${version}
466    }
467}</programlisting>
468    </section>
469
470    <section id="development.variants.default">
471      <title>Default Variants</title>
472
473      <para>Variants are used to specify actions that lie outside the core
474      functions of an application or port, but there may be some cases where
475      you wish to specify these non-core functions by default. For this
476      purpose you may use the keyword default_variants.</para>
477
478      <programlisting>default_variants +foo +bar</programlisting>
479
480      <note>
481        <para>The default_variant keyword may only be used in the global
482        Portfile section.</para>
483      </note>
484    </section>
485  </section>
486
487  <section id="development.patches">
488    <title>Patch Files</title>
489
490    <para>Patch files are files created with the Unix command
491    <command>diff</command> that are applied using the command
492    <command>patch</command> to modify text files to fix bugs or extend
493    functionality.</para>
494
495    <section id="development.patches.portfile">
496      <title>Creating Portfile Patches</title>
497
498      <para>If you wish to contribute modifications or fixes to a Portfile,
499      you should do so in the form of a patch.</para>
500
501      <orderedlist>
502        <listitem>
503          <para>Make a copy of the Portfile you wish to modify; both files
504          must be in the same directory, though it may be any
505          directory.</para>
506
507          <programlisting><prompt>%%</prompt> <userinput>cp Portfile Portfile.orig</userinput></programlisting>
508        </listitem>
509
510        <listitem>
511          <para>Edit the file to make it as you want it to be after it is
512          fetched.</para>
513        </listitem>
514
515        <listitem>
516          <para>Now use the Unix command <command>diff -u </command>to create
517          a "unified" diff patch file. Put the name of the port in the
518          patchfile, for example, Portfile-rrdtool.diff.</para>
519
520          <programlisting><prompt>%%</prompt> <userinput>diff -u Portfile.orig Portfile &gt; Portfile-rrdtool.diff</userinput></programlisting>
521        </listitem>
522
523        <listitem>
524          <para>A patch file that is a "unified" diff file is the easiest to
525          interpret by humans and this type should always be used for ports.
526          The Portfile patch below will change the version and checksums when
527          applied.</para>
528
529          <programlisting>--- Portfile.orig        2007-07-25 18:52:12.000000000 -0700
530+++ Portfile    2007-07-25 18:53:35.000000000 -0700
531@@ -2,7 +2,7 @@
532 PortSystem             1.0
533 
534 name                   nefu
535-version                        1.4.0
536+version                        1.3.0
537 categories             net
538 maintainers            nomaintainer@macports.org
539 description            A network monitoring daemon.
540@@ -13,9 +13,9 @@
541
542 homepage               http://rsug.itd.umich.edu/software/${name}
543
544 master_sites           ${homepage}/files/
545-checksums              md5 f0953b21cdb5eb327e40d4b215110b71
546+checksums              md5 01532e67a596bfff6a54aa36face26ae
547 extract.suffix  .tgz
548 platforms              darwin
549</programlisting>
550        </listitem>
551      </orderedlist>
552
553      <para>Now you may attach the patch file to a MacPorts Trac ticket for
554      the port author to evaluate.</para>
555    </section>
556
557    <section id="development.patches.source">
558      <title>Creating Source Code Patches</title>
559
560      <para>Necessary or useful patches to application source code should be
561      sent to the application developer (not the port author) so the
562      modifications may be included in the next version, and the port patch
563      eventually removed.</para>
564
565      <orderedlist>
566        <listitem>
567          <para>Locate the file you wish to patch in its original location
568          within the unpacked source directory and make a duplicate of
569          it.</para>
570
571          <programlisting><prompt>%%</prompt> <userinput>cd foo-1.34/src</userinput>
572<prompt>%%</prompt> <userinput>cp Makefile.in Makefile.in.orig</userinput></programlisting>
573        </listitem>
574
575        <listitem>
576          <para>Edit the file to make it as you want it to be after it is
577          fetched.</para>
578        </listitem>
579
580        <listitem>
581          <para>Now use the Unix command <command>diff -u</command> to create
582          a "unified" diff patch file.</para>
583
584          <programlisting><prompt>%%</prompt> <userinput>cd foo-1.34</userinput>
585<prompt>%%</prompt> <userinput>diff -u Makefile.in.orig Makefile.in &gt; patch-Makefile.in</userinput></programlisting>
586
587          <note>
588            <para>You must execute the <command>diff</command> command in the
589            top-level of the unpacked source code. Otherwise the
590            <command>patch</command> command will look for the file to be
591            patched in the wrong place and fail.</para>
592          </note>
593        </listitem>
594
595        <listitem>
596          <para>A patch file that is a "unified" diff file is the easiest to
597          interpret by humans and this type should always be used for ports.
598          See the example below where a patch adds <varname>DESTDIR</varname>
599          support to a <filename>Makefile.in</filename> file.</para>
600
601          <programlisting>--- Makefile.in.orig   2007-06-01 16:30:47.000000000 -0700
602+++ Makefile.in       2007-06-20 10:10:59.000000000 -0700
603@@ -131,23 +131,23 @@
604        $(INSTALL_DATA)/gdata $(INSTALL_DATA)/perl
605
606 install-lib:
607-       -mkdir -p $(INSTALL_LIB)
608+       -mkdir -p $(DESTDIR)$(INSTALL_LIB)
609        $(PERL) tools/install_lib -s src -l $(INSTALL_LIB) $(LIBS)
610-       cp $(TEXT) $(INSTALL_LIB)/
611+       cp $(TEXT) $(DESTDIR)$(INSTALL_LIB)/</programlisting>
612        </listitem>
613
614        <listitem>
615          <para>Now you may place the patch
616          <filename>patch-Makefile.in</filename> in the path ${portpath}/files
617          of a local repository (or commit it to subversion) and use it in a
618          port using the <code>patchfiles</code> keyword.</para>
619
620          <programlisting>patchfiles              patch-Makefile.in</programlisting>
621
622          <note>
623            <para>You should make a patch file for each file to be patched,
624            though if you obtain a patch from another source that patches
625            multiple files it is permissible to use it that way. Patch
626            filenames should generally be of the form
627            "patch-&lt;directory&gt;-&lt;filename&gt;", for example
628            <filename>patch-src-Makefile.in</filename>.</para>
629          </note>
630        </listitem>
631      </orderedlist>
632    </section>
633
634    <section id="development.patches.applying">
635      <title>Manually Applying Patches</title>
636
637      <para>Though MacPorts applies patch files automatically, you may want to
638      know how to apply patch files manually if you want to test patch files
639      you have created or you wish to apply uncommitted Portfile
640      patches.</para>
641
642      <orderedlist>
643        <listitem>
644          <para>Change to the directory containing the file to be patched. In
645          this example, we'll apply a Portfile patch to the postfix
646          port.</para>
647
648          <programlisting><prompt>%%</prompt> <userinput>cd ${prefix}/var/macports/sources/rsync.macports.org/release/ports/mail/postfix</userinput></programlisting>
649        </listitem>
650
651        <listitem>
652          <para>Now apply the patch that is on the current user's desktop. The
653          patchfile knows the filename of the file to be patched.</para>
654
655          <programlisting><prompt>%%</prompt> <userinput>patch -p0 &lt; ~/Desktop/Portfile-postfix.diff</userinput></programlisting>
656
657          <screen>patching file Portfile</screen>
658        </listitem>
659      </orderedlist>
660    </section>
661  </section>
662
663  <section id="development.practices">
664    <title>Portfile Best Practices</title>
665
666    <para>This section contains practical guidelines for creating Portfiles
667    that install smoothly and provide consistency between ports. The following
668    sections are on the TODO list.</para>
669
670    <section id="development.practices.dont-overwrite">
671      <title>Don't Overwrite Config Files</title>
672
673      <para>TODO:</para>
674    </section>
675
676    <section id="development.practices.install-docs">
677      <title>Install Docs and Examples</title>
678
679      <para>TODO:</para>
680    </section>
681
682    <section id="development.practices.provide-messages">
683      <title>Provide User Messages</title>
684
685      <para>TODO:</para>
686    </section>
687
688    <section>
689      <title>Use Variables</title>
690
691      <para>TODO: Set variables so changing paths may be done in one place;
692      use them anytime it makes updates simpler: distname
693      ${name}-src-${version}</para>
694    </section>
695  </section>
696</chapter>
Note: See TracBrowser for help on using the repository browser.