Commit 364212fd authored by Steven Rostedt's avatar Steven Rostedt Committed by Steven Rostedt

kconfig/streamline-config.pl: Fix parsing Makefile with variables

Thomas Lange reported that when he did a 'make localmodconfig', his
config was missing the brcmsmac driver, even though he had the module
loaded.

Looking into this, I found the file:
drivers/net/wireless/brcm80211/brcmsmac/Makefile
had the following in the Makefile:

MODULEPFX := brcmsmac

obj-$(CONFIG_BRCMSMAC)  += $(MODULEPFX).o

The way streamline-config.pl works, is parsing all the
 obj-$(CONFIG_FOO) += foo.o
lines to find that CONFIG_FOO belongs to the module foo.ko.

But in this case, the brcmsmac.o was not used, but a variable in its place.

By changing streamline-config.pl to remember defined variables in Makefiles
and substituting them when they are used in the obj-X lines, allows
Thomas (and others) to have their brcmsmac module stay configured
when it is loaded and running "make localmodconfig".
Reported-by: default avatarThomas Lange <thomas-lange2@gmx.de>
Tested-by: default avatarThomas Lange <thomas-lange2@gmx.de>
Cc: Arend van Spriel <arend@broadcom.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent d060d963
...@@ -250,10 +250,33 @@ if ($kconfig) { ...@@ -250,10 +250,33 @@ if ($kconfig) {
read_kconfig($kconfig); read_kconfig($kconfig);
} }
sub convert_vars {
my ($line, %vars) = @_;
my $process = "";
while ($line =~ s/^(.*?)(\$\((.*?)\))//) {
my $start = $1;
my $variable = $2;
my $var = $3;
if (defined($vars{$var})) {
$process .= $start . $vars{$var};
} else {
$process .= $start . $variable;
}
}
$process .= $line;
return $process;
}
# Read all Makefiles to map the configs to the objects # Read all Makefiles to map the configs to the objects
foreach my $makefile (@makefiles) { foreach my $makefile (@makefiles) {
my $line = ""; my $line = "";
my %make_vars;
open(MIN,$makefile) || die "Can't open $makefile"; open(MIN,$makefile) || die "Can't open $makefile";
while (<MIN>) { while (<MIN>) {
...@@ -270,10 +293,16 @@ foreach my $makefile (@makefiles) { ...@@ -270,10 +293,16 @@ foreach my $makefile (@makefiles) {
my $objs; my $objs;
$_ = convert_vars($_, %make_vars);
# collect objects after obj-$(CONFIG_FOO_BAR) # collect objects after obj-$(CONFIG_FOO_BAR)
if (/obj-\$\((CONFIG_[^\)]*)\)\s*[+:]?=\s*(.*)/) { if (/obj-\$\((CONFIG_[^\)]*)\)\s*[+:]?=\s*(.*)/) {
$var = $1; $var = $1;
$objs = $2; $objs = $2;
# check if variables are set
} elsif (/^\s*(\S+)\s*[:]?=\s*(.*\S)/) {
$make_vars{$1} = $2;
} }
if (defined($objs)) { if (defined($objs)) {
foreach my $obj (split /\s+/,$objs) { foreach my $obj (split /\s+/,$objs) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment