diff options
-rw-r--r-- | Debian/Debhelper/Dh_Buildsystems.pm | 18 | ||||
-rw-r--r-- | Debian/Debhelper/Dh_Getopt.pm | 47 | ||||
-rw-r--r-- | Debian/Debhelper/Dh_Lib.pm | 4 | ||||
-rw-r--r-- | debhelper.pod | 10 |
4 files changed, 53 insertions, 26 deletions
diff --git a/Debian/Debhelper/Dh_Buildsystems.pm b/Debian/Debhelper/Dh_Buildsystems.pm index 80b66887..be29ac5c 100644 --- a/Debian/Debhelper/Dh_Buildsystems.pm +++ b/Debian/Debhelper/Dh_Buildsystems.pm @@ -65,27 +65,23 @@ sub load_buildsystem { sub buildsystems_init { my %args=@_; - # TODO: Not documented in the manual pages yet. - # Initialize options from environment variables - if (exists $ENV{DH_AUTO_BUILDDIRECTORY}) { - $opt_builddir = $ENV{DH_AUTO_BUILDDIRECTORY}; - } - if (exists $ENV{DH_AUTO_BUILDSYSTEM}) { - $opt_buildsys = $ENV{DH_AUTO_BUILDSYSTEM}; - } - # Available command line options my %options = ( "b:s" => \$opt_builddir, "builddirectory:s" => \$opt_builddir, - "m=s" => \$opt_buildsys, + "c=s" => \$opt_buildsys, "buildsystem=s" => \$opt_buildsys, "l" => \$opt_list, "--list" => \$opt_list, ); - map { $args{options}{$_} = $options{$_} } keys(%options); + $args{options}{$_} = $options{$_} foreach keys(%options); + + # Pass options from the DH_AUTO_OPTIONS environment variable + if (defined $ENV{DH_AUTO_OPTIONS}) { + $args{extra_args} = $ENV{DH_AUTO_OPTIONS}; + } Debian::Debhelper::Dh_Lib::init(%args); } diff --git a/Debian/Debhelper/Dh_Getopt.pm b/Debian/Debhelper/Dh_Getopt.pm index 5585a54c..bddc06b8 100644 --- a/Debian/Debhelper/Dh_Getopt.pm +++ b/Debian/Debhelper/Dh_Getopt.pm @@ -71,9 +71,9 @@ sub NonOption { sub getoptions { my $array=shift; - my %options=%{shift()} if ref $_[0]; + my $extraoptions=shift; - Getopt::Long::GetOptionsFromArray($array, + my %options=( "v" => \$dh{VERBOSE}, "verbose" => \$dh{VERBOSE}, @@ -137,24 +137,42 @@ sub getoptions { "ignore=s" => \&AddIgnore, - %options, - "<>" => \&NonOption, - ) + ); + + # Merge extra options and cancel default ones as needed (undef) + if (defined $extraoptions) { + for my $opt (keys %$extraoptions) { + if (defined $extraoptions->{$opt}) { + $options{$opt}=$extraoptions->{$opt}; + } + else { + delete $options{$opt}; + } + } + } + + Getopt::Long::GetOptionsFromArray($array, %options); +} + +sub split_options_string { + my $str=shift; + + $str=~s/^\s+//; + return map { $_=~s/\\(\s)/$1/g; $_=~s/\s+$//g; $_ } split(/(?<!\\)\s+/,$str); } # Parse options and set %dh values. sub parseopts { my $options=shift; + my $extra_args=shift; my @ARGV_extra; # DH_INTERNAL_OPTIONS is used to pass additional options from # dh through an override target to a command. if (defined $ENV{DH_INTERNAL_OPTIONS}) { - $ENV{DH_INTERNAL_OPTIONS}=~s/^\s+//; - $ENV{DH_INTERNAL_OPTIONS}=~s/\s+$//; - @ARGV_extra=split(/\s+/,$ENV{DH_INTERNAL_OPTIONS}); + @ARGV_extra=split_options_string($ENV{DH_INTERNAL_OPTIONS}); my $ret=getoptions(\@ARGV_extra, $options); if (!$ret) { warning("warning: unknown options will be a fatal error in a future debhelper release"); @@ -183,15 +201,22 @@ sub parseopts { # to be parsed like @ARGV, but with unknown options # skipped. if (defined $ENV{DH_OPTIONS}) { - $ENV{DH_OPTIONS}=~s/^\s+//; - $ENV{DH_OPTIONS}=~s/\s+$//; - @ARGV_extra=split(/\s+/,$ENV{DH_OPTIONS}); + @ARGV_extra=split_options_string($ENV{DH_OPTIONS}); my $ret=getoptions(\@ARGV_extra, $options); if (!$ret) { warning("warning: ignored unknown options in DH_OPTIONS"); } } + if (defined $extra_args) { + my @extra_opts=split_options_string($extra_args); + my $ret=getoptions(\@extra_opts, $options); + if (!$ret) { + warning("warning: ignored unknown options"); + } + push @ARGV_extra, @extra_opts; + } + my $ret=getoptions(\@ARGV, $options); if (!$ret) { warning("warning: unknown options will be a fatal error in a future debhelper release"); diff --git a/Debian/Debhelper/Dh_Lib.pm b/Debian/Debhelper/Dh_Lib.pm index 28a90f7b..b3162d07 100644 --- a/Debian/Debhelper/Dh_Lib.pm +++ b/Debian/Debhelper/Dh_Lib.pm @@ -29,10 +29,10 @@ sub init { # Getopt::Long, which I'd prefer to avoid loading at all if possible. if ((defined $ENV{DH_OPTIONS} && length $ENV{DH_OPTIONS}) || (defined $ENV{DH_INTERNAL_OPTIONS} && length $ENV{DH_INTERNAL_OPTIONS}) || - grep /^-/, @ARGV) { + (defined $params{extra_args}) || grep /^-/, @ARGV) { eval "use Debian::Debhelper::Dh_Getopt"; error($@) if $@; - Debian::Debhelper::Dh_Getopt::parseopts($params{options}); + Debian::Debhelper::Dh_Getopt::parseopts($params{options}, $params{extra_args}); } # Another way to set excludes. diff --git a/debhelper.pod b/debhelper.pod index 388453c3..8c232d28 100644 --- a/debhelper.pod +++ b/debhelper.pod @@ -491,8 +491,14 @@ Anything in this variable will be prepended to the command line arguments of all debhelper commands. Command-specific options will be ignored by commands that do not support them. -This is useful in some situations, for example, if you need to pass -p to -all debhelper commands that will be run. One good way to set DH_OPTIONS is +Arguments are separated by whitespaces unless a whitespace is escaped +with a backslash character (\). Then the whitespace is treated literally. +Likewise, the backslash character is treated literally unless it is followed +by a single whitespace. If a backslash is followed by two or more spaces, +it will be considered as the last symbol of the argument. + +DH_OPTIONS is useful in some situations, for example, if you need to pass -p +to all debhelper commands that will be run. One good way to set DH_OPTIONS is by using "Target-specific Variable Values" in your debian/rules file. See the make documentation for details on doing this. |