cmake_minimum_required(VERSION 3.15)
# get the current git commit id
execute_process(
    COMMAND git rev-parse HEAD
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_COMMIT_ID
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

# get the current git tag
execute_process(
    COMMAND git describe --tags --always
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_TAG
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

project(calrtcli VERSION 1.0)

# C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#C++ flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
option(PLD_MODE "enable PLD mode specs" OFF)

# Build type
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "build type" FORCE)
endif()

# =====================
# Paths
# =====================
set(SRC_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(CALRTCLI_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)

# =====================
# Source Files
# =====================
set(CALRTCLI_SRC_FILES
    ${SRC_ROOT}/cli_command.cpp
    ${SRC_ROOT}/cli_parser.cpp

    ${CMAKE_CURRENT_SOURCE_DIR}/calrtcli.cpp
)

# =====================
# Executable
# =====================

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
find_library(ELF_LIB elf REQUIRED)

set(CALRT_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../hostrt/include)
set(CALRT_INTER_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../hostrt/internal_common)
set(CALRT_DRIVER_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../hostrt/driver)
set(CALRT_CPP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../hostrt/src/)
include(${CMAKE_CURRENT_SOURCE_DIR}/../hostrt/cmake/calrt_cfg.cmake)

configure_file(
    ${CALRT_INTER_INCLUDE_PATH}/version.h.in
    ${CALRT_INTER_INCLUDE_PATH}/version.h
    @ONLY
)


add_executable(calrtcli ${CALRTCLI_SRC_FILES} ${CALRT_SRC_FILES})
if(PLD_MODE)
    message(STATUS "Build PLD mode")
    target_compile_definitions(calrtcli PRIVATE PLD)
endif()

target_compile_options(calrtcli PRIVATE 
    -O3
    -march=x86-64
    -mtune=generic
    -fno-lto
    -fPIE
    -fno-semantic-interposition
    -fno-stack-protector
    -fno-asynchronous-unwind-tables
    -fno-plt
    -funroll-loops
    -ffast-math
    # -fvisibility=hidden 
    # -fvisibility-inlines-hidden
    -ffunction-sections
    -fdata-sections
)
target_link_options(calrtcli PRIVATE
    -fno-lto
    -Wl,-z,now
    -Wl,-z,relro
    -Wl,--as-needed
    -Wl,-O1
    -Wl,--gc-sections
)

target_include_directories(calrtcli PRIVATE
    ${CALRTCLI_INCLUDE_PATH}
    ${CALRT_INCLUDE_PATH}
    ${CALRT_INTER_INCLUDE_PATH}
    ${CALRT_DRIVER_INCLUDE_PATH}
)
target_compile_definitions(calrtcli PRIVATE SUPEROWNER CLI_USE)
target_link_libraries(calrtcli PRIVATE Threads::Threads rt ${ELF_LIB} dl)

