Skip to content

Commit

Permalink
cmake(python): Fix search module functions
Browse files Browse the repository at this point in the history
* Don't look for __version__ when unavailable
  • Loading branch information
Mizux committed Nov 4, 2021
1 parent 77c7124 commit 89dc88b
Showing 1 changed file with 90 additions and 23 deletions.
113 changes: 90 additions & 23 deletions cmake/python.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -26,49 +26,98 @@ endif()
find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module)
list(APPEND CMAKE_SWIG_FLAGS "-py3" "-DPY3")

# Find if python module MODULE_NAME is available,
# if not install it (PACKAGE_NAME) to the Python3 user install directory.
function(search_python_module MODULE_NAME PACKAGE_NAME)
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
# 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
)
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
)
endif()
if(${_RESULT} STREQUAL "0")
message(STATUS "Found python module: ${MODULE_NAME} (found version \"${MODULE_VERSION}\")")
message(STATUS "Found python module: \"${MODULE_NAME}\" (found version \"${MODULE_VERSION}\")")
else()
if(FETCH_PYTHON_DEPS)
message(WARNING "Can't find python module \"${MODULE_NAME}\", install it using pip...")
message(WARNING "Can't find python module: \"${MODULE_NAME}\", install it using pip...")
execute_process(
COMMAND ${Python3_EXECUTABLE} -m pip install --user ${PACKAGE_NAME}
COMMAND ${Python3_EXECUTABLE} -m pip install --user ${MODULE_PACKAGE}
OUTPUT_STRIP_TRAILING_WHITESPACE
)
else()
message(FATAL_ERROR "Can't find python module \"${MODULE_NAME}\", please install it using your system package manager.")
message(FATAL_ERROR "Can't find python module: \"${MODULE_NAME}\", please install it using your system package manager.")
endif()
endif()
endfunction()

# Find if python builtin module MODULE_NAME is available.
function(search_python_internal_module MODULE_NAME)
# 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}\"")
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "import ${MODULE_NAME}"
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}")
message(STATUS "Found python internal module: \"${MODULE_NAME}\"")
else()
message(FATAL_ERROR "Can't find python internal module \"${MODULE_NAME}\", please install it using your system package manager.")
endif()
endfunction()

# Generate Protobuf py sources with mypy support
search_python_module(mypy_protobuf mypy-protobuf)
search_python_module(
NAME
mypy_protobuf
PACKAGE
mypy-protobuf
NO_VERSION
)
set(PROTO_PYS)
file(GLOB_RECURSE proto_py_files RELATIVE ${PROJECT_SOURCE_DIR}
"ortools/constraint_solver/*.proto"
Expand Down Expand Up @@ -168,9 +217,18 @@ configure_file(
COPYONLY)

# Look for python module wheel
search_python_module(setuptools setuptools)
search_python_module(wheel wheel)

search_python_module(
NAME
setuptools
PACKAGE
setuptools
)
search_python_module(
NAME
wheel
PACKAGE
wheel
)
add_custom_command(
OUTPUT python/dist
COMMAND ${CMAKE_COMMAND} -E remove_directory dist
Expand Down Expand Up @@ -220,8 +278,17 @@ install(SCRIPT ${PROJECT_BINARY_DIR}/python/python-install.cmake)
# Test
if(BUILD_TESTING)
# Look for python module venv
search_python_module(absl absl-py)
search_python_internal_module(venv)
search_python_module(
NAME
absl
PACKAGE
absl-py
NO_VERSION
)
search_python_internal_module(
NAME
venv
)
# Testing using a vitual environment
set(VENV_EXECUTABLE ${Python3_EXECUTABLE} -m venv)
set(VENV_DIR ${PROJECT_BINARY_DIR}/python/venv)
Expand Down

1 comment on commit 89dc88b

@Mizux
Copy link
Collaborator Author

@Mizux Mizux commented on 89dc88b Nov 4, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

related to #2858

Please sign in to comment.