<!--
     The FreeBSD Documentation Project

     $FreeBSD: doc/es_ES.ISO8859-1/books/handbook/ports/chapter.sgml,v 1.1 2000/08/25 13:00:28 jesusr Exp $
-->


<chapter id="ports">
  <title>Instalando Aplicaciones: La colecci&oacute;n de Ports</title>

  <para><emphasis>Contribuido por &a.jraynard;.</emphasis></para>

  <para>La colecci&oacute;n de Ports de FreeBSD te permite compilar e instalar
  una gran cantidad de programas con el m&iacute;nimo esfuerzo.</para>

  <para>Debido a las diferencias entre los est&aacute;ndars abiertos, conseguir
  que un programa funcione en una versi&oacute;n diferente de Unix puede ser
  tedioso y complicado, como debe saber todo aquel que lo haya intentado.
  Tendr&aacute;s suerte si el programa que quieres compila limpiamente, 
  instala todos los componentes donde debe instalarlos y funciona todo 
  correctamente al primer intento.</para> 

  <para>Algunas distribuciones de software han intentado solucionar este
  problema incluyendo unos scripts de configuraci&oacute;n. Algunos de estos
  scripts son muy inteligentes, pero tienen tendencia a anunciar que tu
  sistema es algo que nunca has oido y hacen preguntas que suenan a un 
  ex&aacute;men final de programaci&oacute;n en Unix.</para>

  <para>Afortunadamente, con la colecci&oacute;n de Ports, todo el trabajo
  duro ya est&aacute; hecho, y solo tienes que teclear el comando
  <command>make install</command> para tener un programa perfectamente
  instalado y en funcionamiento.</para>

  <sect1>
    <title>&iquest;Porqu&eacute; tener una Colecci&oacute;n de Ports?</title>

    <para>El sistema base de FreeBSD incluye una gran variedad de 
    herramientas y utilidades de sistema, pero muchos de los programas
    populares no est&aacute;n en la distribuci&oacute;n base del sistema,
    por buenas razones:</para>

    <orderedlist>
      <listitem> 
        <para>Programas con los que algunos usuarios no puede vivir sin ellos y
        otros usuarios ni los conocen, como cierto editor basado en Lisp.</para>
      </listitem>

      <listitem>
        <para>Programas demasiado especializados para ser incluidos en la
        distribuci&oacute;n base del sistema (CAD, bases de datos, etc).</para>
      </listitem>

      <listitem>
        <para>Programas que se pueden incluir en la categor&iacute;a
        &ldquo;Tengo que mirarlo cuando tenga un rato libre&rdquo;
        (algunos lenguajes, por ejemplo).</para>
      </listitem>

      <listitem>
        <para>Programas que son demasiado divertidos para ser incluidos en
        un sistema operativo serio como FreeBSD ;-)</para>
      </listitem>

      <listitem>
        <para>Por muchos programas que se incluyesen en el sistema base, la
        gente siempre quiere m&aacute;s, y se debe crear una l&iacute;nea
        de separaci&oacute;n en alg&uacute;n momento (de otra manera, las
        distribuciones de FreeBSD ser&iacute;n enormes).</para>
      </listitem>
    </orderedlist>

    <para>Obviamente no ser&iacute;a razonable que cada usuario se portase
    manualmente sus programas favoritos (sin mencionar la enorme cantidad de
    trabajo duplicado), as&iacute; que el proyecto FreeBSD ha usado un 
    ingenioso sistema que mediante herramientas est&aacute;ndar permite
    automatizar todo el proceso.</para>

    <para>Esta es una excelente ilustraci&oacute;n de como el
    &ldquo;Unix way&rdquo; trabaja en la pr&aacute;tica combinando una serie
    de simples pero muy flexibles herramientas y consiguiendo algo muy
    potente.</para>
  </sect1>

  <sect1>
    <title>&iquest;C&oacute;mo funciona la Colecci&oacute;n de Ports?</title>

    <para>Los programas en Internet se suelen distribuir como un <link
    linkend="ports-tarball">tarball</link> consistente en un Makefile y el
    c&oacute;digo fuente del programa, incluyendo algunas instrucciones (las
    cuales no siempre son tan instructivas como debieras), y un script de
    configuraci&oacute;n.</para>

    <para>El escenario habitual es que bajas el tarball v&iacute;a FTP, lo
    extraes en alg&uacute;n directorio, lees las instrucciones, haces los
    cambios que parezcan necesarios, ejecutas el script de configuraci&oacute;n
    y usas el programa <command>make</command> para compilar e instalar el
    programa desde el c&oacute;digo fuente.</para>

    <para>Los ports de FreeBSD siguen usando el mecanismo del tarball, pero 
    usan un <link linkend="ports-skeleton">esqueleto</link> en el que guardan
    la informaci&oacute;n necesaria para que el programa funcione correctamente
    en FreeBSD. Los ports tambi&eacute;n tienen su propio y personalizado
    <link linkend="ports-makefile">Makefile</link> para practicamente todos
    los ports puedan ser compilados de la misma manera.</para>

    <para>Si miras el esqueleto de un port (ya sea <ulink
    URL="file://localhost/usr/ports/devel/ElectricFence">en tu sistema
    FreeBSD</ulink> o <ulink 
    URL="ftp://ftp.freebsd.org/pub/FreeBSD/ports/ports/devel/ElectricFence">en
    el servidor FTP</ulink>) y esperas encontrar todo tipo de combinaciones
    de ciencia avanzada, puede que te decepciones, ya que s&oacute;lo 
    encontrar&aacute;s uno o dos ficheros y directorios de lo m&aacute;s
    habitual. (En un momento veremos como <link
    linkend="ports-getting">obtener un port</link>).</para>

    <para>&ldquo;&iquest;C&oacute;mo es posible que esto pueda hacer algo?
    &rdquo; Oigo como lloras. &ldquo;No hay c&oacute;digo fuente!&rdquo;</para>

    <para>Lo creas o no, gentil lector, todo quedar&aacute; entendido (o eso
    espero). Veamos que pasa si intentamos instalar un port. He elegido el
    programa <application>ElectricFence</application>, una &uacute;til
    herramienta para desarrolladores, ya que el esqueleto es m&aacute;s
    claro que muchos otros.</para>

    <note>
      <para>Si intentas ejecutar esto, necesitas estar como root.</para>
    </note>

    <screen>&prompt.root; <userinput>cd /usr/ports/devel/ElectricFence</userinput>
&prompt.root; <userinput>make install</userinput>
&gt;&gt; Checksum OK for ElectricFence-2.0.5.tar.gz.
===&gt;  Extracting for ElectricFence-2.0.5
===&gt;  Patching for ElectricFence-2.0.5
===&gt;  Applying FreeBSD patches for ElectricFence-2.0.5
===&gt;  Configuring for ElectricFence-2.0.5
===&gt;  Building for ElectricFence-2.0.5
[lots of compiler output...]
===&gt;  Installing for ElectricFence-2.0.5
===&gt;  Warning: your umask is "0002". If this is not desired, set it to
      an appropriate value and install this port again by ``make reinstall''.
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.a /usr/local/lib
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.3 /usr/local/man/man3
===&gt;  Compressing manual pages for ElectricFence-2.0.5
===&gt;  Registering installation for ElectricFence-2.0.5</screen> 

    <para>Para evitar confusiones, he borrado todas las l&iacute;neas 
    correspondientes a la compilaci&oacute;n del programa.</para>

    <para>Si has realizado la instalaci&oacute;n de este port, habr&aacute;s
    obtenido algo as&iacute; en pantalla:</para>

    <screen id="ports-fetch">&prompt.root; <userinput>make install</userinput>
&gt;&gt; ElectricFence-2.0.5.tar.gz doesn't seem to exist on this system.
&gt;&gt; Attempting to fetch from ftp://ftp.doc.ic.ac.uk/Mirrors/sunsite.unc.edu/pub/Linux/devel/lang/c/.</screen>

    <para>El programa <command>make</command> notifica que no tienes una copia
    en local del c&oacute;digo fuente e intenta bajarlo por FTP. En el 
    ejemplo, ya ten&iacute;a el c&oacute;digo en el ordenador, por lo que no
    ha sido necesario obtenerlo de Internet.</para>

    <para>Vayamos revisando que ha hecho el programa <command>make</command>
    </para>

    <procedure>
      <step>
        <para>Localizar el <link
        linkend="ports-tarball">tarball</link> con el c&oacute;digo fuente.
        Si no est&aacute; disponible localmente, intenta obtenerlo desde 
        un servidor FTP.</para>
      </step>

      <step>
        <para>Ejecutar un test de <link linkend="ports-checksum">checksum</link>
       para asegurar que el tarball del c&oacute;digo fuente es correcto.</para>
     </step>

     <step>
       <para>Extraer el tarball en un directorio temporal.</para>
     </step>

     <step>
       <para>Aplicar todos los <link linkend="ports-patch">parches</link>
       necesarios para que el c&oacute;digo fuente compile y funcione bajo
       FreeBSD.</para>
     </step>

     <step>
       <para>Ejecutar cualquier script de configuraci&oacute;n requerido por
       el proceso de compillaci&oacute;n, adem&aacute;s de responder 
       correctamente a cualquiera de las preguntas realizadas por &eacute;ste.
       </para>
    </step>

    <step>
      <para>(Finalmente!) Compilar el c&oacute;digo.</para>
    </step>

    <step>
      <para>Instalar los ejecutables del programa y otros archivos de 
      soporte, p&aacute;ginas man, etc, bajo la jerarqu&iacute;a
      <filename>/usr/local</filename>, donde no se mezclar&aacute;n con los
      programas de sistema. Esto tambi&eacute;n asegura que todos los ports
      que instales estar&aacute;n en el mismo lugar, evitando que queden
      repartidos por diferentes lugares del disco.</para>
    </step>

    <step>
      <para>Registrar la instalaci&oacute;n en una base de datos. Esto
      significa que, si no te gusta el programa, puedes <link
      linkend="ports-remove">borrar</link> todos sus programas y archivos
      de tu sistema.</para>
    </step>
  </procedure>

  <para>Vuelve a mirar la salida del programa <command>make</command> antes
  mostrada e intenta localizar los pasos descritos. Y si no estabas impresionado
  antes, deber&iacute;as estarlo ahora.</para>
</sect1>

  <sect1 id="ports-getting">
    <title>Obteniendo un Port de FreeBSD</title>

    <para>Hay dos maneras de obtener un port de FreeBSD para un programa. Uno
    requiere el <link linkend="ports-cd">CDROM de FreeBSD</link>, y el otro
    requiere una <link linkend="ports-inet">conexi&oacute;n a Internet</link>.
    </para>

    <sect2 id="ports-cd">
      <title>Compilar los PORTS desde CDROM</title>

      <para>Asumiendo que tu CDROM de FreeBSD est&aacute; en el lector y montado
      en <filename>/cdrom</filename> (y <emphasis>must</emphasis> estar
      montado en <filename>/cdrom</filename>), deber&iacute;s poder compilar
      toda la colecci&oacute;n de ports sin problemas, ya que &eacute;sta
      encontrar&iacute;a los tarballs en 
      <filename>/cdrom/ports/distfiles/</filename> (si existen all&iacute;) 
      en lugar de obtenerlos de Internet.</para>

      <para>Otra manera de hacer esto, si s&oacute;lo quieres usar los 
      esqueletos del CDROM, es poner la variables del fichero
      <filename>/etc/make.conf</filename> de la siguiente manera:</para>

      <programlisting>
PORTSDIR=       /cdrom/ports
DISTDIR=        /tmp/distfiles
WRKDIRPREFIX=   /tmp</programlisting>

      <para>Substituye <literal>/tmp</literal> por cualquier directorio en
      el que tengas suficiente espacio. Entonces, entra en el subdirectorio
      apropiado bajo <filename>/cdrom/ports</filename> y teclea
      <command>make install</command> como hasta ahora.
      <makevar>WRKDIRPREFIX</makevar> har&aacute; que el port sea compilado
      bajo <filename>/tmp/cdrom/ports</filename>; por ejemplo, 
      <filename>games/oneko</filename> ser&aacute; compilado bajo
      <filename>/tmp/cdrom/ports/games/oneko</filename>.</para>

    <note>
      <para>Hay algunos ports para los que no podemos dar el c&oacute;digo
      fuente original en el CDROM debido a limitaciones de licencia. Es estos
      casos, tendr&aacute;s que mirar en la secci&oacute;n <link
      linkend="ports-inet">Compilando los ports usando una conexi&oacute;n a 
      Internet.</link></para>
    </note>
  </sect2>

    <sect2 id="ports-inet">
      <title>Compilando los Ports desde Internet</title>

      <para>Si no tienes CDROM o quieres estar seguro de instalar la
      &uacute;ltima versi&oacute;n del port que te interesa, necesitar&aacute;s
      bajarte el <link linkend="ports-skeleton">esqueleto</link> de ese port.
      </para>

     <para>Primero, si est&aacute;s usando una versi&oacute;n release de 
     FreeBSD, aseg&uacute;rate de tener instalado el kit de actualizaci&oacute;n
     apropiado para tu release. Para conocer el kit apropiado, mira en
     <ulink url="http://www.freebsd.org/ports/">la p&aacute;gina web de 
     ports</ulink>. Estos packages incluyen ficheros que han sido actualizados
     desde la release y que ser&aacute;n necesarios para compilar los nuevos
     ports.</para>

     <para>La clave para los esqueletos es que el servidor FTP de FreeBSD puede
     crear <link linkend="ports-tarball">tarballs</link> al momento. 
     Aqu&iacute; tienes c&oacute;mo trabaja, usando como ejemplo el programa
     gnats en el directorio de bases de datos (el texto entre corchetes son
     comentarios. No los teclees si intentas ejecutar el ejemplo):</para>

      <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>mkdir databases</userinput>
&prompt.root; <userinput>cd databases</userinput>
&prompt.root; <userinput>ftp ftp.freebsd.org</userinput>
[log in as `ftp' and give your email address when asked for a
password. Remember to use binary (also known as image) mode!]
<prompt>&gt;</prompt> <userinput>cd /pub/FreeBSD/ports/ports/databases</userinput>
<prompt>&gt;</prompt> <userinput>get gnats.tar</userinput>
[tars up the gnats skeleton for us]
<prompt>&gt;</prompt> <userinput>quit</userinput>
&prompt.root; <userinput>tar xf gnats.tar</userinput>
[extract the gnats skeleton]
&prompt.root; <userinput>cd gnats</userinput>
&prompt.root; <userinput>make install</userinput>
[build and install gnats]</screen>

      <para>&iquest;Qu&eacute; ha ocurrido aqu&iacute;?. Hemos conectado con
      el servidor FTP de la manera habitual y entrado en el subdirectorio
      <filename>databases</filename>. Al enviar el comando 
      <command>get gnats.tar</command>, el servidor FTP ha empaquetado en
      formato <link linkend="ports-tarball">tarred</link> el directorio
      gnats.</para>

      <para>A continuaci&oacute;n hemos extraido el esqueleto de gnats y
      entrado en el directorio para compilar el port. Como hemos explicado
      <link linkend="ports-fetch">anteriormente</link>, el programa
      <command>make</command> ha detectado que el c&oacute;digo fuente no 
      estaba disponible localmente y lo ha bajado de Internet antes de 
      extraerlo, aplicar los parches necesarios, compilarlo e instalarlo.</para>

      <para>Intentemos ahora algo m&aacute;s ambicioso. En lugar de obtener el
      esqueleto de un simple port, obtengamos todos los de un directorio, por
      ejemplo los esqueletos de todas las bases de datos de la colecci&oacute;n
      de ports. El proceso es muy parecido:</para>

      <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>ftp ftp.freebsd.org</userinput>
[log in as `ftp' and give your email address when asked for a
password. Remember to use binary (also known as image) mode!]
<prompt>&gt;</prompt> <userinput>cd /pub/FreeBSD/ports/ports</userinput>
<prompt>&gt;</prompt> <userinput>get databases.tar</userinput>
[tars up the databases directory for us]
<prompt>&gt;</prompt> <userinput>quit</userinput>
&prompt.root; <userinput>tar xf databases.tar</userinput>
[extract all the database skeletons]
&prompt.root; <userinput>cd databases</userinput>
&prompt.root; <userinput>make install</userinput>
[build and install all the database ports]</screen>

      <para>Con media docena de sencillos comandos, tenenemos instalada toda
      una serie de programas de bases de datos en nuestra m&aacute;quina
      FreeBSD. Todo lo que hemos hecho diferente de la instalaci&oacute;n de
      un s&oacute;lo port ha sido bajarnos todo un directorio y compilarlo 
      todo de una sola vez. Impresionante, &iquest;no?.</para>

      <para>Si tienes pensado instalar muchos ports, es buena idea bajarse
      la colecci&oacute;n de ports completa.</para>
    </sect2>
  </sect1>

  <sect1 id="ports-skeleton">
    <title>Esqueletos</title>

    <para>Un grupo de hackers compulsivos que ha olvidado comer en un intento
    de llegar a un punto prefijado?. No, un esqueleto aqu&iacute; es la
    expresi&oacute;n m&iacute;nima que incluye todo lo necesario para que los
    ports realicen su m&aacute;gico trabajo.</para>

    <sect2 id="ports-makefile">
      <title><filename>Makefile</filename></title>

      <para>El componente m&aacute;s importante del esqueleto es el Makefile.
      Este contiene diferentes declaraciones que especifican c&oacute;mo
      debe ser compilado e instalado un port. Aqu&iacute; est&aacute; el 
      Makefile para el port ElectricFence:</para>

      <programlisting>
# New ports collection makefile for:  Electric Fence
# Version required:     2.0.5
# Date created:         13 November 1997
# Whom:                 jraynard
#
# &#36;Id&#36;
#

DISTNAME=       ElectricFence-2.0.5
CATEGORIES=     devel
MASTER_SITES=   ${MASTER_SITE_SUNSITE}
MASTER_SITE_SUBDIR=     devel/lang/c

MAINTAINER=     jraynard@freebsd.org

MAN3=           libefence.3

do-install:
        ${INSTALL_DATA} ${WRKSRC}/libefence.a ${PREFIX}/lib
        ${INSTALL_MAN} ${WRKSRC}/libefence.3 ${PREFIX}/man/man3

.include &lt;bsd.port.mk&gt;</programlisting>

      <para>Las l&iacute;neas que empiezan con el s&iacute;mbolo &quot;#&quot;
      son comentarios para facilitar las cosas a los lectores humanos (como
      en la mayor&iacute;a de los scripts en Unix).</para>

      <para><literal>DISTNAME</literal> especifica el nombre del <link
      linkend="ports-tarball">tarball</link>, pero sin la extensi&oacute;n.
      </para>

      <para><literal>CATEGORIES</literal> indica que tipo de programa es. En
      este caso, una utilidad para desarrolladores. Mira en la secci&oacute;n
      <link linkend="porting-categories">categor&iacute;as</link> de este
      handbook para ver una lista completa.</para>

      <para><literal>MASTER_SITES</literal> es la URL(s) del servidor FTP
      principal, usado para obtener el <link
      linkend="ports-tarball">tarball</link> si no est&aacute; disponible
      en el sistema local. Este servidor se considera fiable, y normalmente es
      desde el que se distribuye de manera oficial el programa.</para>

      <para><literal>MAINTAINER</literal> es la direcci&oacute;n de email de
      la persona responsable de actualizar el esqueleto, si, por ejemplo, 
      aparece una nueva versi&oacute;n del programa.</para>

      <para>Pasando por alto las siguientes l&iacute;neas, la l&iacute;nea
      <literal>.include &lt;bsd.port.mk&gt;</literal> indica que las otras
      declaraciones o comandos necesarios para compilar el port est&aacute;n
      en un fichero est&aacute;ndar llamado <filename>bsd.port.mk</filename>.
      Como &eacute;stas son las mismas para todos los ports, no hay necesidad
      de duplicarlos en todos los ports, as&iacute; que se mantienen en un
      solo fichero.</para>

      <para>Este no es el lugar para entrar en detalle sobre el funcionamiento
      del Makefile; es suficiente con decir que la l&iacute;nea que comienza
      con <literal>MAN3</literal> asegura que la p&aacute;gina man de 
      ElectricFence sea compilada despu&eacute;s de la instalaci&oacute;n, para
      ayudar a conservar tu preciado espacio en disco. El port original no
      conten&iacute;a el objeto <maketarget>install</maketarget>, as&iacute; que
      las tres l&iacute;neas a partir de <maketarget>do-install</maketarget>
      aseguran que los ficheros producidos por este port sean instalados
      en el lugar correcto.</para>
    </sect2>

    <sect2>
      <title>El directorio <filename>files</filename></title>

      <para>El fichero que contiene el <link
      linkend="ports-checksum">checksum</link> del port se llama 
      <filename>md5</filename>, ya que se usa el algoritmo MD5 para comprobar
      el checksum de los ports. Est&aacute; en el directorio llamado
      <filename>files</filename>.</para>

      <para>Este directorio puede contener otros ficheros necesarios para
      compilar el port y que no pueden situarse en ningun otro lugar.</para>
    </sect2>

    <sect2>
      <title>El directorio <filename>patches</filename></title>

      <para>Este directorio contiene los <link
      linkend="ports-patch">patches</link> necesarios para hacer
      que todo funcione correctamente bajo FreeBSD.</para>
    </sect2>

    <sect2>
      <title>El directorio <filename>pkg</filename></title>

      <para>Este programa contiene tres archivos muy comunes:</para>

      <itemizedlist>
        <listitem>
          <para><filename>COMMENT</filename> &mdash; una descripci&oacute;n
          muy corta del programa.</para>
        </listitem>

        <listitem>
          <para><filename>DESCR</filename> &mdash; una descripci&oacute;n
          m&aacute;s detallada.</para>
        </listitem>

        <listitem>
          <para><filename>PLIST</filename> &mdash; una lista de todos los
          archivos que ser&aacute;n creados cuando el programa est&eacute;
          instalado.</para>
        </listitem>
      </itemizedlist>
    </sect2>
  </sect1>

  <sect1 id="ports-troubleshooting">
    <title>&iquest;Qu&eacute; hacer cuando un port no funciona?</title>

    <para>Oh, puedes hacer una de estas cuatro (4) cosas:</para>

    <orderedlist>
      <listitem>
        <para>Solucionarlo t&uacute; mismo. Los detalles t&eacute;cnicos de como
        trabajan los ports se pueden encontrar en <link
        linkend="porting">Portando aplicaciones.</link></para>
      </listitem>

      <listitem>
        <para>Quejarte. <emphasis>S&oacute;lo</emphasis> hacerlo por email.
        Env&iacute; el mail a la direcci&oacute;n &a.ports; y por favor, 
        indica el nombre/versi&oacute;n del port, d&oacute;nde obtuviste el
        c&oacute;digo fuente y cual ha sido el texto de error.</para>
      </listitem>

      <listitem>
        <para>Olvidarlo. Este el sistema m&aacute;s f&aacute;cil para alguno
        de los pocos ports que puedan clasificarse como esenciales.</para>
      </listitem>

      <listitem>
        <para>Obtener el package compilado desde un servidor FTP. La 
        colecci&oacute;n principal de packages est&aacute; en el servidor
        principal de FreeBSD en el directorio <ulink
        URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/">
        packages</ulink>, pero por favor, mira primero en tu mirror local.
        Estos programas suelen dar menos problemas que intentar compilar el
        c&oacute;digo fuente y es, sobre todo, mucho m&aacute;s r&aacute;pido.
        Usa el programa &man.pkg.add.1; para instalar un package en tu
        sistema.</para>
      </listitem>
    </orderedlist>
  </sect1>
        
  <sect1>
    <title>Algunas Preguntas y Respuestas</title>

    <itemizedlist>
      <listitem>
        <para>P. Pensaba que esto iba a ser una discusi&oacute;n sobre modems
        </para>

        <para>R. Ah. Debes estar pensando en los puertos serie que hay en la
        parte trasera de tu ordenador. Aqu&iacute; usamos la palabra
        &ldquo;port&rdquo; para definir el resultado de &ldquo;portar&rdquo;
        un programa de una versi&oacute;n de Unix a otra. (Desafortunadamente
        es un mal h&aacute;bito de los inform&aacute;ticos el usar la misma
        palabra para referirse a cosas completamente diferentes).</para>
      </listitem>

      <listitem>
        <para>P. Pensaba que usabais los packages para instalar los programas
        extras</para>

        <para>R. S&iacute;, esa es la manera m&aacute;s r&aacute;pida y
        f&aacute;cil de instalarlos.</para>
      </listitem>

      <listitem>
        <para>P. Entonces, &iquest;Porqu&eacute; usar los ports?</para>
    
        <para>R. Por diferentes razones:</para>

        <orderedlist>
          <listitem>
            <para>Las condiciones de la licencia de algunos programas requieren
            que sean distribuidos como c&oacute;digo fuente y no en formato
            binario.</para>
          </listitem>
  
          <listitem>
            <para>Algunas personas no conf&iacute;an en las distribuciones
            binarias. Al menos, con el c&oacute;digo fuente puedes (en
            teor&iacute;a) repasarlo y detectar problemas potenciales
            t&uacute; mismo.</para>
          </listitem>

          <listitem>
            <para>Si tienes algunos parches locales, necesitas el c&oacute;digo
            fuente para poder a&ntilde;adirlos t&uacute; mismo.</para>
          </listitem>

          <listitem>
            <para>Posiblemente tengas opiniones diferentes a las de otros 
            usuarios en lo que respecta a las opciones de optimizaci&oacute;n
            en la compilaci&oacute;n, creaci&oacute;n de versiones de debug, 
            etc.</para>
          </listitem>

          <listitem>
            <para>A algunos usuarios les gusta tener el c&oacute;digo fuente
            para poder leerlo, retocarlo, destrozarlo (dentro de los 
            t&eacute;rminos de la licencia, claro), y cosas as&iacute;.</para>
          </listitem>
        </orderedlist>
      </listitem>

      <listitem>
        <para><anchor id="ports-patch"> P. &iquest;Qu&eacute; es un patch 
        (parche)?</para>

        <para>R. Un parche es un peque&ntilde;o fichero (normalmente) que
        especifica como pasar de una versi&oacute;n de un archivo a otra.
        Contiene texto que especifica cosas como &ldquo;borrar l&iacute;nea
        23&rdquo;, &ldquo;a&ntilde;adir estas dos l&iacute;neas despu&eacute;s
        de la l&iacute;nea 468&rdquo; o &ldquo;cambia la l&iacute;nea 197
        por esta&rdquo;. Tambi&eacute;n se conoce como &ldquo;diff&rdquo; ya 
        que se genera por un programa llamado as&iacute;.</para>
      </listitem>

      <listitem>
        <para><anchor id="ports-tarball"> P. Qu&eacute; es un tarball?</para>

        <para>R. Es un archivo terminado en <filename>.tar</filename> o
        <filename>.tar.gz</filename> (con variaciones como
        <filename>.tar.Z</filename>, o tambi&eacute;n <filename>.tgz</filename>
        si intentas adecuar el nombre del archivo a un sistema de archivos
        DOS).</para>

        <para>B&aacute;sicamente, es un &aacute;rbol de directorios que ha
        sido archivado en un solo fichero (<filename>.tar</filename>) y
        opcionalmente comprimido (<filename>.gz</filename>). Esta 
        t&eacute;cnica se us&oacute; originalmente para 
        <emphasis>T</emphasis>ape <emphasis>AR</emphasis>chives (archivos de
        cinta) y de aqu&iacute; el nombre <command>tar</command>, pero ahora
        es de uso general en la distribuci&oacute;n deil c&oacute;digo
        fuente de programas a trav&eacute;s de Internet.</para>

        <para>Puedes ver que archivos hay en ellos, o bi&eacute;n extraerlos
        t&uacute; mismo, usando el programa est&aacute;ndar de Unix tar, 
        incluido en el sistema base de FreeBSD, as&iacute;:</para>

        <screen>&prompt.user; <userinput>tar tvzf foobar.tar.gz</userinput>

&prompt.user; <userinput>tar xzvf foobar.tar.gz</userinput>
&prompt.user; <userinput>tar tvf foobar.tar</userinput>
&prompt.user; <userinput>tar xvf foobar.tar</userinput></screen>
      </listitem>

      <listitem>
        <para><anchor id="ports-checksum">P. &iquest;Y el checksum?</para>

        <para>R. Es un n&uacute;mero que se genera a partir de todo el
        contenido del archivo que quieres chequear. Si cambia alguno de
        los car&aacute;cteres, el checksum no ser&aacute; el mismo, as&iacute;
        que una simple comparaci&oacute;n te permitir&aacute; conocer la
        diferencia.</para>
      </listitem>

      <listitem>
        <para>P. He hecho lo que indicais para <link linkend="ports-cd">
        compilar los ports desde el CDROM</link> y todo ha funcionado 
        bi&eacute;n hasta que he intentado instalar el port kermit:</para>

        <screen>&prompt.root; <userinput>make install</userinput>
&gt;&gt; cku190.tar.gz doesn't seem to exist on this system.
&gt;&gt; Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.</screen> 

        <para>&iquest;Porqu&eacute; no puedo encontrarlo?</para>

        <para>R. Los t&eacute;rminos de la licencia del programa kermit no nos
        permiten incluir el tarball en el CDROM, as&iacute; que tendr&aacute;s
        que bajarlo a mano. La raz&oacute;n por la que han salido esos errores
        es que no estabas conectado a Internet en el momento de la 
        instalaci&oacute;n. Una vez lo hayas bajado de cualquiera de los
        servidores arriba mencionados, puedes empezar de nuevo el proceso
        (intenta escoger el servidor m&aacute;s cercano a t&iacute; para
        ganar tiempo y ahorrar ancho de banda de Internet).</para>
      </listitem>

      <listitem>
        <para>P. He hecho lo que explicais, pero cuando intento poner el
        archivo en <filename>/usr/ports/distfiles</filename> aparece un error
        que indica que no tengo permisos.</para>

        <para>R. El mecanismo de ports busca el tarball en 
        <filename>/usr/ports/distfiles</filename>, pero no podr&aacute;s copiar
        nada ah&iacute; por que es un link al CDROM, el cual es de s&oacute;lo
        lectura. Puedes indicar que busque el port en cualquier otro
        directorio haciendo</para>

        <screen>&prompt.root; <userinput>make DISTDIR=<replaceable>/where/you/put/it</replaceable> install</userinput></screen>
      </listitem>

      <listitem>
        <para>P. &iquest;S&oacute;lo funciona el esquema de ports si 
        est&aacute;n en <filename>/usr/ports</filename>? Mi administrador de
        sistema dice que tengo que poner los archivos en
        <filename>/u/people/guests/wurzburger</filename>, pero parece que 
        as&iacute; no funciona.</para>

        <para>R. Puedes usar las variables <makevar>PORTSDIR</makevar> y
        <makevar>PREFIX</makevar> para indicarle al mecanismo de ports que
        use directorios diferentes. Por ejemplo,</para>

        <screen>&prompt.root; <userinput>make PORTSDIR=/u/people/guests/wurzburger/ports install</userinput></screen>

        <para>compilar&aacute; el port en
        <filename>/u/people/guests/wurzburger/ports</filename> e 
        instalar&aacute; todos los archivos bajo
        <filename>/usr/local</filename>.</para>

        <screen>&prompt.root; <userinput>make PREFIX=/u/people/guests/wurzburger/local install</userinput></screen>

        <para>compilar&aacute; el port en <filename>/usr/ports</filename> y
        lo instalar&aacute; en 
        <filename>/u/people/guests/wurzburger/local</filename>.</para>

        <para>Y por supuesto</para>

        <screen>&prompt.root; <userinput>make PORTSDIR=.../ports PREFIX=.../local install</userinput></screen>

        <para>combinar&aacute; los dos (es demasiado extenso para escribirlo
        en la p&aacute;gina, pero seguro que te haces una idea).</para>

        <para>Si no quieres tener que teclear todo esto cada vez que instalas
        un ports, es una buena idea poner estas variables como variables de
        entorno.</para>
      </listitem>

      <listitem>
        <para>P. No tengo el CDROM de FreeBSD pero me gustar&iacute;a disponer
        de todos los tarball en mi sistema para no tener que esperar a que
        se bajen de Internet cada vez que instalo un port. Hay alguna manera
        sencilla de hacerlo?</para>

        <para>R. Para obtener todos los tarball de la colecci&oacute;n completa
        de ports haz</para>

        <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make fetch</userinput></screen>

        <para>Para todos los tarball de un directorio de ports, haz</para>

        <screen>&prompt.root; <userinput>cd /usr/ports/<replaceable>directory</replaceable></userinput>
&prompt.root; <userinput>make fetch</userinput></screen>

        <para>y para un solo port, bueno, creo que ya lo has adivinado.</para>
      </listitem>

      <listitem>
        <para>P. S&eacute; que probablemente es m&aacute;s r&aacute;pido 
        obtener los tarballs desde un mirror de FreeBSD cercano. &iquest;Hay
        alguna manera de obtener los ports de otros servidores diferentes a los
        establecidos en MASTER_SITES?</para>

        <para>R. S&iacute;. Si sabes, por ejemplo que <hostid
        role="fqdn">ftp.FreeBSD.ORG</hostid> te es m&aacute;s cercano que los
        servidores listados en <makevar>MASTER_SITES</makevar>, haz como en el
        siguiente ejemplo.</para>

        <screen>&prompt.root; <userinput>cd /usr/ports/<replaceable>directory</replaceable></userinput>
&prompt.root; <userinput>make MASTER_SITE_OVERRIDE=ftp://ftp.FreeBSD.ORG/pub/FreeBSD/ports/distfiles/ fetch</userinput></screen>
      </listitem> 

      <listitem>
        <para>P. Quiero saber que ficheros va a necesitar el programa 
        <command>make</command> antes de que intente bajarlos.</para>

        <para>R. <command>make fetch-list</command> mostrar&aacute; una lista
        de los ficheros necesarios para el port.</para>
      </listitem>

      <listitem>
        <para>P. &iquest;Hay alguna manera de parar la compilaci&oacute;n del
        port?. Quiero hacer algunos retoques en el c&oacute;digo fuente antes
        de instalarlo, pero es un poco pesado tener que estar atento y pulsar
        control-C cada vez.</para>

        <para>R. Ejecutando <command>make extract</command>, el port 
        parar&aacute; despu&eacute;s de haber obtenido y extraido el 
        c&oacute;digo fuente.</para>
      </listitem>

      <listitem>
        <para>P. Estoy intentando crear mi propio port y quiero poder parar
        la compilaci&oacute;n hasta poder asegurarme de que mis parches
        funcionan correctamente. &iquest;Hay alguna comando como
        <command>make extract</command>, pero para parches?</para>

        <para>R. S&iacute;, <command>make patch</command> es lo que quieres.
        Probablemente tambi&eacute;n encontrar&aacute;s muy &uacute;til la
        opci&oacute;n <makevar>PATCH_DEBUG</makevar>. Y ya de paso, gracias
        por el esfuerzo!.</para>
      </listitem>

      <listitem>
        <para>P. He oido que algunas opciones de compilaci&oacute;n pueden 
        causar errores. &iquest;Es cierto?. &iquest;C&oacute;mo puedo
        asegurarme de que compilo los ports con las opciones correctas?.</para>

        <para>R. S&iacute;, con la versi&oacute;n 2.6.3 de 
        <command>gcc</command> (la versi&oacute;n incluida en FreeBSD 2.1.0 y
        2.1.5), la opci&oacute;n <option>-O2</option> puede crear problemas
        a no ser que uses tambi&eacute;n la opci&oacute;n
        <option>-fno-strength-reduce</option>. (Muchos de los ports no usan
        <option>-O2</option>). <emphasis>Deber&iacute;s</emphasis> poder
        especificar las opciones de compilaci&oacute;n con algo como</para>

        <screen>&prompt.root; <userinput>make CFLAGS='-O2 -fno-strength-reduce'install</userinput></screen>

       <para>o editando el fichero <filename>/etc/make.conf</filename>, pero
       desafortunadamente no todos los ports respetan esto. La forma m&aacute;s
       segura es hacer <command>make configure</command>, entrar en el 
       directorio de los fuentes e inspeccionar a mano los Makefiles, pero 
       puede ser muy tedioso si los fuentes tienen muchos subdirectorios, cada 
       uno con su propio Makefile.</para>
     </listitem>

     <listitem>
       <para>P. Hay tantos ports que resulta complicado encontrar el que 
       quiero. &iquest;Hay alguna lista de los ports disponibles?</para>

       <para>R. Mira el archivo <filename>INDEX</filename> en 
       <filename>/usr/ports</filename>. Tambi&eacute;n puedes hacer
       b&uacute;squedas de palabras en la colecci&oacute;n de ports. Por
       ejemplo puedes encontrar ports referentes al lenguaje de 
       programaci&oacute;n LISP usando:</para>

        <screen>&prompt.user; <userinput>cd /usr/ports</userinput>
&prompt.user; <userinput>make search key=lisp</userinput></screen>
      </listitem>

      <listitem>
        <para>P. Iba a instalar el port <literal>foo</literal> pero de pronto
        el sistema par&oacute; la compilaci&oacute;n y comenz&oacute; a 
        compilar el port <literal>bar</literal>. &iquest;Qu&eacute; 
        est&aacute; pasando?</para>

        <para>R. El port <literal>foo</literal> necesita algo que ofrece el
        port <literal>bar</literal>, por ejemplo, si <literal>foo</literal>
        usa gr&aacute;ficos, <literal>bar</literal> puede tener 
        librer&iacute;as con rutinas de procesamiento gr&aacute;fico 
        &uacute;tiles. O puede ser que <literal>bar</literal> sea una
        herramienta necesaria para compilar el port <literal>foo</literal>.
        </para>
      </listitem>

      <listitem>
        <para><anchor id="ports-remove">P. Instal&eacute; el programa
        <literal>grizzle</literal> desde los ports, y, francamente, me parece
        una p&eacute;rdida de espacio en disco, Quiero borrarlo pero no 
        s&eacute; d&oacute;nde est&aacute;n todos los ficheros.
        &iquest;alguna idea?</para>

        <para>R. No hay problema, s&oacute;lo haz</para>

        <screen>&prompt.root; <userinput>pkg_delete grizzle-6.5</userinput></screen>
      </listitem>

      <listitem>
        <para>P. Espera un momento; necesitas saber el n&uacute;mero de 
        versi&oacute;n para usar ese comando. No creer&aacute;s que voy a ser
        capaz de recordarlo, &iquest;no?</para>

        <para>R. No, desde luego. Puedes encontrar el n&uacute;mero de
        versi&oacute;n haciendo</para>

        <screen>&prompt.root; <userinput>pkg_info -a | grep grizzle</userinput>
Information for grizzle-6.5:
grizzle-6.5 - the combined piano tutorial, LOGO interpreter and shoot 'em up arcade game.</screen>
      </listitem>

      <listitem>
        <para>P. Hablando de espacio en disco, el directorio de ports parece
        que cada vez ocupa m&aacute;s espacio. &iquest;Es recomendable
        borrar cosas?</para>

        <para>R. S&iacute;, si ya tienes instalado el programa y crees que no
        vas a necesitarlo de nuevo. La mejor manera de hacerlo es</para>

        <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make clean</userinput></screen>

        <para>lo que entrar&aacute; en todos los subdirectorios de ports y
        borrar&aacute; todo excepto el esqueleto de cada port.</para>

      </listitem>

      <listitem>
        <para>P. He hecho lo que comentais y todav&iacute;a tengo todos esos
        tarballs o como le llameis en el directorio 
        <filename>distfiles</filename>. &iquest;Puedo borrar esos archivos?
        </para>

        <para>R. S&iacute;, si est&aacute;s seguro de haber terminado con
        ellos.</para>
      </listitem>

      <listitem>
        <para>P. Me gusta tener muchos programas para poder jugar con ellos.
        &iquest;Hay alguna manera de instalar todos los ports de una vez?
        </para>

        <para>R. S&oacute;lo haz</para>

        <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make install</userinput></screen>
      </listitem>

      <listitem>
        <para>P. Bi&eacute;n, lo he intentado, pero pensando que tardar&iacute;a
        mucho me fu&iacute; a dormir y cuando he vuelto esta ma&ntilde;na he
        visto que s&oacute;lo hab&iacute;a instalado tres ports y medio.
        &iquest;Ha ido algo mal?</para>

        <para>R. No, el problema es que algunos ports necesitan hacer preguntas
        que no podemos responder por t&iacute; y necesitan tener a alguien
        "a mano" para poder responderlas.</para>
      </listitem> 

      <listitem>
        <para>P. Realmente, no quiero perder todo un d&iacute;a delante del
        monitor. &iquest;Alguna idea mejor?</para>

        <para>R. Bueno, haz esto antes de irte a dormir</para>

        <screen>&prompt.root <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make -DBATCH install</userinput></screen>

        <para>Esto instalar&aacute; todos los ports que <emphasis>no</emphasis>
        requieran participaci&oacute;n por parte del usuario. Entonces, 
        cuando vuelvas haz</para>

        <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make -DIS_INTERACTIVE install</userinput></screen>

        <para>para terminar el trabajo.</para>
      </listitem>

      <listitem>
        <para>P. En el trabajo, estamos usando el programa
        <literal>frobble</literal>, que est&aacute; en la colecci&oacute;n de
        ports, pero lo hemos alterado un poco para cubrir nuestras necesidades.
        &iquest;Hay alguna manera sencilla de hacer nuestros propios packages
        de manera que podamos distribuirlos m&aacute;s f&aacute;cilmente en
        nuestros servidores?</para>

        <para>R. No hay problema, asumiendo que sabes como hacer los parches
        para tus cambios:</para>

        <screen>&prompt.root; <userinput>cd <replaceable>/usr/ports/somewhere/frobble</replaceable></userinput>
&prompt.root; <userinput>make extract</userinput>
&prompt.root; <userinput>cd work/frobble-2.8</userinput>
[Apply your patches]
&prompt.root; <userinput>cd ../..</userinput>
&prompt.root; <userinput>make package</userinput></screen>
      </listitem>

      <listitem>
        <para>P. Este sistema de ports es realmente fant&aacute;stici. Estoy
        desesperado por saber como lo habeis hecho. &iquest;Cu&aacute;l es el 
        secreto?</para>

        <para>R. No hay nada secreto, lo tienes todo en los ficheros
        <filename>bsd.ports.mk</filename> y 
        <filename>bsd.ports.subdir.mk</filename> en tu directorio de <ulink
        URL="file://localhost/usr/share/mk/">makefiles.</ulink></para>

        <note>
          <para>Los lectores con aversi&oacute;n a intrincados shell-scripts
          est&aacute;n avisados de no seguir este link...)</para>
        </note>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 id="porting">
    <title>Haciendo t&uacute; mismo un port</title>

    <para><emphasis>Contribuido por &a.jkh;, &a.gpalmer;, &a.asami; &a.obrien;
    y &a.hoek;. 28 de Agosto de 1996.</emphasis></para>

    <para>As&iacute; que, &iquest;ahora est&aacute;s interesado en hacer un
    port?. Bi&eacute;n!</para>

    <para>Lo que viene a continuaci&oacute;n son algunas gu&iacute;s para crear
    un nuevo port para FreeBSD. La mayor&iacute;a del trabajo es hecha por el
    fichero <filename>/usr/ports/Mk/bsd.port.mk</filename> que incluyen todos
    los Makefile de los ports. Por favor, mira en este fichero para m&aacute;s
    informaci&oacute;n sobre la manera de trabajar de la colecci&oacute;n de
    ports. Aunque no uses los Makefiles de manera habitualm, est&aacute; 
    bi&eacute;n comentado, y podr&aacute;s conocer una gran cantidad de cosas
    a trav&eacute;s de &eacute;l.</para>

    <note>
      <para>S&oacute;lo una peque&ntilde;a parte de las variables 
      sobreescribibles (<makevar><replaceable>VAR</replaceable></makevar>)
      se mencionan en este documento. Muchas (si no todas) est&aacute;n
      documentadas al inicio del fichero <filename>bsd.port.mk</filename>.
      Este fichero usa una tabulaci&oacute;n no est&aacute;ndar.
      <application>Emacs</application> y <application>Vim</application>
      deber&iacute;n reconocer la configuraci&oacute;n al cargar el fichero.
      <command>vi</command> or <command>ex</command> se pueden configurar
      para que usen los valores correctos tecleando 
      <command>:set tabstop=4</command> una vez que el fichero ha sido
      cargado.</para>
    </note>

    <sect2>
      <title>Haciendo Ports r&aacute;pidamente</title>
   
      <para>Esta secci&oacute;n te explica c&oacute;mo hacer un port
      r&aacute;pidamente. En muchos casos no es suficiente, pero ya lo iremos
      viendo.</para>

      <para>Primero, obt&eacute;n el tarball original y ponlo en
      <makevar>DISTDIR</makevar>, que por defecto apunta a 
      <filename>/usr/ports/distfiles</filename>.</para> 

      <note>
        <para>Los siguientes comentarios asumen que el software compila
        sin problema alguno en FreeBSD, y no se requiere absolutamente
        ning&uacute;n cambio para que el port funcione en tu sistema
        FreeBSD. Si has necesitado modificar alguna cosa, tendr&aacute;s que
        referirte tambi&eacute;n por la siguiente secci&oacute;n.</para>
      </note>

      <sect3>
        <title>Escribiendo el <filename>Makefile</filename></title> 

        <para>El <filename>Makefile</filename> deber&iacute;a ser algo como
        esto:</para>

        <programlisting>
# New ports collection makefile for:   oneko
# Version required:    1.1b
# Date created:        5 December 1994
# Whom:                asami
#
# &#36;Id&#36;
#

DISTNAME=      oneko-1.1b
CATEGORIES=    games
MASTER_SITES=  ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/

MAINTAINER=    asami@FreeBSD.ORG

MAN1=          oneko.1
MANCOMPRESSED= yes
USE_IMAKE=     yes

.include &lt;bsd.port.mk&gt;</programlisting>

        <para>Prueba de entenderlo t&uacute; mismo. No te preocupes por los
        contenidos de la l&iacute;nea <literal>&#36;Id&#36;</literal>, ya 
        que ser&aacute;n completadas automaticamente por el CVS cuando el port
        sea importado a la colecci&oacute;n de ports principal. Puedes 
        encontrar informaci&oacute;n m&aacute;s detallada en la secci&oacute;n
        <link linkend="porting-samplem">Makefile de ejemplo</link>.</para>
      </sect3>

      <sect3>
        <title>Escribiendo los ficheros de descripci&oacute;n</title>

        <para>Hay tres ficheros de descripci&oacute;n que son requeridos por
        cualquier port. Los ficheros son <filename>COMMENT</filename>,
        <filename>DESCR</filename> y <filename>PLIST</filename>. Estos ficheros
        deben estar en el subdirectorio <filename>pkg</filename>.</para>

        <sect4>
          <title><filename>COMMENT</filename></title>

          <para>Descripci&oacute;n corta del port.
          <emphasis>Por favor</emphasis> no incluir el nombre del package
          (o n&uacute;mero de versi&oacute;n del software) en el comentario.
          Aqu&iacute; tienes un ejemplo:</para>

          <programlisting>
A cat chasing a mouse all over the screen.</programlisting>
        </sect4>

        <sect4>
          <title><filename>DESCR</filename></title>

          <para>Esta es una descripci&oacute;n m&aacute;s detallada del
          port. Uno o varios p&aacute;rrafos explicando claramente que
          hace el port es suficiente.</para>

          <note>
            <para>Este <emphasis>no</emphasis> es un manual o una 
            descripci&oacute;n en profundidad de c&oacute;mo usar o compilar
            el port! <emphasis>Por favorm, ten cuidado si lo est&aacute;s
            copiando del <filename>README</filename> o del man</emphasis>. Si
            el software portado tiene una p&aacute;gina web oficial, 
            deber&iacute;as listarlo aqu&iacute;.</para>
          </note>

          <para>Te recomendamos que pongas tu nombre o firma al final de
          este fichero de la manerae siguiente:</para>

          <programlisting>
This is a port of oneko, in which a cat chases a poor mouse all over
the screen.
 :
(etc.)

http://www.oneko.org/

- Satoshi
asami@cs.berkeley.edu</programlisting>
        </sect4>

        <sect4>
          <title><filename>PLIST</filename></title>

          <para>Este fichero lista todos los ficheros instalados por el port.
          Tambi&eacute;n se llama &ldquo;packing list&rdquo; por que el
          package es generado con los ficheros listados aqu&iacute;. Los
          paths son relativos al prefijo de instalaci&oacute;n (normalmente
          <filename>/usr/local</filename> o <filename>/usr/X11R6</filename>).
          Si est&aacute;s usando las variables 
          <makevar>MAN<replaceable>n</replaceable></makevar> (como
          deber&iacute;s hacer), no listes ninguna p&aacute;gina man 
          aqu&iacute;.</para>

          <para>Aqu&iacute; tienes un peque&ntilde;o ejemplo:</para>

          <programlisting>
bin/oneko
lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
@dirrm lib/X11/oneko</programlisting>

          <para>Mira en el man de &man.pkg.create.1; para m&aacute;s detalles
          sobre la "lista de empaquetado".</para>

          <note>
            <para>Deber&iacute;s listar todos los ficheros, pero no los nombres
            de los directorios. De la misma manera, si el port crea directorios
            por s&iacute; mismo durante la instalaci&oacute;n, aseg&uacute;rate
            de a&ntilde;adir las l&iacute;neas <literal>@dirrm</literal>
            cuando sea necesario para eliminarlos cuando el port sea 
            desinstalado.</para>

            <para>Es recomendable que mantengas todos los nobres de fichero en
            este archivo ordenados alfab&eacute;ticamente. Har&aacute; que la
            verificaci&oacute;n de cambios cuando actualices el port sea mucho
            m&aacute;s sencilla.</para>
          </note>
        </sect4>
      </sect3>

      <sect3>
        <title>Creando el fichero de checksum</title>

        <para>Solo teclea <command>make checksum</command>. Las reglas del
        programa make para los ports generar&aacute;n autom&aacute;ticamente
        el fichero <filename>files/md5</filename>.</para>
      </sect3>

      <sect3 id="porting-testing">
        <title>Testeando los ports</title>

        <para>Debes asegurarte de que las reglas de los ports hagan 
        exactamente lo que quieres que hagan, incluyendo el empaquetado
        del port. Estos son los puntos importantes que necesitas verificar:
        </para>

         <itemizedlist>
          <listitem>
            <para><filename>PLIST</filename> no contiene nada que no sea 
            instalado por tu port</para>
          </listitem>

          <listitem>
            <para><filename>PLIST</filename> contiene absolutamente todos
            los ficheros instalados por tu port</para>
          </listitem>

          <listitem>
            <para>Tu port puede ser instalado m&uacute;ltiples veces
            usando el par&aacute;metro <maketarget>reinstall</maketarget></para>
          </listitem>

          <listitem>
            <para>Tu port se <link linkend="porting-cleaning">elimina</link>
            a s&iacute; mismo al usar el par&aacute;metro deinstall</para>
          </listitem>
        </itemizedlist>

        <procedure>
          <title>Orden de test recomendado</title>

          <step>
            <para><command>make install</command></para>
          </step>

          <step>
            <para><command>make package</command></para>
          </step>

          <step>
            <para><command>make deinstall</command></para>
          </step>

          <step>
            <para><command>pkg_add `make package-name`</command></para>
          </step>

          <step>
            <para><command>make deinstall</command></para>
          </step>

          <step>
            <para><command>make reinstall</command></para>
          </step>

          <step>
            <para><command>make package</command></para>
          </step>
        </procedure>

        <para>Aseg&uacute;rate de que no existe ning&uacute;n warning en 
        los comandos <maketarget>package</maketarget> y
        <maketarget>deinstall</maketarget>. Despu&eacute;s del paso 3, mira
        si todos los nuevos directorios han sido eliminados correctamente.
        tambi&eacute;n, intenta usar el software despu&eacute;s del paso 4,
        para asegurarte de que funciona correctamente cuando es instalado desde
        un package.</para>
      </sect3>

      <sect3 id="porting-portlint">
        <title>Probando tu port con <command>portlint</command></title>

        <para>Por favor, usa el comando <command>portlint</command> para
        ver si tu port cumple nuestras normas. El programa 
        <command>portlint</command> forma parte de la colecci&oacute;n de
        ports. En particular, debes probar que el 
        <link linkend="porting-samplem">Makefile</link> es correcto y que el
        <link linkend="porting-pkgname">package</link> es nombrado
        apropiadamente.</para>
      </sect3>

      <sect3 id="porting-submitting">
        <title>Enviando un port</title>

        <para>Primero, aseg&uacute;rate de haber leido la secci&oacute;n
        <link linkend="porting-dads">Do's and Dont's</link>.</para>

        <para>Ahora que ya tienes tu port, solo queda incluirlo en la 
        colecci&oacute;n de ports principal de FreeBSD y que todo el mundo
        lo tenga a su alcance. No necesitamos tu directorio 
        <filename>work</filename> o el archivo de package 
        <filename>pkgname.tgz</filename>, as&iacute; que b&oacute;rralos
        ahora. A continuaci&oacute;n, simplemente incluye la salida de
        <command>shar `find port_dir`</command> en un "bug report" y 
        envialo con el programa &man.send-pr.1; (mira en 
        <link linkend="contrib-general">Bug Reports y comentarios generales</link> para m&aacute;s informaci&oacute;n sobre &man.send-pr.1;. Si el port
        descomprimido es mayor de 20Kb deber&iacute;as comprimirlo en un 
        fichero tar y usar el comando &man.uuencode.1; antes de incluirlo en
        el bug report. Clasifica el bug report en la categor&iacute;a 
        <literal>ports</literal> y clase <literal>change-request</literal>.
        No marques el port como <literal>confidencial</literal>!)</para>

        <para>Una vez m&aacute;s, <emphasis>no incluyas el c&oacute;digo
        fuente original, el directorio <filename>work</filename>, o el 
        package creado con <command>make package</command></emphasis>.</para>

        <note>
          <para>En el pasado, te recomendabamos enviar el nuevo port a nuestro
          servidor ftp (<hostid role="fqdn">ftp.freebsd.org</hostid>). Esto
          ya no es recomendando ya que el permiso de lectura se ha desactivado
          en el directorio <filename>incoming</filename> por la cantidad de
          software pirata que se enviaba.</para>
        </note>

        <para>Miraremos tu port, nos pondremos en contacto contigo si es
        necesario y lo a&ntilde;adiremos en la colecci&oacute;n principal.
        Tu nombre aparecer&aacute; en la lista
        &ldquo;Additional FreeBSD contributors&rdquo; en el Handbook de
        FreeBSD y otros ficheros. &iquest;No es genial?!? <!-- smiley
        -->:)</para>
      </sect3>
    </sect2>

    <sect2>
      <title>Ports paso a paso</title>

      <para>Bi&eacute;n, as&iacute; que no ha sido tan simple, y el port
      ha necesitado algunas modificaciones para funcionar. En esta
      secci&oacute;n, explicaremos, paso a paso, como modificarlo para
      que pueda funcionar en el entorno de los ports.</para>

     <sect3>
       <title>C&oacute;como funcionan las cosas</title>

       <para>Primero, esta es la secuencia de eventos que ocurren cuando
       un usuario teclea <command>make</command> en el directorio de ports.
       Si tienes otra ventana con el fichero <filename>bsd.port.mk</filename>
       te resultar&aacute; m&aacute;s sencillo entender todo el proceso.</para>

       <para>Pero no te preocupes si realmente no entiendes todo lo que
       hace el fichero <filename>bsd.port.mk</filename>... no hay mucha gente
       que realmente lo entienda...
       <!-- smiley --><emphasis>:&gt;</emphasis></para>

       <procedure>
         <step>

           <para>El objeto <maketarget>fetch</maketarget> es ejecutado. El
           objeto <maketarget>fetch</maketarget> es el responsable de asegurar
           que el tarball necesario existe localmente en el directorio 
           <makevar>DISTDIR</makevar>. Si <maketarget>fetch</maketarget>
           no puede encontrar los ficheros requeridos en 
           <makevar>DISTDIR</makevar> localizar&aacute; el URL de
           <makevar>MASTER_SITES</makevar>, la cual existe en el Makefile,
           al igual que en nuestro servidor principal ftp <ulink
           URL="ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/">ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/</ulink>,
           que usamos como servidor de backup. A continuaci&oacute;n 
           intentar&aacute; obtener el archivo de la distribuci&oacute;n
           con <makevar>FETCH</makevar>, asumiendo que el servidor de
           origen tiene conexi&oacute;n directa a Internet. Si este paso
           termina correctamente, grabar&aacute; el archivo en 
           <makevar>DISTDIR</makevar> para su uso futuro.</para>
         </step>

         <step>
           <para>El objeto <maketarget>extract</maketarget> es ejecutado.
           Busca el archivo de distribuci&oacute;n del port 
           (normalmente un tarball comprimido con gzip) en
           <makevar>DISTDIR</makevar> y lo descomprime en un sibdirectorio
           temporal especificado por la variable <makevar>WRKDIR</makevar>
           (normalmente <filename>work</filename>).</para>
         </step>

         <step>
           <para>Se ejecuta el objeto <maketarget>patch</maketarget>. Primero
           se aplican todos los parches definidos en 
           <makevar>PATCHFILES</makevar>. A continuaci&oacute;n, si no se
           han encontrado parches en <makevar>PATCHDIR</makevar> (que por
           defecto est&aacute; definido como el subdirectorio
           <filename>patches</filename>), son aplicados en orden
           alfab&eacute;tico.</para>
         </step>

         <step>
           <para>Se ejecuta el objeto <maketarget>configure</maketarget>.
           Este puede hacer cualquiera de las siguientes funciones.</para>

           <orderedlist>
             <listitem>
               <para>Si existe, se ejecuta 
               <filename>scripts/configure</filename>.</para>
             </listitem>

             <listitem>
               <para>Si <makevar>USE_IMAKE</makevar> est&aacute;
               definido, se ejecuta <makevar>XMKMF</makevar> (por
               defecto: <command>xmkmf -a</command>).</para>
             </listitem>
           </orderedlist>
         </step>

         <step>
           <para>Se ejecuta el objeto <maketarget>build</maketarget>. Este es
           responsable de descender por los directorios de trabajo privados
           del port (<makevar>WRKSRC</makevar>) y compilarlos. Si se ha
           definido <makevar>USE_GMAKE</makevar> se usa el comando
           <command>make</command>, en caso contrario, se usar&aacute; el 
           comando de sistema <command>make</command>.</para>
         </step>
       </procedure>

       <para>Las anteriores, son las acciones por defecto. Adem&aacute;s,
       puedes definir los objetos 
       <maketarget>pre-<replaceable>algo</replaceable></maketarget> o
       <maketarget>post-<replaceable>something</replaceable></maketarget>,
       o poner scripts con esos nombres. En el subdirectorio 
       <filename>scripts</filename>, y ser&aacute;n ejecutados antes o
       despu&eacute;s de las acciones por defecto.</para>

       <para>Por ejemplo, si tienes definido un objeto 
       <maketarget>post-extract</maketarget> en tu Makefile, y un fichero
       <filename>pre-build</filename> en el subdirectorio
       <filename>scripts</filename>, el objeto 
       <maketarget>post-extract</maketarget> ser&aacute; llamado despu&eacute;s
       de las acciones de extracci&oacute;n regulares, y el script
       <filename>pre-build</filename> ser&aacute; ejecutado antes que las
       reglas por defecto de compilaci&oacute;n. Es recomendable que uses
       objetos de <filename>Makefile</filename> en caso de que las acciones
       a realizar sean suficientemente simples, ya que as&iacute; 
       resultar&aacute; mucho m&aacute;s sencillo saber que tipo de acciones
       no regulares requiere el port.</para>

       <para>Las acciones por defecto son ejecutadas por los objetos
       <maketarget>do-<replaceable>something</replaceable></maketarget> del
       fichero <filename>bsd.port.mk</filename>. Por ejemplo, los mandatos
       para extraer un port est&aacute;n en el objeto 
       <maketarget>do-extract</maketarget>. Si necesitas algo no incluido
       en el objeto por defecto, puedes solucionarlo redefiniendo el objeto
       <maketarget>do-<replaceable>something</replaceable></maketarget> en
       tu <filename>Makefile</filename>.</para>

       <note>
         <para>Los objetos &ldquo;principales&rdquo; (por ejemplo,
         <maketarget>extract</maketarget>,
         <maketarget>configure</maketarget>, etc.) no hacen nada m&aacute;s
         que asegurar que se han completado todos los procesos y llamar a los
         objetos o scripts reales, y no se espera que sean modificados. Si
         quieres modificar la extracci&oacute;n, cambia el objeto
         <maketarget>do-extract</maketarget>, pero nunca modifiques
         el objeto <maketarget>extract</maketarget>!</para>
       </note>

       <para>Ahora que entiendes lo que pasa cuando un usuario teclea
       <command>make</command>, d&eacute;janos explicarte los pasos
       recomendados para crear el port perfecto.</para>
    </sect3>

    <sect3>
      <title>Obteniendo los fuentes originales</title>

      <para>Obt&eacute;n los fuentes originales (normalmente) en un 
      archivo comprimido 
      (<filename><replaceable>foo</replaceable>.tar.gz</filename> o
      <filename><replaceable>foo</replaceable>.tar.Z</filename>) y copialo
      en el directorio <makevar>DISTDIR</makevar>. Usa siempre d&oacute;nde
      y cuando puedas los fuentes procedentes del servidor 
      <emphasis>principal</emphasis> de la distribuci&oacute;n.</para>

      <para>Si no puedes encontrar un servidor ftp/http con una buena
      conexi&oacute;n a Internet, o s&oacute;lo encuentras servidores
      que tienen los fuentes en irritantes formatos no est&aacute;ndar,
      puedes poner una copia funcional del archivo en un servidor ftp
      o http bajo tu control (tu p&aacute;gina personal, por ejemplo).
      Aseg&uacute;rate de usar el valor correcto en la variable
      <makevar>MASTER_SITES</makevar> para que refleje tu elecci&oacute;n.
      </para>

      <para>Si no puedes encontrar ning&uacute;n lugar en el que poner
      el fichero de distribuci&oacute;n (si eres committer de FreeBSD,
      puedes ponerlo en el directorio <filename>public_html/</filename>
      del servidor <hostid>freefall</hostid>), nosotros podemos
      albergarlo en
      <filename>ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/LOCAL_PORTS/</filename>
      como &uacute;ltimo recurso. Por favor, usa la variable
      <makevar>MASTER_SITE_LOCAL</makevar> para referirte a este servidor y
      subdirectorio. Env&iacute;a un mail a &a.ports; si no est&aacute;s 
      seguro de qu&eacute; hacer.</para>

      <para>Si tu archivo de distribuci&oacute;n cambia continuamente sin
      una buena raz&oacute;n, considera poner el archivo en tu p&aacute;gina
      personal y listarlo como el primer <makevar>MASTER_SITES</makevar>.
      Esto evitar&aacute; que los usuarios obtengan errores del tipo
      <errorname>checksum mismatch</errorname>, y tambi&eacute;n 
      reducir&aacute; la carga de trabajo de las personas que hacen el 
      mantenimiento de nuestro servidor FTP. De la misma manera, si existe un
      solo servidor como distribuidor principal del programa, es
      recomendable que albergues una copia de la distribuci&oacute;n en
      tu servidor y lo listes como segundo 
      <makevar>MASTER_SITES</makevar>.</para>

      <para>Si tu port requiere algunos parches adicionales que est&aacute;n
      disponibles en Internet, b&aacute;jalos y ponlos en
      <makevar>DISTDIR</makevar>. No te preocupes si provienen de un 
      lugar diferente del que obtuviste el tarball principal, tenemos una
      manera de solucionar este problema (consulta la descripci&oacute;n de
      <link linkend="porting-patchfiles">PATCHFILES</link>).</para>
    </sect3>

    <sect3>
      <title>Modificando el port</title>

      <para>Descomprime una copia del tarball en un directorio privado y
      haz todos los cambios necesarios para que el port compile en la
      versi&oacute;n actual de FreeBSD. Mant&eacute;n <emphasis>una lista
      completa</emphasis> de todas las modificaciones que realizas para
      poder automatizar el proceso. Todo, incluyendo borrar, a&ntilde;adir
      o modificar ficheros debe poder hacerse de manera autom&aacute;tica
      usando un script o parche.</para>

      <para>Si tu port requiere una importante interacci&oacute;n o
      personalizaci&oacute;n para compilar o instalar, puedes mirar la
      cl&aacute;sica aplicaci&oacute;n <application>Configure</application>
      de Larry Wall y hacer algo as&iacute; tu mismo. El objetivo de la
      nueva colecci&oacute;n de ports es hacer que cada port sea tan
      &ldquo;plug-and-play&rdquo; como sea posible para el usuario final,
      usando el m&iacute;nimo espacio en disco posible.</para>

      <note>
        <para>Aunque no se haya mencionado expl&iacute;citamente, los
        parches, scripts y otros archivos que hayas creado o contribuido
        a la colecci&oacute;n de ports de FreeBSD est&aacute;n cubiertos
        por las condiciones est&aacute;ndar del copyright BSD.</para>
      </note>
    </sect3>

    <sect3>
      <title>Parcheando</title>

      <para>En la preparaci&oacute;n del port, los archivos que han sido
      a&ntilde;didos o modificados pueden recorrerse con un diff recursivo.
      Cada serie de parches que quieras aplicar deben estar integrados en un
      archivo llamado 
      <filename>patch-<replaceable>xx</replaceable></filename> donde
      <replaceable>xx</replaceable> marca la secuencia en que los parches
      ser&aacute;n aplicados &mdash; &eacute;stos se aplican en 
      <emphasis>&oacute;rden alfab&eacute;tico</emphasis>, as&iacute;
      primero ser&aacute; <literal>aa</literal>, segundo
      <literal>ab</literal> ,etc. Estos archivos deben estar en 
      <makevar>PATCHDIR</makevar>, desde donde ser&aacute;n 
      autom&aacute;ticamente aplicados. Todos los parches deben ser relativos
      a <makevar>WRKSRC</makevar> (generalmente es el directorio en el que
      se descomprime el port, siendo &eacute;ste el lugar donde se compila).
      Para hacer que la soluci&oacute;n de problemas y actualizaciones sea
      m&aacute;s sencilla, deber&iacute;s evitar tener m&aacute;s de un
      parche aplicable a un mismo archivo (por ejemplo, 
      <filename>patch-aa</filename> y <filename>patch-ab</filename> 
      modificando ambos al archivo 
      <filename><makevar>WRKSRC</makevar>/foobar.c</filename>).</para> 
    </sect3>

    <sect3>
      <title>Configurando</title>

      <para>Incluye cualquier proceso de personalizaci&oacute;n adicional
      en el script <filename>configure</filename> y guardalo en el 
      subdirectorio <filename>scripts</filename>. Como se ha mencionado
      anteriormente, tambi&eacute;n puedes hacer esto como un objeto del
      <filename>Makefile</filename> y/o un script con el nombre
      <filename>pre-configure</filename> o
      <filename>post-configure</filename>.</para>
    </sect3>

    <sect3>
      <title>Gestionando las entradas de usuario</title>

      <para>Si tu port requiere entradas por parte del usuario para la
      compilaci&oacute;n, configuraci&oacute;n o instalaci&oacute;n,
      activa la variable <makevar>IS_INTERACTIVE</makevar> en tu
      Makefile. Esto permitir&aacute; no compilar tu port si el usuario
      usa la variable <envar>BATCH</envar> en su entorno (y si el usuario
      activa la variable <envar>INTERACTIVE</envar>, entonces
      <emphasis>s&oacute;lo</emphasis> ser&aacute;n compilados los ports
      que requieren interacci&oacute;n por parte del usuario).</para>

      <para>Tambi&eacute;n es recomendable desactivar el script interactivo
      si un n&uacute;mero razonable de respuestas por defecto son
      aplicables al port (consultar la variable 
      <makevar>PACKAGE_BUILDING</makevar>). Esto nos permitir&aacute;
      compilar el package para los CD-ROMs y ftp.</para>
    </sect3>
  </sect2>

  <sect2>
    <title>Configurando el Makefile</title>

    <para>Configurar el Makefile es bastante sencillo, y de nuevo, te
    sugerimos que consultes los ejemplos existentes antes de empezar. 
    Tambi&eacute;n hay un 
    <link linkend="porting-samplem">Makefile de ejemplo</link> en este
    handbook, as&iacute; que, consultalo y, por favor, sigue el &oacute;rden
    de las variables y secciones del ejemplo para que tu port sea m&aacute;s
    f&aacute;cil de leer para otras personas.</para>

    <para>Ahora, considera los siguientes problemas a medida que haces
    el dise&ntilde;o de tu nuevo Makefile:</para>

    <sect3>
      <title>Los fuentes originales</title>

      <para>Reside en <makevar>DISTDIR</makevar> como un tarball
      est&aacute;ndar en formato gzip? Si es as&iacute; puedes pasar al
      siguiente paso. En caso contrario, deber&iacute;as considerar la
      posibilidad de sobreescribir alguna de las variables
      <makevar>EXTRACT_CMD</makevar>,
      <makevar>EXTRACT_BEFORE_ARGS</makevar>, 
      <makevar>EXTRACT_AFTER_ARGS</makevar>,
      <makevar>EXTRACT_SUFX</makevar>, o <makevar>DISTFILES</makevar>,
      dependiendo del formato del archivo de distribuci&oacute;n del port.
      (El caso m&aacute;s com&uacute;n es 
      <literal>EXTRACT_SUFX=.tar.Z</literal>, cuando el tarball est&aacute;
      comprimido con compress y no con gzip.)</para>

      <para>En el peor de los casos, puedes crearte tu propio objeto
      <maketarget>do-extract</maketarget> para sobreescribir el objeto
      por defecto.</para>
    </sect3>

    <sect3>
      <title><makevar>DISTNAME</makevar></title>

      <para>El valor de <makevar>DISTNAME</makevar> debe ser el nombre
      base del port. Las reglas por defecto esperan que la lista de archivos
      de la distribuci&oacute;n (<makevar>DISTFILES</makevar>) se llame
      <makevar>DISTNAME</makevar><makevar>EXTRACT_SUFX</makevar>, el cual, si
      es un tarball normal, ser&aacute;a algo como 
      <literal>foozolix-1.0.tar.gz</literal> para usar el valor 
      <literal>DISTNAME=foozolix-1.0</literal>.</para>

      <para>Las reglas por defecto tambi&eacute;n esperan extraer el
      tarball en un subdirectorio llamado 
      <filename>work/<makevar>DISTNAME</makevar></filename>, por ejemplo
      <filename>work/foozolix-1.0/</filename>.</para>

      <para>Todos estos valores pueden sobreescribirse; simplemente muestran
      los valores m&aacute;s habituales. Para un port que requiera 
      m&uacute;ltiples archivos de distribuci&oacute;n, simplemente usa
      expl&iacute;citamente <makevar>DISTFILES</makevar>. Si solo una parte
      de los <makevar>DISTFILES</makevar> son archivos extraibles, entonces
      usa <makevar>EXTRACT_ONLY</makevar> para referenciarlos, lo que 
      sobreescribir&aacute; la lista <makevar>DISTFILES</makevar>
      cuando realice la extracci&oacute;n, y el resto de archivos se 
      dejar&aacute;n en <makevar>DISTDIR</makevar> tal y como est&aacute;n 
      para su uso posterior.</para>

    </sect3>

    <sect3>
      <title><makevar>PKGNAME</makevar></title>

      <para>Si <makevar>DISTNAME</makevar> no sigue las <link
      linkend="porting-pkgname">normas de nombre</link> para un package, 
      deber&iacute;s asignar a la variable <makevar>PKGNAME</makevar> un valor
      m&aacute;s correcto.</para>
    </sect3>

    <sect3>
      <title><makevar>CATEGORIES</makevar></title>

      <para>Cuando se crea un package, se incluye en el directorio
      <filename>/usr/ports/packages/All</filename> creandose links desde uno
      o m&aacute;s subdirectorios de <filename>/usr/ports/packages</filename>.
      Los nombres de estos subdirectorios est&aacute;n especificados por la
      variable <makevar>CATEGORIES</makevar>. Se utiliza para facilitar al
      usuario la orientaci&oacute;n dentro de la colecci&oacute;n de ports y
      packages. Por favor, consulta las <link
      linkend="porting-categories">categor&iacute;as</link> existentes y
      elige las que sean aplicables a tu port.</para>

      <para>Esta lista tambi&eacute;n determina en que lugar del &aacute;rbol
      de ports se importa el port. Si especificas m&aacute;s de una
      categor&iacute;a, se asume que los archivos del port estar&aacute;n en
      el subdirectorio con el nombre en la primera categor&iacute;a.
      Consulta la secci&oacute;n <link
      linkend="porting-categories">categor&iacute;as</link> para saber como
      escoger la catergor&iacute;a adecuada.</para>

      <para>Si tu port pertenece realmente a una categor&iacute;n 
      inexistente, puedes crear una nueva. En este caso, por favor, 
      env&iacute;a un mail a  &a.ports; para proponer una nueva
      categor&iacute;a.</para>

      <note>
        <para>No hay chequeo de error para los nombres de categor&iacute;as.
        <command>make package</command> crear&aacute; un nuevo directorio
        si tecleas mal el nombre de la categor&iacute;, as&iacute; que
        se cuidadoso!</para>
      </note>
    </sect3> 

    <sect3>
      <title><makevar>MASTER_SITES</makevar></title>

      <para>Guarda la parte del directorio del URL -ftp/hhtp que apunta al
      tarball original en <makevar>MASTER_SITES</makevar>. No olvidar la
      barra final (<filename>/</filename>)!</para>

      <para>Las macros <command>make</command> intentaran usar esta
      especificaci&oacute;n para obtener el archivo de distribuci&oacute;n
      con <makevar>FETCH</makevar> si no lo pueden encontrar en el sistema.</para>

      <para>Se recomienda poner diferentes servidores en la lista, preferiblemente
      de continentes diferentes. Esto proteger&aacute; de posibles problemas de red
      en grandes &aacute;reas, y se est&aacute; pensando en la posibilidad de
      a&ntilde;adir soporte para determinar autom&aacute;ticamente el servidor
      principal m&aacute;s cercano para obtener el archivo desde &eacute;l.</para>

      <para>Si el tarball original forma parte de uno de estos servidores populares:
      X-contrib, GNU, Perl CPAN, TeX CTAN o Linux Sunsite, se debe hacer referencia
      a estos servidores usando 
      <makevar>MASTER_SITE_XCONTRIB</makevar>,
      <makevar>MASTER_SITE_GNU</makevar>,
      <makevar>MASTER_SITE_PERL_CPAN</makevar>,
      <makevar>MASTER_SITE_TEX_CTAN</makevar>, y
      <makevar>MASTER_SITE_SUNSITE</makevar>.  Simplemente poner
      <makevar>MASTER_SITE_SUBDIR</makevar> al path interno del servidor. Aqu&iacute;
      hay un ejemplo:</para>

      <programlisting>
MASTER_SITES=         ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR=   applications
      </programlisting>

      <para>El usuario tambi&eacute;n puede usar las variables
      <makevar>MASTER_SITE_*</makevar> en el archivo <filename>/etc/make.conf</filename>
      para sobreescribir nuestras selecciones, y usar en su lugar el mirror que
      prefiera de estos servidores.</para>
    </sect3>

    <sect3 id="porting-patchfiles">
      <title><makevar>PATCHFILES</makevar></title>

      <para>Si el port requiere parches adicionales que est&aacute;n disponibles
      por ftp o http, poner <makevar>PATCHFILES</makevar> a los nombres de archivos
      y <makevar>PATCH_SITES</makevar> a la URL del directorio que los contiene
      (el formato es el mismo que en <makevar>MASTER_SITES</makevar>).</para>

      <para>Si el parche no es relativo a la ra&iacute;z del &aacute;rbol
      (<makevar>WKRSRC</makevar>) porque contiene alguna informaci&oacute;n extra
      sobre paths, usar la variable <makevar>PATCH_DIST_STRIP</makevar>. Por ejemplo,
      si todos los path del parche contienen <literal>foozolix-1.0/</literal> 
      delante del nombre de archivo, usar <literal>PATCH_DIST_STRIP=-p1</literal>.</para>

      <para>No preocuparse si los parches est&aacute;n comprimidos, ser&aacute;n
      descomprimidos autom&aacute;ticamente si el nombre de archivo termina en
      <filename>.gz</filename> o <filename>.Z</filename>.</para>

      <para>Si el parche se distribuye con otros archivos, como documentaci&oacute;n, en
      un tarball gzip, no se puede usar <makevar>PATCHFILES</makevar>. Si este es el caso, 
      a&ntilde;adir el nombre y situaci&oacute;n del tarball a <makevar>DISTFILES</makevar>
      y <makevar>MASTER_SITES</makevar>. A continuaci&oacute;n, desde el objeto
      <maketarget>pre-patch</maketarget>, aplicar el parche ejecutando mandato
      <command>patch</command> desde &eacute;l, el copiando al archivo del parche en 
      el directorio <makevar>PATCHDIR</makevar> llamandolo 
      <filename>patch-<replaceable>xx</replaceable></filename>.</para>

      <note>
        <para>Tener en cuenta que el tarball ser&aacute; extraido del fuente regular, 
        por lo que no es necesario extraerlo expl&iacute;citamente si es un tarball
        comprimido con gzip o compress. Si se hace lo &uacute;ltimo, tener cuidado de
        no sobreescribir algo ya existente en ese directorio. No olvidarse de a&ntilde;adir
        un mandato para borrar el parche copiado en el objeto
        <maketarget>pre-clean</maketarget></para>
      </note>
    </sect3>

    <sect3>
      <title><makevar>MAINTAINER</makevar></title>

      <para>Poner aqu&iacute; la direcci&oacute;n de mail. Por favor. <!-- smiley
      --><emphasis>:)</emphasis></para>

      <para>Para una descripci&oacute;n detallada de la responsabilidad de los
      "maintainers", consultar la secci&oacute;n 
      <link linkend="policies-maintainer">MAINTAINER en Makefiles</link>.</para>
    </sect3>

    <sect3>
      <title>Dependencias</title>

      <para>Muchos ports dependen de otros. Hay cinco variables que se pueden usar para
      asegurar que existen todos los requerimientos necesarios en la m&aacute;quina 
      del usuario. Tambi&eacute;n hay algunas variables de dependencia pre-soportadas
      para casos comunes, mas algunos controles de dependencia.</para>

      <sect4>
        <title><makevar>LIB_DEPENDS</makevar></title>

        <para>Esta variable especifica las librer&iacute;as compartidas de las que
        depende el port. Es una lista de registros de 
        <replaceable>lib</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional> 
        donde <replaceable>lib</replaceable> es el nombre de la librer&iacute;
        compartida, y <replaceable>dir</replaceable> es el directorio en el cual encontrarla
        en caso de no estar disponible y <replaceable>target</replaceable> es el objeto a 
        llamar en ese directorio. Por ejemplo, 
        <programlisting> LIB_DEPENDS=jpeg.9:${PORTSDIR}/graphics/jpeg:install</programlisting>
        comprobar&aacute; la existencia de la librer&iacute;a jpeg versi&oacute;n 9, 
        descendiendo al subdirectorio <filename>graphics/jpeg</filename> de la colecci&oacute;n
        de ports para compilarlo e instalarlo en caso de que no sea encontrado en el 
        sistema. El objeto <replaceable>target</replaceable> puede omitirse si es igual a
        <makevar>DEPENDS_TARGET</makevar> (el cual, por defecto, tiene el valor
        <literal>install</literal>).</para>

        <note>
          <para>La parte <replaceable>lib</replaceable> es un argumento dado a
          <command>ldconfig -r | grep -wF</command>. Es posible que no existan
          expresiones regulares en esta variable.</para>
        </note>

        <para>La dependencia se comprueba dos veces, una durante la ejecuci&oacute;n de
        <maketarget>extract</maketarget> y otra durante la ejecuci&oacute;n de
        <maketarget>install</maketarget>. Tambi&eacute;n, se incluye el nombre de la
        dependencia en el package, de manera que <command>pkg_add</command>
        la instale autom&aacute;ticamente si no est&aacute; en el sistema del usuario.</para>
      </sect4>

      <sect4>
        <title><makevar>RUN_DEPENDS</makevar></title>

        <para>Esta variable especifica ejecutables o archivos de los que depende la
        compilaci&oacute; y/o ejecuci&oacute;n de este port. Es una lista de tuples
        <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
        donde <replaceable>path</replaceable> es el nombre del ejecutable o archivo,
        <replaceable>dir</replaceable> es el directorio en el que encontrarlo en caso
        de no estar disponible y <replaceable>target</replaceable> es el objeto a llamar
        en ese directorio. Si <replaceable>path</replaceable> empieza con una barra
        (<literal>/</literal>), se trata como un archivo comprobando su existencia con
        <command>test -e</command>; en caso contrario, se asume que es un ejecutable, y
        se usa <command>which -s</command> para determinar si el programa existe en el
        path del usuario.</para>

        <para>Por ejemplo,</para>

	  <programlisting>
RUN_DEPENDS=   ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
               wish8.0:${PORTSDIR}/x11-toolkits/tk80</programlisting>

        <para>comprobar&aacute; si existe el directorio o archivo
        <filename>/usr/local/etc/innd</filename>, compilando e instalandolo desde
        el directorio <filename>news/inn</filename> del &aacute;rbol de ports en
        caso de no existir. Tambi&eacute;n se comprueba la existencia del 
        ejecutable <command>wish8.0</command> en el path, descendiendo al subdirectorio
        <filename>x11-toolkits/tk80</filename> de los ports para compilarlo e
        instalarlo si no existe.</para>

        <note>
          <para>En este caso, <command>innd</command> es un ejecutable; si un ejecutable
          est&aacute; situado en un lugar diferente al esperado (fuera del path), es
          necesario incluir el path completo.</para>
        </note>

        <para>La dependencia se comprueba desde el objeto <maketarget>install</maketarget>.
        El nombre de la dependencia tambi&eacute;n es incluido en el package para que
        <command>pkg_add</command> lo instale autom&aacute;ticamente si no existe en el 
        sistema del usuario. La parte <replaceable>target</replaceable> puede omitirse si
        es el mismo <makevar>DEPENDS_TARGET</makevar>.</para>
      </sect4>

      <sect4>
        <title><makevar>BUILD_DEPENDS</makevar></title>

        <para>Esta variable especifica los ejecutables o archivos que este port necesita
        para compilar. Igual que <makevar>RUN_DEPENDS</makevar>, es una lista de tuples
        <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>.
        Por ejemplo, <programlisting> BUILD_DEPENDS=
        unzip:${PORTSDIR}/archivers/unzip</programlisting> comprobar&aacute; la existencia de
        un ejecutable llamado <command>unzip</command>, descendiendo al subdirectorio
        <filename>archivers/unzip</filename> en caso de no existir, para compilarlo e 
        instalarlo.</para>

        <note>
          <para>Compilaci&oacute;n en este caso, se refiere a todo el proceso; desde la
          extracci&oacute;n hasta la compilaci&oacute;n final. La dependencia se comprueba
          en el objeto <maketarget>extract</maketarget>. La parte 
          <replaceable>target</replaceable> puede omitirse si la misma que
          <makevar>DEPENDS_TARGET</makevar></para>
        </note>
      </sect4>

      <sect4>
        <title><makevar>FETCH_DEPENDS</makevar></title>

        <para>Esta variable especifica ejecutables o archivos que se requieren para obtener
        este port. Como los dos anteriores, es una lista de tuples
        <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>.
        Por ejemplo, <programlisting> FETCH_DEPENDS=
        ncftp2:${PORTSDIR}/net/ncftp2</programlisting> comprobar&aacute; la existencia de un
        ejecutable llamado <command>ncftp2</command>, descendiendo al subdirectorio
        <filename>net/ncftp2</filename> de los ports para compilarlo e instalarlo en caso de
        no existir.</para>

        <para>La dependencia es comprobada en el objeto <maketarget>fetch</maketarget>.
        La parte <replaceable>target</replaceable> puede omitirse si es la misma que
        <makevar>DEPENDS_TARGET</makevar>.</para>
      </sect4>

      <sect4>
        <title><makevar>DEPENDS</makevar></title>

        <para>Si hay una dependencia que no se puede incluir en las cuatro categor&iacute;as
        anteriores, o el port necesita tener extraidos los fuentes de otro port para poder
        ser instalado, usar esta variable. Esta es una lista compuesta de
        <replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>,
        ya que no no hay nada que comprobar, al contrario que las cuatro anteriores. La parte
        <replaceable>target</replaceable> puede omitirse si es la misma que
        <makevar>DEPENDS_TARGET</makevar>.</para>
      </sect4>

      <sect4>
        <title>Variables de dependencia comunes</title>

        <para>Definir <literal>USE_XLIB=yes</literal> si el port requiere la instalaci&oacute;n
        del sistema X Window (impl&iacute;cito en <makevar>USE_IMAKE</makevar>). Definir
        <literal>USE_GMAKE=yes</literal> si el port requiere el <command>make</command> de
        GNU en lugar del <command>make</command> de BSD. Definir <literal>USE_AUTOCONF=yes</literal>
        si el port requiere la ejecuci&oacute;n del autoconf de GNU. Definir
        <literal>USE_QT=yes</literal> si el port usa el &uacute;ltimo kit qt. Usar
        <literal>USE_PERL5=yes</literal> si el port requiere la versi&oacute;n 5 del
        lenguaje perl. (Este &uacute;ltimo es especialmente importante ya que unas versiones
        de FreeBSD contienen perl5 como parte del sistema y otras no.)</para>
      </sect4>

      <sect4>
        <title>Notas sobre dependencias</title>

        <para>C&oacute;mo se ha mencionado anteriormente, el objeto por defecto a llamar cuando
        se require una dependencia es <maketarget>DEPENDS_TARGET</maketarget>. Por defecto es
        <literal>install</literal>. Esta es una variable de usuario; nunca se define en los
        <filename>Makefile</filename> de los ports. Si un port necesita gestionar las 
        dependencias de manera especial, usar la parte <literal>:target</literal> de las
        variables <makevar>*_DEPENDS</makevar> en lugar de redefinir
        <makevar>DEPENDS_TARGET</makevar>.</para>

        <para>Cuando se ejecuta <command>make clean</command>, sus dependencias tambi&eacute;n 
        son "limpiadas". Si se quiere evitar esto, hay que definir la variable 
        <makevar>NOCLEANDEPENDS</makevar> en el entorno.</para>

        <para>Para depender incondicionalmente de un port, es imprescindible usar la cadena de
        texto <literal>nonexistent</literal> como primer campo de 
        <makevar>BUILD_DEPENDS</makevar> o <makevar>RUN_DEPENDS</makevar>. Usar esto s&oacute;lo
        cuando es necesario disponer del c&oacute;digo fuente de otro port. Se puede ahorrar
        tiempo de compilaci&oacute;n especificando el objeto. Por ejemplo:

	    <programlisting>
BUILD_DEPENDS=   /nonexistent:${PORTSDIR}/graphics/jpeg:extract</programlisting>

        siempre descender&aacute; al port JPEG y lo extraer&aacute;.</para>

        <para>No usar <makevar>DEPENDS</makevar> a no ser que no exista otra manera de obtener
        los resultados deseados. Har&aacute; que el otro port siempre sea compilado (e
        instalado, por defecto), y la dependencia sea a&ntilde;adia al package. Si esto es lo
        que realmente se necesita, es recomendable usar <literal>BUILD_DEPENDS</literal>
        y <literal>RUN_DEPENDS</literal>.</para>
      </sect4>
    </sect3>    

    <sect3>
      <title>Mecanismos de creaci&oacute;n</title>

      <para>Si el package usa GNU <command>make</command>, definir 
      <literal>USE_GMAKE=yes</literal>. Si el package usa <command>configure</command>, 
      definir <literal>HAS_CONFIGURE=yes</literal>. Si el package usa GNU 
      <command>configure</command>, definir <literal>GNU_CONFIGURE=yes</literal> (esto 
      implica <literal>HAS_CONFIGURE</literal>). Si se quieren pasar argumentos extra a
      <command>configure</command> (el argumento por defecto es
      <literal>--prefix=&dollar;{PREFIX}</literal> para GNU
      <command>configure</command> y vac&iacute;o para no GNU
      <command>configure</command>), definir los argumentos extra en
      <makevar>CONFIGURE_ARGS</makevar>. Si el package usa GNU
      <command>autoconf</command>, definir <literal>USE_AUTOCONF=yes</literal>. Esto
      implica <makevar>GNU_CONFIGURE</makevar>, y causar&aacute; la ejecuci&oacute;n de
      <command>autoconf</command> antes que <command>configure</command>.</para>

      <para>Si el package es una aplicaci&oacute;n X que crea archivos 
      <filename>Makefile</filename>s desde <filename>Imakefile</filename>s
      usando <command>imake</command>, definir <literal>USE_IMAKE=yes</literal>. Esto
      har&aacute; que durante el proceso de configuraci&oacute;n se ejecute el
      mandato <command>xmkmf -a</command>. Si el argumento <option>-a</option> es
      problem&aacute;tico para el port, definir <literal>XMKMF=xmkmf</literal>. Si el
      port usa el mandato <command>imake</command> pero no entiende el objeto
      <maketarget>install.man</maketarget>, definir 
      <literal>NO_INSTALL_MANPAGES=yes</literal>.</para>

      <para>Si el c&oacute;digo fuente incluido en el <filename>Makefile</filename> del
      port tiene algo m&aacute;s que el objeto <maketarget>all</maketarget> como 
      objeto principal de creaci&oacute;n, definir <makevar>ALL_TARGET</makevar>
      correctamente. Hacer lo mismo con <maketarget>install</maketarget> y
      <makevar>INSTALL_TARGET</makevar>.</para>
    </sect3>
  </sect2>

  <sect2>
    <title>Consideraciones especiales</title>

    <para>Hay m&aacute;s cosas a tener en cuenta a la hora de crear un port. Esta
    secci&oacute;n explica las m&aacute;s comunes.</para>

    <sect3 id="porting-ldconfig">
      <title><command>ldconfig</command></title>

      <para>Si el port instala una librer&iacute;a compartida, a&ntilde;adir un objeto
      <maketarget>post-install</maketarget> al <filename>Makefile</filename> para
      que ejecute <literal>&dollar;{LDCONFIG} -m</literal> en el directorio donde
      se ha instalado la nueva librer&iacute;a (normalmente
      <filename><makevar>PREFIX</makevar>/lib</filename>) para registrarla en el 
      cach&eacute; de librer&iacute;as compartido.</para>

      <para>Tambi&eacute;n, a&ntilde;adir un par 
      <literal>@exec /sbin/ldconfig -m</literal> y 
      <literal>@unexec /sbin/ldconfig -R</literal> al archivo <filename>pkg/PLIST</filename>
      para que el usuario que ha instalado el port pueda usar la librer&iacute;a compartida
      inmediatamente. Estas l&iacute;neas deben estar inmediatamente despu&eacute;s de la
      l&iacute;nea de la propia librer&iacute;a compartida, como en:</para>

	<programlisting>
lib/libtvl80.so.1
@exec /sbin/ldconfig -m %D/lib
@unexec /sbin/ldconfig -R</programlisting>

      <para>Nunca, nunca, <emphasis>nunca</emphasis> a&ntilde;adir una l&iacute;nea
      que ponga <literal>ldconfig</literal> sin argumentos en el 
      <filename>Makefile</filename> o <filename>pkg/PLIST</filename>. Esto har&aacute;
      que el cach&eacute; de librer&iacute;as compartidas se resetee s&oacute;lo con
      los contenidos de <filename>/usr/lib</filename>, probablemente, dejando el sistema
      inestable ("Ayuda, xinit no ha vuelto a funcionar desde que instal&eacute; este
      port"). Cualquiera que haga esto, ser&aacute; troceado en 65.536 partes con un
      cuchillo poco afilado, permaneciendo por toda la eterniadad en lo m&aacute;s 
      profundo del infierno (y no necesariamente en este &oacute;rden)</para>
    </sect3>
  </sect2>

  <sect2>
    <title>Soporte ELF</title>

    <para>Desde la transici&oacute;n de FreeBSD a formato ELF despu&eacute;s de la
      version 3.0-RELEASE, fue necesario convertir muchos ports para que generasen
      librer&iacute;as compartidas en formato ELF. Para complicar m&aacute;s el 
      trabajo, los sistemas 3.0 pueden ejecutar ELF y a.out, y se quiere mantener, 
      etraoficialmente, tanto como sea posible, el soporte para versiones 2.2. A
      continuaci&oacute;n se explica como convertir ports que s&oacute;lo soportan
      a.out para que soporten compilaciones a.out y ELF.</para>

    <para>Una parte de esta lista s&oacute;lo es aplicable durante la conversi&oacute;n,
      pero se mantendr&aacute; durante un tiempo como referencia en caso de querer
      actualizar alg&uacute;n port antiguo.</para>

    <sect3>
      <title>Mover las librer&iacute;as a.out</title>

      <para>Las librer&iacute;as a.out deben moverse de <filename>/usr/local/lib</filename>
        y similares a un subdirectorio <filename>aout</filename>. (Si no se mueven, los
        ports ELF sobreescribir&aacute;n las librer&iacute;as a.out). El objeto
        <maketarget>move-aout-libs</maketarget> del archivo
        <filename>src/Makefile</filename> en 3.0-CURRENT (llamado desde
        <maketarget>aout-to-elf</maketarget>) har&aacute; este paso en nuestro lugar.
        S&oacute;lo mover&aacute; las librer&iacute;as a.out en los directorios
        est&aacute;ndar.</para>
    </sect3>

    <sect3>
      <title>Formato</title>

      <para>La colecci&oacute;n de ports compilar&aacute; los packages en el mismo
        formato en el que est&eacute; la m&aacute;quina. Esto significa a.out para
        2.2 y a.out o ELF para 3.0 dependiendo de lo que devuelva la variable
        <command>`objformat`</command>. De la misma manera, una vez se mueven las
        librer&iacute;as a un subdirectorio, ya no ser&aacute; posible compilar 
        librer&iacute;as a.out.</para>

        <note>
          <para>Si un port s&oacute;lo funciona para a.out, definir 
            <makevar>BROKEN_ELF</makevar>. Estos ports ser&aacute;n pasados por alto
            durante la compilaci&oacute;n en sistemas ELF.</para>
        </note>
    </sect3>

    <sect3>
      <title><makevar>PORTOBJFORMAT</makevar></title>

      <para><filename>bsd.port.mk</filename> definir&aacute;
        <makevar>PORTOBJFORMAT</makevar> a <literal>aout</literal> o
        <literal>elf</literal> y lo exportar&aacute; en las variables de
        entorno <envar>CONFIGURE_ENV</envar>, <envar>SCRIPTS_ENV</envar> y
        <envar>MAKE_ENV</envar>. (Siempre ser&aacute; 
        <literal>aout</literal> en 2.2-STABLE). Tambi&eacute;n se pasa a
        <maketarget>PLIST_SUB</maketarget> como
        <literal>PORTOBJFORMAT=${PORTOBJFORMAT}</literal>. (Consultar los comentarios
        sobre <literal>ldconfig</literal> de las l&iacute;neas anteriores).</para>

      <para>La variable se defina usando esta l&iacute;nea en
        <filename>bsd.port.mk</filename>:</para>

      <programlisting>
PORTOBJFORMAT!= test -x /usr/bin/objformat && /usr/bin/objformat || echo aout</programlisting>

      <para>Los procesos de compilaci&oacute;n de los ports deber&iacute;an usar esta
        variable para decidir que hacer. De todas maneras, si el script
        <filename>configure</filename> del port detecta autom&aacute;ticamente un sistema
        ELF, no es necesario hacer referencia a <makevar>PORTOBJFORMAT</makevar>.</para>
    </sect3>


</sect2>  
</sect1>

<sect1 id="porting-pkgname">
  <title>pkgname</title>
  <para>a</para>
</sect1>

<sect1 id="contrib-general">
  <title>pkgname</title>
  <para>a</para>
</sect1> 

<sect1 id="porting-cleaning">
  <title>pkgname</title>
  <para>a</para>
</sect1> 

<sect1 id="porting-samplem">
  <title>pkgname</title>
  <para>a</para>
</sect1> 

<sect1 id="porting-dads">
  <title>pkgname</title>
  <para>a</para>
</sect1> 

<sect1 id="porting-categories">
  <title>pkgname</title>
  <para>a</para>
</sect1>

</chapter>

<!--    
     Local Variables: 
     mode: sgml
     sgml-declaration: "../chapter.decl" 
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../handbook.sgml" "part" "chapter")
     End:
-->
