fix pod. add gcov make target
[perl-ctypes:perl-ctypes.git] / Makefile.PL
1 # Usage:
2 # perl Makefile.PL INCDIR=/usr/src/libffi-3.0.10/include LIBDIR=/usr/src/libffi-3.0.10/lib
3
4 #use 5.010000;
5 use ExtUtils::MakeMaker;
6 use Config;
7 use File::Copy;
8 use File::Spec;
9
10 our $libffi_version = "3.0.10rc3";
11
12 # check the installed version of libffi and override default libdir and incdir
13 use lib qw(inc);
14 use Devel::CheckLib;
15 my ($libdir, $incdir);
16 my $args = join(" ", @ARGV);
17 if ($args =~ /INCDIR[ =](\S+)/) {
18   $incdir = $1;
19 }
20 if ($args =~ /LIBDIR[ =](\S+)/) {
21   $libdir = $1;
22 }
23 if ($libdir or $incdir) {
24   eval qq/assert_lib( lib => 'ffi', header => 'ffi.h', libpath => $libdir, incpath => $incdir )/;
25 } else {
26   eval q/assert_lib( lib => 'ffi', header => 'ffi.h' )/;
27 }
28 if ($@) {
29   use File::Spec;
30   if ($^O !~ /MSWin32|msys/) {
31     warn "libffi not installed or failing. Use our own libffi $libffi_version\n";
32     use Cwd;
33     my $tar = $Config{tar} ? $Config{tar} : "tar";
34     system ($tar, "xfz", "libffi.tar.gz");
35     chdir "libffi";
36     my $cwd = getcwd;
37     system ($ENV{SHELL},"./configure --prefix=/");
38     system ("make");
39     system ("make install DESTDIR='$cwd'"); # abspath. install into libffi/lib, bin and include
40     $incdir = "$cwd/include";
41     $libdir = "$cwd/lib";
42     if ($^O eq 'cygwin') { # copy the bin/*.dll
43       mkdir "bin";
44       File::Copy::cp('lib/cygffi-*.dll', 'bin/');
45     }
46     chdir "..";
47   } else { # MSWin32
48     warn "Using the builtin win32 binaries $libffi_version\n";
49     # built with mingw32
50     # install via http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/
51     my $cwd = getcwd;
52     $libdir = "win32";
53     $incdir = File::Spec->catfile($cwd, $libdir,"include");
54     # be sure to install the dll on site, because we link only to the import lib
55     mkdir "bin";
56     File::Copy::cp(File::Spec->catfile($libdir, "libffi-5.dll"), "bin");
57   }
58 } else {
59   warn "Using system libffi.\n";
60   warn "  If too old (failing _call tests) install our libffi.tar.gz and use INCDIR and LIBDIR.\n";
61   warn "  tar xfz libffi.tar.gz; cd libffi; . configure --prefix=/; make && make install DESTDIR=`pwd`; cd ..\n";
62   warn "  perl Makefile.PL INCDIR=libffi/include LIBDIR=libffi/lib\n";
63 }
64
65 WriteMakefile(
66     NAME              => 'Ctypes',
67     VERSION_FROM      => 'lib/Ctypes.pm',
68     ABSTRACT_FROM     => 'lib/Ctypes.pm',
69     AUTHOR            => 'Ryan Jendoubi <ryan d\x{00f6}t jendoubi at gmail d\x{00f6}t com, Reini Urban',
70     PREREQ_PM         => {},
71     LIBS              => $libdir ? [ "-L$libdir -lffi" ] : [ "-lffi" ],
72     INC               => $incdir ? "-I. -I$incdir" : "-I.",
73 );
74
75 if  (eval {require ExtUtils::Constant; 1}) {
76   # If you edit these definitions to change the constants used by this module,
77   # you will need to use the generated const-c.inc and const-xs.inc
78   # files to replace their "fallback" counterparts before distributing your
79   # changes.
80   my @names = (qw|FFI_LONG_LONG_MAX FFI_SIZEOF_ARG FFI_SIZEOF_JAVA_RAW
81                  FFI_TYPE_DOUBLE FFI_TYPE_FLOAT FFI_TYPE_INT FFI_TYPE_LAST
82                  FFI_TYPE_LONGDOUBLE FFI_TYPE_POINTER FFI_TYPE_SINT16
83                  FFI_TYPE_SINT32 FFI_TYPE_SINT64 FFI_TYPE_SINT8 FFI_TYPE_STRUCT
84                  FFI_TYPE_UINT16 FFI_TYPE_UINT32 FFI_TYPE_UINT64 FFI_TYPE_UINT8
85                  FFI_TYPE_VOID PERL_SHORT_MIN PERL_SHORT_MAX PERL_USHORT_MIN
86                  PERL_USHORT_MAX PERL_INT_MIN PERL_INT_MAX PERL_UINT_MIN
87                  PERL_UINT_MAX PERL_LONG_MIN PERL_LONG_MAX PERL_ULONG_MIN
88                  PERL_ULONG_MAX DBL_MIN DBL_MAX FLT_MIN FLT_MAX LDBL_MIN
89                  LDBL_MAX PERL_UCHAR_MIN PERL_UCHAR_MAX|,
90               {name=>"FFI_BAD_ABI", macro=>"1"},
91               {name=>"FFI_BAD_TYPEDEF", macro=>"1"},
92               {name=>"FFI_OK", macro=>"1"});
93   ExtUtils::Constant::WriteConstants(
94                                      NAME         => 'Ctypes',
95                                      NAMES        => \@names,
96                                      C_FILE       => 'const-c.inc',
97                                      XS_FILE      => 'const-xs.inc',
98                                      DEFAULT_TYPE => 'NV',
99                                   );
100
101 }
102 else {
103   foreach my $file ('const-c.inc', 'const-xs.inc') {
104     my $fallback = File::Spec->catfile('win32', $file);
105     File::Copy::cp ($fallback, $file) or die "Can't copy $fallback to $file: $!";
106   }
107 }
108
109 sub MY::depend {
110     "
111 const-xs.inc: $0 \$(CONFIGDEP)
112
113 const-c.inc: $0 \$(CONFIGDEP)
114
115 Ctypes.c: \$(XSUBPPDEPS) const-xs.inc \$(XS_FILES) util.c obj_util.c
116
117 README : lib/Ctypes.pm
118         pod2text lib/Ctypes.pm > README
119
120 gcov : Ctypes.c.gcov Ctypes.xs.gcov cover_db/Ctypes-xs.html
121
122 Ctypes.c.gcov Ctypes.xs.gcov : Ctypes.xs
123         \$(MAKE) CCFLAGS=\"\$(CCFLAGS) -fprofile-arcs -ftest-coverage\" LDDLFLAGS=\"\$(LDDLFLAGS) -fprofile-arcs -ftest-coverage\"
124         gcov Ctypes.c Ctypes.xs
125
126 cover_db/Ctypes-xs.html : Ctypes.xs.gcov
127         -PERL5OPT=-MDevel::Cover make test
128         -$^X -S gcov2perl Ctypes.c.gcov Ctypes.xs.gcov
129         $^X -S cover
130
131 gprof :
132         \$(MAKE) CCFLAGS=\"\$(CCFLAGS) -pg\" LDDLFLAGS=\"\$(LDDLFLAGS) -pg\"
133 ";
134 }