From 2075bebb2fad5bd2d7ff134ce8b9bc18196a14da Mon Sep 17 00:00:00 2001
From: "Bernhard R. Link" <brlink@debian.org>
Date: Thu, 15 Mar 2012 11:25:39 +0100
Subject: [PATCH] dpkg-buildflags: add --status action to describe what is
 happening

It's hard to see from a build log file what values should have been
used and why. The new --status action added by this tries to output
all meaningful information in way useful for human consumption
and for automatic log parsers.

Signed-off-by: Bernhard R. Link <brlink@debian.org>
---
 man/dpkg-buildflags.1      |   11 +++++++++
 scripts/Dpkg/BuildFlags.pm |   12 ++++++++++
 scripts/dpkg-buildflags.pl |   52 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 75 insertions(+), 0 deletions(-)

diff --git a/man/dpkg-buildflags.1 b/man/dpkg-buildflags.1
index 4244b82..0c9829c 100644
--- a/man/dpkg-buildflags.1
+++ b/man/dpkg-buildflags.1
@@ -72,6 +72,17 @@ Print the list of flags supported by the current vendor
 (one per line). See the \fBSUPPORTED FLAGS\fP section for more
 information about them.
 .TP
+.BI \-\-status
+Print all information to standard output:
+Environment variables that might have had some influence,
+the current vendor,
+the state of all feature flags, and finally
+all compiler flags together with their origin and values.
+
+This is intended to be run from debian/rules, so that the log
+contains all the information or to debug why the flags are that
+they end up to be.
+.TP
 .BI \-\-export= format
 Print to standard output shell (if \fIformat\fP is \fBsh\fP) or make
 (if \fIformat\fP is \fBmake\fP) commands that can be used to export
diff --git a/scripts/Dpkg/BuildFlags.pm b/scripts/Dpkg/BuildFlags.pm
index b114335..b18c860 100644
--- a/scripts/Dpkg/BuildFlags.pm
+++ b/scripts/Dpkg/BuildFlags.pm
@@ -320,6 +320,18 @@ sub get {
     return $self->{'flags'}{$key};
 }
 
+=item $bf->get_feature_areas()
+
+Return the feature areas
+(i.e. the area values has_features will return true for).
+
+=cut
+
+sub get_feature_areas {
+    my ($self) = @_;
+    return keys $self->{'features'};
+}
+
 =item $bf->get_features($area)
 
 Return, for the given area, a hash with keys as feature names, and values
diff --git a/scripts/dpkg-buildflags.pl b/scripts/dpkg-buildflags.pl
index d0f9fa8..890076b 100755
--- a/scripts/dpkg-buildflags.pl
+++ b/scripts/dpkg-buildflags.pl
@@ -24,6 +24,7 @@ use Dpkg;
 use Dpkg::Gettext;
 use Dpkg::ErrorHandling;
 use Dpkg::BuildFlags;
+use Dpkg::Vendor qw(get_current_vendor);
 
 textdomain("dpkg-dev");
 
@@ -52,6 +53,7 @@ Actions:
                      compilation flags in a shell script, in make,
                      or on a ./configure command line.
   --dump             output all compilation flags with their values
+  --status           informational message about current status
   --help             show this help message.
   --version          show the version.
 "), $progname;
@@ -80,6 +82,10 @@ while (@ARGV) {
         usageerr(_g("two commands specified: --%s and --%s"), "list", $action)
             if defined($action);
         $action = "list";
+    } elsif (m/^--status$/) {
+        usageerr(_g("two commands specified: --%s and --%s"), "status", $action)
+            if defined($action);
+        $action = "status";
     } elsif (m/^-(h|-help)$/) {
         usage();
         exit 0;
@@ -147,6 +153,52 @@ if ($action eq "get") {
 	print "$flag=$value\n";
     }
     exit(0);
+} elsif ($action eq "status") {
+    # prefix everything with "dpkg-buildflags: " to allow easy extraction
+    # from a buildd log.
+    # First print all environment variables that might have changed the
+    # results: (would be nice to only print those having an effect for
+    # the current vendor, but getting that information here would be
+    # quite tough):
+    my @envvars = ('DEB_VENDOR', 'DEB_BUILD_OPTIONS',
+                   'DEB_BUILD_MAINT_OPTIONS', 'DEB_BUILD_HARDENING');
+    foreach my $flag ($build_flags->list()) {
+	push @envvars, "DEB_" . $flag . "_SET",
+			"DEB_" . $flag . "_STRIP",
+			"DEB_" . $flag . "_APPEND",
+			"DEB_" . $flag . "_PREPEND",
+			"DEB_" . $flag . "_MAINT_SET",
+			"DEB_" . $flag . "_MAINT_STRIP",
+			"DEB_" . $flag . "_MAINT_APPEND",
+			"DEB_" . $flag . "_MAINT_PREPEND";
+    }
+    for my $envvar (@envvars) {
+	if (exists $ENV{$envvar}) {
+	    printf "dpkg-buildflags: environment variable %s=%s\n",
+				$envvar, $ENV{$envvar};
+	}
+    }
+    my $vendor = Dpkg::Vendor::get_current_vendor();
+    $vendor = "undefined" unless defined($vendor);
+    print "dpkg-buildflags: vendor is $vendor\n";
+    # Then the resulting features:
+    foreach my $area (sort $build_flags->get_feature_areas()) {
+	print "dpkg-buildflags: $area features:";
+	my %features = $build_flags->get_features($area);
+	foreach my $feature (sort keys %features) {
+	    printf " %s=%s", $feature, $features{$feature} ? "yes" : "no";
+	}
+	print "\n";
+    }
+    # Then the resulting values (with their origin):
+    foreach my $flag ($build_flags->list()) {
+	my $value = $build_flags->get($flag);
+	my $origin = $build_flags->get_origin($flag);
+	# note that DEB_*_MAINT_* currently is not reflected
+	# by $origin...
+	print "dpkg-buildflags: $flag [$origin]: $value\n";
+    }
+    exit(0);
 }
 
 exit(1);
-- 
1.7.9.1

