+# Returns true if an override target exists for a command.
+sub run_override {
+ my $override=shift;
+ my $command=shift;
+ my @packages=@{shift()};
+ my @exclude=@{shift()};
+ my @options=@_;
+
+ my $has_explicit_target = rules_explicit_target($override);
+ return 0 unless defined $has_explicit_target; # no such override
+ return 1 if ! $has_explicit_target; # has empty override
+
+ # This passes the options through to commands called
+ # inside the target.
+ $ENV{DH_INTERNAL_OPTIONS}=join("\x1e", @options);
+ $ENV{DH_INTERNAL_OVERRIDE}=$command;
+ run("debian/rules", "override_".$command);
+ delete $ENV{DH_INTERNAL_OPTIONS};
+ delete $ENV{DH_INTERNAL_OVERRIDE};
+
+ # Update log for overridden command now that it has
+ # finished successfully.
+ # (But avoid logging for dh_clean since it removes
+ # the log earlier.)
+ if (! $dh{NO_ACT} && $command ne 'dh_clean') {
+ my %packages=map { $_ => 1 } @packages;
+ map { delete $packages{$_} } @exclude;
+ write_log($command, keys %packages);
+ commit_override_log(keys %packages);
+ }
+
+ return 1;