# Initialize ######################################################################################

Include                     ( cotire        OPTIONAL RESULT_VARIABLE HAS_COTIRE )
Include                     ( pedantic      OPTIONAL RESULT_VARIABLE HAS_PEDANTIC )
Include                     ( strip_symbols OPTIONAL RESULT_VARIABLE HAS_STRIP_SYMBOLS )

Option                      ( CPPLOGGING_INSTALL_HEADER
                              "Install headers of cpplogging."
                              ON )
Option                      ( CPPLOGGING_INSTALL_STATIC
                              "Install static library of cpplogging."
                              ON )
Option                      ( CPPLOGGING_INSTALL_SHARED
                              "Install shared library of cpplogging."
                              ON )
Option                      ( CPPLOGGING_INSTALL_DEBUG
                              "Install the stripped debug informations of cpplogging."
                              OFF )
Option                      ( CPPLOGGING_NO_STRIP
                              "Do not strip debug symbols from binary."
                              OFF )

Find_Package                ( nlohmann_json QUIET )
If                          ( nlohmann_json_FOUND )
    Set                         ( CPPLOGGING_HAS_NLOHMANN_JSON true )
EndIf                       ( )

# Object Library ##################################################################################

Set                         ( CMAKE_POSITION_INDEPENDENT_CODE ON )
Set                         ( CPPLOGGING_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../include )
Set                         ( CPPLOGGING_GENERATED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated/include )
Configure_File              ( ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/config.h.in
                              ${CPPLOGGING_GENERATED_INCLUDE_DIR}/cpplogging/config.h )
File                        ( GLOB_RECURSE CPPLOGGING_HEADER_FILES ${CPPLOGGING_INCLUDE_DIR}/*.h )
File                        ( GLOB_RECURSE CPPLOGGING_INLINE_FILES ${CPPLOGGING_INCLUDE_DIR}/*.inl )
File                        ( GLOB_RECURSE CPPLOGGING_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp )
Add_Library                 ( cpplogging-objects
                              OBJECT
                                ${CPPLOGGING_HEADER_FILES}
                                ${CPPLOGGING_INLINE_FILES}
                                ${CPPLOGGING_SOURCE_FILES} )
If                          ( CPPLOGGING_HAS_NLOHMANN_JSON )
    Target_Link_Libraries       ( cpplogging-objects
                                  PRIVATE
                                    nlohmann_json::nlohmann_json )
EndIf                       ( )
Target_Include_Directories  ( cpplogging-objects
                              PUBLIC
                                $<BUILD_INTERFACE:${CPPLOGGING_INCLUDE_DIR}>
                                $<BUILD_INTERFACE:${CPPLOGGING_GENERATED_INCLUDE_DIR}>
                                $<INSTALL_INTERFACE:${CPPLOGGING_INSTALL_DIR_INCLUDE}> )

# Static Library ##################################################################################

Add_Library                 ( cpplogging-static STATIC $<TARGET_OBJECTS:cpplogging-objects> )
Set_Target_Properties       ( cpplogging-static
                              PROPERTIES
                                OUTPUT_NAME "cpplogging"
                                VERSION ${CPPLOGGING_VERSION} )
Target_Include_Directories  ( cpplogging-static
                              PUBLIC
                                $<BUILD_INTERFACE:${CPPLOGGING_INCLUDE_DIR}>
                                $<BUILD_INTERFACE:${CPPLOGGING_GENERATED_INCLUDE_DIR}>
                                $<INSTALL_INTERFACE:${CPPLOGGING_INSTALL_DIR_INCLUDE}> )

# Shared Library ##################################################################################

Add_Library                 ( cpplogging-shared SHARED $<TARGET_OBJECTS:cpplogging-objects> )
Set_Target_Properties       ( cpplogging-shared
                              PROPERTIES
                                OUTPUT_NAME "cpplogging"
                                VERSION ${CPPLOGGING_VERSION}
                                SOVERSION ${CPPLOGGING_VERSION_SHORT} )
Target_Include_Directories  ( cpplogging-shared
                              PUBLIC
                                $<BUILD_INTERFACE:${CPPLOGGING_INCLUDE_DIR}>
                                $<BUILD_INTERFACE:${CPPLOGGING_GENERATED_INCLUDE_DIR}>
                                $<INSTALL_INTERFACE:${CPPLOGGING_INSTALL_DIR_INCLUDE}> )

# Optimization ####################################################################################

# pedantic
If                          ( HAS_PEDANTIC )
    Pedantic_Apply_Flags_Target ( cpplogging-objects CXX )
    Pedantic_Apply_Flags_Target ( cpplogging-static CXX )
    Pedantic_Apply_Flags_Target ( cpplogging-shared CXX )
EndIf                       ( )

# cotire
If                          ( HAS_COTIRE )
    Cotire                      ( cpplogging-objects )
    Cotire                      ( cpplogging-static )
    Cotire                      ( cpplogging-shared )
EndIf                       ( )

# Install #########################################################################################

# Header
If                          ( CPPLOGGING_INSTALL_HEADER )
    Install                     ( DIRECTORY ${CPPLOGGING_INCLUDE_DIR}/cpplogging
                                  DESTINATION ${CPPLOGGING_INSTALL_DIR_INCLUDE} )
    Install                     ( DIRECTORY ${CPPLOGGING_GENERATED_INCLUDE_DIR}/cpplogging
                                  DESTINATION ${CPPLOGGING_INSTALL_DIR_INCLUDE} )
EndIf                       ( )

# Static
If                          ( CPPLOGGING_INSTALL_STATIC )
    Install                     ( TARGETS cpplogging-static
                                  EXPORT cpplogging
                                  DESTINATION ${CPPLOGGING_INSTALL_DIR_LIB} )
EndIf                       ( )

# Shared
If                          ( CPPLOGGING_INSTALL_SHARED )
    Install                     ( TARGETS cpplogging-shared
                                  EXPORT cpplogging
                                  DESTINATION ${CPPLOGGING_INSTALL_DIR_LIB} )
EndIf                       ( )

# Debug
If                          ( HAS_STRIP_SYMBOLS AND NOT CPPLOGGING_NO_STRIP )
    Strip_Symbols               ( cpplogging-shared CPPLOGGING_DBG_FILE )
    If                          ( CPPLOGGING_INSTALL_DEBUG )
        Install                     ( FILES ${CPPLOGGING_DBG_FILE}
                                      DESTINATION ${CPPLOGGING_INSTALL_DIR_LIB} )
    EndIf                       ( )
EndIf                       ( )
