build: implement support for selecting multiple device profiles
authorFelix Fietkau <nbd@nbd.name>
Sun, 22 May 2016 20:02:31 +0000 (22:02 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 7 Jun 2016 06:58:40 +0000 (08:58 +0200)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
include/image.mk
scripts/metadata.pm
scripts/target-metadata.pl

index 365098d5c037632d024e38ab09855b63571b7fe7..aeff95d09351f4527bda0fc6a85551fcd73ae34c 100644 (file)
@@ -482,7 +482,7 @@ endef
 ifdef IB
   DEVICE_CHECK_PROFILE = $(filter $(1),$(PROFILE))
 else
-  DEVICE_CHECK_PROFILE = $(CONFIG_TARGET_$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_$(1))
+  DEVICE_CHECK_PROFILE = $(CONFIG_TARGET_$(if $(CONFIG_TARGET_MULTI_PROFILE),DEVICE_)$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_$(1))
 endif
 
 define Device/Check
index b3f34f79e9fef9300ed5783b25923b64525a9a5c..c7f8532b54e36e93beac06096f57f046694df5be 100644 (file)
@@ -87,6 +87,7 @@ sub parse_target_metadata($) {
                                priority => 999,
                                packages => []
                        };
+                       $1 =~ /^DEVICE_/ and $target->{has_devices} = 1;
                        push @{$target->{profiles}}, $profile;
                };
                /^Target-Profile-Name:\s*(.+)\s*$/ and $profile->{name} = $1;
index 16f8a9f35644a0de39ce734948852565e01fd0db..34a7c22ce62dfe3223c9ab939195ccf92a8535c3 100755 (executable)
@@ -102,6 +102,9 @@ EOF
                if ($target->{arch} =~ /\w/) {
                        $confstr .= "\tselect $target->{arch}\n";
                }
+               if ($target->{has_devices}) {
+                       $confstr .= "\tselect HAS_DEVICES\n";
+               }
        }
 
        foreach my $dep (@{$target->{depends}}) {
@@ -186,6 +189,21 @@ endchoice
 choice
        prompt "Target Profile"
 
+EOF
+       foreach my $target (@target) {
+               my $profile = $target->{profiles}->[0];
+               $profile or next;
+               print <<EOF;
+       default TARGET_$target->{conf}_$profile->{id} if TARGET_$target->{conf}
+EOF
+       }
+
+       print <<EOF;
+
+config TARGET_MULTI_PROFILE
+       bool "Multiple devices"
+       depends on HAS_DEVICES
+
 EOF
 
        foreach my $target (@target) {
@@ -215,9 +233,37 @@ EOF
        print <<EOF;
 endchoice
 
+menu "Target Devices"
+       depends on TARGET_MULTI_PROFILE
+
+EOF
+       foreach my $target (@target) {
+               my $profiles = $target->{profiles};
+               foreach my $profile (@{$target->{profiles}}) {
+                       next unless $profile->{id} =~ /^DEVICE_/;
+                       print <<EOF;
+config TARGET_DEVICE_$target->{conf}_$profile->{id}
+       bool "$profile->{name}"
+       depends on TARGET_$target->{conf}
+EOF
+                       my @pkglist = merge_package_lists($target->{packages}, $profile->{packages});
+                       foreach my $pkg (@pkglist) {
+                               print "\tselect DEFAULT_$pkg\n";
+                               $defaults{$pkg} = 1;
+                       }
+               }
+       }
+
+       print <<EOF;
+
+endmenu
+
 config HAS_SUBTARGETS
        bool
 
+config HAS_DEVICES
+       bool
+
 config TARGET_BOARD
        string