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

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

If                          ( HAS_PEDANTIC )
    Pedantic_Apply_Flags        ( ALL )
EndIf                       ( )

Option                      ( HELLOWORLD_INSTALL_DEBUG
                              "Install the stripped debug informations of helloworld."
                              OFF )
Option                      ( HELLOWORLD_NO_STRIP
                              "Do not strip debug symbols from binary."
                              OFF )

Message                     ( WARNING "Please configure the dependencies of this project!" )
Find_Package                ( libhelloworld REQUIRED )

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

Set                         ( HELLOWORLD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../include )
File                        ( GLOB_RECURSE HELLOWORLD_HEADER_FILES ${HELLOWORLD_INCLUDE_DIR}/*.h )
File                        ( GLOB_RECURSE HELLOWORLD_INLINE_FILES ${HELLOWORLD_INCLUDE_DIR}/*.inl )
File                        ( GLOB_RECURSE HELLOWORLD_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp )
List                        ( REMOVE_ITEM HELLOWORLD_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp )
Add_Library                 ( helloworld-objects
                              OBJECT
                                ${HELLOWORLD_HEADER_FILES}
                                ${HELLOWORLD_INLINE_FILES}
                                ${HELLOWORLD_SOURCE_FILES} )
Target_Include_Directories  ( helloworld-objects
                              PUBLIC
                                $<BUILD_INTERFACE:${HELLOWORLD_INCLUDE_DIR}>
                                $<INSTALL_INTERFACE:${HELLOWORLD_INSTALL_DIR_INCLUDE}> )
Target_Link_Libraries       ( helloworld-objects
                              PUBLIC
                                libhelloworld-shared )

# Executable ######################################################################################

Set                         ( HELLOWORLD_MAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp )
Add_Executable              ( helloworld ${HELLOWORLD_MAIN_FILE} )
Set_Target_Properties       ( helloworld
                              PROPERTIES
                                VERSION ${HELLOWORLD_VERSION} )
Target_Link_Libraries       ( helloworld
                              PUBLIC
                                helloworld-objects )

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

If                          ( HAS_COTIRE )
    Cotire                      ( helloworld-objects )
    Cotire                      ( helloworld )
EndIf                       ( )

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

# Executable
Install                     ( TARGETS helloworld
                              DESTINATION ${HELLOWORLD_INSTALL_DIR_BIN} )

# Debug
If                          ( HAS_STRIP_SYMBOLS AND NOT HELLOWORLD_NO_STRIP )
    Strip_Symbols               ( helloworld HELLOWORLD_DBG_FILE )
    If                          ( HELLOWORLD_INSTALL_DEBUG )
        Install                     ( FILES ${HELLOWORLD_DBG_FILE}
                                      DESTINATION ${HELLOWORLD_INSTALL_DIR_LIB} )
    EndIf                       ( )
EndIf                       ( )
