use strict; use warnings; use ExtUtils::MakeMaker; use ExtUtils::Embed; use Config; require 5.008001; use constant IS_SOLARIS => ( $^O =~ /solaris/ ); my @dtrace = qw( /usr/sbin/dtrace ); sub find_bin { for ( @_ ) { return $_ if -x $_; } return; } my $dtrace = find_bin( @dtrace ); unless ( $dtrace ) { warn "Can't find dtrace executable. " . "I looked in the following places:\n"; warn " $_\n" for @dtrace; warn "Can't continue.\n"; exit 0; # == NA test result } # Find out whether we have a dtrace that supports -h if ( system "$dtrace -h -s plxsdtrace.d -o plxsdtrace.tmp " . ">/dev/null 2>&1 " . "&& rm plxsdtrace.tmp" ) { warn "It seems that $dtrace doesn't support the -h flag.\n"; warn "Can't continue.\n"; exit 0; # == NA test result } # Whether we need to have dtrace create an object file and link # against it. my $DTRACE_OBJ = 0; unless ( system "$dtrace -G -s plxsdtrace.d -o plxsdtrace.tmp " . ">/dev/null 2>&1 " . "&& rm plxsdtrace.tmp" ) { $DTRACE_OBJ = 1; } if ( $Config{usedtrace} ) { print "Your Perl already supports DTrace natively.\n" . "Will still build Devel::DTrace but you probably don't need it.\n\n"; } if ( $] < 5.008008 ) { print "The dtperl instrumented Perl executable doesn't seem to work\n" . "with Perls older than 5.8.8 (your $^X is $]).\n" . "I'll build it but be aware that it will be untested and may\n" . "be unusable. Sorry about that\n\n"; } if ( IS_SOLARIS ) { print "The dtperl instrumented Perl executable doesn't seem to work\n" . "on Solaris. I'll build it but be aware that it will be\n" . "untested and may be unusable. Sorry about that\n\n"; } my @obj = ( 'runops.o', ( $DTRACE_OBJ ? ( 'plxsdtrace.o' ) : () ) ); my %args = ( ( MM->can( 'signature_target' ) ? ( SIGN => 1 ) : () ), NAME => 'Devel::DTrace', AUTHOR => 'Andy Armstrong ', LICENSE => 'perl', VERSION_FROM => 'lib/Devel/DTrace.pm', ABSTRACT_FROM => 'lib/Devel/DTrace.pm', PL_FILES => {}, PREREQ_PM => { 'Test::More' => 0, 'Test::Differences' => 0, 'List::Util' => 0, }, OBJECT => join( ' ', @obj, 'DTrace.o' ), EXE_FILES => ['dtperl'], dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, clean => { FILES => [ 'Devel-DTrace-*', 'plxsdtrace.h', '*.o', 'dtperl' ] }, depend => { 'runops.o' => 'plxsdtrace.h' }, ); WriteMakefile( %args ); sub rule { my ( $target, $dep, @steps ) = @_; return "$target: $dep\n" . ( join "\n", map { "\t$_" } @steps ); } sub MY::postamble { chomp( my ( $ccopts, $ldopts ) = ( ccopts(), ldopts() ) ); my @mf = ( rule( 'plxsdtrace.h' => 'plxsdtrace.d', "$dtrace \$(DTRACEFLAGS) -h -s plxsdtrace.d -o plxsdtrace.h" ), ( $DTRACE_OBJ ? rule( 'plxsdtrace.o' => 'plxsdtrace.d runops.o', "$dtrace \$(DTRACEFLAGS) -G -s plxsdtrace.d runops.o -o plxsdtrace.o" ) : () ), rule( 'dtperl' => 'dtperl.o runops.o', join( ' ', "\$(LD) $ccopts -o dtperl $ldopts", @obj, 'dtperl.o' ) ), ); ( my $postamble = join "\n\n", @mf ) =~ s/^ +/\t/mg; return $postamble; }