Skip to content
Snippets Groups Projects
Commit 12329ab9 authored by Lars Bilke's avatar Lars Bilke Committed by Dmitri Naumov
Browse files

[CTest] Setup Python dependencies for benchmarks.

When a benchmark uses Python (REQUIREMENTS OGS_USE_PYTHON) and
there is a requirements.txt file in benchmarks project file
directory a Python virtual environment is created and dependencies
are installed during benchmark execution via ctest (inside the
build directory).

The PYTHONPATH environment variable of the benchmark test is set
to the virtual environment to mimic virtual environment activation.

Normally you would use

source .venv/bin/activate

but this is not possible when executing the benchmarks via ctest.
parent d7f12739
No related branches found
No related tags found
No related merge requests found
......@@ -73,7 +73,7 @@ function (AddTest)
# --- Implement wrappers ---
# check requirements, disable if not met
if(${AddTest_REQUIREMENTS})
# message(STATUS "Enabling test ${AddTest_NAME}.")
message(DEBUG "Enabling test ${AddTest_NAME}.")
else()
set(DISABLED_TESTS_LOG "${DISABLED_TESTS_LOG}\nRequirement ${AddTest_REQUIREMENTS} not met! Disabling test ${AddTest_NAME}." CACHE INTERNAL "")
return()
......@@ -243,15 +243,21 @@ Use six arguments version of AddTest with absolute and relative tolerances")
COMMAND ${CMAKE_COMMAND}
-DEXECUTABLE=${AddTest_EXECUTABLE_PARSED}
"-DEXECUTABLE_ARGS=${AddTest_EXECUTABLE_ARGS}" # Quoted because passed as list
-Dcase_path=${AddTest_SOURCE_PATH} # see https://stackoverflow.com/a/33248574/80480
-DSOURCE_PATH=${AddTest_SOURCE_PATH} # see https://stackoverflow.com/a/33248574/80480
-DBINARY_PATH=${AddTest_BINARY_PATH}
-DWRAPPER_COMMAND=${WRAPPER_COMMAND}
"-DWRAPPER_ARGS=${AddTest_WRAPPER_ARGS}"
"-DFILES_TO_DELETE=${FILES_TO_DELETE}"
-DSTDOUT_FILE_PATH=${AddTest_STDOUT_FILE_PATH}
-P ${PROJECT_SOURCE_DIR}/scripts/cmake/test/AddTestWrapper.cmake
)
set_tests_properties(${TEST_NAME} PROPERTIES COST ${AddTest_RUNTIME})
if(EXISTS ${AddTest_SOURCE_PATH}/requirements.txt)
set(PYTHONPATH "${AddTest_BINARY_PATH}/.venv/lib/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages")
if(WIN32)
set(PYTHONPATH "${AddTest_BINARY_PATH}/.venv/Lib/site-packages")
endif()
set_tests_properties(${TEST_NAME} PROPERTIES ENVIRONMENT "PYTHONPATH=${PYTHONPATH}")
endif()
if(TARGET ${AddTest_EXECUTABLE})
add_dependencies(ctest ${AddTest_EXECUTABLE})
......
......@@ -4,24 +4,27 @@ foreach(FILE ${FILES_TO_DELETE})
file(REMOVE ${BINARY_PATH}/${FILE})
endforeach()
# convert list to space delimited string
set(CMD "${WRAPPER_COMMAND}")
foreach(A ${WRAPPER_ARGS})
set(CMD "${CMD} ${A}")
endforeach()
set(CMD "${CMD} ${EXECUTABLE}")
foreach(A ${EXECUTABLE_ARGS})
set(CMD "${CMD} ${A}")
endforeach()
string(STRIP "${CMD}" CMD)
# Create Python virtual environment and install packages
set(PIP .venv/bin/pip)
if(WIN32)
set(PIP .venv/Scripts/pip.exe)
endif()
if(EXISTS ${SOURCE_PATH}/requirements.txt AND NOT EXISTS ${BINARY_PATH}/${PIP})
message(STATUS "Generating Python virtual environment...")
execute_process(
COMMAND virtualenv .venv
WORKING_DIRECTORY ${BINARY_PATH})
endif()
if(EXISTS ${SOURCE_PATH}/requirements.txt)
execute_process(
COMMAND ${PIP} install -r ${SOURCE_PATH}/requirements.txt
WORKING_DIRECTORY ${BINARY_PATH})
endif()
message(STATUS "running command generating test results:\ncd ${case_path} && ${CMD} >${STDOUT_FILE_PATH}")
execute_process(
COMMAND ${WRAPPER_COMMAND} ${WRAPPER_ARGS} ${EXECUTABLE} ${EXECUTABLE_ARGS}
WORKING_DIRECTORY ${case_path}
WORKING_DIRECTORY ${SOURCE_PATH}
RESULT_VARIABLE EXIT_CODE
# OUTPUT_FILE ${STDOUT_FILE_PATH} # must be used exclusively
OUTPUT_VARIABLE OUTPUT
ERROR_VARIABLE OUTPUT
)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment