Files
revng-revng/python/CMakeLists.txt
Giacomo Vercesi e634861c1a Implement SyncingManager
Implement the SyncingManager class which wraps the Manager and implements
save syncing features, which comprise autosave and saving via
synchronizers.
2025-04-03 15:59:18 +02:00

285 lines
10 KiB
CMake

#
# This file is distributed under the MIT License. See LICENSE.md for details.
#
# ~~~
# Declares a python module as a target
# Named arguments:
# - TARGET_NAME: the name of the CMake target to be created
# - WHEEL: the name of the wheel where the files will be included into
# - MODULE_FILES: list of relative paths of the python module sources
# - MODULE_GENERATED_FILES: list of relative paths of the python module
# generated sources
# The module sources will be copied to the build directory
# ~~~
function(python_module)
set(options)
set(oneValueArgs TARGET_NAME WHEEL)
set(multiValueArgs MODULE_FILES MODULE_GENERATED_FILES)
cmake_parse_arguments(PYTHON_MODULE "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
foreach(MODULE_FILE ${PYTHON_MODULE_MODULE_FILES})
configure_file(
"${MODULE_FILE}"
"${CMAKE_BINARY_DIR}/${PYTHON_INSTALL_PATH}/${MODULE_FILE}" COPYONLY)
configure_file(
"${MODULE_FILE}"
"${CMAKE_BINARY_DIR}/build-wheel/${PYTHON_MODULE_WHEEL}/${MODULE_FILE}"
COPYONLY)
list(
APPEND "WHEEL_FILES_${PYTHON_MODULE_WHEEL}"
"${CMAKE_BINARY_DIR}/build-wheel/${PYTHON_MODULE_WHEEL}/${MODULE_FILE}")
endforeach()
foreach(MODULE_FILE ${PYTHON_MODULE_MODULE_GENERATED_FILES})
add_custom_command(
OUTPUT
"${CMAKE_BINARY_DIR}/build-wheel/${PYTHON_MODULE_WHEEL}/${MODULE_FILE}"
DEPENDS "${CMAKE_BINARY_DIR}/${PYTHON_INSTALL_PATH}/${MODULE_FILE}"
COMMAND
cp -a "${CMAKE_BINARY_DIR}/${PYTHON_INSTALL_PATH}/${MODULE_FILE}"
"${CMAKE_BINARY_DIR}/build-wheel/${PYTHON_MODULE_WHEEL}/${MODULE_FILE}")
list(
APPEND "WHEEL_FILES_${PYTHON_MODULE_WHEEL}"
"${CMAKE_BINARY_DIR}/build-wheel/${PYTHON_MODULE_WHEEL}/${MODULE_FILE}")
endforeach()
set("WHEEL_FILES_${PYTHON_MODULE_WHEEL}"
"${WHEEL_FILES_${PYTHON_MODULE_WHEEL}}"
PARENT_SCOPE)
add_custom_target(
"${PYTHON_MODULE_TARGET_NAME}"
DEPENDS ${PYTHON_MODULE_MODULE_FILES}
${PYTHON_MODULE_MODULE_GENERATED_FILES})
endfunction()
#
# Wheel generation
#
function(python_wheel)
set(options)
set(oneValueArgs NAME)
set(multiValueArgs)
cmake_parse_arguments(PYTHON_WHEEL "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
set(WHEEL_OUTPUT_NAME "${PYTHON_WHEEL_NAME}-1.0.0-py3-none-any.whl")
configure_file(
"pyproject_${PYTHON_WHEEL_NAME}.toml"
"${CMAKE_BINARY_DIR}/build-wheel/${PYTHON_WHEEL_NAME}/pyproject.toml"
COPYONLY)
add_custom_command(
OUTPUT "${CMAKE_BINARY_DIR}/${WHEEL_OUTPUT_NAME}"
COMMAND python -m build --no-isolation --wheel --outdir
"${CMAKE_BINARY_DIR}" &> /dev/null
DEPENDS
"${CMAKE_BINARY_DIR}/build-wheel/${PYTHON_WHEEL_NAME}/pyproject.toml"
"${WHEEL_FILES_${PYTHON_WHEEL_NAME}}"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-wheel/${PYTHON_WHEEL_NAME}")
add_custom_target("generate-${PYTHON_WHEEL_NAME}-wheel" ALL
DEPENDS "${CMAKE_BINARY_DIR}/${WHEEL_OUTPUT_NAME}")
install(FILES "${CMAKE_BINARY_DIR}/${WHEEL_OUTPUT_NAME}"
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/python")
install(
CODE "execute_process(COMMAND \"${CMAKE_CURRENT_SOURCE_DIR}/wheel-install.sh\" \
\"${CMAKE_BINARY_DIR}/${WHEEL_OUTPUT_NAME}\")")
endfunction()
#
# Install scripts
#
configure_file("scripts/revng" "${CMAKE_BINARY_DIR}/bin/revng")
#
# Install revng
#
set(PYTHON_TOP_MODULE_FILES revng/__init__.py revng/py.typed)
python_module(TARGET_NAME python-top-module WHEEL revng MODULE_FILES
${PYTHON_TOP_MODULE_FILES})
#
# Install revng.internal
#
set(PYTHON_TOP_INTERNAL_MODULE_FILES revng/internal/__init__.py
revng/internal/py.typed)
python_module(TARGET_NAME python-top-internal-module WHEEL revng_internal
MODULE_FILES ${PYTHON_TOP_INTERNAL_MODULE_FILES})
#
# Install revng.model (including autogenerated classes)
#
set(PYTHON_MODEL_FILES revng/model/__init__.py revng/model/metaaddress.py
revng/model/v1/__init__.py revng/model/v1/external.py)
python_module(
TARGET_NAME
python-model
WHEEL
revng
MODULE_FILES
${PYTHON_MODEL_FILES}
MODULE_GENERATED_FILES
"${PYTHON_GENERATED_MODEL_PATH}")
#
# Install revng.tupletree
#
set(PYTHON_TUPLETREE_FILES revng/tupletree/__init__.py)
python_module(TARGET_NAME python-tupletree WHEEL revng MODULE_FILES
${PYTHON_TUPLETREE_FILES})
set(MERGE_DYNAMIC_MODULE_FILES
revng/internal/cli/_commands/merge_dynamic/__init__.py
revng/internal/cli/_commands/merge_dynamic/log.py
revng/internal/cli/_commands/merge_dynamic/merge_dynamic.py
revng/internal/cli/_commands/merge_dynamic/parsed_elf.py
revng/internal/cli/_commands/merge_dynamic/util.py)
python_module(TARGET_NAME revng-merge-dynamic WHEEL revng_internal MODULE_FILES
${MERGE_DYNAMIC_MODULE_FILES})
#
# Install revng.model_dump
#
set(DUMP_MODEL_MODULE_FILES
revng/internal/cli/_commands/model_to_json/__init__.py
revng/internal/cli/_commands/model_to_json/remap.py)
python_module(TARGET_NAME revng-dump-model WHEEL revng_internal MODULE_FILES
${DUMP_MODEL_MODULE_FILES})
#
# Install revng.cli
#
set(REVNG_CLI_MODULE_FILES
revng/internal/cli/commands_registry.py revng/internal/cli/__init__.py
revng/internal/cli/revng.py revng/internal/cli/support.py)
python_module(TARGET_NAME revng-python-cli WHEEL revng_internal MODULE_FILES
${REVNG_CLI_MODULE_FILES})
#
# Install revng.cli._commands
#
set(REVNG_CLI_COMMANDS_MODULE_FILES
revng/internal/cli/_commands/translate.py
revng/internal/cli/_commands/idb_converter.py
revng/internal/cli/_commands/opt.py
revng/internal/cli/_commands/pipeline_tools.py
revng/internal/cli/_commands/override_by_name.py
revng/internal/cli/_commands/daemon.py
revng/internal/cli/_commands/hard_purge.py
revng/internal/cli/_commands/process_docs_yaml/__init__.py
revng/internal/cli/_commands/import_idb.py
revng/internal/cli/_commands/tar_to_yaml.py
revng/internal/cli/_commands/test_docs.py
revng/internal/cli/_commands/trace_run.py
revng/internal/cli/_commands/model_compare.py)
python_module(TARGET_NAME revng-python-cli-commands WHEEL revng_internal
MODULE_FILES ${REVNG_CLI_COMMANDS_MODULE_FILES})
set(REVNG_CLI_COMMANDS_PTML_MODULE_FILES
revng/internal/cli/_commands/ptml/text.py
revng/internal/cli/_commands/ptml/common.py
revng/internal/cli/_commands/ptml/__init__.py)
python_module(TARGET_NAME revng-python-cli-commands-ptml WHEEL revng_internal
MODULE_FILES ${REVNG_CLI_COMMANDS_PTML_MODULE_FILES})
set(REVNG_CLI_COMMANDS_FETCHDEBUGINFO_MODULE_FILES
revng/internal/cli/_commands/fetch_debuginfo/pe.py
revng/internal/cli/_commands/fetch_debuginfo/elf.py
revng/internal/cli/_commands/fetch_debuginfo/common.py
revng/internal/cli/_commands/fetch_debuginfo/__init__.py)
python_module(
TARGET_NAME revng-python-cli-commands-fetchdebuginfo WHEEL revng_internal
MODULE_FILES ${REVNG_CLI_COMMANDS_FETCHDEBUGINFO_MODULE_FILES})
set(REVNG_CLI_COMMANDS_GRAPHQL_MODULE_FILES
revng/internal/cli/_commands/graphql/__init__.py
revng/internal/cli/_commands/graphql/runner.py
revng/internal/cli/_commands/graphql/daemon_handler.py)
python_module(
TARGET_NAME revng-python-cli-commands-graphql WHEEL revng_internal
MODULE_FILES ${REVNG_CLI_COMMANDS_GRAPHQL_MODULE_FILES})
set(REVNG_CLI_COMMANDS_MASS_TESTING_MODULE_FILES
revng/internal/cli/_commands/mass_testing/__init__.py
revng/internal/cli/_commands/mass_testing/generate_report/db.py
revng/internal/cli/_commands/mass_testing/generate_report/meta.py
revng/internal/cli/_commands/mass_testing/generate_report/stacktrace.py
revng/internal/cli/_commands/mass_testing/generate_report/test_directory.py
revng/internal/cli/_commands/mass_testing/generate_report/__init__.py
revng/internal/cli/_commands/mass_testing/run.py
revng/internal/cli/_commands/mass_testing/configure.py)
python_module(
TARGET_NAME revng-python-cli-commands-mass-testing WHEEL revng_internal
MODULE_FILES ${REVNG_CLI_COMMANDS_MASS_TESTING_MODULE_FILES})
#
# Install revng.api
#
set(REVNG_API_MODULE_FILES
revng/internal/api/__init__.py
revng/internal/api/_capi.py
revng/internal/api/errors.py
revng/internal/api/exceptions.py
revng/internal/api/invalidations.py
revng/internal/api/manager.py
revng/internal/api/string_map.py
revng/internal/api/syncing_manager.py
revng/internal/api/synchronizer.py
revng/internal/api/target.py
revng/internal/api/utils.py)
python_module(TARGET_NAME revng-python-api WHEEL revng_internal MODULE_FILES
${REVNG_API_MODULE_FILES})
# Also copy PipelineC headers in the build directory so revng.api can use them
# from there
set(PIPELINE_C_HEADERS_SOURCE_DIR "${CMAKE_SOURCE_DIR}/include/revng/PipelineC")
set(PIPELINE_C_HEADERS_BUILD_DIR "${CMAKE_BINARY_DIR}/include/revng/PipelineC")
set(REQUIRED_PIPELINE_C_HEADERS ForwardDeclarationsC.h Prototypes.h)
file(MAKE_DIRECTORY "${PIPELINE_C_HEADERS_BUILD_DIR}")
foreach(HEADER ${REQUIRED_PIPELINE_C_HEADERS})
configure_file("${PIPELINE_C_HEADERS_SOURCE_DIR}/${HEADER}"
"${PIPELINE_C_HEADERS_BUILD_DIR}/${HEADER}" COPYONLY)
endforeach()
#
# Install revng.daemon
#
set(REVNG_DAEMON_MODULE_FILES
revng/internal/daemon/__init__.py revng/internal/daemon/multiqueue.py
revng/internal/daemon/schema.graphql revng/internal/daemon/graphql.py
revng/internal/daemon/util.py)
python_module(TARGET_NAME revng-python-daemon WHEEL revng_internal MODULE_FILES
${REVNG_DAEMON_MODULE_FILES})
#
# Install revng.support
#
set(REVNG_SUPPORT_MODULE_FILES
revng/internal/support/__init__.py revng/internal/support/elf.py
revng/internal/support/collect.py)
python_module(TARGET_NAME revng-python-support WHEEL revng_internal
MODULE_FILES ${REVNG_SUPPORT_MODULE_FILES})
#
# Install revng.pipeline_description
#
set(PYTHON_PIPELINEDESCRIPTION_FILES revng/pipeline_description/__init__.py)
python_module(
TARGET_NAME
python-pipeline-description
WHEEL
revng
MODULE_FILES
${PYTHON_PIPELINEDESCRIPTION_FILES}
MODULE_GENERATED_FILES
revng/pipeline_description/_generated.py)
#
# Generate actual wheel rules
#
python_wheel(NAME revng)
python_wheel(NAME revng_internal)