CONTRIBUTING

    If you have implemented a new feature or fixed a bug then you may make
    a pull request on this project's GitHub repository:

    https://github.com/PerlFFI/FFI-Platypus/pulls

    This project is developed using Dist::Zilla. The project's git
    repository also comes with the Makefile.PL file necessary for building,
    testing (and even installing if necessary) without Dist::Zilla. Please
    keep in mind though that these files are generated so if changes need
    to be made to those files they should be done through the project's
    dist.ini file. If you do use Dist::Zilla and already have the necessary
    plugins installed, then I encourage you to run dzil test before making
    any pull requests. This is not a requirement, however, I am happy to
    integrate especially smaller patches that need tweaking to fit the
    project standards. I may push back and ask you to write a test case or
    alter the formatting of a patch depending on the amount of time I have
    and the amount of code that your patch touches.

    This project's GitHub issue tracker listed above is not Write-Only. If
    you want to contribute then feel free to browse through the existing
    issues and see if there is something you feel you might be good at and
    take a whack at the problem. I frequently open issues myself that I
    hope will be accomplished by someone in the future but do not have time
    to immediately implement myself.

    Another good area to help out in is documentation. I try to make sure
    that there is good document coverage, that is there should be
    documentation describing all the public features and warnings about
    common pitfalls, but an outsider's or alternate view point on such
    things would be welcome; if you see something confusing or lacks
    sufficient detail I encourage documentation only pull requests to
    improve things.

    The Platypus distribution comes with a test library named libtest that
    is normally automatically built by ./Build test. If you prefer to use
    prove or run tests directly, you can use the ./Build libtest command to
    build it. Example:

     % perl Makefile.PL
     % make
     % make ffi-test
     % prove -bv t
     # or an individual test
     % perl -Mblib t/ffi_platypus_memory.t

    The build process also respects these environment variables:

    FFI_PLATYPUS_DEBUG_FAKE32

      When building Platypus on 32 bit Perls, it will use the Math::Int64 C
      API and make Math::Int64 a prerequisite. Setting this environment
      variable will force Platypus to build with both of those options on a
      64 bit Perl as well.

       % env FFI_PLATYPUS_DEBUG_FAKE32=1 perl Makefile.PL
       DEBUG_FAKE32:
         + making Math::Int64 a prereq
         + Using Math::Int64's C API to manipulate 64 bit values
       Generating a Unix-style Makefile
       Writing Makefile for FFI::Platypus
       Writing MYMETA.yml and MYMETA.json
       %

    FFI_PLATYPUS_NO_ALLOCA

      Platypus uses the non-standard and somewhat controversial C function
      alloca by default on platforms that support it. I believe that
      Platypus uses it responsibly to allocate small amounts of memory for
      argument type parameters, and does not use it to allocate large
      structures like arrays or buffers. If you prefer not to use alloca
      despite these precautions, then you can turn its use off by setting
      this environment variable when you run Makefile.PL:

       helix% env FFI_PLATYPUS_NO_ALLOCA=1 perl Makefile.PL 
       NO_ALLOCA:
         + alloca() will not be used, even if your platform supports it.
       Generating a Unix-style Makefile
       Writing Makefile for FFI::Platypus
       Writing MYMETA.yml and MYMETA.json

    V

      When building platypus may hide some of the excessive output when
      probing and building, unless you set V to a true value.

       % env V=1 perl Makefile.PL
       % make V=1
       ...

 Coding Guidelines

      * Do not hesitate to make code contribution. Making useful
      contributions is more important than following byzantine bureaucratic
      coding regulations. We can always tweak things later.

      * Please make an effort to follow existing coding style when making
      pull requests.

      * Platypus supports all production Perl releases since 5.8.1. For
      that reason, please do not introduce any code that requires a newer
      version of Perl.

 Performance Testing

    As Mark Twain was fond of saying there are four types of lies: lies,
    damn lies, statistics and benchmarks. That being said, it can sometimes
    be helpful to compare the runtime performance of Platypus if you are
    making significant changes to the Platypus Core. For that I use
    `FFI-Performance`, which can be found in my GitHub repository here:

    https://github.com/PerlFFI/FFI-Performance

 System integrators

    This distribution uses Alien::FFI in fallback mode, meaning if the
    system doesn't provide pkg-config and libffi it will attempt to
    download libffi and build it from source. If you are including Platypus
    in a larger system (for example a Linux distribution) you only need to
    make sure to declare pkg-config or pkgconf and the development package
    for libffi as prereqs for this module.

