]> git.donarmstrong.com Git - debhelper.git/blob - dh_perl
r485: * Typo, Closes: #104405
[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 dependency 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.18
59
60 =cut
61
62 init();
63
64 my $vendorlib = substr $Config{vendorlib}, 1;
65 my $vendorarch = substr $Config{vendorarch}, 1;
66
67 # the installation dir for arch-indep modules changed to
68 # /usr/share/perl5 in this version:
69 my $min_version = '5.6.0-16';
70
71 # Cleaning the paths given on the command line
72 foreach (@ARGV) {
73         s#/$##;
74         s#^/##;
75 }
76
77 my $perl = 'perl';
78 # If -d is given, then the dependency is on perl-base rather than perl.
79 $perl .= '-base' if $dh{D_FLAG};
80 my $version;
81
82 # dependency types
83 use constant PROGRAM   => 1;
84 use constant PM_MODULE => 2;
85 use constant XS_MODULE => 4;
86
87 foreach my $package (@{$dh{DOPACKAGES}}) {
88         my $tmp = tmpdir($package);
89         my $ext = pkgext($package);
90
91         my @subs;
92         if (open IN, "debian/${ext}substvars")
93         {
94             @subs = grep !/^perl:Depends=/, <IN>;
95             close IN;
96         }
97
98         # Check also for alternate locations given on the command line
99         my @dirs = grep -d, map "$tmp/$_", $vendorlib, $vendorarch, @ARGV;
100
101         # Look for perl modules and check where they are installed
102         my $deps = 0;
103         find sub {
104                 return unless -f;
105                 $deps |= PM_MODULE if /\.pm$/;
106                 $deps |= XS_MODULE if /\.so$/;
107             }, @dirs if @dirs;
108
109         # find scripts
110         find sub {
111                 return unless -f and (-x or /\.pl$/);
112                 local *F;
113                 return unless open F, $_;
114                 if (read F, local $_, 32 and m%^#!\s*/usr/bin/perl\s%)
115                 {
116                     $deps |= PROGRAM;
117                 }
118
119                 close F;
120             }, $tmp;
121
122         if ($deps)
123         {
124             my $perl_depends = $perl;
125             if ($deps & XS_MODULE or $dh{V_FLAG_SET})
126             {
127                 ($version) = `dpkg -s $perl` =~ /^Version:\s*(\S+)/m
128                     unless $version;
129
130                 $perl_depends .= " (>= $version)";
131             }
132             elsif ($deps & PM_MODULE)
133             {
134                 $perl_depends .= " (>= $min_version)";
135             }
136
137             # add perlapi-<ver> for XS modules
138             $perl_depends .= ", perlapi-$Config{version}"
139                 if $deps & XS_MODULE;
140
141             # don't need to depend on an un-versioned perl-base, it's
142             # essential
143             push @subs, "perl:Depends=$perl_depends\n"
144                 unless $perl_depends eq 'perl-base';
145         }
146
147         open OUT, ">debian/${ext}substvars";
148         print OUT @subs;
149         close OUT;
150 }
151
152 =head1 SEE ALSO
153
154 L<debhelper(1)>
155
156 This program is a part of debhelper.
157
158 =head1 AUTHOR
159
160 Brendan O'Dea <bod@debian.org>
161
162 =cut