wiki:snc

Version 19 (modified by nerdling (Jeremy Lavergne), 16 years ago) (diff)

when to use patch files

Portfile Development

MacPorts Guide

It's a good idea to start out with the Portfile Development section of the MacPorts Guide. There's a line-by-line explanation in Section 4.2 that will help you write a portfile from scratch.

Diamonds in the Rough

Unfortunately, there are useful things that end up buried in the Guide. For example, if you're developing against mysql5 (where multiple packages might create the mysql5 binary), you'd want to depend on the binary instead of a specific port. This is accomplished in php5 through depends_lib-append path:bin/mysql_config5:mysql5. Note: The trailing mysql5 indicates which port to be installed if the binary cannot be found.

Also hidden (to the point where I cannot find it) is how to write wrapper scripts; wine is considered the poster-portfile. Another example is pspp. The scripts should be included in the port's files directory and dynamically modified through the portfile by the tcl extensions, xinstall and reinplace.

When to Use Patch Files

There are 4 basic rules to follow when considering patch files.

  1. Do nothing, because MacPorts already puts --prefix=${prefix} in configure.pre_args and most software uses configure scripts and most configure scripts understand that flag.
  2. If there is another flag you need to use instead, overwrite configure.pre_args.
  3. If there is no flag to do this, try an environment variable (e.g., configure.env-append PREFIX=${prefix} ).
  4. If no environment variable exists for this, then patch.

Do Not Hardcode /opt/local

Speaking of reinplace, do not hardcode /opt/local anywhere! Instead, use reinplace to replace things like ${prefix} and ${x11prefix} and other variables that can be different on users' systems.

Portindex

Once you've created your portfile, it's best to test it with your copy of MacPorts. The first step is to create a local portfile repository for testing. For this, I suggest creating the directory ~/ports. Inside this new directory, you should run portindex which will create the repository index of everything following the ./group/port/Portfile heirarchy. Note: This command should be run everytime you make changes as it will include the new index data for MacPorts. Also watch out for any errors it reports, which stop the portfile from showing up in MacPorts.

Port Info

Once you have a repository setup and indexed, you can then instruct MacPorts to include the repository's path in ${prefix}/etc/macports/sources.conf — the order of this file's content is important as ports are loaded in a first-come-first-serve basis. To test if your port index is being included, run port info portname where portname is a port you've placed in your local repository. If everything works well, you'll notice information appearing from your local repository's portfile. Note: If you have a port named the same as an existing one, this will report that there are two copies found with the first encounter being displayed. This is why the order of repositories listed in sources.conf matters.

Port Lint

Now that your copy of MacPorts is able to interact with your portfile, run port lint --nitpick portname to do a maximum compliance check. If it reports 0 errors and 0 warnings then you're ready to submit your portfile to MacPorts. Contributing to MacPorts shows how to create a ticket for quickest acceptance.

Disabling Your Local Repository

Once you're done with development, you can disable your local repository by commenting the line out of your sources.conf file. You can optionally delete your repository's directory, however I suggest keeping it as you can use it for reference when working on future portfiles, and it saves you from having to recreate the directory.