summaryrefslogtreecommitdiff
path: root/dh_install
diff options
context:
space:
mode:
Diffstat (limited to 'dh_install')
-rwxr-xr-xdh_install238
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