#!/bin/sh
# Copyright (C) 2021 David Anderson
# This test script is in the public domain for use
# by anyone for any purpose.
echo "sh scripts/buildandreleasetest.sh [--static|--shared]"
echo " [--disable-dwarfgen] [--enable-wall] [--savebart]"
echo " --savebart means do not delete temp files"
echo " Defaults to shared library build and use"
# A script verifying the distribution gets all needed files
# for building, including "make check"
#
# For a guaranteed clean run:
# sh autogen.sh
# sh scripts/buildandreleasetest.sh
# All the generated files are in /tmp/bart
#
echo 'Starting buildandreleasetest.sh:' \
`date "+%Y-%m-%d %H:%M:%S"`
stsecs=`date '+%s'`
shared=y
configureopt="--enable-shared --disable-static"
cmakeopt="-DBUILD_SHARED=NO -DBUILD_NON_SHARED=YES"
mesonopt="--default-library static"
# accomodate differences in cmake install file count:
# 16 is for 32bit build
# 18 is for 64bit build
#expectlen32=16
#expectlen64=18
genopta="--enable-dwarfgen"
genoptb="-DBUILD_DWARFGEN=ON"
wd=`pwd`
# If passes, remove the /tmp/bart working directory.
# Useful to consider if all intended files actually present,
# including any possibly not used.
savebart=n
enablewall=n
staticbuild=y
while [ $# -ne 0 ]
do
case $1 in
--static ) shared=n ;
staticbuild=y
configureopt="--enable-static --disable-shared"
cmakeopt="-DBUILD_SHARED=NO -DBUILD_NON_SHARED=YES"
mesonopt="--default-library static"
shift ;;
--shared ) shared=y ;
staticbuild=n
configureopt="--enable-shared --disable-static"
cmakeopt="-DBUILD_SHARED=YES -DBUILD_NON_SHARED=NO"
mesonopt="--default-library shared"
shift ;;
--enable-wall ) enablewall=y; shift ;;
--savebart ) savebart=y ; shift ;;
--disable-dwarfgen ) genopta='' ; genoptb='' ; shift ;;
* ) echo "Unknown buildandreleasetest.sh option $1. Error." ; exit 1 ;;
esac
done
if [ "x$enablewall" = "y" ]
then
configureopt="$configureopt --enable-wall"
cmakeopt="$cmakeopt -DWALL=YES"
mesonopt="$mesonopt -Dwerror=true"
else
cmakeopt="$cmakeopt"
mesonopt="$mesonopt -Dwerror=false"
fi
echo "Build specific options:"
echo " configure : $configureopt"
echo " cmake : $cmakeopt"
echo " meson : $mesonopt"
echo "savebart flag:...: $savebart"
if [ "$staticbuild" = "y" ]
then
if [ "x$USERDOMAIN" = "xMSYS" ]
then
echo "Libdwarf configure objects to a static build"
echo "on Windows Msys2 so this script will not work"
echo "here. Giving up."
exit 1
fi
fi
if [ -f ./configure.ac ]
then
f=./configure.ac
else
if [ -f ../configure.ac ]
then
f=../configure.ac
else
echo "FAIL Running distribution test from the wrong place."
exit
fi
fi
if [ ! -x ./configure ]
then
echo "./configure is missing or not executable."
echo "Possibly one needs to run autogen.sh?"
echo "Giving up"
exit 1
fi
v=`./configure --version | head -n 1 | cut -f 3 -d " "`
echo "configure.ac version is v=$v"
if [ x$v = "x" ]
then
echo FAIL did not get configure.ac version
exit 1
fi
chkres() {
if [ $1 -ne 0 ]
then
echo "$2"
exit 1
fi
}
mdirs() {
while [ $# -ne 0 ]
do
f=$1
rm -rf $f
mkdir $f
chkres $? "mkdir $f failed!"
shift
done
}
safecd() {
f=$1
cd $f
chkres $? "cd $f failed $2"
}
safemv() {
s=$1
t=$2
echo "mv $s $t"
mv $s $t
chkres $? "mv $f $t failed $3"
}
showinstalled() {
dir=$1
msg=$2
tmpdir=$3
echo "REPORT OF INSTALLED FILES in $dir $msg"
if [ ! -d $dir ]
then
echo "Target install directory $1 does not exist"
echo "Fatal error"
exit 1
fi
find $dir -type f -print >$tmpdir
len=`wc -l <$tmpdir`
echo "Number of files $len"
cat $tmpdir
echo "======end of install list"
echo ""
}
configloc=$wd/configure
bart=/tmp/bart
abld=$bart/a-dwbld
ainstall=$bart/a-install
binstrelp=$bart/a-installrelp
binstrelbld=$bart/b-installrelbld
blibsrc=$bart/b-libsrc
crelbld=$bart/c-installrelbld
cinstrelp=$bart/c-installrelp
dbigend=$bart/d-bigendian
ecmakebld=$bart/e-cmakebld
fcmakebld=$bart/f-cmakebld
fcmakeinst=$bart/f-cmakeinstalltarg
gcmakebld=$bart/g-cmakebld
hcmakebld=$bart/h-cmakebld
imesonbld=$bart/i-mesonbld
mdirs $bart $abld $ainstall $binstrelp $binstrelbld $crelbld
mdirs $cinstrelp $dbigend $ecmakebld $fcmakebld $gcmakebld
mdirs $hcmakebld $imesonbld
relset=$bart/a-gzfilelist
atfout=$bart/a-tarftout
btfout=$bart/b-tarftout
btfoutb=$bart/b-tarftoutb
ftfout=$bart/f-tarftout
itfout=$bart/i-tarftout
rm -rf $bart/a-dwrelease
rm -rf $blibsrc
arelgz=$bart/a-dwrelease.tar.gz
brelgz=$bart/b-dwrelease.tar.gz
rm -rf $arelgz
rm -rf $brelgz
echo "dirs created empty"
echo cd $abld
safecd $abld "FAIL A cd failed"
echo "now: $configloc $configureopt --prefix=$ainstall"
$configloc $configureopt --prefix=$ainstall
r=$?
chkres $r "FAIL A4a configure fail"
echo "TEST Section A: initial $ainstall make install"
make
make doc
chkres $? "FAIL Section A 4rb make doc"
make install
chkres $? "FAIL Section A 4b make install"
showinstalled $ainstall "using configure" $atfout
ls -lR $ainstall
make dist
chkres $? "FAIL make dist Section A"
# We know there is just one tar.gz in $abld, that we just created
ls -1 ./*tar.gz
chkres $? "FAIL Section A ls ./*tar.gz"
safemv ./*.tar.gz $arelgz "FAIL Section A moving gz"
ls -l $arelgz
tar -zxf $arelgz
chkres $? "FAIL A B2tar tar -zxf $arelgz"
safemv libdwarf-$v $blibsrc "FAIL moving libdwarf srcdir"
echo " End Section A $bart"
################ End Section A
################ Start Section B
echo "TEST Section B: now cd $binstrelbld for second build install"
safecd $binstrelbld "FAIL B cd"
echo "TEST: now second install install, prefix $binstrelp"
echo "TEST: Expecting src in $blibsrc"
$blibsrc/configure $configureopt --enable-dwarfgen --enable-dwarfexample --prefix=$binstrelp
chkres $? "FAIL configure fail in Section B"
echo "TEST: In $binstrelbld make install from $blibsrc/configure"
make
chkres $? "FAIL make fail in Section B"
make doc
chkres $? "FAIL make doc fail in Section B"
make install
chkres $? "FAIL Section B install fail"
showinstalled $binstrelp "config, secondary install" $btfoutb
echo "TEST: Now lets see if make check works"
make check
chkres $? "FAIL make check in Section B"
make dist
chkres $? "FAIL make dist Section B"
# We know there is just one tar.gz in $abld, that we just created
ls -1 ./*tar.gz
safemv ./*.tar.gz $brelgz "FAIL Section B moving gz"
ls -l $arelgz
ls -l $brelgz
# gzip does not build diffs quite identically to the byte.
# Lots of diffs, So we do tar tf to get the file name list.
echo "Now tar -tf on $arelgz and $brelgz "
# Sort as freebsd64 manages a distinct order at times.
tar -tf $arelgz | sort > $atfout
tar -tf $brelgz | sort > $btfout
echo "=========================diff make dist content========="
echo "Now diff the tar tf from $arelgz and $brelgz"
diff $atfout $btfout
chkres $? "FAIL second gen tar gz file list does not match first gen"
echo " End Section B $bart"
################ End section B
################ Start section C
echo "TEST Section C: now cd $dbigend for big-endian build (not runnable) "
safecd $dbigend "FAIL C be1 "
echo "TEST: now second install install, prefix $crelbld"
echo "TEST: Expecting src in $blibsrc"
echo "TEST: $blibsrc/configure $genopta --enable-wall --enable-dwarfexample --prefix=$crelbld"
$blibsrc/configure $configureopt $genopta --enable-dwarfexample --prefix=$cinstrelp
chkres $? "FAIL be2 configure fail"
echo "#define WORDS_BIGENDIAN 1" >> config.h
echo "TEST: Compile In $dbigend make from $blibsrc/configure"
make
chkres $? "FAIL be3 make: Build failed"
make doc
chkres $? "FAIL be3 make doc: failed"
echo " End Section C $bart"
################ End section C
################ Start section D
safecd $crelbld "FAIL section D cd "
echo "TEST: Now configure from source dir $blibsrc/ in build dir $crelbld"
$blibsrc/configure $configureopt --enable-dwarfexample $genopta
chkres $? "FAIL C9 $blibsrc/configure"
make
chkres $? "FAIL C9 $blibsrc/configure make"
make doc
chkres $? "FAIL C9 $blibsrc/configure make doc"
echo " End Section D $bart"
################### End Section D
################### Cmake test E
safecd $ecmakebld "FAIL C10 Section E cd"
havecmake=n
which cmake >/dev/null
if [ $? -eq 0 ]
then
havecmake=y
echo "We have cmake and can test it."
fi
if [ $havecmake = "y" ]
then
echo "TEST E: Now cmake from source dir $blibsrc/ in build dir $ecmakebld"
cmake -G Ninja $cmakeopt $genoptb \
-DBUILD_NON_SHARED=ON \
-DBUILD_DWARFEXAMPLE=ON\
-DDO_TESTING=ON $blibsrc
chkres $? "FAIL C10b cmake in $ecmakdbld"
ninja
chkres $? "FAIL C10c cmake make in $ecmakebld"
ninja test
#chkres $? "FAIL C10d cmake make test in $ecmakebld"
#ctest -R self
chkres $? "FAIL C10e ctest -R self in $ecmakebld"
else
echo "cmake not installed so Test section E not tested."
fi
echo " End Section E $bart (ls output follows)"
ls $bart
############ End Section E
################### Cmake test F
safecd $fcmakebld "FAIL C11 Section F cd"
havecmake=n
which cmake >/dev/null
if [ $? -eq 0 ]
then
havecmake=y
echo "We have cmake and can test it: test F."
fi
if [ x$havecmake = "xy" ]
then
echo "TEST F: Now cmake from source dir $blibsrc/ in build dir $fcmakebld"
# We are doing -DBUILD_DWARFGEN=ON as a sanity check.
# Building lidwarfp and dwarfgen.
# You should not be building or installing dwarfgen
# or libdwarfp, it is unlikely you have a use
# for lidwarfp and dwarfgen.
cmake -G "Unix Makefiles" $cmakeopt $genoptb \
-DCMAKE_INSTALL_PREFIX=$fcmakeinst \
-DWALL=ON \
-DBUILD_DWARFEXAMPLE=ON \
-DDO_TESTING=ON $blibsrc
chkres $? "FAIL Sec F C11b cmake in $ecmakdbld"
make
chkres $? "FAIL Sec F C11c cmake make in $fcmakebld"
make test
chkres $? "FAIL Sec F C11d cmake make test in $fcmakebld"
make install
chkres $? "FAIL Sec F C11d cmake install in $fcmakebld"
showinstalled $fcmakeinst "using cmake" $ftfout
ctest -R self
chkres $? "FAIL Sec F C11e ctest -R self in $fcmakebld"
else
echo "cmake not installed (sec. F) not tested."
fi
echo " End Section F $bart (ls output follows)"
ls $bart
############ End Section F
################### Cmake test G
safecd $gcmakebld "FAIL C11 Section G cd"
havecmake=n
which cmake >/dev/null
if [ $? -eq 0 ]
then
havecmake=y
echo "We have cmake and can test it."
fi
if [ $havecmake = "y" ]
then
echo "TEST: Now cmake sharedlib from source dir $blibsrc/ in build dir $gcmakebld"
echo " lidwarfp expects to see hidden symbols. "
cmake -G "Unix Makefiles" $cmakeopt $genoptb \
-DDO_TESTING=ON \
-DBUILD_DWARFEXAMPLE=ON $blibsrc
chkres $? "FAIL Sec F C11b cmake in $gcmakdbld"
make
chkres $? "FAIL Sec F C11d cmake make in $gcmakebld"
LD_LIBRARY_PATH="$gcmakebld/src/lib/libdwarf:$LD_LIBRARY_PATH" ctest -R self
chkres $? "FAIL Sec F C11e ctest -R self in $gcmakebld"
else
echo "cmake not installed so Section G not tested."
fi
echo " End Section G $bart (ls output follows)"
ls $bart
############ End Section G
################### Cmake test H
safecd $hcmakebld "FAIL C12 Section H cd"
havecmake=n
which cmake >/dev/null
if [ $? -eq 0 ]
then
havecmake=y
echo "We have cmake and can test it."
else
echo "We do NOT have cmake, cannot test it."
fi
if [ $havecmake = "y" ]
then
echo "TEST: Now cmake from source dir $blibsrc/ in build dir $gcmakebld"
cmake -G "Unix Makefiles" $cmakeopt \
-DDO_TESTING=ON \
-DBUILD_DWARFEXAMPLE=ON $blibsrc
chkres $? "FAIL Sec H C12b cmake in $hcmakdbld"
make
chkres $? "FAIL Sec H C12d cmake make test in $hcmakebld"
ctest -R self
chkres $? "FAIL Sec H C12e ctest -R self in $hcmakebld"
else
echo "cmake not installed so Section H not tested."
fi
echo " End Section H $bart (ls output follows)"
ls $bart
############ End Section H
################### Cmake test I
safecd $imesonbld "FAIL C13 Section I cd"
havemeson=n
haveninja=n
which meson >/dev/null
if [ $? -eq 0 ]
then
havemeson=y
echo "We have meson and can test it."
which ninja >/dev/null
if [ $? -eq 0 ]
then
haveninja=y
else
echo "We do NOT have ninja, cannot test it."
fi
else
echo "We do NOT have meson, cannot test it or ninja."
fi
if [ $havemeson = "y" ]
then
echo "TEST: Now meson from source dir $blibsrc/ in build dir $imesonbld"
meson $wd $mesonopt --prefix=$imesonbld-dist
if [ $haveninja = "y" ]
then
ninja -j8 install
chkres $? " FAIL C13 ninja -j8 install"
showinstalled $imesonbld-dist "using meson" $itfout
ninja test
chkres $? " FAIL C13 ninja test"
else
echo "Skipping ninja, it is not installed"
fi
else
echo "meson not installed so Section I not tested."
fi
echo " End Section I $bart (ls output follows)"
ls $bart
############ End Section I
ndsecs=`date '+%s'`
showminutes() {
t=`expr \( $2 \- $1 \+ 29 \) \/ 60`
echo "Run time in minutes: $t"
}
showminutes $stsecs $ndsecs
echo "PASS scripts/buildandreleasetest.sh"
if [ "$savebart" = "n" ]
then
rm -rf $bart
fi
exit 0