Files
libdwarf-code/scripts/buildandreleasetest.sh
David Anderson e65fc8c500 cmake and meson builds here defaulted to shared,
which was not working on MacOS, possibly due to
issues with copying libraries around (without
the proper details for MacOS).
So now we just default all build mechanisms
to be static library builds.
Works on Linux and MacOS without other changes.
	modified:   scripts/buildandreleasetest.sh
2024-08-15 09:53:31 -07:00

470 lines
13 KiB
Bash

#!/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