summaryrefslogtreecommitdiff
path: root/dh_installmodules
blob: 99dcc31abec1f48ac94f3a05c4d75ab2fd3a87bc (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
#!/usr/bin/perl -w

=head1 NAME

dh_installmodules - register modules with modutils


=cut

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

=head1 SYNOPSIS

B<dh_installmodules> [S<I<debhelper options>>] [B<-n>] [B<--name=>I<name>]

=head1 DESCRIPTION

dh_installmodules is a debhelper program that is responsible for
registering kernel modules.

Files named debian/package.modules will be installed as
etc/modutils/package in the package build directory. This is for use by
modutils. Files named debian/package.modprobe will be installed in
etc/modprobe.d/package in the package build directory, to be used by
module-init-tools's version of modprobe.

Kernel modules are searched for in the package build directory and if
found, postinst and postrm commands are automatically generated to 
run depmod and register the modules when the package is installed. 
These commands are inserted into the maintainer scripts by dh_installdeb.
See L<dh_installdeb(1)> for an explanation of how this works.

=head1 OPTIONS

=over 4

=item B<-n>, B<--noscripts>

Do not modify postinst/postrm scripts.

=item B<--name=>I<name>

When this parameter is used, dh_installmodules looks for and
installs files named debian/package.name.modules and
debian/package.name.modprobe instead of the usual
debian/package.modules and debian/package.modprobe

=back

=head1 NOTES

Note that this command is not idempotent. "dh_clean -k" should be called
between invocations of this command. Otherwise, it may cause multiple
instances of the same text to be added to maintainer scripts.

=cut

init();

# Looks for kernel modules in the passed directory. If any are found,
# returns the kernel version (or versions) that the modules seem to be for.
sub find_kernel_modules {
	my $searchdir=shift;
	my %versions;

	return unless -d $searchdir;
	find(sub {
		if (/\.k?o$/) {
			my ($kvers)=$File::Find::dir=~m!lib/modules/([^/]+)/!;
			if (! defined $kvers || ! length $kvers) {
				warning("Cannot determine kernel version for module $File::Find::name");
			}
			else {
				$versions{$kvers}=1;
			}
		}
	}, $searchdir);

	return keys %versions;
}

foreach my $package (@{$dh{DOPACKAGES}}) {
	my $tmp=tmpdir($package);
	my $modutils_file=pkgfile($package,"modules");
	my $modprobe_file=pkgfile($package,"modprobe");

	if (! -e $tmp) {
		doit("install","-d",$tmp);
	}

	if ($modutils_file) {
		if (! -e "$tmp/etc/modutils") {
			doit("install","-d","$tmp/etc/modutils");
		}
		doit("install","-m","0644",$modutils_file,"$tmp/etc/modutils/".pkgfilename($package));
	}

	if ($modprobe_file) {
		if (! -e "$tmp/etc/modprobe.d") {
			doit("install","-d","$tmp/etc/modprobe.d");
		}
		doit("install","-m","0644",$modprobe_file,"$tmp/etc/modprobe.d/".pkgfilename($package));
	}
	
	if (! $dh{NOSCRIPTS}) {
		if ($modutils_file) {
			autoscript($package,"postinst","postinst-update-modules");
			autoscript($package,"postrm","postrm-update-modules");
		}

		foreach my $kvers (find_kernel_modules("$tmp/lib/modules")) {
			autoscript($package,"postinst","postinst-modules","s/#KVERS#/$kvers/g");
			autoscript($package,"postrm","postrm-modules","s/#KVERS#/$kvers/g");
		}
	}
}

=head1 SEE ALSO

L<debhelper(7)>

This program is a part of debhelper.

=head1 AUTHOR

Joey Hess <joeyh@debian.org>

=cut