cmake_minimum_required(VERSION 3.5)

option(CMAKE_EXPORT_COMPILE_COMMANDS "If enabled, generates a compile_commands.json file containing the exact compiler calls." ON)

# project details

include("cmake/package.cmake")

package(liblogger
    FULL_VERSION "2.1.0")

project(LibLogger
    VERSION ${PACKAGE_VERSION}
    LANGUAGES CXX)

option(LIBLOGGER_BUILD_TESTS "Build liblogger tests" OFF)

##############################################
# Declare dependencies
find_package(Threads REQUIRED)
set(Threads_LIBRARIES Threads::Threads)

find_package(Boost 1.53.0
    COMPONENTS
        date_time
        system
    REQUIRED)

include("cmake/package_dependencies.cmake")

add_package_dependencies(FROM_FILE "dependencies.txt")
    
##############################################
# Create target and set properties
add_library(logger STATIC
    src/register_service.cc
    src/register_results.cc
    src/register_log_entry_types.cc
    src/register_object_reference_types.cc
    src/create_log_entry.cc
    src/close_log_entry.cc
    src/create_session.cc
    src/close_session.cc
    src/get_log_entry_types.cc
    src/get_services.cc
    src/get_results.cc
    src/get_object_reference_types.cc
    src/get_log_entry_info.cc
    src/list_log_entries.cc
    src/log_entry.cc
    src/log_entry_ident.cc
    src/get_session_user.cc
    src/session_ident.cc
    src/util.cc
    src/exceptions.cc)

#Add an alias so that library can be used inside the build tree, e.g. when testing
add_library(LibLogger::library ALIAS logger)

#Set target properties
target_include_directories(logger
    PUBLIC
        $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        ${PostgreSQL_INCLUDE_DIRS}
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}
)

target_compile_features(logger PRIVATE cxx_decltype_auto)
target_compile_options(logger PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra -ggdb -grecord-gcc-switches>)
set_target_properties(logger PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib"
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib")

target_link_libraries(logger
    ${Boost_PROGRAM_OPTIONS_LIBRARY}
    ${Threads_LIBRARIES}
    LibPg::library
    LibLog::library
    LibStrong::library)

if(LIBLOGGER_BUILD_TESTS)
    add_subdirectory(test)
endif()

# install

get_directory_property(HAS_PARENT "PARENT_DIRECTORY")
if(NOT HAS_PARENT)
    include(GNUInstallDirs)

    install(TARGETS logger
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

    add_custom_target(uninstall
        COMMAND xargs -L10 rm -v < ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt
        COMMAND cat ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt | xargs -L1 dirname | sort | uniq | xargs -L10 rmdir -p --ignore-fail-on-non-empty)
endif()


# dist

include("cmake/package_dist.cmake")
package_dist(PACKAGE_NAME "${PACKAGE_NAME}"
             PACKAGE_PREFIX "${LIBLOGGER_PREFIX}"
             PACKAGE_TARNAME "${PACKAGE_TARNAME}")

list_package_dependencies_recursive("${PACKAGE_NAME}")
