X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/aff12f542e56732b0ae0ba36731be9f86e719549..7b97cf0e68fa3b4695a394ede76640ea2881c854:/scripts/metadata.pl diff --git a/scripts/metadata.pl b/scripts/metadata.pl index 2527915bc..6ed128aae 100755 --- a/scripts/metadata.pl +++ b/scripts/metadata.pl @@ -4,6 +4,7 @@ my %preconfig; my %package; my %srcpackage; my %category; +my %subdir; sub get_multiline { my $prefix = shift; @@ -72,12 +73,16 @@ sub parse_package_metadata() { my $pkg; my $makefile; my $preconfig; + my $subdir; my $src; while (<>) { chomp; - /^Source-Makefile: \s*(.+\/([^\/]+)\/Makefile)\s*$/ and do { + /^Source-Makefile: \s*((.+\/)([^\/]+)\/Makefile)\s*$/ and do { $makefile = $1; - $src = $2; + $subdir = $2; + $src = $3; + $subdir =~ s/^package\///; + $subdir{$src} = $subdir; $srcpackage{$src} = []; undef $pkg; }; @@ -89,6 +94,7 @@ sub parse_package_metadata() { $pkg->{default} = "m if ALL"; $pkg->{depends} = []; $pkg->{builddepends} = []; + $pkg->{subdir} = $subdir; $package{$1} = $pkg; push @{$srcpackage{$src}}, $pkg; }; @@ -131,6 +137,67 @@ sub parse_package_metadata() { return %category; } +sub gen_kconfig_overrides() { + my %config; + my %kconfig; + my $package; + my $pkginfo = shift @ARGV; + my $cfgfile = shift @ARGV; + + # parameter 2: build system config + open FILE, "<$cfgfile" or return; + while () { + /^(CONFIG_.+?)=(.+)$/ and $config{$1} = 1; + } + close FILE; + + # parameter 1: package metadata + open FILE, "<$pkginfo" or return; + while () { + /^Package:\s*(.+?)\s*$/ and $package = $1; + /^Kernel-Config:\s*(.+?)\s*$/ and do { + my @config = split /\s+/, $1; + foreach my $config (@config) { + my $val = 'm'; + my $override; + if ($config =~ /^(.+?)=(.+)$/) { + $config = $1; + $override = 1; + $val = $2; + } + if ($config{"CONFIG_PACKAGE_$package"} and ($config ne 'n')) { + $kconfig{$config} = $val; + } elsif (!$override) { + $kconfig{$config} or $kconfig{$config} = 'n'; + } + } + }; + }; + close FILE; + + foreach my $kconfig (sort keys %kconfig) { + if ($kconfig{$kconfig} eq 'n') { + print "# $kconfig is not set\n"; + } else { + print "$kconfig=$kconfig{$kconfig}\n"; + } + } +} + +sub merge_package_lists($$) { + my $list1 = shift; + my $list2 = shift; + my @l = (); + my %pkgs; + + foreach my $pkg (@$list1, @$list2) { + $pkgs{$pkg} = 1; + } + foreach my $pkg (keys %pkgs) { + push @l, $pkg unless ($pkg =~ /^-/ or $pkgs{"-$pkg"}); + } + return sort(@l); +} sub gen_target_mk() { my @target = parse_target_metadata(); @@ -149,7 +216,7 @@ sub gen_target_mk() { define Profile/$conf\_$profile->{id} ID:=$profile->{id} NAME:=$profile->{name} - PACKAGES:=".join(" ", @{$profile->{packages}})."\n"; + PACKAGES:=".join(" ", merge_package_lists($target->{packages}, $profile->{packages}))."\n"; $profile->{kconfig} and $profiles_def .= " KCONFIG:=1\n"; $profiles_def .= " endef"; $profiles_eval .= " @@ -180,12 +247,11 @@ sub target_config_features(@) { /broken/ and $ret .= "\tdepends BROKEN\n"; /pci/ and $ret .= "\tselect PCI_SUPPORT\n"; /usb/ and $ret .= "\tselect USB_SUPPORT\n"; - /atm/ and $ret .= "\tselect ATM_SUPPORT\n"; /pcmcia/ and $ret .= "\tselect PCMCIA_SUPPORT\n"; - /video/ and $ret .= "\tselect VIDEO_SUPPORT\n"; /squashfs/ and $ret .= "\tselect USES_SQUASHFS\n"; /jffs2/ and $ret .= "\tselect USES_JFFS2\n"; /ext2/ and $ret .= "\tselect USES_EXT2\n"; + /tgz/ and $ret .= "\tselect USES_TGZ\n"; } return $ret; } @@ -303,12 +369,9 @@ config LINUX_$target->{conf}_$profile->{id} $profile->{config} EOF $profile->{kconfig} and print "\tselect PROFILE_KCONFIG\n"; - my %pkgs; - foreach my $pkg (@{$target->{packages}}, @{$profile->{packages}}) { - $pkgs{$pkg} = 1; - } - foreach my $pkg (keys %pkgs) { - print "\tselect DEFAULT_$pkg\n" unless ($pkg =~ /^-/ or $pkgs{"-$pkg"}); + my @pkglist = merge_package_lists($target->{packages}, $profile->{packages}); + foreach my $pkg (@pkglist) { + print "\tselect DEFAULT_$pkg\n"; } print "\n"; } @@ -317,6 +380,7 @@ EOF print "endchoice\n"; } + sub find_package_dep($$) { my $pkg = shift; my $name = shift; @@ -451,22 +515,20 @@ sub print_package_config_category($) { sub gen_package_config() { parse_package_metadata(); - print "menu \"Image configuration\"\n"; + print "menuconfig UCI_PRECONFIG\n\tbool \"Image configuration\"\n"; foreach my $preconfig (keys %preconfig) { - print "\tcomment \"$preconfig\"\n"; foreach my $cfg (@{$preconfig{$preconfig}}) { my $conf = $cfg->{id}; $conf =~ tr/\.-/__/; print <{label}" + string "$cfg->{label}" if UCI_PRECONFIG depends PACKAGE_$preconfig default "$cfg->{default}" EOF } } - print "endmenu\n\n"; print_package_config_category 'Base system'; foreach my $cat (keys %category) { print_package_config_category $cat; @@ -493,8 +555,8 @@ sub gen_package_mk() { $config = "\$(CONFIG_PACKAGE_$name)" } if ($config) { - print "package-$config += $pkg->{src}\n"; - $pkg->{prereq} and print "prereq-$config += $pkg->{src}\n"; + print "package-$config += $pkg->{subdir}$pkg->{src}\n"; + $pkg->{prereq} and print "prereq-$config += $pkg->{subdir}$pkg->{src}\n"; } my $hasdeps = 0; @@ -504,14 +566,12 @@ sub gen_package_mk() { $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; + ($pkg->{src} ne $pkg_dep->{src}) and $idx = $pkg_dep->{subdir}.$pkg_dep->{src}; + } elsif (defined($srcpackage{$dep})) { + $idx = $subdir{$dep}.$dep; } undef $idx if $idx =~ /^(kernel)|(base-files)$/; if ($idx) { @@ -521,7 +581,7 @@ sub gen_package_mk() { } } if ($depline) { - $line .= "$pkg->{src}-compile: $depline\n"; + $line .= $pkg->{subdir}."$pkg->{src}-compile: $depline\n"; } } @@ -542,8 +602,10 @@ sub gen_package_mk() { ( \\ $cmds \\ ) > \$@ - -preconfig: \$(TARGET_DIR)/etc/uci-defaults/$preconfig + +ifneq (\$(UCI_PRECONFIG)\$(CONFIG_UCI_PRECONFIG),) + preconfig: \$(TARGET_DIR)/etc/uci-defaults/$preconfig +endif EOF } } @@ -556,13 +618,16 @@ sub parse_command() { /^target_config$/ and return gen_target_config(); /^package_mk$/ and return gen_package_mk(); /^package_config$/ and return gen_package_config(); + /^kconfig/ and return gen_kconfig_overrides(); } print <