[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH v2 3/4] Add support for producing disks with (optional) extra variants.



This patch just adds the generic support code:
   * CONF.sh:		Add $(VARIANTS) configuration variable.
   * eash-build.sh:	Add command line parameter to enable variants.
   * Makefile:		Define VARIANT_xxx when preprocessing package list.
   * boot/?/common.sh:	Add a function for checking if a variant is enabled.
   * generate_di_list: 	Allow variant overrides in udeb exclusion list.

Variant support is documented in docs/README.variants

The intention is to use this support to add support for installing a
Xen guest from an ISO image.

Thanks to Frans Pop for suggesting the approach.
---
 CONF.sh                      |    3 ++
 Makefile                     |    5 +++-
 docs/README.variants         |   60 ++++++++++++++++++++++++++++++++++++++++++
 easy-build.sh                |    6 +++-
 tools/boot/squeeze/common.sh |    7 +++++
 tools/generate_di_list       |   18 ++++++++++--
 6 files changed, 94 insertions(+), 5 deletions(-)
 create mode 100644 docs/README.variants

diff --git a/CONF.sh b/CONF.sh
index 2cf848a..ae33fed 100644
--- a/CONF.sh
+++ b/CONF.sh
@@ -189,6 +189,9 @@ export DISKTYPE=CD
 # included. See tasks/README.tasksel for further info.
 export TASK_LANGLIST=tasksel_d-i.languages
 
+# Extra variants to enable. See docs/README.variants for more information.
+export VARIANTS=
+
 # We don't want certain packages to take up space on CD1...
 #export EXCLUDE1=exclude
 # ...but they are okay for other CDs (UNEXCLUDEx == may be included
diff --git a/Makefile b/Makefile
index 1a9b377..e8f92a7 100755
--- a/Makefile
+++ b/Makefile
@@ -311,9 +311,12 @@ $(BDIR)/rawlist:
 		ARCHDEFS="$$ARCHDEFS -D ARCH_$(subst -,_,$$ARCH)"; \
 		ARCHUNDEFS="$$ARCHUNDEFS -U $$ARCH"; \
 	done; \
+	for VARIANT in $(VARIANTS); do \
+		VARIANTDEFS="$$VARIANTDEFS -D VARIANT_$$VARIANT"; \
+	done; \
 	if [ "$(SOURCEONLY)"x != "yes"x ] ; then \
 		cat $(TASKDIR)/$(TASK) | \
-		cpp -nostdinc -nostdinc++ -P -undef $$ARCHDEFS \
+		cpp -nostdinc -nostdinc++ -P -undef $$ARCHDEFS $$VARIANTDEFS\
 	   		$$ARCHUNDEFS -U i386 -U linux -U unix \
 		    -DFORCENONUSONCD1=0 \
 		    -I $(TASKDIR) - - >> $(BDIR)/rawlist; \
diff --git a/docs/README.variants b/docs/README.variants
new file mode 100644
index 0000000..75499b8
--- /dev/null
+++ b/docs/README.variants
@@ -0,0 +1,60 @@
+Introduction
+------------
+
+Variants enable debian-cd to include extra functionality in a built
+image which is somewhat orthogonal to the usual DISKTYPE and ARCH
+configurations.
+
+Variants are enabled by setting the VARIANTS environment variable to a
+space separated list of the variants to enable or by passing the -V
+option (multiple times if desired) to the easy-build.sh script.
+
+Available Variants
+------------------
+
+Implementation
+--------------
+
+Variants impact several aspects of the debian-cd infrastructure:
+
+  environment variable
+  --------------------
+
+  The $VARIANTS environment variable is available to any scripts etc
+  which are run as part of the build process and is a space separated
+  list of the variants which are enabled.
+
+  In particular this maybe used by the per-archtecture
+  tools/boot/<distro>/boot-* scripts which make an image bootable on a
+  particular architecure. To facilitate this
+  tools/boot/<distro>/common.sh defines a function `variant_enabled'
+  which takes a variant name as an argument and returns true if that
+  variant is enabled.
+
+  deb package lists
+  -----------------
+
+  A variant may wish to include extra .deb packages in the image. The
+  package lists are preprocessed using `cpp' as part of the build
+  process and a C-preprocessor variable `VARIANT_<x>' will be defined
+  to 1 for each variant which is enabled.
+
+  udeb package lists
+  ------------------
+
+  Similarly a variant may which to include extra .udeb packages in the
+  image. The list of udebs to include in an image is generated using
+  tools/generate_di_list which reads one or more udeb exclude files
+  from data/<distribution>/*. The syntax of these exclude files allows
+  a udeb to be excluded or included based on which variants are
+  enabled.
+
+  Each line in an exclude file specifies a glob pattern, a udeb whose
+  name matches the glob will _not_ be included in the image. After the
+  udeb glob each line can optionally contain on or more space
+  separated conditions. At least one of these conditions must be met
+  in order to exclude the udeb. A condition may either be:
+     - a positive `variant' condition, in which case the udeb is
+       excluded when that variant is enabled
+     - a negative `!variant' condition, in which case the udeb is
+       excluded when that variant is not enabled.
diff --git a/easy-build.sh b/easy-build.sh
index b6ce3be..ce9a078 100755
--- a/easy-build.sh
+++ b/easy-build.sh
@@ -9,6 +9,7 @@ show_usage() {
 	echo "Usage: $(basename $0) [OPTIONS] BC|NETINST|CD|DVD [<ARCH> ...]"
 	echo "  Options:"
 	echo "     -d gnome|kde|lxde|xfce|light|all : desktop variant (task) to use"
+	echo "     -V <variant> : extra image variants to enable"
 	echo "     -h help"
 }
 
@@ -28,7 +29,8 @@ if [ $# -eq 0 ]; then
 fi
 
 desktop=
-while getopts d:h OPT ; do
+VARIANTS=
+while getopts d:hV: OPT ; do
 	case $OPT in
 	    d)
 		case $OPTARG in
@@ -41,6 +43,7 @@ while getopts d:h OPT ; do
 			exit 1
 			;;
 		esac ;;
+	    V) VARIANTS="$VARIANTS $OPTARG" ;;
 	    h) 
 		show_usage
 		exit 0
@@ -53,6 +56,7 @@ while getopts d:h OPT ; do
 done
 shift $(($OPTIND - 1))
 
+export VARIANTS
 export DISKTYPE="$1"
 shift
 
diff --git a/tools/boot/squeeze/common.sh b/tools/boot/squeeze/common.sh
index 7735837..d3ccc00 100644
--- a/tools/boot/squeeze/common.sh
+++ b/tools/boot/squeeze/common.sh
@@ -48,3 +48,10 @@ add_mkisofs_opt() {
        echo -n "$NEW_OPT " >> $OPTS_FILE
    fi
 }
+
+variant_enabled() {
+    VARIANT=$1
+
+    echo ${VARIANTS} | grep -qw "${VARIANT}"
+    return $?
+}
diff --git a/tools/generate_di_list b/tools/generate_di_list
index f148d62..8ee7349 100755
--- a/tools/generate_di_list
+++ b/tools/generate_di_list
@@ -18,6 +18,8 @@ if ( $ENV{ARCHES} ) {
 }
 @ARCHES = qw{i386 amd64} unless @ARCHES;
 
+@VARIANTS = split(" ", $ENV{VARIANTS});
+
 my $DATE=`date`;
 chomp $DATE;
 open(OUT, ">debian-installer") || die "write: $!";
@@ -78,9 +80,19 @@ sub read_exclude {
 		chomp;
 		s/^#.*//;
 		next unless length;
-		$_=quotemeta($_);
-		$_=~s/\\\*/.*/g;
-		push @ret, $_;
+		my ($pkg,@cond) = split(" ", $_);
+		my $skip = 0;
+		foreach my $cond ( @cond ) {
+		    if ($cond =~ /^!(.*)/) {
+			$skip = 1 if grep { $_ eq $1 } @VARIANTS;
+		    } else {
+			$skip = 1 unless grep { $_ eq $cond } @VARIANTS;
+		    }
+		}
+		next if $skip;
+		$pkg=quotemeta($pkg);
+		$pkg=~s/\\\*/.*/g;
+		push @ret, $pkg;
 	}
 	close IN;
 	return @ret;
-- 
1.6.3.3


Reply to: