cargo-make 0.37.24

Rust task runner and build tool.
Documentation

[tasks.workspace-members-coverage]
description = "Runs the ci-flow for every workspace member."
category = "Test"
workspace = false
env = { "CARGO_MAKE_MEMBER_TASK" = "${CARGO_MAKE_CORE_TASK_NAMESPACE_PREFIX}coverage" }
run_task = "do-on-members"

[tasks.workspace-coverage]
description = "Runs coverage task for all members and packages all of them (by default the codecov flow)."
category = "Test"
dependencies = ["workspace-members-coverage", "workspace-coverage-pack"]

[tasks.workspace-coverage-pack]
description = "Publishes all member coverage reports."
category = "Test"
linux_alias = "codecov"

[tasks.pre-coverage]
category = "Test"

[tasks.coverage]
description = "Runs coverage (by default using kcov)."
category = "Test"
env = { "RUSTFLAGS" = "-C link-dead-code" }
run_task = [
  { name = "coverage-tarpaulin", condition = { platforms = [
    "linux",
  ], env = { "CARGO_MAKE_COVERAGE_PROVIDER" = "tarpaulin" } } },
  { name = "coverage-kcov", condition = { platforms = [
    "linux",
  ] } },
]

[tasks.coverage-kcov]
description = "Installs (if missing) and runs coverage using kcov (not supported on windows)"
category = "Test"
dependencies = ["setup-sudo-env"]
condition = { env_set = [
  "CARGO_MAKE_KCOV_VERSION",
], platforms = [
  "linux",
  "mac",
] }
script_runner = "bash"
env = { "CARGO_MAKE_KCOV_INCLUDE_PATTERN" = "${CARGO_MAKE_WORKING_DIRECTORY}/src/" }
install_script = '''
if [ "${CARGO_MAKE_SUDO_ENABLED}" == "false" ]; then
    echo "Skipping kcov installation as 'sudo' is disabled."
    exit 0
fi

KCOV_INSTALLATION_DIRECTORY=""
KCOV_BINARY_DIRECTORY=""
if [ -n "${CARGO_MAKE_KCOV_INSTALLATION_DIRECTORY}" ]; then
    mkdir -p ${CARGO_MAKE_KCOV_INSTALLATION_DIRECTORY}
    cd ${CARGO_MAKE_KCOV_INSTALLATION_DIRECTORY}
    KCOV_INSTALLATION_DIRECTORY="$(pwd)/"
    cd -
    echo "Kcov Installation Directory: ${KCOV_INSTALLATION_DIRECTORY}"
    KCOV_BINARY_DIRECTORY="${KCOV_INSTALLATION_DIRECTORY}/build/src/"
    echo "Kcov Binary Directory: ${KCOV_BINARY_DIRECTORY}"
fi

# get help info to fetch all supported command line arguments
KCOV_HELP_INFO=`${KCOV_BINARY_DIRECTORY}kcov --help` || true

# check needed arguments are supported, else install
if [[ $KCOV_HELP_INFO != *"--include-pattern"* ]] || [[ $KCOV_HELP_INFO != *"--exclude-line"* ]] || [[ $KCOV_HELP_INFO != *"--exclude-region"* ]]; then
    # check we are on a supported platform
    if [ "$(uname)" == "Linux" ]; then
        if [ "$(grep -Ei 'debian|buntu|mint' /etc/*release)" ]; then
            echo "Installing/Upgrading kcov..."
            sudo apt-get update || true
            sudo apt-get install -y libcurl4-openssl-dev libelf-dev libdw-dev cmake gcc binutils-dev
        fi
    elif [ "$(uname)" == "Darwin" ]; then
        for brew_install in zlib bash cmake pkgconfig wget ; do
            if brew info ${brew_install} | grep "Not installed" ; then
                brew install ${brew_install}
            else
                echo "skipping ${brew_install} already installed"
            fi
        done
    fi

    mkdir -p ${CARGO_MAKE_KCOV_DOWNLOAD_DIRECTORY}
    cd ${CARGO_MAKE_KCOV_DOWNLOAD_DIRECTORY}
    KCOV_DOWNLOAD_DIRECTORY=$(pwd)

    wget https://github.com/SimonKagstrom/kcov/archive/v${CARGO_MAKE_KCOV_VERSION}.zip
    unzip v${CARGO_MAKE_KCOV_VERSION}.zip
    cd kcov-${CARGO_MAKE_KCOV_VERSION}
    mkdir -p build
    cd ./build
    cmake ..
    make

    # if custom installation directory, leave kcov as local
    if [ -n "${CARGO_MAKE_KCOV_INSTALLATION_DIRECTORY}" ]; then
        cd ${KCOV_DOWNLOAD_DIRECTORY}/kcov-${CARGO_MAKE_KCOV_VERSION}
        mv ./* ${KCOV_INSTALLATION_DIRECTORY}
    else
        sudo make install
        cd ../..
        rm -rf kcov-${CARGO_MAKE_KCOV_VERSION}
    fi
fi
'''
script = '''
echo "Working Directory: ${CARGO_MAKE_WORKING_DIRECTORY}"

KCOV_BINARY_DIRECTORY=""
if [ -n "${CARGO_MAKE_KCOV_INSTALLATION_DIRECTORY}" ]; then
    cd ${CARGO_MAKE_KCOV_INSTALLATION_DIRECTORY}
    KCOV_INSTALLATION_DIRECTORY="$(pwd)/"
    cd -
    echo "Kcov Installation Directory: ${KCOV_INSTALLATION_DIRECTORY}"
    KCOV_BINARY_DIRECTORY="${KCOV_INSTALLATION_DIRECTORY}/build/src/"
    echo "Kcov Binary Directory: ${KCOV_BINARY_DIRECTORY}"
fi

TARGET_DIRECTORY="target/coverage"
if [ -n "$CARGO_MAKE_COVERAGE_REPORT_DIRECTORY" ]; then
    TARGET_DIRECTORY="$CARGO_MAKE_COVERAGE_REPORT_DIRECTORY"
fi
echo "Target Directory: ${TARGET_DIRECTORY}"
mkdir -p "${TARGET_DIRECTORY}"

BINARY_DIRECTORY=target/debug
if [ -n "$CARGO_MAKE_WORKSPACE_TARGET_DIRECTORY" ]; then
    BINARY_DIRECTORY="${CARGO_MAKE_WORKSPACE_TARGET_DIRECTORY}/debug"
fi
BINARY_DIRECTORY=${BINARY_DIRECTORY}/deps

KCOV_EXCLUDE_LINE_ARG=""
if [ -n "$CARGO_MAKE_KCOV_EXCLUDE_LINE" ]; then
    KCOV_EXCLUDE_LINE_ARG="--exclude-line=${CARGO_MAKE_KCOV_EXCLUDE_LINE}"
fi

KCOV_EXCLUDE_REGION_ARG=""
if [ -n "$CARGO_MAKE_KCOV_EXCLUDE_REGION" ]; then
    KCOV_EXCLUDE_REGION_ARG="--exclude-region=${CARGO_MAKE_KCOV_EXCLUDE_REGION}"
fi

echo "Running tests from directory: ${BINARY_DIRECTORY}"

# Evaluate variables that may be in the expression
# This allows us to do double expansion on a non-variable second expansion
CARGO_MAKE_TEST_COVERAGE_BINARY_FILTER_REGEX="$(sh -c "echo \"${CARGO_MAKE_TEST_COVERAGE_BINARY_FILTER}\"")"
echo "Test binary filter regex: ${CARGO_MAKE_TEST_COVERAGE_BINARY_FILTER_REGEX}"

TEST_FILES=''
for test_file in $(find "${BINARY_DIRECTORY}" -maxdepth 1 -type f | grep -e "${CARGO_MAKE_TEST_COVERAGE_BINARY_FILTER_REGEX}"); do
    keep=1
    for debug_file in $(find "${BINARY_DIRECTORY}/.." -maxdepth 1 -type f); do
        $(cmp -s "$debug_file" "$test_file") && keep=0 && break
    done
    if [ $keep -eq 1 ]; then
        [ -n "$TEST_FILES" ] && TEST_FILES="$TEST_FILES $test_file" || TEST_FILES="$test_file"
    fi
done
echo "Test Files:"
echo "${TEST_FILES}"

TEST_OPTIONS="--test-threads 1"
if [ "${CARGO_MAKE_TEST_USE_MULTI_TEST_PHASES}" == "true" ]; then
    export RUST_TEST_THREADS="1"
    if [ "${CARGO_MAKE_RUST_CHANNEL}" == "nightly" ]; then
        TEST_OPTIONS="${TEST_OPTIONS} --include-ignored -Zunstable-options"
    fi
fi
TEST_OPTIONS="${TEST_OPTIONS} ${CARGO_MAKE_KCOV_TEST_ARGUMENTS}"

TIMEOUT_COMMAND=""
if [ -n "${CARGO_MAKE_KCOV_TEST_TIMEOUT_VALUE}" ]; then
    TIMEOUT_COMMAND="timeout ${CARGO_MAKE_KCOV_TEST_TIMEOUT_VALUE} "
fi

i=0
for file in $TEST_FILES
do
    ((i=i+1))
    echo "Running coverage for file: $file"
    ${TIMEOUT_COMMAND} ${KCOV_BINARY_DIRECTORY}kcov --include-pattern=${CARGO_MAKE_KCOV_INCLUDE_PATTERN} ${KCOV_EXCLUDE_LINE_ARG} ${KCOV_EXCLUDE_REGION_ARG} "${TARGET_DIRECTORY}/${i}" "$file" ${TEST_OPTIONS} || true
done

rm -f ./core
'''

[tasks.coverage-tarpaulin]
description = "Runs coverage using tarpaulin rust crate (linux only)"
category = "Test"

[tasks.coverage-tarpaulin.linux]
command = "cargo"
args = ["tarpaulin", "--out", "Xml"]

[tasks.post-coverage]
category = "Test"

[tasks.coverage-flow]
description = "Runs the full coverage flow."
category = "Test"
dependencies = ["pre-coverage", "coverage", "post-coverage"]

[tasks.codecov]
description = "Runs codecov script to upload coverage results to codecov."
category = "Test"
condition = { env_not_set = [
  "CARGO_MAKE_SKIP_CODECOV",
], platforms = [
  "linux",
  "mac",
] }
script_runner = "bash"
script = '''
#!/usr/bin/env bash
bash <(curl -s https://codecov.io/bash)
'''

[tasks.codecov-flow]
description = "Runs the full coverage flow and uploads the results to codecov."
category = "Test"
condition = { platforms = ["linux", "mac"] }
dependencies = ["coverage-flow", "codecov"]

[tasks.ci-coverage-flow]
description = "Runs the coverage flow and uploads the results to codecov."
category = "CI"
condition = { platforms = [
  "linux",
], env_true = [
  "CARGO_MAKE_CI",
  "CARGO_MAKE_RUN_CODECOV",
] }
run_task = "codecov-flow"