| 1 | use File::Find; |
| 2 | use Config; |
| 3 | |
| 4 | if (@ARGV != 2) { |
| 5 | warn <<"EOT"; |
| 6 | Usage: makeliblinks libautodir targetdir |
| 7 | where libautodir is the architecture-dependent auto directory |
| 8 | (e.g. $Config::Config{archlib}/auto). |
| 9 | EOT |
| 10 | exit 2; |
| 11 | } |
| 12 | |
| 13 | my ($libautodir, $targetdir) = @ARGV; |
| 14 | |
| 15 | # Calculate relative path prefix from $targetdir to $libautodir |
| 16 | sub relprefix { |
| 17 | my ($to, $from) = @_; |
| 18 | my $up; |
| 19 | for ($up = 0; substr($to, 0, length($from)) ne $from; $up++) { |
| 20 | $from =~ s( |
| 21 | [^/]+ (?# a group of non-slashes) |
| 22 | /* (?# maybe with some trailing slashes) |
| 23 | $ (?# at the end of the path) |
| 24 | )()x; |
| 25 | } |
| 26 | return (("../" x $up) . substr($to, length($from))); |
| 27 | } |
| 28 | |
| 29 | my $relprefix = relprefix($libautodir, $targetdir); |
| 30 | |
| 31 | my ($dlext, $lib_ext) = @Config::Config{qw(dlext lib_ext)}; |
| 32 | |
| 33 | sub link_if_library { |
| 34 | if (/\.($dlext|$lib_ext)$/o) { |
| 35 | my $ext = $1; |
| 36 | my $name = $File::Find::name; |
| 37 | if (substr($name, 0, length($libautodir) + 1) ne "$libautodir/") { |
| 38 | die "directory of $name doesn't match $libautodir\n"; |
| 39 | } |
| 40 | substr($name, 0, length($libautodir) + 1) = ''; |
| 41 | my @parts = split(m(/), $name); |
| 42 | if ($parts[-1] ne "$parts[-2].$ext") { |
| 43 | die "module name $_ doesn't match its directory $libautodir\n"; |
| 44 | } |
| 45 | pop @parts; |
| 46 | my $libpath = "$targetdir/lib" . join("__", @parts) . ".$ext"; |
| 47 | print "$libpath -> $relprefix/$name\n"; |
| 48 | symlink("$relprefix/$name", $libpath) |
| 49 | or warn "above link failed with error: $!\n"; |
| 50 | } |
| 51 | } |
| 52 | |
| 53 | find(\&link_if_library, $libautodir); |
| 54 | exit 0; |