#
# 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")
