else, for which no particular intelligence is needed. It is a replacement for
the old dh_movefiles command.
-Files named debian/package.install list the files to install into each
-package and the directory they should be installed to. The format is a set
-of lines, where each line lists a file or files to install, and at the end
-of the line tells the directory it should be installed in. The name of the
-files (or directories) to install should be given relative to the current
-directory, while the installation directory is given relative to the
-package build directory. You may use wildcards in the names of the files to
-install (in v3 mode and above).
-
This program may be used in one of two ways. If you just have a file or two
that the upstream Makefile does not install for you, you can run dh_install
on them to move them into place. On the other hand, maybe you have a large
Makefile to install it all into debian/tmp, and then use dh_install to copy
directories and files from there into the proper package build directories.
-=head1 OPTIONS
+From debhelper compatibility level 7 on, dh_install will fall back to
+looking in debian/tmp for files, if it doesn't find them in the current
+directory (or whereever you've told it to look using --sourcedir).
-=over 4
+=head1 FILES
-=item B<-Xitem>, B<--exclude=item>
+=over 4
-Exclude files that contain "item" anywhere in their filename from
-being installed.
+=item debian/I<package>.install
-=item B<--autodest>
+List the files to install into each package and the directory they should be
+installed to. The format is a set of lines, where each line lists a file or
+files to install, and at the end of the line tells the directory it should be
+installed in. The name of the files (or directories) to install should be given
+relative to the current directory, while the installation directory is given
+relative to the package build directory. You may use wildcards in the names of
+the files to install (in v3 mode and above).
-Guess as the destination directory to install things to. If this is
-specified, you should not list destination directories in
-debian/package.install files or on the command line. Instead, dh_install
-will guess as follows:
+=back
-Strip off debian/tmp (or the sourcedir if one is given) from the front of
-the filename, if it is present, and install into the dirname of the
-filename. So if the filename is debian/tmp/usr/bin, then that directory
-will be copied to debian/package/usr/. If the filename is
-debian/tmp/etc/passwd, it will be copied to debian/package/etc/.
+=head1 OPTIONS
-Note that if you list exactly one filename or wildcard-pattern on a line by
-itself in a
-debian/package.install file, with no explicit destination, then dh_install
-will automatically guess the destination even if this flag is not set.
+=over 4
=item B<--list-missing>
This option is like --list-missing, except if a file was missed, it will
not only list the missing files, but also fail with a nonzero exit code.
+=item B<-Xitem>, B<--exclude=item>
+
+Exclude files that contain "item" anywhere in their filename from
+being installed.
+
=item B<--sourcedir=dir>
-Makes all source files be found under dir. If this is specified, it is
-akin to all the source filenames having "dir/" prepended to them.
+Look in the specified directory for files to be installed.
+
+Note that this is not the same as the --sourcedirectory option used
+by the dh_auto_* commands. You rarely need to use this option, since
+dh_install automatically looks for files in debian/tmp in debhelper
+compatibility level 7 and above.
-To make dh_install behave like the old dh_movefiles, move your
-package.files file to package.install and call dh_install with
-"--sourcedir=debian/tmp" appended to the command. This will
-approximate dh_movefiles behaviour, except it will copy files instead
-of moving them.
+=item B<--autodest>
+
+Guess as the destination directory to install things to. If this is
+specified, you should not list destination directories in
+debian/package.install files or on the command line. Instead, dh_install
+will guess as follows:
+
+Strip off debian/tmp (or the sourcedir if one is given) from the front of
+the filename, if it is present, and install into the dirname of the
+filename. So if the filename is debian/tmp/usr/bin, then that directory
+will be copied to debian/package/usr/. If the filename is
+debian/tmp/etc/passwd, it will be copied to debian/package/etc/.
+
+Note that if you list exactly one filename or wildcard-pattern on a line by
+itself in a
+debian/package.install file, with no explicit destination, then dh_install
+will automatically guess the destination even if this flag is not set.
=item I<file [...] dest>
=cut
-init();
+init(options => {
+ "autodest" => \$dh{AUTODEST},
+ "list-missing" => \$dh{LIST_MISSING},
+ "fail-missing" => \$dh{FAIL_MISSING},
+ "sourcedir=s" => \$dh{SOURCEDIR},
+});
my @installed;
my $srcdir = '.';
-$srcdir = $dh{SOURCEDIR}."/" if defined $dh{SOURCEDIR};
+$srcdir = $dh{SOURCEDIR} if defined $dh{SOURCEDIR};
+
+foreach my $package (getpackages()) {
+ # Look at the install files for all packages to handle
+ # list-missing/fail-missing, but skip really installing for
+ # packages that are not being acted on.
+ my $skip_install=! grep { $_ eq $package } @{$dh{DOPACKAGES}};
-foreach my $package (@{$dh{DOPACKAGES}}) {
my $tmp=tmpdir($package);
my $file=pkgfile($package,"install");
if (! defined $dh{AUTODEST} && @$set > 1) {
$dest=pop @$set;
}
- # glob now, relative to srcdir
- foreach my $src (map { glob "$srcdir/$_" } @$set) {
+
+ my @filelist;
+ foreach my $glob (@$set) {
+ my @found = glob "$srcdir/$glob";
+ if (! compat(6)) {
+ # Fall back to looking in debian/tmp.
+ if (! @found || ! (-e $found[0] || -l $found[0])) {
+ @found = glob "debian/tmp/$glob";
+ }
+ }
+ push @filelist, @found;
+ }
+
+ if (! compat(4)) { # check added in v5
+ if (! @filelist && ! $skip_install) {
+ error("$package missing files (@$set), aborting");
+ }
+ }
+
+ foreach my $src (@filelist) {
next if excludefile($src);
+
+ push @installed, $src;
+ next if $skip_install;
if (! defined $dest) {
# Guess at destination directory.
$dest=$src;
- my $strip=$srcdir;
- if ($strip eq '.') {
- $strip = "debian/tmp";
- }
- $dest=~s/^(.*\/)?\Q$strip\E//;
- $dest=dirname($dest);
+ $dest=~s/^(.*\/)?\Q$srcdir\E\///;
+ $dest=~s/^(.*\/)?debian\/tmp\///;
+ $dest=dirname("/".$dest);
$tmpdest=1;
}
if (! -e "$tmp/$dest") {
doit("install","-d","$tmp/$dest");
}
-
- # Keep track of what's installed.
- if ($dh{LIST_MISSING} || $dh{FAIL_MISSING}) {
- # Kill any extra slashes. Makes the
- # @installed stuff more robust.
- $src=~y:/:/:s;
- $src=~s:/+$::;
- $src=~s:^(\./)*::;
- push @installed, "\Q$src\E\/.*|\Q$src\E";
- }
if (-d $src && $exclude) {
- my ($dir_basename) = basename($src);
- # Pity there's no cp --exclude ..
+ my $basename = basename($src);
+ my $dir = ($basename eq '.') ? $src : "$src/..";
my $pwd=`pwd`;
chomp $pwd;
- complex_doit("cd $src/.. && find $dir_basename $exclude \\( -type f -or -type l \\) -exec cp --parents -dp {} $pwd/$tmp/$dest/ \\;");
+ complex_doit("cd '$dir' && find '$basename' $exclude \\( -type f -or -type l \\) -exec cp --parents -dp {} $pwd/$tmp/$dest/ \\;");
# cp is annoying so I need a separate pass
# just for empty directories
- complex_doit("cd $src/.. && find $dir_basename $exclude \\( -type d -and -empty \\) -exec cp --parents -a {} $pwd/$tmp/$dest/ \\;");
+ complex_doit("cd '$dir' && find '$basename' $exclude \\( -type d -and -empty \\) -exec cp --parents -a {} $pwd/$tmp/$dest/ \\;");
}
else {
doit("cp", "-a", $src, "$tmp/$dest/");
}
my @missing;
- my $installed=join("|", @installed);
+ my $installed=join("|", map {
+ # Kill any extra slashes, for robustness.
+ y:/:/:s;
+ s:/+$::;
+ s:^(\./)*::;
+ "\Q$_\E\/.*|\Q$_\E";
+ } @installed);
$installed=qr{^($installed)$};
find(sub {
-f || -l || return;
}
}, $srcdir);
if (@missing) {
- warning "$_ exists in debian/tmp but is not installed to anywhere" foreach @missing;
+ warning "$_ exists in $srcdir but is not installed to anywhere" foreach @missing;
if ($dh{FAIL_MISSING}) {
error("missing files, aborting");
}
While debian/libfoo.install contains:
- usr/libfoo*.so.*
+ usr/lib/libfoo*.so.*
If you want a libfoo-dev package too, debian/libfoo-dev.install might contain: