# Copyright (C) 2019-2020  CZ.NIC, z. s. p. o.
#
# This file is part of FRED.
#
# FRED is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# FRED is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with FRED.  If not, see <https://www.gnu.org/licenses/>.

cmake_minimum_required(VERSION 3.5)

project(liblog
    VERSION 1.0.0
    LANGUAGES CXX)

if("CXX" IN_LIST languages)
    message("C++ enabled")
endif()

include(GNUInstallDirs)

option(LIBLOG_BUILD_TESTS "Build liblog tests" OFF)

add_library(log
    STATIC
    src/liblog/context.cc
    src/liblog/impl/to_spdlog_level.cc
    src/liblog/impl/to_spdlog_pattern_time_type.cc
    src/liblog/log.cc
    src/liblog/log_config.cc
    src/liblog/sink/console_sink_config.cc
    src/liblog/sink/file_sink_config.cc
    src/liblog/sink/impl/console_sink.cc
    src/liblog/sink/impl/file_sink.cc
    src/liblog/sink/impl/syslog_sink.cc
    src/liblog/sink/syslog_sink_config.cc
    src/liblog/thread_number.cc)

add_library(LibLog::library ALIAS log)

set_target_properties(log PROPERTIES
    VERSION ${PROJECT_VERSION}
    CXX_STANDARD 14
    CXX_STANDARD_REQUIRED YES
    CXX_EXTENSIONS NO
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib"
    OUTPUT_NAME "log")

macro(set_default variable_name variable_value)
    if(NOT ${variable_name})
        set(${variable_name} ${variable_value})
    endif()
endmacro()

set(PACKAGE liblog)
set_default(HAVE_BOOST_SERIALIZATION 1)
set_default(SPDLOG_ACTIVE_LEVEL 0)
set_default(FMT_STRING_ALIAS 1)
set_default(FMT_HEADER_ONLY 1)
set_default(CMAKE_EXPORT_COMPILE_COMMANDS ON)

target_compile_options(log
    PRIVATE
        $<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra -ggdb -grecord-gcc-switches>)

target_compile_definitions(log
    PUBLIC
        HAVE_BOOST_SERIALIZATION=${HAVE_BOOST_SERIALIZATION}
        SPDLOG_ACTIVE_LEVEL=${SPDLOG_ACTIVE_LEVEL}
        FMT_STRING_ALIAS=${FMT_STRING_ALIAS}
        FMT_HEADER_ONLY=${FMT_HEADER_ONLY})

set(VERSION ${PROJECT_VERSION})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
configure_file(log.pc.in log.pc @ONLY)

find_package(Threads REQUIRED)
set(Threads_LIBRARIES Threads::Threads)
find_package(Boost 1.53.0
    COMPONENTS
        system
        thread
        serialization
        filesystem
    REQUIRED)
find_package(PkgConfig REQUIRED)

target_include_directories(log
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_BINARY_DIR})

target_include_directories(log
    BEFORE
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/lib/spdlog/include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/lib/spdlog/include/spdlog>)

set(LIBLOG_LIBRARIES
    ${Threads_LIBRARIES}
    Boost::system
    Boost::thread)

target_link_libraries(log
    ${LIBLOG_LIBRARIES})

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

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/log.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)

if(LIBLOG_BUILD_TESTS)

add_subdirectory(test/liblog)

endif()

get_directory_property(has_parent PARENT_DIRECTORY)
if(has_parent)
    set(${PROJECT_NAME}_LIBRARIES ${LIBLOG_LIBRARIES} PARENT_SCOPE)
endif()
