SYN SYN
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / Liblist.pm
CommitLineData
005c1a0e 1package ExtUtils::Liblist;
17f410f9 2
3use 5.005_64;
005c1a0e 4# Broken out of MakeMaker from version 4.11
5
17f410f9 6our $VERSION = substr q$Revision: 1.25 $, 10;
f1387719 7
005c1a0e 8use Config;
8f1aa56b 9use Cwd 'cwd';
4633a7c4 10use File::Basename;
11
005c1a0e 12sub ext {
3e3baf6d 13 if ($^O eq 'VMS') { return &_vms_ext; }
14 elsif($^O eq 'MSWin32') { return &_win32_ext; }
15 else { return &_unix_os2_ext; }
55497cff 16}
17
18sub _unix_os2_ext {
e611f912 19 my($self,$potential_libs, $verbose) = @_;
22d4bb9c 20 if ($^O =~ 'os2' and $Config{perllibs}) {
4e68a208 21 # Dynamic libraries are not transitive, so we may need including
22 # the libraries linked against perl.dll again.
23
24 $potential_libs .= " " if $potential_libs;
22d4bb9c 25 $potential_libs .= $Config{perllibs};
4e68a208 26 }
4633a7c4 27 return ("", "", "", "") unless $potential_libs;
fb73857a 28 warn "Potential libraries are '$potential_libs':\n" if $verbose;
005c1a0e 29
30 my($so) = $Config{'so'};
22d4bb9c 31 my($libs) = $Config{'perllibs'};
55497cff 32 my $Config_libext = $Config{lib_ext} || ".a";
33
005c1a0e 34
35 # compute $extralibs, $bsloadlibs and $ldloadlibs from
36 # $potential_libs
37 # this is a rewrite of Andy Dougherty's extliblist in perl
005c1a0e 38
39 my(@searchpath); # from "-L/path" entries in $potential_libs
40 my(@libpath) = split " ", $Config{'libpth'};
4633a7c4 41 my(@ldloadlibs, @bsloadlibs, @extralibs, @ld_run_path, %ld_run_path_seen);
005c1a0e 42 my($fullname, $thislib, $thispth, @fullname);
8f1aa56b 43 my($pwd) = cwd(); # from Cwd.pm
005c1a0e 44 my($found) = 0;
45
46 foreach $thislib (split ' ', $potential_libs){
47
48 # Handle possible linker path arguments.
49 if ($thislib =~ s/^(-[LR])//){ # save path flag type
50 my($ptype) = $1;
51 unless (-d $thislib){
fb73857a 52 warn "$ptype$thislib ignored, directory does not exist\n"
e611f912 53 if $verbose;
005c1a0e 54 next;
55 }
f1387719 56 unless ($self->file_name_is_absolute($thislib)) {
fb73857a 57 warn "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
f1387719 58 $thislib = $self->catdir($pwd,$thislib);
005c1a0e 59 }
60 push(@searchpath, $thislib);
61 push(@extralibs, "$ptype$thislib");
62 push(@ldloadlibs, "$ptype$thislib");
63 next;
64 }
65
66 # Handle possible library arguments.
67 unless ($thislib =~ s/^-l//){
fb73857a 68 warn "Unrecognized argument in LIBS ignored: '$thislib'\n";
005c1a0e 69 next;
70 }
71
72 my($found_lib)=0;
73 foreach $thispth (@searchpath, @libpath){
74
75 # Try to find the full name of the library. We need this to
76 # determine whether it's a dynamically-loadable library or not.
77 # This tends to be subject to various os-specific quirks.
78 # For gcc-2.6.2 on linux (March 1995), DLD can not load
79 # .sa libraries, with the exception of libm.sa, so we
80 # deliberately skip them.
4e1fac24 81 if (@fullname =
82 $self->lsdir($thispth,"^\Qlib$thislib.$so.\E[0-9]+")){
005c1a0e 83 # Take care that libfoo.so.10 wins against libfoo.so.9.
84 # Compare two libraries to find the most recent version
85 # number. E.g. if you have libfoo.so.9.0.7 and
86 # libfoo.so.10.1, first convert all digits into two
87 # decimal places. Then we'll add ".00" to the shorter
88 # strings so that we're comparing strings of equal length
89 # Thus we'll compare libfoo.so.09.07.00 with
90 # libfoo.so.10.01.00. Some libraries might have letters
91 # in the version. We don't know what they mean, but will
92 # try to skip them gracefully -- we'll set any letter to
93 # '0'. Finally, sort in reverse so we can take the
94 # first element.
95
96 #TODO: iterate through the directory instead of sorting
97
98 $fullname = "$thispth/" .
99 (sort { my($ma) = $a;
100 my($mb) = $b;
101 $ma =~ tr/A-Za-z/0/s;
102 $ma =~ s/\b(\d)\b/0$1/g;
103 $mb =~ tr/A-Za-z/0/s;
104 $mb =~ s/\b(\d)\b/0$1/g;
105 while (length($ma) < length($mb)) { $ma .= ".00"; }
106 while (length($mb) < length($ma)) { $mb .= ".00"; }
107 # Comparison deliberately backwards
108 $mb cmp $ma;} @fullname)[0];
109 } elsif (-f ($fullname="$thispth/lib$thislib.$so")
110 && (($Config{'dlsrc'} ne "dl_dld.xs") || ($thislib eq "m"))){
4633a7c4 111 } elsif (-f ($fullname="$thispth/lib${thislib}_s$Config_libext")
ee8c7f54 112 && (! $Config{'archname'} =~ /RM\d\d\d-svr4/)
005c1a0e 113 && ($thislib .= "_s") ){ # we must explicitly use _s version
4633a7c4 114 } elsif (-f ($fullname="$thispth/lib$thislib$Config_libext")){
864a5fa8 115 } elsif (-f ($fullname="$thispth/$thislib$Config_libext")){
4633a7c4 116 } elsif (-f ($fullname="$thispth/Slib$thislib$Config_libext")){
8f1aa56b 117 } elsif ($^O eq 'dgux'
c07a80fd 118 && -l ($fullname="$thispth/lib$thislib$Config_libext")
4f44ac69 119 && readlink($fullname) =~ /^elink:/s) {
c07a80fd 120 # Some of DG's libraries look like misconnected symbolic
121 # links, but development tools can follow them. (They
122 # look like this:
123 #
124 # libm.a -> elink:${SDE_PATH:-/usr}/sde/\
125 # ${TARGET_BINARY_INTERFACE:-m88kdgux}/usr/lib/libm.a
126 #
127 # , the compilation tools expand the environment variables.)
005c1a0e 128 } else {
fb73857a 129 warn "$thislib not found in $thispth\n" if $verbose;
005c1a0e 130 next;
131 }
fb73857a 132 warn "'-l$thislib' found at $fullname\n" if $verbose;
4633a7c4 133 my($fullnamedir) = dirname($fullname);
134 push @ld_run_path, $fullnamedir unless $ld_run_path_seen{$fullnamedir}++;
005c1a0e 135 $found++;
136 $found_lib++;
137
138 # Now update library lists
139
140 # what do we know about this library...
4f44ac69 141 my $is_dyna = ($fullname !~ /\Q$Config_libext\E\z/);
4e68a208 142 my $in_perl = ($libs =~ /\B-l\Q$ {thislib}\E\b/s);
005c1a0e 143
144 # Do not add it into the list if it is already linked in
145 # with the main perl executable.
974f612f 146 # We have to special-case the NeXT, because math and ndbm
147 # are both in libsys_s
005c1a0e 148 unless ($in_perl ||
974f612f 149 ($Config{'osname'} eq 'next' &&
150 ($thislib eq 'm' || $thislib eq 'ndbm')) ){
005c1a0e 151 push(@extralibs, "-l$thislib");
152 }
153
154 # We might be able to load this archive file dynamically
974f612f 155 if ( ($Config{'dlsrc'} =~ /dl_next/ && $Config{'osvers'} lt '4_0')
156 || ($Config{'dlsrc'} =~ /dl_dld/) )
157 {
005c1a0e 158 # We push -l$thislib instead of $fullname because
159 # it avoids hardwiring a fixed path into the .bs file.
160 # Mkbootstrap will automatically add dl_findfile() to
161 # the .bs file if it sees a name in the -l format.
162 # USE THIS, when dl_findfile() is fixed:
163 # push(@bsloadlibs, "-l$thislib");
164 # OLD USE WAS while checking results against old_extliblist
165 push(@bsloadlibs, "$fullname");
166 } else {
167 if ($is_dyna){
168 # For SunOS4, do not add in this shared library if
169 # it is already linked in the main perl executable
170 push(@ldloadlibs, "-l$thislib")
8f1aa56b 171 unless ($in_perl and $^O eq 'sunos');
005c1a0e 172 } else {
173 push(@ldloadlibs, "-l$thislib");
174 }
175 }
176 last; # found one here so don't bother looking further
177 }
fb73857a 178 warn "Note (probably harmless): "
f3d9a6ba 179 ."No library found for -l$thislib\n"
005c1a0e 180 unless $found_lib>0;
181 }
4633a7c4 182 return ('','','','') unless $found;
183 ("@extralibs", "@bsloadlibs", "@ldloadlibs",join(":",@ld_run_path));
005c1a0e 184}
185
3e3baf6d 186sub _win32_ext {
ecc90c0e 187
188 require Text::ParseWords;
189
e611f912 190 my($self, $potential_libs, $verbose) = @_;
3e3baf6d 191
192 # If user did not supply a list, we punt.
193 # (caller should probably use the list in $Config{libs})
194 return ("", "", "", "") unless $potential_libs;
195
944acd49 196 my $cc = $Config{cc};
197 my $VC = 1 if $cc =~ /^cl/i;
198 my $BC = 1 if $cc =~ /^bcc/i;
199 my $GC = 1 if $cc =~ /^gcc/i;
200 my $so = $Config{'so'};
22d4bb9c 201 my $libs = $Config{'perllibs'};
944acd49 202 my $libpth = $Config{'libpth'};
203 my $libext = $Config{'lib_ext'} || ".lib";
3e3baf6d 204
205 if ($libs and $potential_libs !~ /:nodefault/i) {
206 # If Config.pm defines a set of default libs, we always
207 # tack them on to the user-supplied list, unless the user
208 # specified :nodefault
209
210 $potential_libs .= " " if $potential_libs;
211 $potential_libs .= $libs;
212 }
fb73857a 213 warn "Potential libraries are '$potential_libs':\n" if $verbose;
3e3baf6d 214
621ba994 215 # normalize to forward slashes
216 $libpth =~ s,\\,/,g;
217 $potential_libs =~ s,\\,/,g;
218
3e3baf6d 219 # compute $extralibs from $potential_libs
220
944acd49 221 my @searchpath; # from "-L/path" in $potential_libs
222 my @libpath = Text::ParseWords::quotewords('\s+', 0, $libpth);
223 my @extralibs;
224 my $pwd = cwd(); # from Cwd.pm
225 my $lib = '';
226 my $found = 0;
227 my $search = 1;
3e3baf6d 228 my($fullname, $thislib, $thispth);
3e3baf6d 229
b11c3c9f 230 # add "$Config{installarchlib}/CORE" to default search path
231 push @libpath, "$Config{installarchlib}/CORE";
232
ee8c7f54 233 if ($VC and exists $ENV{LIB} and $ENV{LIB}) {
234 push @libpath, split /;/, $ENV{LIB};
235 }
236
944acd49 237 foreach (Text::ParseWords::quotewords('\s+', 0, $potential_libs)){
3e3baf6d 238
944acd49 239 $thislib = $_;
240
241 # see if entry is a flag
242 if (/^:\w+$/) {
243 $search = 0 if lc eq ':nosearch';
244 $search = 1 if lc eq ':search';
245 warn "Ignoring unknown flag '$thislib'\n"
246 if $verbose and !/^:(no)?(search|default)$/i;
247 next;
248 }
249
250 # if searching is disabled, do compiler-specific translations
251 unless ($search) {
944acd49 252 s/^-l(.+)$/$1.lib/ unless $GC;
b11c3c9f 253 s/^-L/-libpath:/ if $VC;
944acd49 254 push(@extralibs, $_);
255 $found++;
256 next;
257 }
258
259 # handle possible linker path arguments
260 if (s/^-L// and not -d) {
261 warn "$thislib ignored, directory does not exist\n"
e611f912 262 if $verbose;
3e3baf6d 263 next;
264 }
944acd49 265 elsif (-d) {
266 unless ($self->file_name_is_absolute($_)) {
267 warn "Warning: '$thislib' changed to '-L$pwd/$_'\n";
268 $_ = $self->catdir($pwd,$_);
3e3baf6d 269 }
944acd49 270 push(@searchpath, $_);
3e3baf6d 271 next;
272 }
273
944acd49 274 # handle possible library arguments
275 if (s/^-l// and $GC and !/^lib/i) {
276 $_ = "lib$_";
2d7a9237 277 }
944acd49 278 $_ .= $libext if !/\Q$libext\E$/i;
279
944acd49 280 my $secondpass = 0;
87de1672 281 LOOKAGAIN:
3e3baf6d 282
d9b182a2 283 # look for the file itself
944acd49 284 if (-f) {
285 warn "'$thislib' found as '$_'\n" if $verbose;
d9b182a2 286 $found++;
944acd49 287 push(@extralibs, $_);
d9b182a2 288 next;
289 }
290
e47a9bbc 291 my $found_lib = 0;
3e3baf6d 292 foreach $thispth (@searchpath, @libpath){
944acd49 293 unless (-f ($fullname="$thispth\\$_")) {
294 warn "'$thislib' not found as '$fullname'\n" if $verbose;
3e3baf6d 295 next;
296 }
944acd49 297 warn "'$thislib' found as '$fullname'\n" if $verbose;
3e3baf6d 298 $found++;
299 $found_lib++;
300 push(@extralibs, $fullname);
301 last;
302 }
944acd49 303
304 # do another pass with (or without) leading 'lib' if they used -l
e47a9bbc 305 if (!$found_lib and $thislib =~ /^-l/ and !$secondpass++) {
306 if ($GC) {
307 goto LOOKAGAIN if s/^lib//i;
308 }
309 elsif (!/^lib/i) {
310 $_ = "lib$_";
311 goto LOOKAGAIN;
312 }
944acd49 313 }
314
315 # give up
fb73857a 316 warn "Note (probably harmless): "
3e3baf6d 317 ."No library found for '$thislib'\n"
318 unless $found_lib>0;
944acd49 319
3e3baf6d 320 }
944acd49 321
3e3baf6d 322 return ('','','','') unless $found;
ecc90c0e 323
324 # make sure paths with spaces are properly quoted
325 @extralibs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @extralibs;
3e3baf6d 326 $lib = join(' ',@extralibs);
42ab721c 327
328 # normalize back to backward slashes (to help braindead tools)
329 # XXX this may break equally braindead GNU tools that don't understand
330 # backslashes, either. Seems like one can't win here. Cursed be CP/M.
331 $lib =~ s,/,\\,g;
332
fb73857a 333 warn "Result: $lib\n" if $verbose;
3e3baf6d 334 wantarray ? ($lib, '', $lib, '') : $lib;
335}
336
55497cff 337
338sub _vms_ext {
339 my($self, $potential_libs,$verbose) = @_;
09b7f37c 340 my(@crtls,$crtlstr);
341 my($dbgqual) = $self->{OPTIMIZE} || $Config{'optimize'} ||
342 $self->{CCFLAS} || $Config{'ccflags'};
343 @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '')
344 . 'PerlShr/Share' );
22d4bb9c 345 push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'});
09b7f37c 346 push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'});
347 # In general, we pass through the basic libraries from %Config unchanged.
348 # The one exception is that if we're building in the Perl source tree, and
349 # a library spec could be resolved via a logical name, we go to some trouble
350 # to insure that the copy in the local tree is used, rather than one to
351 # which a system-wide logical may point.
352 if ($self->{PERL_SRC}) {
353 my($lib,$locspec,$type);
354 foreach $lib (@crtls) {
355 if (($locspec,$type) = $lib =~ m-^([\w$\-]+)(/\w+)?- and $locspec =~ /perl/i) {
356 if (lc $type eq '/share') { $locspec .= $Config{'exe_ext'}; }
357 elsif (lc $type eq '/library') { $locspec .= $Config{'lib_ext'}; }
358 else { $locspec .= $Config{'obj_ext'}; }
359 $locspec = $self->catfile($self->{PERL_SRC},$locspec);
360 $lib = "$locspec$type" if -e $locspec;
361 }
362 }
363 }
364 $crtlstr = @crtls ? join(' ',@crtls) : '';
55497cff 365
09b7f37c 366 unless ($potential_libs) {
367 warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose;
368 return ('', '', $crtlstr, '');
369 }
370
562a7b0c 371 my(@dirs,@libs,$dir,$lib,%found,@fndlibs,$ldlib);
55497cff 372 my $cwd = cwd();
373 my($so,$lib_ext,$obj_ext) = @Config{'so','lib_ext','obj_ext'};
374 # List of common Unix library names and there VMS equivalents
375 # (VMS equivalent of '' indicates that the library is automatially
376 # searched by the linker, and should be skipped here.)
377 my %libmap = ( 'm' => '', 'f77' => '', 'F77' => '', 'V77' => '', 'c' => '',
378 'malloc' => '', 'crypt' => '', 'resolv' => '', 'c_s' => '',
379 'socket' => '', 'X11' => 'DECW$XLIBSHR',
380 'Xt' => 'DECW$XTSHR', 'Xm' => 'DECW$XMLIBSHR',
381 'Xmu' => 'DECW$XMULIBSHR');
382 if ($Config{'vms_cc_type'} ne 'decc') { $libmap{'curses'} = 'VAXCCURSE'; }
383
fb73857a 384 warn "Potential libraries are '$potential_libs'\n" if $verbose;
55497cff 385
386 # First, sort out directories and library names in the input
387 foreach $lib (split ' ',$potential_libs) {
388 push(@dirs,$1), next if $lib =~ /^-L(.*)/;
389 push(@dirs,$lib), next if $lib =~ /[:>\]]$/;
390 push(@dirs,$lib), next if -d $lib;
391 push(@libs,$1), next if $lib =~ /^-l(.*)/;
392 push(@libs,$lib);
393 }
394 push(@dirs,split(' ',$Config{'libpth'}));
395
396 # Now make sure we've got VMS-syntax absolute directory specs
397 # (We don't, however, check whether someone's hidden a relative
398 # path in a logical name.)
399 foreach $dir (@dirs) {
400 unless (-d $dir) {
fb73857a 401 warn "Skipping nonexistent Directory $dir\n" if $verbose > 1;
55497cff 402 $dir = '';
403 next;
404 }
fb73857a 405 warn "Resolving directory $dir\n" if $verbose;
55497cff 406 if ($self->file_name_is_absolute($dir)) { $dir = $self->fixpath($dir,1); }
407 else { $dir = $self->catdir($cwd,$dir); }
408 }
409 @dirs = grep { length($_) } @dirs;
410 unshift(@dirs,''); # Check each $lib without additions first
411
412 LIB: foreach $lib (@libs) {
413 if (exists $libmap{$lib}) {
414 next unless length $libmap{$lib};
415 $lib = $libmap{$lib};
416 }
417
418 my(@variants,$variant,$name,$test,$cand);
419 my($ctype) = '';
420
421 # If we don't have a file type, consider it a possibly abbreviated name and
422 # check for common variants. We try these first to grab libraries before
423 # a like-named executable image (e.g. -lperl resolves to perlshr.exe
424 # before perl.exe).
425 if ($lib !~ /\.[^:>\]]*$/) {
426 push(@variants,"${lib}shr","${lib}rtl","${lib}lib");
427 push(@variants,"lib$lib") if $lib !~ /[:>\]]/;
428 }
429 push(@variants,$lib);
fb73857a 430 warn "Looking for $lib\n" if $verbose;
55497cff 431 foreach $variant (@variants) {
432 foreach $dir (@dirs) {
433 my($type);
434
435 $name = "$dir$variant";
fb73857a 436 warn "\tChecking $name\n" if $verbose > 2;
55497cff 437 if (-f ($test = VMS::Filespec::rmsexpand($name))) {
438 # It's got its own suffix, so we'll have to figure out the type
562a7b0c 439 if ($test =~ /(?:$so|exe)$/i) { $type = 'SHR'; }
440 elsif ($test =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; }
55497cff 441 elsif ($test =~ /(?:$obj_ext|obj)$/i) {
fb73857a 442 warn "Note (probably harmless): "
f3d9a6ba 443 ."Plain object file $test found in library list\n";
562a7b0c 444 $type = 'OBJ';
55497cff 445 }
446 else {
fb73857a 447 warn "Note (probably harmless): "
f3d9a6ba 448 ."Unknown library type for $test; assuming shared\n";
562a7b0c 449 $type = 'SHR';
55497cff 450 }
451 }
452 elsif (-f ($test = VMS::Filespec::rmsexpand($name,$so)) or
453 -f ($test = VMS::Filespec::rmsexpand($name,'.exe'))) {
562a7b0c 454 $type = 'SHR';
55497cff 455 $name = $test unless $test =~ /exe;?\d*$/i;
456 }
457 elsif (not length($ctype) and # If we've got a lib already, don't bother
458 ( -f ($test = VMS::Filespec::rmsexpand($name,$lib_ext)) or
459 -f ($test = VMS::Filespec::rmsexpand($name,'.olb')))) {
562a7b0c 460 $type = 'OLB';
55497cff 461 $name = $test unless $test =~ /olb;?\d*$/i;
462 }
463 elsif (not length($ctype) and # If we've got a lib already, don't bother
464 ( -f ($test = VMS::Filespec::rmsexpand($name,$obj_ext)) or
465 -f ($test = VMS::Filespec::rmsexpand($name,'.obj')))) {
fb73857a 466 warn "Note (probably harmless): "
f3d9a6ba 467 ."Plain object file $test found in library list\n";
562a7b0c 468 $type = 'OBJ';
55497cff 469 $name = $test unless $test =~ /obj;?\d*$/i;
470 }
471 if (defined $type) {
472 $ctype = $type; $cand = $name;
562a7b0c 473 last if $ctype eq 'SHR';
55497cff 474 }
475 }
476 if ($ctype) {
562a7b0c 477 # This has to precede any other CRTLs, so just make it first
478 if ($cand eq 'VAXCCURSE') { unshift @{$found{$ctype}}, $cand; }
479 else { push @{$found{$ctype}}, $cand; }
fb73857a 480 warn "\tFound as $cand (really $test), type $ctype\n" if $verbose > 1;
55497cff 481 next LIB;
482 }
483 }
fb73857a 484 warn "Note (probably harmless): "
f3d9a6ba 485 ."No library found for $lib\n";
55497cff 486 }
487
562a7b0c 488 push @fndlibs, @{$found{OBJ}} if exists $found{OBJ};
489 push @fndlibs, map { "$_/Library" } @{$found{OLB}} if exists $found{OLB};
490 push @fndlibs, map { "$_/Share" } @{$found{SHR}} if exists $found{SHR};
491 $lib = join(' ',@fndlibs);
09b7f37c 492
493 $ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
494 warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
495 wantarray ? ($lib, '', $ldlib, '') : $lib;
55497cff 496}
497
005c1a0e 4981;
c2e89b3d 499
864a5fa8 500__END__
cb1a09d0 501
864a5fa8 502=head1 NAME
503
504ExtUtils::Liblist - determine libraries to use and how to use them
505
506=head1 SYNOPSIS
507
508C<require ExtUtils::Liblist;>
509
e611f912 510C<ExtUtils::Liblist::ext($self, $potential_libs, $verbose);>
864a5fa8 511
512=head1 DESCRIPTION
513
514This utility takes a list of libraries in the form C<-llib1 -llib2
515-llib3> and prints out lines suitable for inclusion in an extension
516Makefile. Extra library paths may be included with the form
517C<-L/another/path> this will affect the searches for all subsequent
518libraries.
519
520It returns an array of four scalar values: EXTRALIBS, BSLOADLIBS,
3e3baf6d 521LDLOADLIBS, and LD_RUN_PATH. Some of these don't mean anything
522on VMS and Win32. See the details about those platform specifics
523below.
864a5fa8 524
525Dependent libraries can be linked in one of three ways:
526
527=over 2
528
529=item * For static extensions
530
531by the ld command when the perl binary is linked with the extension
532library. See EXTRALIBS below.
533
534=item * For dynamic extensions
535
536by the ld command when the shared object is built/linked. See
537LDLOADLIBS below.
538
539=item * For dynamic extensions
540
541by the DynaLoader when the shared object is loaded. See BSLOADLIBS
542below.
543
544=back
545
546=head2 EXTRALIBS
547
548List of libraries that need to be linked with when linking a perl
a7665c5e 549binary which includes this extension. Only those libraries that
864a5fa8 550actually exist are included. These are written to a file and used
551when linking perl.
552
553=head2 LDLOADLIBS and LD_RUN_PATH
554
555List of those libraries which can or must be linked into the shared
556library when created using ld. These may be static or dynamic
557libraries. LD_RUN_PATH is a colon separated list of the directories
558in LDLOADLIBS. It is passed as an environment variable to the process
559that links the shared library.
560
561=head2 BSLOADLIBS
562
563List of those libraries that are needed but can be linked in
564dynamically at run time on this platform. SunOS/Solaris does not need
565this because ld records the information (from LDLOADLIBS) into the
566object file. This list is used to create a .bs (bootstrap) file.
567
568=head1 PORTABILITY
569
570This module deals with a lot of system dependencies and has quite a
a7665c5e 571few architecture specific C<if>s in the code.
864a5fa8 572
55497cff 573=head2 VMS implementation
574
575The version of ext() which is executed under VMS differs from the
576Unix-OS/2 version in several respects:
577
578=over 2
579
580=item *
581
582Input library and path specifications are accepted with or without the
de592821 583C<-l> and C<-L> prefixes used by Unix linkers. If neither prefix is
55497cff 584present, a token is considered a directory to search if it is in fact
585a directory, and a library to search for otherwise. Authors who wish
586their extensions to be portable to Unix or OS/2 should use the Unix
587prefixes, since the Unix-OS/2 version of ext() requires them.
588
589=item *
590
591Wherever possible, shareable images are preferred to object libraries,
592and object libraries to plain object files. In accordance with VMS
593naming conventions, ext() looks for files named I<lib>shr and I<lib>rtl;
de592821 594it also looks for I<lib>lib and libI<lib> to accommodate Unix conventions
55497cff 595used in some ported software.
596
597=item *
598
599For each library that is found, an appropriate directive for a linker options
600file is generated. The return values are space-separated strings of
601these directives, rather than elements used on the linker command line.
602
603=item *
604
09b7f37c 605LDLOADLIBS contains both the libraries found based on C<$potential_libs> and
606the CRTLs, if any, specified in Config.pm. EXTRALIBS contains just those
607libraries found based on C<$potential_libs>. BSLOADLIBS and LD_RUN_PATH
608are always empty.
55497cff 609
610=back
611
612In addition, an attempt is made to recognize several common Unix library
613names, and filter them out or convert them to their VMS equivalents, as
614appropriate.
615
616In general, the VMS version of ext() should properly handle input from
617extensions originally designed for a Unix or VMS environment. If you
618encounter problems, or discover cases where the search could be improved,
619please let us know.
620
3e3baf6d 621=head2 Win32 implementation
622
623The version of ext() which is executed under Win32 differs from the
624Unix-OS/2 version in several respects:
625
626=over 2
627
628=item *
629
944acd49 630If C<$potential_libs> is empty, the return value will be empty.
22d4bb9c 631Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm)
944acd49 632will be appended to the list of C<$potential_libs>. The libraries
b11c3c9f 633will be searched for in the directories specified in C<$potential_libs>,
634C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>.
635For each library that is found, a space-separated list of fully qualified
636library pathnames is generated.
944acd49 637
638=item *
639
3e3baf6d 640Input library and path specifications are accepted with or without the
de592821 641C<-l> and C<-L> prefixes used by Unix linkers.
944acd49 642
643An entry of the form C<-La:\foo> specifies the C<a:\foo> directory to look
644for the libraries that follow.
645
646An entry of the form C<-lfoo> specifies the library C<foo>, which may be
647spelled differently depending on what kind of compiler you are using. If
648you are using GCC, it gets translated to C<libfoo.a>, but for other win32
649compilers, it becomes C<foo.lib>. If no files are found by those translated
650names, one more attempt is made to find them using either C<foo.a> or
651C<libfoo.lib>, depending on whether GCC or some other win32 compiler is
652being used, respectively.
653
654If neither the C<-L> or C<-l> prefix is present in an entry, the entry is
655considered a directory to search if it is in fact a directory, and a
656library to search for otherwise. The C<$Config{lib_ext}> suffix will
657be appended to any entries that are not directories and don't already have
658the suffix.
659
de592821 660Note that the C<-L> and C<-l> prefixes are B<not required>, but authors
944acd49 661who wish their extensions to be portable to Unix or OS/2 should use the
662prefixes, since the Unix-OS/2 version of ext() requires them.
3e3baf6d 663
664=item *
665
666Entries cannot be plain object files, as many Win32 compilers will
667not handle object files in the place of libraries.
668
669=item *
670
944acd49 671Entries in C<$potential_libs> beginning with a colon and followed by
672alphanumeric characters are treated as flags. Unknown flags will be ignored.
673
674An entry that matches C</:nodefault/i> disables the appending of default
22d4bb9c 675libraries found in C<$Config{perllibs}> (this should be only needed very rarely).
944acd49 676
677An entry that matches C</:nosearch/i> disables all searching for
678the libraries specified after it. Translation of C<-Lfoo> and
679C<-lfoo> still happens as appropriate (depending on compiler being used,
680as reflected by C<$Config{cc}>), but the entries are not verified to be
681valid files or directories.
3e3baf6d 682
e47a9bbc 683An entry that matches C</:search/i> reenables searching for
684the libraries specified after it. You can put it at the end to
22d4bb9c 685enable searching for default libraries specified by C<$Config{perllibs}>.
e47a9bbc 686
3e3baf6d 687=item *
688
689The libraries specified may be a mixture of static libraries and
690import libraries (to link with DLLs). Since both kinds are used
a7665c5e 691pretty transparently on the Win32 platform, we do not attempt to
3e3baf6d 692distinguish between them.
693
694=item *
695
696LDLOADLIBS and EXTRALIBS are always identical under Win32, and BSLOADLIBS
697and LD_RUN_PATH are always empty (this may change in future).
698
ecc90c0e 699=item *
700
701You must make sure that any paths and path components are properly
702surrounded with double-quotes if they contain spaces. For example,
703C<$potential_libs> could be (literally):
704
705 "-Lc:\Program Files\vc\lib" msvcrt.lib "la test\foo bar.lib"
706
707Note how the first and last entries are protected by quotes in order
708to protect the spaces.
709
944acd49 710=item *
711
712Since this module is most often used only indirectly from extension
713C<Makefile.PL> files, here is an example C<Makefile.PL> entry to add
e47a9bbc 714a library to the build process for an extension:
944acd49 715
716 LIBS => ['-lgl']
717
718When using GCC, that entry specifies that MakeMaker should first look
719for C<libgl.a> (followed by C<gl.a>) in all the locations specified by
720C<$Config{libpth}>.
721
722When using a compiler other than GCC, the above entry will search for
723C<gl.lib> (followed by C<libgl.lib>).
724
e47a9bbc 725If the library happens to be in a location not in C<$Config{libpth}>,
726you need:
727
728 LIBS => ['-Lc:\gllibs -lgl']
729
944acd49 730Here is a less often used example:
731
732 LIBS => ['-lgl', ':nosearch -Ld:\mesalibs -lmesa -luser32']
733
734This specifies a search for library C<gl> as before. If that search
735fails to find the library, it looks at the next item in the list. The
736C<:nosearch> flag will prevent searching for the libraries that follow,
737so it simply returns the value as C<-Ld:\mesalibs -lmesa -luser32>,
738since GCC can use that value as is with its linker.
739
740When using the Visual C compiler, the second item is returned as
741C<-libpath:d:\mesalibs mesa.lib user32.lib>.
742
743When using the Borland compiler, the second item is returned as
e47a9bbc 744C<-Ld:\mesalibs mesa.lib user32.lib>, and MakeMaker takes care of
745moving the C<-Ld:\mesalibs> to the correct place in the linker
746command line.
944acd49 747
3e3baf6d 748=back
749
750
864a5fa8 751=head1 SEE ALSO
752
753L<ExtUtils::MakeMaker>
754
755=cut
756