The question has come up on how to make an Inline::CPP script's C++
component available to several scripts without adding the C++ code and
Inline::CPP to each script.  And more importantly, how to re-use the
compiled code.  This question really is not so different from "How to
I create reusable code with Perl", and the answer is almost always the
same: "Put it in a module."  Nevertheless, given the cognitive
overload that one usually experiences when first getting accustomed to
Inline::C/CPP, Perl's API, and all the joys of perlguts, it can be
easy to overlook how all this can translate into a reusable solution.

Inline's documentation explains how to create a distributable module
with Inline::MakeMaker.  But sometimes that's overkill, and all the
user needs is a project-specific module that doesn't need to be
universally distributable or installable.  I was thinking I might add
the following section to the Inline::CPP POD, but wanted to request
comments before doing so:

=head1 THE MAKING OF A SIMPLE MODULE

The simplest unit of reusable code within the Perl eco-system is a
module.  Often when we think of modules we think of the kind that we
download from CPAN.  But those should really be classified as
distributions.  Let's consider for a moment just a minimal module;
something that may be project specific, and that doesn't need to be
universally distributable by itself.

=head2 Sample Code

To start, we'll create a simple module, and put it in
C<~/project/lib/> as C<MyModule.pm>:

    package MyModule;

    use Inline CPP => 'DATA';
    use parent 'Exporter';
    our @EXPORT = 'greet';

    # Nothing to see here.

    1;

    __DATA__
    __CPP__

    void greet() {
      std::cout << "Hello world\n";
    }

Now we'll create a script and put it in C<~/project/bin/> as C<myscript.pl>:

    use FindBin;
    use lib "$FindBin::Bin/../lib";

    use MyModule;

    greet();


=head2 What happens now?

The first time you run C<myscript.pl>, Inline::CPP will build the C++
code from MyModule.pm, and assuming the build succeeds, it will be
cached so that on future runs there is no need to recompile unless the
C++ code is altered in some way.  If MyModule.pm is placed in some
C<lib/</c> path where Perl already looks for modules (possibly
something set up using L<local::lib>, the use of L<FindBin> and the
L<lib> pragma wouldn't even be necessary.  And if you want to make
things even more robust, you can add a C<$VERSION> to the module,
specify an explicit build directory and build name, and even follow
the steps outlined in L<Inline> for converting it to a distributable
module.  But for simple needs, you're done.  Celebrate.  Enjoy.

=cut

-------------------------

If anyone has any comments or suggestions, please let me know.  In a
day or two I'll push the POD enhancement to github, and it will be
staged for the next release of Inline::CPP v0.42 (no timeframe planned
yet).

Dave




-- 

David Oswald
daosw...@gmail.com

Reply via email to