X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_movefiles;h=2c8a63fd934bbc32f601839caeb331700f765b41;hb=aa7238da47a88d9e41181cfde8e9795fe4655b4b;hp=79dc08925c64727474d9f3439335ea12d40f11ba;hpb=75c3ea7d270b1c29dcb78fcd56d75140aff76672;p=debhelper.git diff --git a/dh_movefiles b/dh_movefiles index 79dc089..2c8a63f 100755 --- a/dh_movefiles +++ b/dh_movefiles @@ -1,46 +1,170 @@ -#!/bin/sh -e -# -# Move files out of debian/tmp, into subpackages. - -PATH=debian:$PATH:/usr/lib/debhelper -. dh_lib - -for PACKAGE in $DH_DOPACKAGES; do - TMP=`tmpdir $PACKAGE` - files=`pkgfile $PACKAGE files` - - if [ ! -d "debian/tmp" ]; then - error "debian/tmp does not exist" - fi - - # debian/files has a different purpose, so ignore it. - if [ "$files" -a "$files" != "debian/files" ]; then -# if [ "$TMP" = "debian/tmp" ]; then -# error "I was asked to move some files from debian/tmp to debian/tmp." -# fi - - if [ ! -d "$TMP" ]; then - doit "install -d $TMP" - fi - - files=`pwd`/$files - - # Order the files. First all real files, then symlinks. - # Putting symlinks last is a nice thing to do for library - # packages and doesn't affect much of anything else. - # - # (The echo is in here to expand wildcards. Note that 'ls' - # won't work properly.) - # The filelist is used, so even very weird filenames can be - # moved. - doit "rm -f movelist" - for i in `(cd debian/tmp ; echo \`cat $files\`)`; do - complex_doit "(cd debian/tmp ; find $i ! -type d -and ! -type l -print) >> movelist" - done - for i in `(cd debian/tmp ; echo \`cat $files\`)`; do - complex_doit "(cd debian/tmp ; find $i ! -type d -and -type l -print) >> movelist" - done - complex_doit "(cd debian/tmp;tar --create --remove-files --files-from=../../movelist --file -) | (cd $TMP;tar xpf -)" - doit "rm -f movelist" - fi -done +#!/usr/bin/perl -w + +=head1 NAME + +dh_movefiles - move files out of debian/tmp into subpackages + +=cut + +use strict; +use Debian::Debhelper::Dh_Lib; + +=head1 SYNOPSIS + +B [S>] [B<--sourcedir=>I] [B<-X>I] S>] + +=head1 DESCRIPTION + +dh_movefiles is a debhelper program that is responsible for moving files +out of debian/tmp or some other directory and into other package build +directories. This may be useful if your package has a Makefile that installs +everything into debian/tmp, and you need to break that up into subpackages. + +Files named debian/package.files list the files to be moved, separated by +whitespace. The filenames listed should be relative to debian/tmp/. You can +also list directory names, and the whole directory will be moved. If you +prefer, you can list the files to move on the command line and this will +apply to the first package dh_movefiles is told to act on. + +Note: dh_install is a much better program that can do everything this one can, +and more. + +=head1 OPTIONS + +=over 4 + +=item B<--sourcedir=>I + +Instead of moving files out of debian/tmp (the default), this option makes +it move files out of some other directory. Since the entire contents of +the sourcedir is moved, specifiying something like --sourcedir=/ is very +unsafe, so to prevent mistakes, the sourcedir must be a relative filename; +it cannot begin with a `/'. + +=item B<-Xitem>, B<--exclude=item> + +Exclude files that contain "item" anywhere in their filename from +being installed. + +=item I + +Lists files to move. The filenames listed should be relative to +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 -p, -i, or -a to +tell dh_movefiles which subpackage to put them in. + +=back + +=head1 NOTES + +Note that files are always moved out of 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 debian/tmp, and then files can be moved by dh_movefiles from that +directory. Any files or directories that remain are ignored, and get +deleted by dh_clean later. + +=cut + +init(); + +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; + + # 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) { + push @tomove, @ARGV; + } + + if (@tomove && $tmp eq $sourcedir) { + error("I was asked to move files from $sourcedir to $sourcedir. Perhaps you should set DH_COMPAT=2?"); + } + + # Now we need to expand wildcards in @tomove. + # This is only necessary in pre-v3 land -- as of v3, the + # expension is automatically done by filearray(). + if (@tomove && compat(2)) { + my @filelist=(); + foreach (@tomove) { + push @filelist, glob("$sourcedir/$_"); + } + @tomove=@filelist; + } + else { + # However, filearray() does not add the sourcedir, + # which we need. + @tomove = map { "$sourcedir/$_" } @tomove; + } + + if (@tomove) { + if (! -d $tmp) { + doit("install","-d",$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)"); + } + $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 ; cat $pwd/debian/movelist | xargs rm -f)"); + doit("rm","-f","debian/movelist"); + } +} + +# If $ret is set, we wern'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 arn't always sure exactly which files need +# to be moved. +exit $ret; + +=head1 SEE ALSO + +L + +This program is a part of debhelper. + +=head1 AUTHOR + +Joey Hess + +=cut