]> git.pld-linux.org Git - packages/kernel.git/blame - kernel-config-sort.pl
- up to 5.11.8
[packages/kernel.git] / kernel-config-sort.pl
CommitLineData
ff21692c 1#!/usr/bin/perl
2#
3# Script used to sort kernel-*.config files.
4# Usage:
5# ./kernel-config-sort.pl ../BUILD/linux-2.6.*/ kernel-multiarch.config
6#
7# ./kernel-config-sort.pl ../BUILD/linux-2.6.*/ -a x86 kernel-x86_84.config
8#
9use strict;
10use warnings;
11
12my $dir = ( shift @ARGV ) || ".";
13my $arch;
14if ( $ARGV[0] eq "-a" ) {
15 shift @ARGV;
16 $arch = shift @ARGV;
17}
18my $old_dir = $ENV{PWD};
19chdir $dir;
20
21my @Kconfig_list;
22my @Kconfig_arch;
23
24sub look_in
25{
26 my $parent = shift;
27 my @files = glob $parent."*";
28 foreach ( @files ) {
29 if ( -d ) {
30 if ( $_ eq "Documentation" or $_ eq "build-done" ) {
31 warn "Skipping $_\n";
32 next;
33 }
34 look_in( $_ . '/' );
35 next;
36 }
37 if ( m#^.*/Kconfig# ) {
38 if ( m#^arch/# ) {
39 push @Kconfig_arch, $_;
40 } else {
41 push @Kconfig_list, $_;
42 }
43 }
44 }
45}
46
47if ( $arch ) {
48 push @Kconfig_list, "arch/$arch/Kconfig";
49} else {
50 look_in("");
51 push @Kconfig_list, @Kconfig_arch;
52}
53
54my %byFile;
55my %byName;
56
57sub add_Kconfig
58{
59 my $file = shift;
60
61 my @maybe_add_source;
62 my @config_list;
63
64 unless ( -r $file ) {
65 warn "FILE $file does not exist\n";
66 return;
67 }
68
69 open my $f_in, '<', $file;
70 while ( <$f_in> ) {
71 if ( /^\s?(?:menu)?config\s+(.*?)`?\s*$/ ) {
72 if ( $byName{ $1 } ) {
73 warn "Warning: $file: $1 already defined in $byName{ $1 }\n";
74 next;
75 }
76 push @config_list, [ 'o', $1 ];
77 next;
78 }
79 if ( /^\s?comment\s+"(.*?)"\s*$/ ) {
80 push @config_list, [ 'c', $1 ];
81 next;
82 }
83 if ( /^\s*source\s+"(\S+?)"\s*$/ or /^\s*source\s+(\S+?)\s*$/) {
84 push @maybe_add_source, $1;
85 push @config_list, [ 's', $1 ];
86 next;
87 }
88 }
89 close $f_in;
90
91 $byFile{ $file } = \@config_list;
92
93 {
94 my %add;
95 @add{ @maybe_add_source } = ();
96 foreach ( @Kconfig_list ) {
97 delete $add{ $_ } if exists $add{ $_ };
98 }
99 if ( keys %add ) {
100 #warn "Adding more source files: " . ( join ", ", sort keys %add ) ."\n";
101 push @Kconfig_list, sort keys %add;
102 }
103 }
104}
105
106{
107 my $i;
108 for ( $i = 0; $i < scalar @Kconfig_list; $i++ ) {
109 my $file = $Kconfig_list[ $i ];
110 add_Kconfig( $file );
111 }
112}
113
114my $arch_specific;
115unless ( $arch ) {
116 my @arch_specific;
117
118 foreach my $f ( sort keys %byFile ) {
119 next unless $f =~ /^arch/;
120 foreach my $line ( @{ $byFile{ $f } } ) {
121 push @arch_specific, $line->[1]
122 if $line->[0] eq 'o';
123 }
124 delete $byFile{ $f };
125 }
126
127 my @as = map { [ 'o', $_ ] } sort @arch_specific;
128 $arch_specific = \@as;
129}
130
131chdir $old_dir;
132
133my $out_file = $ARGV[ $#ARGV ];
134
135my %setOptions;
136
137my $allowed_name = qr/[A-Za-z0-9_]+/;
138my $comment = "";
139while ( <> ) {
140 if ( /^#\*/ ) {
141 $comment .= $_;
142 next;
143 }
144 my $opt;
145 if ( /^# CONFIG_($allowed_name) is not set$/ ) {
146 $opt = $1;
147 }
148 if ( /^(?:CONFIG_)?($allowed_name)[=\s]/ ) {
149 $opt = $1;
150 }
151 unless ( $opt ) {
152 if ( /\S/ and !/^#-/ ) {
153 warn "Ignored line: $_";
154 }
155 next;
156 }
157
158 if ( exists $setOptions{ $opt } ) {
159 die "OPTION $opt REDEFINED";
160 }
161 chomp;
162 $setOptions{ $opt } = $comment . $_;
163 $comment = "";
164}
165
166sub file_out
167{
168 my $file = shift;
169 my $any_out = 0;
170 my @out;
171 push @out, "#-", "#- *** FILE: $file ***", "#-";
172 my $file_lines = $byFile{ $file };
173
174 foreach my $line ( @{$file_lines} ) {
175 my ($type, $data) = @$line;
176 if ( $type eq 'o' ) {
177 if ( exists $setOptions{ $data } ) {
178 push @out, $setOptions{ $data };
179 delete $setOptions{ $data };
180 $any_out = 1;
181 }
182 } elsif ( $type eq 'c' ) {
183 push @out, "#- $data";
184 } elsif ( $type eq 's' ) {
185 push @out, "#- file $data goes here";
186 }
187 }
188 if ( $any_out ) {
189 return "\n" . ( join "\n", @out ) . "\n";
190 }
191 return "";
192}
193
194*FILE_OUT = \*STDOUT;
195if ( $out_file ) {
196 open FILE_OUT, '>', $out_file;
197}
198unless ( $arch ) {
199 my @out;
200 foreach my $f ( sort keys %byFile ) {
201 push @out, file_out( $f );
202 }
203
204 my $as_name = "arch/* - ARCH SPECIFIC OPTIONS";
205 $byFile{ $as_name } = $arch_specific;
206 unshift @out, file_out( $as_name );
207
208 print FILE_OUT @out;
209} else {
210 foreach my $f ( sort keys %byFile ) {
211 print FILE_OUT file_out( $f );
212 }
213}
214
215if ( keys %setOptions ) {
216 print FILE_OUT "\n#-\n#- *** PROBABLY REMOVED OPTIONS ***\n#-\n";
217 foreach my $k ( sort keys %setOptions ) {
218 print FILE_OUT $setOptions{ $k } . "\n";
219 }
220}
This page took 0.083189 seconds and 4 git commands to generate.