Add an 'Image Configuration' menu to menuconfig
authorFelix Fietkau <nbd@openwrt.org>
Fri, 16 Mar 2007 03:02:31 +0000 (03:02 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 16 Mar 2007 03:02:31 +0000 (03:02 +0000)
Packages can export a list of config options with labels and data types
through the metadata. The selected config values will be exported to the
target filesystem in /etc/uci-defaults and applied on the first boot.

SVN-Revision: 6572

include/package-dumpinfo.mk
include/package-ipkg.mk
package/Makefile
package/base-files/files/bin/uci
package/base-files/files/etc/init.d/config [new file with mode: 0755]
package/base-files/files/lib/config/uci.sh
scripts/gen_deps.pl [deleted file]
scripts/metadata.pl
target/sdk/files/Makefile

index 2d52f23..e6a4628 100644 (file)
@@ -6,7 +6,11 @@
 #
 
 ifneq ($(DUMP),)
-define Dumpinfo 
+define Config
+  preconfig_$$(1) += echo "Preconfig: $(1)"; echo "Preconfig-Type: $(2)"; echo "Preconfig-Default: $(3)"; echo "Preconfig-Label: $(4)";
+endef
+
+define Dumpinfo
   dumpinfo: dumpinfo-$(1)
   dumpinfo-$(1): FORCE
        @echo "Package: $(1)" ; \
@@ -28,5 +32,6 @@ define Dumpinfo
         $(if $(URL),echo;echo "$(URL)";) \
         echo "@@" ; \
         $$(if $$(Package/$(1)/config),echo "Config: "; getvar $(call shvar,Package/$(1)/config); echo "@@")
+        $(if $$(preconfig_$(1)),@$$(preconfig_$(1)) echo "")
 endef
 endif
index 0d6ab8a..0f98dcf 100644 (file)
@@ -54,12 +54,14 @@ define BuildIPKG
                done; \
                echo "Depends: $$$$DEPENDS" >> $$(IDIR_$(1))/CONTROL/control; \
        )
-       echo "Source: $(SOURCE)" >> $$(IDIR_$(1))/CONTROL/control
-       echo "Section: $(SECTION)" >> $$(IDIR_$(1))/CONTROL/control
-       echo "Priority: $(PRIORITY)" >> $$(IDIR_$(1))/CONTROL/control
-       echo "Maintainer: $(MAINTAINER)" >> $$(IDIR_$(1))/CONTROL/control
-       echo "Architecture: $(PKGARCH)" >> $$(IDIR_$(1))/CONTROL/control
-       echo "Description: $(DESCRIPTION)" | sed -e 's,\\,\n,g' | sed -e 's,^[[:space:]]*$$$$, .,g' >> $$(IDIR_$(1))/CONTROL/control
+       ( \
+               echo "Source: $(SOURCE)"; \
+               echo "Section: $(SECTION)"; \
+               echo "Priority: $(PRIORITY)"; \
+               echo "Maintainer: $(MAINTAINER)"; \
+               echo "Architecture: $(PKGARCH)"; \
+               echo -n "Description: "; getvar $(call shvar,Package/$(1)/description) | sed -e 's,^[[:space:]]*, ,g'; \
+       ) >> $$(IDIR_$(1))/CONTROL/control
        chmod 644 $$(IDIR_$(1))/CONTROL/control
        (cd $$(IDIR_$(1))/CONTROL; \
                $($(1)_COMMANDS) \
index 151942d..bf7090d 100644 (file)
@@ -8,9 +8,12 @@
 
 include $(TOPDIR)/rules.mk
 include $(TOPDIR)/.config
-include $(TMP_DIR)/.pkgdeps
 include $(INCLUDE_DIR)/host.mk
 
+all: compile
+
+include $(TMP_DIR)/.pkgdeps
+
 PREREQ_PACKAGES:=$(patsubst %,%-prereq,$(prereq-y) $(prereq-m))
 DOWNLOAD_PACKAGES:=$(patsubst %,%-download,$(package-y) $(package-m))
 COMPILE_PACKAGES:=$(patsubst %,%-compile,$(package-y) $(package-m))
@@ -29,9 +32,9 @@ GENDEP_OPTS := -s
 endif
 
 $(TMP_DIR)/.pkgdeps: $(TMP_DIR)/.pkginfo
-       @$(TOPDIR)/scripts/gen_deps.pl $(GENDEP_OPTS) < $< > $@ || rm -f $@
+       @$(TOPDIR)/scripts/metadata.pl package_mk $(GENDEP_OPTS) < $< > $@ || rm -f $@
 
-all: compile
+preconfig:
 clean: $(patsubst %,%-clean,$(package-) $(package-y) $(package-m))
 prereq: $(PREREQ_PACKAGES)
 download: $(DOWNLOAD_PACKAGES)
@@ -41,6 +44,7 @@ install-targets: $(INSTALL_PACKAGES)
 install:
        rm -rf $(BUILD_DIR)/root
        $(MAKE) install-targets
+       $(MAKE) preconfig
        @if [ -d $(TOPDIR)/files ]; then \
                $(CP) $(TOPDIR)/files/. $(BUILD_DIR)/root; \
        fi
@@ -49,7 +53,7 @@ install:
                for script in ./etc/init.d/*; do \
                        grep '#!/bin/sh /etc/rc.common' $$script >/dev/null || continue; \
                        IPKG_INSTROOT=$(BUILD_DIR)/root $(which bash) ./etc/rc.common $$script enable; \
-               done; \
+               done || true \
        )
 
 index: $(PACKAGE_DIR)/Packages
index f8e08f8..4df8f33 100755 (executable)
@@ -47,7 +47,7 @@ do_set() {
        local VALUE
 
        strtok "$1" PACKAGE . CONFIG = VALUE
-       [ $? -ne 3 ] && {
+       [ $? -ne 3 -a $? -ne 2 ] && {
                uci_usage set
                exit 1
        }
@@ -86,6 +86,7 @@ do_remove() {
 do_commit() {
        local PACKAGE="$1"
        for package in ${PACKAGE:-$(cd /tmp/.uci; ls)}; do 
+               [ "${package##.*}" != "$package" ] && continue # ignore .lock files
                uci_commit "$package"
        done
 }
diff --git a/package/base-files/files/etc/init.d/config b/package/base-files/files/etc/init.d/config
new file mode 100755 (executable)
index 0000000..2a14975
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+START=15
+
+start() {
+       include /lib/config
+       uci_apply_defaults
+}
index 43bb981..e1571cc 100644 (file)
@@ -28,6 +28,17 @@ uci_load() {
        }
 }
 
+uci_apply_defaults() {(
+       cd /etc/uci-defaults || return 0
+       files="$(ls)"
+       [ -z "$files" ] && return 0
+       mkdir -p /tmp/.uci
+       for file in $files; do
+               ( . "./$(basename $file)" ) && rm -f "$file"
+       done
+       uci commit
+)}
+
 uci_do_update() {
        local FILENAME="$1"
        local UPDATE="$2"
diff --git a/scripts/gen_deps.pl b/scripts/gen_deps.pl
deleted file mode 100755 (executable)
index 0fc80aa..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/usr/bin/perl
-# 
-# Copyright (C) 2006 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-use strict;
-
-my $name;
-my $src;
-my $makefile;
-my %conf;
-my %pkg;
-my %prereq;
-my %dep;
-my %options;
-my $opt;
-
-while ($opt = shift @ARGV) {
-       $opt =~ /^-s/ and $options{SDK} = 1;
-}
-
-my $line;
-while ($line = <>) {
-       chomp $line;
-       $line =~ /^Source-Makefile: \s*(.+\/([^\/]+)\/Makefile)\s*$/ and do {
-               $makefile = $1;
-               $src = $2;
-               defined $pkg{$src} or $pkg{$src} = {};
-               $pkg{$src}->{src} = $src;
-       };
-       $line =~ /^Package: \s*(.+)\s*$/ and do {
-               $name = $1;
-               defined $pkg{$name} or $pkg{$name} = {};
-               $pkg{$name}->{src} = $src;
-       };
-       $line =~ /^Provides: \s*(.+)\s*$/ and do {
-               foreach my $vpkg (split /\s+/, $1) {
-                       defined $pkg{$vpkg} or $pkg{$vpkg} = {};
-                       $pkg{$vpkg}->{virtual} = 1;
-               }
-       };
-       $line =~ /^Prereq-Check:/ and !defined $prereq{$src} and do {
-               $pkg{$name}->{prereq} = 1;
-       };
-       $line =~ /^(Build-)?Depends: \s*(.+)\s*$/ and do {
-               $pkg{$name}->{depends} ||= [];
-               foreach my $v (split /\s+/, $2) {
-                       next if $v =~ /^[\+]?@/;
-                       $v =~ s/^\+//;
-                       push @{$pkg{$name}->{depends}}, $v;
-               }
-       };
-}
-
-$line="";
-
-foreach $name (sort {uc($a) cmp uc($b)} keys %pkg) {
-       my $config;
-       
-       next if defined $pkg{$name}->{virtual};
-       if ($options{SDK}) {
-               $conf{$pkg{$name}->{src}} or do {
-                       $config = 'm';
-                       $conf{$pkg{$name}->{src}} = 1;
-               };
-       } else {
-               $config = "\$(CONFIG_PACKAGE_$name)"
-       }
-       if ($config) {
-               print "package-$config += $pkg{$name}->{src}\n";
-               $pkg{$name}->{prereq} and print "prereq-$config += $pkg{$name}->{src}\n";
-       }
-
-       my $hasdeps = 0;
-       my $depline = "";
-       foreach my $dep (@{$pkg{$name}->{depends}}) {
-               my $idx;
-               next if defined $pkg{$dep}->{virtual};
-               if (defined $pkg{$dep}->{src}) {
-                       ($pkg{$name}->{src} ne $pkg{$dep}->{src}) and $idx = $pkg{$dep}->{src};
-               } elsif (defined($pkg{$dep}) && !$options{SDK}) {
-                       $idx = $dep;
-               }
-               undef $idx if $idx =~ /^(kernel)|(base-files)$/;
-               if ($idx) {
-                       next if $dep{$pkg{$name}->{src}."->".$idx};
-                       $depline .= " $idx\-compile";
-                       $dep{$pkg{$name}->{src}."->".$idx} = 1;
-               }
-       }
-       if ($depline ne "") {
-               $line .= "$pkg{$name}->{src}-compile: $depline\n";
-       }
-}
-
-if ($line ne "") {
-       print "\n$line";
-}
index b5ee31a..ebe5eb2 100755 (executable)
@@ -1,6 +1,8 @@
 #!/usr/bin/perl
 use strict;
+my %preconfig;
 my %package;
+my %srcpackage;
 my %category;
 
 sub parse_target_metadata() {
@@ -70,21 +72,26 @@ sub parse_target_metadata() {
 sub parse_package_metadata() {
        my $pkg;
        my $makefile;
+       my $preconfig;
        my $src;
        while (<>) {
                chomp;
                /^Source-Makefile: \s*(.+\/([^\/]+)\/Makefile)\s*$/ and do {
                        $makefile = $1;
                        $src = $2;
+                       $srcpackage{$src} = [];
                        undef $pkg;
                };
-               /^Package: \s*(.+)\s*$/ and do {
+               /^Package:\s*(.+?)\s*$/ and do {
                        $pkg = {};
                        $pkg->{src} = $src;
                        $pkg->{makefile} = $makefile;
                        $pkg->{name} = $1;
                        $pkg->{default} = "m if ALL";
+                       $pkg->{depends} = [];
+                       $pkg->{builddepends} = [];
                        $package{$1} = $pkg;
+                       push @{$srcpackage{$src}}, $pkg;
                };
                /^Version: \s*(.+)\s*$/ and $pkg->{version} = $1;
                /^Title: \s*(.+)\s*$/ and $pkg->{title} = $1;
@@ -103,6 +110,10 @@ sub parse_package_metadata() {
                        my @dep = split /\s+/, $1;
                        $pkg->{depends} = \@dep;
                };
+               /^Build-Depends: \s*(.+)\s*$/ and do {
+                       my @dep = split /\s+/, $1;
+                       $pkg->{builddepends} = \@dep;
+               };
                /^Category: \s*(.+)\s*$/ and do {
                        $pkg->{category} = $1;
                        defined $category{$1} or $category{$1} = {};
@@ -126,7 +137,19 @@ sub parse_package_metadata() {
                                $conf .= "$line";
                        }
                        $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;
 }
@@ -450,23 +473,117 @@ sub print_package_config_category($) {
 
 sub gen_package_config() {
        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';
        foreach my $cat (keys %category) {
                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() {
        my $cmd = shift @ARGV;
        for ($cmd) {
                /^target_mk$/ and return gen_target_mk();
                /^target_config$/ and return gen_target_config();
+               /^package_mk$/ and return gen_package_mk();
                /^package_config$/ and return gen_package_config();
        }
        print <<EOF
 Available Commands:
        $0 target_mk [file]             Target metadata in makefile 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
 EOF
 }
index ba488e3..7f42b69 100644 (file)
@@ -30,6 +30,9 @@ export TOPDIR
 DEVELOPER=1
 export DEVELOPER
 
+SDK=1
+export SDK
+
 all: world
 
 .pkginfo: FORCE