]> git.donarmstrong.com Git - debhelper.git/blob - dh_perl
r449: * dh_perl update
[debhelper.git] / dh_perl
1 #!/usr/bin/perl -w
2
3 =head1 NAME
4
5 dh_perl - calculates perl scripts & modules dependencies
6
7 =cut
8
9 use strict;
10 use Config;
11 use File::Find;
12 use Debian::Debhelper::Dh_Lib;
13
14 =head1 SYNOPSIS
15
16   dh_perl [debhelper options] [-d] [library dirs ...]
17
18 =head1 DESCRIPTION
19
20 dh_perl is a debhelper program that is responsible for generating
21 the perl:Depends substitutions and adding them to substvars files.
22
23 The program will look at perl scripts and modules in your package,
24 and will use this information to generate a dependency.
25 The dependancy will be substituted into your package's control file
26 wherever you place the token "${perl:Depends}".
27
28 =head1 OPTIONS
29
30 =over 4
31
32 =item B<-d>
33
34 In some specific cases you may want to depend on perl-base rather than the
35 full perl package. If so, you can pass the -d option to make dh_perl generate
36 a dependency on the correct base package. This is only necessary for some
37 packages that are included in the base system.
38
39 =item B<-V>
40
41 By default, scripts and architecture independent modules don't depend
42 on any specific version of perl.  The -V option causes the current
43 version of the perl (or perl-base with -d) package to be specified.
44
45 =item I<library dirs>
46
47 If your package installs perl modules in non-standard
48 directories, you can make dh_perl check those directories by passing their
49 names on the command line. It will only check the vendorlib and vendorarch
50 directories by default.
51
52 =back
53
54 =head1 CONFORMS TO
55
56 Debian policy, version 3.0.1
57
58 Perl policy, version 1.15
59
60 =cut
61
62 init();
63
64 my $vendorlib = substr $Config{vendorlib}, 1;
65 my $vendorarch = substr $Config{vendorarch}, 1;
66
67 # Cleaning the paths given on the command line
68 foreach (@ARGV) {
69         s#/$##;
70         s#^/##;
71 }
72
73 my $perl = 'perl';
74 # If -d is given, then the dependency is on perl-base rather than perl.
75 $perl .= '-base' if $dh{D_FLAG};
76 my $version;
77
78 # dependency types
79 use constant PROGRAM   => 1;
80 use constant PM_MODULE => 2;
81 use constant XS_MODULE => 4;
82
83 foreach my $package (@{$dh{DOPACKAGES}}) {
84         my $tmp = tmpdir($package);
85         my $ext = pkgext($package);
86
87         # Check also for alternate locations given on the command line
88         my @dirs = grep -d, map "$tmp/$_", $vendorlib, $vendorarch, @ARGV;
89
90         # Look for perl modules and check where they are installed
91         my $deps = 0;
92         find sub {
93                 return unless -f;
94                 $deps |= PM_MODULE if /\.pm$/;
95                 $deps |= XS_MODULE if /\.so$/;
96             }, @dirs if @dirs;
97
98         # find scripts
99         find sub {
100                 return unless -f and (-x or /\.pl$/);
101                 local *F;
102                 return unless open F, $_;
103                 if (read F, local $_, 32 and m%^#!\s*/usr/bin/perl\s%)
104                 {
105                     $deps |= PROGRAM;
106                 }
107
108                 close F;
109             }, $tmp;
110
111         next unless $deps;
112
113         my $perl_depends = $perl;
114         if ($deps & XS_MODULE or $dh{V_FLAG_SET})
115         {
116             ($version) = `dpkg -s $perl` =~ /^Version:\s*(\S+)/m
117                 unless $version;
118
119             $perl_depends .= " (>= $version)";
120         }
121
122         # add perlapi-<ver> for XS modules
123         $perl_depends .= ", perlapi-$Config{version}"
124             if $deps & XS_MODULE;
125
126         # don't need to depend on an un-versioned perl-base, it's
127         # essential
128         next if $perl_depends eq 'perl-base';
129
130         if (-e "debian/${ext}substvars") {
131                 open (IN, "<debian/${ext}substvars");
132                 my @lines=grep { ! /^perl:Depends=/ } <IN>;
133                 close IN;
134                 open (OUT, ">debian/${ext}substvars");
135                 print OUT @lines;
136         } else {
137                 open (OUT, ">debian/${ext}substvars");
138         }
139         print OUT "perl:Depends=$perl_depends\n";
140         close OUT;
141 }
142
143 =head1 SEE ALSO
144
145 L<debhelper(1)>
146
147 This program is a part of debhelper.
148
149 =head1 AUTHOR
150
151 Brendan O'Dea <bod@debian.org>
152
153 =cut