diff options
Diffstat (limited to 'dh_install')
-rwxr-xr-x | dh_install | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/dh_install b/dh_install new file mode 100755 index 00000000..5dff4626 --- /dev/null +++ b/dh_install @@ -0,0 +1,238 @@ +#!/usr/bin/perl -w + +=head1 NAME + +dh_install - install files into package build directories + +=cut + +use strict; +use File::Find; +use Debian::Debhelper::Dh_Lib; + +=head1 SYNOPSIS + +B<dh_install> [B<-X>I<item>] [B<--autodest>] [B<--list-missing>] [B<--sourcedir=>I<dir>] [S<I<debhelper options>>] [S<I<file [...] dest>>] + +=head1 DESCRIPTION + +dh_install is a debhelper program that handles installing files into package +build directories. There are many dh_install* commands that handle installing +specific types of files such as documentation, examples, man pages, and so on, +and they should be used when possible as they often have extra intelligence for +those particular tasks. dh_install, then, is useful for installing everything +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 where 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 +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. + +=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 +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 only a filename 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<--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<--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. +The files will be installed into the first package dh_install acts on. + +=back + +=cut + +init(); + +my @installed; + +my $srcdir = '.'; +$srcdir = $dh{SOURCEDIR}."/" if defined $dh{SOURCEDIR}; + +foreach my $package (@{$dh{DOPACKAGES}}) { + my $tmp=tmpdir($package); + my $file=pkgfile($package,"install"); + + my @install; + if ($file) { + @install=filedoublearray($file); # no globbing yet + } + + if (($package eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) { + push @install, [@ARGV]; + } + + # Support for -X flag. + my $exclude = ''; + if ($dh{EXCLUDE_FIND}) { + $exclude = '! \( '.$dh{EXCLUDE_FIND}.' \)'; + } + + foreach my $set (@install) { + my $dest; + my $tmpdest=0; + + if (! defined $dh{AUTODEST} && @$set > 1) { + $dest=pop @$set; + } + # glob now, relative to srcdir + foreach my $src (map { glob "$srcdir/$_" } @$set) { + 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); + $tmpdest=1; + } + + # Make sure the destination directory exists. + if (! -e "$tmp/$dest") { + doit("install","-d","$tmp/$dest"); + } + + # Keep track of what's installed. + if ($dh{LIST_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 $pwd=`pwd`; + chomp $pwd; + complex_doit("cd $src/.. && find $dir_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/ \\;"); + } + else { + doit("cp", "-a", $src, "$tmp/$dest/"); + } + + if ($tmpdest) { + $dest=undef; + } + } + } +} + +if ($dh{LIST_MISSING}) { + + # . as srcdir makes no sense, so this is a special case. + if ($srcdir eq '.') { + $srcdir='debian/tmp'; + } + + my @missing; + my $installed=join("|", @installed); + $installed=qr{^$installed$}; + find(sub { + -f || -l || return; + $_="$File::Find::dir/$_"; + push @missing, $_ unless /$installed/ || excludefile($_); + }, $srcdir); + if (@missing) { + warning "$_ exists in debian/tmp but not installed to anywhere" foreach @missing; + } +} + +=head1 EXAMPLE + +Suppose your package's upstream Makefile installs a binary, a man page, and +a library into appropriate subdirectories of debian/tmp. You want to put +the library into package libfoo, and the rest into package foo. Your rules +file will run "dh_install --sourcedir=debian/tmp". Make debian/foo.install +contain: + + usr/bin + usr/share/man/man1 + +While debian/libfoo.install contains: + + usr/libfoo*.so.* + +If you want a libfoo-dev package too, debian/libfoo-dev.install might contain: + + usr/include + usr/lib/libfoo*.so + usr/share/man/man3 + +=head1 SEE ALSO + +L<debhelper(7)> + +This program is a part of debhelper. + +=head1 AUTHOR + +Joey Hess <joeyh@debian.org> + +=cut |