# CMake setup
cmake_minimum_required(VERSION 3.16)
project(elf-dissector VERSION 0.0.1)

find_package(ECM 6.0 REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)

include(KDECompilerSettings NO_POLICY_SCOPE)
include(ECMSetupVersion)
include(ECMPoQmTools)
include(ECMInstallIcons)
include(ECMDeprecationSettings)
include(FeatureSummary)
include(KDEInstallDirs)
include(KDECMakeSettings)
include(DetectLinker)

set(CMAKE_AUTOUIC on)
set(CMAKE_AUTORCC on)
set(CMAKE_CXX_VISIBILITY_PRESET "hidden")
set(CMAKE_VISIBILITY_INLINES_HIDDEN on)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)
enable_testing()

# version setup
set(PROJECT_VERSION_STRING "${PROJECT_VERSION}")
if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
  find_package(Git)
  set_package_properties(Git PROPERTIES TYPE OPTIONAL PURPOSE "Determine exact build version.")
  if(GIT_FOUND)
    execute_process(
      COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
      OUTPUT_VARIABLE _git_revision
    )
    string(REGEX REPLACE "\n" "" _git_revision "${_git_revision}")
    set(PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING} (revision: ${_git_revision})")
  endif()
endif()

# compiler setup
if(CMAKE_SYSTEM_NAME MATCHES Linux OR CMAKE_SYSTEM_NAME STREQUAL GNU)
  if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    set(EXTRA_LINKER_FLAGS "-Wl,--hash-style=both")
    set(CMAKE_EXE_LINKER_FLAGS "${EXTRA_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
    set(CMAKE_SHARED_LINKER_FLAGS "${EXTRA_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
    set(CMAKE_MODULE_LINKER_FLAGS "${EXTRA_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
  endif()
endif()

# dependencies
find_package(Qt6 6.7 COMPONENTS Widgets Test NO_MODULE REQUIRED)

find_package(Iberty REQUIRED)
find_package(Dwarf 0.10)
if (TARGET Dwarf::Dwarf)
    set(HAVE_DWARF TRUE)
endif()
if (NOT OPCODES_FOUND)
    message(FATAL_ERROR "Binutils::Opcodes library not found")
endif()
find_package(Capstone)
if (Capstone_FOUND)
    set(HAVE_CAPSTONE TRUE)
endif()
find_package(Gnuplot QUIET)
set_package_properties(Gnuplot PROPERTIES
    DESCRIPTION "a command-line driven graphing utility"
    URL "https://www.gnuplot.info/"
    PURPOSE "Required for the Performance benchmark tool"
    TYPE RUNTIME
)

# config files
configure_file(${CMAKE_SOURCE_DIR}/config-elf-dissector.h.cmake ${CMAKE_BINARY_DIR}/config-elf-dissector.h)
configure_file(${CMAKE_SOURCE_DIR}/config-elf-dissector-version.h.cmake ${CMAKE_BINARY_DIR}/config-elf-dissector-version.h)

ecm_install_po_files_as_qm(poqm)

ecm_set_disabled_deprecation_versions(
    QT 6.8.0
)

# build things
include_directories(
    ${CMAKE_SOURCE_DIR}/src
    ${CMAKE_SOURCE_DIR}/src/3rdparty
    ${CMAKE_SOURCE_DIR}/src/lib
    ${CMAKE_BINARY_DIR}
)

add_subdirectory(src)
if (BUILD_TESTING)
    add_subdirectory(tests)
endif()

feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
