diff options
Diffstat (limited to 'dh_movefiles')
-rwxr-xr-x | dh_movefiles | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/dh_movefiles b/dh_movefiles new file mode 100755 index 0000000..7c5c8ff --- /dev/null +++ b/dh_movefiles @@ -0,0 +1,171 @@ +#!/usr/bin/perl + +=head1 NAME + +dh_movefiles - move files out of debian/tmp into subpackages + +=cut + +use strict; +use warnings; +use Debian::Debhelper::Dh_Lib; + +our $VERSION = DH_BUILTIN_VERSION; + +=head1 SYNOPSIS + +B<dh_movefiles> [S<I<debhelper options>>] [B<--sourcedir=>I<dir>] [B<-X>I<item>] [S<I<file> ...>] + +=head1 DESCRIPTION + +B<dh_movefiles> is a debhelper program that is responsible for moving files +out of F<debian/tmp> or some other directory and into other package build +directories. This may be useful if your package has a F<Makefile> that installs +everything into F<debian/tmp>, and you need to break that up into subpackages. + +Note: B<dh_install> is a much better program, and you are recommended to use +it instead of B<dh_movefiles>. + +=head1 FILES + +=over 4 + +=item debian/I<package>.files + +Lists the files to be moved into a package, separated by whitespace. The +filenames listed should be relative to F<debian/tmp/>. You can also list +directory names, and the whole directory will be moved. + +=back + +=head1 OPTIONS + +=over 4 + +=item B<--sourcedir=>I<dir> + +Instead of moving files out of F<debian/tmp> (the default), this option makes +it move files out of some other directory. Since the entire contents of +the sourcedir is moved, specifying something like B<--sourcedir=/> is very +unsafe, so to prevent mistakes, the sourcedir must be a relative filename; +it cannot begin with a `B</>'. + +=item B<-Xitem>, B<--exclude=item> + +Exclude files that contain B<item> anywhere in their filename from +being installed. + +=item I<file> ... + +Lists files to move. The filenames listed should be relative to +F<debian/tmp/>. You can also list directory names, and the whole directory will +be moved. It is an error to list files here unless you use B<-p>, B<-i>, or B<-a> to +tell B<dh_movefiles> which subpackage to put them in. + +=back + +=head1 NOTES + +Note that files are always moved out of F<debian/tmp> by default (even if you +have instructed debhelper to use a compatibility level higher than one, +which does not otherwise use debian/tmp for anything at all). The idea +behind this is that the package that is being built can be told to install +into F<debian/tmp>, and then files can be moved by B<dh_movefiles> from that +directory. Any files or directories that remain are ignored, and get +deleted by B<dh_clean> later. + +=cut + +init(options => { + "sourcedir=s" => \$dh{SOURCEDIR}, +}); + +my $ret=0; + +foreach my $package (@{$dh{DOPACKAGES}}) { + my $tmp=tmpdir($package); + my $files=pkgfile($package,"files"); + + my $sourcedir="debian/tmp"; + if ($dh{SOURCEDIR}) { + if ($dh{SOURCEDIR}=~m:^/:) { + error("The sourcedir must be a relative filename, not starting with `/'."); + } + $sourcedir=$dh{SOURCEDIR}; + } + + if (! -d $sourcedir) { + error("$sourcedir does not exist."); + } + + my (@tomove, @tomove_expanded); + + # debian/files has a different purpose, so ignore it. + if ($files && $files ne "debian/files" ) { + @tomove=filearray($files, $sourcedir); + } + + if (($package eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) { + # Expand these manually similar to filearray + push(@tomove_expanded, map { glob("$sourcedir/$_") } @ARGV); + } + + if ((@tomove || @tomove_expanded) && $tmp eq $sourcedir) { + error("I was asked to move files from $sourcedir to $sourcedir."); + } + + # filearray() does not add the sourcedir, which we need. + @tomove = map { "$sourcedir/$_" } @tomove; + + push(@tomove, @tomove_expanded); + + if (@tomove) { + install_dir($tmp); + + doit("rm","-f","debian/movelist"); + foreach (@tomove) { + my $file=$_; + if (! -e $file && ! -l $file && ! $dh{NO_ACT}) { + $ret=1; + warning("$file not found (supposed to put it in $package)"); + } + else { + $file=~s:^\Q$sourcedir\E/+::; + my $cmd="(cd $sourcedir >/dev/null ; find $file ! -type d "; + if ($dh{EXCLUDE_FIND}) { + $cmd.="-a ! \\( $dh{EXCLUDE_FIND} \\) "; + } + $cmd.="-print || true) >> debian/movelist"; + complex_doit($cmd); + } + } + my $pwd=`pwd`; + chomp $pwd; + complex_doit("(cd $sourcedir >/dev/null ; tar --create --files-from=$pwd/debian/movelist --file -) | (cd $tmp >/dev/null ;tar xpf -)"); + # --remove-files is not used above because tar then doesn't + # preserve hard links + complex_doit("(cd $sourcedir >/dev/null ; tr '\\n' '\\0' < $pwd/debian/movelist | xargs -0 rm -f)"); + doit("rm","-f","debian/movelist"); + } +} + +# If $ret is set, we weren't actually able to find some +# files that were specified to be moved, and we should +# exit with the code in $ret. This program puts off +# exiting with an error until all files have been tried +# to be moved, because this makes it easier for some +# packages that aren't always sure exactly which files need +# to be moved. +exit $ret; + +=head1 SEE ALSO + +L<debhelper(7)> + +This program is a part of debhelper. + +=head1 AUTHOR + +Joey Hess <joeyh@debian.org> + +=cut |