foundationdb/bindings/python/CMakeLists.txt

133 lines
4.9 KiB
CMake

set(SRCS
fdb/__init__.py
fdb/directory_impl.py
fdb/impl.py
fdb/locality.py
fdb/subspace_impl.py
fdb/tuple.py
fdb/apiversion.py.cmake
README.rst
MANIFEST.in
pyproject.toml
)
# FIXME Windows Python support at fdb/fdb_c.dll.pth
if(APPLE)
list(APPEND SRCS fdb/libfdb_c.dylib.pth)
else()
list(APPEND SRCS fdb/libfdb_c.so.pth)
endif()
set(out_files "")
foreach(src ${SRCS})
get_filename_component(dirname ${src} DIRECTORY)
get_filename_component(extname ${src} EXT)
if(NOT EXISTS ${dirname})
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/bindings/python/${dirname})
endif()
set(from_path ${CMAKE_CURRENT_SOURCE_DIR}/${src})
set(to_path ${CMAKE_CURRENT_BINARY_DIR}/${src})
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/bindings/python/${src}
COMMAND ${CMAKE_COMMAND} -E copy ${from_path} ${to_path}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${src}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "copy ${src}")
set(out_files "${out_files};${PROJECT_BINARY_DIR}/bindings/python/${src}")
endforeach()
add_custom_target(python_binding ALL DEPENDS ${out_files})
if(FDB_RELEASE)
set(FDB_PY_VERSION ${PROJECT_VERSION})
elseif(FDB_RELEASE_CANDIDATE)
set(FDB_PY_VERSION "${PROJECT_VERSION}rc${FDB_RELEASE_CANDIDATE_VERSION}")
else()
set(FDB_PY_VERSION "${PROJECT_VERSION}a1")
endif()
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/bindings/python/fdb)
set(options_file ${PROJECT_BINARY_DIR}/bindings/python/fdb/fdboptions.py)
vexillographer_compile(TARGET fdb_python_options LANG python OUT ${options_file}
OUTPUT ${options_file})
if(NOT DEFINED FDB_API_VERSION_FILE)
message(FATAL_ERROR "Missing definitions of API versions")
endif()
include(${FDB_API_VERSION_FILE})
set(apiversion_file ${CMAKE_CURRENT_BINARY_DIR}/fdb/apiversion.py)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fdb/apiversion.py.cmake ${apiversion_file})
add_dependencies(python_binding fdb_python_options)
set(out_files "${out_files};${options_file};${apiversion_file}")
# Create Python package in tar.gz format
configure_file(${CMAKE_SOURCE_DIR}/LICENSE ${CMAKE_CURRENT_BINARY_DIR}/LICENSE COPYONLY)
find_program(pycodestyle pycodestyle)
if (pycodestyle)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/check_py_code_style
COMMAND ${pycodestyle} bindings/python --config=${CMAKE_CURRENT_SOURCE_DIR}/pycodestyle.cfg &&
${CMAKE_COMMAND} -E ${CMAKE_CURRENT_BINARY_DIR}/check_py_code_style
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS ${out_files}
COMMENT "Check python code style")
add_custom_target(fdb_python_check DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/check_py_code_style)
else()
add_custom_target(fdb_python_check COMMAND ${CMAKE_COMMAND} -E echo "Skipped Python style check! Missing: pycodestyle")
endif()
set(setup_file_name foundationdb-${FDB_PY_VERSION}.tar.gz)
set(wheel_file_name foundationdb-${FDB_PY_VERSION}-py3-none-any.whl)
set(package_file ${CMAKE_BINARY_DIR}/packages/${setup_file_name})
set(wheel_package_file ${CMAKE_BINARY_DIR}/packages/${wheel_file_name})
# Build both source distribution and wheel
# Note: foundationdb is a pure Python package (uses ctypes), so wheel is py3-none-any
set(PYPKG_VENV_DIR "${CMAKE_BINARY_DIR}/pypkg-venv")
set(PYPKG_PY3 "${PYPKG_VENV_DIR}/bin/python3")
add_custom_command(OUTPUT ${package_file} ${wheel_package_file}
COMMAND $<TARGET_FILE:Python3::Interpreter> -m venv "${PYPKG_VENV_DIR}"
COMMAND ${PYPKG_PY3} -m ensurepip
COMMAND ${PYPKG_PY3} -m pip install --upgrade build
COMMAND ${PYPKG_PY3} -m build --sdist --wheel
COMMAND ${CMAKE_COMMAND} -E copy dist/${setup_file_name} ${package_file}
COMMAND ${CMAKE_COMMAND} -E copy dist/${wheel_file_name} ${wheel_package_file}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Create Python source distribution and wheel")
add_custom_target(python_package DEPENDS ${package_file} ${wheel_package_file})
add_dependencies(python_package python_binding)
add_dependencies(packages python_package)
if(NOT OPEN_FOR_IDE AND NOT USE_SANITIZER)
add_fdbclient_test(
NAME python_unit_tests
COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/tests/unit_tests.py
--cluster-file @CLUSTER_FILE@ --verbose
DISABLE_LOG_DUMP
)
# FIXME Windows support
set(PYPKG_TEST_DIR "${CMAKE_BINARY_DIR}/pypkg-test-venv")
set(PYPKG_TEST_PY3 "${PYPKG_TEST_DIR}/bin/python3")
add_test(
NAME python_package_test
COMMAND sh -c "
set -e
if ! [ -f '${package_file}' ]; then
exit 66
fi
$<TARGET_FILE:Python3::Interpreter> -m venv ${PYPKG_TEST_DIR}
${PYPKG_TEST_PY3} -m ensurepip # probably not needed, but for consistency
${PYPKG_TEST_PY3} -m pip install '${package_file}'
${PYPKG_TEST_PY3} -c 'import fdb'
${PYPKG_TEST_PY3} -m pip install '${wheel_package_file}'
${PYPKG_TEST_PY3} -c 'import fdb'
"
)
set_tests_properties(python_package_test PROPERTIES SKIP_RETURN_CODE 66)
endif() # NOT OPEN_FOR_IDE AND NOT USE_SANITIZER