appliance: Change to using febootstrap 3.x supermin appliance.
authorRichard W.M. Jones <rjones@redhat.com>
Sat, 4 Dec 2010 21:14:17 +0000 (21:14 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Sun, 5 Dec 2010 11:23:23 +0000 (11:23 +0000)
This removes all support for building the ordinary / old
style appliance using febootstrap 2.x, debootstrap, debirf,
fakeroot and fakechroot.

Instead this uses febootstrap 3.x to build the supermin appliance
in a simpler cross-distro manner.

18 files changed:
.gitignore
Makefile.am
README
appliance/Makefile.am
appliance/debian/debirf.conf.in [deleted file]
appliance/debian/modules/a0_prep-root [deleted symlink]
appliance/debian/modules/install-kernel [deleted symlink]
appliance/debian/modules/y0_install-guestfsd [deleted file]
appliance/debian/modules/z0_remove-aptitude [deleted symlink]
appliance/debian/modules/z0_remove-locales [deleted symlink]
appliance/debian/modules/z1_clean-root [deleted symlink]
appliance/debian/modules/z99_final-cleanups [deleted file]
appliance/kmod.whitelist.in [deleted file]
appliance/make.sh.in
appliance/update.sh.in [deleted file]
capitests/Makefile.am
configure.ac
src/appliance.c

index ac540a2..0f24850 100644 (file)
@@ -2,21 +2,10 @@
 *.a
 ABOUT-NLS
 aclocal.m4
 *.a
 ABOUT-NLS
 aclocal.m4
-appliance/debian/.bootstrap.log
-appliance/debian/.fakeroot-state.debirf-libguestfs
-appliance/debian/debirf-libguestfs*.cgz
-appliance/debian/root/
-appliance/debian/vmlinuz-*
-appliance/debian/debirf.conf
-appliance/initramfs.*.img
-appliance/kmod.whitelist
 appliance/make.sh
 appliance/packagelist
 appliance/make.sh
 appliance/packagelist
-appliance/stamp-debirf-modules
 appliance/stamp-supermin
 appliance/supermin.d
 appliance/stamp-supermin
 appliance/supermin.d
-appliance/update.sh
-appliance/vmlinuz.*
 autom4te.cache
 *.bak
 bindtests.tmp
 autom4te.cache
 *.bak
 bindtests.tmp
@@ -154,8 +143,6 @@ images/test.iso
 images/test-grep.txt.gz
 images/ubuntu.img
 images/windows.img
 images/test-grep.txt.gz
 images/ubuntu.img
 images/windows.img
-initramfs
-initramfs.timestamp
 inspector/stamp-virt-inspector.pod
 inspector/virt-inspector
 inspector/virt-inspector.1
 inspector/stamp-virt-inspector.pod
 inspector/virt-inspector
 inspector/virt-inspector.1
index fb1a084..a4f24be 100644 (file)
@@ -186,9 +186,6 @@ CLEANFILES = \
        pod2htm?.tmp \
        html/*.html
 
        pod2htm?.tmp \
        html/*.html
 
-clean-local:
-       rm -rf initramfs
-
 # If you don't want to run all of the tests ('make check') then this
 # will just run libguestfs-test-tool for a quick check.  Note this
 # is NOT a substitute for proper testing!
 # If you don't want to run all of the tests ('make check') then this
 # will just run libguestfs-test-tool for a quick check.  Note this
 # is NOT a substitute for proper testing!
diff --git a/README b/README
index 57021e9..a484b81 100644 (file)
--- a/README
+++ b/README
@@ -39,11 +39,10 @@ Requirements
 
 - recent QEMU >= 0.12 with virtio-serial support
 
 
 - recent QEMU >= 0.12 with virtio-serial support
 
-- febootstrap >= 2.10
-
-- fakeroot
-
-- fakechroot >= 2.9
+- febootstrap >= 3.0
+     *NB*: febootstrap 2.x WILL NOT WORK
+           febootstrap 3.x is distro-independent, and is required on
+             Debian and other distros too
 
 - XDR, rpcgen (on Linux these are provided by glibc)
 
 
 - XDR, rpcgen (on Linux these are provided by glibc)
 
@@ -135,40 +134,6 @@ this command as root:
   make install
 
 
   make install
 
 
-Fedora
-----------------------------------------------------------------------
-
-We provide packages for Fedora >= 11 in Fedora.  Use those, or build
-from our source RPMs - it's far simpler that way.
-
-You can compile libguestfs on Fedora 10 but you cannot use it with the
-version of qemu in Fedora 10.  You need to compile your own qemu, see
-section 'qemu' below.
-
-
-RHEL / EPEL / CentOS etc
-----------------------------------------------------------------------
-
-We provide packages in EPEL which cover RHEL/CentOS >= 5.  Use those
-or build from our source RPMs.
-
-
-Debian
-----------------------------------------------------------------------
-
-libguestfs is now built as a package in Debian by Guido Gunther and
-the other Debian libvirt maintainers.  See:
-
-http://wiki.debian.org/Teams/DebianLibvirtTeam#Packages
-
-You can build for Debian in two different ways, either building a
-Fedora-based appliance using febootstrap, yum, rpm, fakeroot,
-fakechroot (all packaged in Debian).  However the recommended way is
-to build a Debian-based appliance using debootstrap and debirf.
-
-Both ways are supported by the configure script.
-
-
 qemu
 ----------------------------------------------------------------------
 
 qemu
 ----------------------------------------------------------------------
 
@@ -231,72 +196,9 @@ and removed all the other vmchannels and the SLIRP channel.
 Supermin appliance
 ----------------------------------------------------------------------
 
 Supermin appliance
 ----------------------------------------------------------------------
 
-If you configure with --enable-supermin then we will build a supermin
-appliance (supermin = super-minimized).  This is a very specialized
-appliance which is built on-the-fly at runtime (specifically, when you
-call guestfs_launch).
-
-The normal appliance is a self-contained Linux operating system, based
-on the Fedora/RHEL/CentOS Linux distro.  So it contains a complete
-copy of all the libraries and programs needed, like kernel, libc,
-bash, coreutils etc etc.
-
-The supermin appliance removes the kernel and all the executable
-libraries and programs from the appliance.  That just leaves a
-skeleton of config files and some data files, which is obviously
-massively smaller than the normal appliance.  At runtime we rebuild
-the appliance on-the-fly from the libraries and programs on the host
-(eg. pulling in the real /lib/libc.so, the real /bin/bash etc.)
-
-Although this process of rebuilding the appliance each time sounds
-slow, it turns out to be faster than using the prebuilt appliance.
-(Most of the saving comes from not compressing the appliance - it
-transpires that decompressing the appliance is the slowest part of the
-whole boot sequence).  On my machine, a new appliance can be built in
-under a fifth of a second, and the boot time is several seconds
-shorter.
-
-The big advantage of the supermin appliance for distributions like
-Fedora is that it gets security fixes automatically from the host, so
-there is no need to rebuild the whole of libguestfs for a security
-update in some underlying library.
-
-There are several DISADVANTAGES:
-
-It won't work at all except in very narrow, controlled cases like the
-Fedora packaging case.  We control the dependencies of the libguestfs
-RPM tightly to ensure that the required binaries are actually present
-on the host.
-
-Furthermore there are certain unlikely changes in the packages on the
-host which could break a supermin appliance, eg. an updated library
-which depends on an additional data file.
-
-Also supermin appliances are subjected to changes in the host kernel
-which might break compatibility with qemu -- these are, of course,
-real bugs in any case.
-
-Lastly, supermin appliances really can't be moved between branches of
-distributions (eg. built on Fedora 12 and moved to Fedora 10) because
-they are not self-contained and they rely on certain libraries being
-around.  You shouldn't do this anyway.
-
-Use supermin appliances with caution.
-
-
-Notes on cross-architecture support
-----------------------------------------------------------------------
-
-At the moment we basically don't support cross-architecture or
-32-on-64.  This limits what is possible for some guests.  Filesystem
-operations and FUSE will work fine, but running commands in guests may
-not be possible.
-
-To enable this requires work for cross-architecture and 32-on-64
-support in febootstrap, fakeroot and fakechroot.
-
-The daemon/ directory contains its own configure script.  This is so
-that in future we will be able to cross-compile the daemon.
+In libguestfs >= 1.7.19 the supermin appliance is the default and only
+supported form of appliance.  For more information see febootstrap
+(http://people.redhat.com/~rjones/febootstrap/).
 
 
 Mirroring tip
 
 
 Mirroring tip
@@ -327,15 +229,8 @@ distributions.  Non-Linux ports are trickier, but we will accept
 patches if they aren't too invasive.
 
 The main porting issues are with the dependencies needed to build the
 patches if they aren't too invasive.
 
 The main porting issues are with the dependencies needed to build the
-appliance.  You will need to find or port the following packages
-first:
-
- - fakeroot
- - fakechroot
- - python
- - rpm-python    http://www.rpm.org/
- - yum           http://yum.baseurl.org/
- - febootstrap   http://people.redhat.com/~rjones/febootstrap/
+appliance.  You will need to port the febootstrap first
+(http://people.redhat.com/~rjones/febootstrap/).
 
 
 Copyright and license information
 
 
 Copyright and license information
index dec1c15..cd4952a 100644 (file)
 include $(top_srcdir)/subdir-rules.mk
 
 EXTRA_DIST = \
 include $(top_srcdir)/subdir-rules.mk
 
 EXTRA_DIST = \
-       kmod.whitelist.in \
        packagelist.in \
        init \
        packagelist.in \
        init \
-       debian/modules/y0_install-guestfsd \
-       debian/modules/z99_final-cleanups \
-       debian/debirf.conf.in \
        make.sh.in
 
        make.sh.in
 
-# Build the root filesystem (appliance).
-# Currently this is arch-dependent, so it seems like putting it in
-# $(libdir) is best.  When we build cross-architecture filesystems we
-# should probably move them to $(datadir).
 fsdir = $(libdir)/guestfs
 superminfsdir = $(libdir)/guestfs/supermin.d
 
 fsdir = $(libdir)/guestfs
 superminfsdir = $(libdir)/guestfs/supermin.d
 
-# These are the resulting output files from the whole process:
-#   VMLINUZ        kernel for the full appliance
-#   INITRAMFSIMG   initramfs (ie. root fs) for the full appliance
-# For details of the supermin appliance, read the README file.
-fs_DATA = $(INITRAMFSIMG) $(VMLINUZ)
-if SUPERMIN
-fs_DATA += kmod.whitelist
+fs_DATA =
 superminfs_DATA = \
        supermin.d/base.img \
        supermin.d/daemon.img \
        supermin.d/init.img \
        supermin.d/hostfiles
 superminfs_DATA = \
        supermin.d/base.img \
        supermin.d/daemon.img \
        supermin.d/init.img \
        supermin.d/hostfiles
-endif
-
-# Don't change these names - they must be the same as in '*.sh' scripts.
-INITRAMFSIMG = initramfs.$(host_cpu).img
-VMLINUZ = vmlinuz.$(host_cpu)
-
-# This is for building the normal appliance:
-$(INITRAMFSIMG) $(VMLINUZ): $(top_builddir)/initramfs/fakeroot.log
-
-$(top_builddir)/initramfs/fakeroot.log: make.sh kmod.whitelist packagelist
-       mv $(INITRAMFSIMG) $(INITRAMFSIMG).bak 2>/dev/null; :
-       mv $(VMLINUZ) $(VMLINUZ).bak 2>/dev/null; :
-       if ! bash make.sh; then rm -f $@; exit 1; fi
 
 # This used to be a configure-generated file (as is update.sh still).
 # However config.status always touches the destination file, which
 
 # This used to be a configure-generated file (as is update.sh still).
 # However config.status always touches the destination file, which
@@ -68,70 +41,35 @@ make.sh: make.sh.in
        chmod +x $@-t
        mv $@-t $@
 
        chmod +x $@-t
        mv $@-t $@
 
-$(INITRAMFSIMG): $(top_builddir)/initramfs/fakeroot.log $(top_builddir)/daemon/guestfsd init update.sh
-       rm -f $@
-       bash update.sh
-       touch $@
-
-kmod.whitelist: kmod.whitelist.in
-       grep -v '^[[:space:]]*$$' < $< | grep -v '^#' > $@
-
 packagelist: packagelist.in
 packagelist: packagelist.in
-       cpp -undef -D$(DIST)=1 < $< | \
+       cpp -undef -D$(DISTRO)=1 < $< | \
        grep -v '^[[:space:]]*$$' | grep -v '^#' > $@
 
        grep -v '^[[:space:]]*$$' | grep -v '^#' > $@
 
-# This is for building the supermin appliance.  It has to be enabled
-# specifically with './configure --enable-supermin'.  You really need
-# to read the README file.
-
-if SUPERMIN
-
 supermin.d/base.img supermin.d/hostfiles: stamp-supermin
 supermin.d/base.img supermin.d/hostfiles: stamp-supermin
-stamp-supermin: $(INITRAMFSIMG)
+stamp-supermin: make.sh packagelist
        mkdir -p supermin.d
        rm -f $@ supermin.d/base.img supermin.d/hostfiles
        mkdir -p supermin.d
        rm -f $@ supermin.d/base.img supermin.d/hostfiles
-       febootstrap-to-supermin $(top_builddir)/initramfs supermin.d/base.img supermin.d/hostfiles
-       if grep -q /usr/share/augeas/lenses supermin.d/hostfiles; then \
-               echo "./usr/share/augeas/lenses/*.aug" >> supermin.d/hostfiles; \
-       fi
+       ./make.sh
        touch $@
 
        touch $@
 
-supermin.d/daemon.img: $(INITRAMFSIMG)
+supermin.d/daemon.img: ../daemon/guestfsd
        mkdir -p supermin.d
        rm -f $@ $@-t
        mkdir -p supermin.d
        rm -f $@ $@-t
-       (cd $(top_builddir)/initramfs && \
-         echo -e "sbin\nsbin/guestfsd" | cpio --quiet -o -H newc ) > $@-t
+       mkdir sbin
+       cd sbin && ln ../../daemon/guestfsd
+       echo -e "sbin\nsbin/guestfsd" | cpio --quiet -o -H newc > $@-t
+       rm -r sbin
        mv $@-t $@
 
        mv $@-t $@
 
-supermin.d/init.img: $(INITRAMFSIMG)
+supermin.d/init.img: init
        mkdir -p supermin.d
        rm -f $@ $@-t
        mkdir -p supermin.d
        rm -f $@ $@-t
-       (cd $(top_builddir)/initramfs && \
-         echo -e "init\n" | cpio --quiet -o -H newc ) > $@-t
+       echo "init" | cpio --quiet -o -H newc > $@-t
        mv $@-t $@
 
        mv $@-t $@
 
-endif
-
-# Extra symlinks needed by the Debian appliance.
-debirf_symlinks = \
-       a0_prep-root \
-       install-kernel \
-       z0_remove-aptitude \
-       z0_remove-locales \
-       z1_clean-root
-noinst_DATA = $(debirf_symlinks:%=debian/modules/%)
-$(debirf_symlinks:%=debian/modules/%): stamp-debirf-modules
-stamp-debirf-modules:
-       mkdir -p debian/modules
-       for f in $(debirf_symlinks); do \
-         ln -sf /usr/share/debirf/modules/$$f debian/modules/$$f; \
-       done
-       touch $@
-
 # Make clean.
 
 # Make clean.
 
-CLEANFILES = packagelist kmod.whitelist
+CLEANFILES = packagelist
 
 clean-local:
 
 clean-local:
-       rm -f supermin.d/*
-       rm -rf $(top_builddir)/initramfs
+       rm -rf supermin.d
diff --git a/appliance/debian/debirf.conf.in b/appliance/debian/debirf.conf.in
deleted file mode 100644 (file)
index 7efe25b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-DEBIRF_LABEL="debirf-libguestfs"
-DEBIRF_SUITE=@REPO@
-DEBIRF_MIRROR=@MIRROR@/${DEBIRF_DISTRO}
-DEBIRF_KERNEL_ARCH=@DEBIAN_KERNEL_ARCH@
-DEBIRF_METHOD=stupid_simple
diff --git a/appliance/debian/modules/a0_prep-root b/appliance/debian/modules/a0_prep-root
deleted file mode 120000 (symlink)
index 654bc70..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/usr/share/debirf/modules/a0_prep-root
\ No newline at end of file
diff --git a/appliance/debian/modules/install-kernel b/appliance/debian/modules/install-kernel
deleted file mode 120000 (symlink)
index a1be2bc..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/usr/share/debirf/modules/install-kernel
\ No newline at end of file
diff --git a/appliance/debian/modules/y0_install-guestfsd b/appliance/debian/modules/y0_install-guestfsd
deleted file mode 100755 (executable)
index 2d895a0..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash -e
-# install guestfsd specific stuff
-
-# Kernel modules take up nearly half of the image.  Only include ones
-# which are on the whitelist.
-exec 5<../appliance/kmod.whitelist
-whitelist=
-while read kmod 0<&5; do
-    whitelist="$whitelist -a -not -name $kmod"
-done
-exec 5<&-
-
-echo "Module whitelist: $whitelist"
-find $DEBIRF_ROOT/lib/modules/*/kernel -name '*.ko' $whitelist -a -exec rm '{}' \;
-
-# install additional packages from the package list, but
-# only ones which exist in the repository
-PKGLIST=
-for pkg in $(< packagelist); do
-  if [ "$(debirf_exec apt-get -s install $pkg 3>&1 1>&2 2>&3 1>&- | grep '^E:' | wc -l)" -gt 0 ]; then
-    echo "Ignoring package $pkg, because it was not found in this repository."
-  else
-    PKGLIST="$PKGLIST $pkg"
-  fi
-done
-echo "Will add $PKGLIST"
-debirf_exec apt-get --assume-yes install $PKGLIST
-debirf_exec apt-get --assume-yes remove vim-tiny dhcp3-client iptables
-
-debirf_exec mkdir -p --mode=0777 /sysroot
-
-# cleanup some other heavy lifters:
-rm -rf "$DEBIRF_ROOT"/usr/share/doc/
-rm -rf "$DEBIRF_ROOT"/usr/share/zoneinfo/
-rm -rf "$DEBIRF_ROOT"/usr/share/man/
-
-# Install the actual appliance:
-echo $PWD
-install -o root -g root -m 0755 ../daemon/guestfsd "$DEBIRF_ROOT"/sbin/guestfsd
-install -o root -g root -m 0755 init "$DEBIRF_ROOT"/sbin/init
diff --git a/appliance/debian/modules/z0_remove-aptitude b/appliance/debian/modules/z0_remove-aptitude
deleted file mode 120000 (symlink)
index 7c56260..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/usr/share/debirf/modules/z0_remove-aptitude
\ No newline at end of file
diff --git a/appliance/debian/modules/z0_remove-locales b/appliance/debian/modules/z0_remove-locales
deleted file mode 120000 (symlink)
index 80a82fa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/usr/share/debirf/modules/z0_remove-locales
\ No newline at end of file
diff --git a/appliance/debian/modules/z1_clean-root b/appliance/debian/modules/z1_clean-root
deleted file mode 120000 (symlink)
index f0d3aad..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/usr/share/debirf/modules/z1_clean-root
\ No newline at end of file
diff --git a/appliance/debian/modules/z99_final-cleanups b/appliance/debian/modules/z99_final-cleanups
deleted file mode 100755 (executable)
index ef5fac7..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-rm -rf "$DEBIRF_ROOT"/var/lib/dpkg/info
diff --git a/appliance/kmod.whitelist.in b/appliance/kmod.whitelist.in
deleted file mode 100644 (file)
index 850b7b8..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-# List of kernel modules that we leave in the appliance.  This has to
-# include any dependencies needed by modules.
-
-# Any kernel module not listed here is deleted from the appliance.
-
-# Wildcards are permitted.
-
-virtio*.ko
-
-# We normally use virtio_net, but keep these in reserve.
-8390.ko
-ne2k-pci.ko
-
-# drivers for QEMUs IDE/SCSI device emulation
-cdrom.ko
-i2c-piix4.ko
-i2c-core.ko
-ide-*.ko
-libata.ko
-piix.ko
-scsi_transport_spi.ko
-scsi_mod.ko
-sd_mod.ko
-sym53c8xx.ko
-ata_piix.ko
-sr_mod.ko
-
-ext2.ko
-ext3.ko
-ext4*.ko
-
-jbd.ko
-jbd2.ko
-mbcache.ko
-
-fuse.ko
-
-vfat.ko
-fat.ko
-
-minix.ko
-
-udf.ko
-nls_utf8.ko
-nls_cp437.ko
-nls_base.ko
-
-isofs.ko
-zlib_inflate.ko
-
-dm-*.ko
-
-cramfs.ko
-squashfs.ko
-
-hfs.ko
-hfsplus.ko
-ufs.ko
-exportfs.ko
-xfs.ko
-
-reiserfs.ko
-
-crc*.ko
-libcrc*.ko
-
-loop.ko
-
-gfs2.ko
-dlm.ko
-configfs.ko
-
-# Used by dm-crypt.  Probably many more crypto modules
-# should be added here.
-aes*.ko
-blkcipher.ko
-cbc.ko
-cryptd.ko
-crypto_blkcipher.ko
-gf128mul.ko
-padlock-aes.ko
-sha256*.ko
-sha512*.ko
-xor.ko
-xts.ko
-zlib.ko
index 64bcb5a..bab0529 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/bash -
 # @configure_input@
 #!/bin/bash -
 # @configure_input@
-# Copyright (C) 2009 Red Hat Inc.
+# Copyright (C) 2009-2010 Red Hat Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-# This is called from the Makefile to build the initramfs.
-
 unset CDPATH
 
 set -e
 unset CDPATH
 
 set -e
-set -x
-
-if [ "@DIST@" = "REDHAT" ]; then
-  cd @top_builddir@
-  # Decide on names for the final output.  These have to match Makefile.am.
-  output=appliance/initramfs.@host_cpu@.img
-  koutput=appliance/vmlinuz.@host_cpu@
-  rm -f $output
-  rm -f $koutput
-
-  # Create the basic initramfs.
-  exec 5<appliance/packagelist
-  packages=
-  while read pkg 0<&5; do
-      packages="$packages -i $pkg"
-  done
-  exec 5<&-
-
-  @FEBOOTSTRAP@ $packages -u @UPDATES@ @REPO@ initramfs @MIRROR@
-
-  # Create modules.dep.  This is only used in the normal appliance
-  # (not supermin).
-  kversion=$(basename initramfs/lib/modules/*)
-  @FEBOOTSTRAP_RUN@ initramfs -- /sbin/depmod -a $kversion
-
-  # /sysroot is where the guest root filesystem will be mounted.
-  @FEBOOTSTRAP_RUN@ initramfs -- mkdir -p --mode=0777 /sysroot
-
-  # Create /tmp if it is missing.
-  @FEBOOTSTRAP_RUN@ initramfs -- mkdir -p --mode=0777 /tmp
-
-  # Create /selinux if it is missing.
-  @FEBOOTSTRAP_RUN@ initramfs -- mkdir -p --mode=0755 /selinux
-
-  # Nuke some stuff.  The kernel pulls mkinitrd and plymouth which pulls in
-  # all of Python.  Sheez.
-  (cd initramfs && find -name '*python*' -print0) |
-    xargs -0 @FEBOOTSTRAP_RUN@ initramfs -- rm -rf
-  (cd initramfs && find -name '*plymouth*' -print0) |
-    xargs -0 @FEBOOTSTRAP_RUN@ initramfs -- rm -rf
-  (cd initramfs && find -name 'libply-*' -print0) |
-    xargs -0 @FEBOOTSTRAP_RUN@ initramfs -- rm -rf
-
-  # In Fedora >= 11, it pulls in all of Perl from somewhere.  Nuke from orbit.
-  @FEBOOTSTRAP_RUN@ initramfs -- rm -rf /usr/lib/perl5 /usr/lib64/perl5
-
-  # Anaconda?  JPEG images?
-  @FEBOOTSTRAP_RUN@ initramfs -- rm -rf /usr/lib/anaconda-runtime
-
-  # Don't need any firmware.
-  @FEBOOTSTRAP_RUN@ initramfs -- rm -rf /lib/firmware
-
-  # Don't need any keyboard maps.
-  @FEBOOTSTRAP_RUN@ initramfs -- rm -rf /lib/kbd
 
 
-  # Remove anything in home directory.  Because of the potential for disaster
-  # we don't put a slash before 'home'.
-  (cd initramfs && echo home/*) |
-    xargs @FEBOOTSTRAP_RUN@ initramfs -- rm -rf
+# XXX Distro-dependent in future.
+excludes="--exclude '^perl' --exclude '^python' --exclude '^fedora-logos' --exclude '^redhat-logos' --exclude '^dracut' --exclude '^upstart' --exclude '^plymouth' --exclude '^systemd' --exclude '^linux-firmware' --exclude '^kbd-misc'"
 
 
-  # Remove /var/lib/yum stuff.
-  @FEBOOTSTRAP_RUN@ initramfs -- rm -rf /var/lib/yum
-
-  # Remove some unreadable binaries which are incompatible with
-  # the supermin appliance.  Since these binaries can't be read
-  # from the host filesystem, they cannot be added to the supermin
-  # appliance at run time.  XXX Need a better fix for this.
-  # Probably we should change febootstrap-supermin-helper to just
-  # ignore such files.
-  @FEBOOTSTRAP_RUN@ initramfs -- rm -f \
-    /usr/bin/chfn \
-    /usr/bin/chsh \
-    /usr/libexec/pt_chown \
-    /usr/libexec/utempter/utempter \
-    /usr/sbin/groupdel \
-    /usr/sbin/groupadd \
-    /usr/sbin/useradd \
-    /usr/sbin/tzdata-update \
-    /usr/sbin/userdel \
-    /usr/sbin/usermod \
-    /usr/sbin/groupmod \
-    /usr/sbin/groupmems \
-    /sbin/unix_update \
-    /usr/sbin/tcpd \
-    /usr/share/dbus-1/services/org.selinux.Restorecond.service \
-    /lib/dbus-1/dbus-daemon-launch-helper \
-    /lib64/dbus-1/dbus-daemon-launch-helper \
-    /etc/passwd- \
-    /etc/group- \
-    /etc/gshadow \
-    /etc/gshadow- \
-    /etc/shadow \
-    /etc/shadow- \
-    /etc/securetty \
-    /etc/sysconfig/iptables-config \
-    /etc/default/useradd \
-    /etc/security/opasswd \
-    /etc/libaudit.conf \
-    /var/log/tallylog \
-    /var/log/maillog \
-    /var/log/secure \
-    /var/log/spooler \
-    /var/log/messages \
-    /var/log/btmp \
-    /var/log/yum.log \
-    $(cd initramfs && echo usr/sbin/glibc_post_upgrade.*)
-
-  # Remove all .*.hmac files (RHBZ#654638).  These are not used unless
-  # you are using FIPS, and they cause hard dependencies on files
-  # which change whenever a library version is bumped.
-  @FEBOOTSTRAP_RUN@ initramfs -- rm -f $(cd initramfs && find -name '.*.hmac')
-
-  # Kernel modules take up nearly half of the image.  Only include ones
-  # which are on the whitelist.
-  exec 5<appliance/kmod.whitelist
-  whitelist=
-  while read kmod 0<&5; do
-      whitelist="$whitelist -a -not -name $kmod"
-  done
-  exec 5<&-
-
-  (cd initramfs && \
-    find lib/modules/*/kernel -name '*.ko' $whitelist -a -print0 ) |
-    xargs -0 febootstrap-run initramfs -- rm
-
-  # Pull the kernel out into the current directory.  We don't want it in
-  # the initramfs image.
-  cp initramfs/boot/vmlinuz* $koutput
-  @FEBOOTSTRAP_RUN@ initramfs -- rm -rf boot
-
-  # Minimize the image.
-  @FEBOOTSTRAP_MINIMIZE@ initramfs
-
-  # Add some missing configuration files.
-  if [ ! -f initramfs/etc/hosts ]; then
-      cat > hosts.new <<'__EOF__'
-  127.0.0.1 guestfs localhost.localdomain localhost
-  ::1       localhost6.localdomain6 localhost6
-__EOF__
-      @FEBOOTSTRAP_INSTALL@ initramfs hosts.new /etc/hosts 0644 root.root
-      rm hosts.new
-  fi
-
-  if [ ! -f initramfs/etc/fstab ]; then
-      @FEBOOTSTRAP_RUN@ initramfs -- touch /etc/fstab
-  fi
-
-  echo nameserver 169.254.2.3 > resolv.conf.new
-  @FEBOOTSTRAP_INSTALL@ initramfs resolv.conf.new /etc/resolv.conf 0644 root.root
-  rm resolv.conf.new
+# Run febootstrap on the package list.
+if [ -z "@PACKAGE_DIRECTORY@" ]; then
+    @FEBOOTSTRAP@ -v -o supermin.d $excludes --names $(< packagelist )
+else
+    @FEBOOTSTRAP@ -v -o supermin.d $excludes @PACKAGE_DIRECTORY@/*
+fi
 
 
-  ls -lh $koutput
+# Remove some things that we don't want in the appliance.  This is
+# copied from the old febootstrap-minimize.  However minimization is
+# not so important now that we are caching the appliance.
+< supermin.d/hostfiles \
+grep -v '^/usr/lib/locale' |
+grep -v '^/usr/share/locale' |
+grep -v '^/usr/lib/gconv' |
+grep -v '^/usr/lib64/gconv' |
+grep -v '^/usr/bin/localedef' |
+grep -v '^/usr/sbin/build-locale-archive' |
+grep -v '^/usr/share/man/' |
+grep -v '^/usr/share/doc/' |
+grep -v '^/usr/share/info/' |
+grep -v '^/usr/share/gnome/help/' |
+grep -v '^/usr/share/cracklib/' |
+grep -v '^/usr/share/i18n/' > supermin.d/hostfiles-t
+
+# XXX resolv.conf?  The old script had:
+# echo nameserver 169.254.2.3 > resolv.conf
+if ! grep -q /etc/resolv.conf supermin.d/hostfiles-t; then
+    echo /etc/resolv.conf >> supermin.d/hostfiles-t
+fi
 
 
-elif [ "@DIST@" = "DEBIAN" ]; then
-  cd @top_builddir@/appliance
-  debirf make -n debian
-  mkdir -p @top_builddir@/initramfs
-  touch @top_builddir@/initramfs/fakeroot.log
+# Include any Augeas lenses from the host.
+if grep -q /usr/share/augeas/lenses supermin.d/hostfiles-t; then
+    echo "/usr/share/augeas/lenses/*.aug" >> supermin.d/hostfiles-t
 fi
 fi
+
+mv supermin.d/hostfiles-t supermin.d/hostfiles
diff --git a/appliance/update.sh.in b/appliance/update.sh.in
deleted file mode 100755 (executable)
index 98d785e..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/bash -
-# @configure_input@
-# Copyright (C) 2009 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-# Update the init script or daemon inside an existing initramfs.
-# Avoids the timeconsuming rebuild.
-
-unset CDPATH
-
-set -e
-
-if [ "@DIST@" = "REDHAT" ]; then
-  cd @top_builddir@
-  output=appliance/initramfs.@host_cpu@.img
-
-  # Create the init script.
-  @FEBOOTSTRAP_INSTALL@ initramfs appliance/@top_srcdir@/appliance/init /init 0755 root.root
-
-  # Copy the daemon into the filesystem.
-  @FEBOOTSTRAP_INSTALL@ initramfs daemon/guestfsd /sbin/guestfsd 0755 root.root
-
-  # Generate final image.
-  @FEBOOTSTRAP_TO_INITRAMFS@ initramfs > $output-t
-  mv $output-t $output
-  ls -lh $output
-elif [ "@DIST@" = "DEBIAN" ]; then
-  cd @top_builddir@/appliance
-
-  output=initramfs.@host_cpu@.img
-  vmlinuz=vmlinuz.@host_cpu@
-
-  rm -f debian/debirf-libguestfs_@REPO@_.cgz
-  ln -sf debian/debirf-libguestfs_@REPO@*.cgz $output
-  ln -sf debian/vmlinuz-* $vmlinuz
-fi
index b1b4e1d..542c4fb 100644 (file)
@@ -50,10 +50,11 @@ EXTRA_DIST += test-add-libvirt-dom.c
 TESTS_ENVIRONMENT = \
        SKIP_TEST_COMMAND=$(shell ldd test-command | grep -sq 'not a dynamic executable' || echo 1) \
        SKIP_TEST_COMMAND_LINES=$(shell ldd test-command | grep -sq 'not a dynamic executable' || echo 1) \
 TESTS_ENVIRONMENT = \
        SKIP_TEST_COMMAND=$(shell ldd test-command | grep -sq 'not a dynamic executable' || echo 1) \
        SKIP_TEST_COMMAND_LINES=$(shell ldd test-command | grep -sq 'not a dynamic executable' || echo 1) \
-       SKIP_TEST_CHECKSUM_8=$(shell if test `find ../initramfs -name squashfs.ko | wc -l` -eq 0; then echo 1; fi) \
        LIBGUESTFS_PATH=$(top_builddir)/appliance \
        $(VG)
 
        LIBGUESTFS_PATH=$(top_builddir)/appliance \
        $(VG)
 
+#SKIP_TEST_CHECKSUM_8=$(shell if test `find ../initramfs -name squashfs.ko | wc -l` -eq 0; then echo 1; fi)
+
 tests_SOURCES = tests.c
 tests_CFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src \
   $(WARN_CFLAGS) $(WERROR_CFLAGS)
 tests_SOURCES = tests.c
 tests_CFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src \
   $(WARN_CFLAGS) $(WERROR_CFLAGS)
index 158d111..7ed064d 100644 (file)
@@ -188,6 +188,44 @@ AC_ARG_ENABLE([appliance],
 AM_CONDITIONAL([ENABLE_APPLIANCE],[test "x$enable_appliance" = "xyes"])
 AC_MSG_RESULT([$enable_appliance])
 
 AM_CONDITIONAL([ENABLE_APPLIANCE],[test "x$enable_appliance" = "xyes"])
 AC_MSG_RESULT([$enable_appliance])
 
+if test "x$enable_appliance" = "xyes"; then
+    dnl Check for febootstrap >= 3.0
+    AC_CHECK_PROG([FEBOOTSTRAP],
+                  [febootstrap],[febootstrap],[no])
+    test "x$FEBOOTSTRAP" = "xno" &&
+        AC_MSG_ERROR([febootstrap must be installed])
+    dnl febootstrap 2.x did not support the --version parameter
+    $FEBOOTSTRAP --version >/dev/null 2>&1 ||
+        AC_MSG_ERROR([febootstrap >= 3.0 must be installed, your version is too old])
+
+    dnl Build from local package files, used when building with no network
+    dnl access, ie. under Koji.
+    AC_MSG_CHECKING([if we should build the appliance from local packages])
+    AC_ARG_WITH([local-package-directory],
+        [AS_HELP_STRING([--with-local-package-directory],
+          [build from local packages in dir @<:@default=no@:>@])],
+        [local_package_directory=$withval],
+        [local_package_directory=no])
+    AC_MSG_RESULT([$local_package_directory])
+    PACKAGE_DIRECTORY=
+    test "x$local_package_directory" != "xno" &&
+        PACKAGE_DIRECTORY="$local_package_directory"
+    AC_SUBST([PACKAGE_DIRECTORY])
+
+    dnl Which distro?
+    dnl
+    dnl This used to be Very Important but is now just used to select
+    dnl which packages to install in the appliance, since the package
+    dnl names vary slightly across distros.  (See appliance/packagelist.in)
+    AC_MSG_CHECKING([which Linux distro for package names])
+    DISTRO=REDHAT
+    if test -f /etc/debian_version; then
+        DISTRO=DEBIAN
+    fi
+    AC_MSG_RESULT([$DISTRO])
+    AC_SUBST([DISTRO])
+fi
+
 dnl Check for rpcgen and XDR library.  rpcgen is optional.
 AC_CHECK_PROG([RPCGEN],[rpcgen],[rpcgen],[no])
 AM_CONDITIONAL([HAVE_RPCGEN],[test "x$RPCGEN" != "xno"])
 dnl Check for rpcgen and XDR library.  rpcgen is optional.
 AC_CHECK_PROG([RPCGEN],[rpcgen],[rpcgen],[no])
 AM_CONDITIONAL([HAVE_RPCGEN],[test "x$RPCGEN" != "xno"])
@@ -305,117 +343,6 @@ AC_ARG_WITH([net-if],
         [with_net_if=virtio-net-pci])
 AC_DEFINE_UNQUOTED([NET_IF],["$with_net_if"],[Default network interface.])
 
         [with_net_if=virtio-net-pci])
 AC_DEFINE_UNQUOTED([NET_IF],["$with_net_if"],[Default network interface.])
 
-dnl Check for febootstrap etc.
-if test "x$enable_appliance" = "xyes"; then
-    AC_CHECK_PROG([FEBOOTSTRAP],
-                  [febootstrap],[febootstrap],[no])
-    if test "x$FEBOOTSTRAP" != "xno"; then
-      AC_CHECK_PROG([FEBOOTSTRAP_RUN],
-                    [febootstrap-run],[febootstrap-run],[no])
-      test "x$FEBOOTSTRAP_RUN" = "xno" && \
-          AC_MSG_ERROR([febootstrap-run must be installed])
-      AC_CHECK_PROG([FEBOOTSTRAP_INSTALL],
-                    [febootstrap-install],[febootstrap-install],[no])
-      test "x$FEBOOTSTRAP_INSTALL" = "xno" && \
-          AC_MSG_ERROR([febootstrap-install must be installed])
-      AC_CHECK_PROG([FEBOOTSTRAP_MINIMIZE],
-                    [febootstrap-minimize],[febootstrap-minimize],[no])
-      test "x$FEBOOTSTRAP_MINIMIZE" = "xno" && \
-          AC_MSG_ERROR([febootstrap-minimize must be installed])
-      AC_CHECK_PROG([FEBOOTSTRAP_TO_INITRAMFS],
-                    [febootstrap-to-initramfs],[febootstrap-to-initramfs],[no])
-      test "x$FEBOOTSTRAP_TO_INITRAMFS" = "xno" && \
-          AC_MSG_ERROR([febootstrap-to-initramfs must be installed])
-      AC_CHECK_PROG([FEBOOTSTRAP_TO_SUPERMIN],
-                    [febootstrap-to-supermin],[febootstrap-to-supermin],[no])
-      test "x$FEBOOTSTRAP_TO_SUPERMIN" = "xno" && \
-          AC_MSG_ERROR([febootstrap-to-supermin must be installed])
-
-      dnl Check we have fakechroot >= 2.9 (it's an indirect requirement
-      dnl of febootstrap, but old versions will fail with yum).
-      AC_CHECK_PROG([FAKECHROOT],
-                    [fakechroot],[fakechroot],[no])
-      test "x$FAKECHROOT" = "xno" && \
-         AC_MSG_ERROR([fakechroot must be installed])
-
-      AC_MSG_CHECKING([fakechroot version])
-      fakechroot_version=`$FAKECHROOT --version | awk '{print $3}'`
-      if test -z "$fakechroot_version"; then
-        AC_MSG_RESULT([failed])
-        AC_MSG_WARN([fakechroot --version command failed, proceeding anyway])
-      else
-        AC_MSG_RESULT([$fakechroot_version])
-        fakechroot_major=`echo "$fakechroot_version" | awk -F. '{print $1}'`
-        fakechroot_minor=`echo "$fakechroot_version" | awk -F. '{print $2}'`
-        if test "$fakechroot_major" -lt 2 || \
-          ( test "$fakechroot_major" -eq 2 && test "$fakechroot_minor" -lt 9 ); then
-          AC_MSG_ERROR([fakechroot version must be >= 2.9])
-        fi
-      fi
-      DIST="REDHAT"
-    else
-      # check for debootstrap and debirf
-      AC_CHECK_PROG([DEBOOTSTRAP],
-                    [debootstrap],[debootstrap],[no])
-      test "x$DEBOOTSTRAP" = "xno" && \
-          AC_MSG_ERROR([Either febootstrap or debootstrap must be installed])
-      AC_CHECK_PROG([DEBIRF],[debirf],[debirf],[no])
-      test "x$DEBIRF" = "xno" &&
-          AC_MSG_ERROR([debirf must be installed])
-      DIST="DEBIAN"
-      case "$host_cpu" in
-      *86)
-          DEBIAN_KERNEL_ARCH=486
-          ;;
-      x86_64)
-          DEBIAN_KERNEL_ARCH=amd64
-          ;;
-      *)
-         DEBIAN_KERNEL_ARCH=$host_cpu
-         ;;
-      esac
-      AC_SUBST(DEBIAN_KERNEL_ARCH)
-    fi
-    AC_SUBST(DIST)
-
-    dnl --with-updates to specify a Fedora updates repository.
-    AC_ARG_WITH([updates],
-        [AS_HELP_STRING([--with-updates],
-          [set name of Fedora updates repository @<:@default=updates-released-f12@:>@])],
-        [],
-        [with_updates=updates-released-f12])
-    UPDATES="$with_updates"
-    AC_SUBST(UPDATES)
-
-    dnl --with-mirror to specify a local Fedora mirror.
-    AC_ARG_WITH([mirror],
-        [AS_HELP_STRING([--with-mirror],
-          [set URI of a local Fedora mirror])],
-        [],
-        [with_mirror=])
-    MIRROR="$with_mirror"
-    AC_SUBST(MIRROR)
-fi
-
-dnl --with-repo to specify a repository.
-AC_ARG_WITH([repo],
-        [AS_HELP_STRING([--with-repo],
-          [set name of Fedora repository @<:@default=fedora-13@:>@])],
-        [],
-        [with_repo=fedora-13])
-REPO="$with_repo"
-AC_SUBST(REPO)
-AC_DEFINE_UNQUOTED([REPO],["$REPO"],[Name of software repository.])
-
-dnl Build the supermin appliance?  Please see README file before
-dnl enabling this option.
-AC_ARG_ENABLE([supermin],
-        [AS_HELP_STRING([--enable-supermin],
-          [enable supermin appliance (see README) @<:@default=no@:>@])],
-        [AC_DEFINE([ENABLE_SUPERMIN],[1],[Supermin appliance enabled.])],
-        [enable_supermin=no])
-AM_CONDITIONAL([SUPERMIN],[test "x$enable_supermin" = "xyes"])
-
 dnl Enable packet dumps when in verbose mode.  This generates lots
 dnl of debug info, only useful for people debugging the RPC mechanism.
 AC_ARG_ENABLE([packet-dump],
 dnl Enable packet dumps when in verbose mode.  This generates lots
 dnl of debug info, only useful for people debugging the RPC mechanism.
 AC_ARG_ENABLE([packet-dump],
@@ -843,15 +770,12 @@ fi
 dnl Produce output files.
 AC_CONFIG_HEADERS([config.h])
 dnl http://www.mail-archive.com/automake@gnu.org/msg10204.html
 dnl Produce output files.
 AC_CONFIG_HEADERS([config.h])
 dnl http://www.mail-archive.com/automake@gnu.org/msg10204.html
-AC_CONFIG_FILES([appliance/update.sh],
-                [chmod +x appliance/update.sh])
 AC_CONFIG_FILES([podwrapper.sh],
                 [chmod +x podwrapper.sh])
 AC_CONFIG_FILES([Makefile
                  generator/Makefile
                  src/Makefile fish/Makefile po/Makefile.in examples/Makefile
                  appliance/Makefile
 AC_CONFIG_FILES([podwrapper.sh],
                 [chmod +x podwrapper.sh])
 AC_CONFIG_FILES([Makefile
                  generator/Makefile
                  src/Makefile fish/Makefile po/Makefile.in examples/Makefile
                  appliance/Makefile
-                 appliance/debian/debirf.conf
                  images/Makefile
                  capitests/Makefile
                  regressions/Makefile
                  images/Makefile
                  capitests/Makefile
                  regressions/Makefile
@@ -905,7 +829,6 @@ echo -n "PHP bindings ........................ "
 if test "x$HAVE_PHP_TRUE" = "x"; then echo "yes"; else echo "no"; fi
 echo -n "virt-* tools ........................ "
 if test "x$HAVE_TOOLS_TRUE" = "x"; then echo "yes"; else echo "no"; fi
 if test "x$HAVE_PHP_TRUE" = "x"; then echo "yes"; else echo "no"; fi
 echo -n "virt-* tools ........................ "
 if test "x$HAVE_TOOLS_TRUE" = "x"; then echo "yes"; else echo "no"; fi
-echo "supermin appliance .................. $enable_supermin"
 echo "FUSE filesystem ..................... $enable_fuse"
 echo
 echo "If any optional component is configured 'no' when you expected 'yes'"
 echo "FUSE filesystem ..................... $enable_fuse"
 echo
 echo "If any optional component is configured 'no' when you expected 'yes'"
index aa716d6..b6854b0 100644 (file)
@@ -41,6 +41,7 @@
 #include "guestfs-internal-actions.h"
 #include "guestfs_protocol.h"
 
 #include "guestfs-internal-actions.h"
 #include "guestfs_protocol.h"
 
+/* Old-style appliance is going to be obsoleted. */
 static const char *kernel_name = "vmlinuz." host_cpu;
 static const char *initrd_name = "initramfs." host_cpu ".img";
 
 static const char *kernel_name = "vmlinuz." host_cpu;
 static const char *initrd_name = "initramfs." host_cpu ".img";
 
@@ -48,13 +49,11 @@ static int find_path (guestfs_h *g, int (*pred) (guestfs_h *g, const char *pelem
 static int dir_contains_file (const char *dir, const char *file);
 static int dir_contains_files (const char *dir, ...);
 static int contains_ordinary_appliance (guestfs_h *g, const char *path, void *data);
 static int dir_contains_file (const char *dir, const char *file);
 static int dir_contains_files (const char *dir, ...);
 static int contains_ordinary_appliance (guestfs_h *g, const char *path, void *data);
-#if ENABLE_SUPERMIN
 static int contains_supermin_appliance (guestfs_h *g, const char *path, void *data);
 static char *calculate_supermin_checksum (guestfs_h *g, const char *supermin_path);
 static int check_for_cached_appliance (guestfs_h *g, const char *supermin_path, const char *checksum, char **kernel, char **initrd, char **appliance);
 static int build_supermin_appliance (guestfs_h *g, const char *supermin_path, const char *checksum, char **kernel, char **initrd, char **appliance);
 static int run_supermin_helper (guestfs_h *g, const char *supermin_path, const char *cachedir, size_t cdlen);
 static int contains_supermin_appliance (guestfs_h *g, const char *path, void *data);
 static char *calculate_supermin_checksum (guestfs_h *g, const char *supermin_path);
 static int check_for_cached_appliance (guestfs_h *g, const char *supermin_path, const char *checksum, char **kernel, char **initrd, char **appliance);
 static int build_supermin_appliance (guestfs_h *g, const char *supermin_path, const char *checksum, char **kernel, char **initrd, char **appliance);
 static int run_supermin_helper (guestfs_h *g, const char *supermin_path, const char *cachedir, size_t cdlen);
-#endif
 
 /* Locate or build the appliance.
  *
 
 /* Locate or build the appliance.
  *
@@ -90,7 +89,6 @@ guestfs___build_appliance (guestfs_h *g,
 {
   int r;
 
 {
   int r;
 
-#if ENABLE_SUPERMIN
   /* Step (1). */
   char *supermin_path;
   r = find_path (g, contains_supermin_appliance, NULL, &supermin_path);
   /* Step (1). */
   char *supermin_path;
   r = find_path (g, contains_supermin_appliance, NULL, &supermin_path);
@@ -119,7 +117,6 @@ guestfs___build_appliance (guestfs_h *g,
     }
     free (supermin_path);
   }
     }
     free (supermin_path);
   }
-#endif
 
   /* Step (5). */
   char *path;
 
   /* Step (5). */
   char *path;
@@ -150,7 +147,6 @@ contains_ordinary_appliance (guestfs_h *g, const char *path, void *data)
   return dir_contains_files (path, kernel_name, initrd_name, NULL);
 }
 
   return dir_contains_files (path, kernel_name, initrd_name, NULL);
 }
 
-#if ENABLE_SUPERMIN
 static int
 contains_supermin_appliance (guestfs_h *g, const char *path, void *data)
 {
 static int
 contains_supermin_appliance (guestfs_h *g, const char *path, void *data)
 {
@@ -536,7 +532,6 @@ run_supermin_helper (guestfs_h *g, const char *supermin_path,
   perror ("execvp");
   _exit (EXIT_FAILURE);
 }
   perror ("execvp");
   _exit (EXIT_FAILURE);
 }
-#endif
 
 /* Search elements of g->path, returning the first path element which
  * matches the predicate function 'pred'.
 
 /* Search elements of g->path, returning the first path element which
  * matches the predicate function 'pred'.