sub getoptions {
my $array=shift;
my %params=@_;
- my %options=%{$params{options}} if ref $params{options};
-
- my $oldwarn;
- if ($params{ignore_unknown_options}) {
- $oldwarn=$SIG{__WARN__};
- $SIG{__WARN__}=sub {};
- }
- my $ret=Getopt::Long::GetOptionsFromArray($array,
+ my %options=(
"v" => \$dh{VERBOSE},
"verbose" => \$dh{VERBOSE},
"ignore=s" => \&AddIgnore,
- %options,
+ "O=s" => sub { my($option,$value)=@_;
+ # Try to parse an option, but ignore it
+ # if it is not known.
+ if (getoptions([$value], %params, test => 1)) {
+ getoptions([$value], %params);
+ }
+ },
+
+ (ref $params{options} ? %{$params{options}} : ()) ,
"<>" => \&NonOption,
);
- if ($params{ignore_unknown_options}) {
- $SIG{__WARN__}=$oldwarn;
- return 1;
+ if ($params{test}) {
+ foreach my $key (keys %options) {
+ $options{$key}=sub {};
+ }
}
- else {
- return $ret;
+
+ my $oldwarn;
+ if ($params{test} || $params{ignore_unknown_options}) {
+ $oldwarn=$SIG{__WARN__};
+ $SIG{__WARN__}=sub {};
+ }
+ my $ret=Getopt::Long::GetOptionsFromArray($array, %options);
+ if ($oldwarn) {
+ $SIG{__WARN__}=$oldwarn;
}
+
+ return 1 if $params{ignore_unknown_options};
+ return $ret;
}
sub split_options_string {
# Avoid forcing acting on packages specified in
# DH_INTERNAL_OPTIONS. This way, -p can be specified
- # at the command line to act on a specific package, and if
+ # at the command line to act on a specific package, but when
# nothing is specified, the excludes will cause the set of
# packages DH_INTERNAL_OPTIONS specifies to be acted on.
if (defined $dh{DOPACKAGES}) {
one for which debian/foo files can be used instead of the usual
debian/package.foo files.
+=item B<-O=>I<option|bundle>
+
+This is used by L<dh(1)> when passing user-specified options to all the
+commands it runs. If the command supports the specified option or option
+bundle, it will take effect. If the command does not support the option (or
+any part of an option bundle), it will be ignored.
+
=back
=head1 COMMON DEBHELPER OPTIONS
* makefile: Support the (asking for trouble) case of MAKE being set to
something with a space in it. Closes: #563557
* Fix warning about unknown options passed to commands in override targets.
+ * Add -O option, which can be used to pass options to commands, ignoring
+ options that they do not support.
+ * dh: Use -O to pass user-specified options to the commands it runs.
+ This solves the problem with passing "-Bbuild" to dh, where commands
+ that do not support -B would see a bogus -u option. Closes: #541773
+ (It also ensures that the commands dh prints out can really be run.)
-- Joey Hess <joeyh@debian.org> Fri, 01 Jan 2010 13:00:22 -0500
#!/usr/bin/make -f
%:
- dh --with python-central $@
+ dh $@ --with python-central
Here is how to force use of perl's Module::Build build system,
which can be necessary if debhelper wrongly detects that the package
#!/usr/bin/make -f
%:
- dh --buildsystem=perl_build $@
+ dh $@ --buildsystem=perl_build
To patch your package using quilt, you can tell dh to use quilt's dh
sequence addons like this:
#!/usr/bin/make -f
%:
- dh --with quilt $@
+ dh $@ --with quilt
Here is an example of overriding where the dh_auto_* commands find
the package's source, for a package where the source is located in a
#!/usr/bin/make -f
%:
- dh --sourcedirectory=src $@
+ dh $@ --sourcedirectory=src
Finally, here is a way to prevent dh from running several commands
that you don't want it to run, by defining empty override targets for each
elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with|without)=)/) {
next;
}
- push @options, $opt;
+ elsif ($opt=~/^-/) {
+ push @options, "-O".$opt;
+ }
+ elsif (@options) {
+ if ($options[$#options]=~/^-O--/) {
+ $options[$#options].="=".$opt;
+ }
+ else {
+ $options[$#options].=$opt;
+ }
+ }
}
# Figure out at what point in the sequence to start for each package.