1*52a4be3fSMauro Carvalho Chehab#!/usr/bin/perl 2*52a4be3fSMauro Carvalho Chehab# SPDX-License-Identifier: GPL-2.0 3*52a4be3fSMauro Carvalho Chehab 4*52a4be3fSMauro Carvalho Chehabuse strict; 5*52a4be3fSMauro Carvalho Chehabuse Pod::Usage; 6*52a4be3fSMauro Carvalho Chehabuse Getopt::Long; 7*52a4be3fSMauro Carvalho Chehabuse File::Find; 8*52a4be3fSMauro Carvalho Chehabuse Fcntl ':mode'; 9*52a4be3fSMauro Carvalho Chehab 10*52a4be3fSMauro Carvalho Chehabmy $help; 11*52a4be3fSMauro Carvalho Chehabmy $man; 12*52a4be3fSMauro Carvalho Chehabmy $debug; 13*52a4be3fSMauro Carvalho Chehabmy $arch; 14*52a4be3fSMauro Carvalho Chehabmy $feat; 15*52a4be3fSMauro Carvalho Chehabmy $prefix="Documentation/features"; 16*52a4be3fSMauro Carvalho Chehab 17*52a4be3fSMauro Carvalho ChehabGetOptions( 18*52a4be3fSMauro Carvalho Chehab "debug|d+" => \$debug, 19*52a4be3fSMauro Carvalho Chehab "dir=s" => \$prefix, 20*52a4be3fSMauro Carvalho Chehab 'help|?' => \$help, 21*52a4be3fSMauro Carvalho Chehab 'arch=s' => \$arch, 22*52a4be3fSMauro Carvalho Chehab 'feat=s' => \$feat, 23*52a4be3fSMauro Carvalho Chehab man => \$man 24*52a4be3fSMauro Carvalho Chehab) or pod2usage(2); 25*52a4be3fSMauro Carvalho Chehab 26*52a4be3fSMauro Carvalho Chehabpod2usage(1) if $help; 27*52a4be3fSMauro Carvalho Chehabpod2usage(-exitstatus => 0, -verbose => 2) if $man; 28*52a4be3fSMauro Carvalho Chehab 29*52a4be3fSMauro Carvalho Chehabpod2usage(2) if (scalar @ARGV < 1 || @ARGV > 2); 30*52a4be3fSMauro Carvalho Chehab 31*52a4be3fSMauro Carvalho Chehabmy ($cmd, $arg) = @ARGV; 32*52a4be3fSMauro Carvalho Chehab 33*52a4be3fSMauro Carvalho Chehabpod2usage(2) if ($cmd ne "current" && $cmd ne "rest" && $cmd ne "validate"); 34*52a4be3fSMauro Carvalho Chehab 35*52a4be3fSMauro Carvalho Chehabrequire Data::Dumper if ($debug); 36*52a4be3fSMauro Carvalho Chehab 37*52a4be3fSMauro Carvalho Chehabmy %data; 38*52a4be3fSMauro Carvalho Chehabmy %archs; 39*52a4be3fSMauro Carvalho Chehab 40*52a4be3fSMauro Carvalho Chehab# 41*52a4be3fSMauro Carvalho Chehab# Displays an error message, printing file name and line 42*52a4be3fSMauro Carvalho Chehab# 43*52a4be3fSMauro Carvalho Chehabsub parse_error($$$$) { 44*52a4be3fSMauro Carvalho Chehab my ($file, $ln, $msg, $data) = @_; 45*52a4be3fSMauro Carvalho Chehab 46*52a4be3fSMauro Carvalho Chehab $data =~ s/\s+$/\n/; 47*52a4be3fSMauro Carvalho Chehab 48*52a4be3fSMauro Carvalho Chehab print STDERR "Warning: file $file#$ln:\n\t$msg"; 49*52a4be3fSMauro Carvalho Chehab 50*52a4be3fSMauro Carvalho Chehab if ($data ne "") { 51*52a4be3fSMauro Carvalho Chehab print STDERR ". Line\n\t\t$data"; 52*52a4be3fSMauro Carvalho Chehab } else { 53*52a4be3fSMauro Carvalho Chehab print STDERR "\n"; 54*52a4be3fSMauro Carvalho Chehab } 55*52a4be3fSMauro Carvalho Chehab} 56*52a4be3fSMauro Carvalho Chehab 57*52a4be3fSMauro Carvalho Chehab# 58*52a4be3fSMauro Carvalho Chehab# Parse a features file, storing its contents at %data 59*52a4be3fSMauro Carvalho Chehab# 60*52a4be3fSMauro Carvalho Chehab 61*52a4be3fSMauro Carvalho Chehabmy $h_name = "Feature"; 62*52a4be3fSMauro Carvalho Chehabmy $h_kconfig = "Kconfig"; 63*52a4be3fSMauro Carvalho Chehabmy $h_description = "Description"; 64*52a4be3fSMauro Carvalho Chehabmy $h_subsys = "Subsystem"; 65*52a4be3fSMauro Carvalho Chehabmy $h_status = "Status"; 66*52a4be3fSMauro Carvalho Chehabmy $h_arch = "Architecture"; 67*52a4be3fSMauro Carvalho Chehab 68*52a4be3fSMauro Carvalho Chehabmy $max_size_name = length($h_name); 69*52a4be3fSMauro Carvalho Chehabmy $max_size_kconfig = length($h_kconfig); 70*52a4be3fSMauro Carvalho Chehabmy $max_size_description = length($h_description); 71*52a4be3fSMauro Carvalho Chehabmy $max_size_subsys = length($h_subsys); 72*52a4be3fSMauro Carvalho Chehabmy $max_size_status = length($h_status); 73*52a4be3fSMauro Carvalho Chehabmy $max_size_arch = length($h_arch); 74*52a4be3fSMauro Carvalho Chehab 75*52a4be3fSMauro Carvalho Chehabsub parse_feat { 76*52a4be3fSMauro Carvalho Chehab my $file = $File::Find::name; 77*52a4be3fSMauro Carvalho Chehab 78*52a4be3fSMauro Carvalho Chehab my $mode = (stat($file))[2]; 79*52a4be3fSMauro Carvalho Chehab return if ($mode & S_IFDIR); 80*52a4be3fSMauro Carvalho Chehab return if ($file =~ m,($prefix)/arch-support.txt,); 81*52a4be3fSMauro Carvalho Chehab return if (!($file =~ m,arch-support.txt$,)); 82*52a4be3fSMauro Carvalho Chehab 83*52a4be3fSMauro Carvalho Chehab my $subsys = ""; 84*52a4be3fSMauro Carvalho Chehab $subsys = $2 if ( m,.*($prefix)/([^/]+).*,); 85*52a4be3fSMauro Carvalho Chehab 86*52a4be3fSMauro Carvalho Chehab if (length($subsys) > $max_size_subsys) { 87*52a4be3fSMauro Carvalho Chehab $max_size_subsys = length($subsys); 88*52a4be3fSMauro Carvalho Chehab } 89*52a4be3fSMauro Carvalho Chehab 90*52a4be3fSMauro Carvalho Chehab my $name; 91*52a4be3fSMauro Carvalho Chehab my $kconfig; 92*52a4be3fSMauro Carvalho Chehab my $description; 93*52a4be3fSMauro Carvalho Chehab my $comments = ""; 94*52a4be3fSMauro Carvalho Chehab my $last_status; 95*52a4be3fSMauro Carvalho Chehab my $ln; 96*52a4be3fSMauro Carvalho Chehab my %arch_table; 97*52a4be3fSMauro Carvalho Chehab 98*52a4be3fSMauro Carvalho Chehab print STDERR "Opening $file\n" if ($debug > 1); 99*52a4be3fSMauro Carvalho Chehab open IN, $file; 100*52a4be3fSMauro Carvalho Chehab 101*52a4be3fSMauro Carvalho Chehab while(<IN>) { 102*52a4be3fSMauro Carvalho Chehab $ln++; 103*52a4be3fSMauro Carvalho Chehab 104*52a4be3fSMauro Carvalho Chehab if (m/^\#\s+Feature\s+name:\s*(.*\S)/) { 105*52a4be3fSMauro Carvalho Chehab $name = $1; 106*52a4be3fSMauro Carvalho Chehab if (length($name) > $max_size_name) { 107*52a4be3fSMauro Carvalho Chehab $max_size_name = length($name); 108*52a4be3fSMauro Carvalho Chehab } 109*52a4be3fSMauro Carvalho Chehab next; 110*52a4be3fSMauro Carvalho Chehab } 111*52a4be3fSMauro Carvalho Chehab if (m/^\#\s+Kconfig:\s*(.*\S)/) { 112*52a4be3fSMauro Carvalho Chehab $kconfig = $1; 113*52a4be3fSMauro Carvalho Chehab if (length($kconfig) > $max_size_kconfig) { 114*52a4be3fSMauro Carvalho Chehab $max_size_kconfig = length($kconfig); 115*52a4be3fSMauro Carvalho Chehab } 116*52a4be3fSMauro Carvalho Chehab next; 117*52a4be3fSMauro Carvalho Chehab } 118*52a4be3fSMauro Carvalho Chehab if (m/^\#\s+description:\s*(.*\S)/) { 119*52a4be3fSMauro Carvalho Chehab $description = $1; 120*52a4be3fSMauro Carvalho Chehab if (length($description) > $max_size_description) { 121*52a4be3fSMauro Carvalho Chehab $max_size_description = length($description); 122*52a4be3fSMauro Carvalho Chehab } 123*52a4be3fSMauro Carvalho Chehab next; 124*52a4be3fSMauro Carvalho Chehab } 125*52a4be3fSMauro Carvalho Chehab next if (m/^\\s*$/); 126*52a4be3fSMauro Carvalho Chehab next if (m/^\s*\-+\s*$/); 127*52a4be3fSMauro Carvalho Chehab next if (m/^\s*\|\s*arch\s*\|\s*status\s*\|\s*$/); 128*52a4be3fSMauro Carvalho Chehab 129*52a4be3fSMauro Carvalho Chehab if (m/^\#\s*(.*)/) { 130*52a4be3fSMauro Carvalho Chehab $comments .= "$1\n"; 131*52a4be3fSMauro Carvalho Chehab next; 132*52a4be3fSMauro Carvalho Chehab } 133*52a4be3fSMauro Carvalho Chehab if (m/^\s*\|\s*(\S+):\s*\|\s*(\S+)\s*\|\s*$/) { 134*52a4be3fSMauro Carvalho Chehab my $a = $1; 135*52a4be3fSMauro Carvalho Chehab my $status = $2; 136*52a4be3fSMauro Carvalho Chehab 137*52a4be3fSMauro Carvalho Chehab if (length($status) > $max_size_status) { 138*52a4be3fSMauro Carvalho Chehab $max_size_status = length($status); 139*52a4be3fSMauro Carvalho Chehab } 140*52a4be3fSMauro Carvalho Chehab if (length($a) > $max_size_arch) { 141*52a4be3fSMauro Carvalho Chehab $max_size_arch = length($a); 142*52a4be3fSMauro Carvalho Chehab } 143*52a4be3fSMauro Carvalho Chehab 144*52a4be3fSMauro Carvalho Chehab $status = "---" if ($status =~ m/^\.\.$/); 145*52a4be3fSMauro Carvalho Chehab 146*52a4be3fSMauro Carvalho Chehab $archs{$a} = 1; 147*52a4be3fSMauro Carvalho Chehab $arch_table{$a} = $status; 148*52a4be3fSMauro Carvalho Chehab next; 149*52a4be3fSMauro Carvalho Chehab } 150*52a4be3fSMauro Carvalho Chehab 151*52a4be3fSMauro Carvalho Chehab #Everything else is an error 152*52a4be3fSMauro Carvalho Chehab parse_error($file, $ln, "line is invalid", $_); 153*52a4be3fSMauro Carvalho Chehab } 154*52a4be3fSMauro Carvalho Chehab close IN; 155*52a4be3fSMauro Carvalho Chehab 156*52a4be3fSMauro Carvalho Chehab if (!$name) { 157*52a4be3fSMauro Carvalho Chehab parse_error($file, $ln, "Feature name not found", ""); 158*52a4be3fSMauro Carvalho Chehab return; 159*52a4be3fSMauro Carvalho Chehab } 160*52a4be3fSMauro Carvalho Chehab 161*52a4be3fSMauro Carvalho Chehab parse_error($file, $ln, "Subsystem not found", "") if (!$subsys); 162*52a4be3fSMauro Carvalho Chehab parse_error($file, $ln, "Kconfig not found", "") if (!$kconfig); 163*52a4be3fSMauro Carvalho Chehab parse_error($file, $ln, "Description not found", "") if (!$description); 164*52a4be3fSMauro Carvalho Chehab 165*52a4be3fSMauro Carvalho Chehab if (!%arch_table) { 166*52a4be3fSMauro Carvalho Chehab parse_error($file, $ln, "Architecture table not found", ""); 167*52a4be3fSMauro Carvalho Chehab return; 168*52a4be3fSMauro Carvalho Chehab } 169*52a4be3fSMauro Carvalho Chehab 170*52a4be3fSMauro Carvalho Chehab $data{$name}->{where} = $file; 171*52a4be3fSMauro Carvalho Chehab $data{$name}->{subsys} = $subsys; 172*52a4be3fSMauro Carvalho Chehab $data{$name}->{kconfig} = $kconfig; 173*52a4be3fSMauro Carvalho Chehab $data{$name}->{description} = $description; 174*52a4be3fSMauro Carvalho Chehab $data{$name}->{comments} = $comments; 175*52a4be3fSMauro Carvalho Chehab $data{$name}->{table} = \%arch_table; 176*52a4be3fSMauro Carvalho Chehab} 177*52a4be3fSMauro Carvalho Chehab 178*52a4be3fSMauro Carvalho Chehab# 179*52a4be3fSMauro Carvalho Chehab# Output feature(s) for a given architecture 180*52a4be3fSMauro Carvalho Chehab# 181*52a4be3fSMauro Carvalho Chehabsub output_arch_table { 182*52a4be3fSMauro Carvalho Chehab my $title = "Feature status on $arch architecture"; 183*52a4be3fSMauro Carvalho Chehab 184*52a4be3fSMauro Carvalho Chehab print "=" x length($title) . "\n"; 185*52a4be3fSMauro Carvalho Chehab print "$title\n"; 186*52a4be3fSMauro Carvalho Chehab print "=" x length($title) . "\n\n"; 187*52a4be3fSMauro Carvalho Chehab 188*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_subsys; 189*52a4be3fSMauro Carvalho Chehab print " "; 190*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_name; 191*52a4be3fSMauro Carvalho Chehab print " "; 192*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_kconfig; 193*52a4be3fSMauro Carvalho Chehab print " "; 194*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_status; 195*52a4be3fSMauro Carvalho Chehab print " "; 196*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_description; 197*52a4be3fSMauro Carvalho Chehab print "\n"; 198*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_subsys}s ", $h_subsys; 199*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_name}s ", $h_name; 200*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_kconfig}s ", $h_kconfig; 201*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_status}s ", $h_status; 202*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_description}s\n", $h_description; 203*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_subsys; 204*52a4be3fSMauro Carvalho Chehab print " "; 205*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_name; 206*52a4be3fSMauro Carvalho Chehab print " "; 207*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_kconfig; 208*52a4be3fSMauro Carvalho Chehab print " "; 209*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_status; 210*52a4be3fSMauro Carvalho Chehab print " "; 211*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_description; 212*52a4be3fSMauro Carvalho Chehab print "\n"; 213*52a4be3fSMauro Carvalho Chehab 214*52a4be3fSMauro Carvalho Chehab foreach my $name (sort { 215*52a4be3fSMauro Carvalho Chehab ($data{$a}->{subsys} cmp $data{$b}->{subsys}) || 216*52a4be3fSMauro Carvalho Chehab ($data{$a}->{name} cmp $data{$b}->{name}) 217*52a4be3fSMauro Carvalho Chehab } keys %data) { 218*52a4be3fSMauro Carvalho Chehab next if ($feat && $name ne $feat); 219*52a4be3fSMauro Carvalho Chehab 220*52a4be3fSMauro Carvalho Chehab my %arch_table = %{$data{$name}->{table}}; 221*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_subsys}s ", $data{$name}->{subsys}; 222*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_name}s ", $name; 223*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_kconfig}s ", $data{$name}->{kconfig}; 224*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_status}s ", $arch_table{$arch}; 225*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_description}s\n", $data{$name}->{description}; 226*52a4be3fSMauro Carvalho Chehab } 227*52a4be3fSMauro Carvalho Chehab 228*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_subsys; 229*52a4be3fSMauro Carvalho Chehab print " "; 230*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_name; 231*52a4be3fSMauro Carvalho Chehab print " "; 232*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_kconfig; 233*52a4be3fSMauro Carvalho Chehab print " "; 234*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_status; 235*52a4be3fSMauro Carvalho Chehab print " "; 236*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_description; 237*52a4be3fSMauro Carvalho Chehab print "\n"; 238*52a4be3fSMauro Carvalho Chehab} 239*52a4be3fSMauro Carvalho Chehab 240*52a4be3fSMauro Carvalho Chehab# 241*52a4be3fSMauro Carvalho Chehab# Output a feature on all architectures 242*52a4be3fSMauro Carvalho Chehab# 243*52a4be3fSMauro Carvalho Chehabsub output_feature { 244*52a4be3fSMauro Carvalho Chehab my $title = "Feature $feat"; 245*52a4be3fSMauro Carvalho Chehab 246*52a4be3fSMauro Carvalho Chehab print "=" x length($title) . "\n"; 247*52a4be3fSMauro Carvalho Chehab print "$title\n"; 248*52a4be3fSMauro Carvalho Chehab print "=" x length($title) . "\n\n"; 249*52a4be3fSMauro Carvalho Chehab 250*52a4be3fSMauro Carvalho Chehab print ":Subsystem: $data{$feat}->{subsys} \n" if ($data{$feat}->{subsys}); 251*52a4be3fSMauro Carvalho Chehab print ":Kconfig: $data{$feat}->{kconfig} \n" if ($data{$feat}->{kconfig}); 252*52a4be3fSMauro Carvalho Chehab 253*52a4be3fSMauro Carvalho Chehab my $desc = $data{$feat}->{description}; 254*52a4be3fSMauro Carvalho Chehab $desc =~ s/^([a-z])/\U$1/; 255*52a4be3fSMauro Carvalho Chehab $desc =~ s/\.?\s*//; 256*52a4be3fSMauro Carvalho Chehab print "\n$desc.\n\n"; 257*52a4be3fSMauro Carvalho Chehab 258*52a4be3fSMauro Carvalho Chehab my $com = $data{$feat}->{comments}; 259*52a4be3fSMauro Carvalho Chehab $com =~ s/^\s+//; 260*52a4be3fSMauro Carvalho Chehab $com =~ s/\s+$//; 261*52a4be3fSMauro Carvalho Chehab if ($com) { 262*52a4be3fSMauro Carvalho Chehab print "Comments\n"; 263*52a4be3fSMauro Carvalho Chehab print "--------\n\n"; 264*52a4be3fSMauro Carvalho Chehab print "$com\n\n"; 265*52a4be3fSMauro Carvalho Chehab } 266*52a4be3fSMauro Carvalho Chehab 267*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_arch; 268*52a4be3fSMauro Carvalho Chehab print " "; 269*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_status; 270*52a4be3fSMauro Carvalho Chehab print "\n"; 271*52a4be3fSMauro Carvalho Chehab 272*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_arch}s ", $h_arch; 273*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_status}s", $h_status . "\n"; 274*52a4be3fSMauro Carvalho Chehab 275*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_arch; 276*52a4be3fSMauro Carvalho Chehab print " "; 277*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_status; 278*52a4be3fSMauro Carvalho Chehab print "\n"; 279*52a4be3fSMauro Carvalho Chehab 280*52a4be3fSMauro Carvalho Chehab my %arch_table = %{$data{$feat}->{table}}; 281*52a4be3fSMauro Carvalho Chehab foreach my $arch (sort keys %arch_table) { 282*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_arch}s ", $arch; 283*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_status}s\n", $arch_table{$arch}; 284*52a4be3fSMauro Carvalho Chehab } 285*52a4be3fSMauro Carvalho Chehab 286*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_arch; 287*52a4be3fSMauro Carvalho Chehab print " "; 288*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_status; 289*52a4be3fSMauro Carvalho Chehab print "\n"; 290*52a4be3fSMauro Carvalho Chehab} 291*52a4be3fSMauro Carvalho Chehab 292*52a4be3fSMauro Carvalho Chehab# 293*52a4be3fSMauro Carvalho Chehab# Output all features for all architectures 294*52a4be3fSMauro Carvalho Chehab# 295*52a4be3fSMauro Carvalho Chehab 296*52a4be3fSMauro Carvalho Chehabsub matrix_lines { 297*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_subsys; 298*52a4be3fSMauro Carvalho Chehab print " "; 299*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_name; 300*52a4be3fSMauro Carvalho Chehab print " "; 301*52a4be3fSMauro Carvalho Chehab 302*52a4be3fSMauro Carvalho Chehab foreach my $arch (sort keys %archs) { 303*52a4be3fSMauro Carvalho Chehab my $len = $max_size_status; 304*52a4be3fSMauro Carvalho Chehab 305*52a4be3fSMauro Carvalho Chehab $len = length($arch) if ($len < length($arch)); 306*52a4be3fSMauro Carvalho Chehab 307*52a4be3fSMauro Carvalho Chehab print "=" x $len; 308*52a4be3fSMauro Carvalho Chehab print " "; 309*52a4be3fSMauro Carvalho Chehab } 310*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_kconfig; 311*52a4be3fSMauro Carvalho Chehab print " "; 312*52a4be3fSMauro Carvalho Chehab print "=" x $max_size_description; 313*52a4be3fSMauro Carvalho Chehab print "\n"; 314*52a4be3fSMauro Carvalho Chehab} 315*52a4be3fSMauro Carvalho Chehab 316*52a4be3fSMauro Carvalho Chehabsub output_matrix { 317*52a4be3fSMauro Carvalho Chehab 318*52a4be3fSMauro Carvalho Chehab my $title = "Feature List (feature x architecture)"; 319*52a4be3fSMauro Carvalho Chehab 320*52a4be3fSMauro Carvalho Chehab print "=" x length($title) . "\n"; 321*52a4be3fSMauro Carvalho Chehab print "$title\n"; 322*52a4be3fSMauro Carvalho Chehab print "=" x length($title) . "\n\n"; 323*52a4be3fSMauro Carvalho Chehab 324*52a4be3fSMauro Carvalho Chehab matrix_lines; 325*52a4be3fSMauro Carvalho Chehab 326*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_subsys}s ", $h_subsys; 327*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_name}s ", $h_name; 328*52a4be3fSMauro Carvalho Chehab 329*52a4be3fSMauro Carvalho Chehab foreach my $arch (sort keys %archs) { 330*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_status}s ", $arch; 331*52a4be3fSMauro Carvalho Chehab } 332*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_kconfig}s ", $h_kconfig; 333*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_description}s\n", $h_description; 334*52a4be3fSMauro Carvalho Chehab 335*52a4be3fSMauro Carvalho Chehab matrix_lines; 336*52a4be3fSMauro Carvalho Chehab 337*52a4be3fSMauro Carvalho Chehab foreach my $name (sort { 338*52a4be3fSMauro Carvalho Chehab ($data{$a}->{subsys} cmp $data{$b}->{subsys}) || 339*52a4be3fSMauro Carvalho Chehab ($data{$a}->{name} cmp $data{$b}->{name}) 340*52a4be3fSMauro Carvalho Chehab } keys %data) { 341*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_subsys}s ", $data{$name}->{subsys}; 342*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_name}s ", $name; 343*52a4be3fSMauro Carvalho Chehab 344*52a4be3fSMauro Carvalho Chehab my %arch_table = %{$data{$name}->{table}}; 345*52a4be3fSMauro Carvalho Chehab 346*52a4be3fSMauro Carvalho Chehab foreach my $arch (sort keys %arch_table) { 347*52a4be3fSMauro Carvalho Chehab my $len = $max_size_status; 348*52a4be3fSMauro Carvalho Chehab 349*52a4be3fSMauro Carvalho Chehab $len = length($arch) if ($len < length($arch)); 350*52a4be3fSMauro Carvalho Chehab 351*52a4be3fSMauro Carvalho Chehab printf "%-${len}s ", $arch_table{$arch}; 352*52a4be3fSMauro Carvalho Chehab } 353*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_kconfig}s ", $data{$name}->{kconfig}; 354*52a4be3fSMauro Carvalho Chehab printf "%-${max_size_description}s\n", $data{$name}->{description}; 355*52a4be3fSMauro Carvalho Chehab } 356*52a4be3fSMauro Carvalho Chehab 357*52a4be3fSMauro Carvalho Chehab matrix_lines; 358*52a4be3fSMauro Carvalho Chehab} 359*52a4be3fSMauro Carvalho Chehab 360*52a4be3fSMauro Carvalho Chehab 361*52a4be3fSMauro Carvalho Chehab# 362*52a4be3fSMauro Carvalho Chehab# Parses all feature files located at $prefix dir 363*52a4be3fSMauro Carvalho Chehab# 364*52a4be3fSMauro Carvalho Chehabfind({wanted =>\&parse_feat, no_chdir => 1}, $prefix); 365*52a4be3fSMauro Carvalho Chehab 366*52a4be3fSMauro Carvalho Chehabprint STDERR Data::Dumper->Dump([\%data], [qw(*data)]) if ($debug); 367*52a4be3fSMauro Carvalho Chehab 368*52a4be3fSMauro Carvalho Chehab# 369*52a4be3fSMauro Carvalho Chehab# Handles the command 370*52a4be3fSMauro Carvalho Chehab# 371*52a4be3fSMauro Carvalho Chehabif ($cmd eq "current") { 372*52a4be3fSMauro Carvalho Chehab $arch = qx(uname -m | sed 's/x86_64/x86/' | sed 's/i386/x86/'); 373*52a4be3fSMauro Carvalho Chehab $arch =~s/\s+$//; 374*52a4be3fSMauro Carvalho Chehab} 375*52a4be3fSMauro Carvalho Chehab 376*52a4be3fSMauro Carvalho Chehabif ($cmd ne "validate") { 377*52a4be3fSMauro Carvalho Chehab if ($arch) { 378*52a4be3fSMauro Carvalho Chehab output_arch_table; 379*52a4be3fSMauro Carvalho Chehab } elsif ($feat) { 380*52a4be3fSMauro Carvalho Chehab output_feature; 381*52a4be3fSMauro Carvalho Chehab } else { 382*52a4be3fSMauro Carvalho Chehab output_matrix; 383*52a4be3fSMauro Carvalho Chehab } 384*52a4be3fSMauro Carvalho Chehab} 385*52a4be3fSMauro Carvalho Chehab 386*52a4be3fSMauro Carvalho Chehab__END__ 387*52a4be3fSMauro Carvalho Chehab 388*52a4be3fSMauro Carvalho Chehab=head1 NAME 389*52a4be3fSMauro Carvalho Chehab 390*52a4be3fSMauro Carvalho Chehabget_feat.pl - parse the Linux Feature files and produce a ReST book. 391*52a4be3fSMauro Carvalho Chehab 392*52a4be3fSMauro Carvalho Chehab=head1 SYNOPSIS 393*52a4be3fSMauro Carvalho Chehab 394*52a4be3fSMauro Carvalho ChehabB<get_feat.pl> [--debug] [--man] [--help] [--dir=<dir>] 395*52a4be3fSMauro Carvalho Chehab [--arch=<arch>] [--feat=<feature>] <COMAND> [<ARGUMENT>] 396*52a4be3fSMauro Carvalho Chehab 397*52a4be3fSMauro Carvalho ChehabWhere <COMMAND> can be: 398*52a4be3fSMauro Carvalho Chehab 399*52a4be3fSMauro Carvalho Chehab=over 8 400*52a4be3fSMauro Carvalho Chehab 401*52a4be3fSMauro Carvalho ChehabB<current> - output features for this machine's architecture 402*52a4be3fSMauro Carvalho Chehab 403*52a4be3fSMauro Carvalho ChehabB<rest> - output features in ReST markup language 404*52a4be3fSMauro Carvalho Chehab 405*52a4be3fSMauro Carvalho ChehabB<validate> - validate the feature contents 406*52a4be3fSMauro Carvalho Chehab 407*52a4be3fSMauro Carvalho Chehab=back 408*52a4be3fSMauro Carvalho Chehab 409*52a4be3fSMauro Carvalho Chehab=head1 OPTIONS 410*52a4be3fSMauro Carvalho Chehab 411*52a4be3fSMauro Carvalho Chehab=over 8 412*52a4be3fSMauro Carvalho Chehab 413*52a4be3fSMauro Carvalho Chehab=item B<--arch> 414*52a4be3fSMauro Carvalho Chehab 415*52a4be3fSMauro Carvalho ChehabOutput features for an specific architecture, optionally filtering for 416*52a4be3fSMauro Carvalho Chehaba single specific feature. 417*52a4be3fSMauro Carvalho Chehab 418*52a4be3fSMauro Carvalho Chehab=item B<--feat> 419*52a4be3fSMauro Carvalho Chehab 420*52a4be3fSMauro Carvalho ChehabOutput features for a single specific architecture. 421*52a4be3fSMauro Carvalho Chehab 422*52a4be3fSMauro Carvalho Chehab=item B<--dir> 423*52a4be3fSMauro Carvalho Chehab 424*52a4be3fSMauro Carvalho ChehabChanges the location of the Feature files. By default, it uses 425*52a4be3fSMauro Carvalho Chehabthe Documentation/features directory. 426*52a4be3fSMauro Carvalho Chehab 427*52a4be3fSMauro Carvalho Chehab=item B<--debug> 428*52a4be3fSMauro Carvalho Chehab 429*52a4be3fSMauro Carvalho ChehabPut the script in verbose mode, useful for debugging. Can be called multiple 430*52a4be3fSMauro Carvalho Chehabtimes, to increase verbosity. 431*52a4be3fSMauro Carvalho Chehab 432*52a4be3fSMauro Carvalho Chehab=item B<--help> 433*52a4be3fSMauro Carvalho Chehab 434*52a4be3fSMauro Carvalho ChehabPrints a brief help message and exits. 435*52a4be3fSMauro Carvalho Chehab 436*52a4be3fSMauro Carvalho Chehab=item B<--man> 437*52a4be3fSMauro Carvalho Chehab 438*52a4be3fSMauro Carvalho ChehabPrints the manual page and exits. 439*52a4be3fSMauro Carvalho Chehab 440*52a4be3fSMauro Carvalho Chehab=back 441*52a4be3fSMauro Carvalho Chehab 442*52a4be3fSMauro Carvalho Chehab=head1 DESCRIPTION 443*52a4be3fSMauro Carvalho Chehab 444*52a4be3fSMauro Carvalho ChehabParse the Linux feature files from Documentation/features (by default), 445*52a4be3fSMauro Carvalho Chehaboptionally producing results at ReST format. 446*52a4be3fSMauro Carvalho Chehab 447*52a4be3fSMauro Carvalho ChehabIt supports output data per architecture, per feature or a 448*52a4be3fSMauro Carvalho Chehabfeature x arch matrix. 449*52a4be3fSMauro Carvalho Chehab 450*52a4be3fSMauro Carvalho ChehabWhen used with B<rest> command, it will use either one of the tree formats: 451*52a4be3fSMauro Carvalho Chehab 452*52a4be3fSMauro Carvalho ChehabIf neither B<--arch> or B<--feature> arguments are used, it will output a 453*52a4be3fSMauro Carvalho Chehabmatrix with features per architecture. 454*52a4be3fSMauro Carvalho Chehab 455*52a4be3fSMauro Carvalho ChehabIf B<--arch> argument is used, it will output the features availability for 456*52a4be3fSMauro Carvalho Chehaba given architecture. 457*52a4be3fSMauro Carvalho Chehab 458*52a4be3fSMauro Carvalho ChehabIf B<--feat> argument is used, it will output the content of the feature 459*52a4be3fSMauro Carvalho Chehabfile using ReStructured Text markup. 460*52a4be3fSMauro Carvalho Chehab 461*52a4be3fSMauro Carvalho Chehab=head1 BUGS 462*52a4be3fSMauro Carvalho Chehab 463*52a4be3fSMauro Carvalho ChehabReport bugs to Mauro Carvalho Chehab <mchehab+samsung@kernel.org> 464*52a4be3fSMauro Carvalho Chehab 465*52a4be3fSMauro Carvalho Chehab=head1 COPYRIGHT 466*52a4be3fSMauro Carvalho Chehab 467*52a4be3fSMauro Carvalho ChehabCopyright (c) 2019 by Mauro Carvalho Chehab <mchehab+samsung@kernel.org>. 468*52a4be3fSMauro Carvalho Chehab 469*52a4be3fSMauro Carvalho ChehabLicense GPLv2: GNU GPL version 2 <http://gnu.org/licenses/gpl.html>. 470*52a4be3fSMauro Carvalho Chehab 471*52a4be3fSMauro Carvalho ChehabThis is free software: you are free to change and redistribute it. 472*52a4be3fSMauro Carvalho ChehabThere is NO WARRANTY, to the extent permitted by law. 473*52a4be3fSMauro Carvalho Chehab 474*52a4be3fSMauro Carvalho Chehab=cut 475