X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_install;h=292837b4a0594165ac208ea198f6d1cf8a16e32c;hb=2b16a2add5bedab6b9f6f60184863a64c750e7f6;hp=4ae155325da8c49d0c819d9a80ec123d2533d9a1;hpb=7a61e2fd152ccfd631a693a9f295fe5f3d8e67a6;p=debhelper.git diff --git a/dh_install b/dh_install index 4ae1553..292837b 100755 --- a/dh_install +++ b/dh_install @@ -40,15 +40,46 @@ 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<--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 @@ -67,35 +98,6 @@ 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<--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 Lists files (or directories) to install and where to install them to. @@ -105,12 +107,17 @@ 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}, + "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 (@{$dh{DOPACKAGES}}) { my $tmp=tmpdir($package); @@ -138,24 +145,33 @@ foreach my $package (@{$dh{DOPACKAGES}}) { 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] || -l $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) { - error("missing files (@$set), aborting"); + 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) { # 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; } @@ -175,14 +191,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/"); @@ -214,7 +230,7 @@ if ($dh{LIST_MISSING} || $dh{FAIL_MISSING}) { } }, $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"); }