1 #
   2 # Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
   3 #
   4 
   5 #
   6 # Makefile.PL for ::Exacct
   7 #
   8 
   9 #
  10 # Linker flags note:
  11 # The various .so files that comprise the ::Exacct module need to be able to
  12 # cross-call each other, and therefore to prevent runtime linker errors it is
  13 # necessary to establish linker dependencies between the various .so files.
  14 #
  15 # This causes several problems.  The first of these is that perl .so files are
  16 # built in one directory (under ../blib in this case) and installed into
  17 # another, so it is necessary to record the dependency using a path relative to
  18 # the dependent. This can be done with the $ORIGIN linker mechanism.
  19 
  20 # The second problem is that it is necessary to specify the name of the
  21 # dependee at link edit time in a manner that doesn't result in the build-time
  22 # path of the dependee being hard coded in to the dependent, as this would
  23 # stop ld.so.1 performing its normal search process for the files.  This can't
  24 # be done with the normal '--L/my/lib/path -lmylib' mechanism, because the XSUB
  25 # .so files aren't prefixed with 'lib'.  To do this the -h linker flag is used
  26 # to explicitly set the SONAME in the dependee.  This is then used as the name
  27 # of the dependent in the dependee rather than the full path by which it was
  28 # found at link edit time.
  29 #
  30 # For more details, refer to the Linker and Libraries Guide.
  31 #
  32 
  33 require 5.0010;
  34 use strict;
  35 use warnings;
  36 use ExtUtils::MakeMaker;
  37 
  38 our (@defines, @man3pods);
  39 
  40 #
  41 # MakeMaker overrides.
  42 #
  43 package MY;
  44 no warnings qw(once);
  45 
  46 #
  47 # Overrides that are common to both the ON and non-ON build environments.
  48 #
  49 
  50 #
  51 # Force the parent directory to be built first, because the sub-modules all
  52 # have a linker dependency against Exacct.so.
  53 #
  54 sub top_targets
  55 {
  56         my $self = shift(@_);
  57         my $txt = $self->SUPER::top_targets(@_);
  58         $txt =~ s/pm_to_blib subdirs/pm_to_blib \$(LINKTYPE) .WAIT subdirs/;
  59         return($txt);
  60 }
  61 
  62 #
  63 # Make 'install' wait for 'all' to complete.
  64 #
  65 sub install
  66 {
  67         my $self = shift(@_);
  68         my $txt = $self->SUPER::install(@_);
  69         $txt =~ s/ all / all .WAIT /g;
  70         return($txt);
  71 }
  72 
  73 #
  74 # Suppress the setting of LD_RUN_PATH, as it isn't necessary.
  75 #
  76 sub const_loadlibs
  77 {
  78         my $self = shift(@_);
  79         delete($self->{LD_RUN_PATH});
  80         return($self->SUPER::const_loadlibs(@_));
  81 }
  82 
  83 sub dynamic_lib
  84 {
  85         my $self = shift(@_);
  86         my $txt = $self->SUPER::dynamic_lib(@_);
  87         $txt =~ s/LD_RUN_PATH=\S*\s*//;
  88         return($txt);
  89 }
  90 
  91 #
  92 # ON-specific overrides.
  93 #
  94 if (exists($ENV{CODEMGR_WS}) && exists($ENV{ENVCPPFLAGS1})) {
  95         #
  96         # Override postamble and replace it with one that explicitly records
  97         # the dependency between Exacct.c (generated from Exacct.xs by xsubpp)
  98         # and the ExacctDefs.xi file (generated from sys/exacct.h by
  99         # extract_defines).  Note we have to mimic the -I processing done by cc
 100         # to find the correct version of the file, as we want the copy from the
 101         # proto area rather than /usr/include.  This ensures that the constant
 102         # values exported by the perl module stay up-to date with the
 103         # corresponding #defines.
 104         #
 105         *postamble = sub {
 106                 return <<'EOF';
 107 EXACCT_H:sh= \
 108         for dir in $ENVCPPFLAGS1 $ENVCPPFLAGS2 $ENVCPPFLAGS3 $ENVCPPFLAGS4 \
 109             /usr/include; do \
 110                 dir=`expr $dir : '^-I\(.*\)$' \| $dir`; \
 111                 file="$dir/sys/exacct.h"; \
 112                 test -f $file && echo $file && break; \
 113         done;
 114 
 115 Exacct.c:       ExacctDefs.xi
 116 
 117 ExacctDefs.xi:  extract_defines $(EXACCT_H)
 118         $(PERL) extract_defines Exacct $@ $(EXACCT_H)
 119 EOF
 120         };
 121 
 122         # Enable/disable debugging as required.
 123         @main::defines = ( DEFINE => '-DEXACCT_DEBUG' )
 124             if (! exists($ENV{RELEASE_BUILD}));
 125 
 126         # Don't install POD pages for ON.
 127         @main::man3pods = ( MAN3PODS => {} );
 128 
 129 #
 130 # Non-ON overrides.
 131 #
 132 } else {
 133         #
 134         # Override postamble and replace it with one that explicitly records
 135         # the dependency between Exacct.c (generated from Exacct.xs by xsubpp)
 136         # and the ExacctDefs.xi file (generated from /usr/include/sys/exacct.h
 137         # by extract_defines).  This ensures that the constant values exported
 138         # by the perl module stay up-to date with the corresponding #defines.
 139         #
 140         *postamble = sub {
 141                 return <<'EOF';
 142 EXACCT_H = /usr/include/sys/exacct.h
 143 
 144 Exacct.c:       ExacctDefs.xi
 145 
 146 ExacctDefs.xi:  extract_defines $(EXACCT_H)
 147         $(PERL) extract_defines Exacct $@ $(EXACCT_H)
 148 EOF
 149         };
 150 
 151         # Install the POD documentation for non-ON builds.
 152         my $man3pfx = '$(INST_MAN3DIR)/Sun::Solaris::Exacct';
 153         @main::man3pods = (
 154             MAN3PODS => { 'pod/Exacct.pod' => $man3pfx . '.$(MAN3EXT)' }
 155         );
 156 }
 157 
 158 #
 159 # Having set everything up, write the Makefile.
 160 #
 161 package main;
 162 
 163 WriteMakefile(
 164     NAME         => 'Sun::Solaris::Exacct',
 165     VERSION_FROM => 'Exacct.pm',
 166     DIR          => [ qw(Catalog File Object) ],
 167     H            => [ 'exacct_common.xh' ],
 168     LIBS         => [ '-lexacct' ],
 169     @defines,
 170     @man3pods,
 171     dynamic_lib  => { OTHERLDFLAGS => '-h $(DLBASE).$(DLEXT)' },
 172     realclean    => { FILES => 'ExacctDefs.xi' },
 173 );