Sean’s Obsessions

Sean Walberg’s blog

Building Packages Out of PECL Modules

I’ve had a need to distribute the memcached and APC modules to various web servers in a farm. pecl/pear modules have a pretty cool interface similiar to yum, but it’s all based on source. It does, however, have facilities to help you build an RPM. Because I try to use RPM for everything I was pretty happy that this takes the work out of making the .spec file. However the generated specfile needs a lot of work.

You’ll need php-devel, httpd-devel, php-pear, rpm-build (and probably more, but it’s usually obvious)

First upgrade the package that builds the RPMs… It was changed from the version I had:

pear install channel://

then upgrade pear otherwise you’ll end up with some really odd errors that make no sense

pear upgrade-all

Then download the module you want, ie

pecl download pecl/APC

and build a .spc file

pecl make-rpm-spec /tmp/APC-3.0.14.tgz

That will generate PECL::APC-3.0.14.spec. Move that file to /usr/src/redhat/SPECS and move the tarball to the SOURCES directory.

You’ll need to make a few changes to the .spec.

- Change the BuildRequires to require php-pear
- Change all instances of package2.xml to package.xml
- Add /usr/lib/php/modules/ to the %files section

Then you should be able to build the package cleanly – rpmbuild -ba PECL\:\:APC-3.0.14.spec

That’s not all, though… You’ll want to include a config file. Make one in the SOURCES directory, ie pecl-apc.ini. It must contain the extension line, the rest are optional (I’m just getting into APC, so my values might be completely wrong)

Add the following to the top of your .spec file, right under Source0:

Source1: pecl-apc.ini

and at the end of the %install section (right before %clean)

mkdir -p %{buildroot}/etc/php.d/
cp %{SOURCE1} %{buildroot}/etc/php.d/apc.ini

and finally, in the %files section:

%config /etc/php.d/apc.ini

This copies the config file into the php.d directory within the buildroot (where all the files go before they’re packaged up), and defines it as a config file to be included with the RPM. Thus, upgrades won’t stomp on your changes.

APC also includes a file called apc.php that can be used to check the status of the cache… Similar techniques can be used to copy it into /var/www/html, or put an Alias entry in /etc/httpd/conf.d/apc.conf

Update on Jan 8, 2010

Mike (see comments below) indicated some changes in PEAR necessitated a change in the .spec as follows:

pear install --nodeps --soft --force --register-only --nobuild %{xmldir}/APC.xml


I’m trying something new here. Talk to me on Twitter with the button above, please.