Skip to content

Commit

Permalink
kconfig/streamline-config.pl: Fix parsing Makefile with variables
Browse files Browse the repository at this point in the history
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: Thomas Lange <thomas-lange2@gmx.de>
Tested-by: Thomas Lange <thomas-lange2@gmx.de>
Cc: Arend van Spriel <arend@broadcom.com>
Cc: stable@vger.kernel.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed Jan 13, 2012
1 parent d060d96 commit 364212f
Showing 1 changed file with 29 additions and 0 deletions.
29 changes: 29 additions & 0 deletions scripts/kconfig/streamline_config.pl
Original file line number Diff line number Diff line change
Expand Up @@ -250,10 +250,33 @@ sub read_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
foreach my $makefile (@makefiles) {

my $line = "";
my %make_vars;

open(MIN,$makefile) || die "Can't open $makefile";
while (<MIN>) {
Expand All @@ -270,10 +293,16 @@ sub read_kconfig {

my $objs;

$_ = convert_vars($_, %make_vars);

# collect objects after obj-$(CONFIG_FOO_BAR)
if (/obj-\$\((CONFIG_[^\)]*)\)\s*[+:]?=\s*(.*)/) {
$var = $1;
$objs = $2;

# check if variables are set
} elsif (/^\s*(\S+)\s*[:]?=\s*(.*\S)/) {
$make_vars{$1} = $2;
}
if (defined($objs)) {
foreach my $obj (split /\s+/,$objs) {
Expand Down

0 comments on commit 364212f

Please sign in to comment.