From 02bf22b2c4c695fd959f11c0d6a803795e014c2e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 4 Jan 2010 18:41:51 -0500 Subject: [PATCH] solve the dh -Bbuild problem * 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.) --- Debian/Debhelper/Dh_Getopt.pm | 42 ++++++++++++++++++++++------------- debhelper.pod | 7 ++++++ debian/changelog | 6 +++++ dh | 20 ++++++++++++----- 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/Debian/Debhelper/Dh_Getopt.pm b/Debian/Debhelper/Dh_Getopt.pm index 0d02107..4df3eed 100644 --- a/Debian/Debhelper/Dh_Getopt.pm +++ b/Debian/Debhelper/Dh_Getopt.pm @@ -69,15 +69,8 @@ sub NonOption { 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}, @@ -137,18 +130,37 @@ sub getoptions { "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 { @@ -171,7 +183,7 @@ sub parseopts { # 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}) { diff --git a/debhelper.pod b/debhelper.pod index a4765ba..03d0f90 100644 --- a/debhelper.pod +++ b/debhelper.pod @@ -156,6 +156,13 @@ This little-used option changes the package which debhelper considers the one for which debian/foo files can be used instead of the usual debian/package.foo files. +=item B<-O=>I + +This is used by L 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 diff --git a/debian/changelog b/debian/changelog index a3f1fbc..a7aa1dc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,12 @@ debhelper (7.4.12) UNRELEASED; urgency=low * 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 Fri, 01 Jan 2010 13:00:22 -0500 diff --git a/dh b/dh index 96a6b84..9fb209a 100755 --- a/dh +++ b/dh @@ -175,7 +175,7 @@ default. This is how to use dh_pycentral instead. #!/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 @@ -183,14 +183,14 @@ uses MakeMaker. #!/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 @@ -198,7 +198,7 @@ subdirectory. #!/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 @@ -459,7 +459,17 @@ while (@ARGV_orig) { 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. -- 2.39.2