blob: 52c890d216984bc6c8f288f53c85d4edeb036e9d [file] [log] [blame]
#!/bin/bash
set -e
if test -f config.custom ; then
. config.custom
else
. config
fi
if test -z "$GOROOT" -a -d /usr/lib/go-1.8 ; then
GOROOT=/usr/lib/go-1.8
fi
if test -n "$GOROOT" ; then
export GOROOT
export GOPATH=$(pwd)/go
PATH="$GOROOT/bin:$PATH"
else
SKIP_SYZKALLER=yes
fi
if test -n "$ACCEL_BIN" -a -d "$ACCEL_BIN" ; then
PATH="$ACCEL_BIN:$PATH"
if test -x "$ACCEL_BIN/bash" ; then
SHELL="$ACCEL_BIN/bash"
fi
fi
if test -n "$TOOLCHAIN_DIR" -a -d "$TOOLCHAIN_DIR"; then
PATH=$TOOLCHAIN_DIR/bin:$PATH
fi
if test -n "$CROSS_COMPILE" ; then
cross="--build=$(e2fsprogs-libs/config/config.guess) --host=$CROSS_COMPILE"
crossfio="--cc=$CROSS_COMPILE-gcc"
fi
case "$CROSS_COMPILE" in
*-android|*-androideabi)
DO_ANDROID=yes
SKIP_KVM_UTILS=yes
SKIP_QUOTA=yes
SKIP_FIO=yes
SKIP_DBENCH=yes
;;
esac
function build_start () {
echo "----------------- $(date '+%Y-%m-%d %H:%M:%S'): Starting build of $*"
}
function set_skip_all () {
SKIP_E2FSLIBS=yes
SKIP_ATTR=yes
SKIP_ACL=yes
SKIP_POPT=yes
SKIP_AIO=yes
SKIP_DBENCH=yes
SKIP_FIO=yes
SKIP_XFSPROGS=yes
SKIP_XFSTESTS=yes
SKIP_QUOTA=yes
SKIP_KVM_UTILS=yes
SKIP_KEYUTILS=yes
SKIP_FSVERITY=yes
SKIP_IMA_EVM_UTILS=yes
SKIP_STRESS_NG=yes
SKIP_UTIL_LINUX=yes
SKIP_SYZKALLER=yes
SKIP_BLKTESTS=yes
SKIP_NVME_CLI=yes
}
# Optional components
[ -d keyutils ] || SKIP_KEYUTILS=yes
[ -d ima-evm-utils ] || SKIP_IMA_EVM_UTILS=yes
[ -d stress-ng ] || SKIP_STRESS_NG=yes
[ -d util-linux ] || SKIP_UTIL_LINUX=yes
[ -d go/src/github.com/google/syzkaller ] || SKIP_SYZKALLER=yes
[ -d blktests ] || SKIP_BLKTESTS=yes
[ -d nvme-cli ] || SKIP_NVME_CLI=yes
MAKE_CLEAN=":"
while [ "$1" != "" ]; do
case $1 in
--skip-dbench)
SKIP_DBENCH=yes
;;
--skip-quota)
SKIP_QUOTA=yes
;;
--attr-only)
set_skip_all
unset SKIP_ATTR
;;
--acl-only)
set_skip_all
unset SKIP_ACL
;;
--popt-only)
set_skip_all
unset SKIP_POPT
;;
--aio-only)
set_skip_all
unset SKIP_AIO
;;
--e2fslibs-only)
set_skip_all
unset SKIP_E2FSLIBS
;;
--dbench-only)
set_skip_all
unset SKIP_DBENCH
;;
--fio-only)
set_skip_all
unset SKIP_FIO
;;
--keyutils-only)
set_skip_all
unset SKIP_KEYUTILS
;;
--fsverity-only)
set_skip_all
unset SKIP_FSVERITY
;;
--ima-evm-utils-only)
set_skip_all
unset SKIP_IMA_EVM_UTILS
;;
--quota-only)
set_skip_all
unset SKIP_QUOTA
;;
--stress-ng-only)
set_skip_all
unset SKIP_STRESS_NG
;;
--syzkaller-only)
set_skip_all
unset SKIP_SYZKALLER
;;
--util-linux-only)
set_skip_all
unset SKIP_UTIL_LINUX
;;
--xfsprogs-only)
set_skip_all
unset SKIP_XFSPROGS
;;
--xfstests-only)
set_skip_all
unset SKIP_XFSTESTS
;;
--kvm-utils-only)
set_skip_all
unset SKIP_KVM_UTILS
;;
--blktests-only)
set_skip_all
unset SKIP_BLKTESTS
;;
--nvme-cli-only)
set_skip_all
unset SKIP_NVME_CLI
;;
--clean-first)
MAKE_CLEAN="make clean"
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
shift
done
nr_cpus=$(getconf _NPROCESSORS_ONLN)
J=-j$(expr $nr_cpus \* 1)
DESTDIR=$(pwd)/bld
mkdir -p $DESTDIR
if test -n "$DO_ANDROID" ; then
build_start "Android compatibility library"
(cd android-compat; ./configure $cross ; $MAKE_CLEAN ; \
make $J prefix=$DESTDIR install)
android_compat="-landroid_compat"
LCF="-fpie -include android_compat.h"
LLF="-pie"
else
LCF="-g -O2"
fi
# To make the build more reproducible...
export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
export BUILD_PATH_PREFIX_MAP="xfstests-bld=$(pwd)"
# GCC doesn't yet understand BUILD_PATH_PREFIX_MAP
LCF="$LCF -fdebug-prefix-map=$(pwd)=xfstests-bld -gno-record-gcc-switches"
if test -z "$SKIP_E2FSLIBS" ; then
build_start "e2fslibs"
(cd e2fsprogs-libs; \
CFLAGS="$LCF -I$DESTDIR/include" \
LDFLAGS="$LLF $EXEC_LDFLAGS -L$DESTDIR/lib" \
./configure $cross --prefix=/ --disable-nls; $MAKE_CLEAN ; make $J; \
make DESTDIR=$DESTDIR $J install)
fi
if test -z "$SKIP_ATTR" ; then
build_start "extended attribute library"
(cd attr; \
CFLAGS="$LCF -I$DESTDIR/include" \
LDFLAGS="$LLF $EXEC_LDFLAGS -static -L$DESTDIR/lib" \
./configure $cross --prefix=$DESTDIR --disable-nls; $MAKE_CLEAN ; \
make $J LDFLAGS="$LLF $EXEC_LLDFLAGS -L$DESTDIR/lib" ; \
make $J install-dev ; make $J install)
fi
if test -z "$SKIP_ACL" ; then
build_start "ACL library"
(cd acl; \
CPPFLAGS="-I$DESTDIR/include" \
CFLAGS="$LCF -I$DESTDIR/include" \
LDFLAGS="$LLF $EXEC_LDFLAGS -L$DESTDIR/lib" \
./configure $cross --prefix=$DESTDIR --disable-nls; $MAKE_CLEAN ; \
make $J LDFLAGS="$LLF $EXEC_LLDFLAGS -static -L$DESTDIR/lib" ; \
make $J install)
fi
if test -z "$SKIP_POPT" ; then
build_start "POPT library"
(cd popt; \
CPPFLAGS="-I$DESTDIR/include" \
CFLAGS="$LCF -I$DESTDIR/include" \
LDFLAGS="$LLF -static -L$DESTDIR/lib" \
./configure $cross --prefix=$DESTDIR --disable-nls; $MAKE_CLEAN ; \
make $J LLDFLAGS=-all-static ; \
make $J install)
fi
if test -z "$SKIP_AIO" ; then
build_start "AIO library"
(cd libaio; ./configure $cross --disable-nls; $MAKE_CLEAN ;
make $J prefix=$DESTDIR install)
rm $DESTDIR/lib/libaio.so*
fi
if test -z "$SKIP_KEYUTILS" ; then
build_start "keyutils"
(cd keyutils ;
ver=$(git describe --always --dirty); echo "keyutils $ver ($(git log -1 --pretty=%cD))" > ../keyutils.ver ;
if [ -n "$CROSS_COMPILE" ]; then
export CC="$CROSS_COMPILE-gcc"
export AR="$CROSS_COMPILE-ar"
fi
# Specify NO_SOLIB=1 so that libkeyutils is only built as a static
# library. Then keyctl will be statically linked to it, and we won't
# have to install libkeyutils.so.
$MAKE_CLEAN ;
make $J NO_SOLIB=1 CFLAGS="$LCF" LDFLAGS="$EXEC_LDFLAGS" keyctl libkeyutils.a;
install -D -m 0755 keyctl $DESTDIR/bin/keyctl ;
install -D -m 0644 keyutils.h $DESTDIR/include/keyutils.h ;
install -D -m 0644 libkeyutils.a $DESTDIR/include/libkeyutils.a ;
)
fi
if test -z "$SKIP_FSVERITY"; then
build_start "fsverity"
(cd fsverity; \
ver=$(git describe --always --dirty); echo "fsverity $ver ($(git log -1 --pretty=%cD))" > ../fsverity.ver ; \
$MAKE_CLEAN ; make $J all ; make install DESTDIR=$DESTDIR)
fi
if test -z "$SKIP_IMA_EVM_UTILS" ; then
build_start "ima-evm-utils"
(cd ima-evm-utils; \
ver=$(git describe --always --dirty); echo "ima-evm-utils $ver ($(git log -1 --pretty=%cD))" > ../ima-evm-utils.ver ; \
mv INSTALL INSTALL.save ; ./autogen.sh; mv INSTALL.save INSTALL ; \
CFLAGS="$LCF -I$DESTDIR/include" \
LDFLAGS="$LLF $EXEC_LDFLAGS -static -L$DESTDIR/lib" \
./configure $cross --prefix=$DESTDIR ; $MAKE_CLEAN ; \
make $J LDFLAGS="$LLF $EXEC_LLDFLAGS -L$DESTDIR/lib" dist_man_MANS= ; \
make $J install dist_man_MANS= )
fi
if test -z "$SKIP_UTIL_LINUX" ; then
build_start "util-linux"
(cd util-linux ;
ver=$(git describe --always --dirty); echo "util-linux $ver ($(git log -1 --pretty=%cD))" > ../util-linux.ver ;
./autogen.sh;
CFLAGS="$LCF -I$DESTDIR/include" \
LDFLAGS="$LLF $EXEC_LDFLAGS -L$DESTDIR/lib" \
./configure $cross --prefix=$DESTDIR \
--disable-makeinstall-chown \
--disable-makeinstall-setuid \
--disable-use-tty-group \
--disable-bash-completion \
--disable-nls \
--disable-shared \
--disable-wall \
--disable-write \
--without-ncurses \
--without-python \
--without-tinfo;
$MAKE_CLEAN ; make $J install;
# Installing mkfs causes problems because xfstests assumes that mkfs.ext4
# is in the same directory as mkfs. So rely on the system mkfs instead.
rm $DESTDIR/sbin/mkfs*;
)
fi
if test -z "$SKIP_STRESS_NG" ; then
build_start "stress-ng"
mkdir -p $DESTDIR/lib
mkdir -p $DESTDIR/bin
(cd stress-ng; \
export CFLAGS="$LCF -I$DESTDIR/include" ; \
export LDFLAGS="$LLF $EXEC_LDFLAGS -L$DESTDIR/lib" ; \
$MAKE_CLEAN ; make makeconfig ; make $J ; make DESTDIR=$DESTDIR $J install ; \
ver=$(git describe --always --dirty); echo "stress-ng $ver ($(git log -1 --pretty=%cD))" > ../stress-ng.ver ; \
)
fi
if test -z "$SKIP_DBENCH" ; then
build_start "dbench"
mkdir -p $DESTDIR/lib
mkdir -p $DESTDIR/bin
(cd dbench; \
autoheader ; autoconf ; \
CFLAGS="$LCF -I$DESTDIR/include" \
CPPFLAGS="-I$DESTDIR/include" \
LDFLAGS="$EXEC_LDFLAGS" \
LIBS="$LLF -L$DESTDIR/lib" \
./configure $cross --datadir=/root/xfstests/lib; \
$MAKE_CLEAN ; make $J ; cp dbench $DESTDIR/bin ; cp client.txt $DESTDIR/lib)
fi
if test -z "$SKIP_XFSPROGS" ; then
build_start "xfsprogs"
(cd xfsprogs-dev; \
export CFLAGS="$LCF -I$DESTDIR/include" ; \
export CPPFLAGS="-I$DESTDIR/include" ; \
export LDFLAGS="$LLF -static -L$DESTDIR/lib" ; \
export LIBS=-lpthread ; \
export LOCAL_CONFIGURE_OPTIONS="$cross --prefix=/ --disable-lib64 --disable-gettext --disable-libicu --disable-blkid" ; \
make $J realclean ; make $J configure ; \
ver=$(git describe --always --dirty); echo "xfsprogs $ver ($(git log -1 --pretty=%cD))" > ../xfsprogs.ver ; \
aclocal -I m4 ; autoconf -I m4 ; \
./configure $LOCAL_CONFIGURE_OPTIONS ; \
make $J LLDFLAGS=-all-static V=1 PLDLIBS="$android_compat" ; \
DIST_ROOT=$DESTDIR make prefix=/ $J install; \
DIST_ROOT=$DESTDIR make prefix=/ $J install-dev)
fi
find . -name \*.la | xargs rm -f # Die, libtool, die!!!!
if test -z "$SKIP_FIO"; then
build_start "fio"
(cd fio; \
ver=$(git describe --always --dirty); echo "fio $ver ($(git log -1 --pretty=%cD))" > ../fio.ver ; \
export CFLAGS="$LCF -I$DESTDIR/include" ; \
export LDFLAGS="$LLF $EXEC_LDFLAGS -L$DESTDIR/lib" ; \
$MAKE_CLEAN ; ./configure $crossfio --extra-cflags="$CFLAGS"; make V=1 prefix=/ $J; make prefix=/ V=1 DESTDIR=$DESTDIR $J install)
fi
if test -z "$SKIP_XFSTESTS" ; then
build_start "xfstests"
(cd xfstests-dev; \
ver=$(git describe --always --dirty); echo "xfstests $ver ($(git log -1 --pretty=%cD))" > ../xfstests.ver ; \
autoreconf --include=m4 ; \
export CFLAGS="$LCF -I$DESTDIR/include -fno-stack-protector" ; \
export CPPFLAGS="-I$DESTDIR/include" ; \
export LDFLAGS="$LLF -static -L$DESTDIR/lib" ; \
export LIBS=-lpthread ; \
export LOCAL_CONFIGURE_OPTIONS="$cross" ; \
libtoolize -i ; $MAKE_CLEAN ; \
./configure $cross ; \
make $J LLDFLAGS=$EXEC_LLDFLAGS PLDLIBS="$android_compat" BUILD_VERBOSE=1)
fi
if test -z "$SKIP_QUOTA"; then
build_start "quota-tools"
#
# Hack around older quota-tools's lack of cross compilation support
#
if test -f quota/Makefile.in && ! grep -q "@CC@" quota/Makefile.in ; then
echo "No @CC@"
ed quota/Makefile.in <<EOF
1i
CC = @CC@
.
w
q
EOF
fi
(cd quota; \
ver=$(git describe --always --dirty); echo "quota $ver ($(git log -1 --pretty=%cD))" > ../quota.ver ; \
export CFLAGS="$LCF -I$DESTDIR/include" ; \
export LDFLAGS="$LLF $EXEC_LDFLAGS -L$DESTDIR/lib $EXEC_LDFLAGS" ; \
export CPPFLAGS="-I$DESTDIR/include" ; \
autoreconf -fvi ; \
./configure $cross --enable-ext2direct=no --enable-nls=no --prefix=$DESTDIR ; \
$MAKE_CLEAN ; make AM_LDFLAGS="" V=1 $J; make V=1 $J install)
fi
if test -z "$SKIP_SYZKALLER"; then
build_start "syzkaller"
(cd go/src/github.com/google/syzkaller; \
ver=$(git describe --always --dirty); echo "syzkaller $ver ($(git log -1 --pretty=%cD))" > ../../../../../syzkaller.ver ; \
$MAKE_CLEAN ; make $J execprog executor ; cp bin/*/syz-* $DESTDIR/bin)
fi
if test -z "$SKIP_BLKTESTS"; then
build_start "blktests"
(cd blktests ; $MAKE_CLEAN ; make ; \
ver=$(git describe --always --dirty); echo "blktests $ver ($(git log -1 --pretty=%cD))" > ../blktests.ver)
fi
if test -z "$SKIP_NVME_CLI"; then
build_start "nvme-cli"
(cd nvme-cli ; $MAKE_CLEAN ; make CFLAGS="$LCF -I. -I$DESTDIR/include " \
LDFLAGS="$LLF $EXEC_LDFLAGS -L$DESTDIR/lib" ; \
install -D -m 0755 nvme $DESTDIR/bin/nvme ; \
ver=$(git describe --always --dirty --tags); echo "nvme-cli $ver ($(git log -1 --pretty=%cD))" > ../nvme-cli.ver)
fi
if test -z "$SKIP_KVM_UTILS"; then
build_start "misc VM utils"
(cd misc ; LDFLAGS="$EXEC_LDFLAGS -L$DESTDIR/lib" ./configure $cross ; \
$MAKE_CLEAN ; make $J ; make install DESTDIR=$DESTDIR)
fi