# Check if cmake has the required version
cmake_minimum_required(VERSION 3.1.2 FATAL_ERROR)

# Set the name and version of the project
project(kernel-shark)

set(KS_APP_NAME "kernelshark")
set(KS_VERSION_MAJOR 2)
set(KS_VERSION_MINOR 0)
set(KS_VERSION_PATCH 1)
set(KS_VERSION_STRING ${KS_VERSION_MAJOR}.${KS_VERSION_MINOR}.${KS_VERSION_PATCH})
message("\n project: Kernel Shark: (version: ${KS_VERSION_STRING})\n")

set(KS_DIR ${CMAKE_SOURCE_DIR})

execute_process(COMMAND bash "-c" "echo __LP64__ | ${CMAKE_C_COMPILER} -E -x c - | tail -n 1"
                OUTPUT_VARIABLE __LP64__)

if (NOT _INSTALL_PREFIX AND NOT _LIBDIR)

    set(_INSTALL_PREFIX "/usr/local")

    if (__LP64__ MATCHES 1)
        set(_LIBDIR "/usr/local/lib64")
    else (__LP64__ MATCHES 1)
        set(_LIBDIR "/usr/local/lib")
    endif (__LP64__ MATCHES 1)

elseif (NOT _INSTALL_PREFIX)

    set(_INSTALL_PREFIX "/usr/local")

elseif (NOT _LIBDIR)

   set(_LIBDIR "${_INSTALL_PREFIX}/lib")

endif ()

if (NOT _POLKIT_INSTALL_PREFIX)

    set(_POLKIT_INSTALL_PREFIX "/usr")

endif ()

set(CMAKE_MODULE_PATH "${KS_DIR}/build")
find_package(TraceEvent REQUIRED)
find_package(TraceFS    REQUIRED)
find_package(TraceCmd   REQUIRED)

find_package(JSONC      REQUIRED)

find_package(Doxygen)

set(OpenGL_GL_PREFERENCE LEGACY)
find_package(OpenGL)
find_package(GLUT)

set(KS_FONT FreeSans)
if (NOT TT_FONT_FILE)
    execute_process(COMMAND  bash "-c" "fc-list '${KS_FONT}' |grep ${KS_FONT}.ttf | cut -d':' -f 1 -z"
                    OUTPUT_VARIABLE TT_FONT_FILE)
endif (NOT TT_FONT_FILE)

if (TT_FONT_FILE)

  message(STATUS "Found font: ${TT_FONT_FILE}")

else (TT_FONT_FILE)

  message(WARNING "\nCould not find font ${KS_FONT}!\n")

endif (TT_FONT_FILE)

find_package(Qt5Widgets 5.7.1)
find_package(Qt5Network)
if (Qt5Widgets_FOUND)

    message(STATUS "Found Qt5Widgets:  (version ${Qt5Widgets_VERSION})")

    if(Qt5Widgets_VERSION VERSION_LESS "5.11")

        set(QT_VERSION_LESS_5_11 TRUE)

    endif()

    if(Qt5Widgets_VERSION VERSION_LESS "5.15")

        set(QT_VERSION_LESS_5_15 TRUE)

    endif()

endif (Qt5Widgets_FOUND)

find_package (Boost COMPONENTS unit_test_framework)

set(LIBRARY_OUTPUT_PATH    "${KS_DIR}/lib")
set(EXECUTABLE_OUTPUT_PATH "${KS_DIR}/bin")

set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -Wall -pthread -fPIC -fno-common")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pthread -fPIC -fno-common")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif (NOT CMAKE_BUILD_TYPE)

message("\n Build type: ${CMAKE_BUILD_TYPE}")

if (NOT CMAKE_C_FLAGS_PACKAGE)
    set(CMAKE_C_FLAGS_PACKAGE "-O3")
endif (NOT CMAKE_C_FLAGS_PACKAGE)

if (NOT CMAKE_CXX_FLAGS_PACKAGE)
    set(CMAKE_CXX_FLAGS_PACKAGE "-O3")
endif (NOT CMAKE_CXX_FLAGS_PACKAGE)

set(KS_PLUGIN_INSTALL_PREFIX ${_LIBDIR}/${KS_APP_NAME}/plugins)

set(KS_ICON        KS_icon_shark.svg)
set(KS_ICON_FIN    KS_icon_fin.svg)
set(KS_LOGO        KS_logo_symbol.svg)
set(KS_LOGO_LABEL  KS_logo_horizontal.svg)

set(CMAKE_INSTALL_RPATH "${_LIBDIR}" "$ORIGIN")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

if (CMAKE_BUILD_TYPE MATCHES Package)

    set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)

else (CMAKE_BUILD_TYPE MATCHES Package)

    set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)

endif (CMAKE_BUILD_TYPE MATCHES Package)

include_directories(${KS_DIR}/src/
                    ${KS_DIR}/build/src/)

message("")
message(STATUS "C flags      : " ${CMAKE_C_FLAGS})
message(STATUS "CXX flags    : " ${CMAKE_CXX_FLAGS})
message(STATUS "Linker flags : " ${CMAKE_EXE_LINKER_FLAGS})

add_subdirectory(${KS_DIR}/src)
add_subdirectory(${KS_DIR}/examples)

if (Boost_FOUND)

    set(KS_TEST_DIR                      "${KS_DIR}/tests")
    enable_testing()
    add_subdirectory(${KS_TEST_DIR})

endif()

if (_DOXYGEN_DOC AND DOXYGEN_FOUND)

    message("\n doxygen documentation ...")
    add_custom_target(doc ALL)
    add_custom_command(TARGET doc
                       COMMAND doxygen dox_config > dox_build.log
                       WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/Documentation/doxygen)

    set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES
                             "${KS_DIR}/Documentation/doxygen/dox_build.log"
                             "${KS_DIR}/Documentation/doxygen/html"
                             "${KS_DIR}/Documentation/doxygen/latex")

endif ()

configure_file(${KS_DIR}/build/deff.h.cmake
               ${KS_DIR}/src/KsCmakeDef.hpp)

configure_file(${KS_DIR}/build/ks.desktop.cmake
               ${KS_DIR}/${KS_APP_NAME}.desktop)

configure_file(${KS_DIR}/build/org.freedesktop.kshark-record.policy.cmake
               ${KS_DIR}/org.freedesktop.kshark-record.policy)

configure_file(${KS_DIR}/build/libkshark.pc.cmake
               ${KS_DIR}/libkshark.pc @ONLY)

message("")
