NAME

Alien::libzookeeper - libzookeeper, with alien

VERSION

Version 0.04

SYNOPSIS

    use Alien::libzookeeper;

    Alien::libzookeeper->libs;
    Alien::libzookeeper->libs_static;
    Alien::libzookeeper->cflags;

    # Or a more realistic example; in your makefile:
    use Config;
    my $zk_libs        = Alien::libzookeeper->libs;
    my $zk_libs_static = Alien::libzookeeper->libs_static;

    my $lddflags = $Config{lddlflags} // '';
    $lddlflags  .= ' ';

    my $libext = $Config{lib_ext};
    if ( $libs_static =~ /libzookeeper\.\Q$libext\E/ ) {
        # We can statically link against libzookeeper.
        # To link statically, we need to pass arguments to `ld`, not to the C
        # compiler, and we need to drop the dynamic version from the arguments:
        $_ =~ s/-lzookeeper\b// for $zk_libs, $zk_libs_static;
        $lddlflags .= ' ' . $zk_libs_static;
    }

    WriteMakefile(
        INC       => Alien::libzookeeper->cflags,
        LIBS      => [ $zk_libs ],
        LDDLFLAGS => [ $lddlflags ],
        ...
    );

DESCRIPTION

Alien::libzookeeper is an Alien interface to libzookeeper.

Turns out that libzookeeper is pretty hard to get hold of! It's source is shipped as part of ZooKeeper, so in some systems you need to install ZooKeeper -- and all the Java stack it needs -- just to get the C shared library.

In other systems, you can get it from package managers just fine, but it doesn't have a pkg-config meta file, and so finding it ends up requiring writing and running C.

And in some systems (Alpine, Arch-Linux) there's just no way to get the library.

And even if you got it -- it might be called libzookeeper_mt instead!

This module tries very hard to get a working libzookeeper: It checks pkg-config, it checks by compiling code, and if there's nothing in the system that we can use, it builds version 3.5.6 from source.

NOTES

The built-from-source version comes with some caveats!

First, we use version 3.5.6 because that's the last official release that can be built from source without needing Java; see https://issues.apache.org/jira/browse/ZOOKEEPER-3530 for details.

Second, we patch a bug fixed upstream in the 3.6.x releases that lead to segfaults on connection errors; see https://issues.apache.org/jira/browse/ZOOKEEPER-3954

Third, we patch its CMakeLists.txt with some missing make targets; see https://issues.apache.org/jira/browse/ZOOKEEPER-4012.

Fourth, we patch its CMakeLists.txt to change how it generates the statically-linked libzookeeper.a; see https://issues.apache.org/jira/browse/ZOOKEEPER-4014

Fifth, we patch its build process to generate a pkg-config meta file; see https://issues.apache.org/jira/browse/ZOOKEEPER-4013

Hopefully as the above get addressed, there will be less and less cases where this module ends up building the library itself; or at least we'll be able to get rid of some of these patches!

AUTHOR

B Fraser, <fraserbn at gmail.com>

BUGS

Please report any bugs or feature requests to bug-alien-libzookeeper at rt.cpan.org, or through the web interface at https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Alien-libzookeeper. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

LICENSE AND COPYRIGHT

This software is Copyright (c) 2020 by B Fraser.

This is free software, licensed under:

  The Artistic License 2.0 (GPL Compatible)