Move the display of disabled features to configdata.pm as well.

The additional possibility is:

perl configdata.pm --options            Display the features, both
                                        enabled and disabled, and
                                        display defined macro and
                                        skipped directories where
                                        applicable.

Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5185)
diff --git a/Configure b/Configure
index 15b5d96..dd00178 100755
--- a/Configure
+++ b/Configure
@@ -1024,68 +1024,6 @@
     }
 }
 
-foreach (sort (keys %disabled))
-	{
-	$config{options} .= " no-$_";
-
-	printf "    no-%-12s %-10s", $_, "[$disabled{$_}]";
-
-	if (/^dso$/)
-		{ }
-	elsif (/^threads$/)
-		{ }
-	elsif (/^shared$/)
-		{ }
-	elsif (/^pic$/)
-		{ }
-	elsif (/^zlib$/)
-		{ }
-	elsif (/^dynamic-engine$/)
-		{ }
-	elsif (/^makedepend$/)
-		{ }
-	elsif (/^zlib-dynamic$/)
-		{ }
-	elsif (/^sse2$/)
-		{ }
-	elsif (/^engine$/)
-		{
-		@{$config{dirs}} = grep !/^engines$/, @{$config{dirs}};
-		@{$config{sdirs}} = grep !/^engine$/, @{$config{sdirs}};
-		push @{$config{openssl_other_defines}}, "OPENSSL_NO_ENGINE";
-		print " OPENSSL_NO_ENGINE (skip engines)";
-		}
-	else
-		{
-		my ($WHAT, $what);
-
-		($WHAT = $what = $_) =~ tr/[\-a-z]/[_A-Z]/;
-
-		# Fix up C macro end names
-		$WHAT = "RMD160" if $what eq "ripemd";
-
-		# fix-up crypto/directory name(s)
-		$what = "ripemd" if $what eq "rmd160";
-		$what = "whrlpool" if $what eq "whirlpool";
-
-		if ($what ne "async" && $what ne "err"
-		    && grep { $_ eq $what } @{$config{sdirs}})
-			{
-			push @{$config{openssl_algorithm_defines}}, "OPENSSL_NO_$WHAT";
-			@{$config{sdirs}} = grep { $_ ne $what} @{$config{sdirs}};
-
-			print " OPENSSL_NO_$WHAT (skip dir)";
-			}
-		else
-			{
-			push @{$config{openssl_other_defines}}, "OPENSSL_NO_$WHAT";
-			print " OPENSSL_NO_$WHAT";
-			}
-		}
-
-	print "\n";
-	}
-
 $target{cxxflags}//=$target{cflags} if $target{cxx};
 $target{exe_extension}="";
 $target{exe_extension}=".exe" if ($config{target} eq "DJGPP"
@@ -1150,6 +1088,46 @@
 # Allow overriding the build file name
 $config{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile";
 
+# ALL USE OF %useradd MUST BE DONE FROM HERE ON
+%useradd = undef;
+
+my %disabled_info = ();         # For configdata.pm
+foreach my $what (sort keys %disabled) {
+    $config{options} .= " no-$what";
+
+    if (!grep { $what eq $_ } ( 'dso', 'threads', 'shared', 'pic',
+                                'dynamic-engine', 'makedepend',
+                                'zlib-dynamic', 'zlib', 'sse2' )) {
+        (my $WHAT = uc $what) =~ s|-|_|g;
+
+        # Fix up C macro end names
+        $WHAT = "RMD160" if $what eq "ripemd";
+
+        # fix-up crypto/directory name(s)
+        $what = "ripemd" if $what eq "rmd160";
+        $what = "whrlpool" if $what eq "whirlpool";
+
+        my $macro = $disabled_info{$what}->{macro} = "OPENSSL_NO_$WHAT";
+
+        if ((grep { $what eq $_ } @{$config{sdirs}})
+                && $what ne 'async' && $what ne 'err') {
+            @{$config{sdirs}} = grep { $what ne $_} @{$config{sdirs}};
+            $disabled_info{$what}->{skipped} = [ catdir('crypto', $what) ];
+
+            if ($what ne 'engine') {
+                push @{$config{openssl_algorithm_defines}}, $macro;
+            } else {
+                @{$config{dirs}} = grep !/^engines$/, @{$config{dirs}};
+                push @{$disabled_info{engine}->{skipped}}, catdir('engines');
+                push @{$config{openssl_other_defines}}, $macro;
+            }
+        } else {
+            push @{$config{openssl_other_defines}}, $macro;
+        }
+
+    }
+}
+
 # Make sure build_scheme is consistent.
 $target{build_scheme} = [ $target{build_scheme} ]
     if ref($target{build_scheme}) ne "ARRAY";
@@ -2316,8 +2294,23 @@
         "'",$user_to_target{$_} || lc $_,"',\n";
 }
 print OUT ");\n";
+print OUT "my \%disabled_info = (\n";
+foreach my $what (sort keys %disabled_info) {
+    print OUT "    '$what' => {\n";
+    foreach my $info (sort keys %{$disabled_info{$what}}) {
+        if (ref $disabled_info{$what}->{$info} eq 'ARRAY') {
+            print OUT "        $info => [ ",
+                join(', ', map { "'$_'" } @{$disabled_info{$what}->{$info}}),
+                " ],\n";
+        } else {
+            print OUT "        $info => '", $disabled_info{$what}->{$info},
+                "',\n";
+        }
+    }
+    print OUT "    },\n";
+}
+print OUT ");\n";
 print OUT << 'EOF';
-
 # If run directly, we can give some answers, and even reconfigure
 unless (caller) {
     use Getopt::Long;
@@ -2329,6 +2322,7 @@
 
     my $dump = undef;
     my $cmdline = undef;
+    my $options = undef;
     my $envvars = undef;
     my $makevars = undef;
     my $buildparams = undef;
@@ -2338,6 +2332,7 @@
     my $man = undef;
     GetOptions('dump|d'                 => \$dump,
                'command-line|c'         => \$cmdline,
+               'options|o'              => \$options,
                'environment|e'          => \$envvars,
                'make-variables|m'       => \$makevars,
                'build-parameters|b'     => \$buildparams,
@@ -2347,8 +2342,8 @@
                'man'                    => \$man)
         or die "Errors in command line arguments\n";
 
-    unless ($dump || $cmdline || $envvars || $makevars || $buildparams
-            || $reconf || $verbose || $help || $man) {
+    unless ($dump || $cmdline || $options || $envvars || $makevars
+            || $buildparams || $reconf || $verbose || $help || $man) {
         print STDERR <<"_____";
 You must give at least one option.
 For more information, do '$0 --help'
@@ -2372,6 +2367,30 @@
                           catfile($config{sourcedir}, 'Configure'),
                           @{$config{perlargv}}), "\n";
     }
+    if ($dump || $options) {
+        my $longest = 0;
+        foreach my $what (@disablables) {
+            $longest = length($what) if $longest < length($what);
+        }
+        print "\nEnabled features:\n\n";
+        foreach my $what (@disablables) {
+            print "    $what\n" unless $disabled{$what};
+        }
+        print "\nDisabled features:\n\n";
+        foreach my $what (@disablables) {
+            if ($disabled{$what}) {
+                print "    $what", ' ' x ($longest - length($what) + 1),
+                    "[$disabled{$what}]", ' ' x (10 - length($disabled{$what}));
+                print $disabled_info{$what}->{macro}
+                    if $disabled_info{$what}->{macro};
+                print ' (skip ',
+                    join(', ', @{$disabled_info{$what}->{skipped}}),
+                    ')'
+                    if $disabled_info{$what}->{skipped};
+                print "\n";
+            }
+        }
+    }
     if ($dump || $envvars) {
         print "\nRecorded environment:\n\n";
         foreach (sort keys %{$config{perlenv}}) {
@@ -2482,12 +2501,17 @@
 =item B<--dump> | B<-c>
 
 Print all relevant configuration data.  This is equivalent to B<--command-line>
-B<--environment> B<--make-variables> B<--build-parameters>.
+B<--options> B<--environment> B<--make-variables> B<--build-parameters>.
 
 =item B<--command-line> | B<-c>
 
 Print the current configuration command line.
 
+=item B<--options> | B<-o>
+
+Print the features, both enabled and disabled, and display defined macro and
+skipped directories where applicable.
+
 =item B<--environment> | B<-e>
 
 Print the environment variables and their values at the time of configuration.