#!/usr/bin/perl |
#!/usr/bin/perl |
use strict; |
use strict; |
|
my %preconfig; |
my %package; |
my %package; |
|
my %srcpackage; |
my %category; |
my %category; |
|
|
sub parse_target_metadata() { |
sub parse_target_metadata() { |
my ($target, @target, $profile); |
my ($target, @target, $profile); |
while (<>) { |
while (<>) { |
chomp; |
chomp; |
/^Target:\s*((.+)-(\d+\.\d+))\s*$/ and do { |
/^Target:\s*((.+)-(\d+\.\d+))\s*$/ and do { |
my $conf = uc $3.'_'.$2; |
my $conf = uc $3.'_'.$2; |
$conf =~ tr/\.-/__/; |
$conf =~ tr/\.-/__/; |
$target = { |
$target = { |
id => $1, |
id => $1, |
conf => $conf, |
conf => $conf, |
board => $2, |
board => $2, |
kernel => $3, |
kernel => $3, |
profiles => [] |
profiles => [] |
}; |
}; |
push @target, $target; |
push @target, $target; |
}; |
}; |
/^Target-Name:\s*(.+)\s*$/ and $target->{name} = $1; |
/^Target-Name:\s*(.+)\s*$/ and $target->{name} = $1; |
/^Target-Path:\s*(.+)\s*$/ and $target->{path} = $1; |
/^Target-Path:\s*(.+)\s*$/ and $target->{path} = $1; |
/^Target-Arch:\s*(.+)\s*$/ and $target->{arch} = $1; |
/^Target-Arch:\s*(.+)\s*$/ and $target->{arch} = $1; |
/^Target-Features:\s*(.+)\s*$/ and $target->{features} = [ split(/\s+/, $1) ]; |
/^Target-Features:\s*(.+)\s*$/ and $target->{features} = [ split(/\s+/, $1) ]; |
/^Target-Description:/ and do { |
/^Target-Description:/ and do { |
my $desc; |
my $desc; |
while (<>) { |
while (<>) { |
last if /^@@/; |
last if /^@@/; |
$desc .= $_; |
$desc .= $_; |
} |
} |
$target->{desc} = $desc; |
$target->{desc} = $desc; |
}; |
}; |
/^Linux-Version:\s*(.+)\s*$/ and $target->{version} = $1; |
/^Linux-Version:\s*(.+)\s*$/ and $target->{version} = $1; |
/^Linux-Release:\s*(.+)\s*$/ and $target->{release} = $1; |
/^Linux-Release:\s*(.+)\s*$/ and $target->{release} = $1; |
/^Linux-Kernel-Arch:\s*(.+)\s*$/ and $target->{karch} = $1; |
/^Linux-Kernel-Arch:\s*(.+)\s*$/ and $target->{karch} = $1; |
/^Default-Packages:\s*(.+)\s*$/ and $target->{packages} = [ split(/\s+/, $1) ]; |
/^Default-Packages:\s*(.+)\s*$/ and $target->{packages} = [ split(/\s+/, $1) ]; |
/^Target-Profile:\s*(.+)\s*$/ and do { |
/^Target-Profile:\s*(.+)\s*$/ and do { |
$profile = { |
$profile = { |
id => $1, |
id => $1, |
name => $1, |
name => $1, |
packages => [] |
packages => [] |
}; |
}; |
push @{$target->{profiles}}, $profile; |
push @{$target->{profiles}}, $profile; |
}; |
}; |
/^Target-Profile-Name:\s*(.+)\s*$/ and $profile->{name} = $1; |
/^Target-Profile-Name:\s*(.+)\s*$/ and $profile->{name} = $1; |
/^Target-Profile-Packages:\s*(.*)\s*$/ and $profile->{packages} = [ split(/\s+/, $1) ]; |
/^Target-Profile-Packages:\s*(.*)\s*$/ and $profile->{packages} = [ split(/\s+/, $1) ]; |
/^Target-Profile-Description:/ and do { |
/^Target-Profile-Description:/ and do { |
my $desc; |
my $desc; |
while (<>) { |
while (<>) { |
last if /^@@/; |
last if /^@@/; |
$desc .= $_; |
$desc .= $_; |
} |
} |
$profile->{desc} = $desc; |
$profile->{desc} = $desc; |
}; |
}; |
/^Target-Profile-Kconfig:/ and $profile->{kconfig} = 1; |
/^Target-Profile-Kconfig:/ and $profile->{kconfig} = 1; |
} |
} |
foreach my $target (@target) { |
foreach my $target (@target) { |
@{$target->{profiles}} > 0 or $target->{profiles} = [ |
@{$target->{profiles}} > 0 or $target->{profiles} = [ |
{ |
{ |
id => 'Default', |
id => 'Default', |
name => 'Default', |
name => 'Default', |
packages => [] |
packages => [] |
} |
} |
]; |
]; |
} |
} |
return @target; |
return @target; |
} |
} |
|
|
sub parse_package_metadata() { |
sub parse_package_metadata() { |
my $pkg; |
my $pkg; |
my $makefile; |
my $makefile; |
|
my $preconfig; |
my $src; |
my $src; |
while (<>) { |
while (<>) { |
chomp; |
chomp; |
/^Source-Makefile: \s*(.+\/([^\/]+)\/Makefile)\s*$/ and do { |
/^Source-Makefile: \s*(.+\/([^\/]+)\/Makefile)\s*$/ and do { |
$makefile = $1; |
$makefile = $1; |
$src = $2; |
$src = $2; |
|
$srcpackage{$src} = []; |
undef $pkg; |
undef $pkg; |
}; |
}; |
/^Package: \s*(.+)\s*$/ and do { |
/^Package:\s*(.+?)\s*$/ and do { |
$pkg = {}; |
$pkg = {}; |
$pkg->{src} = $src; |
$pkg->{src} = $src; |
$pkg->{makefile} = $makefile; |
$pkg->{makefile} = $makefile; |
$pkg->{name} = $1; |
$pkg->{name} = $1; |
$pkg->{default} = "m if ALL"; |
$pkg->{default} = "m if ALL"; |
|
$pkg->{depends} = []; |
|
$pkg->{builddepends} = []; |
$package{$1} = $pkg; |
$package{$1} = $pkg; |
|
push @{$srcpackage{$src}}, $pkg; |
}; |
}; |
/^Version: \s*(.+)\s*$/ and $pkg->{version} = $1; |
/^Version: \s*(.+)\s*$/ and $pkg->{version} = $1; |
/^Title: \s*(.+)\s*$/ and $pkg->{title} = $1; |
/^Title: \s*(.+)\s*$/ and $pkg->{title} = $1; |
/^Menu: \s*(.+)\s*$/ and $pkg->{menu} = $1; |
/^Menu: \s*(.+)\s*$/ and $pkg->{menu} = $1; |
/^Submenu: \s*(.+)\s*$/ and $pkg->{submenu} = $1; |
/^Submenu: \s*(.+)\s*$/ and $pkg->{submenu} = $1; |
/^Submenu-Depends: \s*(.+)\s*$/ and $pkg->{submenudep} = $1; |
/^Submenu-Depends: \s*(.+)\s*$/ and $pkg->{submenudep} = $1; |
/^Default: \s*(.+)\s*$/ and $pkg->{default} = $1; |
/^Default: \s*(.+)\s*$/ and $pkg->{default} = $1; |
/^Provides: \s*(.+)\s*$/ and do { |
/^Provides: \s*(.+)\s*$/ and do { |
my @vpkg = split /\s+/, $1; |
my @vpkg = split /\s+/, $1; |
foreach my $vpkg (@vpkg) { |
foreach my $vpkg (@vpkg) { |
$package{$vpkg} or $package{$vpkg} = { vdepends => [] }; |
$package{$vpkg} or $package{$vpkg} = { vdepends => [] }; |
push @{$package{$vpkg}->{vdepends}}, $pkg->{name}; |
push @{$package{$vpkg}->{vdepends}}, $pkg->{name}; |
} |
} |
}; |
}; |
/^Depends: \s*(.+)\s*$/ and do { |
/^Depends: \s*(.+)\s*$/ and do { |
my @dep = split /\s+/, $1; |
my @dep = split /\s+/, $1; |
$pkg->{depends} = \@dep; |
$pkg->{depends} = \@dep; |
}; |
}; |
|
/^Build-Depends: \s*(.+)\s*$/ and do { |
|
my @dep = split /\s+/, $1; |
|
$pkg->{builddepends} = \@dep; |
|
}; |
/^Category: \s*(.+)\s*$/ and do { |
/^Category: \s*(.+)\s*$/ and do { |
$pkg->{category} = $1; |
$pkg->{category} = $1; |
defined $category{$1} or $category{$1} = {}; |
defined $category{$1} or $category{$1} = {}; |
defined $category{$1}->{$src} or $category{$1}->{$src} = []; |
defined $category{$1}->{$src} or $category{$1}->{$src} = []; |
push @{$category{$1}->{$src}}, $pkg; |
push @{$category{$1}->{$src}}, $pkg; |
}; |
}; |
/^Description: \s*(.*)\s*$/ and do { |
/^Description: \s*(.*)\s*$/ and do { |
my $desc = "\t\t$1\n\n"; |
my $desc = "\t\t$1\n\n"; |
my $line; |
my $line; |
while ($line = <>) { |
while ($line = <>) { |
last if $line =~ /^@@/; |
last if $line =~ /^@@/; |
$desc .= "\t\t$line"; |
$desc .= "\t\t$line"; |
} |
} |
$pkg->{description} = $desc; |
$pkg->{description} = $desc; |
}; |
}; |
/^Config: \s*(.*)\s*$/ and do { |
/^Config: \s*(.*)\s*$/ and do { |
my $conf = "$1\n"; |
my $conf = "$1\n"; |
my $line; |
my $line; |
while ($line = <>) { |
while ($line = <>) { |
last if $line =~ /^@@/; |
last if $line =~ /^@@/; |
$conf .= "$line"; |
$conf .= "$line"; |
} |
} |
$pkg->{config} = $conf; |
$pkg->{config} = $conf; |
} |
}; |
|
/^Prereq-Check:/ and $pkg->{prereq} = 1; |
|
/^Preconfig:\s*(.+)\s*$/ and do { |
|
my $pkgname = $pkg->{name}; |
|
$preconfig{$pkgname} or $preconfig{$pkgname} = []; |
|
$preconfig = { |
|
id => $1 |
|
}; |
|
push @{$preconfig{$pkgname}}, $preconfig; |
|
}; |
|
/^Preconfig-Type:\s*(.*?)\s*$/ and $preconfig->{type} = $1; |
|
/^Preconfig-Label:\s*(.*?)\s*$/ and $preconfig->{label} = $1; |
|
/^Preconfig-Default:\s*(.*?)\s*$/ and $preconfig->{default} = $1; |
} |
} |
return %category; |
return %category; |
} |
} |
|
|
|
|
sub gen_target_mk() { |
sub gen_target_mk() { |
my @target = parse_target_metadata(); |
my @target = parse_target_metadata(); |
|
|
@target = sort { |
@target = sort { |
$a->{id} cmp $b->{id} |
$a->{id} cmp $b->{id} |
} @target; |
} @target; |
|
|
foreach my $target (@target) { |
foreach my $target (@target) { |
my ($profiles_def, $profiles_eval); |
my ($profiles_def, $profiles_eval); |
my $conf = uc $target->{kernel}.'_'.$target->{board}; |
my $conf = uc $target->{kernel}.'_'.$target->{board}; |
$conf =~ tr/\.-/__/; |
$conf =~ tr/\.-/__/; |
|
|
foreach my $profile (@{$target->{profiles}}) { |
foreach my $profile (@{$target->{profiles}}) { |
$profiles_def .= " |
$profiles_def .= " |
define Profile/$conf\_$profile->{id} |
define Profile/$conf\_$profile->{id} |
ID:=$profile->{id} |
ID:=$profile->{id} |
NAME:=$profile->{name} |
NAME:=$profile->{name} |
PACKAGES:=".join(" ", @{$profile->{packages}})."\n"; |
PACKAGES:=".join(" ", @{$profile->{packages}})."\n"; |
$profile->{kconfig} and $profiles_def .= " KCONFIG:=1\n"; |
$profile->{kconfig} and $profiles_def .= " KCONFIG:=1\n"; |
$profiles_def .= " endef"; |
$profiles_def .= " endef"; |
$profiles_eval .= " |
$profiles_eval .= " |
\$(eval \$(call AddProfile,$conf\_$profile->{id}))" |
\$(eval \$(call AddProfile,$conf\_$profile->{id}))" |
} |
} |
print " |
print " |
ifeq (\$(CONFIG_LINUX_$conf),y) |
ifeq (\$(CONFIG_LINUX_$conf),y) |
define Target |
define Target |
KERNEL:=$target->{kernel} |
KERNEL:=$target->{kernel} |
BOARD:=$target->{board} |
BOARD:=$target->{board} |
BOARDNAME:=$target->{name} |
BOARDNAME:=$target->{name} |
LINUX_VERSION:=$target->{version} |
LINUX_VERSION:=$target->{version} |
LINUX_RELEASE:=$target->{release} |
LINUX_RELEASE:=$target->{release} |
LINUX_KARCH:=$target->{karch} |
LINUX_KARCH:=$target->{karch} |
DEFAULT_PACKAGES:=".join(" ", @{$target->{packages}})." |
DEFAULT_PACKAGES:=".join(" ", @{$target->{packages}})." |
endef$profiles_def |
endef$profiles_def |
endif$profiles_eval |
endif$profiles_eval |
|
|
" |
" |
} |
} |
print "\$(eval \$(call Target))\n"; |
print "\$(eval \$(call Target))\n"; |
} |
} |
|
|
sub target_config_features(@) { |
sub target_config_features(@) { |
my $ret; |
my $ret; |
|
|
while ($_ = shift @_) { |
while ($_ = shift @_) { |
/broken/ and $ret .= "\tdepends BROKEN\n"; |
/broken/ and $ret .= "\tdepends BROKEN\n"; |
/pci/ and $ret .= "\tselect PCI_SUPPORT\n"; |
/pci/ and $ret .= "\tselect PCI_SUPPORT\n"; |
/usb/ and $ret .= "\tselect USB_SUPPORT\n"; |
/usb/ and $ret .= "\tselect USB_SUPPORT\n"; |
/atm/ and $ret .= "\tselect ATM_SUPPORT\n"; |
/atm/ and $ret .= "\tselect ATM_SUPPORT\n"; |
/pcmcia/ and $ret .= "\tselect PCMCIA_SUPPORT\n"; |
/pcmcia/ and $ret .= "\tselect PCMCIA_SUPPORT\n"; |
/video/ and $ret .= "\tselect VIDEO_SUPPORT\n"; |
/video/ and $ret .= "\tselect VIDEO_SUPPORT\n"; |
/squashfs/ and $ret .= "\tselect USES_SQUASHFS\n"; |
/squashfs/ and $ret .= "\tselect USES_SQUASHFS\n"; |
/jffs2/ and $ret .= "\tselect USES_JFFS2\n"; |
/jffs2/ and $ret .= "\tselect USES_JFFS2\n"; |
/ext2/ and $ret .= "\tselect USES_EXT2\n"; |
/ext2/ and $ret .= "\tselect USES_EXT2\n"; |
} |
} |
return $ret; |
return $ret; |
} |
} |
|
|
|
|
sub gen_target_config() { |
sub gen_target_config() { |
my @target = parse_target_metadata(); |
my @target = parse_target_metadata(); |
|
|
@target = sort { |
@target = sort { |
$a->{name} cmp $b->{name} |
$a->{name} cmp $b->{name} |
} @target; |
} @target; |
|
|
|
|
print <<EOF; |
print <<EOF; |
choice |
choice |
prompt "Target System" |
prompt "Target System" |
default LINUX_2_4_BRCM |
default LINUX_2_4_BRCM |
reset if !DEVEL |
reset if !DEVEL |
|
|
EOF |
EOF |
|
|
foreach my $target (@target) { |
foreach my $target (@target) { |
my $features = target_config_features(@{$target->{features}}); |
my $features = target_config_features(@{$target->{features}}); |
my $help = $target->{desc}; |
my $help = $target->{desc}; |
my $kernel = $target->{kernel}; |
my $kernel = $target->{kernel}; |
$kernel =~ tr/./_/; |
$kernel =~ tr/./_/; |
|
|
chomp $features; |
chomp $features; |
$features .= "\n"; |
$features .= "\n"; |
if ($help =~ /\w+/) { |
if ($help =~ /\w+/) { |
$help =~ s/^\s*/\t /mg; |
$help =~ s/^\s*/\t /mg; |
$help = "\thelp\n$help"; |
$help = "\thelp\n$help"; |
} else { |
} else { |
undef $help; |
undef $help; |
} |
} |
|
|
print <<EOF |
print <<EOF |
config LINUX_$target->{conf} |
config LINUX_$target->{conf} |
bool "$target->{name}" |
bool "$target->{name}" |
select $target->{arch} |
select $target->{arch} |
select LINUX_$kernel |
select LINUX_$kernel |
$features$help |
$features$help |
|
|
EOF |
EOF |
} |
} |
|
|
print <<EOF; |
print <<EOF; |
if DEVEL |
if DEVEL |
|
|
config LINUX_2_6_ARM |
config LINUX_2_6_ARM |
bool "UNSUPPORTED little-endian arm platform" |
bool "UNSUPPORTED little-endian arm platform" |
depends BROKEN |
depends BROKEN |
select LINUX_2_6 |
select LINUX_2_6 |
select arm |
select arm |
|
|
config LINUX_2_6_CRIS |
config LINUX_2_6_CRIS |
bool "UNSUPPORTED cris platform" |
bool "UNSUPPORTED cris platform" |
depends BROKEN |
depends BROKEN |
select LINUX_2_6 |
select LINUX_2_6 |
select cris |
select cris |
|
|
config LINUX_2_6_M68K |
config LINUX_2_6_M68K |
bool "UNSUPPORTED m68k platform" |
bool "UNSUPPORTED m68k platform" |
depends BROKEN |
depends BROKEN |
select LINUX_2_6 |
select LINUX_2_6 |
select m68k |
select m68k |
|
|
config LINUX_2_6_SH3 |
config LINUX_2_6_SH3 |
bool "UNSUPPORTED little-endian sh3 platform" |
bool "UNSUPPORTED little-endian sh3 platform" |
depends BROKEN |
depends BROKEN |
select LINUX_2_6 |
select LINUX_2_6 |
select sh3 |
select sh3 |
|
|
config LINUX_2_6_SH3EB |
config LINUX_2_6_SH3EB |
bool "UNSUPPORTED big-endian sh3 platform" |
bool "UNSUPPORTED big-endian sh3 platform" |
depends BROKEN |
depends BROKEN |
select LINUX_2_6 |
select LINUX_2_6 |
select sh3eb |
select sh3eb |
|
|
config LINUX_2_6_SH4 |
config LINUX_2_6_SH4 |
bool "UNSUPPORTED little-endian sh4 platform" |
bool "UNSUPPORTED little-endian sh4 platform" |
depends BROKEN |
depends BROKEN |
select LINUX_2_6 |
select LINUX_2_6 |
select sh4 |
select sh4 |
|
|
config LINUX_2_6_SH4EB |
config LINUX_2_6_SH4EB |
bool "UNSUPPORTED big-endian sh4 platform" |
bool "UNSUPPORTED big-endian sh4 platform" |
depends BROKEN |
depends BROKEN |
select LINUX_2_6 |
select LINUX_2_6 |
select sh4eb |
select sh4eb |
|
|
config LINUX_2_6_SPARC |
config LINUX_2_6_SPARC |
bool "UNSUPPORTED sparc platform" |
bool "UNSUPPORTED sparc platform" |
depends BROKEN |
depends BROKEN |
select LINUX_2_6 |
select LINUX_2_6 |
select sparc |
select sparc |
|
|
endif |
endif |
|
|
endchoice |
endchoice |
|
|
choice |
choice |
prompt "Target Profile" |
prompt "Target Profile" |
|
|
EOF |
EOF |
|
|
foreach my $target (@target) { |
foreach my $target (@target) { |
my $profiles = $target->{profiles}; |
my $profiles = $target->{profiles}; |
|
|
foreach my $profile (@$profiles) { |
foreach my $profile (@$profiles) { |
print <<EOF; |
print <<EOF; |
config LINUX_$target->{conf}_$profile->{id} |
config LINUX_$target->{conf}_$profile->{id} |
bool "$profile->{name}" |
bool "$profile->{name}" |
depends LINUX_$target->{conf} |
depends LINUX_$target->{conf} |
EOF |
EOF |
$profile->{kconfig} and print "\tselect PROFILE_KCONFIG\n"; |
$profile->{kconfig} and print "\tselect PROFILE_KCONFIG\n"; |
my %pkgs; |
my %pkgs; |
foreach my $pkg (@{$target->{packages}}, @{$profile->{packages}}) { |
foreach my $pkg (@{$target->{packages}}, @{$profile->{packages}}) { |
$pkgs{$pkg} = 1; |
$pkgs{$pkg} = 1; |
} |
} |
foreach my $pkg (keys %pkgs) { |
foreach my $pkg (keys %pkgs) { |
print "\tselect DEFAULT_$pkg\n" unless ($pkg =~ /^-/ or $pkgs{"-$pkg"}); |
print "\tselect DEFAULT_$pkg\n" unless ($pkg =~ /^-/ or $pkgs{"-$pkg"}); |
} |
} |
print "\n"; |
print "\n"; |
} |
} |
} |
} |
|
|
print "endchoice\n"; |
print "endchoice\n"; |
} |
} |
|
|
sub find_package_dep($$) { |
sub find_package_dep($$) { |
my $pkg = shift; |
my $pkg = shift; |
my $name = shift; |
my $name = shift; |
my $deps = ($pkg->{vdepends} or $pkg->{depends}); |
my $deps = ($pkg->{vdepends} or $pkg->{depends}); |
|
|
return 0 unless defined $deps; |
return 0 unless defined $deps; |
foreach my $dep (@{$deps}) { |
foreach my $dep (@{$deps}) { |
return 1 if $dep eq $name; |
return 1 if $dep eq $name; |
return 1 if ($package{$dep} and (find_package_dep($package{$dep},$name) == 1)); |
return 1 if ($package{$dep} and (find_package_dep($package{$dep},$name) == 1)); |
} |
} |
return 0; |
return 0; |
} |
} |
|
|
sub package_depends($$) { |
sub package_depends($$) { |
my $a = shift; |
my $a = shift; |
my $b = shift; |
my $b = shift; |
my $ret; |
my $ret; |
|
|
return 0 if ($a->{submenu} ne $b->{submenu}); |
return 0 if ($a->{submenu} ne $b->{submenu}); |
if (find_package_dep($a, $b->{name}) == 1) { |
if (find_package_dep($a, $b->{name}) == 1) { |
$ret = 1; |
$ret = 1; |
} elsif (find_package_dep($b, $a->{name}) == 1) { |
} elsif (find_package_dep($b, $a->{name}) == 1) { |
$ret = -1; |
$ret = -1; |
} else { |
} else { |
return 0; |
return 0; |
} |
} |
return $ret; |
return $ret; |
} |
} |
|
|
sub mconf_depends($$) { |
sub mconf_depends($$) { |
my $depends = shift; |
my $depends = shift; |
my $only_dep = shift; |
my $only_dep = shift; |
my $res; |
my $res; |
|
|
$depends or return; |
$depends or return; |
my @depends = @$depends; |
my @depends = @$depends; |
foreach my $depend (@depends) { |
foreach my $depend (@depends) { |
my $m = "depends"; |
my $m = "depends"; |
$depend =~ s/^([@\+]+)//; |
$depend =~ s/^([@\+]+)//; |
my $flags = $1; |
my $flags = $1; |
my $vdep; |
my $vdep; |
|
|
if ($vdep = $package{$depend}->{vdepends}) { |
if ($vdep = $package{$depend}->{vdepends}) { |
$depend = join("||", map { "PACKAGE_".$_ } @$vdep); |
$depend = join("||", map { "PACKAGE_".$_ } @$vdep); |
} else { |
} else { |
$flags =~ /\+/ and do { |
$flags =~ /\+/ and do { |
next if $only_dep; |
next if $only_dep; |
$m = "select"; |
$m = "select"; |
|
|
# Menuconfig will not treat 'select FOO' as a real dependency |
# Menuconfig will not treat 'select FOO' as a real dependency |
# thus if FOO depends on other config options, these dependencies |
# thus if FOO depends on other config options, these dependencies |
# will not be checked. To fix this, we simply emit all of FOO's |
# will not be checked. To fix this, we simply emit all of FOO's |
# depends here as well. |
# depends here as well. |
$package{$depend} and $res .= mconf_depends($package{$depend}->{depends}, 1); |
$package{$depend} and $res .= mconf_depends($package{$depend}->{depends}, 1); |
}; |
}; |
$flags =~ /@/ or $depend = "PACKAGE_$depend"; |
$flags =~ /@/ or $depend = "PACKAGE_$depend"; |
} |
} |
$res .= "\t\t$m $depend\n"; |
$res .= "\t\t$m $depend\n"; |
} |
} |
return $res; |
return $res; |
} |
} |
|
|
sub print_package_config_category($) { |
sub print_package_config_category($) { |
my $cat = shift; |
my $cat = shift; |
my %menus; |
my %menus; |
my %menu_dep; |
my %menu_dep; |
|
|
return unless $category{$cat}; |
return unless $category{$cat}; |
|
|
print "menu \"$cat\"\n\n"; |
print "menu \"$cat\"\n\n"; |
my %spkg = %{$category{$cat}}; |
my %spkg = %{$category{$cat}}; |
|
|
foreach my $spkg (sort {uc($a) cmp uc($b)} keys %spkg) { |
foreach my $spkg (sort {uc($a) cmp uc($b)} keys %spkg) { |
foreach my $pkg (@{$spkg{$spkg}}) { |
foreach my $pkg (@{$spkg{$spkg}}) { |
my $menu = $pkg->{submenu}; |
my $menu = $pkg->{submenu}; |
if ($menu) { |
if ($menu) { |
$menu_dep{$menu} or $menu_dep{$menu} = $pkg->{submenudep}; |
$menu_dep{$menu} or $menu_dep{$menu} = $pkg->{submenudep}; |
} else { |
} else { |
$menu = 'undef'; |
$menu = 'undef'; |
} |
} |
$menus{$menu} or $menus{$menu} = []; |
$menus{$menu} or $menus{$menu} = []; |
push @{$menus{$menu}}, $pkg; |
push @{$menus{$menu}}, $pkg; |
print "\tconfig DEFAULT_".$pkg->{name}."\n"; |
print "\tconfig DEFAULT_".$pkg->{name}."\n"; |
print "\t\tbool\n\n"; |
print "\t\tbool\n\n"; |
} |
} |
} |
} |
my @menus = sort { |
my @menus = sort { |
($a eq 'undef' ? 1 : 0) or |
($a eq 'undef' ? 1 : 0) or |
($b eq 'undef' ? -1 : 0) or |
($b eq 'undef' ? -1 : 0) or |
($a cmp $b) |
($a cmp $b) |
} keys %menus; |
} keys %menus; |
|
|
foreach my $menu (@menus) { |
foreach my $menu (@menus) { |
my @pkgs = sort { |
my @pkgs = sort { |
package_depends($a, $b) or |
package_depends($a, $b) or |
($a->{name} cmp $b->{name}) |
($a->{name} cmp $b->{name}) |
} @{$menus{$menu}}; |
} @{$menus{$menu}}; |
if ($menu ne 'undef') { |
if ($menu ne 'undef') { |
$menu_dep{$menu} and print "if $menu_dep{$menu}\n"; |
$menu_dep{$menu} and print "if $menu_dep{$menu}\n"; |
print "menu \"$menu\"\n"; |
print "menu \"$menu\"\n"; |
} |
} |
foreach my $pkg (@pkgs) { |
foreach my $pkg (@pkgs) { |
my $title = $pkg->{name}; |
my $title = $pkg->{name}; |
my $c = (72 - length($pkg->{name}) - length($pkg->{title})); |
my $c = (72 - length($pkg->{name}) - length($pkg->{title})); |
if ($c > 0) { |
if ($c > 0) { |
$title .= ("." x $c). " ". $pkg->{title}; |
$title .= ("." x $c). " ". $pkg->{title}; |
} |
} |
print "\t"; |
print "\t"; |
$pkg->{menu} and print "menu"; |
$pkg->{menu} and print "menu"; |
print "config PACKAGE_".$pkg->{name}."\n"; |
print "config PACKAGE_".$pkg->{name}."\n"; |
print "\t\ttristate \"$title\"\n"; |
print "\t\ttristate \"$title\"\n"; |
print "\t\tdefault y if DEFAULT_".$pkg->{name}."\n"; |
print "\t\tdefault y if DEFAULT_".$pkg->{name}."\n"; |
foreach my $default (split /\s*,\s*/, $pkg->{default}) { |
foreach my $default (split /\s*,\s*/, $pkg->{default}) { |
print "\t\tdefault $default\n"; |
print "\t\tdefault $default\n"; |
} |
} |
print mconf_depends($pkg->{depends}, 0); |
print mconf_depends($pkg->{depends}, 0); |
print "\t\thelp\n"; |
print "\t\thelp\n"; |
print $pkg->{description}; |
print $pkg->{description}; |
print "\n"; |
print "\n"; |
|
|
$pkg->{config} and print $pkg->{config}."\n"; |
$pkg->{config} and print $pkg->{config}."\n"; |
} |
} |
if ($menu ne 'undef') { |
if ($menu ne 'undef') { |
print "endmenu\n"; |
print "endmenu\n"; |
$menu_dep{$menu} and print "endif\n"; |
$menu_dep{$menu} and print "endif\n"; |
} |
} |
} |
} |
print "endmenu\n\n"; |
print "endmenu\n\n"; |
|
|
undef $category{$cat}; |
undef $category{$cat}; |
} |
} |
|
|
sub gen_package_config() { |
sub gen_package_config() { |
parse_package_metadata(); |
parse_package_metadata(); |
|
print "menu \"Image configuration\"\n"; |
|
foreach my $preconfig (keys %preconfig) { |
|
print "\tcomment \"$preconfig\"\n"; |
|
foreach my $cfg (@{$preconfig{$preconfig}}) { |
|
my $conf = $cfg->{id}; |
|
$conf =~ tr/\.-/__/; |
|
print <<EOF |
|
config UCI_PRECONFIG_$conf |
|
string "$cfg->{label}" |
|
depends PACKAGE_$preconfig |
|
default "$cfg->{default}" |
|
|
|
EOF |
|
} |
|
} |
|
print "endmenu\n\n"; |
print_package_config_category 'Base system'; |
print_package_config_category 'Base system'; |
foreach my $cat (keys %category) { |
foreach my $cat (keys %category) { |
print_package_config_category $cat; |
print_package_config_category $cat; |
} |
} |
} |
} |
|
|
|
sub gen_package_mk() { |
|
my %conf; |
|
my %dep; |
|
my $line; |
|
|
|
parse_package_metadata(); |
|
foreach my $name (sort {uc($a) cmp uc($b)} keys %package) { |
|
my $config; |
|
my $pkg = $package{$name}; |
|
|
|
next if defined $pkg->{vdepends}; |
|
if ($ENV{SDK}) { |
|
$conf{$pkg->{src}} or do { |
|
$config = 'm'; |
|
$conf{$pkg->{src}} = 1; |
|
}; |
|
} else { |
|
$config = "\$(CONFIG_PACKAGE_$name)" |
|
} |
|
if ($config) { |
|
print "package-$config += $pkg->{src}\n"; |
|
$pkg->{prereq} and print "prereq-$config += $pkg->{src}\n"; |
|
} |
|
|
|
my $hasdeps = 0; |
|
my $depline = ""; |
|
foreach my $dep (@{$pkg->{depends}}, @{$pkg->{builddepends}}) { |
|
next if $dep =~ /@/; |
|
$dep =~ s/\+//; |
|
my $idx; |
|
my $pkg_dep = $package{$dep}; |
|
$pkg_dep or $pkg_dep = $srcpackage{$dep}->[0]; |
|
next unless defined $pkg_dep; |
|
next if defined $pkg_dep->{vdepends}; |
|
|
|
if (defined $pkg_dep->{src}) { |
|
($pkg->{src} ne $pkg_dep->{src}) and $idx = $pkg_dep->{src}; |
|
} elsif (defined($pkg_dep) && !defined($ENV{SDK})) { |
|
$idx = $dep; |
|
} |
|
undef $idx if $idx =~ /^(kernel)|(base-files)$/; |
|
if ($idx) { |
|
next if $dep{$pkg->{src}."->".$idx}; |
|
$depline .= " $idx\-compile"; |
|
$dep{$pkg->{src}."->".$idx} = 1; |
|
} |
|
} |
|
if ($depline) { |
|
$line .= "$pkg->{src}-compile: $depline\n"; |
|
} |
|
} |
|
|
|
if ($line ne "") { |
|
print "\n$line"; |
|
} |
|
foreach my $preconfig (keys %preconfig) { |
|
my $cmds; |
|
foreach my $cfg (@{$preconfig{$preconfig}}) { |
|
my $conf = $cfg->{id}; |
|
$conf =~ tr/\.-/__/; |
|
$cmds .= "\techo \"uci set '$cfg->{id}=\$(subst \",,\$(CONFIG_UCI_PRECONFIG_$conf))'\"; \\\n"; |
|
} |
|
next unless $cmds; |
|
print <<EOF |
|
|
|
\$(TARGET_DIR)/etc/uci-defaults/$preconfig: FORCE |
|
( \\ |
|
$cmds \\ |
|
) > \$@ |
|
|
|
preconfig: \$(TARGET_DIR)/etc/uci-defaults/$preconfig |
|
EOF |
|
} |
|
} |
|
|
|
|
sub parse_command() { |
sub parse_command() { |
my $cmd = shift @ARGV; |
my $cmd = shift @ARGV; |
for ($cmd) { |
for ($cmd) { |
/^target_mk$/ and return gen_target_mk(); |
/^target_mk$/ and return gen_target_mk(); |
/^target_config$/ and return gen_target_config(); |
/^target_config$/ and return gen_target_config(); |
|
/^package_mk$/ and return gen_package_mk(); |
/^package_config$/ and return gen_package_config(); |
/^package_config$/ and return gen_package_config(); |
} |
} |
print <<EOF |
print <<EOF |
Available Commands: |
Available Commands: |
$0 target_mk [file] Target metadata in makefile format |
$0 target_mk [file] Target metadata in makefile format |
$0 target_config [file] Target metadata in Kconfig format |
$0 target_config [file] Target metadata in Kconfig format |
|
$0 package_mk [file] Package metadata in makefile format |
$0 package_config [file] Package metadata in Kconfig format |
$0 package_config [file] Package metadata in Kconfig format |
EOF |
EOF |
} |
} |
|
|
parse_command(); |
parse_command(); |
|
|