Browse Source

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
Felix Fietkau 16 years ago
parent
commit
94cdcbde6d
4 changed files with 77 additions and 4 deletions
  1. 28 2
      include/package-dumpinfo.mk
  2. 1 1
      include/package.mk
  3. 25 0
      scripts/metadata.pl
  4. 23 1
      scripts/metadata.pm

+ 28 - 2
include/package-dumpinfo.mk

@@ -22,7 +22,7 @@ define Config
   preconfig_$$(1) += $(1)
   preconfig_$$(1) += $(1)
 endef
 endef
 
 
-define Dumpinfo
+define Dumpinfo/Package
 $(info Package: $(1)
 $(info Package: $(1)
 $(if $(MENU),Menu: $(MENU)
 $(if $(MENU),Menu: $(MENU)
 )$(if $(SUBMENU),Submenu: $(SUBMENU)
 )$(if $(SUBMENU),Submenu: $(SUBMENU)
@@ -51,5 +51,31 @@ $(Package/$(1)/config)
 @@
 @@
 )$(foreach pc,$(preconfig_$(1)),
 )$(foreach pc,$(preconfig_$(1)),
 $(Preconfig/$(pc))))
 $(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
 endif

+ 1 - 1
include/package.mk

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

+ 25 - 0
scripts/metadata.pl

@@ -533,6 +533,30 @@ sub print_package_config_category($) {
 	undef $category{$cat};
 	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() {
 sub gen_package_config() {
 	parse_package_metadata($ARGV[0]) or exit 1;
 	parse_package_metadata($ARGV[0]) or exit 1;
 	print "menuconfig UCI_PRECONFIG\n\tbool \"Image configuration\"\n" if %preconfig;
 	print "menuconfig UCI_PRECONFIG\n\tbool \"Image configuration\"\n" if %preconfig;
@@ -549,6 +573,7 @@ sub gen_package_config() {
 EOF
 EOF
 		}
 		}
 	}
 	}
+	print_package_features();
 	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;

+ 23 - 1
scripts/metadata.pm

@@ -2,13 +2,14 @@ package metadata;
 use base 'Exporter';
 use base 'Exporter';
 use strict;
 use strict;
 use warnings;
 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 %package;
 our %preconfig;
 our %preconfig;
 our %srcpackage;
 our %srcpackage;
 our %category;
 our %category;
 our %subdir;
 our %subdir;
+our %features;
 
 
 sub get_multiline {
 sub get_multiline {
 	my $fh = shift;
 	my $fh = shift;
@@ -28,11 +29,13 @@ sub clear_packages() {
 	%package = ();
 	%package = ();
 	%srcpackage = ();
 	%srcpackage = ();
 	%category = ();
 	%category = ();
+	%features = ();
 }
 }
 
 
 sub parse_package_metadata($) {
 sub parse_package_metadata($) {
 	my $file = shift;
 	my $file = shift;
 	my $pkg;
 	my $pkg;
+	my $feature;
 	my $makefile;
 	my $makefile;
 	my $preconfig;
 	my $preconfig;
 	my $subdir;
 	my $subdir;
@@ -55,6 +58,7 @@ sub parse_package_metadata($) {
 		};
 		};
 		next unless $src;
 		next unless $src;
 		/^Package:\s*(.+?)\s*$/ and do {
 		/^Package:\s*(.+?)\s*$/ and do {
+			undef $feature;
 			$pkg = {};
 			$pkg = {};
 			$pkg->{src} = $src;
 			$pkg->{src} = $src;
 			$pkg->{makefile} = $makefile;
 			$pkg->{makefile} = $makefile;
@@ -69,6 +73,24 @@ sub parse_package_metadata($) {
 			$package{$1} = $pkg;
 			$package{$1} = $pkg;
 			push @{$srcpackage{$src}}, $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;
 		/^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;