# $1: message die () { >&2 echo -e "Error: $1" exit 1 } # $1: command function run_verbose() { echo "$*" bash -c "$*" } has_item () { for i in $1 do if test "$i" = "$2" then echo "$i" break fi done } #------------------------------------------------------------------------------ # target groups #------------------------------------------------------------------------------ test_only () { if test -n "$RUNNING_TESTS" then echo $1 fi } bench_only () { if test -n "$RUNNING_BENCHMARKS" then echo $1 fi } dev_build () { if test -n "$RUNNING_DEVBUILD" then echo $1 fi } # A group consisting of all known individual targets all_grp () { { for i in $GROUP_TARGETS do for j in $(eval "echo \$$i") do echo $j done done for i in $INDIVIDUAL_TARGETS do echo $i done } | sort | uniq } # All groups all_target_groups () { echo $GROUP_TARGETS } # XXX pass as arg list_targets () { echo "Individual targets:" for i in $(all_grp) do echo "$i" done echo } # XXX pass as arg list_target_groups () { echo "All Targets: all_grp" echo "Target groups:" for i in $(all_target_groups) do echo -n "$i [" eval "echo -n \$$i" echo "]" done echo } # XXX pass as arg set_targets() { if test -z "$TARGETS" then echo $DEFAULT_TARGETS else for i in $(echo $TARGETS) do case $i in *_grp) eval "echo -n \$${i}" ;; *_cmp) eval "echo -n \$${i} $i" ;; *) echo -n $i ;; esac echo -n " " done fi } # We run the benchmarks in isolation in a separate process so that different # benchmarks do not interfere with other. To enable that we need to pass the # benchmark exe path to gauge as an argument. Unfortunately it cannot find its # own path currently. # The path is dependent on the architecture and cabal version. # $1: package name # $2: component # $3: target cabal_target_prog () { local target_prog=`cabal_which $1 $2 $3` if test -x "$target_prog" then echo $target_prog else return 1 fi } set_common_vars () { SLOW=0 QUICK_MODE=0 RUNNING_DEVBUILD= TARGET_EXE_ARGS= RTS_OPTIONS= CABAL_BUILD_OPTIONS="" CABAL_EXECUTABLE=cabal # Use branch specific builds if git-cabal is present in PATH BUILD_DIR=dist-newstyle if test "$USE_GIT_CABAL" -eq 1 then if which git-cabal 2>/dev/null then echo "Using git-cabal for branch specific builds" CABAL_EXECUTABLE=git-cabal BUILD_DIR=$(git-cabal show-builddir) fi fi } # To be called after parsing CLI arguments set_derived_vars () { if test -n "$CABAL_WITH_COMPILER" then CABAL_BUILD_OPTIONS+=" --with-compiler $CABAL_WITH_COMPILER" else CABAL_WITH_COMPILER=ghc fi GHC_VERSION=$($CABAL_WITH_COMPILER --numeric-version) } # XXX cabal issue "cabal v2-exec which" cannot find benchmark/test executables # $1: builddir # $2: package name # $3: component ("" (lib), t (test), b (benchmark), x (executable)) # $4: command to find cabal_which_builddir() { local path=$(echo $1/build/*/ghc-${GHC_VERSION}/${2}-0.0.0/$3/$4/build/$4/$4) test -f "$path" && echo $path } # $1: package name # $2: component # $3: command to find cabal_which() { cabal_which_builddir $BUILD_DIR $1 $2 $3 } # $1: build program # $2: package name # $3: component prefix # $4: targets run_build () { local build_prog=$1 local package=$2 local component_prefix=$3 local COMPONENTS local c for c in $4 do COMPONENTS+="$package:$component_prefix:$c " done run_verbose $build_prog $COMPONENTS || die "build failed" } # $1: target name get_tix_file () { echo $BUILD_DIR/build/$SYSTEM/ghc-${GHC_VERSION}/$PACKAGE_FULL_NAME/hpc/vanilla/tix/$1/$1.tix } # $1: package name # $2: component # $3: target # $4: args generator func run_target () { local package_name=$1 local component=$2 local target_name=$3 local extra_args=$4 local target_prog target_prog=$(cabal_target_prog $package_name $component $target_name) || \ die "Cannot find executable for target $target_name" echo "Running executable $target_name ..." # Needed by bench-exec-one.sh export BENCH_EXEC_PATH=$target_prog mkdir -p $(dirname $(get_tix_file $target_name)) export HPCTIXFILE=$(get_tix_file $target_name) run_verbose $target_prog $($extra_args $target_name $target_prog) \ || die "Target exe failed" # hpc-coveralls fails if there is an empty dir and no .tix file generated rmdir $(dirname $(get_tix_file $target_name)) 2>/dev/null || true } # $1: package name # $2: component # $3: targets # $4: args generator func run_targets() { for i in $3 do run_target $1 $2 $i $4 done }