]> git.donarmstrong.com Git - debhelper.git/blobdiff - dh_install
Merge branch 'master' into buildsystems
[debhelper.git] / dh_install
index 624c88b01788dacafb64011417382cce86fc4666..a8e08c2ab85400ad4e2371af8485b5323f0820bb 100755 (executable)
@@ -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<file [...] dest>
 
 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,34 @@ 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) {
+                       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 +192,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/");