]> git.donarmstrong.com Git - debhelper.git/blob - dh
Fix example. Closes: #627534
[debhelper.git] / dh
1 #!/usr/bin/perl -w
2
3 =head1 NAME
4
5 dh - debhelper command sequencer
6
7 =cut
8
9 use strict;
10 use Debian::Debhelper::Dh_Lib;
11
12 =head1 SYNOPSIS
13
14 B<dh> I<sequence> [B<--with> I<addon>[B<,>I<addon> ...]] [B<--list>] [B<--until> I<cmd>] [B<--before> I<cmd>] [B<--after> I<cmd>] [B<--remaining>] [S<I<debhelper options>>]
15
16 =head1 DESCRIPTION
17
18 B<dh> runs a sequence of debhelper commands. The supported I<sequence>s
19 correspond to the targets of a F<debian/rules> file: B<build-arch>,
20 B<build-indep>, B<build>, B<clean>, B<install-indep>, B<install-arch>,
21 B<install>, B<binary-arch>, B<binary-indep>, and B<binary>.
22
23 Commands in the B<build-indep>, B<install-indep> and B<binary-indep>
24 sequences are passed the B<-i> option to ensure they only work on
25 architecture independent packages, and commands in the B<build-arch>,
26 B<install-arch> and B<binary-arch> sequences are passed the B<-a>
27 option to ensure they only work on architecture dependent packages.
28
29 If F<debian/rules> contains a target with a name like B<override_>I<dh_command>,
30 then when it would normally run I<dh_command>, B<dh> will instead call that
31 target. The override target can then run the command with additional options,
32 or run entirely different commands instead. See examples below. (Note that to
33 use this feature, you should Build-Depend on debhelper 7.0.50 or above.)
34
35 =head1 OPTIONS
36
37 =over 4
38
39 =item B<--with> I<addon>[B<,>I<addon> ...]
40
41 Add the debhelper commands specified by the given addon to appropriate places
42 in the sequence of commands that is run. This option can be repeated more
43 than once, or multiple addons can be listed, separated by commas.
44 This is used when there is a third-party package that provides
45 debhelper commands. See the F<PROGRAMMING> file for documentation about
46 the sequence addon interface.
47
48 =item B<--without> I<addon>
49
50 The inverse of B<--with>, disables using the given addon.
51
52 =item B<--list>, B<-l>
53
54 List all available addons.
55
56 =item B<--until> I<cmd>
57
58 Run commands in the sequence until and including I<cmd>, then stop.
59
60 =item B<--before> I<cmd>
61
62 Run commands in the sequence before I<cmd>, then stop.
63
64 =item B<--after> I<cmd>
65
66 Run commands in the sequence that come after I<cmd>.
67
68 =item B<--remaining>
69
70 Run all commands in the sequence that have yet to be run.
71
72 =item B<--no-act>
73
74 Prints commands that would run for a given sequence, but does not run them.
75
76 =back
77
78 All other options passed to B<dh> are passed on to each command it runs. This
79 can be used to set an option like B<-v> or B<-X> or B<-N>, as well as for more
80 specialised options.
81
82 In the above options, I<cmd> can be a full name of a debhelper command, or
83 a substring. It'll first search for a command in the sequence exactly
84 matching the name, to avoid any ambiguity. If there are multiple substring
85 matches, the last one in the sequence will be used.
86
87 =cut
88
89 sub command_pos {
90         my $command=shift;
91         my @sequence=@_;
92
93         foreach my $i (0..$#sequence) {
94                 if ($command eq $sequence[$i]) {
95                         return $i;
96                 }
97         }
98
99         my @matches;
100         foreach my $i (0..$#sequence) {
101                 if ($sequence[$i] =~ /\Q$command\E/) {
102                         push @matches, $i;
103                 }
104         }
105         if (! @matches) {
106                 error "command specification \"$command\" does not match any command in the sequence"
107         }
108         else {
109                 return pop @matches;
110         }
111 }
112
113 =head1 EXAMPLES
114
115 To see what commands are included in a sequence, without actually doing
116 anything:
117
118         dh binary-arch --no-act
119
120 This is a very simple rules file, for packages where the default sequences of
121 commands work with no additional options.
122
123         #!/usr/bin/make -f
124         %:
125                 dh $@
126
127 Often you'll want to pass an option to a specific debhelper command. The
128 easy way to do with is by adding an override target for that command.
129         
130         #!/usr/bin/make -f
131         %:
132                 dh $@
133
134         override_dh_strip:
135                 dh_strip -Xfoo
136                 
137         override_dh_installdocs:
138                 dh_installdocs README TODO
139
140 Sometimes the automated L<dh_auto_configure(1)> and L<dh_auto_build(1)>
141 can't guess what to do for a strange package. Here's how to avoid running
142 either and instead run your own commands.
143
144         #!/usr/bin/make -f
145         %:
146                 dh $@
147
148         override_dh_auto_configure:
149                 ./mondoconfig
150
151         override_dh_auto_build:
152                 make universe-explode-in-delight
153
154 Another common case is wanting to do something manually before or
155 after a particular debhelper command is run.
156
157         #!/usr/bin/make -f
158         %:
159                 dh $@
160
161         override_dh_fixperms:
162                 dh_fixperms
163                 chmod 4755 debian/foo/usr/bin/foo
164
165 If your package is a Python package, B<dh> will use B<dh_pysupport> by
166 default. This is how to use B<dh_pycentral> instead.
167
168         #!/usr/bin/make -f
169         %:
170                 dh $@ --with python-central
171
172 If your package uses autotools and you want to freshen F<config.sub> and
173 F<config.guess> with newer versions from the B<autotools-dev> package
174 at build time, you can use some commands provided in B<autotools-dev>
175 that automate it, like this.
176
177         #!/usr/bin/make -f
178         %:
179                 dh $@ --with autotools_dev
180
181 Here is how to force use of Perl's B<Module::Build> build system,
182 which can be necessary if debhelper wrongly detects that the package
183 uses MakeMaker.
184
185         #!/usr/bin/make -f
186         %:
187                 dh $@ --buildsystem=perl_build
188
189 To patch your package using quilt, you can tell B<dh> to use quilt's B<dh>
190 sequence addons like this:
191         
192         #!/usr/bin/make -f
193         %:
194                 dh $@ --with quilt
195
196 Here is an example of overriding where the B<dh_auto_>I<*> commands find
197 the package's source, for a package where the source is located in a
198 subdirectory.
199
200         #!/usr/bin/make -f
201         %:
202                 dh $@ --sourcedirectory=src
203
204 And here is an example of how to tell the B<dh_auto_>I<*> commands to build
205 in a subdirectory, which will be removed on B<clean>.
206
207         #!/usr/bin/make -f
208         %:
209                 dh $@ --builddirectory=build
210
211 If your package can be built in parallel, you can support parallel building
212 as follows. Then B<dpkg-buildpackage -j> will work.
213
214         #!/usr/bin/make -f
215         %:
216                 dh $@ --parallel
217
218 Here is a way to prevent B<dh> from running several commands that you don't
219 want it to run, by defining empty override targets for each command.
220
221         #!/usr/bin/make -f
222         %:
223                 dh $@
224         
225         # Commands not to run:
226         override_dh_auto_test override_dh_compress override_dh_fixperms:
227
228 Sometimes, you may need to make an override target only run commands when a
229 particular package is being built. This can be accomplished using
230 L<dh_listpackages(1)> to test what is being built. For example:
231
232         #!/usr/bin/make -f
233         %:
234                 dh $@
235         
236         override_dh_fixperms:
237                 dh_fixperms
238         ifneq (,$(filter foo, $(shell dh_listpackages)))
239                 chmod 4755 debian/foo/usr/bin/foo
240         endif
241
242 Finally, remember that you are not limited to using override targets in the
243 rules file when using B<dh>. You can also explicitly define the regular
244 rules file targets when it makes sense to do so. A common reason to do this
245 is if your package needs different B<build-arch> and B<build-indep> targets.
246 For example, a package with a long document build process can put it in
247 B<build-indep>.
248
249         #!/usr/bin/make -f
250         %:
251                 dh $@
252         
253         binary: binary-arch binary-indep ;
254         binary-arch:: build-arch
255         binary-indep:: build-indep
256         build: build-arch build-indep ;
257         build-indep:
258                 $(MAKE) docs
259         build-arch:
260                 $(MAKE) bins
261
262 =head1 INTERNALS
263
264 If you're curious about B<dh>'s internals, here's how it works under the hood.
265
266 Each debhelper command will record when it's successfully run in
267 F<debian/package.debhelper.log>. (Which B<dh_clean> deletes.) So B<dh> can tell
268 which commands have already been run, for which packages, and skip running
269 those commands again.
270
271 Each time B<dh> is run, it examines the log, and finds the last logged command
272 that is in the specified sequence. It then continues with the next command
273 in the sequence. The B<--until>, B<--before>, B<--after>, and B<--remaining>
274 options can override this behavior.
275
276 B<dh> uses the B<DH_INTERNAL_OPTIONS> environment variable to pass information
277 through to debhelper commands that are run inside override targets. The
278 contents (and indeed, existence) of this environment variable, as the name
279 might suggest, is subject to change at any time.
280
281 =cut
282
283 # Stash this away before init modifies it.
284 my @ARGV_orig=@ARGV;
285
286 # python-support is enabled by default, at least for now
287 # (and comes first so python-central loads later and can disable it).
288 unshift @ARGV, "--with=python-support";
289                 
290 init(options => {
291                 "until=s" => \$dh{UNTIL},
292                 "after=s" => \$dh{AFTER},
293                 "before=s" => \$dh{BEFORE},
294                 "remaining" => \$dh{REMAINING},
295                 "with=s" => sub {
296                         my ($option,$value)=@_;
297                         push @{$dh{WITH}},split(",", $value);
298                 },
299                 "without=s" => sub {
300                         my ($option,$value)=@_;
301                         @{$dh{WITH}} = grep { $_ ne $value } @{$dh{WITH}};
302                 },
303                 "l" => \&list_addons,
304                 "list" => \&list_addons,
305         },
306         # Disable complaints about unknown options; they are passed on to 
307         # the debhelper commands.
308         ignore_unknown_options => 1,
309         # Bundling does not work well since there are unknown options.
310         bundling => 0,
311 );
312 inhibit_log();
313
314
315 # If make is using a jobserver, but it is not available
316 # to this process, clean out MAKEFLAGS. This avoids
317 # ugly warnings when calling make.
318 if (is_make_jobserver_unavailable()) {
319         clean_jobserver_makeflags();
320 }
321
322 # Definitions of sequences.
323 my %sequences;
324 $sequences{build} = [qw{
325         dh_testdir
326         dh_auto_configure
327         dh_auto_build
328         dh_auto_test
329 }],
330 $sequences{'build-indep'} = [@{$sequences{build}}];
331 $sequences{'build-arch'} = [@{$sequences{build}}];
332 $sequences{clean} = [qw{
333         dh_testdir
334         dh_auto_clean
335         dh_clean
336 }];
337 my @i = qw{
338         dh_testroot
339         dh_prep
340         dh_installdirs
341         dh_auto_install
342
343         dh_install
344         dh_installdocs
345         dh_installchangelogs
346         dh_installexamples
347         dh_installman
348
349         dh_installcatalogs
350         dh_installcron
351         dh_installdebconf
352         dh_installemacsen
353         dh_installifupdown
354         dh_installinfo
355         dh_installinit
356         dh_installmenu
357         dh_installmime
358         dh_installmodules
359         dh_installlogcheck
360         dh_installlogrotate
361         dh_installpam
362         dh_installppp
363         dh_installudev
364         dh_installwm
365         dh_installxfonts
366         dh_installgsettings
367         dh_bugfiles
368         dh_ucf
369         dh_lintian
370         dh_gconf
371         dh_icons
372         dh_perl
373         dh_usrlocal
374
375         dh_link
376         dh_compress
377         dh_fixperms
378 };
379 $sequences{'install'} = [@{$sequences{build}}, @i];
380 $sequences{'install-indep'} = [@{$sequences{'build-indep'}}, @i];
381 $sequences{'install-arch'} = [@{$sequences{'build-arch'}}, @i];
382 my @ba=qw{
383         dh_strip
384         dh_makeshlibs
385         dh_shlibdeps
386 };
387 my @b=qw{
388         dh_installdeb
389         dh_gencontrol
390         dh_md5sums
391         dh_builddeb
392 };
393 $sequences{binary} = [@{$sequences{install}}, @ba, @b];
394 $sequences{'binary-indep'} = [@{$sequences{'install-indep'}}, @b];
395 $sequences{'binary-arch'} = [@{$sequences{'install-arch'}}, @ba, @b];
396
397 # Additional command options
398 my %command_opts;
399
400 # sequence addon interface
401 sub _insert {
402         my $offset=shift;
403         my $existing=shift;
404         my $new=shift;
405         foreach my $sequence (keys %sequences) {
406                 my @list=@{$sequences{$sequence}};
407                 next unless grep $existing, @list;
408                 my @new;
409                 foreach my $command (@list) {
410                         if ($command eq $existing) {
411                                 push @new, $new if $offset < 0;
412                                 push @new, $command;
413                                 push @new, $new if $offset > 0;
414                         }
415                         else {
416                                 push @new, $command;
417                         }
418                 }
419                 $sequences{$sequence}=\@new;
420         }
421 }
422 sub insert_before {
423         _insert(-1, @_);
424 }
425 sub insert_after {
426         _insert(1, @_);
427 }
428 sub remove_command {
429         my $command=shift;
430         foreach my $sequence (keys %sequences) {
431                 $sequences{$sequence}=[grep { $_ ne $command } @{$sequences{$sequence}}];
432         }
433         
434 }
435 sub add_command {
436         my $command=shift;
437         my $sequence=shift;
438         unshift @{$sequences{$sequence}}, $command;
439 }
440 sub add_command_options {
441         my $command=shift;
442         push @{$command_opts{$command}}, @_;
443 }
444 sub remove_command_options {
445         my $command=shift;
446         if (@_) {
447                 # Remove only specified options
448                 if (my $opts = $command_opts{$command}) {
449                         foreach my $opt (@_) {
450                                 $opts = [ grep { $_ ne $opt } @$opts ];
451                         }
452                         $command_opts{$command} = $opts;
453                 }
454         }
455         else {
456                 # Clear all additional options
457                 delete $command_opts{$command};
458         }
459 }
460
461 sub list_addons {
462         my %addons;
463
464         for my $inc (@INC) {
465                 eval q{use File::Spec};
466                 my $path = File::Spec->catdir($inc, "Debian/Debhelper/Sequence");
467                 if (-d $path) {
468                         for my $module_path (glob "$path/*.pm") {
469                                 my $name = basename($module_path);
470                                 $name =~ s/\.pm$//;
471                                 $name =~ s/_/-/g;
472                                 $addons{$name} = 1;
473                         }
474                 }
475         }
476
477         for my $name (sort keys %addons) {
478                 print "$name\n";
479         }
480
481         exit 0;
482 }
483
484 foreach my $addon (@{$dh{WITH}}) {
485         my $mod="Debian::Debhelper::Sequence::$addon";
486         $mod=~s/-/_/g;
487         eval "use $mod";
488         if ($@) {
489                 error("unable to load addon $addon: $@");
490         }
491 }
492
493 my $sequence;
494 if (! compat(7)) {
495         # From v8, the sequence is the very first parameter.
496         $sequence=shift @ARGV_orig;
497         if ($sequence=~/^-/) {
498                 error "Unknown sequence $sequence (options should not come before the sequence)";
499         }
500 }
501 else {
502         # Before v8, the sequence could be at any position in the parameters,
503         # so was what was left after parsing.
504         $sequence=shift;
505         if (defined $sequence) {
506                 @ARGV_orig=grep { $_ ne $sequence } @ARGV_orig;
507         }
508 }
509 if (! defined $sequence) {
510         error "specify a sequence to run";
511 }
512 if ($sequence eq 'debian/rules' ||
513     $sequence =~ /^override_dh_/) {
514         # make -B causes the rules file to be run as a target.
515         # Also support completly empty override targets.
516         exit 0;
517 }
518 elsif (! exists $sequences{$sequence}) {
519         error "Unknown sequence $sequence (choose from: ".
520                 join(" ", sort keys %sequences).")";
521 }
522 my @sequence=@{$sequences{$sequence}};
523
524 # The list of all packages that can be acted on.
525 my @packages=@{$dh{DOPACKAGES}};
526
527 # Get the options to pass to commands in the sequence.
528 # Filter out options intended only for this program.
529 my @options;
530 if ($sequence eq 'build-arch' ||
531     $sequence eq 'install-arch' ||
532     $sequence eq 'binary-arch') {
533         push @options, "-a";
534         # as an optimisation, remove from the list any packages
535         # that are not arch dependent
536         my %arch_packages = map { $_ => 1 } getpackages("arch");
537         @packages = grep { $arch_packages{$_} } @packages;
538 }
539 elsif ($sequence eq 'build-indep' ||
540        $sequence eq 'install-indep' ||
541        $sequence eq 'binary-indep') {
542         push @options, "-i";
543         # ditto optimisation for arch indep
544         my %indep_packages = map { $_ => 1 } getpackages("indep");
545         @packages = grep { $indep_packages{$_} } @packages;
546 }
547 while (@ARGV_orig) {
548         my $opt=shift @ARGV_orig;
549         if ($opt =~ /^--?(after|until|before|with|without)$/) {
550                 shift @ARGV_orig;
551                 next;
552         }
553         elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with|without)=)/) {
554                 next;
555         }
556         elsif ($opt=~/^-/) {
557                 push @options, "-O".$opt;
558         }
559         elsif (@options) {
560                 if ($options[$#options]=~/^-O--/) {
561                         $options[$#options].="=".$opt;
562                 }
563                 else {
564                         $options[$#options].=$opt;
565                 }
566         }
567 }
568
569 # Figure out at what point in the sequence to start for each package.
570 my %logged;
571 my %startpoint;
572 foreach my $package (@packages) {
573         my @log=load_log($package, \%logged);
574         if ($dh{AFTER}) {
575                 # Run commands in the sequence that come after the
576                 # specified command.
577                 $startpoint{$package}=command_pos($dh{AFTER}, @sequence) + 1;
578                 # Write a dummy log entry indicating that the specified
579                 # command was, in fact, run. This handles the case where
580                 # no commands remain to run after it, communicating to
581                 # future dh instances that the specified command should not
582                 # be run again.
583                 write_log($sequence[$startpoint{$package}-1], $package);
584         }
585         elsif ($dh{REMAINING}) {
586                 # Start at the beginning so all remaining commands will get
587                 # run.
588                 $startpoint{$package}=0;
589         }
590         else {
591                 # Find the last logged command that is in the sequence, and
592                 # continue with the next command after it. If no logged
593                 # command is in the sequence, we're starting at the beginning..                         
594                 $startpoint{$package}=0;
595 COMMAND:        foreach my $command (reverse @log) {
596                         foreach my $i (0..$#sequence) {
597                                 if ($command eq $sequence[$i]) {
598                                         $startpoint{$package}=$i+1;
599                                         last COMMAND;
600                                 }
601                         }
602                 }
603         }
604 }
605
606 # Figure out what point in the sequence to go to.
607 my $stoppoint=$#sequence;
608 if ($dh{UNTIL}) {
609         $stoppoint=command_pos($dh{UNTIL}, @sequence);
610 }
611 elsif ($dh{BEFORE}) {
612         $stoppoint=command_pos($dh{BEFORE}, @sequence) - 1;
613 }
614
615 # Now run the commands in the sequence.
616 foreach my $i (0..$stoppoint) {
617         # Figure out which packages need to run this command.
618         my @exclude;
619         foreach my $package (@packages) {
620                 if ($startpoint{$package} > $i ||
621                     $logged{$package}{$sequence[$i]}) {
622                         push @exclude, $package;
623                 }
624         }
625         
626         if (@exclude eq @packages) {
627                 # Command already done for all packages.
628                 next;
629         }
630
631         run($sequence[$i], \@packages, \@exclude, @options);
632 }
633
634 sub run {
635         my $command=shift;
636         my @packages=@{shift()};
637         my @exclude=@{shift()};
638         my @options=@_;
639         
640         # If some packages are excluded, add flags
641         # to prevent them from being acted on.
642         push @options, map { "-N$_" } @exclude;
643
644         # Check for override targets in debian/rules and
645         # run them instead of running the command directly.
646         my $override_command;
647         my $has_explicit_target = rules_explicit_target("override_".$command);
648         if (defined $has_explicit_target) {
649                 $override_command=$command;
650                 # Check if target isn't noop
651                 if ($has_explicit_target) {
652                         # This passes the options through to commands called
653                         # inside the target.
654                         $ENV{DH_INTERNAL_OPTIONS}=join("\x1e", @options);
655                         $ENV{DH_INTERNAL_OVERRIDE}=$command;
656                         $command="debian/rules";
657                         @options="override_".$override_command;
658                 }
659                 else {
660                         $command = undef;
661                 }
662         }
663         else {
664                 # Pass additional command options if any
665                 unshift @options, @{$command_opts{$command}} if exists $command_opts{$command};
666         }
667
668         if (defined $command) {
669                 # 3 space indent lines the command being run up under the
670                 # sequence name after "dh ".
671                 print "   ".escape_shell($command, @options)."\n";
672         }
673         else {
674                 print "   ", "# Skipping ", $override_command, " - empty override", "\n";
675         }
676                                 
677         if (! $dh{NO_ACT}) {
678                 if (defined $command) {
679                         my $ret=system($command, @options);
680                         
681                         if ($ret >> 8 != 0) {
682                                 exit $ret >> 8;
683                         }
684                         elsif ($ret) {
685                                 exit 1;
686                         }
687                 }
688
689                 if (defined $override_command) {
690                         # Update log for overridden command now that it has
691                         # finished successfully.
692                         # (But avoid logging for dh_clean since it removes
693                         # the log earlier.)
694                         if ($override_command ne 'dh_clean') {
695                                 my %packages=map { $_ => 1 } @packages;
696                                 map { delete $packages{$_} } @exclude;
697                                 write_log($override_command, keys %packages);
698                                 commit_override_log(keys %packages);
699                         }
700
701                         delete $ENV{DH_INTERNAL_OPTIONS};
702                         delete $ENV{DH_INTERNAL_OVERRIDE};
703                 }
704         }
705 }
706
707 {
708 my %targets;
709 my $rules_parsed;
710
711 sub rules_explicit_target {
712         # Checks if a specified target exists as an explicit target
713         # in debian/rules.
714         # undef is returned if target does not exist, 0 if target is noop
715         # and 1 if target has dependencies or executes commands.
716         my $target=shift;
717
718         if (! $rules_parsed) {
719                 my $processing_targets = 0;
720                 my $not_a_target = 0;
721                 my $current_target;
722                 open(MAKE, "LC_ALL=C make -Rrnpsf debian/rules debhelper-fail-me 2>/dev/null |");
723                 while (<MAKE>) {
724                         if ($processing_targets) {
725                                 if (/^# Not a target:/) {
726                                         $not_a_target = 1;
727                                 }
728                                 else {
729                                         if (!$not_a_target && /^([^#:]+)::?\s*(.*)$/) {
730                                                 # Target is defined. NOTE: if it is a depenency of
731                                                 # .PHONY it will be defined too but that's ok.
732                                                 # $2 contains target dependencies if any.
733                                                 $current_target = $1;
734                                                 $targets{$current_target} = ($2) ? 1 : 0;
735                                         }
736                                         else {
737                                                 if (defined $current_target) {
738                                                         if (/^#/) {
739                                                                 # Check if target has commands to execute
740                                                                 if (/^#\s*commands to execute/) {
741                                                                         $targets{$current_target} = 1;
742                                                                 }
743                                                         }
744                                                         else {
745                                                                 # Target parsed.
746                                                                 $current_target = undef;
747                                                         }
748                                                 }
749                                         }
750                                         # "Not a target:" is always followed by
751                                         # a target name, so resetting this one
752                                         # here is safe.
753                                         $not_a_target = 0;
754                                 }
755                         }
756                         elsif (/^# Files$/) {
757                                 $processing_targets = 1;
758                         }
759                 }
760                 close MAKE;
761                 $rules_parsed = 1;
762         }
763
764         return $targets{$target};
765 }
766
767 }
768
769 =head1 SEE ALSO
770
771 L<debhelper(7)>
772
773 This program is a part of debhelper.
774
775 =head1 AUTHOR
776
777 Joey Hess <joeyh@debian.org>
778
779 =cut