From e9c608e6b7fa0bdc5f12a6bc1dd6b60bbeacce7b Mon Sep 17 00:00:00 2001 From: Frans Pop Date: Sun, 9 Aug 2009 14:32:55 +0000 Subject: [PATCH] Add support for producing disks with (optional) extra variants This patch from Ian Cambell 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. The approach to use varriants was originally suggested by Frans Pop. --- CONF.sh | 3 ++ Makefile | 5 ++- debian/changelog | 4 +++ docs/README.variants | 60 ++++++++++++++++++++++++++++++++++++ easy-build.sh | 8 ++++- tools/boot/squeeze/common.sh | 7 +++++ tools/generate_di_list | 18 +++++++++-- 7 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 docs/README.variants diff --git a/CONF.sh b/CONF.sh index 2cf848a9..ae33fedf 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 1a9b3771..e8f92a78 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/debian/changelog b/debian/changelog index 2874055c..6468baf1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,6 +18,10 @@ debian-cd (3.1.3) UNRELEASED; urgency=low [ Steve McIntyre ] * Remove bashism in tools/apt-selection. Closes: #530972 + [ Ian Campbell ] + * Add support for "variants". A variant allows to include/exclude additional + packages or D-I components relative to a regular image. + -- Frans Pop Tue, 04 Aug 2009 22:32:08 +0200 debian-cd (3.1.2) unstable; urgency=low diff --git a/docs/README.variants b/docs/README.variants new file mode 100644 index 00000000..75499b87 --- /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//boot-* scripts which make an image bootable on a + particular architecure. To facilitate this + tools/boot//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_' 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//*. 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 00e1be1b..e1662ec3 100755 --- a/easy-build.sh +++ b/easy-build.sh @@ -9,6 +9,7 @@ show_usage() { echo "Usage: $(basename $0) [OPTIONS] BC|NETINST|CD|DVD [ ...]" echo " Options:" echo " -d gnome|kde|lxde|xfce|light|all : desktop variant (task) to use" + echo " -V : 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,9 @@ while getopts d:h OPT; do exit 1 ;; esac ;; + V) + VARIANTS="${VARIANTS:+$VARIANTS }$OPTARG" + ;; h) show_usage exit 0 @@ -53,6 +58,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 77358371..2fc412fe 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 f148d62b..8ee73498 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;