/usr/bin/dh_modaliases is in dh-modaliases 0.9.7-0ubuntu7.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
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 148 149 | #!/usr/bin/perl -w
=head1 NAME
dh_modaliases - scan kmod modaliases and provide a substvar for them
=cut
use strict;
use File::Find;
use Debian::Debhelper::Dh_Lib;
=head1 SYNOPSIS
B<dh_modaliases> [S<I<debhelper options>>]
=head1 DESCRIPTION
B<dh_modaliases> is useful for packages that ship third-party kernel modules,
either in binary form, or as sources (with e. g. DKMS). It extracts the
modules' modaliases from either the compile .ko files themselves (for packages
which ship them in compiled form, using B<modinfo>), or from a package file
B<debian/>I<package>B<.modaliases> (see below).
I creates a package substitution variable C<${modaliases}> which you should add
to C<debian/control> as
=over 4
XB-Modaliases: ${modaliases}
=back
This enables software which is looking for missing driver packages (such as
Jockey or the operating system installer) to identify which package(s) will
provide a driver for a piece of hardware, identified by its modalias.
=head1 PACKAGE MODALIAS FILES
If a package ships source code (using DKMS, module-assistant, etc.) instead of
compiled binary kernel modules, then B<dh_modaliases> can't figure out the
modaliases by scanning the *.ko files, and you have to provide the modalias
list manually as a package file B<debian/>I<package>B<.modaliases>.
The format matches the /lib/modules/`uname -r`/modules.alias file from the
Linux kernel. Examples:
=over 4
alias ssb:v1234id5678 snd_super_booster
alias pci:v000010DEd0000004Esv*sd*bc03sc*i* nvidia_current
=back
You can generate such a list if you locally build and install this module, and
then run
=over 4
modinfo mymodname | perl -nae 'print "alias $1 mymodname\n" if /^alias:\s+(.*)$/'
=back
(replacing "mymodname" with the actual module name).
=head1 OPTIONS
The standard debhelper options are supported.
=cut
init();
my $aliases;
sub modalises_from_ko {
my $name = $_;
return unless /\.ko$/;
return if -l $_ or -d $_; # Skip directories and symlinks
# See if we were asked to exclude this file.
foreach my $f (@{$dh{EXCLUDE}}) {
return if ($File::Find::name =~ m/\Q$f\E/);
}
my ($modname) = ($name =~ /^(.*)\.ko$/);
$modname =~ s/-/_/g; # canonical names are with underscores
my @a;
open M, '-|', 'modinfo', $name or die "open: $!";
while (<M>) {
if (/^alias:\s*(.*)$/) {
verbose_print("$File::Find::name: module $modname has alias $1");
push @a, $1;
}
}
if ($aliases) {
$aliases .= ', ';
}
$aliases .= $modname . '(' . (join ', ', @a) . ')';
}
sub modalises_from_pkgfile {
my %module_alias_map = ();
open F, $_[0];
while (<F>) {
next if /^#/;
if (/^alias\s*([^[:space:]]+)\s*([^[:space:]]+)/) {
verbose_print("package file $_[0]: module $2 has alias $1");
push @{$module_alias_map{$2}}, $1;
} else {
warning("$_[0]: cannot translate line into modalias: $_");
}
}
foreach my $m (sort keys %module_alias_map) {
if ($aliases) {
$aliases .= ', ';
}
$aliases .= $m . '(' . (join ', ', @{$module_alias_map{$m}}) . ')';
}
}
foreach my $package (@{$dh{DOPACKAGES}})
{
my $tmp = tmpdir($package);
delsubstvar($package, 'modaliases');
$aliases = '';
my $manual_list = pkgfile($package, 'modaliases');
if ($manual_list) {
modalises_from_pkgfile $manual_list;
} else {
find(\&modalises_from_ko, tmpdir($package));
}
addsubstvar($package, 'modaliases', $aliases);
}
=head1 SEE ALSO
L<debhelper(1)>, L<dkms(8)>
This program is an extension to debhelper.
=head1 AUTHOR
Martin Pitt <martin.pitt@ubuntu.com>
=cut
|