# NAME Alien::libzookeeper - libzookeeper, with alien # VERSION Version 0.02 # 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. 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](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 segfault on connection errors. Third, we patch its `CMakeLists.txt` with some missing make targets; see [https://issues.apache.org/jira/browse/ZOOKEEPER-4012](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](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](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! # 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)