# Makefile.PL for PDL::Core module #require '../Core/Dev.pm'; PDL::Core::Dev->import(); use Config; use IO::File; my $pthread_include = '/usr/include/pthread.h'; my $pthread_library = '-lpthread'; my $pthread_define = ' -DPDL_PTHREAD '; my $macos_braindamage_define = ($ENV{'OSTYPE'} eq 'darwin') ? " -DMACOS_MZERO_BRAINDAMAGE " : ""; my $malloclib = $PDL::Config{MALLOCDBG}->{libs}; my $mallocinc = $PDL::Config{MALLOCDBG}->{include}; my $fh = IO::File->new( "> mymalloc.p" ) or die "couldn't open mymalloc.p"; if ( defined $PDL::Config{MALLOCDBG}->{define} ) { $fh->print( "\$mymalloc = <<'EOM';\n$PDL::Config{MALLOCDBG}->{define}\nEOM\n" ); } else { $fh->print( "\$mymalloc = '';\n" ); } $fh->print( "1;\n" ); $fh->close; print "Trying to figure out POSIX threads support ...\n"; if ( -e $pthread_include) { print "\tSaw pthread.h. Fine.\n"; } else { print "\tEhh. Didn't see include file 'pthread.h'.\n"; $pthread_include = ''; } # For SGI, I had to link a new perl - cannot dlopen libpthread... require Config; if ($Config::Config{libs} =~ /-lpthread/) { print "\tFine, your perl was linked against pthread library.\n"; } elsif ($^O eq 'dec_osf') { if ($Config::Config{usemymalloc} eq 'n') { print "\tFine pthread, works with Digital Unixs malloc\n"; } else { # print "\tPerls malloc has problems when perl is not linked with -lpthreads\n"; $pthread_library = ''; } } elsif ($^O eq 'freebsd'){ if ($Config::Config{libs} =~ /-lc_r/) { print "\tGood, found -lc_r on a freebsd system.\n"; }else{ print "On FreeBSD try building perl with libc_r instead of libc\n"; $pthread_library = ''; } } else { print "\tNope, your perl was not linked against pthread library\n"; print "\tYou need to include -lpthread in your perl libs configuration\n"; $pthread_library = ''; } $pthread_include = $pthread_library = '' unless $pthread_include and $pthread_library; { my $conf = $PDL::Config{WITH_POSIX_THREADS}; if ((!defined($conf) or $conf) and $pthread_include and $pthread_library) { print "\t==> Will build PDL with POSIX thread support. Gifts to TJL :-)\n"; $PDL::Config{WITH_POSIX_THREADS} = 1; } elsif($conf) { print "\t==> I couldn't find pthread support. However, you have\n"; print "\t turned on the forcing option in PDL_CONFIG so I guess I gotta do it\n"; } else { print "\t==> PDL will be built without POSIX thread support.\n"; print "\t==> *NOTE*: PDL threads are unrelated to perl threads (usethreads=y)!\n"; print "\t==> Enabling perl threads will not help!\n"; $pthread_define = ''; $PDL::Config{WITH_POSIX_THREADS} = 0; } } # isbigendian() is in PDL::Dev print "\nTrying to figure out endian-ness of machine..."; print " It is " . (isbigendian() ? "big" : "little") . " endian\n"; # badsupport.p is made by the top-level Makefile, but placed # into Basic/Core, so we clean it up here sub nopl { my $txt = shift; $txt =~ s/[.]PL$//; return $txt} use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => 'PDL::Core', 'VERSION_FROM' => 'Version.pm', 'OBJECT' => 'Core$(OBJ_EXT) pdlcore$(OBJ_EXT) pdlapi$(OBJ_EXT) '. 'pdlhash$(OBJ_EXT) pdlthread$(OBJ_EXT) '. 'pdlconv$(OBJ_EXT) pdlmagic$(OBJ_EXT) pdlsections$(OBJ_EXT) ', 'PM' => { (map {($_,'$(INST_LIBDIR)/'.$_)} ( qw/Core.pm Basic.pm Version.pm Types.pm Dbg.pm Exporter.pm Config.pm Char.pm/ )), (map {($_,'$(INST_LIBDIR)/Core/'.$_)} ( qw/Dev.pm typemap.pdl pdl.h pdlcore.h pdlmagic.h pdlsimple.h pdlthread.h ppport.h/ )), }, 'PL_FILES' => {map {($_ => nopl $_)} grep {!/^Core.pm.PL|Makefile.PL$/} <*.PL>}, 'DEFINE' => $pthread_define.$macos_braindamage_define, 'LIBS' => ["$pthread_library $malloclib"], 'clean' => {'FILES' => 'pdlcore$(OBJ_EXT) pdlapi$(OBJ_EXT) '. 'pdlhash$(OBJ_EXT) pdlconv$(OBJ_EXT) pdlsections$(OBJ_EXT) '. 'pdlconv.c pdlsections.c pdlcore.c '. 'pdl.h pdlsimple.h pdlcore.h '. 'Types.pm Version.pm Core.pm Core.c Core.xs ' . 'mymalloc.p badsupport.p' }, 'INC' => "$mallocinc", ); # Extra targets to build sub make_from_PL ($) { my $head = shift; return "\t" . '$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) ' . "${head}.PL $head\n"; } sub MY::xs_o { if($Config{make} eq 'nmake') { return' .xs$(OBJ_EXT): $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c ' } else { package MY; my $self = shift; return $self->SUPER::xs_o; } } sub MY::processPL { if($^O =~ /MSWin32/i && ($Config{make} eq 'dmake' || $Config{make} eq 'nmake')) { if($Config{make} eq 'nmake'){return ''} my($self) = shift; return "" unless $self->{PL_FILES}; my(@m, $plfile); foreach $plfile (sort keys %{$self->{PL_FILES}}) { my $list = ref($self->{PL_FILES}->{$plfile}) ? $self->{PL_FILES}->{$plfile} : [$self->{PL_FILES}->{$plfile}]; my $target; foreach $target (@$list) { push @m, " all :: $target \$(NOECHO) \$(NOOP) $target : \$(PERLRUNINST) $plfile $target "; } # close foreach } join "", @m; } else { package MY; my $self = shift; return $self->SUPER::processPL; } } sub MY::postamble { if($Config{make} eq 'dmake') { return PDL::Core::Dev::postamble(). " Core.pm :: Core.pm.PL Types.pm badsupport.p\n" . make_from_PL('Core.pm') ." pdl.h:: pdl.h.PL mymalloc.p Types.pm\n" . make_from_PL( 'pdl.h' ) ." pdlsimple.h:: pdlsimple.h.PL Types.pm\n" . make_from_PL( 'pdlsimple.h' ) ." pdlcore.h:: pdlcore.h.PL Types.pm\n" . make_from_PL( 'pdlcore.h' ) . q| pdlsections.c: pdlsections.g Types.pm $(PERL) -e "require './getdev.pl'" pdlsections.g > pdlsections.c |; }else { return PDL::Core::Dev::postamble(). " # Bits of C code we generate from special perl scripts # # there must be a more elegant way of saying that # certain files have additional dependencies! Core.pm :: Core.pm.PL Types.pm badsupport.p\n" . make_from_PL('Core.pm') ." pdl.h:: pdl.h.PL mymalloc.p Types.pm\n" . make_from_PL( 'pdl.h' ) ." pdlsimple.h:: pdlsimple.h.PL Types.pm\n" . make_from_PL( 'pdlsimple.h' ) ." pdlconv.c:: pdlconv.c.PL Types.pm\n" . make_from_PL( 'pdlconv.c' ) ." pdlcore.c:: pdlcore.c.PL Types.pm\n" . make_from_PL( 'pdlcore.c' ) ." pdlcore.h:: pdlcore.h.PL Types.pm\n" . make_from_PL( 'pdlcore.h' ) . join( "", map { "\n$_ :: ${_}.PL badsupport.p\n" . make_from_PL($_) } qw( Core.pm Core.xs pdlcore.c ) ) . ($^O =~ /MSWin/ ? q| pdlsections.c: pdlsections.g Types.pm $(PERL) -e "require './getdev.pl'" pdlsections.g > pdlsections.c | : ''); } }