2025-01-10 11:33:35 +01:00
|
|
|
# Copyright 2010-2025 Google LLC
|
2022-06-17 14:23:05 +02:00
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
|
#
|
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
#
|
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
|
# limitations under the License.
|
|
|
|
|
|
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
|
|
|
|
2021-11-12 01:30:58 +01:00
|
|
|
if(NOT TARGET ${PROJECT_NAMESPACE}::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
|
2025-07-02 12:20:11 +00:00
|
|
|
set(SWIG_SOURCE_FILE_EXTENSIONS ".i" ".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()
|
|
|
|
|
|
2024-06-10 11:25:35 -04:00
|
|
|
if(UNIX AND NOT APPLE AND NOT (CMAKE_SYSTEM_NAME STREQUAL "OpenBSD"))
|
2022-05-30 11:58:51 +02:00
|
|
|
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
|
|
|
list(APPEND CMAKE_SWIG_FLAGS "-DSWIGWORDSIZE64")
|
|
|
|
|
else()
|
|
|
|
|
list(APPEND CMAKE_SWIG_FLAGS "-DSWIGWORDSIZE32")
|
|
|
|
|
endif()
|
2020-02-24 17:26:17 +01:00
|
|
|
endif()
|
2025-02-04 19:42:22 +01:00
|
|
|
list(APPEND CMAKE_SWIG_FLAGS "-DOR_DLL=")
|
2020-02-24 17:26:17 +01:00
|
|
|
|
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
|
|
|
|
2021-11-04 14:10:28 +01:00
|
|
|
# Find if the python module is available,
|
|
|
|
|
# otherwise install it (PACKAGE_NAME) to the Python3 user install directory.
|
|
|
|
|
# If CMake option FETCH_PYTHON_DEPS is OFF then issue a fatal error instead.
|
|
|
|
|
# e.g
|
|
|
|
|
# search_python_module(
|
|
|
|
|
# NAME
|
|
|
|
|
# mypy_protobuf
|
|
|
|
|
# PACKAGE
|
|
|
|
|
# mypy-protobuf
|
|
|
|
|
# NO_VERSION
|
|
|
|
|
# )
|
|
|
|
|
function(search_python_module)
|
|
|
|
|
set(options NO_VERSION)
|
|
|
|
|
set(oneValueArgs NAME PACKAGE)
|
|
|
|
|
set(multiValueArgs "")
|
|
|
|
|
cmake_parse_arguments(MODULE
|
|
|
|
|
"${options}"
|
|
|
|
|
"${oneValueArgs}"
|
|
|
|
|
"${multiValueArgs}"
|
|
|
|
|
${ARGN}
|
|
|
|
|
)
|
|
|
|
|
message(STATUS "Searching python module: \"${MODULE_NAME}\"")
|
|
|
|
|
if(${MODULE_NO_VERSION})
|
|
|
|
|
execute_process(
|
|
|
|
|
COMMAND ${Python3_EXECUTABLE} -c "import ${MODULE_NAME}"
|
|
|
|
|
RESULT_VARIABLE _RESULT
|
|
|
|
|
ERROR_QUIET
|
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
2020-11-30 21:11:12 +01:00
|
|
|
)
|
2021-11-04 14:10:28 +01:00
|
|
|
set(MODULE_VERSION "unknown")
|
|
|
|
|
else()
|
|
|
|
|
execute_process(
|
|
|
|
|
COMMAND ${Python3_EXECUTABLE} -c "import ${MODULE_NAME}; print(${MODULE_NAME}.__version__)"
|
|
|
|
|
RESULT_VARIABLE _RESULT
|
|
|
|
|
OUTPUT_VARIABLE MODULE_VERSION
|
|
|
|
|
ERROR_QUIET
|
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
2023-07-24 13:08:10 +02:00
|
|
|
)
|
2021-11-04 14:10:28 +01:00
|
|
|
endif()
|
2020-11-30 21:11:12 +01:00
|
|
|
if(${_RESULT} STREQUAL "0")
|
2021-11-04 14:10:28 +01:00
|
|
|
message(STATUS "Found python module: \"${MODULE_NAME}\" (found version \"${MODULE_VERSION}\")")
|
2020-11-30 21:11:12 +01:00
|
|
|
else()
|
2021-10-06 18:27:15 +02:00
|
|
|
if(FETCH_PYTHON_DEPS)
|
2021-11-04 14:10:28 +01:00
|
|
|
message(WARNING "Can't find python module: \"${MODULE_NAME}\", install it using pip...")
|
2021-10-06 18:27:15 +02:00
|
|
|
execute_process(
|
2021-11-04 14:10:28 +01:00
|
|
|
COMMAND ${Python3_EXECUTABLE} -m pip install --user ${MODULE_PACKAGE}
|
2021-10-06 18:27:15 +02:00
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
2023-07-24 13:08:10 +02:00
|
|
|
COMMAND_ERROR_IS_FATAL ANY
|
|
|
|
|
)
|
2021-10-06 18:27:15 +02:00
|
|
|
else()
|
2021-11-04 14:10:28 +01: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()
|
|
|
|
|
|
2021-11-04 14:10:28 +01:00
|
|
|
# Find if a python builtin module is available.
|
|
|
|
|
# e.g
|
|
|
|
|
# search_python_internal_module(
|
|
|
|
|
# NAME
|
|
|
|
|
# mypy_protobuf
|
|
|
|
|
# )
|
|
|
|
|
function(search_python_internal_module)
|
|
|
|
|
set(options "")
|
|
|
|
|
set(oneValueArgs NAME)
|
|
|
|
|
set(multiValueArgs "")
|
|
|
|
|
cmake_parse_arguments(MODULE
|
|
|
|
|
"${options}"
|
|
|
|
|
"${oneValueArgs}"
|
|
|
|
|
"${multiValueArgs}"
|
|
|
|
|
${ARGN}
|
|
|
|
|
)
|
|
|
|
|
message(STATUS "Searching python module: \"${MODULE_NAME}\"")
|
2020-12-07 16:21:25 +01:00
|
|
|
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
|
|
|
|
|
ERROR_QUIET
|
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
|
)
|
|
|
|
|
if(${_RESULT} STREQUAL "0")
|
2021-11-04 14:10:28 +01:00
|
|
|
message(STATUS "Found python internal module: \"${MODULE_NAME}\"")
|
2020-12-07 16:21:25 +01:00
|
|
|
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()
|
|
|
|
|
|
2022-09-21 18:27:56 +02:00
|
|
|
##################
|
|
|
|
|
## PROTO FILE ##
|
|
|
|
|
##################
|
2020-11-30 21:11:12 +01:00
|
|
|
# Generate Protobuf py sources with mypy support
|
2021-11-04 14:10:28 +01:00
|
|
|
search_python_module(
|
2021-11-05 14:10:37 +01:00
|
|
|
NAME mypy_protobuf
|
|
|
|
|
PACKAGE mypy-protobuf
|
|
|
|
|
NO_VERSION)
|
2017-12-11 09:20:43 +01:00
|
|
|
set(PROTO_PYS)
|
2023-07-21 18:21:46 +02:00
|
|
|
set(PROTO_MYPYS)
|
2024-01-12 05:18:31 +01:00
|
|
|
set(OR_TOOLS_PROTO_PY_FILES)
|
|
|
|
|
file(GLOB_RECURSE OR_TOOLS_PROTO_PY_FILES RELATIVE ${PROJECT_SOURCE_DIR}
|
2023-12-08 14:32:20 +01:00
|
|
|
"ortools/algorithms/*.proto"
|
2022-02-26 01:47:32 +01:00
|
|
|
"ortools/bop/*.proto"
|
2018-11-13 09:21:15 +01:00
|
|
|
"ortools/constraint_solver/*.proto"
|
2022-02-26 01:47:32 +01:00
|
|
|
"ortools/glop/*.proto"
|
|
|
|
|
"ortools/graph/*.proto"
|
2018-11-13 09:21:15 +01:00
|
|
|
"ortools/linear_solver/*.proto"
|
2021-09-28 15:58:37 +02:00
|
|
|
"ortools/packing/*.proto"
|
2024-04-03 13:10:24 +02:00
|
|
|
"ortools/routing/*.proto"
|
2018-11-13 09:21:15 +01:00
|
|
|
"ortools/sat/*.proto"
|
2021-09-28 15:58:37 +02:00
|
|
|
"ortools/scheduling/*.proto"
|
2025-02-17 12:52:36 +01:00
|
|
|
"ortools/set_cover/*.proto"
|
2022-09-21 18:27:56 +02:00
|
|
|
"ortools/util/*.proto"
|
2018-11-13 09:21:15 +01:00
|
|
|
)
|
2024-02-16 14:26:25 +01:00
|
|
|
|
2024-01-12 05:18:31 +01:00
|
|
|
if(BUILD_MATH_OPT)
|
|
|
|
|
file(GLOB_RECURSE MATH_OPT_PROTO_PY_FILES RELATIVE ${PROJECT_SOURCE_DIR}
|
|
|
|
|
"ortools/math_opt/*.proto"
|
|
|
|
|
"ortools/math_opt/solver/*.proto")
|
|
|
|
|
list(APPEND OR_TOOLS_PROTO_PY_FILES ${MATH_OPT_PROTO_PY_FILES})
|
2024-02-16 14:26:25 +01:00
|
|
|
|
|
|
|
|
file(GLOB_RECURSE SERVICE_PROTO_PY_FILES RELATIVE ${PROJECT_SOURCE_DIR}
|
|
|
|
|
"ortools/service/v1/*.proto")
|
|
|
|
|
list(APPEND OR_TOOLS_PROTO_PY_FILES ${SERVICE_PROTO_PY_FILES})
|
2022-02-25 23:43:01 +01:00
|
|
|
endif()
|
2024-02-16 14:26:25 +01:00
|
|
|
|
2024-01-12 05:18:31 +01:00
|
|
|
if(USE_PDLP OR BUILD_MATH_OPT)
|
|
|
|
|
file(GLOB_RECURSE PDLP_PROTO_PY_FILES RELATIVE ${PROJECT_SOURCE_DIR} "ortools/pdlp/*.proto")
|
|
|
|
|
list(APPEND OR_TOOLS_PROTO_PY_FILES ${PDLP_PROTO_PY_FILES})
|
|
|
|
|
endif()
|
2024-01-15 15:09:45 +01:00
|
|
|
|
2024-01-12 05:18:31 +01:00
|
|
|
foreach(PROTO_FILE IN LISTS OR_TOOLS_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)
|
2023-07-21 18:21:46 +02:00
|
|
|
set(PROTO_MYPY ${PROJECT_BINARY_DIR}/python/${PROTO_DIR}/${PROTO_NAME}_pb2.pyi)
|
|
|
|
|
#message(STATUS "protoc(py) py: ${PROTO_PY}")
|
|
|
|
|
#message(STATUS "protoc(py) mypy: ${PROTO_MYPY}")
|
2018-11-13 09:21:15 +01:00
|
|
|
add_custom_command(
|
2023-07-21 18:21:46 +02:00
|
|
|
OUTPUT ${PROTO_PY} ${PROTO_MYPY}
|
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})
|
2023-07-21 18:21:46 +02:00
|
|
|
list(APPEND PROTO_MYPYS ${PROTO_MYPY})
|
2017-12-11 09:20:43 +01:00
|
|
|
endforeach()
|
2022-10-21 17:08:37 +02:00
|
|
|
add_custom_target(Py${PROJECT_NAME}_proto
|
|
|
|
|
DEPENDS
|
|
|
|
|
${PROTO_PYS}
|
2023-07-21 18:21:46 +02:00
|
|
|
${PROTO_MYPYS}
|
2022-10-21 17:08:37 +02:00
|
|
|
${PROJECT_NAMESPACE}::ortools)
|
2017-12-11 09:20:43 +01:00
|
|
|
|
2023-02-22 09:26:36 +01:00
|
|
|
###################
|
|
|
|
|
## Python Test ##
|
|
|
|
|
###################
|
|
|
|
|
if(BUILD_VENV)
|
|
|
|
|
search_python_module(NAME virtualenv PACKAGE virtualenv)
|
|
|
|
|
# venv not working on github runners
|
|
|
|
|
# search_python_internal_module(NAME venv)
|
|
|
|
|
# Testing using a vitual environment
|
|
|
|
|
set(VENV_EXECUTABLE ${Python3_EXECUTABLE} -m virtualenv)
|
|
|
|
|
#set(VENV_EXECUTABLE ${Python3_EXECUTABLE} -m venv)
|
|
|
|
|
set(VENV_DIR ${CMAKE_CURRENT_BINARY_DIR}/python/venv)
|
|
|
|
|
if(WIN32)
|
|
|
|
|
set(VENV_Python3_EXECUTABLE ${VENV_DIR}/Scripts/python.exe)
|
|
|
|
|
else()
|
|
|
|
|
set(VENV_Python3_EXECUTABLE ${VENV_DIR}/bin/python)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2024-01-16 11:29:15 +01:00
|
|
|
# add_python_test()
|
|
|
|
|
# CMake function to generate and build python test.
|
|
|
|
|
# Parameters:
|
|
|
|
|
# FILE_NAME: the python filename
|
|
|
|
|
# COMPONENT_NAME: name of the ortools/ subdir where the test is located
|
2024-01-18 10:19:14 +01:00
|
|
|
# note: automatically determined if located in ortools/<component>/python/
|
2024-01-16 11:29:15 +01:00
|
|
|
# e.g.:
|
|
|
|
|
# add_python_test(
|
|
|
|
|
# FILE_NAME
|
|
|
|
|
# ${PROJECT_SOURCE_DIR}/ortools/foo/python/bar_test.py
|
|
|
|
|
# COMPONENT_NAME
|
|
|
|
|
# foo
|
|
|
|
|
# )
|
|
|
|
|
function(add_python_test)
|
|
|
|
|
set(options "")
|
|
|
|
|
set(oneValueArgs FILE_NAME COMPONENT_NAME)
|
|
|
|
|
set(multiValueArgs "")
|
|
|
|
|
cmake_parse_arguments(TEST
|
|
|
|
|
"${options}"
|
|
|
|
|
"${oneValueArgs}"
|
|
|
|
|
"${multiValueArgs}"
|
|
|
|
|
${ARGN}
|
|
|
|
|
)
|
|
|
|
|
if(NOT TEST_FILE_NAME)
|
|
|
|
|
message(FATAL_ERROR "no FILE_NAME provided")
|
|
|
|
|
endif()
|
|
|
|
|
get_filename_component(TEST_NAME ${TEST_FILE_NAME} NAME_WE)
|
2024-01-12 08:55:24 +01:00
|
|
|
|
2024-01-16 11:29:15 +01:00
|
|
|
message(STATUS "Configuring test ${TEST_FILE_NAME} ...")
|
2024-01-12 08:55:24 +01:00
|
|
|
|
2024-01-16 11:29:15 +01:00
|
|
|
if(NOT TEST_COMPONENT_NAME)
|
|
|
|
|
# test is located in ortools/<component_name>/python/
|
|
|
|
|
get_filename_component(WRAPPER_DIR ${TEST_FILE_NAME} DIRECTORY)
|
|
|
|
|
get_filename_component(COMPONENT_DIR ${WRAPPER_DIR} DIRECTORY)
|
2024-01-18 10:19:14 +01:00
|
|
|
get_filename_component(COMPONENT_NAME ${COMPONENT_DIR} NAME)
|
|
|
|
|
else()
|
|
|
|
|
set(COMPONENT_NAME ${TEST_COMPONENT_NAME})
|
2024-01-16 11:29:15 +01:00
|
|
|
endif()
|
2023-02-22 09:26:36 +01:00
|
|
|
|
2024-01-16 11:29:15 +01:00
|
|
|
if(BUILD_TESTING)
|
2023-02-22 09:26:36 +01:00
|
|
|
add_test(
|
2024-01-18 10:19:14 +01:00
|
|
|
NAME python_${COMPONENT_NAME}_${TEST_NAME}
|
2024-01-12 08:55:24 +01:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} -m pytest ${TEST_FILE_NAME}
|
2023-02-22 09:26:36 +01:00
|
|
|
WORKING_DIRECTORY ${VENV_DIR})
|
2024-01-16 11:29:15 +01:00
|
|
|
endif()
|
|
|
|
|
message(STATUS "Configuring test ${TEST_FILE_NAME} ...DONE")
|
|
|
|
|
endfunction()
|
2023-02-22 09:26:36 +01:00
|
|
|
|
2022-09-21 18:27:56 +02:00
|
|
|
#######################
|
|
|
|
|
## PYTHON WRAPPERS ##
|
|
|
|
|
#######################
|
2022-11-07 15:29:16 +01:00
|
|
|
list(APPEND CMAKE_SWIG_FLAGS "-I${PROJECT_SOURCE_DIR}")
|
2017-12-11 09:20:43 +01:00
|
|
|
|
2021-11-05 14:10:37 +01:00
|
|
|
set(PYTHON_PROJECT ${PROJECT_NAME})
|
|
|
|
|
message(STATUS "Python project: ${PYTHON_PROJECT}")
|
2021-12-02 23:34:51 +01:00
|
|
|
set(PYTHON_PROJECT_DIR ${PROJECT_BINARY_DIR}/python/${PYTHON_PROJECT})
|
|
|
|
|
message(STATUS "Python project build path: ${PYTHON_PROJECT_DIR}")
|
2021-11-05 14:10:37 +01:00
|
|
|
|
2024-01-12 05:18:31 +01:00
|
|
|
# SWIG/Pybind11 wrap all libraries
|
2024-02-09 01:01:13 +01:00
|
|
|
foreach(SUBPROJECT IN ITEMS
|
|
|
|
|
init
|
|
|
|
|
algorithms
|
|
|
|
|
graph
|
|
|
|
|
linear_solver
|
|
|
|
|
${PDLP_DIR}
|
2024-04-10 13:47:07 +02:00
|
|
|
constraint_solver
|
|
|
|
|
routing
|
2024-02-09 01:01:13 +01:00
|
|
|
sat
|
|
|
|
|
scheduling
|
2025-02-17 12:52:36 +01:00
|
|
|
set_cover
|
2024-02-09 01:01:13 +01:00
|
|
|
util)
|
2018-11-13 09:21:15 +01:00
|
|
|
add_subdirectory(ortools/${SUBPROJECT}/python)
|
2017-12-11 09:20:43 +01:00
|
|
|
endforeach()
|
|
|
|
|
|
2024-01-12 05:18:31 +01:00
|
|
|
if(BUILD_MATH_OPT)
|
|
|
|
|
add_subdirectory(ortools/math_opt/core/python)
|
2022-12-16 17:06:11 +01:00
|
|
|
add_subdirectory(ortools/math_opt/elemental/python)
|
|
|
|
|
add_subdirectory(ortools/math_opt/io/python)
|
2024-01-12 05:18:31 +01:00
|
|
|
add_subdirectory(ortools/math_opt/python)
|
|
|
|
|
endif()
|
|
|
|
|
|
2020-02-24 17:26:17 +01:00
|
|
|
#######################
|
|
|
|
|
## Python Packaging ##
|
|
|
|
|
#######################
|
2021-11-05 14:10:37 +01:00
|
|
|
#file(MAKE_DIRECTORY python/${PYTHON_PROJECT})
|
2023-02-02 11:35:56 +01:00
|
|
|
configure_file(
|
|
|
|
|
${PROJECT_SOURCE_DIR}/ortools/python/__init__.py.in
|
|
|
|
|
${PROJECT_BINARY_DIR}/python/__init__.py.in
|
|
|
|
|
@ONLY)
|
|
|
|
|
file(GENERATE
|
|
|
|
|
OUTPUT ${PYTHON_PROJECT_DIR}/__init__.py
|
|
|
|
|
INPUT ${PROJECT_BINARY_DIR}/python/__init__.py.in)
|
|
|
|
|
|
2026-02-01 12:15:15 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/../pybind11_abseil/__init__.py CONTENT "")
|
2021-12-02 23:34:51 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/algorithms/__init__.py CONTENT "")
|
2023-06-30 22:49:35 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/algorithms/python/__init__.py CONTENT "")
|
2022-02-28 08:54:23 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/bop/__init__.py CONTENT "")
|
2022-02-23 21:14:30 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/constraint_solver/__init__.py CONTENT "")
|
2024-04-19 10:40:57 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/constraint_solver/python/__init__.py CONTENT "")
|
2022-02-28 08:54:23 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/glop/__init__.py CONTENT "")
|
2021-12-02 23:34:51 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/graph/__init__.py CONTENT "")
|
2022-03-31 18:21:20 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/graph/python/__init__.py CONTENT "")
|
2022-02-23 21:14:30 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/init/__init__.py CONTENT "")
|
2023-07-02 08:12:30 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/init/python/__init__.py CONTENT "")
|
2021-12-02 23:34:51 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/linear_solver/__init__.py CONTENT "")
|
2022-09-12 11:28:52 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/linear_solver/python/__init__.py CONTENT "")
|
2024-01-12 05:18:31 +01:00
|
|
|
if(BUILD_MATH_OPT)
|
2024-01-15 15:09:45 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/core/__init__.py CONTENT "")
|
2024-01-12 05:18:31 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/core/python/__init__.py CONTENT "")
|
2022-12-16 17:06:11 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/elemental/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/elemental/python/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/io/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/io/python/__init__.py CONTENT "")
|
2024-01-12 05:18:31 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/python/__init__.py CONTENT "")
|
2022-12-16 17:06:11 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/python/elemental/__init__.py CONTENT "")
|
2024-02-16 14:26:25 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/python/ipc/__init__.py CONTENT "")
|
2024-01-22 17:18:09 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/python/testing/__init__.py CONTENT "")
|
2024-01-15 15:09:45 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/solvers/__init__.py CONTENT "")
|
2025-08-18 15:03:20 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/math_opt/solvers/gscip/__init__.py CONTENT "")
|
2024-02-16 14:26:25 +01:00
|
|
|
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/service/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/service/v1/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/service/v1/mathopt/__init__.py CONTENT "")
|
2024-01-12 05:18:31 +01:00
|
|
|
endif()
|
2021-12-02 23:34:51 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/packing/__init__.py CONTENT "")
|
2024-01-12 05:18:31 +01:00
|
|
|
if(USE_PDLP OR BUILD_MATH_OPT)
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/pdlp/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/pdlp/python/__init__.py CONTENT "")
|
|
|
|
|
endif()
|
2024-04-03 13:10:24 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/routing/__init__.py CONTENT "")
|
2024-04-19 10:40:27 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/routing/python/__init__.py CONTENT "")
|
2024-04-03 13:10:24 +02:00
|
|
|
|
2021-12-02 23:34:51 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/sat/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/sat/python/__init__.py CONTENT "")
|
2023-01-29 21:20:58 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/sat/colab/__init__.py CONTENT "")
|
2021-12-02 23:34:51 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/scheduling/__init__.py CONTENT "")
|
2023-06-30 22:49:35 +02:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/scheduling/python/__init__.py CONTENT "")
|
2025-02-17 12:52:36 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/set_cover/__init__.py CONTENT "")
|
|
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/set_cover/python/__init__.py CONTENT "")
|
2021-12-02 23:34:51 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/util/__init__.py CONTENT "")
|
2022-02-22 18:33:45 +01:00
|
|
|
file(GENERATE OUTPUT ${PYTHON_PROJECT_DIR}/util/python/__init__.py CONTENT "")
|
2020-02-24 17:26:17 +01:00
|
|
|
|
2020-05-29 14:15:31 +02:00
|
|
|
file(COPY
|
2023-08-24 14:52:54 +02:00
|
|
|
ortools/linear_solver/python/linear_solver_natural_api.py
|
|
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/linear_solver/python)
|
2022-02-23 21:14:30 +01:00
|
|
|
file(COPY
|
2022-09-12 11:28:52 +02:00
|
|
|
ortools/linear_solver/python/model_builder.py
|
2023-07-03 14:30:27 +02:00
|
|
|
ortools/linear_solver/python/model_builder_numbers.py
|
2022-09-12 11:28:52 +02:00
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/linear_solver/python)
|
2024-01-12 05:18:31 +01:00
|
|
|
if(BUILD_MATH_OPT)
|
2022-12-16 17:06:11 +01:00
|
|
|
configure_file(
|
|
|
|
|
ortools/math_opt/elemental/python/enums.py.in
|
|
|
|
|
${PYTHON_PROJECT_DIR}/math_opt/elemental/python/enums.py
|
|
|
|
|
COPYONLY)
|
2024-01-12 05:18:31 +01:00
|
|
|
file(COPY
|
2022-12-16 17:06:11 +01:00
|
|
|
ortools/math_opt/python/bounded_expressions.py
|
2024-01-12 05:18:31 +01:00
|
|
|
ortools/math_opt/python/callback.py
|
|
|
|
|
ortools/math_opt/python/compute_infeasible_subsystem_result.py
|
2024-07-30 16:31:17 +02:00
|
|
|
ortools/math_opt/python/errors.py
|
2024-01-12 05:18:31 +01:00
|
|
|
ortools/math_opt/python/expressions.py
|
2022-12-16 17:06:11 +01:00
|
|
|
ortools/math_opt/python/from_model.py
|
|
|
|
|
ortools/math_opt/python/indicator_constraints.py
|
2024-11-14 18:47:10 +01:00
|
|
|
ortools/math_opt/python/init_arguments.py
|
2022-12-16 17:06:11 +01:00
|
|
|
ortools/math_opt/python/linear_constraints.py
|
2024-01-12 05:18:31 +01:00
|
|
|
ortools/math_opt/python/mathopt.py
|
|
|
|
|
ortools/math_opt/python/message_callback.py
|
|
|
|
|
ortools/math_opt/python/model.py
|
2024-07-30 16:31:17 +02:00
|
|
|
ortools/math_opt/python/model_parameters.py
|
2022-12-16 17:06:11 +01:00
|
|
|
ortools/math_opt/python/normalized_inequality.py
|
2024-01-12 05:18:31 +01:00
|
|
|
ortools/math_opt/python/normalize.py
|
2022-12-16 17:06:11 +01:00
|
|
|
ortools/math_opt/python/objectives.py
|
2024-01-12 05:18:31 +01:00
|
|
|
ortools/math_opt/python/parameters.py
|
2022-12-16 17:06:11 +01:00
|
|
|
ortools/math_opt/python/quadratic_constraints.py
|
2024-01-12 05:18:31 +01:00
|
|
|
ortools/math_opt/python/result.py
|
|
|
|
|
ortools/math_opt/python/solution.py
|
|
|
|
|
ortools/math_opt/python/solve.py
|
2024-02-23 10:20:28 +01:00
|
|
|
ortools/math_opt/python/solver_resources.py
|
2024-01-12 05:18:31 +01:00
|
|
|
ortools/math_opt/python/sparse_containers.py
|
|
|
|
|
ortools/math_opt/python/statistics.py
|
2022-12-16 17:06:11 +01:00
|
|
|
ortools/math_opt/python/variables.py
|
2024-01-12 05:18:31 +01:00
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/math_opt/python)
|
2022-12-16 17:06:11 +01:00
|
|
|
file(COPY
|
|
|
|
|
ortools/math_opt/python/elemental/elemental.py
|
|
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/math_opt/python/elemental)
|
2024-02-16 14:26:25 +01:00
|
|
|
file(COPY
|
|
|
|
|
ortools/math_opt/python/ipc/proto_converter.py
|
|
|
|
|
ortools/math_opt/python/ipc/remote_http_solve.py
|
|
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/math_opt/python/ipc)
|
2024-01-22 17:18:09 +01:00
|
|
|
file(COPY
|
|
|
|
|
ortools/math_opt/python/testing/compare_proto.py
|
|
|
|
|
ortools/math_opt/python/testing/proto_matcher.py
|
|
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/math_opt/python/testing)
|
2024-01-12 05:18:31 +01:00
|
|
|
endif()
|
2020-05-29 14:15:31 +02:00
|
|
|
file(COPY
|
2021-11-05 14:10:37 +01:00
|
|
|
ortools/sat/python/cp_model.py
|
2021-12-02 23:34:51 +01:00
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/sat/python)
|
2023-01-29 21:20:58 +01:00
|
|
|
file(COPY
|
2023-09-05 17:06:29 +02:00
|
|
|
ortools/sat/colab/flags.py
|
2023-01-29 21:20:58 +01:00
|
|
|
ortools/sat/colab/visualization.py
|
|
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/sat/colab)
|
2025-08-19 19:41:20 +02:00
|
|
|
file(COPY
|
|
|
|
|
ortools/util/python/solve_interrupter.py
|
|
|
|
|
DESTINATION ${PYTHON_PROJECT_DIR}/util/python)
|
2017-12-11 09:20:43 +01:00
|
|
|
|
2023-11-22 14:47:35 +01:00
|
|
|
# Adds py.typed to make typed packages.
|
|
|
|
|
file(TOUCH ${PYTHON_PROJECT_DIR}/linear_solver/python/py.typed)
|
|
|
|
|
file(TOUCH ${PYTHON_PROJECT_DIR}/sat/py.typed)
|
|
|
|
|
file(TOUCH ${PYTHON_PROJECT_DIR}/sat/python/py.typed)
|
|
|
|
|
|
2021-11-05 14:10:37 +01:00
|
|
|
# setup.py.in contains cmake variable e.g. @PYTHON_PROJECT@ and
|
2020-05-19 16:58:10 +02:00
|
|
|
# generator expression e.g. $<TARGET_FILE_NAME:pyFoo>
|
2025-12-02 11:34:39 +01:00
|
|
|
if(RELEASE)
|
|
|
|
|
set(PYTHON_RELEASE "")
|
|
|
|
|
else()
|
|
|
|
|
set(PYTHON_RELEASE "rc1")
|
|
|
|
|
endif()
|
2020-05-19 16:58:10 +02:00
|
|
|
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
|
2021-11-12 01:30:58 +01:00
|
|
|
OUTPUT ${PROJECT_BINARY_DIR}/python/setup.py
|
2020-05-27 17:13:48 +02:00
|
|
|
INPUT ${PROJECT_BINARY_DIR}/python/setup.py.in)
|
2017-12-11 09:20:43 +01:00
|
|
|
|
2021-11-12 01:30:58 +01:00
|
|
|
#add_custom_command(
|
|
|
|
|
# OUTPUT python/setup.py
|
|
|
|
|
# DEPENDS ${PROJECT_BINARY_DIR}/python/setup.py
|
|
|
|
|
# COMMAND ${CMAKE_COMMAND} -E copy setup.py setup.py
|
|
|
|
|
# WORKING_DIRECTORY python)
|
2021-10-29 17:39:19 +02:00
|
|
|
|
2020-11-30 21:11:12 +01:00
|
|
|
configure_file(
|
2022-11-30 11:24:40 +01:00
|
|
|
${PROJECT_SOURCE_DIR}/ortools/python/README.pypi.txt
|
2020-11-30 21:11:12 +01:00
|
|
|
${PROJECT_BINARY_DIR}/python/README.txt
|
|
|
|
|
COPYONLY)
|
2018-01-29 10:26:03 +01:00
|
|
|
|
2024-01-13 01:36:17 -08:00
|
|
|
configure_file(
|
|
|
|
|
${PROJECT_SOURCE_DIR}/LICENSE
|
|
|
|
|
${PROJECT_BINARY_DIR}/python/LICENSE
|
|
|
|
|
COPYONLY)
|
|
|
|
|
|
2024-10-30 13:09:07 +01:00
|
|
|
set(is_windows "$<PLATFORM_ID:Windows>")
|
2024-10-25 08:55:29 +02:00
|
|
|
set(is_not_windows "$<NOT:$<PLATFORM_ID:Windows>>")
|
|
|
|
|
|
2024-10-30 13:09:07 +01:00
|
|
|
set(need_unix_zlib_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_ZLIB}>>")
|
|
|
|
|
set(need_windows_zlib_lib "$<AND:${is_windows},$<BOOL:${BUILD_ZLIB}>>")
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2025-04-07 17:46:43 +02:00
|
|
|
set(need_unix_bzip2_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_BZip2}>>")
|
|
|
|
|
set(need_windows_bzip2_lib "$<AND:${is_windows},$<BOOL:${BUILD_BZip2}>>")
|
|
|
|
|
|
2024-10-30 13:09:07 +01:00
|
|
|
set(need_unix_absl_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_absl}>>")
|
|
|
|
|
set(need_windows_absl_lib "$<AND:${is_windows},$<BOOL:${BUILD_absl}>>")
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2024-10-30 13:09:07 +01:00
|
|
|
set(need_unix_re2_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_re2}>>")
|
|
|
|
|
set(need_windows_re2_lib "$<AND:${is_windows},$<BOOL:${BUILD_re2}>>")
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2024-10-30 13:09:07 +01:00
|
|
|
set(need_unix_protobuf_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_Protobuf}>>")
|
|
|
|
|
set(need_windows_protobuf_lib "$<AND:${is_windows},$<BOOL:${BUILD_Protobuf}>>")
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2024-10-30 13:09:07 +01:00
|
|
|
set(need_unix_coinutils_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_CoinUtils}>>")
|
|
|
|
|
set(need_unix_osi_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_Osi}>>")
|
|
|
|
|
set(need_unix_clp_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_Clp}>>")
|
|
|
|
|
set(need_unix_cgl_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_Cgl}>>")
|
|
|
|
|
set(need_unix_cbc_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_Cbc}>>")
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2024-10-30 13:09:07 +01:00
|
|
|
set(need_unix_highs_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_HIGHS}>>")
|
|
|
|
|
set(need_windows_highs_lib "$<AND:${is_windows},$<BOOL:${BUILD_HIGHS}>>")
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2025-03-02 16:11:37 +01:00
|
|
|
set(need_unix_scip_lib "$<AND:${is_not_windows},$<BOOL:${BUILD_SCIP}>>")
|
|
|
|
|
set(need_windows_scip_lib "$<AND:${is_windows},$<BOOL:${BUILD_SCIP}>>")
|
|
|
|
|
|
2024-10-25 08:55:29 +02:00
|
|
|
set(is_ortools_shared "$<STREQUAL:$<TARGET_PROPERTY:ortools,TYPE>,SHARED_LIBRARY>")
|
2025-02-04 19:42:22 +01:00
|
|
|
set(need_unix_ortools_lib "$<AND:${is_not_windows},${is_ortools_shared}>")
|
|
|
|
|
set(need_windows_ortools_lib "$<AND:${is_windows},${is_ortools_shared}>")
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2023-11-22 20:21:39 +01:00
|
|
|
add_custom_command(
|
|
|
|
|
OUTPUT python/ortools_timestamp
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove -f ortools_timestamp
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${PYTHON_PROJECT}/.libs
|
2025-10-09 10:36:10 +02:00
|
|
|
|
2024-10-16 01:16:29 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:$<BOOL:${BUILD_ZLIB}>,copy,true>
|
|
|
|
|
$<${need_unix_zlib_lib}:$<TARGET_SONAME_FILE:ZLIB::ZLIB>>
|
|
|
|
|
$<${need_windows_zlib_lib}:$<TARGET_FILE:ZLIB::ZLIB>>
|
2024-10-16 01:16:29 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2025-10-09 10:36:10 +02:00
|
|
|
|
2025-04-07 17:46:43 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
|
|
|
|
$<IF:$<BOOL:${BUILD_BZip2}>,copy,true>
|
|
|
|
|
$<${need_unix_bzip2_lib}:$<TARGET_SONAME_FILE:BZip2::BZip2>>
|
|
|
|
|
$<${need_windows_bzip2_lib}:$<TARGET_FILE:BZip2::BZip2>>
|
|
|
|
|
${PYTHON_PROJECT}/.libs
|
2025-10-09 10:36:10 +02:00
|
|
|
|
2024-10-11 13:08:26 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:$<BOOL:${BUILD_absl}>,copy,true>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::base>>
|
2026-02-18 15:03:28 +01:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::borrowed_fixup_buffer>>
|
2024-10-30 13:09:07 +01:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::city>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::civil_time>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::cord>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::cord_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::cordz_functions>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::cordz_handle>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::cordz_info>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::crc32c>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::crc_cord_state>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::crc_cpu_detect>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::crc_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::debugging_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::decode_rust_punycode>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::demangle_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::demangle_rust>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::die_if_null>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::examine_stack>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::exponential_biased>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_commandlineflag>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_commandlineflag_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_config>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_marshalling>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_parse>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_private_handle_accessor>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_program_name>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_reflection>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_usage>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::flags_usage_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::graphcycles_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::hash>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::hashtablez_sampler>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::int128>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::kernel_timeout_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::leak_check>>
|
2025-09-05 14:36:23 +02:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_entry>>
|
2024-10-30 13:09:07 +01:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_flags>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_globals>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_initialize>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_check_op>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_conditions>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_fnmatch>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_format>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_globals>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_log_sink_set>>
|
2025-03-03 14:47:26 +01:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_structured_proto>>
|
2024-10-30 13:09:07 +01:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_message>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_nullguard>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_internal_proto>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_severity>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::log_sink>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::malloc_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_distributions>>
|
2025-05-22 09:53:23 +02:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_internal_entropy_pool>>
|
2024-10-30 13:09:07 +01:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_internal_platform>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_internal_randen>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_internal_randen_hwaes>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_internal_randen_hwaes_impl>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_internal_randen_slow>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_internal_seed_material>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_seed_gen_exception>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::random_seed_sequences>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::raw_hash_set>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::raw_logging_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::spinlock_wait>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::stacktrace>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::status>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::statusor>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::str_format_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::strerror>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::strings>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::strings_internal>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::symbolize>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::synchronization>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::throw_delegate>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::time>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::time_zone>>
|
2025-03-03 14:47:26 +01:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::tracing_internal>>
|
2024-10-30 13:09:07 +01:00
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::utf8_for_code_point>>
|
|
|
|
|
$<${need_unix_absl_lib}:$<TARGET_SONAME_FILE:absl::vlog_config_internal>>
|
|
|
|
|
$<${need_windows_absl_lib}:$<TARGET_FILE:absl::abseil_dll>>
|
2024-10-15 14:32:33 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2024-10-11 13:08:26 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2025-02-04 19:42:22 +01:00
|
|
|
$<IF:$<BOOL:${BUILD_re2}>,copy,true>
|
2024-10-30 13:09:07 +01:00
|
|
|
$<${need_unix_re2_lib}:$<TARGET_SONAME_FILE:re2::re2>>
|
2025-02-04 19:42:22 +01:00
|
|
|
$<${need_windows_re2_lib}:$<TARGET_FILE:re2::re2>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-25 08:55:29 +02:00
|
|
|
|
2024-10-14 10:23:51 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:$<BOOL:${BUILD_Protobuf}>,copy,true>
|
|
|
|
|
$<${need_unix_protobuf_lib}:$<TARGET_SONAME_FILE:protobuf::libprotobuf>>
|
|
|
|
|
$<${need_unix_protobuf_lib}:$<TARGET_SONAME_FILE:utf8_validity>>
|
|
|
|
|
$<${need_windows_protobuf_lib}:$<TARGET_FILE:protobuf::libprotobuf>>
|
|
|
|
|
$<${need_windows_protobuf_lib}:$<TARGET_FILE:utf8_validity>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-11 13:08:26 +02:00
|
|
|
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:${need_unix_coinutils_lib},copy,true>
|
|
|
|
|
$<${need_unix_coinutils_lib}:$<TARGET_SONAME_FILE:Coin::CoinUtils>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-11 13:08:26 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:${need_unix_osi_lib},copy,true>
|
|
|
|
|
$<${need_unix_osi_lib}:$<TARGET_SONAME_FILE:Coin::Osi>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-11 13:08:26 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:${need_unix_clp_lib},copy,true>
|
|
|
|
|
$<${need_unix_clp_lib}:$<TARGET_SONAME_FILE:Coin::Clp>>
|
|
|
|
|
$<${need_unix_clp_lib}:$<TARGET_SONAME_FILE:Coin::OsiClp>>
|
|
|
|
|
$<${need_unix_clp_lib}:$<TARGET_SONAME_FILE:Coin::ClpSolver>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-11 13:08:26 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:${need_unix_cgl_lib},copy,true>
|
|
|
|
|
$<${need_unix_cgl_lib}:$<TARGET_SONAME_FILE:Coin::Cgl>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-11 13:08:26 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:${need_unix_cbc_lib},copy,true>
|
|
|
|
|
$<${need_unix_cbc_lib}:$<TARGET_SONAME_FILE:Coin::Cbc>>
|
|
|
|
|
$<${need_unix_cbc_lib}:$<TARGET_SONAME_FILE:Coin::OsiCbc>>
|
|
|
|
|
$<${need_unix_cbc_lib}:$<TARGET_SONAME_FILE:Coin::CbcSolver>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-11 13:08:26 +02:00
|
|
|
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-30 13:09:07 +01:00
|
|
|
$<IF:$<BOOL:${BUILD_HIGHS}>,copy,true>
|
2025-03-02 16:11:37 +01:00
|
|
|
$<${need_unix_highs_lib}:$<TARGET_SONAME_FILE:highs::highs>>
|
|
|
|
|
$<${need_windows_highs_lib}:$<TARGET_FILE:highs::highs>>
|
|
|
|
|
${PYTHON_PROJECT}/.libs
|
|
|
|
|
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2025-06-04 09:36:33 +02:00
|
|
|
$<IF:$<BOOL:${BUILD_SCIP}>,copy,true>
|
|
|
|
|
$<${need_unix_scip_lib}:$<TARGET_SONAME_FILE:SCIP::libscip>>
|
2025-03-02 16:11:37 +01:00
|
|
|
$<${need_windows_scip_lib}:$<TARGET_FILE:SCIP::libscip>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2024-10-11 13:08:26 +02:00
|
|
|
|
2023-11-22 20:21:39 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
2024-10-25 08:55:29 +02:00
|
|
|
$<IF:${is_ortools_shared},copy,true>
|
2025-02-04 19:42:22 +01:00
|
|
|
$<${need_unix_ortools_lib}:$<TARGET_SONAME_FILE:${PROJECT_NAMESPACE}::ortools>>
|
|
|
|
|
$<${need_windows_ortools_lib}:$<TARGET_FILE:${PROJECT_NAMESPACE}::ortools>>
|
2024-10-18 16:08:58 +02:00
|
|
|
${PYTHON_PROJECT}/.libs
|
2025-10-09 10:36:10 +02:00
|
|
|
|
2023-11-22 20:21:39 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${PROJECT_BINARY_DIR}/python/ortools_timestamp
|
|
|
|
|
MAIN_DEPENDENCY
|
|
|
|
|
ortools/python/setup.py.in
|
|
|
|
|
DEPENDS
|
|
|
|
|
Py${PROJECT_NAME}_proto
|
|
|
|
|
${PROJECT_NAMESPACE}::ortools
|
|
|
|
|
WORKING_DIRECTORY python
|
|
|
|
|
COMMAND_EXPAND_LISTS)
|
|
|
|
|
|
2023-11-22 15:35:50 +01:00
|
|
|
add_custom_command(
|
|
|
|
|
OUTPUT python/pybind11_timestamp
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove -f pybind11_timestamp
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:init_pybind11> ${PYTHON_PROJECT}/init/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:knapsack_solver_pybind11> ${PYTHON_PROJECT}/algorithms/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:linear_sum_assignment_pybind11> ${PYTHON_PROJECT}/graph/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:max_flow_pybind11> ${PYTHON_PROJECT}/graph/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:min_cost_flow_pybind11> ${PYTHON_PROJECT}/graph/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:pywrapcp> ${PYTHON_PROJECT}/constraint_solver
|
2024-04-19 10:40:57 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:constraint_solver_pybind11> ${PYTHON_PROJECT}/constraint_solver/python
|
2023-11-22 15:35:50 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:pywraplp> ${PYTHON_PROJECT}/linear_solver
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:model_builder_helper_pybind11> ${PYTHON_PROJECT}/linear_solver/python
|
2024-10-11 14:35:04 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
|
|
|
|
$<IF:$<BOOL:${BUILD_MATH_OPT}>,copy,true>
|
2022-12-16 17:06:11 +01:00
|
|
|
$<TARGET_FILE:math_opt_core_pybind11> ${PYTHON_PROJECT}/math_opt/core/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
|
|
|
|
$<IF:$<BOOL:${BUILD_MATH_OPT}>,copy,true>
|
|
|
|
|
$<TARGET_FILE:math_opt_elemental_pybind11> ${PYTHON_PROJECT}/math_opt/elemental/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
|
|
|
|
$<IF:$<BOOL:${BUILD_MATH_OPT}>,copy,true>
|
|
|
|
|
$<TARGET_FILE:math_opt_io_pybind11> ${PYTHON_PROJECT}/math_opt/io/python
|
2024-10-11 14:35:04 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
|
|
|
|
$<IF:$<BOOL:${BUILD_MATH_OPT}>,copy,true>
|
2024-01-15 17:54:52 +01:00
|
|
|
$<TARGET_FILE:status_py_extension_stub> ${PYTHON_PROJECT}/../pybind11_abseil
|
2024-02-09 01:01:13 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
|
|
|
|
$<IF:$<TARGET_EXISTS:pdlp_pybind11>,copy,true>
|
|
|
|
|
$<$<TARGET_EXISTS:pdlp_pybind11>:$<TARGET_FILE:pdlp_pybind11>> ${PYTHON_PROJECT}/pdlp/python
|
2024-06-21 10:29:12 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:pywraprouting> ${PYTHON_PROJECT}/routing
|
2024-04-10 13:47:07 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:routing_pybind11> ${PYTHON_PROJECT}/routing/python
|
2023-11-22 15:35:50 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
2025-01-09 16:33:47 +01:00
|
|
|
$<TARGET_FILE:cp_model_helper_pybind11> ${PYTHON_PROJECT}/sat/python
|
2023-11-22 15:35:50 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:rcpsp_pybind11> ${PYTHON_PROJECT}/scheduling/python
|
2025-02-17 12:52:36 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:set_cover_pybind11> ${PYTHON_PROJECT}/set_cover/python
|
2026-01-29 17:44:21 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:piecewise_linear_function_pybind11> ${PYTHON_PROJECT}/util/python
|
2023-11-22 15:35:50 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:sorted_interval_list_pybind11> ${PYTHON_PROJECT}/util/python
|
2025-08-19 19:41:20 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
|
|
$<TARGET_FILE:solve_interrupter_pybind11> ${PYTHON_PROJECT}/util/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E
|
|
|
|
|
$<IF:$<BOOL:${BUILD_TESTING}>,copy,true>
|
|
|
|
|
$<$<TARGET_EXISTS:solve_interrupter_testing_pybind11>:$<TARGET_FILE:solve_interrupter_testing_pybind11>> ${PYTHON_PROJECT}/util/python
|
2023-11-22 15:35:50 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${PROJECT_BINARY_DIR}/python/pybind11_timestamp
|
|
|
|
|
MAIN_DEPENDENCY
|
|
|
|
|
ortools/python/setup.py.in
|
|
|
|
|
DEPENDS
|
|
|
|
|
init_pybind11
|
|
|
|
|
knapsack_solver_pybind11
|
|
|
|
|
linear_sum_assignment_pybind11
|
|
|
|
|
max_flow_pybind11
|
|
|
|
|
min_cost_flow_pybind11
|
|
|
|
|
pywrapcp
|
2024-04-19 10:40:57 +02:00
|
|
|
constraint_solver_pybind11
|
2024-06-21 10:29:12 +02:00
|
|
|
pywraprouting
|
2024-04-19 10:40:27 +02:00
|
|
|
routing_pybind11
|
2023-11-22 15:35:50 +01:00
|
|
|
pywraplp
|
|
|
|
|
model_builder_helper_pybind11
|
2022-12-16 17:06:11 +01:00
|
|
|
$<$<BOOL:${BUILD_MATH_OPT}>:math_opt_core_pybind11>
|
|
|
|
|
$<$<BOOL:${BUILD_MATH_OPT}>:math_opt_elemental_pybind11>
|
|
|
|
|
$<$<BOOL:${BUILD_MATH_OPT}>:math_opt_io_pybind11>
|
2024-02-09 01:01:13 +01:00
|
|
|
$<TARGET_NAME_IF_EXISTS:pdlp_pybind11>
|
2025-01-09 16:33:47 +01:00
|
|
|
cp_model_helper_pybind11
|
2023-11-22 15:35:50 +01:00
|
|
|
rcpsp_pybind11
|
2025-02-17 12:52:36 +01:00
|
|
|
set_cover_pybind11
|
2026-01-29 17:44:21 +01:00
|
|
|
piecewise_linear_function_pybind11
|
2023-11-22 15:35:50 +01:00
|
|
|
sorted_interval_list_pybind11
|
2025-08-19 19:41:20 +02:00
|
|
|
solve_interrupter_pybind11
|
|
|
|
|
$<TARGET_NAME_IF_EXISTS:solve_interrupter_testing_pybind11>
|
2023-11-22 15:35:50 +01:00
|
|
|
WORKING_DIRECTORY python
|
|
|
|
|
COMMAND_EXPAND_LISTS)
|
|
|
|
|
|
|
|
|
|
|
2023-10-16 15:06:26 +02:00
|
|
|
# Generate Stub
|
|
|
|
|
if(GENERATE_PYTHON_STUB)
|
|
|
|
|
# Look for required python modules
|
|
|
|
|
search_python_module(
|
|
|
|
|
NAME mypy
|
|
|
|
|
PACKAGE mypy
|
|
|
|
|
NO_VERSION)
|
|
|
|
|
|
|
|
|
|
find_program(
|
|
|
|
|
stubgen_EXECUTABLE
|
|
|
|
|
NAMES stubgen stubgen.exe
|
|
|
|
|
REQUIRED
|
|
|
|
|
)
|
2023-11-27 00:34:07 -08:00
|
|
|
message(STATUS "Python: stubgen: ${stubgen_EXECUTABLE}")
|
2023-10-16 15:06:26 +02:00
|
|
|
|
|
|
|
|
add_custom_command(
|
2023-11-22 15:35:50 +01:00
|
|
|
OUTPUT python/stub_timestamp
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove -f stub_timestamp
|
2023-10-16 15:06:26 +02:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.init.python.init --output .
|
|
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.algorithms.python.knapsack_solver --output .
|
|
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.graph.python.linear_sum_assignment --output .
|
|
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.graph.python.max_flow --output .
|
|
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.graph.python.min_cost_flow --output .
|
|
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.constraint_solver.pywrapcp --output .
|
2024-04-19 10:40:57 +02:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.constraint_solver.python.constraint_solver --output .
|
2023-10-16 15:06:26 +02:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.linear_solver.pywraplp --output .
|
|
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.linear_solver.python.model_builder_helper --output .
|
2024-01-16 08:13:23 +01:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p pybind11_abseil.status --output .
|
2026-02-01 12:15:15 +01:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p pybind11_abseil.absl_casters --output .
|
2024-01-12 05:18:31 +01:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.math_opt.core.python.solver --output .
|
2023-10-16 15:06:26 +02:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.pdlp.python.pdlp --output .
|
2024-06-21 10:29:12 +02:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.routing.pywraprouting --output .
|
2026-03-19 10:22:06 +01:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.routing.python.routing --output .
|
2025-01-09 16:33:47 +01:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.sat.python.cp_model_helper --output .
|
2023-10-16 15:06:26 +02:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.scheduling.python.rcpsp --output .
|
2025-02-17 12:52:36 +01:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.set_cover.python.set_cover --output .
|
2026-01-29 17:44:21 +01:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.util.python.piecewise_linear_function --output .
|
2023-10-16 15:06:26 +02:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.util.python.sorted_interval_list --output .
|
2025-08-19 19:41:20 +02:00
|
|
|
COMMAND ${stubgen_EXECUTABLE} -p ortools.util.python.pybind_solve_interrupter --output .
|
2023-11-22 15:35:50 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${PROJECT_BINARY_DIR}/python/stub_timestamp
|
2023-10-16 15:06:26 +02:00
|
|
|
MAIN_DEPENDENCY
|
|
|
|
|
ortools/python/setup.py.in
|
|
|
|
|
DEPENDS
|
2023-11-22 20:21:39 +01:00
|
|
|
python/ortools_timestamp
|
2023-11-22 15:35:50 +01:00
|
|
|
python/pybind11_timestamp
|
2023-10-16 15:06:26 +02:00
|
|
|
WORKING_DIRECTORY python
|
|
|
|
|
COMMAND_EXPAND_LISTS)
|
|
|
|
|
endif()
|
|
|
|
|
|
2021-11-17 15:45:49 +01:00
|
|
|
# Look for required python modules
|
2021-11-04 14:10:28 +01:00
|
|
|
search_python_module(
|
2021-11-05 14:10:37 +01:00
|
|
|
NAME setuptools
|
|
|
|
|
PACKAGE setuptools)
|
2021-11-04 14:10:28 +01:00
|
|
|
search_python_module(
|
2021-11-05 14:10:37 +01:00
|
|
|
NAME wheel
|
|
|
|
|
PACKAGE wheel)
|
2022-12-16 17:06:11 +01:00
|
|
|
search_python_module(
|
|
|
|
|
NAME typing_extensions
|
|
|
|
|
PACKAGE typing-extensions
|
|
|
|
|
NO_VERSION)
|
2021-11-05 14:10:37 +01:00
|
|
|
|
2021-10-29 17:39:19 +02:00
|
|
|
add_custom_command(
|
2023-11-22 15:35:50 +01:00
|
|
|
OUTPUT python/dist_timestamp
|
2018-11-13 09:21:15 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory dist
|
2021-09-08 00:02:29 +02:00
|
|
|
#COMMAND ${Python3_EXECUTABLE} setup.py bdist_egg bdist_wheel
|
|
|
|
|
COMMAND ${Python3_EXECUTABLE} setup.py bdist_wheel
|
2023-11-22 15:35:50 +01:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${PROJECT_BINARY_DIR}/python/dist_timestamp
|
2021-10-29 17:39:19 +02:00
|
|
|
MAIN_DEPENDENCY
|
2021-11-12 01:30:58 +01:00
|
|
|
ortools/python/setup.py.in
|
2021-10-29 17:39:19 +02:00
|
|
|
DEPENDS
|
|
|
|
|
python/setup.py
|
2023-11-22 20:21:39 +01:00
|
|
|
python/ortools_timestamp
|
2023-11-22 15:35:50 +01:00
|
|
|
python/pybind11_timestamp
|
|
|
|
|
$<$<BOOL:${GENERATE_PYTHON_STUB}>:python/stub_timestamp>
|
2020-02-24 17:26:17 +01:00
|
|
|
BYPRODUCTS
|
2021-11-05 14:10:37 +01:00
|
|
|
python/${PYTHON_PROJECT}
|
2021-11-12 01:30:58 +01:00
|
|
|
python/${PYTHON_PROJECT}.egg-info
|
2021-11-05 14:10:37 +01:00
|
|
|
python/build
|
|
|
|
|
python/dist
|
2021-10-29 17:39:19 +02:00
|
|
|
WORKING_DIRECTORY python
|
2021-11-05 14:10:37 +01:00
|
|
|
COMMAND_EXPAND_LISTS)
|
2021-10-29 17:39:19 +02:00
|
|
|
|
|
|
|
|
# Main Target
|
|
|
|
|
add_custom_target(python_package ALL
|
|
|
|
|
DEPENDS
|
2023-11-22 15:35:50 +01:00
|
|
|
python/dist_timestamp
|
2021-11-05 14:10:37 +01:00
|
|
|
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)
|
|
|
|
|
|
2022-10-27 10:56:20 +02:00
|
|
|
if(BUILD_VENV)
|
2018-11-13 09:21:15 +01:00
|
|
|
# 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-11-05 14:10:37 +01:00
|
|
|
# Clean previous install otherwise pip install may do nothing
|
2021-10-29 17:22:37 +02:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${VENV_DIR}
|
2022-02-21 15:29:54 +01:00
|
|
|
COMMAND ${VENV_EXECUTABLE} -p ${Python3_EXECUTABLE}
|
|
|
|
|
$<IF:$<BOOL:${VENV_USE_SYSTEM_SITE_PACKAGES}>,--system-site-packages,-q>
|
|
|
|
|
${VENV_DIR}
|
2021-11-12 01:32:32 +01:00
|
|
|
#COMMAND ${VENV_EXECUTABLE} ${VENV_DIR}
|
2021-11-05 14:10:37 +01:00
|
|
|
# Must NOT call it in a folder containing the setup.py otherwise pip call it
|
2020-02-24 17:26:17 +01:00
|
|
|
# (i.e. "python setup.py bdist") while we want to consume the wheel package
|
2022-09-30 14:39:16 +02:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} -m pip install
|
2025-12-03 10:11:52 +01:00
|
|
|
--find-links=${CMAKE_CURRENT_BINARY_DIR}/python/dist ${PYTHON_PROJECT}==${PROJECT_VERSION}${PYTHON_RELEASE}
|
2021-11-17 20:57:19 +01:00
|
|
|
# install modules only required to run examples
|
2024-01-15 16:22:30 +01:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} -m pip install
|
|
|
|
|
pandas matplotlib pytest scipy svgwrite
|
2020-02-24 17:26:17 +01:00
|
|
|
BYPRODUCTS ${VENV_DIR}
|
2021-11-05 14:10:37 +01:00
|
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
|
|
|
COMMENT "Create venv and install ${PYTHON_PROJECT}"
|
|
|
|
|
VERBATIM)
|
2022-10-27 10:56:20 +02:00
|
|
|
endif()
|
2021-11-05 14:10:37 +01:00
|
|
|
|
2022-10-27 10:56:20 +02:00
|
|
|
if(BUILD_TESTING)
|
2022-09-30 00:19:11 +02:00
|
|
|
configure_file(
|
|
|
|
|
${PROJECT_SOURCE_DIR}/ortools/init/python/version_test.py.in
|
|
|
|
|
${PROJECT_BINARY_DIR}/python/version_test.py
|
|
|
|
|
@ONLY)
|
2022-10-05 15:56:33 +02:00
|
|
|
|
2018-11-13 09:21:15 +01:00
|
|
|
# run the tests within the virtualenv
|
2022-09-30 00:19:11 +02:00
|
|
|
add_test(NAME python_init_version_test
|
|
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} ${PROJECT_BINARY_DIR}/python/version_test.py)
|
2020-07-26 00:06:59 +02:00
|
|
|
endif()
|
2020-09-17 18:45:56 +02:00
|
|
|
|
2023-02-02 11:39:36 +01:00
|
|
|
###############
|
|
|
|
|
## Doc rules ##
|
|
|
|
|
###############
|
|
|
|
|
if(BUILD_PYTHON_DOC)
|
2023-07-03 16:37:01 +02:00
|
|
|
# add a target to generate API documentation with Doxygen
|
|
|
|
|
find_package(Doxygen)
|
|
|
|
|
if(DOXYGEN_FOUND)
|
|
|
|
|
configure_file(${PROJECT_SOURCE_DIR}/ortools/python/Doxyfile.in ${PROJECT_BINARY_DIR}/python/Doxyfile @ONLY)
|
|
|
|
|
file(DOWNLOAD
|
2025-06-26 13:24:10 +02:00
|
|
|
https://raw.githubusercontent.com/jothepro/doxygen-awesome-css/v2.3.4/doxygen-awesome.css
|
2023-07-03 16:37:01 +02:00
|
|
|
${PROJECT_BINARY_DIR}/python/doxygen-awesome.css
|
|
|
|
|
SHOW_PROGRESS
|
|
|
|
|
)
|
2023-02-03 18:05:10 +01:00
|
|
|
add_custom_target(${PROJECT_NAME}_python_doc ALL
|
2023-02-02 11:39:36 +01:00
|
|
|
#COMMAND ${CMAKE_COMMAND} -E rm -rf ${PROJECT_BINARY_DIR}/docs/python
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/docs/python
|
2023-07-03 16:37:01 +02:00
|
|
|
COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/python/Doxyfile
|
|
|
|
|
DEPENDS
|
|
|
|
|
python_package
|
|
|
|
|
${PROJECT_BINARY_DIR}/python/Doxyfile
|
|
|
|
|
${PROJECT_BINARY_DIR}/python/doxygen-awesome.css
|
2025-06-26 13:32:30 +02:00
|
|
|
${PROJECT_SOURCE_DIR}/ortools/doxygen/header.html
|
2025-07-08 13:45:24 +02:00
|
|
|
${PROJECT_SOURCE_DIR}/ortools/doxygen/DoxygenLayout.xml
|
2023-07-03 16:37:01 +02:00
|
|
|
${PROJECT_SOURCE_DIR}/ortools/python/stylesheet.css
|
|
|
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
|
|
|
COMMENT "Generating Python API documentation with Doxygen"
|
|
|
|
|
VERBATIM)
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "cmd `doxygen` not found, Python doc generation is disable!")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# pdoc doc
|
|
|
|
|
find_program(PDOC_PRG NAMES pdoc)
|
|
|
|
|
if (PDOC_PRG)
|
|
|
|
|
# add a target to generate API documentation with pdoc
|
|
|
|
|
add_custom_target(${PROJECT_NAME}_pdoc_doc ALL
|
|
|
|
|
#COMMAND ${CMAKE_COMMAND} -E rm -rf ${PROJECT_BINARY_DIR}/docs/pdoc
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/docs/pdoc
|
2023-02-02 11:39:36 +01:00
|
|
|
COMMAND ${PDOC_PRG}
|
2023-02-06 11:33:46 +01:00
|
|
|
--logo https://developers.google.com/optimization/images/orLogo.png
|
2023-02-02 11:39:36 +01:00
|
|
|
--no-search -d google
|
2023-02-06 11:33:46 +01:00
|
|
|
--footer-text "OR-Tools v${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
|
2023-07-03 16:37:01 +02:00
|
|
|
-o ${PROJECT_BINARY_DIR}/docs/pdoc
|
2023-02-02 11:39:36 +01:00
|
|
|
${PROJECT_BINARY_DIR}/python/ortools
|
|
|
|
|
DEPENDS python_package
|
|
|
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
|
|
|
COMMENT "Generating Python API documentation with pdoc"
|
|
|
|
|
VERBATIM)
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "cmd `pdoc` not found, Python doc generation is disable!")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2021-11-26 10:28:50 +01:00
|
|
|
#####################
|
|
|
|
|
## Python Sample ##
|
|
|
|
|
#####################
|
2020-09-17 18:45:56 +02:00
|
|
|
# add_python_sample()
|
|
|
|
|
# CMake function to generate and build python sample.
|
|
|
|
|
# Parameters:
|
2024-01-16 15:14:34 +01:00
|
|
|
# FILE_NAME: the Python filename
|
|
|
|
|
# COMPONENT_NAME: name of the ortools/ subdir where the test is located
|
|
|
|
|
# note: automatically determined if located in ortools/<component>/samples/
|
2020-09-17 18:45:56 +02:00
|
|
|
# e.g.:
|
2024-01-16 15:14:34 +01:00
|
|
|
# add_python_sample(
|
|
|
|
|
# FILE_NAME
|
|
|
|
|
# ${PROJECT_SOURCE_DIR}/ortools/foo/sample/bar.py
|
|
|
|
|
# COMPONENT_NAME
|
|
|
|
|
# foo
|
|
|
|
|
# )
|
|
|
|
|
function(add_python_sample)
|
|
|
|
|
set(options "")
|
|
|
|
|
set(oneValueArgs FILE_NAME COMPONENT_NAME)
|
|
|
|
|
set(multiValueArgs "")
|
|
|
|
|
cmake_parse_arguments(SAMPLE
|
|
|
|
|
"${options}"
|
|
|
|
|
"${oneValueArgs}"
|
|
|
|
|
"${multiValueArgs}"
|
|
|
|
|
${ARGN}
|
|
|
|
|
)
|
|
|
|
|
if(NOT SAMPLE_FILE_NAME)
|
|
|
|
|
message(FATAL_ERROR "no FILE_NAME provided")
|
|
|
|
|
endif()
|
|
|
|
|
get_filename_component(SAMPLE_NAME ${SAMPLE_FILE_NAME} NAME_WE)
|
|
|
|
|
|
|
|
|
|
message(STATUS "Configuring sample ${SAMPLE_FILE_NAME} ...")
|
|
|
|
|
|
|
|
|
|
if(NOT SAMPLE_COMPONENT_NAME)
|
|
|
|
|
# sample is located in ortools/<component_name>/sample/
|
|
|
|
|
get_filename_component(SAMPLE_DIR ${SAMPLE_FILE_NAME} DIRECTORY)
|
|
|
|
|
get_filename_component(COMPONENT_DIR ${SAMPLE_DIR} DIRECTORY)
|
2024-01-18 10:19:14 +01:00
|
|
|
get_filename_component(COMPONENT_NAME ${COMPONENT_DIR} NAME)
|
|
|
|
|
else()
|
|
|
|
|
set(COMPONENT_NAME ${SAMPLE_COMPONENT_NAME})
|
2024-01-16 15:14:34 +01:00
|
|
|
endif()
|
2020-09-17 18:45:56 +02:00
|
|
|
|
|
|
|
|
if(BUILD_TESTING)
|
|
|
|
|
add_test(
|
2024-01-18 10:19:14 +01:00
|
|
|
NAME python_${COMPONENT_NAME}_${SAMPLE_NAME}
|
2024-01-16 15:14:34 +01:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} ${SAMPLE_FILE_NAME}
|
2020-09-17 18:45:56 +02:00
|
|
|
WORKING_DIRECTORY ${VENV_DIR})
|
|
|
|
|
endif()
|
2024-01-16 15:14:34 +01:00
|
|
|
message(STATUS "Configuring sample ${SAMPLE_FILE_NAME} ...DONE")
|
2020-09-17 18:45:56 +02:00
|
|
|
endfunction()
|
|
|
|
|
|
2021-11-26 10:28:50 +01:00
|
|
|
######################
|
|
|
|
|
## Python Example ##
|
|
|
|
|
######################
|
2020-09-17 18:45:56 +02:00
|
|
|
# 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:
|
2024-01-17 16:56:26 +01:00
|
|
|
# FILE_NAME: the Python filename
|
|
|
|
|
# COMPONENT_NAME: name of the ortools/ subdir where the test is located
|
|
|
|
|
# note: automatically determined if located in ortools/<component>/samples/
|
2020-09-17 18:45:56 +02:00
|
|
|
# e.g.:
|
2024-01-17 16:56:26 +01:00
|
|
|
# add_python_example(
|
|
|
|
|
# FILE_NAME
|
|
|
|
|
# ${PROJECT_SOURCE_DIR}/examples/foo/bar.py
|
|
|
|
|
# COMPONENT_NAME
|
|
|
|
|
# foo
|
|
|
|
|
# )
|
|
|
|
|
function(add_python_example)
|
|
|
|
|
set(options "")
|
|
|
|
|
set(oneValueArgs FILE_NAME COMPONENT_NAME)
|
|
|
|
|
set(multiValueArgs "")
|
|
|
|
|
cmake_parse_arguments(EXAMPLE
|
|
|
|
|
"${options}"
|
|
|
|
|
"${oneValueArgs}"
|
|
|
|
|
"${multiValueArgs}"
|
|
|
|
|
${ARGN}
|
|
|
|
|
)
|
|
|
|
|
if(NOT EXAMPLE_FILE_NAME)
|
|
|
|
|
message(FATAL_ERROR "no FILE_NAME provided")
|
|
|
|
|
endif()
|
|
|
|
|
get_filename_component(EXAMPLE_NAME ${EXAMPLE_FILE_NAME} NAME_WE)
|
|
|
|
|
|
|
|
|
|
message(STATUS "Configuring example ${EXAMPLE_FILE_NAME} ...")
|
|
|
|
|
|
|
|
|
|
if(NOT EXAMPLE_COMPONENT_NAME)
|
|
|
|
|
# example is located in example/<component_name>/
|
|
|
|
|
get_filename_component(EXAMPLE_DIR ${EXAMPLE_FILE_NAME} DIRECTORY)
|
2024-01-18 10:19:14 +01:00
|
|
|
get_filename_component(COMPONENT_NAME ${EXAMPLE_DIR} NAME)
|
|
|
|
|
else()
|
|
|
|
|
set(COMPONENT_NAME ${EXAMPLE_COMPONENT_NAME})
|
2024-01-17 16:56:26 +01:00
|
|
|
endif()
|
2020-09-17 18:45:56 +02:00
|
|
|
|
|
|
|
|
if(BUILD_TESTING)
|
|
|
|
|
add_test(
|
2024-01-18 10:19:14 +01:00
|
|
|
NAME python_${COMPONENT_NAME}_${EXAMPLE_NAME}
|
2024-01-17 16:56:26 +01:00
|
|
|
COMMAND ${VENV_Python3_EXECUTABLE} ${EXAMPLE_FILE_NAME}
|
2020-09-17 18:45:56 +02:00
|
|
|
WORKING_DIRECTORY ${VENV_DIR})
|
|
|
|
|
endif()
|
2024-01-17 16:56:26 +01:00
|
|
|
message(STATUS "Configuring example ${EXAMPLE_FILE_NAME} ...DONE")
|
2020-09-17 18:45:56 +02:00
|
|
|
endfunction()
|
2025-12-01 10:22:54 +01:00
|
|
|
|
|
|
|
|
# add_python_binary()
|
|
|
|
|
# CMake function to generate a shell wrapper to execute a Python program.
|
|
|
|
|
# Parameters:
|
|
|
|
|
# NAME: the target name
|
|
|
|
|
# FILE: the Python filename
|
|
|
|
|
# e.g.:
|
|
|
|
|
# add_python_binary(
|
|
|
|
|
# NAME
|
|
|
|
|
# foo_bin
|
|
|
|
|
# FILE
|
|
|
|
|
# ${PROJECT_SOURCE_DIR}/examples/foo/bar.py
|
|
|
|
|
# )
|
|
|
|
|
function(add_python_binary)
|
|
|
|
|
set(options "")
|
|
|
|
|
set(oneValueArgs NAME;FILE)
|
|
|
|
|
set(multiValueArgs "")
|
|
|
|
|
cmake_parse_arguments(PY_BINARY
|
|
|
|
|
"${options}"
|
|
|
|
|
"${oneValueArgs}"
|
|
|
|
|
"${multiValueArgs}"
|
|
|
|
|
${ARGN}
|
|
|
|
|
)
|
|
|
|
|
message(STATUS "Configuring python binary ${PY_BINARY_NAME} ...")
|
|
|
|
|
if(NOT PY_BINARY_NAME)
|
|
|
|
|
message(FATAL_ERROR "no NAME provided for python binary")
|
|
|
|
|
endif()
|
|
|
|
|
if(NOT PY_BINARY_FILE)
|
|
|
|
|
message(FATAL_ERROR "no FILE provided for python binary")
|
|
|
|
|
endif()
|
|
|
|
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PY_BINARY_NAME}" "#!/usr/bin/env sh\n${VENV_Python3_EXECUTABLE} ${PY_BINARY_FILE} \"$@\"\n")
|
|
|
|
|
file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/${PY_BINARY_NAME}"
|
|
|
|
|
FILE_PERMISSIONS
|
|
|
|
|
OWNER_READ OWNER_EXECUTE
|
|
|
|
|
GROUP_READ GROUP_EXECUTE
|
|
|
|
|
WORLD_READ WORLD_EXECUTE
|
|
|
|
|
)
|
|
|
|
|
add_executable("${PY_BINARY_NAME}" IMPORTED)
|
|
|
|
|
set_target_properties("${PY_BINARY_NAME}" PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/${PY_BINARY_NAME}")
|
|
|
|
|
message(STATUS "Configuring python binary ${PY_BINARY_NAME} ...DONE")
|
|
|
|
|
endfunction()
|