X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_installdocs;h=104b796ea460a44701639cad9cf696a4d2255633;hb=e2a6d4cec4a7ee952cf6a7f250d80f1d75a38f95;hp=465693bcedbe540933cbd180a22149a08ae94d40;hpb=577b5462c71cb7a451bd01b21f533acb8c7471a7;p=debhelper.git diff --git a/dh_installdocs b/dh_installdocs index 465693b..104b796 100755 --- a/dh_installdocs +++ b/dh_installdocs @@ -11,12 +11,12 @@ use Debian::Debhelper::Dh_Lib; =head1 SYNOPSIS -B [S>] [B<-A>] [B<-X>I] [S>] +B [S>] [B<-A>] [B<-X>I] [S ...>] =head1 DESCRIPTION -dh_installdocs is a debhelper program that is responsible for installing -documentation into usr/share/doc/package in package build directories. +B is a debhelper program that is responsible for installing +documentation into F in package build directories. =head1 FILES @@ -24,13 +24,12 @@ documentation into usr/share/doc/package in package build directories. =item debian/I.docs -List documentaton files to be installed into I. +List documentation files to be installed into I. -=item debian/copyright +=item F -=item debian/README.Debian - -=item debian/TODO +The copyright file is installed into all packages, unless a more +specific copyright file is available. =item debian/I.copyright @@ -38,16 +37,23 @@ List documentaton files to be installed into I. =item debian/I.TODO -Each of these files is automatically installed if present. Use the package -specific name if I needs a different version of the file. +Each of these files is automatically installed if present for a +I. + +=item F + +=item F -Note that debian/README.debian is also installed as README.Debian, -and debian/TODO will be installed as TODO.Debian in non-native packages. +These files are installed into the first binary package listed in +debian/control. + +Note that F files are also installed as F, +and F files will be installed as F in non-native packages. =item debian/I.doc-base Installed as doc-base control files. Note that the doc-id will be -determined from the "Document:" entry in the doc-base control file in +determined from the B entry in the doc-base control file in question. =item debian/I.doc-base.* @@ -66,12 +72,30 @@ doc-base files, and can name them like this. Install all files specified by command line parameters in ALL packages acted on. -=item B<-Xitem>, B<--exclude=item> +=item B<-X>I, B<--exclude=>I -Exclude files that contain "item" anywhere in their filename from +Exclude files that contain I anywhere in their filename from being installed. Note that this includes doc-base files. -=item I +=item B<--link-doc=>I + +Make the documentation directory of all packages acted on be a symlink to +the documentation directory of I. This has no effect when acting on +I itself, or if the documentation directory to be created already +exists when B is run. To comply with policy, I must +be a binary package that comes from the same source package. + +debhelper will try to avoid installing files into linked documentation +directories that would cause conflicts with the linked package. The B<-A> +option will have no effect on packages with linked documentation +directories, and F, F, F, and F files will +not be installed. + +(An older method to accomplish the same thing, which is still supported, +is to make the documentation directory of a package be a dangling symlink, +before calling B.) + +=item I ... Install these files as documentation into the first package acted on. (Or in all packages if B<-A> is specified). @@ -80,7 +104,7 @@ in all packages if B<-A> is specified). =head1 EXAMPLES -This is an example of a debian/package.docs file: +This is an example of a F file: README TODO @@ -91,8 +115,8 @@ This is an example of a debian/package.docs file: =head1 NOTES -Note that dh_installdocs will happily copy entire directory hierarchies if -you ask it to (similar to cp -a). If it is asked to install a +Note that B will happily copy entire directory hierarchies if +you ask it to (similar to B). If it is asked to install a directory, it will install the complete contents of the directory. Note that this command is not idempotent. L should be called @@ -101,18 +125,59 @@ instances of the same text to be added to maintainer scripts. =cut -init(); +my %docdir_created; +# Create documentation directories on demand. This allows us to use dangling +# symlinks for linked documentation directories unless additional files need +# to be installed. +sub ensure_docdir { + my $package=shift; + return if $docdir_created{$package}; + my $tmp=tmpdir($package); + + my $target; + if ($dh{LINK_DOC} && $dh{LINK_DOC} ne $package) { + $target="$tmp/usr/share/doc/$dh{LINK_DOC}"; + } + else { + $target="$tmp/usr/share/doc/$package"; + } + + # If this is a symlink, leave it alone. + if (! -d $target && ! -l $target) { + doit("install","-g",0,"-o",0,"-d",$target); + } + $docdir_created{$package}=1; +} + +init(options => { + "link-doc=s" => \$dh{LINK_DOC}, +}); foreach my $package (@{$dh{DOPACKAGES}}) { next if is_udeb($package); my $tmp=tmpdir($package); my $file=pkgfile($package,"docs"); + my $link_doc=($dh{LINK_DOC} && $dh{LINK_DOC} ne $package); - # If this is a symlink, leave it alone. - if ( ! -d "$tmp/usr/share/doc/$package" && - ! -l "$tmp/usr/share/doc/$package") { - doit("install","-g",0,"-o",0,"-d","$tmp/usr/share/doc/$package"); + if ($link_doc) { + # Make sure that the parent directory exists. + if (! -d "$tmp/usr/share/doc" && ! -l "$tmp/usr/share/doc") { + doit("install","-g",0,"-o",0,"-d","$tmp/usr/share/doc"); + } + # Create symlink to another documentation directory if + # necessary. + if (! -d "$tmp/usr/share/doc/$package" && + ! -l "$tmp/usr/share/doc/$package") { + doit("ln", "-sf", $dh{LINK_DOC}, "$tmp/usr/share/doc/$package"); + # Policy says that if you make your documentation + # directory a symlink, then you have to depend on + # the target. + addsubstvar($package, "misc:Depends", $dh{LINK_DOC}); + } + } + else { + ensure_docdir($package); } my @docs; @@ -121,7 +186,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) { @docs=filearray($file, "."); } - if (($package eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) { + if (($package eq $dh{FIRSTPACKAGE} || ($dh{PARAMS_ALL} && ! $link_doc)) && @ARGV) { push @docs, @ARGV; } @@ -137,6 +202,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) { foreach my $doc (@docs) { next if excludefile($doc); next if -e $doc && ! -s $doc && ! compat(4); # ignore empty files + ensure_docdir($package); if (-d $doc && length $exclude) { my $basename = basename($doc); my $dir = ($basename eq '.') ? $doc : "$doc/.."; @@ -158,13 +224,15 @@ foreach my $package (@{$dh{DOPACKAGES}}) { if (! $readme_debian) { $readme_debian=pkgfile($package,'README.debian'); } - if ($readme_debian && ! excludefile($readme_debian)) { + if (! $link_doc && $readme_debian && ! excludefile($readme_debian)) { + ensure_docdir($package); doit("install","-g",0,"-o",0,"-m","644","-p","$readme_debian", "$tmp/usr/share/doc/$package/README.Debian"); } my $todo=pkgfile($package,'TODO'); - if ($todo && ! excludefile($todo)) { + if (! $link_doc && $todo && ! excludefile($todo)) { + ensure_docdir($package); if (isnative($package)) { doit("install","-g",0,"-o",0,"-m","644","-p",$todo, "$tmp/usr/share/doc/$package/TODO"); @@ -178,7 +246,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) { # If the "directory" is a dangling symlink, then don't install # the copyright file. This is useful for multibinary packages # that share a doc directory. - if (-d "$tmp/usr/share/doc/$package") { + if (! $link_doc && (! -l "$tmp/usr/share/doc/$package" || -d "$tmp/usr/share/doc/$package")) { # Support debian/package.copyright, but if not present, fall # back on debian/copyright for all packages, not just the # main binary package. @@ -187,8 +255,9 @@ foreach my $package (@{$dh{DOPACKAGES}}) { $copyright="debian/copyright"; } if ($copyright && ! excludefile($copyright)) { - doit("install","-g",0,"-o",0,"-m","644","-p",$copyright, - "$tmp/usr/share/doc/$package/copyright"); + ensure_docdir($package); + doit("install","-g",0,"-o",0,"-m","644","-p",$copyright, + "$tmp/usr/share/doc/$package/copyright"); } } @@ -217,6 +286,9 @@ foreach my $package (@{$dh{DOPACKAGES}}) { last; } } + if (! exists $doc_ids{$fn}) { + warning("Could not parse $fn for doc-base Document id; skipping"); + } close IN; } closedir(DEB);