summaryrefslogtreecommitdiff
path: root/Makefile.PL
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2020-01-20 10:50:34 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2020-01-20 10:50:34 +0900
commitf228e79b87b7c5271c468f709e82c3f7d3305a3d (patch)
treeab2ae0ac32b5ef610a3901505b73d2fb6ce7daab /Makefile.PL
parentaf87c453a812a912c6585a6171e461a254bc9fc0 (diff)
downloadperl-XML-LibXML-f228e79b87b7c5271c468f709e82c3f7d3305a3d.tar.gz
perl-XML-LibXML-f228e79b87b7c5271c468f709e82c3f7d3305a3d.tar.bz2
perl-XML-LibXML-f228e79b87b7c5271c468f709e82c3f7d3305a3d.zip
Imported Upstream version 2.0134upstream/2.0134
Diffstat (limited to 'Makefile.PL')
-rw-r--r--Makefile.PL811
1 files changed, 811 insertions, 0 deletions
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..5e49473
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,811 @@
+# -------------------------------------------------------------------------- #
+# $Id$
+# -------------------------------------------------------------------------- #
+# Makefile.PL for XML::LibXML.
+# This file is required to generate a localized Makefile
+# -------------------------------------------------------------------------- #
+#
+#
+# This is free software, you may use it and distribute it under the same terms as
+# Perl itself.
+#
+# Copyright 2001-2003 AxKit.com Ltd., 2002-2006 Christian Glahn, 2006-2009 Petr Pajas
+#
+
+use strict;
+use warnings;
+
+require 5.008;
+
+use vars qw/$DEVNULL $is_Win32 $extralibdir $skipsaxinstall/;
+
+use ExtUtils::MakeMaker;
+use Config;
+use Symbol;
+use File::Spec;
+
+$|=0;
+my %config;
+
+# -------------------------------------------------------------------------- #
+# -------------------------------------------------------------------------- #
+# common information go to the top, so they are easier to find
+# -------------------------------------------------------------------------- #
+my %INFOS = (
+ 'NAME' => 'XML::LibXML',
+ 'VERSION_FROM' => 'LibXML.pm', # finds $VERSION
+ 'AUTHOR' => 'Petr Pajas',
+ 'ABSTRACT' => 'Interface to Gnome libxml2 xml parsing and DOM library',
+ 'LICENSE' => 'perl',
+ (($ExtUtils::MakeMaker::VERSION >= 6.48)
+ ? (MIN_PERL_VERSION => '5.008',)
+ : ()
+ ),
+ 'PREREQ_PM' => {
+ 'base' => 0,
+ #'Hash::FieldHash' => '0.09',
+ 'parent' => 0,
+ 'strict' => 0,
+ 'Test::More' => 0,
+ 'vars' => 0,
+ 'warnings' => 0,
+ 'XML::NamespaceSupport' => '1.07',
+ 'XML::SAX' => '0.11',
+ 'XML::SAX::Base' => '0',
+ 'XML::SAX::Exception' => '0',
+ },
+ 'OBJECT' => '$(O_FILES)', # add the DOM extensions to libxml2
+ ($ExtUtils::MakeMaker::VERSION >= 6.54)
+ ?
+ (
+ META_MERGE =>
+ {
+ resources =>
+ {
+ repository => 'https://github.com/shlomif/perl-XML-LibXML',
+ homepage => 'https://github.com/shlomif/perl-XML-LibXML',
+ },
+ keywords =>
+ [
+ "dom",
+ "html",
+ "libxml",
+ "object oriented",
+ "oop",
+ "parse",
+ "parser",
+ "parsing",
+ "pullparser",
+ "sax",
+ "sgml",
+ "xml",
+ "xpath",
+ "XPath",
+ "xs",
+ ],
+ },
+ )
+ : (),
+);
+# -------------------------------------------------------------------------- #
+# -------------------------------------------------------------------------- #
+
+use lib qw(inc);
+use Devel::CheckLib;
+
+# Prompt the user here for any paths and other configuration
+
+
+# -------------------------------------------------------------------------- #
+# libxml2 valid versions
+
+# -------------------------------------------------------------------------- #
+
+# -------------------------------------------------------------------------- #
+# read extra configurations from the commandline
+my %params;
+@params{qw(FORCE DEBUG DEFINE EXTRALIBDIR GDOME INC LIBS SKIP_SAX_INSTALL XMLPREFIX NO_THREADS LDFLAGS)}=();
+
+@ARGV = grep {
+ my ($key, $val) = split(/=/, $_, 2);
+ if (exists $params{$key}) {
+ $config{$key} = $val; 0
+ } else { 1 }
+} @ARGV;
+
+$extralibdir = $config{EXTRALIBDIR};
+delete $config{EXTRALIBDIR};
+
+# -------------------------------------------------------------------------- #
+
+# -------------------------------------------------------------------------- #
+# force unsupported version
+my $FORCE = delete $config{FORCE};
+
+# switch Debugging messages on
+my $DEBUG = delete $config{DEBUG};
+
+if ( $config{DEBUG} and $is_Win32 ) {
+ warn "win32 compile\n";
+}
+# -------------------------------------------------------------------------- #
+
+# -------------------------------------------------------------------------- #
+# enable perls UTF8 support if available
+if ( $] >= 5.006 ) {
+ warn "enable native perl UTF8\n";
+ $config{DEFINE} .= " -DHAVE_UTF8";
+}
+if ( $] < 5.008 or $config{NO_THREADS} ) {
+ warn "disabling XML::LibXML support for Perl threads\n";
+ $config{DEFINE} .= " -DNO_XML_LIBXML_THREADS";
+}
+delete $config{NO_THREADS};
+# -------------------------------------------------------------------------- #
+
+# -------------------------------------------------------------------------- #
+# get the libxml2 configuration
+#
+# For each release we already know which libxml2 versions work with the given
+# module. All we need is to keep track of bad versions.
+# If a user wants to build XML::LibXML with a newer version, there will be
+# a warning, that errors are possible.
+#
+# We keep track of the valid versions by keeping a blacklist of intervals
+# of working and not working versions where Ma.Mi.Pt <= X.Y.Z is of the same
+# state.
+#
+# NOTE: All versions, the tests pass will be marked as working.
+#
+
+$skipsaxinstall = $ENV{SKIP_SAX_INSTALL} || $config{SKIP_SAX_INSTALL};
+delete $config{SKIP_SAX_INSTALL};
+
+unless ( $is_Win32 ) { # cannot get config in W32
+ my @blacklist = (
+ # format X,Y,Z,is_ok, X,Y,Z is version,
+ # is_ok applies also to *preceding* versions
+ [2,4,22,0],
+ [2,4,25,0], # broken XPath
+ [2,4,28,0], # unsupported, may work fine with earlier XML::LibXML versions
+ [2,4,29,0], # broken
+ [2,4,30,0], # broken
+ [2,5,0,0], # unsupported
+ [2,5,1,0], # all pre 2.5.4 version have broken attr output
+ [2,5,5,0], # tests pass, but known as broken
+ [2,5,11,0], # will partially work
+ [2,6,0,0], # unsupported
+ [2,6,4,0], # schema error
+ [2,6,5,0], # broken xincludes
+ [2,6,15,0],
+ # [2,6,16,1], # first version to pass all tests
+ [2,6,18,1], # up to 2.6.18 all ok
+ [2,6,19,0], # broken c14n
+ [2,6,20,0], # broken schemas
+ [2,6,24,1], # all tests pass
+ [2,6,25,0], # broken XPath
+ [2,6,32,1], # tested, works ok
+ [2,7,1,0], # broken release, broken utf-16
+ [2,7,6,1], # tested, ok
+ [2,7,8,1], # tested, ok
+ [2,9,3,1], # schema regression
+ [2,9,4,0], # schema regression
+ [2,9,9,1],
+ );
+ my $xml2cfg = "xml2-config";
+ my $libprefix = $ENV{XMLPREFIX} || $config{XMLPREFIX};
+
+ delete $config{XMLPREFIX}; # delete if exists, otherwise MakeMaker gets confused
+
+ if ( defined $libprefix ) {
+ $xml2cfg = $libprefix . '/bin/' . $xml2cfg;
+ }
+
+ # if a user defined INC and LIBS on the command line we must not
+ # override them
+ if ( not defined $config{LIBS} and not defined $config{INC} ) {
+ print "running xml2-config...";
+ eval {
+ try_libconfig( $xml2cfg, \%config, \@blacklist );
+ };
+
+ if ( $@ ) {
+ if ( $@ =~ /^VERSION|^FORCED/ ) {
+ my $libxml2_version;
+ print STDERR "The installed version of libxml2 $@ is not compatible with XML::LibXML (and probably buggy)!\n\n".
+ "You may continue at your own risk using 'perl Makefile.PL FORCE=1', but:\n\n".
+ " - don't expect XML::LibXML to build or work correctly!\n".
+ " - don't report errors!\n".
+ " - don't send patches!\n\n".
+ "Check the README file for more information on versions\n".
+ "that are tested with XML::LibXML\n\n";
+ if ($@ =~ /^VERSION (\S+)/) {
+ $libxml2_version = $1;
+ }
+ # 0 recommended by http://cpantest.grango.org (Notes for CPAN Authors)
+ exit 0 if !$FORCE and $libxml2_version ne "2.9.4";
+ }
+ if ( $@ =~ /^UNTESTED (\S*)/ ) {
+ warn "Note: libxml2 $1 was not tested with this XML::LibXML version.\n"
+# warn <<"UNTESTED";
+# WARNING!
+# The installed version of libxml2 was not tested with this version of XML::LibXML.
+
+# XML::LibXML may fail building or some tests may not pass.
+# Expect strange errors and unstable scripts.
+
+# Check the README file for more informations
+# END OF WARNING
+# UNTESTED
+ }
+
+ if ( not defined $config{LIBS} and not defined $config{INC} ) {
+ warn "didn't manage to get libxml2 config, guessing\n";
+ $config{LIBS} = '-L/usr/local/lib -L/usr/lib -lxml2 -lm';
+ $config{INC} = '-I/usr/local/include -I/usr/include';
+ print <<"OPT";
+options:
+ LIBS='$config{LIBS}'
+ INC='$config{INC}'
+If this is wrong, Re-run as:
+ \$ $^X Makefile.PL LIBS='-L/path/to/lib' INC='-I/path/to/include'
+
+OPT
+ }
+ }
+ }
+}
+
+# -------------------------------------------------------------------------- #
+
+# -------------------------------------------------------------------------- #
+# GDOME Support
+#
+# GDOME Support has to get explicitly activated by setting GDOME=1 as a config param.
+#
+unless ( $is_Win32 ) { # cannot get config in W32
+ if ( $config{GDOME} ) {
+ my $ver;
+ my $state = undef; # there are three possible states:
+ # 1 : works
+ # 0 : works not
+ # undef : not yet tested
+ my @blacklist = (
+ [0,7,2,0],
+ [0,7,3,1],
+ );
+ print <<"GDOME";
+
+GDOME Support (experimental):
+ XML::LibXML can parse into XML::GDOME DOMs if libgdome is installed.
+ This feature is optional and is not required for using XML::LibXML.
+
+GDOME
+
+ print "running gdome-config...";
+
+ eval {
+ test_libconfig( "gdome-config", \%config, @blacklist );
+ print "NOTE: You will need to install XML::GDOME to use this feature\n";
+ };
+
+ if ( $@ ) {
+ if ( $@ =~ /^VERSION/ ) {
+ warn "The installed libgdome version is not supported\n";
+ }
+ elsif ( $@ =~ /^UNTESTED/ ) {
+ warn "The installed libgdome version was not yet tested with XML::LibXML.\n";
+ print "NOTE: You will need to install XML::GDOME to use this feature\n";
+ }
+ }
+ }
+}
+# -------------------------------------------------------------------------- #
+
+
+my $config_LIBS_alternatives;
+# -------------------------------------------------------------------------- #
+# fix the ld flags
+# -------------------------------------------------------------------------- #
+if (!defined $config{LIBS} || $config{LIBS} !~ /\-l(?:lib)?xml2\b/) {
+ # in this case we are not able to run xml2-config. therefore we need to
+ # expand the libz as well.
+ if ($is_Win32) {
+ if( $ENV{ACTIVEPERL_MINGW} ) {
+ $config{LIBS} .= ' -llibxml2.lib -lzlib.lib';
+ }
+ else {
+ my $l = $config{LIBS};
+
+ if (!defined($l)) {
+ $l = '';
+ }
+
+ # Put several options.
+ $config_LIBS_alternatives = [
+ map { "$l $_" }
+ q/ -llibxml2/,
+ q/ -lxml2 -lzlib/,
+ q/ -llibxml2 -lzlib -llibgettextlib.dll/
+ ];
+ $config{LIBS} = $config_LIBS_alternatives->[-1];
+ $config{INC} .= " -I$Config{incpath}";
+ }
+ }
+ else {
+ $config{LIBS} .= ' -lxml2 -lz -lm';
+ }
+}
+elsif ($config{LIBS} !~ /\-lz\b/ and !($is_Win32 && $config{LIBS} !~ /\-lzlib\b/)) {
+ # note if libxml2 has not -lz within its cflags, we should not use
+ # it! We should trust libxml2 and assume libz is not available on the
+ # current system (this is ofcourse not true with win32 systems.
+ # $config{LIBS} .= $is_Win32 ? ' -lzlib' :' -lz';
+ if ( $config{DEBUG} ) {
+ warn "zlib was not configured\n";
+ warn "set zlib\n" if $is_Win32;
+ }
+ if ($is_Win32) {
+ if( $ENV{ACTIVEPERL_MINGW} ) {
+ $config{LIBS} .= ' -lzlib.lib';
+ } else {
+ $config{LIBS} .= ' -lzlib';
+ }
+ } else {
+ $config{LIBS} .= ' -lz';
+ }
+}
+
+# -------------------------------------------------------------------------- #
+# MacOS X Compiler switches have to go here
+#
+# if we run on MacOSX, we should check if 10.2 is running and if so,
+# if the Build Target is set correctly. Otherwise we have to set it by
+# hand
+
+my $ldflags = delete $config{LDFLAGS};
+if ($ldflags) {
+ $config{dynamic_lib} = { OTHERLDFLAGS => " $ldflags " };
+}
+
+my $incpath = $config{INC} || "";
+$incpath =~ s#(\A|\s)\s*-I#$1#g;
+
+sub _libxml_check_lib_with_config_LIBs
+{
+ my ($lib_name, $conf_LIBS) = @_;
+
+ return
+ check_lib(
+ debug => $DEBUG,
+ LIBS => $conf_LIBS,
+ # fill in what you prompted the user for here
+ lib => [$lib_name],
+ incpath => [split(/\s/,$incpath)],
+ header =>
+ [
+ 'libxml/c14n.h',
+ 'libxml/catalog.h',
+ 'libxml/entities.h',
+ 'libxml/globals.h',
+ 'libxml/HTMLparser.h',
+ 'libxml/HTMLtree.h',
+ 'libxml/parser.h',
+ 'libxml/parserInternals.h',
+ 'libxml/pattern.h',
+ 'libxml/relaxng.h',
+ 'libxml/tree.h',
+ 'libxml/uri.h',
+ 'libxml/valid.h',
+ 'libxml/xinclude.h',
+ 'libxml/xmlerror.h',
+ 'libxml/xmlIO.h',
+ 'libxml/xmlmemory.h',
+ 'libxml/xmlreader.h',
+ 'libxml/xmlregexp.h',
+ 'libxml/xmlschemas.h',
+ 'libxml/xmlversion.h',
+ 'libxml/xpath.h',
+ 'libxml/xpathInternals.h',
+ ],
+ );
+}
+
+sub _libxml_check_lib {
+ my ($libname) = @_;
+
+ if (defined($config_LIBS_alternatives)) {
+ foreach my $conf_LIBS (@$config_LIBS_alternatives) {
+ if (_libxml_check_lib_with_config_LIBs($libname, $conf_LIBS)) {
+ $config{LIBS} = $conf_LIBS;
+ return 1;
+ }
+ }
+ }
+ else {
+ return _libxml_check_lib_with_config_LIBs($libname, $config{LIBS});
+ }
+}
+
+print "Checking for ability to link against xml2...";
+if ( _libxml_check_lib('xml2') ) {
+ print "yes\n";
+}
+else {
+ print "no\n";
+ print "Checking for ability to link against libxml2...";
+ if ( _libxml_check_lib('libxml2')) {
+ print "yes\n";
+ }
+ else {
+ print STDERR <<"DEATH";
+libxml2, zlib, and/or the Math library (-lm) have not been found.
+Try setting LIBS and INC values on the command line
+Or get libxml2 from
+ http://xmlsoft.org/
+If you install via RPMs, make sure you also install the -devel
+RPMs, as this is where the headers (.h files) are.
+
+Also, you may try to run perl Makefile.PL with the DEBUG=1 parameter
+to see the exact reason why the detection of libxml2 installation
+failed or why Makefile.PL was not able to compile a test program.
+DEATH
+ exit 0; # 0 recommended by http://cpantest.grango.org (Notes for CPAN Authors)
+ }
+}
+
+# -------------------------------------------------------------------------- #
+# _NOW_ write the Makefile
+
+WriteMakefile(
+ %INFOS,
+ %config,
+);
+# -------------------------------------------------------------------------- #
+
+
+# -------------------------------------------------------------------------- #
+# helper functions to build the Makefile
+sub MY::manifypods {
+ package MY;
+ my $str = shift->SUPER::manifypods(@_);
+# warn $str;
+# $str =~ s/^manifypods : pure_all (.*)$/manifypods : pure_all docs $1/m;
+ $str .= <<"EOF";
+
+docs-fast :
+\t\@$^X -pi~ -e 's{<edition>[0-9.]*</edition>}{<edition>'"\$(VERSION)"'</edition>}' docs/libxml.dbk
+\t\@$^X -Iblib/arch -Iblib/lib example/xmllibxmldocs.pl docs/libxml.dbk lib/XML/LibXML/
+
+docs : pure_all
+\t\@$^X -pi~ -e 's{<edition>[0-9.]*</edition>}{<edition>'"\$(VERSION)"'</edition>}' docs/libxml.dbk
+\t\@$^X -Iblib/arch -Iblib/lib example/xmllibxmldocs.pl docs/libxml.dbk lib/XML/LibXML/
+\t\@$^X -pi.old -e 's/a/a/' Makefile.PL
+\t\@echo "==> YOU MUST NOW RE-RUN $^X Makefile.PL <=="
+\t\@false
+
+EOF
+ return $str;
+}
+
+sub MY::install {
+ package MY;
+ my $script = shift->SUPER::install(@_);
+ unless ( $::skipsaxinstall ) {
+ $script =~ s/install :: (.*)$/install :: $1 install_sax_driver/m;
+ $script .= <<"INSTALL";
+
+install_sax_driver :
+\t-\@\$(PERL) -I\$(INSTALLSITELIB) -I\$(INSTALLSITEARCH) -MXML::SAX -e "XML::SAX->add_parser(q(XML::LibXML::SAX::Parser))->save_parsers()"
+\t-\@\$(PERL) -I\$(INSTALLSITELIB) -I\$(INSTALLSITEARCH) -MXML::SAX -e "XML::SAX->add_parser(q(XML::LibXML::SAX))->save_parsers()"
+
+INSTALL
+ } else {
+ warn "Note: 'make install' will skip XML::LibXML::SAX registration with XML::SAX!\n";
+ }
+ return $script;
+}
+
+sub MY::test {
+ package MY;
+ my $script = shift->SUPER::test(@_);
+ if ( $::extralibdir ) {
+ $script =~ s/(\$\(TEST_VERBOSE\),)/$1 \'$::extralibdir\',/m;
+ }
+ return $script;
+}
+
+# echo perl -pi~ -e '$$_=q($(version))."\n" if /#\ VERSION TEMPLATE/ ' $(TO_INST_PM)
+sub MY::postamble {
+ my $mpl_args = join " ", map qq["$_"], @ARGV;
+
+ my $CC =
+ (
+ exists($ENV{CC})
+ ? "CC = $ENV{CC}"
+ : ''
+ );
+
+ my $ret = "$CC\n" . <<'MAKE_FRAG';
+
+# emacs flymake-mode
+check-syntax :
+ test -n "$(CHK_SOURCES)" && \
+ $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) -o /dev/null -S $(CHK_SOURCES)
+
+# used to update version numbers in all modules
+version:
+ @version=`grep '\# VERSION TEMPLATE' $(VERSION_FROM)`; \
+ echo "New version line: $$version"; \
+ perl -pi~ -e '$$_=q('"$$version"')."\n" if /#\ VERSION TEMPLATE/ ' $(TO_INST_PM);
+
+runtest: pure_all
+ $(ABSPERLRUN) -MFile::Spec -MTest::Run::CmdLine::Iface -e \
+ "local @INC = @INC; unshift @INC, map { File::Spec->rel2abs(\$$_) } ('$(INST_LIB)', '$(INST_ARCHLIB)'); Test::Run::CmdLine::Iface->new({test_files => [glob(q{t/*.t})]})->run();"
+
+distruntest: distdir
+ cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL {#mpl_args#}
+ cd $(DISTVNAME) && $(MAKE) $(PASTHRU)
+ cd $(DISTVNAME) && $(MAKE) runtest $(PASTHRU)
+
+MAKE_FRAG
+
+ $ret =~ s/{#mpl_args#}/$mpl_args/;
+
+ return $ret;
+}
+
+
+# -------------------------------------------------------------------------- #
+
+# -------------------------------------------------------------------------- #
+# Functions
+# - these should really be in MakeMaker... But &shrug;
+# -------------------------------------------------------------------------- #
+
+use Config;
+use Cwd;
+use Symbol;
+use File::Spec;
+
+
+BEGIN {
+ $is_Win32 = ($^O =~ /Win32/);
+ if ($is_Win32) {
+ $DEVNULL = 'DEVNULL';
+ }
+ else {
+ $DEVNULL = eval { File::Spec->devnull };
+ if ($@) { $DEVNULL = '/dev/null' }
+ }
+}
+
+sub rm_f {
+ my @files = @_;
+ my @realfiles;
+ foreach (@files) {
+ push @realfiles, glob($_);
+ }
+ if (@realfiles) {
+ chmod(0777, @realfiles);
+ unlink(@realfiles);
+ }
+}
+
+sub rm_fr {
+ my @files = @_;
+ my @realfiles;
+ foreach (@files) {
+ push @realfiles, glob($_);
+ }
+ foreach my $file (@realfiles) {
+ if (-d $file) {
+ # warn("$file is a directory\n");
+ rm_fr("$file/*");
+ rm_fr("$file/.exists");
+ rmdir($file) || die "Couldn't remove $file: $!";
+ }
+ else {
+ # warn("removing $file\n");
+ chmod(0777, $file);
+ unlink($file);
+ }
+ }
+}
+
+sub xsystem {
+ my $command_aref = shift;
+ if ($DEBUG) {
+ print "@$command_aref\n";
+ if ((system { $command_aref->[0] } @$command_aref) != 0) {
+ die "system call to '@$command_aref' failed";
+ }
+ return 1;
+ }
+ open(OLDOUT, ">&STDOUT");
+ open(OLDERR, ">&STDERR");
+ open(STDOUT, ">$DEVNULL");
+ open(STDERR, ">$DEVNULL");
+ my $retval = (system { $command_aref->[0] } @$command_aref);
+ open(STDOUT, ">&OLDOUT");
+ open(STDERR, ">&OLDERR");
+ if ($retval != 0) {
+ die "system call to '@$command_aref' failed";
+ }
+ return 1;
+}
+
+sub backtick {
+ my $command = shift;
+ if ($DEBUG) {
+ print $command, "\n";
+ my $results = `$command`;
+ chomp $results;
+ if ($? != 0) {
+ die "backticks call to '$command' failed";
+ }
+ return $results;
+ }
+ open(OLDOUT, ">&STDOUT");
+ open(OLDERR, ">&STDERR");
+ open(STDOUT, ">$DEVNULL");
+ open(STDERR, ">$DEVNULL");
+ my $results = `$command`;
+ my $retval = $?;
+ open(STDOUT, ">&OLDOUT");
+ open(STDERR, ">&OLDERR");
+ if ($retval != 0) {
+ die "backticks call to '$command' failed";
+ }
+ chomp $results;
+ return $results;
+}
+
+sub try_link0 {
+ my ($src, $opt) = @_;
+ # local $config{LIBS};
+ # $config{LIBS} .= $opt;
+ unless (mkdir(".testlink", 0777)) {
+ rm_fr(".testlink");
+ mkdir(".testlink", 0777) || die "Cannot create .testlink dir: $!";
+ }
+ chdir(".testlink");
+ {
+ open(my $cfile, '>', 'Conftest.xs')
+ or die "Cannot write to file Conftest.xs: $!";
+ print {$cfile} <<"EOT";
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <EXTERN.h>
+#include <perl.h>
+#include <XSUB.h>
+#ifdef __cplusplus
+}
+#endif
+
+EOT
+ print {$cfile} $src;
+ print {$cfile} <<"EOT";
+
+MODULE = Conftest PACKAGE = Conftest
+
+PROTOTYPES: DISABLE
+
+EOT
+ close($cfile);
+ }
+ {
+ open(my $cfile, '>', 'Conftest.pm')
+ or die "Cannot write to file Conftest.pm: $!";
+ print {$cfile} <<'EOT';
+package Conftest;
+$VERSION = 1.0;
+require DynaLoader;
+@ISA = ('DynaLoader');
+bootstrap Conftest $VERSION;
+1;
+EOT
+ close($cfile);
+ }
+ {
+ open (my $cfile, '>', 'Makefile.PL')
+ or die "Cannot write to file Makefile.PL: $!";
+ print {$cfile} <<'EOT';
+use ExtUtils::MakeMaker;
+my %config;
+while($_ = shift @ARGV) {
+ my ($k, $v) = split /=/, $_, 2;
+ warn("$k = $v\n");
+ $config{$k} = $v;
+}
+WriteMakefile(NAME => "Conftest", VERSION_FROM => "Conftest.pm", %config);
+EOT
+ close($cfile);
+ }
+ {
+ open(my $cfile, ">test.pl")
+ or die "Cannot write to file test.pl: $!";
+ print {$cfile} <<"EOT";
+use Test; BEGIN { plan tests => 1; } END { ok(\$loaded) }
+use Conftest; \$loaded++;
+EOT
+ close($cfile);
+ }
+ my $quote = $is_Win32 ? '"' : "'";
+ xsystem([$^X, 'Makefile.PL',
+ (map { "$_=$config{$_}" } keys %config),
+ ]
+ );
+
+ my $def_opt = defined($opt) ? $opt : '';
+ # I am not sure if OTHERLDFLAGS is really required - at least the
+ # libraries to include do not belong here!
+ # I would assume a user to set OTHERLDFLAGS in the %config if they are
+ # really required. if done so, we don't have to pass them here ...
+ xsystem([$Config{make}, 'test', "OTHERLDFLAGS=${def_opt}"]);
+} # end try_link0
+
+sub try_link {
+ my $start_dir = cwd();
+ my $result = eval {
+ try_link0(@_);
+ };
+ warn $@ if $@;
+ chdir($start_dir);
+ rm_fr(".testlink");
+ return $result;
+}
+
+# -------------------------------------------------------------------------- #
+# try_libconfig class a generic config file and requests --version, --libs and
+# --cflags
+sub try_libconfig {
+ my $cfgscript = shift;
+ my $config = shift;
+ my $bl = shift;
+
+ my $state = undef; # there are three possible states:
+ # 1 : works
+ # 0 : works not
+ # undef : not yet tested
+
+ my $ver = backtick("$cfgscript --version");
+ if ( defined $ver ) {
+ my ( $major, $minor, $point) = $ver =~ /([0-9]+).([0-9]+)\.([0-9]+)/g;
+ foreach my $i ( @$bl ) {
+ $state = $i->[3];
+ last if $major < $i->[0];
+ next if $major > $i->[0];
+ last if $minor < $i->[1];
+ next if $minor > $i->[1];
+ last if $point <= $i->[2];
+ $state = undef;
+ }
+
+ $config->{LIBS} = backtick("$cfgscript --libs");
+ $config->{INC} = backtick("$cfgscript --cflags");
+
+ if ( defined $state and $state == 0 ) {
+ print "failed\n";
+ if ($FORCE) {
+ die "FORCED $ver\n";
+ }
+ else {
+ die "VERSION $ver\n";
+ }
+ }
+
+ unless ( defined $state ) {
+ print "untested\n";
+ die "UNTESTED $ver\n";
+ }
+
+ print "ok ($ver)\n";
+ }
+ else {
+ print "failed\n";
+ die "FAILED\n"; # strange error
+ }
+}
+# -------------------------------------------------------------------------- #