Source
To be removed once all major points in this email are covered.
From: john_owens@yahoo.com
Subject: my first port - how to
Date: 10 December 2006 08:48:13 EST
To: macports-users@lists.macosforge.org
Greetings, I'm attempting to write my first port. Writing the portfile
is not too difficult, as there's lots of good examples. However,
actually making it install is a lot tougher.
I am making it work by:
- adding the portfile in the right place in /opt/local
- changing the portindex file to add the port info manually (and
making up a number for it)
However, these things seem really kludgey. Is it not possible to
have a local portfile somewhere and install it using a command
line "port" command? That would seem much better, but I can't find
any documentation on how that's done. (For instance, there's a
local "~/.portsrc" file? but I can't find any docs on it.)
I think this is the sort of thing that really ought to be on the
wiki - the barrier to entry of adding a portfile is really very
high, and a short guide would be helpful. What it should say:
- "So you've written a Portfile. Here's how you test it locally."
- "Here's how you prevent it from being clobbered when you
selfupdate."
- "Here's where you put it if you're testing it locally, and want
to leave it local for a while."
- "Your Portfile is awesome. It works. Here's how to add it to
the MacPorts repository."
- "... and here's how you update it."
- "Your Portfile probably has lots of dependencies. Here's how
you tell what they are."
- "Here are naming conventions for ports."
etc.
Especially the first one right now would be very useful for me.
JDO
Comments from boeyms@
I intend to get this written up properly some day, but in the meantime:
Creating and maintaining a local port tree for developing ports
- Create the path at which you wish the local port tree to be rooted; I will call it ${localportpath}.
- Create the paths in which you wish to place your portfiles; they will need to be in the form ${localportpath}/<category>/<portname>. Any patches will be expected to be in ${localportpath}/<category>/<portname>/files.
- Run portindex ${localportpath} (or cd to ${localportpath} and run portindex) to generate the PortIndex so that MacPorts will find the ports; portindex will report whether or not it has errors parsing the Portfiles, so fix them before you continue.
- Add ${localportpath} to ${prefix}/etc/ports/sources.conf before the other sources configured there; as should be documented there, you will need to write it as a URL, i.e. file://${localportpath}.
- It should now all work!
Updating a port when you're not a committer, or when it's not your port
- Set up an account on http://www.macports.org/ if you have not already done so. Follow the "Register" link on any MacPorts page (it appears visually in the top right corner).
- Go to the Bug Reports page (you will be asked to log in if you have not done so already) and follow the "New Ticket" link (or go there directly).
- Fill out the ticket in accordance with the guidelines in TracTicketing; note the fact that, as of this writing (6 May 2007), notification of a new ticket is not automatically sent to the assignee of a ticket, so you will need to put the assignee's address into the Cc: field by hand. As mentioned in TracTicketing, also add at least your own email address to the Cc: field so that you are notified about any comments on or changes to the ticket.
- Preview your ticket (you won't be able to change its content after submission, only append to it), and then submit it if you are satisfied.
- Attachments: you can add or replace these after the ticket has been submitted by using the "Attach File" button on the ticket once it has been created.
- Please attach any patch files or new Portfiles rather than pasting them inline; the wiki formatting engine may mangle it otherwise.
Determining the dependencies of a port
- A very useful, though not foolproof, technique is to invoke port with the "-t" flag; this will activate the "trace" mode, in which Macports will tell you, after successfully completing each of the stages it goes through:
- if it thinks there are any undeclared dependencies at that stage;
- if it thinks there are any unused dependencies at that stage;
- if any attempts were made to write to files outside of the "sandbox" areas used for fetching patching, configuring, building, testing and destrooting.
- Some ways in which the trace mode can be fooled are:
- if you have the sysutils/coreutils port installed, ports that use configure scripts produced by GNU Autoconf will detect and use the "ginstall" or "install" executable that sysutils/coreutils installs into ${prefix}/bin, and trace mode will declare coreutils as an undeclared dependency in the configure stage. This is (almost certainly) false, as the system-provided /usr/bin/install will work just fine.

