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

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

Find_Package                ( cppcore QUIET )
If                          ( cppcore )
    Set                         ( CPPLOGGING_HAS_CPPCORE true )
EndIf                       ( )

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_OUTPUTNAME}"
                                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_OUTPUTNAME}"
                                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 ALL )
    Pedantic_Apply_Flags_Target ( cpplogging-static ALL )
    Pedantic_Apply_Flags_Target ( cpplogging-shared ALL )
EndIf                       ( )

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

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

Set                         ( CPPLOGGING_HAS_EXPORT False PARENT_SCOPE )

# 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 )
    Set                         ( CPPLOGGING_HAS_EXPORT True PARENT_SCOPE )
    Install                     ( TARGETS cpplogging-static
                                  EXPORT cpplogging
                                  DESTINATION ${CPPLOGGING_INSTALL_DIR_LIB} )
EndIf                       ( )

# Shared
If                          ( CPPLOGGING_INSTALL_SHARED )
    Set                         ( CPPLOGGING_HAS_EXPORT True PARENT_SCOPE )
    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                       ( )
