summaryrefslogtreecommitdiffstats
path: root/share/doc/handbook/porting.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'share/doc/handbook/porting.sgml')
-rw-r--r--share/doc/handbook/porting.sgml1422
1 files changed, 0 insertions, 1422 deletions
diff --git a/share/doc/handbook/porting.sgml b/share/doc/handbook/porting.sgml
deleted file mode 100644
index de29944..0000000
--- a/share/doc/handbook/porting.sgml
+++ /dev/null
@@ -1,1422 +0,0 @@
-<!-- $Id: porting.sgml,v 1.70 1997/05/18 03:35:01 asami Exp $ -->
-<!-- The FreeBSD Documentation Project -->
-
-<sect1><heading>Porting an existing piece of free software<label id="porting"></heading>
-
-<p><em>Contributed by &a.jkh;, &a.gpalmer; and
- &a.asami;.<newline>28 August 1996.</em>
-<p><em>Contributed by &a.jkh;, &a.gpalmer;, &a.asami; and
- &a.obrien;.<newline>28 August 1996.</em>
-
-<p>The porting of freely available software, while perhaps not as
-gratifying as developing your own from scratch, is still a vital part
-of FreeBSD's growth and of great usefulness to those who would not
-otherwise know where to turn for it. All ported software is organized
-into a carefully organized hierarchy know as ``the ports collection''.
-The collection enables a new user to get a quick and complete overview
-of what is available for FreeBSD in an easy-to-compile form. It also
-saves considerable space by not actually containing the majority
-of the sources being ported, but merely those differences required for
-running under FreeBSD.
-
-<p>What follows are some guidelines for creating a new port for
-FreeBSD 3.x. The bulk of the work is done by
-<tt>/usr/share/mk/bsd.port.mk</tt>, which all port Makefiles include.
-Please refer to that file for more details on the inner workings of
-the ports collection. Even if you don't hack Makefiles daily, it is
-well commented, and you will still gain much knowledge from it.
-
- <sect2>
- <heading>Before Starting the Port<label id="porting:starting"></heading>
-
- <p>Note: Only a fraction of the overridable variables
- (<tt>&dollar;{..}</tt>) are mentioned in this document. Most
- (if not all) are documented at the start of
- <tt>bsd.port.mk</tt>. This file uses a non-standard tab
- setting. <tt>Emacs</tt> and <tt>Vim</tt> should recognize the setting
- on loading the file. <tt>vi</tt> or <tt>ex</tt> can be set to
- using the correct value by typing `<tt>:set tabstop=4</tt>'
- once the file has been loaded.
-
- <p>You may come across code that needs modifications or
- conditional compilation based upon what version of UNIX it is
- running under. If you need to make such changes to the code
- for conditional compilation, make sure you make the changes as
- general as possible so that we can back-port code to FreeBSD
- 1.x systems and cross-port to other BSD systems such as 4.4BSD
- from CSRG, BSD/386, 386BSD, NetBSD, and OpenBSD.
-
- <p>The preferred way to tell 4.3BSD/Reno (1990) and newer versions of
- the BSD code apart is by using the `<tt>BSD</tt>' macro
- defined in <tt>&lt;sys/param.h&gt;</tt>. Hopefully that file
- is already included; if not, add the code:
-
-<tscreen><verb>
-#ifdef (defined(__unix__) || defined(unix)) && !defined(USG)
-#include <sys/param.h>
-#endif
-</verb></tscreen>
-
- <p>to the proper place in the <tt>.c</tt> file. We believe that every
- system that defines these to symbols has sys/param.h. If you find
- a system that doesn't, we would like to know. Please send mail to
- <htmlurl url='mailto:ports@FreeBSD.org' name='ports@FreeBSD.org'>.
-
- <p>Another way is to use the GNU Autoconf style of doing this:
-
-<tscreen><verb>
-#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
-#endif
-</verb></tscreen>
-
- Don't forget to add <tt>-DHAVE_SYS_PARAM_H</tt> to the <tt>CFLAGS</tt>
- in the Makefile for this method.
-
- Once you have <tt>&lt;sys/param.h&gt;</tt> included, you may use:
-
-<tscreen><verb>
-#if (defined(BSD) && (BSD >= 199103))
-</verb></tscreen>
-
- to detect if the code is being compiled on a 4.3 Net2 code
- base or newer (e.g. FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD,
- BSD/386 1.1 and below).
-
- Use:
-
-<tscreen><verb>
-#if (defined(BSD) && (BSD >= 199306))
-</verb></tscreen>
-
- to detect if the code is being compiled on a 4.4 code base or
- newer (e.g. FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0 or
- above).
-
- The value of the BSD macro is 199506 for the 4.4BSD-Lite2 code
- base. This is stated for informational purposes only. It should
- not be used to distinguish between version of FreeBSD based only
- on 4.4-Lite vs. versions that have merged in changes from 4.4-Lite2.
- The __FreeBSD__ macro should be used instead.
-
- <p>Use sparingly:
-
- <itemize>
- <item><tt>__FreeBSD__</tt> is defined in all versions of
- FreeBSD. Use it if the change you are making ONLY affects
- FreeBSD. Porting gotchas like the use of
- <tt>sys_errlist[]</tt> vs <tt>strerror()</tt> are
- Berkeleyisms, not FreeBSD changes.
-
- <item>In FreeBSD 2.x, <tt>__FreeBSD__</tt> is defined to be
- <tt>2</tt>. In earlier versions, it is <tt>1</tt>. Later
- versions will bump it to match their major version number.
-
- <item>If you need to tell the difference between a FreeBSD 1.x
- system and a FreeBSD 2.x or 3.x system, usually the right answer is
- to use the <tt>BSD</tt> macros described above. If there
- actually is a FreeBSD specific change (such as special
- shared library options when using `<tt>ld</tt>') then it is
- OK to use <tt>__FreeBSD__</tt> and `<tt>#if __FreeBSD__ &gt;
- 1</tt>' to detect a FreeBSD 2.x and later system.
-
- If you need more granularity in detecting FreeBSD systems since
- 2.0-RELEASE you can use the following:
-
-<tscreen><verb>
-#if __FreeBSD__ >= 2
-#include <osreldate.h>
-# if __FreeBSD_version >= 199504
- /* 2.0.5+ release specific code here */
-# endif
-#endif
-</verb></tscreen>
-<tt>__FreeBSD_version</tt> values:
-<tscreen><verb>
-2.0-RELEASE: 199411
-2.1-current's: 199501, 199503
-2.0.5-RELEASE: 199504
-2.2-current before 2.1: 199508
-2.1.0-RELEASE: 199511
-2.2-current before 2.1.5: 199512
-2.1.5-RELEASE: 199607
-2.2-current before 2.1.6: 199608
-2.1.6-RELEASE: 199612
-2.1.7-RELEASE: 199612
-2.2-RELEASE: 220000
-2.2.1-RELEASE: 220000 (yes, no change)
-2.2-STABLE after 2.2.1-RELEASE: 220000 (yes, still no change)
-2.2-STABLE after texinfo-3.9: 221001
-2.2-STABLE after top: 221002
-2.2.2-RELEASE: 222000
-3.0-current as of May 1997: 300000
-</verb></tscreen>
- The pattern used to be year followed by the month, but we
- decided to change it to a more straightforward major/minor
- system starting from 2.2. This is because the parallel
- development on several branches made it infeasible to
- classify the releases simply by their real release dates.
- (Note that if you are making a port now, you don't have to
- worry about old -current's; they are listed here just for
- your reference.)
-
- </itemize>
-
- <p>In the hundreds of ports that have been done, there have
- only been one or two cases where <tt>__FreeBSD__</tt>
- should have been used. Just because an earlier port
- screwed up and used it in the wrong place does not mean
- you should do so too.
-
- <sect2>
- <heading>Quick Porting</heading>
-
- <p>This section tells you how to do a quick port. In many
- cases, it is not enough, but we will see.
-
- <p>First, get the original tarball and put it into
- <tt>&dollar;{DISTDIR}</tt>, which defaults to
- <tt>/usr/ports/distfiles</tt>.
-
- <p>Note: The following assumes that the software compiled
- out-of-the-box, i.e., there was absolutely no change required
- for the port to work on your FreeBSD box. If you needed to
- change something, you will have to refer to the next section
- too.
-
- <sect3>
- <heading>Writing the Makefile</heading>
-
- <p>The minimal <tt>Makefile</tt> would look something like this:
-
-<tscreen><verb>
- # New ports collection makefile for: oneko
- # Version required: 1.1b
- # Date created: 5 December 1994
- # Whom: asami
- #
- # &dollar;Id&dollar;
- #
-
- DISTNAME= oneko-1.1b
- CATEGORIES= games
- MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
-
- MAINTAINER= asami@FreeBSD.ORG
-
- USE_IMAKE= yes
-
- .include <bsd.port.mk>
-</verb></tscreen>
-
- <p>See if you can figure it out. Do not worry about the contents
- of the <tt>&dollar;Id&dollar;</tt> line, it will be filled in
- automatically by CVS when the port is imported to our main
- ports tree. You can find a more detailed example in the <ref
- id="porting:samplem" name="sample Makefile"> section.
-
- <sect3>
- <heading>Writing the description files</heading>
-
- <p>There are three required description files that are
- required for any port, whether they actually package or not.
- They are <tt>COMMENT</tt>, <tt>DESCR</tt>, and
- <tt>PLIST</tt>, and reside in the <tt>pkg</tt> subdirectory.
-
- <sect4>
- <heading>COMMENT</heading>
-
- <p>This is the one-line description of the port. <em>PLEASE
- do not include the package name (or version number of the
- software) in the comment.</em>
- Here is an example:
-<tscreen><verb>
-A cat chasing a mouse all over the screen.
-</verb></tscreen>
-
- <sect4>
- <heading>DESCR</heading>
-
- <p>This is a longer description of the port. One to a few
- paragraphs concisely explaining what the port does is
- sufficient. Note: This is <em>not</em> a manual nor an
- in-depth description on how to use or compile the port.
- In particular, <em>please do not just copy the <tt>README</tt>
- file here</em>, unless, of course, it is a concise description
- of the port.
-
- <p>It is recommended that you sign the name at the end of
- this file, as in:
-
-<tscreen><verb>
-This is a port of oneko, in which a cat chases a poor mouse all over
-the screen.
- :
-(etc.)
-
-- Satoshi
-asami@cs.berkeley.edu
-</verb></tscreen>
-
- <sect4>
- <heading>PLIST</heading>
-
- <p>This file lists all the files installed by the port. It
- is also called the `packing list' because the package is
- generated by packing the files listed here. The pathnames
- are relative to the installation prefix (usually
- <tt>/usr/local</tt> or <tt>/usr/X11R6</tt>) Also it is assumed
- the manpages will be compressed.
-
- <p>Here is a small example:
-
-<tscreen><verb>
-bin/oneko
-man/man1/oneko.1.gz
-lib/X11/app-defaults/Oneko
-lib/X11/oneko/cat1.xpm
-lib/X11/oneko/cat2.xpm
-lib/X11/oneko/mouse.xpm
-</verb></tscreen>
-
- <p>Refer to the <tt>pkg_create(1)</tt> man page for details
- on the packing list.
-
- <sect3>
- <heading>Creating the checksum file</heading>
-
- <p>Just type `<tt>make makesum</tt>'. The ports make rules
- will automatically generate the file <tt>files/md5</tt>.
-
- <sect3>
- <heading>Testing the port</heading>
-
- <p>You should make sure that the port rules do exactly what
- you want it to do, including packaging up the port. Try
- doing `<tt>make install</tt>', `<tt>make package</tt>' and
- then `<tt>pkg_delete -d &lt;pkgname&gt;</tt>' and see if all
- the files are correctly deleted. Then do a `<tt>pkg_add
- &lt;pkgname&gt;.tgz</tt>' and see if everything re-appears
- and works correctly.
-
- <sect3>
- <heading>Submitting the port<label id="porting:submitting"></heading>
-
- <p>Now that you are happy with your port, the only thing
- remaining is to put it in the main FreeBSD ports tree and
- make everybody else happy about it too. To accomplish this,
- pack the necessary files (everything described in this
- section -- in particular do <em>not</em> include the
- original source tarball, the `<tt>work</tt>' subdirectory or
- the package) into a <tt>.tar.gz</tt> file, stick it in the
- directory
-<tscreen><verb>
-ftp://ftp.FreeBSD.ORG/pub/FreeBSD/incoming/
-</verb></tscreen>
- and send mail to us using <tt>send-pr(1)</tt> (please
- classify it as category `ports' and class `change-request').
- We will take a look, get back to you if necessary, and put
- it in the tree. Your name will also appear in the list of
- `Additional FreeBSD contributors' on the FreeBSD Handbook
- and other files. Isn't that great?!? <tt>:)</tt>
-
- <sect2>
- <heading>Slow Porting</heading>
-
- <p>Ok, so it was not that simple, and the port required some
- modifications to get it to work. In this section, we will
- explain, step by step, how to modify it to get it to work with
- the ports paradigm.
-
- <sect3>
- <heading>How things work</heading>
-
- <p>First, this is the sequence of events which occurs when the
- user first types `<tt>make</tt>' in your port's directory,
- and you may find that having <tt>bsd.port.mk</tt> in another
- window while you read this really helps to understand it.
-
- <p>But do not worry if you do not really understand what
- <tt>bsd.port.mk</tt> is doing, not many people
- do... <tt>:&gt;</tt>
-
- <enum>
- <item>The fetch target is run. The fetch target is
- responsible for making sure that the tarball exists
- locally in <tt>&dollar;{DISTDIR}</tt>. If fetch cannot
- find the required files in <tt>&dollar;{DISTDIR}</tt> it
- will look up the URL <tt>&dollar;{MASTER_SITES}</tt>,
- which is set in the Makefile, as well as our main ftp
- site at <htmlurl
- url="ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/"
- name="ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/,">
- where we put sanctioned distfiles as backup. It will then
- attempt to
- fetch the named distribution file with
- <tt>&dollar;{FETCH}</tt>, assuming that the requesting
- site has direct access to the Internet. If that succeeds,
- it will save the file in <tt>&dollar;{DISTDIR}</tt> for
- future use and proceed.
-
- <item>The extract target is run. It looks for your ports'
- distribution file in <tt>&dollar;{DISTDIR}</tt> (typically
- a gzip'd tarball) and unpacks it into a temporary
- subdirectory specified by <tt>&dollar;{WRKDIR}</tt>
- (defaults to <tt>work</tt>).
-
- <item>The patch target is run. First, any patches defined
- in <tt>&dollar;{PATCHFILES}</tt> are applied. Second, if
- any patches are found in <tt>&dollar;{PATCHDIR}</tt>
- (defaults to the <tt>patches</tt> subdirectory), they are
- applied at this time in alphabetical order.
-
- <item>The configure target is run. This can do any one of
- many different things.
-
- <enum>
-
- <item>If it exists, <tt>scripts/configure</tt> is run.
-
- <item>If <tt>&dollar;{HAS_CONFIGURE}</tt> or
- <tt>&dollar;{GNU_CONFIGURE}</tt> is set,
- <tt>&dollar;{WRKSRC}/configure</tt> is run.
-
- <item>If <tt>&dollar;{USE_IMAKE}</tt> is set,
- <tt>&dollar;{XMKMF}</tt> (default: `<tt>xmkmf
- -a</tt>') is run.
-
- </enum>
-
- <item>The build target is run. This is responsible for
- descending into the ports' private working directory
- (<tt>&dollar;{WRKSRC}</tt>) and building it. If
- <tt>&dollar;{USE_GMAKE}</tt> is set, GNU <tt>make</tt>
- will be used, otherwise the system <tt>make</tt> will be
- used.
-
- </enum>
-
- <p>The above are the default actions. In addition, you can
- define targets `<tt>pre-&lt;something&gt;</tt>' or
- `<tt>post-&lt;something&gt;</tt>', or put scripts with those
- names, in the <tt>scripts</tt> subdirectory, and they will
- be run before or after the default actions are done.
-
- <p>For example, if you have a <tt>post-extract</tt> target
- defined in your Makefile, and a file <tt>pre-build</tt> in
- the <tt>scripts</tt> subdirectory, the
- <tt>post-extract</tt> target will be called after the
- regular extraction actions, and the <tt>pre-build</tt>
- script will be executed before the default build rules are
- done. It is recommended that you use Makefile targets if
- the actions are simple enough, because it will be easier for
- someone to figure out what kind of non-default action the
- port requires.
-
- <p>The default actions are done by the <tt>bsd.port.mk</tt>
- targets `<tt>do-&lt;something&gt;</tt>'. For example, the
- commands to extract a port are in the target
- `<tt>do-extract</tt>'. If you are not happy with the
- default target, you can fix it by redefining the
- `<tt>do-&lt;something&gt;</tt>' target in your Makefile.
-
- <p>Note that the `main' targets (e.g., <tt>extract</tt>,
- <tt>configure</tt>, etc.) do nothing more than make sure all
- the stages up to that one is completed and call the real
- targets or scripts, and they are not intended to be
- changed. If you want to fix the extraction, fix
- <tt>do-extract</tt>, but never ever touch <tt>extract</tt>!
-
- <p>Now that you understand what goes on when the user types
- `<tt>make</tt>', let us go through the recommended steps to
- create the perfect port.
-
- <sect3>
- <heading>Getting the original sources</heading>
-
- <p>Get the original sources (normally) as a compressed tarball
- (<tt>&lt;foo&gt;.tar.gz</tt> or <tt>&lt;foo&gt;.tar.Z</tt>)
- and copy it into <tt>&dollar;{DISTDIR}</tt>. Always use
- <em>mainstream</em> sources when and where you can.
-
- <p>If you cannot find a ftp/http site that is well-connected
- to the net, or can only find sites that have irritatingly
- non-standard formats, we can `house' it ourselves by putting
- it on
-<tscreen><verb>
-ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/LOCAL_PORTS/
-</verb></tscreen>
- as the last resort. Please refer to this localation as
- <tt>&dollar;{MASTER_SITE_LOCAL}</tt>. Send mail to the &a.ports
- if you are not sure what to do.
-
- <p>If your port requires some additional `patches' that are
- available on the Internet, fetch them too and put them in
- <tt>&dollar;{DISTDIR}</tt>. Do not worry if they come from
- site other than where you got the main source tarball,
- we have a way to handle these situations (see the
- description of <ref id="porting:patchfiles"
- name="&dollar;{PATCHFILES}"> below).
-
- <sect3>
- <heading>Modifying the port</heading>
-
- <p>Unpack a copy of the tarball in a private directory and
- make whatever changes are necessary to get the port to
- compile properly under the current version of FreeBSD. Keep
- <em>careful track</em> of everything you do, as you will be
- automating the process shortly. Everything, including the
- deletion, addition or modification of files should be doable
- using an automated script or patch file when your port is
- finished.
-
- <p>If your port requires significant user
- interaction/customization to compile or install, you should
- take a look at one of Larry Wall's classic Configure scripts
- and perhaps do something similar yourself. The goal of the
- new ports collection is to make each port as `plug-and-play'
- as possible for the end-user while using a minimum of disk
- space.
-
- <p>Note: Unless explicitly stated, patch files, scripts, and
- other files you have created and contributed to the FreeBSD
- ports collection are assumed to be covered by the standard
- BSD copyright conditions.
-
- <sect3>
- <heading>Patching</heading>
-
- <p>In the preparation of the port, files that have been added
- or changed can be picked up with a recursive diff for later
- feeding to patch. Each set of patches you wish to apply
- should be collected into a file named
- `<tt>patch-&lt;xx&gt;</tt>' where <tt>&lt;xx&gt;</tt>
- denotes the sequence in which the patches will be applied --
- these are done in <em>alphabetical order</em>, thus
- `<tt>aa</tt>' first, `<tt>ab</tt>' second and so on. These
- files should be stored in <tt>&dollar;{PATCHDIR}</tt>, from
- where they will be automatically applied. All patches
- should be relative to <tt>&dollar;{WRKSRC}</tt> (generally
- the directory your port's tarball unpacks itself into, that
- being where the make is done). To make fixes and upgrades
- easier you should avoid having more than one patch fix the
- same file (e.g., patch-aa and patch-ab both changing
- <tt>&dollar;{WRKSRC}</tt>/foobar.c).
-
- <sect3>
- <heading>Configuring</heading>
-
- <p>Include any additional customization commands to your
- <tt>configure</tt> script and save it in the
- `<tt>scripts</tt>' subdirectory. As mentioned above, you
- can also do this as Makefile targets and/or scripts with the
- name <tt>pre-configure</tt> or <tt>post-configure</tt>.
-
- <sect3>
- <heading>Handling user input</heading>
-
- <p>If your port requires user input to build, configure or
- install, then set <tt>IS_INTERACTIVE</tt> in your Makefile.
- This will allow `overnight builds' to skip your port if the
- user sets the variable <tt>BATCH</tt> in his environment
- (and if the user sets the variable <tt>INTERACTIVE</tt>,
- then <em>only</em> those ports requiring interaction are
- built).
-
- <sect2>
- <heading>Configuring the Makefile</heading>
-
- <p>Configuring the Makefile is pretty simple, and again we
- suggest that you look at existing examples before starting.
- Also, there is a <ref id="porting:samplem" name="sample
- Makefile"> in this handbook, so take a look and please follow
- the ordering of variables and sections in that template to
- make your port easier for others to read.
-
- <p>Now, consider the following problems in sequence as you
- design your new Makefile:
-
- <sect3>
- <heading>The original source</heading>
-
- <p>Does it live in <tt>&dollar;{DISTDIR}</tt> as a standard
- gzip'd tarball? If so, you can go on to the next step. If
- not, you should look at overriding any of the
- <tt>&dollar;{EXTRACT_CMD}</tt>,
- <tt>&dollar;{EXTRACT_BEFORE_ARGS}</tt>,
- <tt>&dollar;{EXTRACT_AFTER_ARGS}</tt>,
- <tt>&dollar;{EXTRACT_SUFX}</tt>, or
- <tt>&dollar;{DISTFILES}</tt> variables, depending on how
- alien a format your port's distribution file is. (The most
- common case is `<tt>EXTRACT_SUFX=.tar.Z</tt>', when the
- tarball is condensed by regular compress, not gzip.)
-
- <p>In the worst case, you can simply create your own
- `<tt>do-extract</tt>' target to override the default, though
- this should be rarely, if ever, necessary.
-
- <sect3>
- <heading>DISTNAME</heading>
-
- <p>You should set <tt>&dollar;{DISTNAME}</tt> to be the base
- name of your port. The default rules expect the
- distribution file list (<tt>&dollar;{DISTFILES}</tt>) to be
- named
- <tt>&dollar;{DISTNAME}&dollar;{EXTRACT_SUFX}</tt>
- by default which, if it is a normal tarball, is going to be
- something like:
-<tscreen><verb>
-foozolix-1.0.tar.gz
-</verb></tscreen>
- for a setting of `<tt>DISTNAME=foozolix-1.0</tt>'.
-
- The default rules also expect the tarball(s) to extract into
- a subdirectory called <tt>work/&dollar;{DISTNAME}</tt>, e.g.
-<tscreen><verb>
-work/foozolix-1.0/
-</verb></tscreen>
-
- All this behavior can be overridden, of course, it simply
- represents the most common time-saving defaults. For a port
- requiring multiple distribution files, simply set
- <tt>&dollar;{DISTFILES}</tt> explicitly. If only a subset
- of <tt>&dollar;{DISTFILES}</tt> are actual extractable
- archives, then set them up in
- <tt>&dollar;{EXTRACT_ONLY}</tt>, which will override the
- <tt>&dollar;{DISTFILES}</tt> list when it comes to
- extraction, and the rest will be just left in
- <tt>&dollar;{DISTDIR}</tt> for later use.
-
- <sect3>
- <heading>CATEGORIES</heading>
-
- <p>When a package is created, it is put under
- <tt>/usr/ports/packages/All</tt> and links are made from one
- or more subdirectories of <tt>/usr/ports/packages</tt>. The
- names of these subdirectories are specified by the variable
- <tt>&dollar;{CATEGORIES}</tt>. It is intended to make life
- easier for the user when he is wading through the pile of
- packages on the ftp site or the CD-ROM. Please take a look
- at the existing categories (you can find them in <htmlurl
- url="http://www.freebsd.org/ports/" name="the ports
- page">) and pick the ones that are suitable for your port.
- If your port truly belongs to something that is different
- from all the existing ones, you can even create a new
- category name.
-
- <sect3>
- <heading>MASTER_SITES</heading>
-
- <p>Record the directory part of the ftp/http-URL pointing at
- the original tarball in <tt>&dollar;{MASTER_SITES}</tt>.
- Do not forget the trailing slash (<tt>/</tt>)!
-
- <p>The make macros will try to use this specification for
- grabbing the distribution file with <tt>&dollar;{FETCH}</tt>
- if they cannot find it already on the system.
-
- <p>It is recommended that you put multiple sites on this list,
- preferably from different continents. This will safeguard
- against wide-area network problems, and we are even planning
- to add support for automatically determining the closest
- master site and fetching from there!
-
- <p>If the original tarball is part of one of the following
- popular archives: X-contrib, GNU, Perl CPAN, TeX CTAN, or
- Linux Sunsite, you refer to those sites in an easy compact
- form using MASTER_SITE_XCONTRIB, MASTER_SITE_GNU,
- MASTER_SITE_PERL_CPAN, MASTER_SITE_TEX_CTAN, and
- MASTER_SITE_SUNSITE. Simply set MASTER_SITE_SUBDIR to the path
- with in the archive. Here is an example:
-<tscreen><verb>
-MASTER_SITES= ${MASTER_SITE_XCONTRIB}
-MASTER_SITE_SUBDIR= applications
-</verb></tscreen>
- <p>The user can also set the MASTER_SITE_* variables in
- <tt>/etc/make.conf</tt> to override our choices, and use their
- favorite mirrors of these popular archives instead.
-
- <sect3>
- <heading>PATCHFILES<label id="porting:patchfiles"></heading>
-
- <p>If your port requires some additional patches that are
- available by ftp or http, set <tt>&dollar;{PATCHFILES}</tt>
- to the names of the files and <tt>&dollar;{PATCH_SITES}</tt>
- to the URL of the directory that contains them (the format
- is the same as <tt>&dollar;{MASTER_SITES}</tt>).
-
- <p>If the patch is not relative to the top of the source tree
- (i.e., <tt>&dollar;{WKRSRC}</tt>) because it contains some
- extra pathnames, set <tt>&dollar;{PATCH_DIST_STRIP}</tt>
- accordingly. For instance, if all the pathnames in the
- patch has an extra `<tt>foozolix-1.0/</tt>' in front of the
- filenames, then set `<tt>PATCH_DIST_STRIP=-p1</tt>'.
-
- <p>Do not worry if the patches are compressed, they will be
- decompressed automatically if the filenames end with
- `<tt>.gz</tt>' or `<tt>.Z</tt>'.
-
- <p>If the patch is distributed with some other files, such as
- documentation, in a gzip'd tarball, you can't just use
- <tt>&dollar;{PATCHFILES}</tt>. If that is the case, add the
- name and the location of the patch tarball to
- <tt>&dollar;{DISTFILES}</tt> and
- <tt>&dollar;{MASTER_SITES}</tt>. Then, from the
- <tt>pre-patch</tt> target, apply the patch either by running
- the patch command from there, or copying the patch file into
- the <tt>&dollar;{PATCHDIR}</tt> directory and calling it
- <tt>patch-&lt;xx&gt;</tt>. (Note the tarball will have been
- extracted alongside the regular source by then, so there is
- no need to explicitly extract it if it is a regular gzip'd
- or compress'd tarball.) If you do the latter, take extra
- care not to overwrite something that already exists in that
- directory. Also do not forget to add a command to remove
- the copied patch in the <tt>pre-clean</tt> target.
-
- <sect3>
- <heading>MAINTAINER</heading>
-
- <p>Set your mail-address here. Please. <tt>:)</tt>
-
- <p>For detailed description of the responsibility of maintainers,
- refer to <ref id="policies:maintainer"
- name="MAINTAINER on Makefiles"> section.
-
- <sect3>
- <heading>Dependencies</heading>
-
- <p>Many ports depend on other ports. There are five
- variables that you can use to ensure that all the required
- bits will be on the user's machine.
-
- <sect4>
- <heading>LIB_DEPENDS</heading>
-
- <p>This variable specifies the shared libraries this port
- depends on. It is a list of `<tt>lib:dir</tt>' pairs
- where <tt>lib</tt> is the name of the shared library, and
- <tt>dir</tt> is the directory in which to find it in case
- it is not available. For example,
-<tscreen><verb>
-LIB_DEPENDS= jpeg\\.6\\.:${PORTSDIR}/graphics/jpeg
-</verb></tscreen>
- will check for a shared jpeg library with major version 6,
- and descend into the <tt>graphics/jpeg</tt> subdirectory
- of your ports tree to build and install it if it is not
- found.
-
- Note that the <tt>lib</tt> part is just an argument given
- to `<tt>ldconfig -r | grep</tt>', so periods should be
- escaped by two backslashes like in the example above.
-
- The dependency is checked from within the <tt>extract</tt>
- target. Also, the name of the dependency is put in to the
- package so that <tt>pkg_add</tt> will automatically
- install it if it is not on the user's system.
-
- <sect4>
- <heading>RUN_DEPENDS</heading>
-
- <p>This variable specifies executables or files this port
- depends on during run-time. It is a list of
- `<tt>path:dir</tt>' pairs where <tt>path</tt> is the name
- of the executable or file, and <tt>dir</tt> is the
- directory in which to find it in case it is not
- available. If <tt>path</tt> starts with a slash
- (<tt>/</tt>), it is treated as a file and its existence is
- tested with `<tt>test -e</tt>'; otherwise, it is assumed
- to be an executable, and `<tt>which -s</tt>' is used to
- determine if the program exists in the user's search path.
-
- <p>For example,
-<tscreen><verb>
-RUN_DEPENDS= ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
- wish:${PORTSDIR}/x11/tk
-</verb></tscreen>
- will check if the file `<tt>/usr/local/etc/innd</tt>'
- exists, and build and install it from the
- <tt>news/inn</tt> subdirectory of the ports tree if it is
- not found. It will also see if an executable called
- `<tt>wish</tt>' is in your search path, and descend into
- the <tt>x11/tk</tt> subdirectory of your ports tree to
- build and install it if it is not found. (Note that in
- this case, `<tt>innd</tt>' is actually an executable; if
- an executable is in a place that is not expected to be in
- a normal user's search path, you should use the full
- pathname.)
-
- The dependency is checked from within the <tt>install</tt>
- target. Also, the name of the dependency is put in to the
- package so that <tt>pkg_add</tt> will automatically
- install it if it is not on the user's system.
-
- <sect4>
- <heading>BUILD_DEPENDS</heading>
-
- <p>This variable specifies executables or files this port
- requires to build. Like <tt>RUN_DEPENDS</tt>, it is a
- list of `<tt>path:dir</tt>' pairs. For example,
-<tscreen><verb>
-BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
-</verb></tscreen>
- will check for an executable called `<tt>unzip</tt>', and
- descend into the <tt>archivers/unzip</tt> subdirectory of
- your ports tree to build and install it if it is not found.
-
- Note that `build' here means everything from extracting to
- compilation. The dependency is checked from within the
- <tt>extract</tt> target.
-
- <sect4>
- <heading>FETCH_DEPENDS</heading>
-
- <p>This variable specifies executables or files this port
- requires to fetch. Like the previous two, it is a list of
- `<tt>path:dir</tt>' pairs. For example,
-<tscreen><verb>
-FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2
-</verb></tscreen>
- will check for an executable called `<tt>ncftp2</tt>', and
- descend into the <tt>net/ncftp2</tt> subdirectory of
- your ports tree to build and install it if it is not found.
-
- The dependency is checked from within the <tt>fetch</tt>
- target.
-
- <sect4>
- <heading>DEPENDS</heading>
-
- <p>If there is a dependency that does not fall into either of
- the above four categories, or your port requires to have
- the source of the other port extracted (i.e., having them
- installed is not enough), then use this variable. This is
- just a list of directories, as there is nothing to check,
- unlike the previous four.
-
- <sect3>
- <heading>Building mechanisms</heading>
-
- <p>If your package uses GNU <tt>make</tt>, set
- `<tt>USE_GMAKE=yes</tt>'. If your package uses GNU
- <tt>configure</tt>, set `<tt>GNU_CONFIGURE=yes</tt>'. If
- you want to give some extra arguments to GNU
- <tt>configure</tt> (other than the default
- `<tt>--prefix=&dollar;{PREFIX}</tt>'),
- set those extra arguments in
- <tt>&dollar;{CONFIGURE_ARGS}</tt>.
-
- <p>If your package is an X application that creates Makefiles
- from Imakefiles using <tt>imake</tt>, then set
- `<tt>USE_IMAKE=yes</tt>'. This will cause the configure
- stage to automatically do an <tt>xmkmf -a</tt>. If the
- `<tt>-a</tt>' flag is a problem for your port, set
- `<tt>XMKMF=xmkmf</tt>'.
-
- <p>If your port's source Makefile has something else than
- `<tt>all</tt>' as the main build target, set
- <tt>&dollar;{ALL_TARGET}</tt> accordingly. Same goes for
- `<tt>install</tt>' and <tt>&dollar;{INSTALL_TARGET}</tt>.
-
- <sect3>
- <heading>NO_INSTALL_MANPAGES</heading>
-
- <p>If the port uses imake but does not understand the
- `<tt>install.man</tt>' target,
- `<tt>NO_INSTALL_MANPAGES=yes</tt>' should be set. In
- addition, the author of the original port should be
- shot. <tt>:&gt;</tt>
-
- <sect2>
- <heading>Ports that require Motif</heading>
-
- <p>There are many programs that require a Motif library
- (available from several commercial vendors, while there is (at
- least) one effort to create a free clone) to compile. Since
- it is a popular toolkit and their licenses usually permit
- redistribution of statically linked binaries, we have made
- special provisions for handling ports that require Motif in a
- way that we can easily compile binaries linked either
- dynamically or statically.
-
- <sect3>
- <heading>REQUIRES_MOTIF</heading>
-
- <p>If your port requires Motif, define this variable in the
- Makefile. This will prevent people who don't own a copy of
- Motif from even attempting to build it.
-
- <sect3>
- <heading>&dollar;{MOTIFLIB}</heading>
-
- <p>This variable will be set by <tt>bsd.port.mk</tt> to be the
- appropriate reference to the Motif library. Please patch
- the source to use this wherever the Motif library is
- referenced in the Makefile or Imakefile.
-
- <p>There are two common cases:
- <enum>
- <item>If the port refers to the Motif library as
- `<tt>-lXm</tt>' in its Makefile or Imakefile, simply
- substitute `<tt>&dollar;{MOTIFLIB}</tt>' for it.
-
- <item>If the port uses `<tt>XmClientLibs</tt>' in its
- Imakefile, change it to `<tt>&dollar;{MOTIFLIB}
- &dollar;{XTOOLLIB} &dollar;{XLIB}</tt>'.
- </enum>
-
- <p>Note that <tt>&dollar;{MOTIFLIB}</tt> (usually) expands to
- `<tt>-L/usr/X11R6/lib -lXm</tt>' or
- `<tt>/usr/X11R6/lib/libXm.a</tt>', so there is no need to
- add `<tt>-L</tt>' or `<tt>-l</tt>' in front.
-
- <sect2>
- <heading>Licensing Problems</heading>
-
- <p>Some software packages have restrictive licenses or are in
- violation to the law (PKP's patent on public key crypto,
- ITAR (export of crypto software) to name just two of them).
- What we can do with them vary a lot, depending on the exact
- wordings of the respective licenses.
-
- <p>Note that it is your responsibility as a porter to read the
- licensing terms of the software and make sure that the FreeBSD
- project will not be held accountable of violating them by
- redistributing the source or compiled binaries either via ftp
- or CD-ROM. If in doubt, please contact the &a.ports;.
-
- <p>There are two variables you can set in the Makefile to handle
- the situations that arise frequently:
-
- <enum>
- <item>If the port has a `do not sell for profit' type of
- license, set the variable <tt>NO_CDROM</tt>. We will make
- sure such ports won't go into the CD-ROM come release time.
- The distfile and package will still be available via ftp.
-
- <item>If the resulting package needs to be built uniquely for
- each site, or the resulting binary package can't be distributed
- due to licensing; set the variable <tt>NO_PACKAGE</tt>.
- We will make sure such packages won't go on the ftp site, nor
- into the CD-ROM come release time. The distfile will still be
- included on both however.
-
- <item>If the port has legal restrictions on who can use it
- (e.g., crypto stuff) or has a `no commercial use' license,
- set the variable <tt>RESTRICTED</tt> to be the string
- describing the reason why. For such ports, the
- distfiles/packages will not be available even from our ftp
- sites.
- </enum>
-
- <p>Note: The GNU General Public License (GPL), both version 1
- and 2, should not be a problem for ports.
-
- <p>Note: If you are a committer, make sure you update the
- <tt>ports/LEGAL</tt> file too.
-
- <sect2>
- <heading>Upgrading</heading>
-
- <p>When you notice that a port is out of date compared to the
- latest version from the original authors, first make sure you
- have the latest port. You can find them in the
- <tt>ports-current</tt> directory of the ftp mirror sites.
-
- <p>The next step is to send a mail to the maintainer, if one is
- listed in the port's Makefile. That person may already be
- working on an upgrade, or have a reason to not upgrade the
- port right now (because of, for example, stability problems
- of the new version).
-
- <p>If the maintainer asks you to do the upgrade or there isn't
- any such person to begin with, please make the upgrade and
- send the recursive diff of the new and old ports directories
- to us (i.e., if your modified ports directory is called
- `<tt>superedit</tt>' and the original as in our tree is
- `<tt>superedit.bak</tt>', then send us the result of `<tt>diff
- -ruN superedit.bak superedit</tt>'). Please examine the output
- to make sure all the changes make sense. The best way to send
- us the diff is by including it to <tt>send-pr(1)</tt> (category
- `ports'). Please
- mention any added or deleted files in the message, as they
- have to be explicitly specified to CVS when doing a commit.
-
- <sect2>
- <heading>Do's and Dont's</heading>
-
- <p>Here is a list of common do's and dont's that you encounter
- during the porting process.
-
- <sect3>
- <heading>WRKDIR</heading>
-
- <p>Do not leave anything valuable lying around in the
- <tt>work</tt> subdirectory, `<tt>make clean</tt>' will
- <em>nuke</em> it completely! If you need auxiliary files
- that are not scripts or patches, put them in the
- <tt>&dollar;{FILESDIR}</tt> subdirectory (files/ by default)
- and use the <tt>post-extract</tt> target to
- copy them to the <tt>work</tt> subdirectory.
-
- <sect3>
- <heading>Package information</heading>
-
- <p>Do include package information, i.e. COMMENT, DESCR, and PLIST, in
- <tt>pkg</tt>. Note that these files are not used only for
- packaging anymore, and are <em>mandatory</em> now, even if
- <tt>&dollar;{NO_PACKAGE}</tt> is set.
-
- <sect3>
- <heading>Compress manpages, strip binaries</heading>
-
- <p>Do compress manpages and strip binaries. If the original
- source already strips the binary, fine; otherwise, you can add a
- <tt>post-install</tt> rule to do it yourself. Here is an example:
-<tscreen><verb>
- post-install:
- strip ${PREFIX}/bin/xdl
-</verb></tscreen>
- <p>Use the <tt>file</tt> command on the installed executable
- to check whether the binary is stripped or not. If it
- does not say `not stripped', it is stripped.
-
- <p>To automagically compress the manpages, use the MAN[1-9LN]
- variables. They will check the variable
- <tt>NOMANCOMPRESS</tt> that the user can set in
- <tt>/etc/make.conf</tt> to disable man page compression.
- Place them last in the section below the
- <tt>MAINTAINER</tt> variable. Here is an example:
-<tscreen><verb>
-MAN1= foo.1 bar.1
-MAN5= foo.conf.5
-MAN8= baz.8
-</verb></tscreen>
- <p>Note that this is not usually necessary with ports that are X
- applications and use Imake to build.
-
- <p>If your port anchors its man tree somewhere other than
- <tt>PREFIX</tt>, you can use the <tt>MANPREFIX</tt> to set it.
- Also, if only manpages in certain section go in a
- non-standard place, such as many Perl modules ports, you
- can set individual man paths using
- <tt>MAN<em>sect</em>PREFIX</tt> (where <em>sect</em> is one
- of 1-9, L or N).
-
- <sect3>
- <heading>INSTALL_* macros</heading>
- <p>Do use the macros provided in <tt>bsd.port.mk</tt> to
- ensure correct modes and ownership of files in your own
- *-install targets. They are:
-
- <itemize>
- <item><tt>${INSTALL_PROGRAM}</tt> is a command to install
- binary executables.
- <item><tt>${INSTALL_SCRIPT}</tt> is a command to install
- executable scripts.
- <item><tt>${INSTALL_DATA}</tt> is a command to install
- sharable data.
- <item><tt>${INSTALL_MAN}</tt> is a command to install
- manpages and other documentation (it doesn't compress anything).
- </itemize>
-
- <p>These are basically the <tt>install</tt> command with all
- the appropriate flags. See below for an example on how to
- use them.
-
- <sect3>
- <heading>INSTALL package script</heading>
- <p>If your port needs execute commands when the binary package
- is installed with pkg_add you can do with via the pkg/INSTALL
- script. This script will automatically be added to the
- package, and will be run twice by pkg_add. The first time
- will as `<tt>INSTALL ${PKGNAME} PRE-INSTALL</tt>'
- and the second time as `<tt>INSTALL ${PKGNAME} POST-INSTALL</tt>'.
- `<tt>&dollar;2</tt>' can be tested to determine which mode
- the script is being run in.
- The `<tt>PKG_PREFIX</tt>' environmental variable will be set to
- the package installation directory. See man <tt>pkg_add(1)</tt>
- for additional information.
- Note, that this script is not run automatically if you install
- the port with `<tt>make install</tt>'. If you are depending
- on it being run, you will have to explicitly call it on your
- port's Makefile.
-
- <sect3>
- <heading>REQ package script</heading>
- <p>If your needs to determine if it should install or not, you
- can create a pkg/REQ ``requirements'' script. It will be invoked
- automatically at installation/deinstallation time to determine
- whether or not installation/deinstallation should proceed.
- See man <tt>pkg_create(1)</tt> and man <tt>pkg_add(1)</tt> for
- more information.
-
- <sect3>
- <heading>Install additional documentation</heading>
-
- <p>If your software has some documentation other than the
- standard man and info pages that you think is useful for the
- user, install it under <tt>&dollar;{PREFIX}/share/doc</tt>.
- This can be done, like the previous item, in the
- <tt>post-install</tt> target.
-
- <p>Create a new directory for your port. The directory name
- should reflect what the port is. This usually means
- <tt>&dollar;{PKGNAME}</tt> minus the version part. However,
- if you think the user might want different versions of the
- port to be installed at the same time, you
- can use the whole <tt>&dollar;{PKGNAME}</tt>.
-
- <p>Make the installation dependent to the variable
- <tt>NOPORTDOCS</tt> so that users can disable it in
- <tt>/etc/make.conf</tt>, like this:
-<tscreen><verb>
- post-install:
- .if !defined(NOPORTDOCS)
- ${MKDIR} ${PREFIX}/share/doc/xv
- ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${PREFIX}/share/doc/xv
- .endif
-</verb></tscreen>
-
- <p>Do not forget to add them to <tt>pkg/PLIST</tt> too! (Do not
- worry about <tt>NOPORTDOCS</tt> here; there is currently no
- way for the packages to read variables from
- <tt>/etc/make.conf</tt>.)
-
- <p>If you need to display a message to the installer, you may
- place the message in <tt>pkg/MESSAGE</tt>. This capibility
- is often useful to display additional installation steps to
- be taken after a pkg_add, or to display licensing information.
- (note: the MESSAGE file does not need to be added to pkg/PLIST).
-
-
- <sect3>
- <heading>DIST_SUBDIR</heading>
-
- <p>Do not let your port clutter <tt>/usr/ports/distfiles</tt>. If
- your port requires a lot of files to be
- fetched, or contains a file that has a name that might conflict
- with other ports (e.g., `Makefile'), set
- <tt>&dollar;{DIST_SUBDIR}</tt> to the name of the port
- (<tt>&dollar;{PKGNAME}</tt> without the version part should work
- fine). This will change <tt>&dollar;{DISTDIR}</tt> from the
- default <tt>/usr/ports/distfiles</tt> to
- <tt>/usr/ports/distfiles/&dollar;{DIST_SUBDIR}</tt>, and in
- effect puts everything that is required for your port into that
- subdirectory.
-
- <p>It will also look at the subdirectory with the same name on the
- backup master site at <tt>ftp.freebsd.org</tt>. (Setting
- <tt>&dollar;{DISTDIR}</tt> explicitly in your Makefile will not
- accomplish this, so please use <tt>&dollar;{DIST_SUBDIR}</tt>.)
-
- <p>Note this does not affect the <tt>&dollar;{MASTER_SITES}</tt>
- you define in your Makefile.
-
- <sect3>
- <heading>Feedback</heading>
-
- <p>Do send applicable changes/patches to the original
- author/maintainer for inclusion in next release of the code.
- This will only make your job that much easier for the next
- release.
-
- <sect3>
- <heading>RCS strings</heading>
-
- <p>Do not put RCS strings in patches. CVS will mangle them
- when we put the files into the ports tree, and when we check
- them out again, they will come out different and the patch
- will fail. RCS strings are surrounded by dollar
- (`<tt>&dollar;</tt>') signs, and typically start with
- `<tt>&dollar;Id</tt>' or `<tt>&dollar;RCS</tt>'.
-
- <sect3>
- <heading>Recursive diff</heading>
-
- <p>Using the recurse (`<tt>-r</tt>') option to <tt>diff</tt>
- to generate patches is fine, but please take a look at the
- resulting patches to make sure you don't have any
- unnecessary junk in there. In particular, diffs between two
- backup files, Makefiles when the port uses Imake or GNU
- configure, etc., are unnecessary and should be deleted.
- Also, if you had to delete a file, then you can do it in the
- <tt>post-extract</tt> target rather than as part of the
- patch. Once you are happy with the resuling diff, please
- split it up into one source file per patch file.
-
- <sect3>
- <heading>PREFIX</heading>
-
- <p>Do try to make your port install relative to
- <tt>&dollar;{PREFIX}</tt>. (The value of this variable will be
- set to <tt>&dollar;{LOCALBASE}</tt> (default
- <tt>/usr/local</tt>), unless <tt>&dollar;{USE_IMAKE}</tt> or
- <tt>&dollar;{USE_X11}</tt> is set, in which case it will be
- <tt>&dollar;{X11BASE}</tt> (default <tt>/usr/X11R6</tt>).)
-
- <p>Not hard-coding `<tt>/usr/local</tt>' or `<tt>/usr/X11R6</tt>'
- anywhere in the source will make the port much more flexible and
- able to cater to the needs of other sites. For X ports that use
- imake, this is automatic; otherwise, this can often be done by
- simply replacing the occurrences of `<tt>/usr/local</tt>' (or
- `<tt>/usr/X11R6</tt>' for X ports that do not use imake) in the
- various scripts/Makefiles in the port to read
- `<tt>&dollar;{PREFIX}</tt>', as this variable is automatically
- passed down to every stage of the build and install processes.
-
- <p>The variable <tt>&dollar;{PREFIX}</tt> can be reassigned in your
- Makefile or in the user's environment. However, it is strongly
- discouraged for individual ports to set this variable explicitly
- in the Makefiles. (If your port is an X port but does not use
- imake, set <tt>USE_X11=yes</tt>; this is quite different from
- setting <tt>PREFIX=/usr/X11R6</tt>.)
-
- <p>Also, refer to programs/files from other ports with the
- variables mentioned above, not explicit pathnames. For instance,
- if your port requires a macro <tt>PAGER</tt> to be the full
- pathname of <tt>less</tt>, use the compiler flag:
- <verb>-DPAGER=\"&dollar;{PREFIX}/bin/less\"</verb> or
- <verb>-DPAGER=\"&dollar;{LOCALBASE}/bin/less\"</verb> if this is an
- X port, instead of <verb>-DPAGER=\"/usr/local/bin/less\"</verb>.
- This way it will have a better chance of working if the system
- administrator has moved the whole `/usr/local' tree somewhere
- else.
-
- <sect3>
- <heading>Subdirectories</heading>
-
- <p>Try to let the port put things in the right subdirectories
- of <tt>&dollar;{PREFIX}</tt>. Some ports lump everything
- and put it in the subdirectory with the port's name, which is
- incorrect. Also, many ports put everything except binaries,
- header files and manual pages in the a subdirectory of
- `<tt>lib</tt>', which does not bode well with the BSD
- paradigm. Many of the files should be moved to one of the
- following: `<tt>etc</tt>' (setup/configuration files),
- `<tt>libexec</tt>' (executables started internally),
- `<tt>sbin</tt>' (executables for superusers/managers),
- `<tt>info</tt>' (documentation for info browser) or
- `<tt>share</tt>' (architecture independent files). See man
- <tt>hier(7)</tt> for details, the rule governing
- <tt>/usr</tt> pretty much applies to <tt>/usr/local</tt>
- too. The exception are ports dealing with USENET `news'.
- They may use <tt>&dollar;{PREFIX}/news</tt> as a destination
- for their files.
-
- <sect3>
- <heading>ldconfig</heading>
-
- <p>If your port installs a shared library, add a
- <tt>post-install</tt> target to your Makefile that runs
- `<tt>/sbin/ldconfig -m</tt>' on the directory where the new
- library is installed (usually <tt>&dollar;{PREFIX}/lib</tt>)
- to register it into the shared library cache.
-
- <p>Also, add an <tt>@exec</tt> line to your <tt>pkg/PLIST</tt>
- file so that a user who installed the package can start
- using the shared library immediately. This line should
- immediately follow the line for the shared library itself,
- as in:
-<tscreen><verb>
-lib/libtcl.so.7.3
-@exec /sbin/ldconfig -m %D/lib
-</verb></tscreen>
-
- <p>Never, ever, <em>ever</em> add a line that says
- `<tt>ldconfig</tt>' without any arguments to your Makefile
- or pkg/PLIST. This will reset the shared library cache to
- the contents of <tt>/usr/lib</tt> only, and will royally
- screw up the user's machine ("Help, xinit does not run
- anymore after I install this port!"). Anybody who does this
- will be shot and cut into 65,536 pieces by a rusty knife and
- have his liver chopped out by a bunch of crows and will
- eternally rot to death in the deepest bowels of hell (not
- necessarily in that order)....
-
- <sect3>
- <heading>If you are stuck....</heading>
-
- <p>Do look at existing examples and the <tt>bsd.port.mk</tt>
- file before asking us questions! <tt>;)</tt>
-
- <p>Do ask us questions if you have any trouble! Do not just
- beat your head against a wall! <tt>:)</tt>
-
- <sect2>
- <heading>A Sample Makefile<label id="porting:samplem"></heading>
-
- <p>Here is a sample Makefile that you can use to create a new
- port. Make sure you remove all the extra comments (ones
- between brackets)!
-
- <p>It is recommended that you follow this format (ordering of
- variables, empty lines between sections, etc.). Not all of
- the existing Makefiles are in this format (mostly old ones),
- but we are trying to uniformize how they look. This format is
- designed so that the most important information is easy to
- locate.
-
-<tscreen><verb>
- [the header...just to make it easier for us to identify the ports]
- # New ports collection makefile for: xdvi
- # Version required: pl18 [things like "1.5alpha" are fine here too]
- # Date created: 26 May 1995
- [this is the person who did the original port to FreeBSD, in particular, the
- person who wrote this Makefile]
- # Whom: Satoshi Asami <asami@FreeBSD.ORG>
- #
- # &dollar;Id&dollar;
- [ ^^^^ This will be automatically replaced with RCS ID string by CVS
- when it is committed to our repository.]
- #
-
- [section to describe the port itself and the master site - DISTNAME
- is always first, followed by PKGNAME (if necessary), CATEGORIES,
- and then MASTER_SITES, which can be followed by MASTER_SITE_SUBDIR.
- After those, one of EXTRACT_SUFX or DISTFILES can be specified too.]
- DISTNAME= xdvi
- PKGNAME= xdvi-pl18
- CATEGORIES= print
- [do not forget the trailing slash ("/")!
- if you aren't using MASTER_SITE_* macros]
- MASTER_SITES= ${MASTER_SITE_XCONTRIB}
- MASTER_SITE_SUBDIR= applications
- [set this if the source is not in the standard ".tar.gz" form]
- EXTRACT_SUFX= .tar.Z
-
- [section for distributed patches -- can be empty]
- PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
- PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
-
- [maintainer; *mandatory*! This is the person (preferably with commit
- privileges) who a user can contact for questions and bug reports - this
- person should be the porter or someone who can forward questions to the
- original porter reasonably promptly. If you really do not want to have
- your address here, set it to "ports@FreeBSD.ORG".]
- MAINTAINER= asami@FreeBSD.ORG
-
- [dependencies -- can be empty]
- RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
- LIB_DEPENDS= Xpm\\.4\\.:${PORTSDIR}/graphics/xpm
-
- [this section is for other standard bsd.port.mk variables that do not
- belong to any of the above]
- [If it asks questions during configure, build, install...]
- IS_INTERACTIVE= yes
- [If it extracts to a directory other than ${DISTNAME}...]
- WRKSRC= ${WRKDIR}/xdvi-new
- [If the distributed patches were not made relative to ${WRKSRC}, you
- may need to tweak this]
- PATCH_DIST_STRIP= -p1
- [If it requires a "configure" script generated by GNU autoconf to be run]
- GNU_CONFIGURE= yes
- [If it requires GNU make, not /usr/bin/make, to build...]
- USE_GMAKE= yes
- [If it is an X application and requires "xmkmf -a" to be run...]
- USE_IMAKE= yes
- [et cetera.]
-
- [non-standard variables to be used in the rules below]
- MY_FAVORITE_RESPONSE= "yeah, right"
-
- [then the special rules, in the order they are called]
- pre-fetch:
- i go fetch something, yeah
-
- post-patch:
- i need to do something after patch, great
-
- pre-install:
- and then some more stuff before installing, wow
-
- [and then the epilogue]
- .include <bsd.port.mk>
-</verb></tscreen>
-
- <sect2>
- <heading>Package Names</heading>
-
- <p>The following are the conventions you should follow in
- naming your packages. This is to have our package directory
- easy to scan, as there are already lots and lots of packages
- and users are going to turn away if they hurt their eyes!
-
- <p>The package name should look like
-
-<tscreen><verb>
-[<language>-]<name>[[-]<compiled.specifics>]-<version.string.numbers>;
-</verb></tscreen>
-
- If your <tt>&dollar;{DISTNAME}</tt> doesn't look like that,
- set <tt>&dollar;{PKGNAME}</tt> to something in that format.
-
- <enum>
- <item>FreeBSD strives to support the native language of its
- users. The `&lt;language&gt;' part should be a two letter
- abbreviation of the natural language if the port is specific
- to a certain language. Examples are `jp' for Japanese,
- `ru' for Russian, `vn' for Vietnamese, `cn' for Chinese,
- and `kr' for Korean.
-
- <item>The `<tt>&lt;name&gt;</tt>' part should be all
- lowercases, except for a really large package (with lots of
- programs in it). Things like XFree86 (yes there really is a
- package of it, check it out) and ImageMagick fall into this
- category. Otherwise, convert the name (or at least the
- first letter) to lowercase. If the software in question
- really is called that way, you can have numbers, hyphens and
- underscores in the name too (like `kinput2').
-
- <item>If the port can be built with different hardcoded
- defaults (usually specified as environment variables or on
- the <tt>make</tt> command line), the
- `&lt;compiled.specifics&gt;' part should state the
- compiled-in defaults (the hyphen is optional). Examples are
- papersize and font units.
-
- <item>The version string should be a period-separated list of
- integers and single lowercase alphabets. The only exception
- is the string `pl' (meaning `patchlevel'), which can be used
- <em>only</em> when there are no major and minor version
- numbers in the software.
- </enum>
-
- <p>Here are some (real) examples on how to convert a
- <tt>&dollar;{DISTNAME}</tt> into a suitable
- <tt>&dollar;{PKGNAME}</tt>:
-
-<tscreen><verb>
-DISTNAME PKGNAME Reason
-mule-2.2.2 mule-2.2.2 no prob at all
-XFree86-3.1.2 XFree86-3.1.2 ditto
-EmiClock-1.0.2 emiclock-1.0.2 no uppercase names for single programs
-gmod1.4 gmod-1.4 need hyphen after `<name>'
-xmris.4.02 xmris-4.02 ditto
-rdist-1.3alpha rdist-1.3a no strings like `alpha' allowed
-es-0.9-beta1 es-0.9b1 ditto
-v3.3beta021.src tiff-3.3 what the heck was that anyway? ;)
-tvtwm tvtwm-pl11 version string always required
-piewm piewm-1.0 ditto
-xvgr-2.10pl1 xvgr-2.10.1 `pl' allowed only when no maj/minor numbers
-gawk-2.15.6 jp-gawk-2.15.6 Japanese language version
-psutils-1.13 psutils-letter-1.13 papersize hardcoded at package build time
-pkfonts pkfonts300-1.0 package for 300dpi fonts
-</verb></tscreen>
-
- <p>If there is absolutely no trace of version information in the
- original source and it is unlikely that the original author
- will ever release another version, just set the version string
- to `1.0' (like the piewm example above). Otherwise, ask the
- original author or use the date string (`yy.mm.dd') as the
- version.
-
- <sect2>
- <heading>That is It, Folks!</heading>
-
- <p>Boy, this sure was a long tutorial, wasn't it? Thanks for
- following us to here, really.
-
- <p>Well, now that you know how to do a port, let us go at it and
- convert everything in the world into ports! That is the
- easiest way to start contributing to the FreeBSD Project!
- <tt>:)</tt>
OpenPOWER on IntegriCloud