perl 5.20.0 released
[DBD-Unify.git] / Makefile.PL
1 #!/usr/local/bin/perl -w
2
3 require 5.008004;
4
5 use strict;
6
7 # Be kind to testers, not verbose
8 if (exists $ENV{AUTOMATED_TESTING} and $ENV{AUTOMATED_TESTING}) {
9     exists $ENV{UNIFY} or exit 0;
10     }
11
12 use Cwd qw( cwd abs_path );
13
14 use ExtUtils::MakeMaker;
15 use Config;
16
17 use DBI 1.42;
18 use DBI::DBD;
19
20 print "\nConfiguring DBD::Unify ...\n\n";
21
22 $^O =~ m/^(?: VMS | MsWin32 | cygwin )$/x and
23     die "No support for OS $^O (yet)\n";
24
25 use vars qw($UNIFY $UNITOP $ULIBS $ULDOPTS);
26
27 CheckUnify ();
28
29 my %wm = (
30     NAME          =>   "DBD::Unify",
31     DISTNAME      =>   "DBD-Unify",
32     VERSION_FROM  =>   "lib/DBD/Unify.pm",
33     AUTHOR        =>   "H.Merijn Brand <h.m.brand\@xs4all.nl>",
34     ABSTRACT_FROM =>   "lib/DBD/Unify.pm",
35
36     PREREQ_PM     => { # CORE stuff
37                        "Carp"           => 0,
38                        "DynaLoader"     => 0,
39                        # For unstallu.pl
40                        "Config"         => 0,
41                        "Cwd"            => 0,
42                        "File::Find"     => 0,
43                        "File::Copy"     => 0,
44
45                        # Real deps
46                        "DBI"            => 1.42,
47
48                        # Test deps
49                        "Test::More"     => 0.90,
50                        },
51
52     dist          => { COMPRESS => "gzip -9f",
53                        SUFFIX   => ".gz",
54                        },
55
56     clean         => { FILES => "dbdimp.c dbdimp.ec Unify.ec",
57                        },
58     realclean     => { FILES => "Unify.xsi ulib",
59                        },
60
61     LINKTYPE      =>   "dynamic",
62     INC           =>   "-I$UNITOP -I$UNITOP/include -I\$(DBI_INSTARCH_DIR)",
63     OBJECT        =>   "Unify\$(OBJ_EXT) dbdimp\$(OBJ_EXT)",
64
65     depend        => { "dbdimp\$(OBJ_EXT)" => "dbdimp.c Unify.h",
66                        "Unify\$(OBJ_EXT)"  => "Unify.h",
67                        },
68
69     dynamic_lib   => { OTHERLDFLAGS => " $ULIBS \$(COMPOBJS) " .
70                                             "-L$UNIFY " .(
71                                             { hpux      => "",
72                                               aix       => "-lm",
73                                               dec_osf   => "-lxnet",
74                                               }->{$^O}||"") . $ULDOPTS,
75                        },
76     macro         => { EPP    => "$UNITOP/bin/EPP",
77                        EPPOPT => "",
78                        CC     => ($^O eq "aix" ? "env UPPNAME='cc -E' " : "")
79                                         . "$UNITOP/bin/ucc",
80                        SELINUXENABLED => "/usr/sbin/selinuxenabled",
81                        },
82     );
83 my $eummv = eval $ExtUtils::MakeMaker::VERSION;
84 $eummv > 6.30                           and $wm{LICENSE} = "perl";
85 $Config{myarchname} eq "ia64-hpux"      and delete $wm{macro}{CC};
86
87 my $rv = WriteMakefile (%wm);
88
89 if ($rv && <ulib/*.s[lo] >) {
90     open my $mf, "<Makefile" or die "Cannot read Makefile: $!\n";
91     my @MF = <$mf>;
92     close $mf;
93     s/\bPERL_DL_NONLAZY=\d+\s+// for @MF;
94     open  $mf, ">Makefile"   or die "Cannot modify Makefile: $!\n";
95     print $mf @MF;
96     close $mf;
97     }
98
99 sub CheckUnify
100 {
101     unless (exists $ENV{UNIFY}) {
102         print STDERR
103             "\$UNIFY not set.  This probably means that you either do not have\n",
104             "Unify products installed on your system, or you did not set up a\n",
105             "minimal runtime environment to make it work.\n";
106         exit 1;
107         }
108     unless (exists $ENV{DBPATH}) {
109         print STDERR
110             "\$DBPATH not set.  Even if your UNIFY environment might be set up\n",
111             "correctly, building and testing will need an available database.\n";
112         exit 1;
113         }
114
115     $UNIFY = abs_path $ENV{UNIFY};
116
117     -d $UNIFY           or die "\$UNIFY is not a valid directory\n";
118     -d $ENV{DBPATH}     or die "\$DBPATH is not a valid directory\n";
119
120     $UNITOP = abs_path "$UNIFY/..";
121     my $cwd = cwd;
122
123     my @sqlv = `SQL -version`;
124
125     unlink "ulib";
126     symlink $UNIFY, "./ulib";
127     # Checked for A/SQL DS 6.3 AB and beyond
128     my @ulibs = grep { -f "ulib/$_" } qw(
129         ACCELL.a
130         S2000e.a S2000c.a
131         libuse.a
132         U2000c.a U2000u.a U2000k.a
133         U2000c.a
134         S2000u.a S2000c.a U2000r.a
135         libnwrpc.a libnwstcp.a
136         libusu.a libudsu.a
137         U2000c.a U2000u.a);
138     my $localremote = prompt (
139         "Link (L)ocal-only, (R)emote-only, or (B)oth? [L/r/b] >", "L");
140     if    ($localremote =~ m/^\s*[Rr]/) {
141         @ulibs = map { s/([0s]u)\.a/$1r.a/; $_ } @ulibs;
142         }
143     elsif ($localremote =~ m/^\s*[Bb]/) {
144         # No change
145         }
146     else { # Local-only is (fastest) default
147         @ulibs = map { s/([0s]u)\.a/$1l.a/; $_ } @ulibs;
148         }
149     $ULDOPTS = -f "ulib/libgcc.a" ? " -lgcc" : "";
150
151     my ($rev) = ("@sqlv" =~ m/Revision:\s+(\d[.\d]*)/);
152     my $dlext = $Config{dlext} || "sl";
153     my $try_shared = $^O eq "hpux" && $rev >= 8.2 ? 1 : 0;
154     if ($try_shared) {
155         if (<ulib/*.$dlext >) {
156             my $answer = prompt ("Build a shared lib version? [Y/n] >", "Y");
157             $answer =~ m/^\s*[Qq]/   and exit;
158             $answer =~ m/^\s*[NnFf]/ and $try_shared = 0;
159             }
160         elsif (-w $UNIFY) {
161             my $answer = prompt (
162                 "Building for rev $rev on HP-UX would support Shared Libraries\n".
163                 " but I don't see them (yet) in your \$UNIFY.\n".
164                 "Shall I try to use Shared Objects? [Y/n] >", "Y");
165             $answer =~ m/^\s*[Qq]/ and exit;
166             if ($answer =~ m/^\s*[NnFf]/) {
167                 $try_shared = 0;
168                 }
169             else {
170                 chdir $UNIFY or die "Cannot chdir to $UNIFY: $!\n";
171                 foreach my $a (<*.a >) {
172                     $a eq "ACLMAIN.a" || $a eq "libgcc.a" and next;
173                     (my $sl = "lib$a") =~ s/\.a$/.$dlext/o;
174                     $sl =~ s/^liblib/lib/;
175                     -f $sl and next;    # Already done;
176                     mkdir "_a_SL" or die "Cannot create temp dir for conversion: $!";
177                     chdir "_a_SL" or die "Cannot chdir to temp dir: $!";
178                     print STDERR "  Converting $a ...\n";
179                     system "ar x ../$a";
180                     system "ld -b +s -o ../$sl *.o";
181                     unlink <*.o >;
182                     chdir "..";
183                     rmdir "_a_SL";
184                     }
185                 chdir $cwd;
186                 }
187             }
188         else {
189             $try_shared = 0;
190             }
191         }
192
193     <ulib/*.s[lo] > or $try_shared = 0;
194     if ($try_shared) {
195         s/\.a$// for @ulibs;
196         s/^lib// for @ulibs;
197         $ULIBS = join " -l" => "-L$UNIFY", @ulibs;
198         }
199     else {
200         $ULIBS = join " ulib/" => "", @ulibs;
201         }
202     print "\n";
203
204     # --- Check development environment
205
206     sub Check ($)
207     {
208         my $f = shift;
209         -r "$UNITOP/$f" && -s _ && (-x _ || $f !~ m/^bin/) and return;
210         die "I can't find $f\n".
211             "Is your Unify ($UNITOP) set up correctly??\n";
212         } # Check
213     Check ("bin/SQL");
214     Check ("bin/EPP");
215     if ($try_shared) {
216         Check ("lib/lib${_}.$dlext") for @ulibs;
217         }
218     else {
219         Check ($_) for split m/ u/ => $ULIBS;
220         }
221
222     splice @sqlv, -2, 2;
223     print "System:           perl$] $^O\n",
224           "UNIFY:            $UNITOP\n",
225           @sqlv,
226           "\n";
227
228     $UNITOP;
229     } # CheckUnify
230
231 1;
232
233 package MY;
234
235 sub postamble
236 {
237     join "\n" =>
238         DBI::DBD::dbd_postamble (),
239         '',
240         'dbdimp.c:              dbdimp.ec Unify.h',
241         '       $(EPP) $(EPPOPT) dbdimp.ec ',
242         '',
243         'dbdimp.ec:             dbdimp.ic',
244         '       $(PERL) ic2ec dbdimp.ic > dbdimp.ec',
245         '',
246         'installu uinstall:     all',
247         '       $(PERL) installu.pl',
248         '',
249         'cover test_cover:',
250 #       '       ccache -C',
251         '       cover -test',
252         '',
253         'spellcheck:',
254         '       pod-spell-check --aspell',
255         '',
256         'checkmeta:     spellcheck',
257         '       perl sandbox/genPPPort_h.pl',
258         '       perl sandbox/genMETA.pl -c',
259         '',
260         'fixmeta:       distmeta',
261         '       perl sandbox/genMETA.pl',
262         '       ls -l */META.yml',
263         '',
264         'tgzdist:       checkmeta fixmeta $(DISTVNAME).tar.gz distcheck',
265         '       -@mv -f $(DISTVNAME).tar.gz $(DISTVNAME).tgz',
266         '       -@cpants_lint.pl $(DISTVNAME).tgz',
267         '       -@rm -f Debian_CPANTS.txt',
268         '',
269         'linkext::',
270         '       if [ -x $(SELINUXENABLED) ] && $(SELINUXENABLED); then chcon -t textrel_shlib_t $(INST_ARCHLIB)/auto/$(FULLEXT)/$(DLBASE).so; fi',
271         '',
272         'install::',
273         '       if [ -x $(SELINUXENABLED) ] && $(SELINUXENABLED); then chcon -t textrel_shlib_t $(INSTALLSITEARCH)/auto/$(FULLEXT)/$(DLBASE).so; fi',
274         '';
275     } # postamble
276
277 sub libscan
278 {
279     my ($self, $path) = @_;
280     ($path =~ m/\~$/) ? undef : $path;
281     } # libscan
282
283 1;