Chapter 12 introduced you to some of the areas any PC-BSD user can explore to contribute to the PC-BSD community. This chapter covers more advanced forms of contribution that typically require programming skills. If you are a programmer, taking programming in school and looking for opportunities to practice your skills, or if you are interested in learning more about how the PC-BSD operating system and push button installer applications (PBIs) are developed, this chapter is for you.
We begin by describing the PC-BSD release engineering process and the resources available to developers to give you an idea of what to expect. If you have limited programming knowledge, you can still successfully complete the tasks found in the section on "Converting a FreeBSD Port Using PBI Builder."
Any large software project needs a set of guiding principles and processes. Ideally, a project's processes are documented so new developers know what to expect. Processes are meant to address how the software project manages its code development, answering questions such as:
Where is the source code located? Is it browsable? Is it downloadable?"
Who is allowed to make (commit) changes to the source code? Are changes monitored or checked by other developers?
Can a committer make a change anywhere in the code base or are committers given write permission to only certain sections of the code?
How often are new changes tested against the entire code base? If a commit breaks something, who is alerted and who fixes the problem?
Are commits made against the current released version of the software or to a testing version that has not been released yet?
Who determines what features should go into the next software release?
Are there any rules governing what style of code developers are expected to use?
How often are new versions of the software released?
How long are older versions of the software maintained for security patches?
The rest of this section provides an overview of how PC-BSD manages its development process.
It is useful to remember that PC-BSD is based on FreeBSD and closely follows FreeBSD's set of processes that are documented in the FreeBSD Release Engineering[104] document.
The code base for PC-BSD is kept in a subversion server, and trac provides browse and search mechanisms for the code base. Chapter 12 introduced you to the PC-BSD trac system. PC-BSD's code base is divided into branches, with each branch representing a different version of the software. Figure 14-1 shows the branches for the "pcbsd"
code base from versions 1.4 to 7.1.1.
New commits are made against trunk
, which represents the current version that hasn't been released yet. Figure 14-1 was taken before the release of PC-BSD 8, meaning that version 8 was the trunk
version at that time.
After a version is released, it is moved from trunk
to a new version number in branches
, and a new trunk
is created for the next expected version. It is rare for a commit to be made against a released version because it is considered to be released (or finalized).
trunk
and each branch
version are divided into modules, which allow developers to follow and commit to the modules that interest them. Most modules contain the source files and configurations for a PC-BSD utility. The modules for trunk
(version 8.0 before it was released) are seen in Figure 14-2 and briefly described in Table 14-1.
Table 14-1. Overview of PC-BSD Software Modules
Module | Description |
---|---|
build-files | Configuration files and patches used to build PC-BSD |
CrashHandler | Program that is executed when a PBI's executable exits with an error condition |
installcd-overlay | Filesystem on the 32-bit version of the installation CD/DVD |
installcd-overlay64 | 64-bit version of files that differ from the 32-bit version found in installcd-overlay |
kcmPBSystem | Files needed for System Manager to work in KDE |
kcmPFManager | Files needed for Firewall Manager to work in KDE |
kcmSoftwareManagerLauncher | Files needed for Software Manager to work in KDE |
kcmUserManagerLauncher | Files needed for User Manager to work in KDE |
libpcbsd | Libraries specific to PC-BSD |
lifePreserver | Life Preserver backup utility |
mfsroot-overlay | The list of files copied to the memory filesystem during installation |
mind | Mind map template for XMind[a] |
PBIdelete | PBI uninstaller |
PBIThumbnailCreator | PBI thumbnail creator |
PBReg | PC-BSD registry tool |
pc-sysinstall | PC-BSD installer backend |
PC-BSD networking utilities | |
pcbsdusermanager | User manager |
ServiceManager | Service Manager |
SoftwareManager | Software Manager |
SoundDetect | Utility to detect installed sound cards |
SoundError | Utility that creates a diagnostic sheet when no sound card is detected |
SysInstaller | PC-BSD installer program |
system-overlay | Filesystem for 32-bit version of PC-BSD |
system-overlay64 | 64-bit version of files that differ from the 32-bit version found in system-overlay |
SystemUpdaterTray | System Updater |
XGUISource | Display setup program |
[a] |
Security patches are not stored on the trac server because they are usually based on the FreeBSD security advisory system.[105] Every PC-BSD security patch installed by Update Manager contains the URL to the associated security advisory.
You can also view each available, ignored, and installed system patch for your system in /PCBSD/SystemUpdater/system-updates/.
As changes are committed to the PC-BSD code base, an email containing the details of the change is automatically sent to the Commits mailing list.[106] Browsing through that list's archives gives you a good idea of the changes made to the PC-BSD code base.
As the trunk
version of PC-BSD gets closer to being released, installable versions of the operating system are periodically released to the Testing mailing list.[107] As described in Chapter 12, everyone is encouraged to install and try the testing version and to report any bugs so that developers can fix them. This helps to ensure that when the new version is released, it has been tested on many different types of hardware and is as bug-free as possible.
In addition to the resources mentioned in the previous section, the following resources are available to programmers interested in contributing to the development of the PC-BSD operating system.
Dev[108] mailing list: For general development discussion. This is where features are planned and discussed.
Development team:[109] In addition to the contact information for each team member, this page lists which development tasks are needed for system development and translation, quality assurance, PBI development, PBI quality assurance, documentation, web development, and system administration. It also lists who to contact if you are interested in helping in one of these areas.
Development Guidelines:[110] Discusses naming conventions, indentation, internationalization support, documentation, and licensing.
If you are interested in PC-BSD system development, you should also take the time to familiarize yourself with the following documentation because PC-BSD is based on FreeBSD and KDE.
Anyone can browse and download any portion of the PC-BSD code base. If you are interested only in a few files, you can use your browser to download them from the trac server. If you would like to follow the changes being made in an entire branch while keeping the files you have downloaded "in sync" with the changes on the subversion server, you should use the svn utility to "check out" (download) the files you need.
Your PC-BSD system comes with the svn utility installed, and the Getting Source guide[114] contains instructions for downloading all the branches, trunk
only, or a specified branch. svn comes with a lot of options; following are the ones developers use most often.
svn co
: Checks out the specified directory. It creates a directory of the same name in your current working directory. For example, if you check out the repository using the command "svncosvn://svn.pcbsd.org/pcbsd
," a directory named "pcbsd" is created that contains everything you see under "pcbsd" on the trac server. You should see a list of files as they are copied. If you receive a message similar to "Checked out revision 5487," your copy is identical to the one on the trac server.
svn up
: Updates your already downloaded copy so that it contains all the files on the trac server. Always run this command in the directory name that matches the directory you would like to sync with.
svn help
: Lists all the possible commands. If you add help to a command, it shows its usage (for example, svn help co
.
Only PC-BSD committers are able to make changes to the code on the trac server. If you have created code patches, submit them using the methods described in Chapter 12. Over time, the community gets to know you and your development style. If you submit many useful patches, don't be surprised if you are asked whether you would like to have a commit bit, the term used to signify that you now have the necessary permissions to upload your changes directly to the code base.
PC-BSD committers are also able to use the following svn commands.
svn add
: Adds the specified file to the code base
svn rm
: Removes the specified file from the code base
svn ci
: Checks in (uploads) your changed files to the code base
The previous sections describe the development process for the PC-BSD operating system. This section concentrates on the development process for PBIs.
PBIs are stored on the PC-BSD Project's official PBI build servers (http://pbibuild.pcbsd.org
and http://pbibuild64.pcbsd.org
). Every Monday through Friday night, each server checks and builds the PBIs that meet any of these criteria:
The PBI is newly added.
The PBI's underlying FreeBSD port has been updated.
The PBI committer sets a configuration value indicating that the PBI should be rebuilt.
If the build of a PBI fails, an email is automatically sent to the Pbibuild mailing list.[115] The email contains the last 50 lines of the build log, which should include the error message. The full build log can be downloaded from the PBI build server. Figure 14-3 shows a screenshot from the build server, which indicates that the astro/googleearth build has failed.
To access the build log, click the hyperlink for the failed PBI, in this case astro/googleearth. The build log has a .bz extension, which indicates that it has been compressed. You can uncompress the file using the bunzip2
command that came with your PC-BSD system.
The configuration information used for building a PBI is known as a module. PBI modules are created by the PBI maintainer. The next section demonstrates how to create a PBI module. You can browse through all the modules at http://trac.pcbsd.org/browser/pbibuild/modules
. Browsing through the modules can be helpful if you are stuck building a PBI or aren't sure how to modify a PBI's configuration files and want to see how other PBI developers handled their module's configuration. Two tools are available for creating a PBI. The recommended method is to use PBI Builder[116] when a FreeBSD port already exists. If a FreeBSD port does not exist, PBI Creator[117] can be used to create the PBI. PBI Builder is recommended for several reasons, including:
Most of the development work has already been done for you by the person who ported the software to FreeBSD.
PBI Builder is fairly straight-forward to use, meaning anyone with a bit of time and patience should be able to create a PBI.
PBI Builder creates a sandbox environment for building the PBI. This means that you don't have to create an environment on a separate build computer, it won't harm your computer, and the resulting PBI has everything it needs to work on a PC-BSD system.
PBI Builder enables you to create the module files understood by the PBI build server. After it is on the PBI build server, your PBI automatically updates whenever the underlying FreeBSD port changes.
The PBI build server sends out an automatic email message and generates a build log if your PBI ever fails to build.
In contrast, PBI Creator isn't recommended for several reasons, including:
It requires you to create your own clean build system, which means you want to use a separate computer (or virtual environment) that needs to be returned to a default PC-BSD install for every PBI that is built.
It requires you to manually populate your build environment with the application source and dependencies (PBI Builder automatically does this for you).
There are more than 21,000 FreeBSD ports, which means there is already plenty of software waiting to be built using PBI Builder.
If you are using PBI Creator because no FreeBSD port exists, you get to do all the porting work. Depending upon the size of the application, the number of its dependencies and what assumptions were coded into the software (for example, expected paths, libraries, devices, and so on), this work can range from trivial to really hard and time consuming to far exceeds your coding knowledge. We recommend that if you do all of the work required to port the software, you should submit the port to the FreeBSD ports collection and then use PBI Builder to convert the port to a PBI. This enables the ported software to be used by both FreeBSD and PC-BSD users and enables the resulting PBI to take advantage of the benefits provided by the PBI build server.
For these reasons, this chapter demonstrates only how to use PBI Builder. If you would like to tackle porting software to a FreeBSD port, work your way through the FreeBSD Porter's Handbook.[118]
After a PBI is created, it needs to be tested by others before it is added to the PBI build server and made available for download at pbidir.com
. This helps to ensure the quality of the software available to PC-BSD users and provides a check that the developer didn't miss anything when creating the PBI.
Anyone can test a PBI. Feedback regarding a PBI should be sent to the Pbi-dev mailing list. This list should also be used if you ever find a bug in a PBI that is already available at pbidir.com
so the developer can fix the bug.
In addition to the resources mentioned in the previous section, several resources are available to PBI developers, including:
Chapters 9 and 10 introduced you to FreeBSD ports and packages and gave some insight into the work port maintainers go through so that the package and port "just work." PBI Builder simplifies the process of converting an existing FreeBSD port into a PBI, which means anyone can create a PBI without needing much (if any) previous development experience. If you have a bit of time to spare, like to learn new things, and are interested in seeing as much software as possible available to the PC-BSD community, try your hand at creating a PBI with PBI Builder. The more PBIs that are available, the better it is for everyone because it ensures that even brand new PC-BSD users can safely install the software they need and keep it up to date.
Information about and the download for PBI Builder can be found at http://www.pcbsd.org/content/view/45/30/
. PBI Builder is a command-line utility that requires you to edit a few configuration variables that are used when the PBI is built. PBI Builder automates the entire build process: the creation of the build sandbox, fetching the source for the port and all its dependencies, building everything that is needed, and converting the results into the PBI.
PBI Builder uses a large archive that contains the system source and world environment used by PC-BSD. It provides all the libraries needed to ensure that the resulting PBI works on the version of PC-BSD that matches the version of PBI Builder.
The file /pbi-build/docs/HOWTO-MODULES is well worth reading because it fully explains all the files contained in the archive and the PBI creation process. If you're curious about what commands are executed when building a PBI, read through the scripts in /pbi-build/scripts/. You can also find some examples in /pbi-build/docs/module-examples.
Before building your PBI
Check that a PBI for that software doesn't currently exist at pbidir.com
or pbibuild.pcbsd.com
.
Check that the Pbi-dev mailing list isn't currently testing a PBI for that software.
Check to see if a module already exists at http://trac.pcbsd.org/browser/pbibuild/modules
.
Search for the software at freshports.org
. Some of the FreshPorts details for that software come in handy when you configure your PBI module.
Download and untar
the PBI Builder archive according to the instructions in the "Using the PBI Builder"[123] document.
Now that your system is ready for building PBIs, download the PBI module template.
# cd /pbi-build/modules
# fetch http://www.pcbsd.org/files/templates/module-template.tgz
# tar xvzf module-template.tgz
Create a directory structure for your module that represents the port's category and name. Copy the contents of the template directory to your new directory. We use the example of creating a module named /pbi-build/modules/irc/conspire.
# mkdir -p irc/conspire
# cp -R template/* irc/conspire/
# ls -F irc/conspire
build.sh
kmenu-dir/
overlay-dir/
preportmake.sh
copy-files
mime-dir/
pbi.conf
Most PBIs can be successfully built after modifying a few lines in pbi.conf
and kmenu-dir/0mymenu
. This section shows you how to make those changes, and the next section demonstrates more advanced configurations.
To successfully configure your module, you must modify the following variables in the pbi.conf file
.
PROGNAME
: The name of the PBI. This should be the same name as the FreeBSD port. Don't include the version number unless there is already another PBI for a different version.
PROGWEB
: The Main Web Site URL for the port as listed at Freshports.
PROGAUTHOR
: Most software is maintained by a project rather than an individual. Examples of suitable values are The Mozilla Foundation (for firefox) or the BitchX team (for bitchx).
PROGICON
: At Freshports, check the pkg-plist
in the CVSWeb for the port to find the path to the png
file representing the icon for the application. If there is more than one, look for the png
with the same name as the port. If there is no png
for the software, check the software's website to see if it has an icon image. If there is an image available, download the image, convert it to png
if it is in another format, save the png
to the module's overlay-dir directory, and provide only the name of the png
.
PBIPORT
: The full path to the port to be built.
Here is an example of the changes made to /pbi-build/modules/irc/conspire/pbi.conf
:
# Program Name
PROGNAME="conspire"
# Program Website
PROGWEB="http://confluence.atheme.org/display/CON/Home"
# Program Author
PROGAUTHOR="Conspire Team"
# Default Icon (Relative to overlay-dir)
# Please only use PNG files for the program icon
PROGICON="share/pixmaps/conspire.png"
# FreeBSD Port we want to build
PBIPORT="/usr/ports/irc/conspire"
Next, you must modify the first three variables in kmenu-dir/0mymenu
.
ExePath
: The path to the executable that should start when the application is launched. You can find the correct path name at Freshports. Click the CVSWeb link for the port, and then click the pkg-plist
. The binary has "bin" somewhere in the path. If there are multiple binary paths, select the binary that seems the most reasonable name for the application.
ExeIcon
: The same path you used in PROGICON= in pbi.conf
. This allows the icon to show in the KDE menu.
ExeDescr
: A short (2–3 words) description that shows up in the KDE menu.
The example for /pbi-build/modules/irc/conspire/kmenu-dir/0mymenu
looks like this:
ExePath: bin/conspire
ExeIcon: share/pixmaps/conspire.png
ExeDescr: IRC Client
When you finish making your changes, ensure that the system is connected to the Internet because you require connectivity to build the underlying port.
You're now ready to cd
into the /pbi-build
directory and start the pbibuld.sh
script. Include the name of the module you wish to build. If you don't provide any arguments, the script builds every module that exists in the modules directory. The script provides some messages as the build progresses, as seen in the following example:
# cd /pbi-build
# ./pbibuild.sh irc/conspire
Running portsnap to update ports tree
Starting module traversal...
Copying /pbi-build/buildworld to /pbi-build/pbisandbox
Copying /pbi-build/ports to /pbi-build/pbisandbox/usr/ports
Starting build of irc/conspire
Rebuilding module irc/conspire...
Found preportmake.sh, running it...
Running port build...
SUCCESS! Build finished for irc/conspire
#
If you want to watch the details of the build process, you can monitor the build log using "tail -f /pbi-build/outgoing/irc/conspire/build.log
" and substitute the pathname for your PBI.
Although the PBI build process is completely automated and should just work, it does take time. The amount of time depends upon the size of the application, the number of dependencies, and the speed of your build system.
When the build is finished, you receive your prompt back and the PBI is placed in a subdirectory of /pbi-build/outgoing/
with the same name as the module you built. In this example, the PBI is found in /pbi-build/outgoing/irc/conspire/conspire4.0.35-PV0.pbi
.
Most PBIs can be built by simply modifying the variables mentioned in the previous section. This section provides an overview of the more advanced configurations that are possible through modifying the other variables and files that come with the modules template.
build.sh
: This script is run after all the files have been copied to the PBI's directory and can contain any commands you wish to run at that time. The PBI Module Builder Guide[124] provides an example that modifies the version number.
copy-files
: It is rare to need this file, but you can use it to modify where certain files get populated to.
kmenu-dir/0mymenu
: The variables in this file control how the application appears in the KDE menu. Table 14-2 provides a description of each variable.
mime-dir/00mymime
: Some applications require their MIME types to be listed to work correctly. See the PBI Module Builder Guide for usage examples and gotchas.
overlay-dir/
: PBI builder automatically populates all the files needed by the PBI, according to the underlying port's instructions. If you have an additional file you would like to include (for example a README for the PBI) or a customized graphic, include it here. You can also customize the PBI scripts that came with this directory but should only do so if you have a good reason to make the change.
pbi.conf
: Table 14-3 summarizes the remaining variables in this file.
preportmake.sh
: Allows you to execute commands needed for the port to build properly. See the PBI Module Builder Guide for an example.
Table 14-2. Variables that Control a PBI's Appearance in the KDE Menu
Description | |
| The path to the application's executable as listed at Freshports. |
| The path to the application's icon as listed at Freshports or the name of the custom icon you have created in overlay-dir/. |
| A brief description of the application. |
| Set to 0 if you want a desktop icon and to 1 if you don't. |
| Set to 0 if you want an icon in the KDE menu and 1 if you don't. |
| Some applications require superuser access to run correctly. Set this to 1 to require the user to enter the administrative password when the application launches. |
| Set to 0 if the application should run in a GUI and set to 1 if the application is command-line based and should be executed in a Konsole session. |
| Set to 0 to disable the bouncy application loading icon and set to 1 to enable it (the preferred setting). |
| Set to 1 to open the |
| If the ExePath value is an URL, set to 1 to open the URL in Konqueror; otherwise, leave it set as 0. |
| Places application in system tray; this feature is currently unimplemented. |
| 0 places the application name in top level directory of KDE menu, 1 places the application name in its own directory under the category indicated by |
| Set to one of the category names listed in Kickoff |
If you right-click Kickoff and select Menu Editor, you can see the settings that come with every application in the KDE menu. Comparing the General and Advanced tab of an application should give you a better understanding of the effect that the variables in Table 14-3 have on the KDE menu. Figure 14-4 shows a screenshot for the installed conspire PBI.
Table 14-3 briefly describes the remaining variables that can be set in pbi.conf
.
Table 14-3. Remaining Variables for pbi.conf
Variable | Description |
---|---|
| Enables you to override the PBI version if the build fails to automatically detect it. |
| Leave at |
| Leave as-is as needed by the PBI build server. |
| If you want to include another port in your PBI (besides the dependencies listed in the port's |
| Enables you to pass make targets that are used when the PBI is built; Chapter 10 discusses targets. |
| Committers can temporarily change this number to force the build server to rebuild the PBI. |
Use this if you want to use the application's internal fonts instead of the system fonts. | |
| Use this to use the applications internal libGL libraries instead of the system libraries. |
| Several prune variables allow you to keep include directories, python files, perl files, or doc files that were created during the PBI build. |
| Uncomment this line if you are building an inmate file instead of a PBI. |
| Uncomment and set a version number for the inmate; increment the number for each later version. |
As long as there isn't a problem with the underlying FreeBSD port and assuming you have followed all of the steps in the section on "Building your First PBI," PBI Builder should just work. If the build fails, double-check Freshports to confirm that the port isn't broken, forbidden, or restricted.
If the port looks fine, check the error message that appeared when you received your prompt back. It contains the number of the script that failed. The 2.1 in the following example indicates that /pbi-build/scripts/2.1.startmake.sh
failed. Any script with a lower number is successful, and any script with a higher number has not run yet.
ERROR: 2.1 Build failed of irc/conspire!!!
When PBI Builder exits, it compresses the log of the PBI build process, so you need to uncompress it with the bunzip2
command. Take the time to go through the build log, starting at the end, because this is where the error occurred. Usually, the problem is obvious from the error. If it is not, work your way backwards to see what happened successfully before the error occurred. If the error indicates that the port build was unable to fetch a required file, double-check your Internet connectivity.
After you resolve the error, remove the .lock file and rerun buildpbi.sh
. The build starts over again to ensure that your sandbox environment is clean.
If you are stuck, send an email to the Pbi-dev mailing list that includes the error and enough contextual information to enable other developers to help you figure out what went wrong.
After you have a PBI, you want to test it yourself before making it available for others to test. From Dolphin, navigate to your PBI, right-click it, and select Open with PBI Launcher. The PNG for your PBI should show in the PBI's icon within Dolphin. As the PBI installs, check the initial installation screen to ensure that the Vendor (PROGAUTHOR variable) and URL (PROGURL variable) are displayed correctly. After the PBI is finished installing, start the application to make sure that the correct binary starts. After the application launches, try out all the screens in the program to make sure that nothing is missing and none of the menus causes the application to crash. Finally, find your PBI in Menu Editor, and make sure that all the desired features show for the KDE menu.
If you find a typo or need to fix a configuration file in your module, you don't have to rebuild the underlying port. Simply run /pbi-build/scripts/3.makepbi.sh
after making your configuration change. This rerolls the PBI so you can test your changes.
pbibuild.sh
creates a clean environment every time it runs. This means that it removes everything that was previously built and starts over again. If your build successfully finished, you don't have to rebuild to reroll the PBI with your new configurations. You can save a lot of time by running the 3.makepbi.sh script.
When you are satisfied that your PBI works correctly, create a compressed archive of its directory. The following example creates a compressed archive named /conspire.tar.bz2
.
# cd /pbi-build/modules/irc
# tar cvf /conspire.tar
# bzip2 /conspire.tar
Upload the archive to a publicly available server. If you don't have a server of your own, contact the leader of the PBI development team[125] for credentials to the PBI ftp server. After the PBI is uploaded, send an email to the Pbi-dev mailing list.[126] Your email should include a subject line of "submit module category/portname" (for example, submit module irc/conspire). The body of the email should contain the location where testers can download the archive for the module to build and test it.
This chapter discussed the most advanced tasks you can perform on your PC-BSD system, including those that enable you to contribute software back to the PC-BSD community so other users can benefit from it.
We cover a lot of ground in this book. It is our hope that you enjoyed learning more about the PC-BSD operating system and that this book is a handy guide you refer to often. We also hope that you have as much fun reading and using it as we had writing it!
[104] http://www.freebsd.org/doc/en_US.ISO8859-1/articles/releng/article.html
[105] See http://security.freebsd.org/
for more details.
[106] http://lists.pcbsd.org/mailman/listinfo/commits
[107] http://lists.pcbsd.org/mailman/listinfo/testing
[108] http://lists.pcbsd.org/mailman/listinfo/dev
[109] http://www.pcbsd.org/content/view/23/30/
[110] http://trac.pcbsd.org/wiki/DevelopmentGuidelines
[111] http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/index.html
[112] http://api.kde.org/
[113] http://doc.trolltech.com/
[114] http://trac.pcbsd.org/wiki/GettingSource
[115] http://lists.pcbsd.org/mailman/listinfo/pbibuild
[116] Available for download from http://www.pcbsd.org/content/view/45/30/
[117] Available for download from http://www.pbidir.com
. Information for using this utility is available at http://www.pcbsd.org/content/view/39/30/
.
[118] http://www.freebsd.org/doc/en/books/porters-handbook/
[119] http://wiki.pcbsd.org/index.php/Using_the_PBI_Builder
[120] http://wiki.pcbsd.org/index.php/PBI_Module_Builder_Guide
[121] http://forums.pcbsd.org/viewforum.php?f=4
[122] http://faqs.pcbsd.org/index.php?action=show&cat=19
[123] http://wiki.pcbsd.org/index.php/Using_the_PBI_Builder
[124] http://wiki.pcbsd.org/index.php/PBI_Module_Builder_Guide
[125] http://www.pcbsd.org/content/view/23/30/#pbi-dev
[126] http://lists.pcbsd.org/mailman/listinfo/pbi-dev