summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorModestas Vainius <modestas@vainius.eu>2009-06-08 21:32:27 +0300
committerModestas Vainius <modestas@vainius.eu>2009-06-08 23:01:02 +0300
commitf897611a77726655aea258af0c4d52a8ce759ebc (patch)
tree7e89d87f0a98706d4b7864eb571d341e1ade7542
parent9c95d2ea547f3566f1bf8b67c08da57845325341 (diff)
Improvements in DH_OPTIONS handling and DH_AUTO_OPTIONS envvar support.
* DH_AUTO_OPTIONS is like existing DH_OPTIONS, just only for dh_auto stuff. This also avoids "explosion" of separate DH_AUTO_* environment variables (i.e. exports in debian/rules) and encourages usage of dh_auto command line option names. DH_AUTO_OPTIONS is passed via "extra_args" to Dh_Lib::init() (API addition). * When splitting options from DH_OPTIONS and its flavours, allow arguments to include whitespaces if they are escaped with backslash (\) (see split_options_string()). Document this in debhelper.pod. * Short option for --buildsystem is -c (aka class). * Provide API to cancel option specs from default debhelper options. It will be used in the feature.
-rw-r--r--Debian/Debhelper/Dh_Buildsystems.pm18
-rw-r--r--Debian/Debhelper/Dh_Getopt.pm47
-rw-r--r--Debian/Debhelper/Dh_Lib.pm4
-rw-r--r--debhelper.pod10
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.