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}.' \)';
129 # ignore empty files in subdirs
130 $exclude .= ' -and ! -empty';
132 foreach my $doc (@docs) {
133 next if excludefile($doc);
134 next if -e $doc && ! -s $doc && ! compat(4); # ignore empty files
135 if (-d $doc && length $exclude) {
136 my ($dir_basename) = basename($doc);
139 complex_doit("cd $doc/.. && find $dir_basename \\( -type f -or -type l \\)$exclude -exec cp --parents -dp {} $pwd/$tmp/usr/share/doc/$package \\;");
142 doit("cp","-a",$doc,"$tmp/usr/share/doc/$package");
145 doit("chown","-R","0:0","$tmp/usr/share/doc");
146 doit("chmod","-R","go=rX","$tmp/usr/share/doc");
147 doit("chmod","-R","u+rw","$tmp/usr/share/doc");
150 # .Debian is correct, according to policy, but I'm easy.
151 my $readme_debian=pkgfile($package,'README.Debian');
152 if (! $readme_debian) {
153 $readme_debian=pkgfile($package,'README.debian');
155 if ($readme_debian && ! excludefile($readme_debian)) {
156 doit("install","-g",0,"-o",0,"-m","644","-p","$readme_debian",
157 "$tmp/usr/share/doc/$package/README.Debian");
160 my $todo=pkgfile($package,'TODO');
161 if ($todo && ! excludefile($todo)) {
162 if (isnative($package)) {
163 doit("install","-g",0,"-o",0,"-m","644","-p",$todo,
164 "$tmp/usr/share/doc/$package/TODO");
167 doit("install","-g",0,"-o",0,"-m","644","-p",$todo,
168 "$tmp/usr/share/doc/$package/TODO.Debian");
172 # If the "directory" is a dangling symlink, then don't install
173 # the copyright file. This is useful for multibinary packages
174 # that share a doc directory.
175 if (-d "$tmp/usr/share/doc/$package") {
176 # Support debian/package.copyright, but if not present, fall
177 # back on debian/copyright for all packages, not just the
178 # main binary package.
179 my $copyright=pkgfile($package,'copyright');
180 if (! $copyright && -e "debian/copyright") {
181 $copyright="debian/copyright";
183 if ($copyright && ! excludefile($copyright)) {
184 doit("install","-g",0,"-o",0,"-m","644","-p",$copyright,
185 "$tmp/usr/share/doc/$package/copyright");
189 # Handle doc-base files. There are two filename formats, the usual
190 # plus an extended format (debian/package.*).
193 opendir(DEB,"debian/") || error("can't read debian directory: $!");
194 # If this is the main package, we need to handle unprefixed filenames.
195 # For all packages, we must support both the usual filename format plus
196 # that format with a period an something appended.
197 my $regexp="\Q$package\E\.";
198 if ($package eq $dh{MAINPACKAGE}) {
199 $regexp="(|$regexp)";
201 foreach my $fn (grep {/^${regexp}doc-base(\..*)?$/} readdir(DEB)) {
202 # .EX are example files, generated by eg, dh-make
203 next if $fn=~/\.EX$/;
204 next if excludefile($fn);
205 # Parse the file to get the doc id.
206 open (IN, "debian/$fn") || die "Cannot read debian/$fn.";
208 if (/^Document:\s+(.*)(\s+)?/) {
218 if (! -d "$tmp/usr/share/doc-base/") {
219 doit("install","-g",0,"-o",0,"-d","$tmp/usr/share/doc-base/");
222 foreach my $fn (keys %doc_ids) {
223 doit("install","-g",0,"-o",0,"-m644","-p","debian/$fn",
224 "$tmp/usr/share/doc-base/$doc_ids{$fn}");
225 if (! $dh{NOSCRIPTS}) {
226 autoscript($package,"postinst","postinst-doc-base",
227 "s/#DOC-ID#/$doc_ids{$fn}/",
229 autoscript($package,"prerm","prerm-doc-base",
230 "s/#DOC-ID#/$doc_ids{$fn}/",
240 This program is a part of debhelper.
244 Joey Hess <joeyh@debian.org>