The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use File::Spec ;
use File::Find ;
use Cwd ;
use ExtUtils::PkgConfig ;
BEGIN
{
eval "use ExtUtils::PkgConfig" ;
$nopkgcfg = 1 if ($@) ;
} ;
$win32 = ($^O eq 'MSWin32') ;
my $prefix ;
my $prefix2 ;
my $libs ;
my $libs2 ;
my $cflags ;
my $cflags2 ;
my $version ;
my $version2 ;
if (!$win32 && !$nopkgcfg)
{
my $pkg = 'libxml-2.0';
my %xml2_info = ExtUtils::PkgConfig->find ($pkg) ;
$version = $xml2_info{modversion} ;
$libs = $xml2_info{libs} ;
$cflags = $xml2_info{cflags} ;
$prefix = ExtUtils::PkgConfig->variable($pkg, 'exec_prefix') ;
print "Found libxml2 $version installed under $prefix\n" ;
$pkg = 'libxslt';
my %xslt_info = ExtUtils::PkgConfig->find ($pkg) ;
$version2 = $xslt_info{modversion} ;
$libs2 = $xslt_info{libs} ;
$cflags2 = $xslt_info{cflags} ;
$prefix2 = ExtUtils::PkgConfig->variable($pkg, 'exec_prefix') ;
print "Found libxslt $version2 installed under $prefix2\n" ;
return { cflags => "$cflags $cflags2",
libs => "$libs $libs2",
inc => $prefix eq $prefix2?"-I$prefix/include":"-I$prefix/include -I$prefix2/include",
defines => '-DLIBXSLT',
objects => 'driver/eplibxslt$(OBJ_EXT)',
save => { '$LIBXSLTVERSION' => $version2 }} ;
}
$path = $ENV{LIBXSLTPATH} || GetString ("Enter path of the directory where you have extracted libxml2 and libxslt or single dot for not using libxml", $LIBXSLTPATH) ;
return undef if (!$path || $path eq '.') ;
my $currdir = Cwd::fastcwd ;
eval { find (\&libxslt, $path) ; } ;
$@ = '' ;
chdir ($currdir);
if (!$libxslt)
{
print "libxslt.lib library not found under $path\n" ;
return undef ;
}
eval { find (\&libxml2, $path) ; } ;
$@ = '' ;
chdir ($currdir);
if (!$libxml2)
{
print "libxml2.lib library not found under $path\n" ;
return undef ;
}
eval { find (\&iconv, $path) ; } ;
$@ = '' ;
chdir ($currdir);
if (!$iconv)
{
print "iconv.lib library not found under $path\n" ;
return undef ;
}
$path = File::Spec -> canonpath ($path) ;
$inc1 = File::Spec -> canonpath ("$libxsltpath/../include") ;
$inc2 = File::Spec -> canonpath ("$libxml2path/../include") ;
$inc3 = File::Spec -> canonpath ("$iconvpath/../include") ;
print "libxslt and libxml2 found under $libxsltpath and $libxml2path\n" ;
return {
libs => "-L\"$libxsltpath\" -L\"$libxml2path\" -L\"$iconvpath\" -l$libxslt -l$libxml2 -l$iconv",
cflags => "-I\"$inc1\" -I\"$inc2\" -I\"$inc3\"",
defines => '-DLIBXSLT',
objects => 'driver/eplibxslt$(OBJ_EXT)',
save => {
'$LIBXSLTVERSION' => '2x',
'$LIBXSLTPATH' => $path,
}} ;
sub libxslt
{
if ($File::Find::dir ne $path && (($File::Find::dir =~ m#/\.#) || ($File::Find::dir !~ /libxslt/)))
{
$File::Find::prune = 1 ;
return ;
}
if (/^libxslt\.lib/i)
{
$libxsltpath = $File::Find::dir ;
die $libxslt = $_ ;
}
}
sub libxml2
{
if ($File::Find::dir ne $path && (($File::Find::dir =~ m#/\.#) || ($File::Find::dir !~ /libxml2/)))
{
$File::Find::prune = 1 ;
return ;
}
if (/^libxml2\.lib/i)
{
$libxml2path = $File::Find::dir ;
die $libxml2 = $_ ;
}
}
sub iconv
{
if ($File::Find::dir ne $path && (($File::Find::dir =~ m#/\.#) || ($File::Find::dir !~ /iconv/)))
{
$File::Find::prune = 1 ;
return ;
}
if (/^iconv\.lib/i)
{
$iconvpath = $File::Find::dir ;
die $iconv = $_ ;
}
}
print "libxml2/libxslt is currently not supported on Win32\n" ;
return undef ;