2016-05-26 10:15:09 -05:00
#!/bin/bash
# Hacks due to not following standards
declare -A MODULE_EXTRA_DIR
MODULE_EXTRA_DIR[ IFEM-BeamEx] = IFEM-Elasticity/
MODULE_EXTRA_DIR[ IFEM-FiniteDeformation] = IFEM-Elasticity/
declare -A MODULE_APP_DIR
MODULE_APP_DIR[ IFEM-BeamEx] = BeamSim
MODULE_APP_DIR[ IFEM-Elasticity] = Linear
MODULE_APP_DIR[ IFEM-FiniteDeformation] = Nonlinear
2018-04-24 23:51:15 -05:00
declare -A MODULE_EXTRA_APP_DIR
MODULE_EXTRA_APP_DIR[ IFEM-Elasticity] = Shell
2016-05-26 10:15:09 -05:00
# Parse revisions from trigger comment and setup arrays
function parseRevisions {
for upstream in ${ upstreams [*] }
do
if grep -qi " $upstream = " <<< $ghprbCommentBody
then
upstreamRev[ $upstream ] = pull/` echo $ghprbCommentBody | sed -r " s/.* ${ upstream ,, } =([0-9]+).*/\1/g " ` /merge
fi
done
if grep -q "with downstreams" <<< $ghprbCommentBody
then
2019-02-01 02:24:12 -06:00
for sidestream in ${ sidestreams [*] }
do
if grep -qi " $sidestream = " <<< $ghprbCommentBody
then
sidestreamRev[ $sidestream ] = pull/` echo $ghprbCommentBody | sed -r " s/.* ${ sidestream ,, } =([0-9]+).*/\1/g " ` /merge
fi
done
2016-05-26 10:15:09 -05:00
for downstream in ${ downstreams [*] }
do
if grep -qi " $downstream = " <<< $ghprbCommentBody
then
downstreamRev[ $downstream ] = pull/` echo $ghprbCommentBody | sed -r " s/.* ${ downstream ,, } =([0-9]+).*/\1/g " ` /merge
fi
done
fi
# Default to a serial build if no types are given
if test -z " $BTYPES "
then
BTYPES = "serial"
fi
# Convert to arrays for easy looping
BTYPES_ARRAY = ( $BTYPES )
TOOLCHAINS = ( $CMAKE_TOOLCHAIN_FILES )
}
# Print revisions and configurations
function printHeader {
2018-09-05 08:02:54 -05:00
echo "Repository revisions:"
printf "\t [main library] %25s = %s\n" IFEM $IFEM_REVISION
2016-05-26 10:15:09 -05:00
for upstream in ${ upstreams [*] }
do
2018-09-05 08:02:54 -05:00
printf "\t [upstream] %25s = %s\n" $upstream ${ upstreamRev [ $upstream ] }
2016-05-26 10:15:09 -05:00
done
if [ " $1 " != "IFEM" ]
then
2018-09-05 08:02:54 -05:00
printf "\t [main module] %25s = %s\n" $1 $sha1
2016-05-26 10:15:09 -05:00
fi
if grep -q "with downstreams" <<< $ghprbCommentBody
then
2019-02-01 02:24:12 -06:00
for sidestream in ${ sidestreams [*] }
do
printf "\t [sidestream] %25s = %s\n" $sidestream ${ sidestreamRev [ $sidestream ] }
done
2016-05-26 10:15:09 -05:00
for downstream in ${ downstreams [*] }
do
2018-09-05 08:02:54 -05:00
printf "\t [downstream] %25s = %s\n" $downstream ${ downstreamRev [ $downstream ] }
2016-05-26 10:15:09 -05:00
done
fi
2018-09-05 08:02:54 -05:00
echo "Configurations to process:"
if test -n " $BTYPES "
then
2019-02-01 02:24:12 -06:00
for conf in ${ !BTYPES_ARRAY[@] }
2018-09-05 08:02:54 -05:00
do
if test -n " ${ TOOLCHAINS [ $conf ] } "
then
2019-02-01 02:24:12 -06:00
echo -e " \t ${ BTYPES_ARRAY [ $conf ] } = ${ TOOLCHAINS [ $conf ] } "
2018-09-05 08:02:54 -05:00
fi
done
fi
2016-05-26 10:15:09 -05:00
}
# $1 = Additional cmake parameters
# $2 = 0 to build and install module, 1 to build and test module
# $3 = Source root of module to build
function build_module {
cmake $3 -DCMAKE_BUILD_TYPE= Release $1
test $? -eq 0 || exit 1
# Threaded build
nproc = ` nproc`
if test $2 -eq 1
then
cmake --build . --target testapps -- -j$nproc
test $? -eq 0 || exit 2
2021-09-01 09:05:17 -05:00
njob = $(( $nproc / 2 ))
nomp = $(( $nproc > 1 ? 2 : 1 ))
2022-05-11 08:49:26 -05:00
CTEST_OP = ${ CTEST_OP :- Test }
2017-05-31 02:36:20 -05:00
if test -z " $CTEST_CONFIGURATION "
then
2022-05-11 08:49:26 -05:00
OMP_NUM_THREADS = $nomp ctest -T ${ CTEST_OP } --test-timeout 180 --no-compress-output -j$njob
2017-05-31 02:36:20 -05:00
else
2022-05-11 08:49:26 -05:00
OMP_NUM_THREADS = $nomp ctest -C $CTEST_CONFIGURATION -T ${ CTEST_OP } --test-timeout 180 --no-compress-output -j$njob
2022-05-11 04:58:58 -05:00
for log in Testing/Temporary/MemoryCheck.*.log
do
if ! grep -q "ERROR SUMMARY: 0 errors" $log
then
cat $log >> failed.log
fi
done
2017-05-31 02:36:20 -05:00
fi
2016-05-26 10:15:09 -05:00
$WORKSPACE /deps/IFEM/jenkins/convert.py -x $WORKSPACE /deps/IFEM/jenkins/conv.xsl -t . > testoutput.xml
else
cmake --build . --target install -- -j$nproc
fi
}
# $1 = Name of module
# $2 = git-rev to use for module
function clone_module {
# Already cloned by another configuration
if test -d $WORKSPACE /deps/${ MODULE_EXTRA_DIR [ $1 ] } $1
then
return
fi
pushd .
mkdir -p $WORKSPACE /deps/${ MODULE_EXTRA_DIR [ $1 ] } $1
cd $WORKSPACE /deps/${ MODULE_EXTRA_DIR [ $1 ] } $1
git init .
# Hack due to mixed repo locations
declare -A GH_USER
2017-03-07 05:02:35 -06:00
GH_USER[ IFEM-AdvectionDiffusion] = OPM
2016-05-26 10:15:09 -05:00
GH_USER[ IFEM-BeamEx] = SintefMath
2018-09-05 04:35:10 -05:00
GH_USER[ IFEM-Boussinesq] = SintefMath
2017-03-07 05:02:35 -06:00
GH_USER[ IFEM-Darcy] = OPM
2016-05-26 10:15:09 -05:00
GH_USER[ IFEM-Elasticity] = OPM
GH_USER[ IFEM-FiniteDeformation] = SintefMath
GH_USER[ IFEM-NavierStokes] = SintefMath
GH_USER[ IFEM-OpenFrac] = OPM
GH_USER[ IFEM-PoroElasticity] = OPM
GH_USER[ IFEM-Stokes] = SintefMath
2017-03-07 05:02:35 -06:00
GH_USER[ IFEM-ThermoElasticity] = OPM
2016-08-16 08:48:20 -05:00
GH_USER[ IFEM-FSI] = SintefMath
2020-11-12 08:44:19 -06:00
GH_USER[ IFEM-THM] = SintefMath
2017-03-07 05:02:35 -06:00
GH_USER[ IFEM-Poisson] = OPM
2020-12-04 02:28:26 -06:00
GH_USER[ SIMRA-PostProc] = akva2
2021-08-11 07:13:43 -05:00
GH_USER[ IFEM-HM] = akva2
2021-09-24 02:24:03 -05:00
GH_USER[ IFEM-CoSTA] = akva2
2022-06-23 06:46:27 -05:00
GH_USER[ IFEM-Burgers] = SintefMath
2016-05-26 10:15:09 -05:00
if test -n " $GH_CREDENTIALS "
then
git remote add origin https://$GH_CREDENTIALS @github.com/${ GH_USER [ $1 ] } /$1
else
git remote add origin https://github.com/${ GH_USER [ $1 ] } /$1
fi
git fetch --depth 1 origin $2 :branch_to_build
git checkout branch_to_build
test $? -eq 0 || exit 1
popd
}
# $1 = Module to clone
# $2 = Additional cmake parameters
# $3 = git-rev to use for module
# $4 = Build root
function clone_and_build_module {
clone_module $1 $3
pushd .
mkdir -p $4 /build-$1
cd $4 /build-$1
test_build = 0
if test -n " $5 "
then
test_build = $5
fi
build_module " $2 " $test_build $WORKSPACE /deps/${ MODULE_EXTRA_DIR [ $1 ] } $1 /${ MODULE_APP_DIR [ $1 ] }
test $? -eq 0 || exit 1
2018-04-24 23:51:15 -05:00
if test -n " ${ MODULE_EXTRA_APP_DIR [ $1 ] } "
then
mkdir -p build-${ MODULE_EXTRA_APP_DIR [ $1 ] }
pushd build-${ MODULE_EXTRA_APP_DIR [ $1 ] }
build_module " $2 " $test_build $WORKSPACE /deps/${ MODULE_EXTRA_DIR [ $1 ] } $1 /${ MODULE_EXTRA_APP_DIR [ $1 ] }
test $? -eq 0 || exit 1
popd
fi
2016-05-26 10:15:09 -05:00
popd
}
# $1 - build type
# Uses pre-filled arrays upstreams, and associativ array upstreamRev
# which holds the revisions to use for upstreams.
function build_upstreams {
for upstream in ${ upstreams [*] }
do
if grep -qi " $upstream = " <<< $ghprbCommentBody
then
upstreamRev[ $upstream ] = pull/` echo $ghprbCommentBody | sed -r " s/.* ${ upstream ,, } =([0-9]+).*/\1/g " ` /merge
fi
echo " Building upstream $upstream = ${ upstreamRev [ $upstream ] } configuration= $1 "
# Build upstream and execute installation
clone_and_build_module $upstream " -DCMAKE_PREFIX_PATH= $WORKSPACE / $1 /install -DCMAKE_INSTALL_PREFIX= $WORKSPACE / $1 /install -DCMAKE_TOOLCHAIN_FILE= $CMAKE_TOOLCHAIN_FILE " ${ upstreamRev [ $upstream ] } $WORKSPACE /$1
test $? -eq 0 || exit 1
done
test $? -eq 0 || exit 1
}
2019-02-01 02:24:12 -06:00
# $1 - name of the module we are called from
# Uses pre-filled arrays sidestreams, and associative array sidestreamRev
# which holds the default revisions to use for sidestreams
function clone_sidestreams {
for sidestream in ${ sidestreams [*] }
do
echo " Cloning sidestream $sidestream = ${ sidestreamRev [ $sidestream ] } "
clone_module $sidestream ${ sidestreamRev [ $sidestream ] }
done
}
2016-05-26 10:15:09 -05:00
# $1 - name of the module we are called from
# Uses pre-filled arrays downstreams, and associativ array downstreamRev
# which holds the default revisions to use for downstreams
# Uses pre-filled arrays BTYPES_ARRAY and TOOLCHAINS.
function build_downstreams {
for BTYPE in " ${ !BTYPES_ARRAY[@] } "
do
egrep_cmd = " xml_grep --wrap testsuites --cond testsuite $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /build- $1 /testoutput.xml "
for downstream in ${ downstreams [*] }
do
echo " Building downstream $downstream = ${ downstreamRev [ $downstream ] } configuration= ${ BTYPES_ARRAY [ $BTYPE ] } "
# Build downstream and execute installation
clone_and_build_module $downstream " -DCMAKE_PREFIX_PATH= $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /install -DCMAKE_INSTALL_PREFIX= $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /install -DCMAKE_TOOLCHAIN_FILE= ${ TOOLCHAINS [ $BTYPE ] } " ${ downstreamRev [ $downstream ] } $WORKSPACE /${ BTYPES_ARRAY [ $BTYPE ] } 1
test $? -eq 0 || exit 1
# Installation for downstream
pushd .
cd $WORKSPACE /${ BTYPES_ARRAY [ $BTYPE ] } /build-$downstream
cmake --build . --target install
popd
egrep_cmd = " $egrep_cmd $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /build- $downstream /testoutput.xml "
done
$egrep_cmd > $WORKSPACE /${ BTYPES_ARRAY [ $BTYPE ] } /testoutput.xml
test $? -eq 0 || exit 1
# Name testsuite according to configuration
sed -i -e " s/classname=\"TestSuite\"/classname=\" ${ BTYPES_ARRAY [ $BTYPE ] } \"/g " $WORKSPACE /${ BTYPES_ARRAY [ $BTYPE ] } /testoutput.xml
test $? -eq 0 || exit 1
done
}
# $1 - module name
# Build all upstreams and the context module
# Uses pre-filled arrays BTYPES_ARRAY and TOOLCHAINS.
# Uses variable IFEM_REVISION
function build_module_and_upstreams {
for BTYPE in " ${ !BTYPES_ARRAY[@] } "
do
if [ " $1 " != "IFEM" ]
then
pushd .
mkdir -p ${ BTYPES_ARRAY [ $BTYPE ] } /build-IFEM
cd ${ BTYPES_ARRAY [ $BTYPE ] } /build-IFEM
build_module " -DCMAKE_INSTALL_PREFIX= $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /install -DCMAKE_TOOLCHAIN_FILE= ${ TOOLCHAINS [ $BTYPE ] } -DINSTALL_DOXY=0 " 0 $WORKSPACE /deps/IFEM
test $? -eq 0 || exit 1
popd
# remove FindIFEM.cmake - causes problems
rm -f ${ WORKSPACE } /deps/IFEM/cmake/Modules/FindIFEM.cmake
fi
CMAKE_TOOLCHAIN_FILE = ${ TOOLCHAINS [ $BTYPE ] }
build_upstreams ${ BTYPES_ARRAY [ $BTYPE ] }
# Build the final module
echo " Building main module $1 = $sha1 configuration= ${ BTYPES_ARRAY [ $BTYPE ] } "
# Make a clone
if ! test -d deps/${ MODULE_EXTRA_DIR [ $1 ] } $1
then
mkdir -p deps/${ MODULE_EXTRA_DIR [ $1 ] }
git clone $WORKSPACE deps/${ MODULE_EXTRA_DIR [ $1 ] } $1
fi
# Build
pushd .
mkdir -p ${ BTYPES_ARRAY [ $BTYPE ] } /build-$1
cd ${ BTYPES_ARRAY [ $BTYPE ] } /build-$1
build_module " -DCMAKE_INSTALL_PREFIX= $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /install -DCMAKE_PREFIX_PATH= $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /install -DCMAKE_TOOLCHAIN_FILE= ${ CMAKE_TOOLCHAIN_FILE } " 1 $WORKSPACE /deps/${ MODULE_EXTRA_DIR [ $1 ] } $1 /${ MODULE_APP_DIR [ $1 ] }
test $? -eq 0 || exit 1
2018-02-01 03:50:59 -06:00
cmake --build . --target install
2016-05-26 10:15:09 -05:00
popd
2021-10-13 05:47:18 -05:00
if test -n " ${ MODULE_EXTRA_APP_DIR [ $1 ] } "
then
mkdir -p ${ BTYPES_ARRAY [ $BTYPE ] } /build-${ MODULE_EXTRA_APP_DIR [ $1 ] }
pushd ${ BTYPES_ARRAY [ $BTYPE ] } /build-${ MODULE_EXTRA_APP_DIR [ $1 ] }
build_module " -DCMAKE_INSTALL_PREFIX= $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /install -DCMAKE_PREFIX_PATH= $WORKSPACE / ${ BTYPES_ARRAY [ $BTYPE ] } /install -DCMAKE_TOOLCHAIN_FILE= ${ CMAKE_TOOLCHAIN_FILE } " 1 $WORKSPACE /deps/${ MODULE_EXTRA_DIR [ $1 ] } $1 /${ MODULE_EXTRA_APP_DIR [ $1 ] }
test $? -eq 0 || exit 1
cmake --build . --target install
test $? -eq 0 || exit 1
popd
fi
2016-05-26 10:15:09 -05:00
# Add testsuite names
sed -e " s/classname=\"TestSuite\"/classname=\" ${ BTYPES_ARRAY [ $BTYPE ] } \"/g " ${ WORKSPACE } /${ BTYPES_ARRAY [ $BTYPE ] } /build-$1 /testoutput.xml > ${ WORKSPACE } /${ BTYPES_ARRAY [ $BTYPE ] } /testoutput.xml
done
}