[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: