package Alien::ZMQ;
-# ABSTRACT: detect and/or install zeromq
+# ABSTRACT: find and install libzmq, the core zeromq library
use warnings;
use strict;
+use String::ShellQuote qw/shell_quote/;
+
=head1 DESCRIPTION
Upon installation, the target system is probed for the presence of libzmq. If
-it is not found, zeromq 3.2.2 is installed in a shared directory. In short,
-modules that need libzmq can depend on this module to make sure that it is
-available.
+it is not found, B<libzmq 3.2.4> is installed in a shared directory. In
+short, modules that need libzmq can depend on this module to make sure that it
+is available, or use it independently as a way to install zeromq.
=head1 SYNOPSIS
use Alien::ZMQ;
-
- my $version = Alien::ZMQ::lib_version;
+ use version;
+
+ my $version = version->parse(Alien::ZMQ::lib_version);
+ my $lib_dir = Alien::ZMQ::lib_dir;
+
+ print "zeromq $version is installed at $lib_dir\n";
=head1 OPTIONS
=item --zmq-skip-probe
-By default, zeromq is not compiled and installed if it is detected to already
-be on the system. Use this to skip those checks and always install zeromq.
+By default, libzmq is not compiled and installed if it is detected to already
+be on the system. Use this to skip those checks and always install libzmq.
-=item --zmq-config=...
+=item --zmq-cflags
-Pass extra flags to zeromq's F<configure> script. You may want to consider
-passing either C<--with-pgm> or C<--with-system-pgm> if you need support for
-PGM; this is not enabled by default because it is not supported by every
-system.
+Pass extra flags to the compiler when probing for an existing installation of
+libzmq. You can use this, along with L</--zmq-libs>, to help the probing
+function locate libzmq if it is installed in an unexpected place. For
+example, if your libzmq is installed at F</opt/zeromq>, you can do something
+like this:
+
+ perl Build.PL --zmq-cflags="-I/opt/zeromq/include" \
+ --zmq-libs="-L/opt/zeromq/lib -lzmq"
+
+These flags are only used by the probing function to locate libzmq; they will
+not be used when compiling libzmq from source (if it needs to be). To affect
+the compiling of libzmq, using the L</--zmq-config> flag instead.
+
+A better alternative to using L</--zmq-cflags> and L</--zmq-libs> is to help
+the L<pkg-config> program find your libzmq by using the C<PKG_CONFIG_PATH>
+environment variable. Of course, this method requires that you have the
+L<pkg-config> program installed. Here's an example:
-=item --zmq-libs=...
+ perl Build.PL
+ PKG_CONFIG_PATH=/opt/zeromq/lib/pkgconfig ./Build
+
+=item --zmq-libs
Pass extra flags to the linker when probing for an existing installation of
-zeromq. In particular, if your F<libzmq.so> file is installed to a special
-location, you may pass flags such as C<-L/opt/libzmq2/lib -lzmq>.
+libzmq. You can use this, along with L</--zmq-cflags>, to help the probing
+function locate libzmq if it is installed in an unexpected place. Like
+L</--zmq-cflags>, these flags are only used by the probing function to locate
+libzmq.
-=item --zmq-cflags=...
+=item --zmq-config
-Pass extra flags to the compiler when probing for an existing installation of
-zeromq. These flags will not be used when actually compiling zeromq from
-source. For that, just use the C<CFLAGS> environment variable.
+Pass extra flags to the libzmq F<configure> script. You may want to consider
+passing either C<--with-pgm> or C<--with-system-pgm> if you need support for
+PGM; this is not enabled by default because it is not supported by every
+system.
=back
=head1 CAVEATS
-Probing is only done upon installation, so if you are using a system-installed
-version of libzmq and you uninstall or upgrade it, you will also need to
-reinstall this module.
+Probing is only done during the installation of this module, so if you are
+using a system-installed version of libzmq and you uninstall or upgrade it,
+you will also need to reinstall L<Alien::ZMQ>.
+
+If S<libzmq-2.x> is found on the system, L<Alien::ZMQ> will use it. There are
+a few incompatibilities between S<libzmq-2.x> and S<libzmq-3.x>, so your
+program may want to use the L</lib_version> method to check which version of
+libzmq is installed.
=head1 BUGS
-Windows is not yet supported. Patches are welcome.
+MSWin32 is not yet supported, but cygwin works.
=head1 SEE ALSO
=method inc_version
-Get the version number of libzmq as a dotted version string according to the
-F<zmq.h> header file.
+Get the version number of libzmq as a v-string (version string), according to
+the F<zmq.h> header file.
=cut
=method lib_version
-Get the version number of libzmq as a dotted version string according to the
-F<libzmq.so> file.
+Get the version number of libzmq as a v-string (version string), according to
+the F<libzmq.so> file.
=cut
=method cflags
Get the C compiler flags required to compile a program that uses libzmq. This
-is a shortcut for constructing a C<-I> flag using C<inc_dir>.
+is a shortcut for constructing a C<-I> flag using L</inc_dir>. In scalar
+context, the flags are quoted using L<String::ShellQuote> and returned as
+a single string.
=cut
sub cflags {
- "-I'" . inc_dir . "'";
+ if (wantarray) {
+ "-I" . inc_dir;
+ } else {
+ "-I" . shell_quote(inc_dir);
+ }
}
=method libs
Get the linker flags required to link a program against libzmq. This is
-a shortcut for constructing a C<-L> flag using C<lib_dir>, plus C<-lzmq>.
+a shortcut for constructing a C<-L> flag using L</lib_dir>, plus C<-lzmq>. In
+scalar context, the flags are quoted using L<String::ShellQuote> and returned
+as a single string.
+
+On some platforms, you may also want to add the library path to your
+executable or library as a runtime path; this is usually done by passing
+C<-rpath> to the linker. Something like this could work:
+
+ my @flags = (Alien::ZMQ::libs, "-Wl,-rpath=" . Alien::ZMQ::lib_dir);
+
+This will allow your program to find libzmq, even if it is installed in
+a non-standard location, but some systems don't have this C<RPATH> mechanism.
=cut
sub libs {
- "-L'" . lib_dir . "' -lzmq";
+ if (wantarray) {
+ "-L" . lib_dir, "-lzmq";
+ } else {
+ "-L" . shell_quote(lib_dir) . " -lzmq";
+ }
}
1;