O'Reilly logo

Perl Cookbook by Nathan Torkington, Tom Christiansen

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Using h2xs to Make a Module with C Code

Problem

You’d like to access your system’s unique C functions from Perl.

Solution

Use the h2xs tool to generate the necessary template files, fill the files in appropriately, and then type:

% perl Makefile.PL
% make

Discussion

A Perl module need not be written solely in Perl. As with any other module, first pick a module name and use h2xs on it. We’ll make a FineTime::time function with the same semantics as in the previous recipe, but this time around, we’ll implement it using real C.

First, we run the following command:

% h2xs -cn FineTime

If we had a .h file with function prototype declarations, we could include that, but because we’re writing this one from scratch, we’ll use the -c flag to omit building code to translate any #define symbols. The -n flag says to create a module directory named FineTime/, which will have the following files:

Manifest

List of files in the distribution

Changes

change log

Makefile.PL

a meta-makefile

FineTime.pm

the Perl parts

FineTime.xs

the soon-to-be C parts

test.pl

a test driver

Before we can type make, we’ll have to generate a Makefile based on our system’s configuration using the Makefile.PL template. Here’s how to do that:

% perl Makefile.PL

If the XS code calls library code that isn’t in the normal set of libraries Perl links from, add one more line to Makefile.PL first. For example, if we wanted to link against the librpm.a library, which lives in the /usr/redhat/lib directory, we’d ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required