2017-12-11 09:20:43 +01:00
|
|
|
if(NOT BUILD_PYTHON)
|
2018-11-13 09:21:15 +01:00
|
|
|
return()
|
2017-12-11 09:20:43 +01:00
|
|
|
endif()
|
|
|
|
|
|
2021-09-08 00:02:29 +02:00
|
|
|
# Use latest UseSWIG module (3.14) and Python3 module (3.18)
|
|
|
|
|
cmake_minimum_required(VERSION 3.18)
|
2020-02-24 17:26:17 +01:00
|
|
|
|
2017-12-11 09:20:43 +01:00
|
|
|
if(NOT TARGET ortools::ortools)
|
2018-11-13 09:21:15 +01:00
|
|
|
message(FATAL_ERROR "Python: missing ortools TARGET")
|
2017-12-11 09:20:43 +01:00
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Will need swig
|
2020-04-09 17:13:17 +02:00
|
|
|
set(CMAKE_SWIG_FLAGS)
|
2017-12-11 09:20:43 +01:00
|
|
|
find_package(SWIG REQUIRED)
|
|
|
|
|
include(UseSWIG)
|
|
|
|
|
|
2020-02-24 17:26:17 +01:00
|
|
|
if(${SWIG_VERSION} VERSION_GREATER_EQUAL 4)
|
|
|
|
|
list(APPEND CMAKE_SWIG_FLAGS "-doxygen")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(UNIX AND NOT APPLE)
|
|
|
|
|
list(APPEND CMAKE_SWIG_FLAGS "-DSWIGWORDSIZE64")
|
|
|
|
|
endif()
|
|
|
|
|
|
2021-09-08 00:02:29 +02:00
|
|
|
# Find Python 3
|
|
|
|
|
find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module)
|
|
|
|
|
list(APPEND CMAKE_SWIG_FLAGS "-py3" "-DPY3")
|
2020-02-24 17:26:17 +01:00
|
|
|
|
2020-11-30 21:11:12 +01:00
|
|
|
# Find if python module MODULE_NAME is available,
|
2021-10-05 10:40:52 +02:00
|
|
|
# if not install it (PACKAGE_NAME) to the Python3 user install directory.
|
|
|
|
|
function(search_python_module MODULE_NAME PACKAGE_NAME)
|
2020-11-30 21:11:12 +01:00
|
|
|
execute_process(
|
2021-09-08 00:02:29 +02:00
|
|
|
COMMAND ${Python3_EXECUTABLE} -c "import ${MODULE_NAME}; print(${MODULE_NAME}.__version__)"
|
2020-11-30 21:11:12 +01:00
|
|
|
RESULT_VARIABLE _RESULT
|
|
|
|
|
OUTPUT_VARIABLE MODULE_VERSION
|
|
|
|
|
ERROR_QUIET
|
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
|
)
|
|
|
|
|
if(${_RESULT} STREQUAL "0")
|
|
|
|
|
message(STATUS "Found python module: ${MODULE_NAME} (found version \"${MODULE_VERSION}\")")
|
|
|
|
|
else()
|
2021-10-06 18:27:15 +02:00
|
|
|
if(FETCH_PYTHON_DEPS)
|
|
|
|
|
message(WARNING "Can't find python module \"${MODULE_NAME}\", install it using pip...")
|
|
|
|
|
execute_process(
|
|
|
|
|
COMMAND ${Python3_EXECUTABLE} -m pip install --user ${PACKAGE_NAME}
|
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
|
)
|
|
|
|
|
else()
|
2021-10-06 18:42:13 +02:00
|
|
|
message(FATAL_ERROR "Can't find python module \"${MODULE_NAME}\", please install it using your system package manager.")
|
2021-10-06 18:27:15 +02:00
|
|
|
endif()
|
2020-11-30 21:11:12 +01:00
|
|
|
endif()
|
|
|
|
|
endfunction()
|
|
|
|
|
|
2020-12-07 16:21:25 +01:00
|
|
|
# Find if python builtin module MODULE_NAME is available.
|
|
|
|
|
function(search_python_internal_module MODULE_NAME)
|
|
|
|
|
execute_process(
|
2021-09-08 00:02:29 +02:00
|
|
|
COMMAND ${Python3_EXECUTABLE} -c "import ${MODULE_NAME}"
|
2020-12-07 16:21:25 +01:00
|
|
|
RESULT_VARIABLE _RESULT
|
|
|
|
|
OUTPUT_VARIABLE MODULE_VERSION
|
|
|
|
|
ERROR_QUIET
|
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
|
)
|
|
|
|
|
if(${_RESULT} STREQUAL "0")
|
|
|
|
|
message(STATUS "Found python internal module: ${MODULE_NAME}")
|
|
|
|
|
else()
|
2021-10-06 18:27:15 +02:00
|
|
|
message(FATAL_ERROR "Can't find python internal module \"${MODULE_NAME}\", please install it using your system package manager.")
|
2020-12-07 16:21:25 +01:00
|
|
|
endif()
|
|
|
|
|
endfunction()
|
|
|
|
|
|
2020-11-30 21:11:12 +01:00
|
|
|
# Generate Protobuf py sources with mypy support
|
2021-10-05 10:40:52 +02:00
|
|
|
search_python_module(mypy_protobuf mypy-protobuf)
|
2017-12-11 09:20:43 +01:00
|
|
|
set(PROTO_PYS)
|
|
|
|
|
file(GLOB_RECURSE proto_py_files RELATIVE ${PROJECT_SOURCE_DIR}
|
2018-11-13 09:21:15 +01:00
|
|
|
"ortools/constraint_solver/*.proto"
|
|
|
|
|
"ortools/linear_solver/*.proto"
|
2021-09-28 15:58:37 +02:00
|
|
|
"ortools/packing/*.proto"
|
2018-11-13 09:21:15 +01:00
|
|
|
"ortools/sat/*.proto"
|
|
|
|
|
"ortools/util/*.proto"
|
2021-09-28 15:58:37 +02:00
|
|
|
"ortools/scheduling/*.proto"
|
2018-11-13 09:21:15 +01:00
|
|
|
)
|
2017-12-11 09:20:43 +01:00
|
|
|
list(REMOVE_ITEM proto_py_files "ortools/constraint_solver/demon_profiler.proto")
|
2020-10-08 16:15:49 +02:00
|
|
|
foreach(PROTO_FILE IN LISTS proto_py_files)
|
2018-11-13 09:21:15 +01:00
|
|
|
#message(STATUS "protoc proto(py): ${PROTO_FILE}")
|
|
|
|
|
get_filename_component(PROTO_DIR ${PROTO_FILE} DIRECTORY)
|
|
|
|
|
get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE)
|
2020-02-24 17:26:17 +01:00
|
|
|
set(PROTO_PY ${PROJECT_BINARY_DIR}/python/${PROTO_DIR}/${PROTO_NAME}_pb2.py)
|
2018-11-13 09:21:15 +01:00
|
|
|
#message(STATUS "protoc py: ${PROTO_PY}")
|
|
|
|
|
add_custom_command(
|
|
|
|
|
OUTPUT ${PROTO_PY}
|
2021-01-07 22:52:48 +01:00
|
|
|
COMMAND ${PROTOC_PRG}
|
2018-11-13 09:21:15 +01:00
|
|
|
"--proto_path=${PROJECT_SOURCE_DIR}"
|
2020-07-17 11:19:12 +02:00
|
|
|
${PROTO_DIRS}
|
2020-02-24 17:26:17 +01:00
|
|
|
"--python_out=${PROJECT_BINARY_DIR}/python"
|
2020-11-30 21:11:12 +01:00
|
|
|
"--mypy_out=${PROJECT_BINARY_DIR}/python"
|
2018-11-13 09:21:15 +01:00
|
|
|
${PROTO_FILE}
|
2021-01-07 22:52:48 +01:00
|
|
|
DEPENDS ${PROTO_FILE} ${PROTOC_PRG}
|
2021-09-08 00:02:29 +02:00
|
|
|
COMMENT "Generate Python 3 protocol buffer for ${PROTO_FILE}"
|
2018-11-13 09:21:15 +01:00
|
|
|
VERBATIM)
|
|
|
|
|
list(APPEND PROTO_PYS ${PROTO_PY})
|
2017-12-11 09:20:43 +01:00
|
|
|
endforeach()
|
|
|
|
|
add_custom_target(Py${PROJECT_NAME}_proto DEPENDS ${PROTO_PYS} ortools::ortools)
|
|
|
|
|
|
|
|
|
|
# CMake will remove all '-D' prefix (i.e. -DUSE_FOO become USE_FOO)
|
|
|
|
|
#get_target_property(FLAGS ortools::ortools COMPILE_DEFINITIONS)
|
2020-08-20 21:23:09 +02:00
|
|
|
set(FLAGS -DUSE_BOP -DUSE_GLOP -DABSL_MUST_USE_RESULT)
|
|
|
|
|
if(USE_SCIP)
|
|
|
|
|
list(APPEND FLAGS "-DUSE_SCIP")
|
|
|
|
|
endif()
|
2020-02-12 11:30:15 +01:00
|
|
|
if(USE_COINOR)
|
2020-08-20 21:23:09 +02:00
|
|
|
list(APPEND FLAGS "-DUSE_CBC" "-DUSE_CLP")
|
2020-02-12 11:30:15 +01:00
|
|
|
endif()
|
2017-12-11 09:20:43 +01:00
|
|
|
list(APPEND CMAKE_SWIG_FLAGS ${FLAGS} "-I${PROJECT_SOURCE_DIR}")
|
|
|
|
|
|
2021-09-28 15:58:37 +02:00
|
|
|
foreach(SUBPROJECT IN ITEMS init algorithms graph linear_solver constraint_solver sat scheduling util)
|
2018-11-13 09:21:15 +01:00
|
|
|
add_subdirectory(ortools/${SUBPROJECT}/python)
|
2017-12-11 09:20:43 +01:00
|
|
|
endforeach()
|
|
|
|
|
|
2020-02-24 17:26:17 +01:00
|
|
|
#######################
|
|
|
|
|
## Python Packaging ##
|
|
|
|
|
#######################
|
2021-09-28 17:28:44 +02:00
|
|
|
set(PYTHON_PROJECT ${PROJECT_NAME})
|
|
|
|
|
message(STATUS "Python project: ${PYTHON_PROJECT}")
|
|
|
|
|
set(PYTHON_PATH ${PROJECT_BINARY_DIR}/python/${PYTHON_PROJECT})
|
|
|
|
|
message(STATUS "Python project build path: ${PYTHON_PATH}")
|
|
|
|
|
|
2020-02-24 17:26:17 +01:00
|
|
|
#file(MAKE_DIRECTORY python/${PROJECT_NAME})
|
2021-10-29 17:37:46 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/__init__.py CONTENT "__version__ = \"${PROJECT_VERSION}\"\n")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/init/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/algorithms/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/graph/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/linear_solver/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/constraint_solver/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/packing/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/sat/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/sat/python/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/scheduling/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PATH}/util/__init__.py CONTENT "")
|
2020-02-24 17:26:17 +01:00
|
|
|
|
2020-05-29 14:15:31 +02:00
|
|
|
file(COPY
|
|
|
|
|
ortools/linear_solver/linear_solver_natural_api.py
|
2021-09-28 17:28:44 +02:00
|
|
|
DESTINATION ${PYTHON_PATH}/linear_solver)
|
2020-05-29 14:15:31 +02:00
|
|
|
file(COPY
|
|
|
|
|
ortools/sat/python/cp_model.py
|
|
|
|
|
ortools/sat/python/cp_model_helper.py
|
|
|
|
|
ortools/sat/python/visualization.py
|
2021-09-28 17:28:44 +02:00
|
|
|
DESTINATION ${PYTHON_PATH}/sat/python)
|
2017-12-11 09:20:43 +01:00
|
|
|
|
2020-05-19 16:58:10 +02:00
|
|
|
# setup.py.in contains cmake variable e.g. @PROJECT_NAME@ and
|
|
|
|
|
# generator expression e.g. $<TARGET_FILE_NAME:pyFoo>
|
|
|
|
|
configure_file(
|
2020-05-27 17:13:48 +02:00
|
|
|
${PROJECT_SOURCE_DIR}/ortools/python/setup.py.in
|
|
|
|
|
${PROJECT_BINARY_DIR}/python/setup.py.in
|
|
|
|
|
@ONLY)
|
2020-05-19 16:58:10 +02:00
|
|
|
file(GENERATE
|
2020-05-27 17:13:48 +02:00
|
|
|
OUTPUT ${PROJECT_BINARY_DIR}/python/$<CONFIG>/setup.py
|
|
|
|
|
INPUT ${PROJECT_BINARY_DIR}/python/setup.py.in)
|
2017-12-11 09:20:43 +01:00
|
|
|
|
2021-10-29 17:39:19 +02:00
|
|
|
add_custom_command(
|
|
|
|
|
OUTPUT python/setup.py
|
|
|
|
|
DEPENDS ${PROJECT_BINARY_DIR}/python/$<CONFIG>/setup.py
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy ./$<CONFIG>/setup.py setup.py
|
|
|
|
|
WORKING_DIRECTORY python
|
|
|
|
|
)
|
|
|
|
|
|
2020-11-30 21:11:12 +01:00
|
|
|
configure_file(
|
|
|
|
|
${PROJECT_SOURCE_DIR}/tools/README.pypi.txt
|
|
|
|
|
${PROJECT_BINARY_DIR}/python/README.txt
|
|
|
|
|
COPYONLY)
|
2018-01-29 10:26:03 +01:00
|
|
|
|
2018-01-22 16:55:15 +01:00
|
|
|
# Look for python module wheel
|
2021-10-05 10:40:52 +02:00
|
|
|
search_python_module(setuptools setuptools)
|
|
|
|
|
search_python_module(wheel wheel)
|
2018-01-22 16:55:15 +01:00
|
|
|
|
2021-10-29 17:39:19 +02:00
|
|
|
add_custom_command(
|
|
|
|
|
OUTPUT python/dist
|
2018-11-13 09:21:15 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory dist
|
2021-10-29 17:39:19 +02:00
|
|
|
#COMMAND ${CMAKE_COMMAND} -E make_directory dist
|
2021-09-28 18:40:19 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${PYTHON_PROJECT}/.libs
|
2020-05-28 18:42:21 +02:00
|
|
|
# Don't need to copy static lib on windows.
|
2021-09-28 18:40:19 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E $<IF:$<STREQUAL:$<TARGET_PROPERTY:${PYTHON_PROJECT},TYPE>,SHARED_LIBRARY>,copy,true>
|
|
|
|
|
$<$<STREQUAL:$<TARGET_PROPERTY:${PYTHON_PROJECT},TYPE>,SHARED_LIBRARY>:$<TARGET_SONAME_FILE:${PYTHON_PROJECT}>>
|
|
|
|
|
${PYTHON_PROJECT}/.libs
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pywrapinit> ${PYTHON_PROJECT}/init
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pywrapknapsack_solver> ${PYTHON_PROJECT}/algorithms
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pywrapgraph> ${PYTHON_PROJECT}/graph
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pywrapcp> ${PYTHON_PROJECT}/constraint_solver
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pywraplp> ${PYTHON_PROJECT}/linear_solver
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pywrapsat> ${PYTHON_PROJECT}/sat
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pywraprcpsp> ${PYTHON_PROJECT}/scheduling
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:sorted_interval_list> ${PYTHON_PROJECT}/util
|
2021-09-08 00:02:29 +02:00
|
|
|
#COMMAND ${Python3_EXECUTABLE} setup.py bdist_egg bdist_wheel
|
|
|
|
|
COMMAND ${Python3_EXECUTABLE} setup.py bdist_wheel
|
2021-10-29 17:39:19 +02:00
|
|
|
MAIN_DEPENDENCY
|
|
|
|
|
ortools # can't use TARGET alias here
|
|
|
|
|
DEPENDS
|
|
|
|
|
python/setup.py
|
|
|
|
|
Py${PROJECT_NAME}_proto
|
2020-02-24 17:26:17 +01:00
|
|
|
BYPRODUCTS
|
2021-10-29 17:39:19 +02:00
|
|
|
python/${PYTHON_PROJECT}
|
|
|
|
|
python/build
|
|
|
|
|
python/${PYTHON_PROJECT}.egg-info
|
|
|
|
|
WORKING_DIRECTORY python
|
2021-09-28 18:40:19 +02:00
|
|
|
COMMAND_EXPAND_LISTS
|
2018-11-13 09:21:15 +01:00
|
|
|
)
|
2021-10-29 17:39:19 +02:00
|
|
|
|
|
|
|
|
# Main Target
|
|
|
|
|
add_custom_target(python_package ALL
|
|
|
|
|
DEPENDS
|
|
|
|
|
python/dist
|
|
|
|
|
WORKING_DIRECTORY python
|
|
|
|
|
)
|
2017-06-28 15:45:56 +05:30
|
|
|
|
2020-07-16 20:38:23 +00:00
|
|
|
# Install rules
|
|
|
|
|
configure_file(
|
|
|
|
|
${PROJECT_SOURCE_DIR}/cmake/python-install.cmake.in
|
|
|
|
|
${PROJECT_BINARY_DIR}/python/python-install.cmake
|
|
|
|
|
@ONLY)
|
|
|
|
|
install(SCRIPT ${PROJECT_BINARY_DIR}/python/python-install.cmake)
|
|
|
|
|
|
2018-01-18 15:15:13 +01:00
|
|
|
# Test
|
|
|
|
|
if(BUILD_TESTING)
|
2020-09-21 09:50:05 +02:00
|
|
|
# Look for python module venv
|
2021-10-05 10:40:52 +02:00
|
|
|
search_python_module(absl absl-py)
|
2020-12-07 16:21:25 +01:00
|
|
|
search_python_internal_module(venv)
|
2018-11-13 09:21:15 +01:00
|
|
|
# Testing using a vitual environment
|
2021-09-08 00:02:29 +02:00
|
|
|
set(VENV_EXECUTABLE ${Python3_EXECUTABLE} -m venv)
|
2020-09-17 15:10:23 +02:00
|
|
|
set(VENV_DIR ${PROJECT_BINARY_DIR}/python/venv)
|
2018-11-13 09:21:15 +01:00
|
|
|
if(WIN32)
|
2021-09-08 00:02:29 +02:00
|
|
|
set(VENV_Python3_EXECUTABLE "${VENV_DIR}\\Scripts\\python.exe")
|
2018-11-13 09:21:15 +01:00
|
|
|
else()
|
2021-09-08 00:02:29 +02:00
|
|
|
set(VENV_Python3_EXECUTABLE ${VENV_DIR}/bin/python)
|
2018-11-13 09:21:15 +01:00
|
|
|
endif()
|
|
|
|
|
# make a virtualenv to install our python package in it
|
2020-02-12 11:30:15 +01:00
|
|
|
add_custom_command(TARGET python_package POST_BUILD
|
2021-10-29 17:22:37 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${VENV_DIR}
|
2020-09-21 09:50:05 +02:00
|
|
|
COMMAND ${VENV_EXECUTABLE} ${VENV_DIR}
|
2020-02-24 17:26:17 +01:00
|
|
|
# Must not call it in a folder containing the setup.py otherwise pip call it
|
|
|
|
|
# (i.e. "python setup.py bdist") while we want to consume the wheel package
|
2021-09-08 00:02:29 +02:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} -m pip install --find-links=${CMAKE_CURRENT_BINARY_DIR}/python/dist ${PROJECT_NAME}
|
2020-02-24 17:26:17 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test.py.in ${VENV_DIR}/test.py
|
|
|
|
|
BYPRODUCTS ${VENV_DIR}
|
|
|
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} VERBATIM)
|
2018-11-13 09:21:15 +01:00
|
|
|
# run the tests within the virtualenv
|
2020-05-27 17:13:48 +02:00
|
|
|
add_test(NAME pytest_venv
|
2021-09-08 00:02:29 +02:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} ${VENV_DIR}/test.py)
|
2020-07-26 00:06:59 +02:00
|
|
|
endif()
|
2020-09-17 18:45:56 +02:00
|
|
|
|
|
|
|
|
# add_python_sample()
|
|
|
|
|
# CMake function to generate and build python sample.
|
|
|
|
|
# Parameters:
|
|
|
|
|
# the python filename
|
|
|
|
|
# e.g.:
|
|
|
|
|
# add_python_sample(foo.py)
|
|
|
|
|
function(add_python_sample FILE_NAME)
|
2021-09-17 15:13:11 +02:00
|
|
|
message(STATUS "Configuring sample ${FILE_NAME} ...")
|
2020-09-17 18:45:56 +02:00
|
|
|
get_filename_component(SAMPLE_NAME ${FILE_NAME} NAME_WE)
|
|
|
|
|
get_filename_component(SAMPLE_DIR ${FILE_NAME} DIRECTORY)
|
|
|
|
|
get_filename_component(COMPONENT_DIR ${SAMPLE_DIR} DIRECTORY)
|
|
|
|
|
get_filename_component(COMPONENT_NAME ${COMPONENT_DIR} NAME)
|
|
|
|
|
|
|
|
|
|
if(BUILD_TESTING)
|
|
|
|
|
add_test(
|
|
|
|
|
NAME python_${COMPONENT_NAME}_${SAMPLE_NAME}
|
2021-09-08 00:02:29 +02:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} ${FILE_NAME}
|
2020-09-17 18:45:56 +02:00
|
|
|
WORKING_DIRECTORY ${VENV_DIR})
|
|
|
|
|
endif()
|
2021-09-17 15:13:11 +02:00
|
|
|
message(STATUS "Configuring sample ${FILE_NAME} done")
|
2020-09-17 18:45:56 +02:00
|
|
|
endfunction()
|
|
|
|
|
|
|
|
|
|
# add_python_example()
|
2020-09-18 19:57:25 +02:00
|
|
|
# CMake function to generate and build python example.
|
2020-09-17 18:45:56 +02:00
|
|
|
# Parameters:
|
|
|
|
|
# the python filename
|
|
|
|
|
# e.g.:
|
|
|
|
|
# add_python_example(foo.py)
|
|
|
|
|
function(add_python_example FILE_NAME)
|
2021-09-17 15:13:11 +02:00
|
|
|
message(STATUS "Configuring example ${FILE_NAME} ...")
|
2020-09-17 18:45:56 +02:00
|
|
|
get_filename_component(EXAMPLE_NAME ${FILE_NAME} NAME_WE)
|
|
|
|
|
get_filename_component(COMPONENT_DIR ${FILE_NAME} DIRECTORY)
|
|
|
|
|
get_filename_component(COMPONENT_NAME ${COMPONENT_DIR} NAME)
|
|
|
|
|
|
|
|
|
|
if(BUILD_TESTING)
|
|
|
|
|
add_test(
|
|
|
|
|
NAME python_${COMPONENT_NAME}_${EXAMPLE_NAME}
|
2021-09-08 00:02:29 +02:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} ${FILE_NAME}
|
2020-09-17 18:45:56 +02:00
|
|
|
WORKING_DIRECTORY ${VENV_DIR})
|
|
|
|
|
endif()
|
2021-09-17 15:13:11 +02:00
|
|
|
message(STATUS "Configuring example ${FILE_NAME} done")
|
2020-09-17 18:45:56 +02:00
|
|
|
endfunction()
|
|
|
|
|
|
|
|
|
|
# add_python_test()
|
2020-09-18 19:57:25 +02:00
|
|
|
# CMake function to generate and build python test.
|
2020-09-17 18:45:56 +02:00
|
|
|
# Parameters:
|
|
|
|
|
# the python filename
|
|
|
|
|
# e.g.:
|
|
|
|
|
# add_python_test(foo.py)
|
|
|
|
|
function(add_python_test FILE_NAME)
|
2021-09-17 15:13:11 +02:00
|
|
|
message(STATUS "Configuring test ${FILE_NAME} ...")
|
2020-09-17 18:45:56 +02:00
|
|
|
get_filename_component(TEST_NAME ${FILE_NAME} NAME_WE)
|
|
|
|
|
get_filename_component(COMPONENT_DIR ${FILE_NAME} DIRECTORY)
|
|
|
|
|
get_filename_component(COMPONENT_NAME ${COMPONENT_DIR} NAME)
|
|
|
|
|
|
|
|
|
|
if(BUILD_TESTING)
|
|
|
|
|
add_test(
|
2020-09-22 14:51:37 +02:00
|
|
|
NAME python_${COMPONENT_NAME}_${TEST_NAME}
|
2021-09-08 00:02:29 +02:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} ${FILE_NAME}
|
2020-09-17 18:45:56 +02:00
|
|
|
WORKING_DIRECTORY ${VENV_DIR})
|
|
|
|
|
endif()
|
2021-09-17 15:13:11 +02:00
|
|
|
message(STATUS "Configuring test ${FILE_NAME} done")
|
2020-09-17 18:45:56 +02:00
|
|
|
endfunction()
|