use strict;
use File::Find;
use Debian::Debhelper::Dh_Lib;
-use Cwd q{abs_path};
=head1 SYNOPSIS
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.
+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).
+
=head1 OPTIONS
=over 4
+=item B<--list-missing>
+
+This option makes dh_install keep track of the files it installs, and then at
+the end, compare that list with the files in the source directory. If any of
+the files (and symlinks) in the source directory were not installed to
+somewhere, it will warn on stderr about that.
+
+This may be useful if you have a large package and want to make sure that
+you don't miss installing newly added files in new upstream releases.
+
+Note that files that are excluded from being moved via the -X option are not
+warned about.
+
+=item B<--fail-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>
+
+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.
+
=item B<--autodest>
Guess as the destination directory to install things to. If this is
debian/package.install file, with no explicit destination, then dh_install
will automatically guess the destination even if this flag is not set.
-=item B<--list-missing>
-
-This option makes dh_install keep track of the files it installs, and then at
-the end, compare that list with the files in the source directory. If any of
-the files (and symlinks) in the source directory were not installed to
-somewhere, it will warn on stderr about that.
-
-This may be useful if you have a large package and want to make sure that
-you don't miss installing newly added files in new upstream releases.
-
-Note that files that are excluded from being moved via the -X option are not
-warned about.
-
-=item B<--fail-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<--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.
-
-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 I<file [...] dest>
Lists files (or directories) to install and where to install them to.
=cut
-init();
+init(options => {
+ "autodest" => \$dh{AUTODEST},
+ "list-missing" => \$dh{LIST_MISSING},
+ "fail-missing" => \$dh{FAIL_MISSING},
+ "sourcedir=s" => \$dh{SOURCEDIR},
+});
my @installed;
if (! defined $dh{AUTODEST} && @$set > 1) {
$dest=pop @$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]) {
+ @found = glob "debian/tmp/$glob";
+ }
+ }
+ push @filelist, @found;
+ }
+
if (! compat(4)) { # check added in v5
# glob now, relative to srcdir
- if (! map { glob "$srcdir/$_" } @$set) {
+ if (! @filelist) {
error("$package missing files (@$set), aborting");
}
}
- foreach my $src (map { glob "$srcdir/$_" } @$set) {
+ foreach my $src (@filelist) {
next if excludefile($src);
if (! defined $dest) {
}
if (-d $src && $exclude) {
- my ($dir_basename) = basename(abs_path($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/");