5 dh_installdocs - install documentation into package build directories
10 use Debian::Debhelper::Dh_Lib;
14 B<dh_installdocs> [S<I<debhelper options>>] [B<-A>] [B<-n>] [B<-X>I<item>] [S<I<file ...>>]
18 dh_installdocs is a debhelper program that is responsible for installing
19 documentation into usr/share/doc/package in package build directories.
21 dh_installdocs automatically installs debian/copyright if it exists. If
22 dh_installdocs is acting on multiple packages, debian/copyright files will be
23 installed into all packages. However, if you need to have separate copyright
24 files for different binary packages, you can use files named
25 debian/package.copyright.
27 Any filenames specified as parameters will be installed into the first
28 package dh_installdocs is told to act on. By default, this is the first
29 binary package in debian/control, but if you use B<-p>, B<-i>, or B<-a> flags, it
30 will be the first package specified by those flags.
32 Also, debian/README.Debian (or debian/README.debian) and debian/TODO, if
33 they exist, will be installed into the first binary package listed in
34 debian/control, if dh_installdocs is acting on that package. Note that
35 debian/TODO will be installed named TODO.Debian, if the package is not a
36 debian native package. Also note that README.debian is installed as
37 README.Debian, for consistency. Note that debian/package.README.Debian and
38 debian/package.TODO can be used to specify files for subpackages.
40 Files named debian/package.docs can list other files to be installed.
42 Files named debian/package.doc-base, will be installed as doc-base control
43 files, and will make this program automatically generate the postinst and
44 prerm commands needed to interface with the doc-base package. Note that the
45 doc-id will be determined from the "Document:" entry in the
46 doc-base control file in question.
48 If your package needs to register more than one document, you need multiple
49 files. To accomplish this, you can use files named debian/package.doc-base.*
57 Install all files specified by command line parameters in ALL packages
60 =item B<-n>, B<--noscripts>
62 Do not modify postinst/prerm scripts.
64 =item B<-Xitem>, B<--exclude=item>
66 Exclude files that contain "item" anywhere in their filename from
67 being installed. Note that this includes doc-base files.
71 Install these files as documentation into the first package acted on. (Or
72 in all packages if B<-A> is specified).
78 This is an example of a debian/package.docs file:
82 debian/notes-for-maintainers.txt
89 Note that dh_installdocs will happily copy entire directory hierarchies if
90 you ask it to (similar to cp -a). If it is asked to install a
91 directory, it will install the complete contents of the directory.
93 Note that this command is not idempotent. "dh_clean B<-k>" should be called
94 between invocations of this command. Otherwise, it may cause multiple
95 instances of the same text to be added to maintainer scripts.
101 foreach my $package (@{$dh{DOPACKAGES}}) {
102 next if is_udeb($package);
104 my $tmp=tmpdir($package);
105 my $file=pkgfile($package,"docs");
107 # If this is a symlink, leave it alone.
108 if ( ! -d "$tmp/usr/share/doc/$package" &&
109 ! -l "$tmp/usr/share/doc/$package") {
110 doit("install","-g",0,"-o",0,"-d","$tmp/usr/share/doc/$package");
116 @docs=filearray($file, ".");
119 if (($package eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) {
125 if ($dh{EXCLUDE_FIND}) {
126 $exclude = ' -and ! \( '.$dh{EXCLUDE_FIND}.' \)';
128 foreach my $doc (@docs) {
129 next if excludefile($doc);
130 next if -e $doc && ! -s $doc && ! compat(4); # ignore empty BUGS, etc
131 if (-d $doc && $exclude) {
132 my ($dir_basename) = basename($doc);
133 # Pity there's no cp --exclude ..
136 complex_doit("cd $doc/.. && find $dir_basename \\( -type f -or -type l \\)$exclude -exec cp --parents -dp {} $pwd/$tmp/usr/share/doc/$package \\;");
139 doit("cp","-a",$doc,"$tmp/usr/share/doc/$package");
142 doit("chown","-R","0:0","$tmp/usr/share/doc");
143 doit("chmod","-R","go=rX","$tmp/usr/share/doc");
144 doit("chmod","-R","u+rw","$tmp/usr/share/doc");
147 # .Debian is correct, according to policy, but I'm easy.
148 my $readme_debian=pkgfile($package,'README.Debian');
149 if (! $readme_debian) {
150 $readme_debian=pkgfile($package,'README.debian');
152 if ($readme_debian && ! excludefile($readme_debian)) {
153 doit("install","-g",0,"-o",0,"-m","644","-p","$readme_debian",
154 "$tmp/usr/share/doc/$package/README.Debian");
157 my $todo=pkgfile($package,'TODO');
158 if ($todo && ! excludefile($todo)) {
159 if (isnative($package)) {
160 doit("install","-g",0,"-o",0,"-m","644","-p",$todo,
161 "$tmp/usr/share/doc/$package/TODO");
164 doit("install","-g",0,"-o",0,"-m","644","-p",$todo,
165 "$tmp/usr/share/doc/$package/TODO.Debian");
169 # If the "directory" is a dangling symlink, then don't install
170 # the copyright file. This is useful for multibinary packages
171 # that share a doc directory.
172 if (-d "$tmp/usr/share/doc/$package") {
173 # Support debian/package.copyright, but if not present, fall
174 # back on debian/copyright for all packages, not just the
175 # main binary package.
176 my $copyright=pkgfile($package,'copyright');
177 if (! $copyright && -e "debian/copyright") {
178 $copyright="debian/copyright";
180 if ($copyright && ! excludefile($copyright)) {
181 doit("install","-g",0,"-o",0,"-m","644","-p",$copyright,
182 "$tmp/usr/share/doc/$package/copyright");
186 # Handle doc-base files. There are two filename formats, the usual
187 # plus an extended format (debian/package.*).
190 opendir(DEB,"debian/") || error("can't read debian directory: $!");
191 # If this is the main package, we need to handle unprefixed filenames.
192 # For all packages, we must support both the usual filename format plus
193 # that format with a period an something appended.
194 my $regexp="\Q$package\E\.";
195 if ($package eq $dh{MAINPACKAGE}) {
196 $regexp="(|$regexp)";
198 foreach my $fn (grep {/^${regexp}doc-base(\..*)?$/} readdir(DEB)) {
199 # .EX are example files, generated by eg, dh-make
200 next if $fn=~/\.EX$/;
201 next if excludefile($fn);
202 # Parse the file to get the doc id.
203 open (IN, "debian/$fn") || die "Cannot read debian/$fn.";
205 if (/^Document:\s+(.*)(\s+)?/) {
215 if (! -d "$tmp/usr/share/doc-base/") {
216 doit("install","-g",0,"-o",0,"-d","$tmp/usr/share/doc-base/");
219 foreach my $fn (keys %doc_ids) {
220 doit("install","-g",0,"-o",0,"-m644","-p","debian/$fn",
221 "$tmp/usr/share/doc-base/$doc_ids{$fn}");
222 if (! $dh{NOSCRIPTS}) {
223 autoscript($package,"postinst","postinst-doc-base",
224 "s/#DOC-ID#/$doc_ids{$fn}/",
226 autoscript($package,"prerm","prerm-doc-base",
227 "s/#DOC-ID#/$doc_ids{$fn}/",
237 This program is a part of debhelper.
241 Joey Hess <joeyh@debian.org>