summaryrefslogtreecommitdiff
path: root/dh_perl
blob: a40c6fd563a23e9a81cbb6e7f21807e9096c28ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/usr/bin/perl -w

=head1 NAME

dh_perl - calculates perl scripts & modules dependencies

=cut

use strict;
use Config;
use File::Find;
use Debian::Debhelper::Dh_Lib;

=head1 SYNOPSIS

B<dh_perl> [S<I<debhelper options>>] [B<-d>] [S<I<library dirs ...>>]

=head1 DESCRIPTION

dh_perl is a debhelper program that is responsible for generating
the ${perl:Depends} substitutions and adding them to substvars files.

The program will look at perl scripts and modules in your package,
and will use this information to generate a dependency.
The dependency will be substituted into your package's control file
wherever you place the token "${perl:Depends}".

=head1 OPTIONS

=over 4

=item B<-d>

In some specific cases you may want to depend on perl-base rather than the
full perl package. If so, you can pass the -d option to make dh_perl generate
a dependency on the correct base package. This is only necessary for some
packages that are included in the base system.

=item B<-V>

By default, scripts and architecture independent modules don't depend
on any specific version of perl.  The -V option causes the current
version of the perl (or perl-base with -d) package to be specified.

=item I<library dirs>

If your package installs perl modules in non-standard
directories, you can make dh_perl check those directories by passing their
names on the command line. It will only check the vendorlib and vendorarch
directories by default.

=back

=head1 CONFORMS TO

Debian policy, version 3.0.1

Perl policy, version 1.18

=cut

init();

my $vendorlib = substr $Config{vendorlib}, 1;
my $vendorarch = substr $Config{vendorarch}, 1;

# the installation dir for arch-indep modules changed to
# /usr/share/perl5 in this version:
my $min_version = '5.6.0-16';

# Cleaning the paths given on the command line
foreach (@ARGV) {
	s#/$##;
	s#^/##;
}

my $perl = 'perl';
# If -d is given, then the dependency is on perl-base rather than perl.
$perl .= '-base' if $dh{D_FLAG};
my $version;

# dependency types
use constant PROGRAM   => 1;
use constant PM_MODULE => 2;
use constant XS_MODULE => 4;

foreach my $package (@{$dh{DOPACKAGES}}) {
	my $tmp = tmpdir($package);
	my $ext = pkgext($package);

	delsubstvar($package, "perl:Depends"); # for idempotency
	
	# Check also for alternate locations given on the command line
	my @dirs = grep -d, map "$tmp/$_", $vendorlib, $vendorarch, @ARGV;

	# Look for perl modules and check where they are installed
	my $deps = 0;
	find sub {
		return unless -f;
		$deps |= PM_MODULE if /\.pm$/;
		$deps |= XS_MODULE if /\.so$/;
	}, @dirs if @dirs;

	# find scripts
	find sub {
		return unless -f and (-x or /\.pl$/);
		local *F;
		return unless open F, $_;
		if (read F, local $_, 32 and m%^#!\s*/usr/bin/perl\s%) {
			$deps |= PROGRAM;
		}
		close F;
	}, $tmp;

	if ($deps) {
		my $version="";
		if ($deps & XS_MODULE or $dh{V_FLAG_SET}) {
			($version) = `dpkg -s $perl` =~ /^Version:\s*(\S+)/m
				unless $version;
			$version = ">= $version";
		}
		elsif ($deps & PM_MODULE) {
			$version = ">= $min_version";
		}
		
		# no need to depend on an un-versioned perl-base -- it's
		# essential
		addsubstvar($package, "perl:Depends", $perl, $version)
			unless $perl eq 'perl-base' && ! length($version);

		# add perlapi-<ver> for XS modules
		addsubstvar($package, "perl:Depends", "perlapi-$Config{version}")
			if $deps & XS_MODULE;
	}
}

=head1 SEE ALSO

L<debhelper(1)>

This program is a part of debhelper.

=head1 AUTHOR

Brendan O'Dea <bod@debian.org>

=cut