Files
revng-revng/python/CMakeLists.txt
Giacomo Vercesi cf05ab0463 Substitute Flask with Starlette
In the future we will need to use GraphQL subscriptions. This is done
via websockets and is supported in Ariadne. However this support is
limited to ASGI frameworks, which Flask isn't a part of.
Startlette is a direct depencency of Ariadne, and all of Ariadne's
features are fully integrated with Starlette, so the switch allows to
drop some Flask integration cruft and streamline the revng.daemon
package.
2022-05-03 10:57:21 +02:00

181 lines
5.8 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 - 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 (in the lib/python folder) and installed in /lib/python.
function(python_module)
set(options)
set(oneValueArgs TARGET_NAME)
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}/lib/python/${MODULE_FILE}" COPYONLY)
endforeach()
foreach(MODULE_FILE ${PYTHON_MODULE_MODULE_FILES}
${PYTHON_MODULE_MODULE_GENERATED_FILES})
# Copy module in the root at install time
get_filename_component(MODULE_FILE_DIR "${MODULE_FILE}" DIRECTORY)
install(FILES "${CMAKE_BINARY_DIR}/lib/python/${MODULE_FILE}"
DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/python/${MODULE_FILE_DIR}")
endforeach()
add_custom_target(
"${PYTHON_MODULE_TARGET_NAME}"
DEPENDS ${PYTHON_MODULE_MODULE_FILES}
${PYTHON_MODULE_MODULE_GENERATED_FILES})
endfunction()
#
# Check that required python dependencies are available
#
file(STRINGS "requirements.txt" REQUIREMENTS REGEX "^[^#].+$")
check_python_requirements(${REQUIREMENTS})
#
# Install scripts
#
set(SCRIPTS "scripts/revng-merge-dynamic" "scripts/revng-model-compare"
"scripts/revng-model-to-json")
foreach(SCRIPT ${SCRIPTS})
get_filename_component(SCRIPT_FILENAME "${SCRIPT}" NAME)
# revng script needs configure_file *without* COPYONLY
configure_file("${SCRIPT}"
"${CMAKE_BINARY_DIR}/libexec/revng/${SCRIPT_FILENAME}")
install(PROGRAMS "${CMAKE_BINARY_DIR}/libexec/revng/${SCRIPT_FILENAME}"
DESTINATION libexec/revng/)
endforeach()
configure_file("scripts/revng" "${CMAKE_BINARY_DIR}/bin/revng")
install(PROGRAMS "${CMAKE_BINARY_DIR}/bin/revng" DESTINATION bin/)
#
# Install revng.model (including autogenerated classes)
#
set(PYTHON_MODEL_FILES
revng/model/__init__.py revng/model/_util.py revng/model/metaaddress.py
revng/model/v1/__init__.py revng/model/v1/external.py)
python_module(TARGET_NAME python-model MODULE_FILES ${PYTHON_MODEL_FILES}
MODULE_GENERATED_FILES "${PYTHON_GENERATED_MODEL_PATH}")
#
# Install revng.tupletree
#
set(PYTHON_TUPLETREE_FILES revng/tupletree.py)
python_module(TARGET_NAME python-tupletree MODULE_FILES
${PYTHON_TUPLETREE_FILES})
set(MERGE_DYNAMIC_MODULE_FILES
revng/cli/merge_dynamic/__init__.py revng/cli/merge_dynamic/log.py
revng/cli/merge_dynamic/merge_dynamic.py
revng/cli/merge_dynamic/parsed_elf.py revng/cli/merge_dynamic/util.py)
python_module(TARGET_NAME revng-merge-dynamic MODULE_FILES
${MERGE_DYNAMIC_MODULE_FILES})
#
# Install revng.model_dump
#
set(DUMP_MODEL_MODULE_FILES "revng/cli/model_dump/__init__.py"
"revng/cli/model_dump/__main__.py")
python_module(TARGET_NAME revng-dump-model MODULE_FILES
${DUMP_MODEL_MODULE_FILES})
#
# Install revng.cli.support
#
python_module(TARGET_NAME revng-python-support MODULE_FILES
"revng/cli/support.py")
#
# Install revng.cli.translate
#
python_module(TARGET_NAME revng-python-translate MODULE_FILES
"revng/cli/translate.py")
#
# Install revng.cli.lift
#
python_module(TARGET_NAME revng-python-lift MODULE_FILES "revng/cli/lift.py")
#
# Install revng.cli.opt
#
python_module(TARGET_NAME revng-python-opt MODULE_FILES "revng/cli/opt.py")
#
# Install revng.cli.revng
#
python_module(TARGET_NAME revng-python-revng MODULE_FILES "revng/cli/revng.py")
#
# Install revng.cli.revng
#
python_module(TARGET_NAME revng-python-pipeline MODULE_FILES
"revng/cli/pipeline.py")
#
# Install revng.cli.commands_registry
#
python_module(TARGET_NAME revng-python-commands_registry MODULE_FILES
"revng/cli/commands_registry.py")
#
# Install revng.cli.llvm_pipeline
#
python_module(TARGET_NAME revng-python-llvm_pipeline MODULE_FILES
"revng/cli/llvm_pipeline.py")
#
# Install revng.cli.daemon
#
python_module(TARGET_NAME revng-python-cmd-daemon MODULE_FILES
"revng/cli/daemon.py")
#
# Install revng.api
#
set(REVNG_API_MODULE_FILES
revng/api/__init__.py
revng/api/_capi.py
revng/api/container.py
revng/api/exceptions.py
revng/api/kind.py
revng/api/manager.py
revng/api/rank.py
revng/api/step.py
revng/api/target.py
revng/api/utils.py)
python_module(TARGET_NAME revng-python-api 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/daemon/__init__.py
revng/daemon/demo_webpage.py
revng/daemon/schema.py
revng/daemon/schema.graphql.tpl
revng/daemon/util.py
revng/daemon/templates/base.html
revng/daemon/templates/index.html)
python_module(TARGET_NAME revng-python-daemon MODULE_FILES
${REVNG_DAEMON_MODULE_FILES})