add experimental support for a new menuconfig submenu "Package features". allows selection between multiple packages providing the same feature, which affects dependencies of other packages. will be used e.g. for choosing between DirectFB and X.org for libraries like GTK2

SVN-Revision: 18056
This commit is contained in:
Felix Fietkau 2009-10-17 22:11:21 +00:00
parent f970dff78d
commit 94cdcbde6d
4 changed files with 77 additions and 4 deletions

View file

@ -22,7 +22,7 @@ define Config
preconfig_$$(1) += $(1)
endef
define Dumpinfo
define Dumpinfo/Package
$(info Package: $(1)
$(if $(MENU),Menu: $(MENU)
)$(if $(SUBMENU),Submenu: $(SUBMENU)
@ -51,5 +51,31 @@ $(Package/$(1)/config)
@@
)$(foreach pc,$(preconfig_$(1)),
$(Preconfig/$(pc))))
endef
endef
define Feature/Default
TARGET_NAME:=
TARGET_TITLE:=
PRIORITY:=
NAME:=
endef
define Feature
$(eval $(Feature/Default))
$(eval $(Feature/$(1)))
$(if $(DUMP),$(call Dumpinfo/Feature,$(1)))
endef
define Dumpinfo/Feature
$(info Feature: $(TARGET_NAME)_$(1)
Target-Name: $(TARGET_NAME)
Target-Title: $(TARGET_TITLE)
Feature-Name: $(NAME)
$(if $(PRIORITY),Feature-Priority: $(PRIORITY)
)Feature-Description:
$(Feature/$(1)/description)
@@
)
endef
endif

View file

@ -176,7 +176,7 @@ endif
$(call shexport,Package/$(1)/config)
$(if $(DUMP), \
$(Dumpinfo), \
$(Dumpinfo/Package), \
$(foreach target, \
$(if $(Package/$(1)/targets),$(Package/$(1)/targets), \
$(if $(PKG_TARGETS),$(PKG_TARGETS), ipkg $(if $(CONFIG_DEBUG_DIR),debug)) \

View file

@ -533,6 +533,30 @@ sub print_package_config_category($) {
undef $category{$cat};
}
sub print_package_features() {
keys %features > 0 or return;
print "menu \"Package features\"\n";
foreach my $n (keys %features) {
my @features = sort { $b->{priority} <=> $a->{priority} or $a->{title} cmp $b->{title} } @{$features{$n}};
print <<EOF;
choice
prompt "$features[0]->{target_title}"
default FEATURE_$features[0]->{name}
EOF
foreach my $feature (@features) {
print <<EOF;
config FEATURE_$feature->{name}
bool "$feature->{title}"
help
$feature->{description}
EOF
}
print "endchoice\n"
}
print "endmenu\n\n";
}
sub gen_package_config() {
parse_package_metadata($ARGV[0]) or exit 1;
print "menuconfig UCI_PRECONFIG\n\tbool \"Image configuration\"\n" if %preconfig;
@ -549,6 +573,7 @@ sub gen_package_config() {
EOF
}
}
print_package_features();
print_package_config_category 'Base system';
foreach my $cat (keys %category) {
print_package_config_category $cat;

View file

@ -2,13 +2,14 @@ package metadata;
use base 'Exporter';
use strict;
use warnings;
our @EXPORT = qw(%package %srcpackage %category %subdir %preconfig clear_packages parse_package_metadata get_multiline);
our @EXPORT = qw(%package %srcpackage %category %subdir %preconfig %features clear_packages parse_package_metadata get_multiline);
our %package;
our %preconfig;
our %srcpackage;
our %category;
our %subdir;
our %features;
sub get_multiline {
my $fh = shift;
@ -28,11 +29,13 @@ sub clear_packages() {
%package = ();
%srcpackage = ();
%category = ();
%features = ();
}
sub parse_package_metadata($) {
my $file = shift;
my $pkg;
my $feature;
my $makefile;
my $preconfig;
my $subdir;
@ -55,6 +58,7 @@ sub parse_package_metadata($) {
};
next unless $src;
/^Package:\s*(.+?)\s*$/ and do {
undef $feature;
$pkg = {};
$pkg->{src} = $src;
$pkg->{makefile} = $makefile;
@ -69,6 +73,24 @@ sub parse_package_metadata($) {
$package{$1} = $pkg;
push @{$srcpackage{$src}}, $pkg;
};
/^Feature:\s*(.+?)\s*$/ and do {
undef $pkg;
$feature = {};
$feature->{name} = $1;
$feature->{priority} = 0;
};
$feature and do {
/^Target-Name:\s*(.+?)\s*$/ and do {
$features{$1} or $features{$1} = [];
push @{$features{$1}}, $feature;
};
/^Target-Title:\s*(.+?)\s*$/ and $feature->{target_title} = $1;
/^Feature-Priority:\s*(\d+)\s*$/ and $feature->{priority} = $1;
/^Feature-Name:\s*(.+?)\s*$/ and $feature->{title} = $1;
/^Feature-Description:/ and $feature->{description} = get_multiline(\*FILE, "\t\t\t");
next;
};
next unless $pkg;
/^Version: \s*(.+)\s*$/ and $pkg->{version} = $1;
/^Title: \s*(.+)\s*$/ and $pkg->{title} = $1;
/^Menu: \s*(.+)\s*$/ and $pkg->{menu} = $1;