X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_install;h=93986ec9ee8ec1865cdffa81d9cc03fbe914ebfc;hb=452b7e6a61be42b2c345cdeeb00fbe51f88fce32;hp=57851678107ac4c1ac1e7f351f8d39f361bfccb4;hpb=37c6bda5a2cfb98d77ba9b480e81456ef7369f80;p=debhelper.git diff --git a/dh_install b/dh_install index 5785167..93986ec 100755 --- a/dh_install +++ b/dh_install @@ -12,7 +12,7 @@ use Debian::Debhelper::Dh_Lib; =head1 SYNOPSIS -B [B<-X>I] [B<--autodest>] [B<--list-missing>] [B<--sourcedir=>I] [S>] [S>] +B [B<-X>I] [B<--autodest>] [B<--sourcedir=>I] [S>] [S>] =head1 DESCRIPTION @@ -40,15 +40,14 @@ package that builds multiple binary packages. You can use the upstream 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<-Xitem>, B<--exclude=item> - -Exclude files that contain "item" anywhere in their filename from -being installed. - =item B<--autodest> Guess as the destination directory to install things to. If this is @@ -62,10 +61,16 @@ 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 only a filename on a line by itself in a +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 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<--list-missing> This option makes dh_install keep track of the files it installs, and then at @@ -81,14 +86,14 @@ warned about. =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. +Makes all files to be installed be found under dir. If this is +specified, it is akin to all the filenames having "dir/" prepended +to them. + +=item B<-Xitem>, B<--exclude=item> -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. +Exclude files that contain "item" anywhere in their filename from +being installed. =item I @@ -99,12 +104,16 @@ The files will be installed into the first package dh_install acts on. =cut -init(); +init(options => { + "autodest" => \$dh{AUTODEST}, + "list-missing" => \$dh{LIST_MISSING}, + "fail-missing" => \$dh{FAIL_MISSING}, +}); my @installed; my $srcdir = '.'; -$srcdir = $dh{SOURCEDIR}."/" if defined $dh{SOURCEDIR}; +$srcdir = $dh{SOURCEDIR} if defined $dh{SOURCEDIR}; foreach my $package (@{$dh{DOPACKAGES}}) { my $tmp=tmpdir($package); @@ -132,19 +141,34 @@ foreach my $package (@{$dh{DOPACKAGES}}) { 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 + # glob now, relative to srcdir + if (! @filelist) { + error("$package missing files (@$set), aborting"); + } + } + foreach my $src (@filelist) { next if excludefile($src); 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; } @@ -154,7 +178,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) { } # Keep track of what's installed. - if ($dh{LIST_MISSING}) { + if ($dh{LIST_MISSING} || $dh{FAIL_MISSING}) { # Kill any extra slashes. Makes the # @installed stuff more robust. $src=~y:/:/:s; @@ -164,14 +188,14 @@ foreach my $package (@{$dh{DOPACKAGES}}) { } 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/"); @@ -184,8 +208,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) { } } -if ($dh{LIST_MISSING}) { - +if ($dh{LIST_MISSING} || $dh{FAIL_MISSING}) { # . as srcdir makes no sense, so this is a special case. if ($srcdir eq '.') { $srcdir='debian/tmp'; @@ -193,14 +216,21 @@ if ($dh{LIST_MISSING}) { my @missing; my $installed=join("|", @installed); - $installed=qr{^$installed$}; + $installed=qr{^($installed)$}; find(sub { -f || -l || return; $_="$File::Find::dir/$_"; - push @missing, $_ unless /$installed/ || excludefile($_); + if (! /$installed/ && ! excludefile($_)) { + my $file=$_; + $file=~s/^\Q$srcdir\E\///; + push @missing, $file; + } }, $srcdir); if (@missing) { - warning "$_ exists in debian/tmp but 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"); + } } } @@ -217,7 +247,7 @@ contain: 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: