# Makefile.PL for Perl module WWW::Curl # Check out the README file for more information. use inc::Module::Install; name 'WWW-Curl'; abstract 'Perl extension interface for libcurl'; author 'Cris Bailiff '; license 'MPL or MIT/X-derivate'; perl_version '5.006001'; no_index directory => 'template'; # This is a hack. If you have libcurl installed, just specify curl.h below # and comment out this line. if ($^O ne 'MSWin32') { requires_external_bin 'curl-config'; } else { print "Sorry, no automated install is available on Windows,\n". "please see the README.Win32 file on instructions for a manual install.\n"; exit(0); } my @includes = qw(); my ($cflags,$lflags, $ldflags) = ('','',''); # This utility helper generates the constants function from curl.h # It is normally only used by the maintainer, but if you're curl is older # or missing some constants, you can delete curlopt-constants.c and re-run 'perl Makefile.PL' # You may need to specify where to find curl.h on your platform # These are guesses only, in case curl-config is not telling us. if ($^O ne 'MSWin32') { push @includes, qw( /usr/include /usr/local/curl/include /usr/local/include/curl ../../include ../curl/include ); } # # Get curl to tell us where it is, if we can. # if ($^O ne 'MSWin32') { $cflags = `curl-config --cflags`; $lflags = `curl-config --libs`; } # can't find link flags, make some guesses if (!defined($lflags)) { $lflags="-lcurl"; print "Guessing your linker flags as: $lflags\n"; } my ($flag) = ($cflags =~ m/-I(\S+)/); if (defined $flag) { unshift @includes, $flag; # first guess } # try the path given on the command line, if any if (defined($ARGV[0])) { unshift @includes, $ARGV[0]; }; my $curl_d = ""; my $curl_h; # otherwise try a list of common locations foreach my $try (@includes) { if (-f $try . "/curl/curl.h") { $curl_d = $try; $curl_h = $try . "/curl/curl.h"; last; } } if (!defined($curl_h)) { die "Cannot find curl.h - cannot build constants files - see Makefile.PL"; } else { $curl_d = "-I" . $curl_d; print "Found curl.h in $curl_h\n"; open(CURL_H, "<" . $curl_h) or die "Can't open curl.h\n"; my %cinit_types; my %cinit_codes; my @curlinfo; my @curlshopt; my @curllockopt; while () { if ($_ =~ m/CINIT\(/ and $_ !~ m/#/) { my ($option, $type, $code) = m/.*CINIT\((\w*)\s*,\s*(\w+)\s*,\s*(\d+).*/; $cinit_types{$option} = $option; $cinit_codes{$option} = $code; } elsif ($_ =~ m/^#define CURLOPT_\w+ CURLOPT_\w+/) { my ($option, $value) = m/^#define CURLOPT_(\w+) CURLOPT_(\w+)/; $cinit_types{$option} = $value; } elsif ($_ =~ m/^\s*(CURLINFO_\w+)/) { push @curlinfo, $1; } elsif ($_ =~ m/^\s*(CURLSHOPT_\w+)/) { push @curlshopt, $1; } elsif ($_ =~ m/^\s*(CURL_LOCK_DATA_\w+)/) { push @curllockopt, $1; } } close(CURL_H); # some things are ifdefed out... foreach my $ifdef0 (qw(FLAGS PROGRESSMODE MOREDOCS)) { delete $cinit_types{$ifdef0}; delete $cinit_codes{$ifdef0}; } print "Building curlopt-constants.c for your libcurl version\n"; open(CURL_XS, ">curlopt-constants.c") or die "Can't write curlopt-constants.c\n"; # boilerplate xs constant function here print CURL_XS <lib/WWW/Curl/Easy.pm") or die "Can't create lib/WWW/Curl/Easy.pm\n"; open(EASY_PM_IN, "template/Easy.pm.tmpl") or die "Can't read template/Easy.pm.tmpl\n"; while (my $line = ) { if ($line !~ m/^\@CURLOPT_INCLUDE\@/) { print EASY_PM $line; } else { foreach my $option (sort keys %cinit_types) { next unless $option; # an empty CURLOPT_ print EASY_PM "CURLOPT_$option\n"; } foreach my $option (sort @curlinfo) { print EASY_PM $option . "\n"; } } } close(EASY_PM); close(EASY_PM_IN); print "Building Share.pm constants for your libcurl version\n"; open(SHARE_PM, ">lib/WWW/Curl/Share.pm") or die "Can't create lib/WWW/Curl/Share.pm\n"; open(SHARE_PM_IN, "template/Share.pm.tmpl") or die "Can't read template/Share.pm.tmpl\n"; while (my $line = ) { if ($line !~ m/^(.*?)\@CURLSHOPT_INCLUDE\@/) { print SHARE_PM $line; } else { foreach my $option (sort @curlshopt) { print SHARE_PM $1 . $option . "\n"; } foreach my $option (sort @curllockopt) { print SHARE_PM $1 . $option . "\n"; } } } close(SHARE_PM); close(SHARE_PM_IN); } # Let Module::Install generate META.yml and other necessary files. WriteMakefile( 'NAME' => 'WWW::Curl', 'VERSION_FROM' => 'lib/WWW/Curl.pm', # finds $VERSION 'LIBS' => "$ldflags $lflags", # e.g., '-lm' 'INC' => $curl_d, # e.g., '-I/usr/include/other' 'clean' => { FILES => "curlopt-constants.c head.out body.out" } );