# ---------------------------------------------------------------------------

add_library(${PROJECT_NAME}
        Base.cpp
        Blinker.cpp
        BusMonitor.cpp
        ButtonEvent.cpp
        Controller.cpp
        Counter.cpp
        Delay.cpp
        Encoder.cpp
        ExternalSwitch.cpp
        FunctionGenerator.cpp
        Interpolation.cpp
        Limiter.cpp
        Linearisation.cpp
        LowPassFilter.cpp
        Message.cpp
        RateLimiter.cpp
        Relay.cpp
        Task.cpp
        TimeIntegrator.cpp
        UserParameter.cpp
        UserSignal.cpp
)

if (USE_SYMBOL_VERSIONING)
    math(EXPR VERSCRIPT_ARCH "8 * ${CMAKE_SIZEOF_VOID_P}")
    string(FIND "${CMAKE_CXX_FLAGS}" "-flto" LTO_POS)
    set(LTO_ARCH "")
    if (NOT LTO_POS EQUAL "-1")
        set(LTO_ARCH "-lto")
    endif ()
    add_custom_command(OUTPUT reta.map
        COMMAND "${PYTHON_EXECUTABLE}"
        ARGS "${CMAKE_CURRENT_SOURCE_DIR}/../symbol-versioning/symbol_version_tool.py"
                -i "${CMAKE_CURRENT_SOURCE_DIR}/reta.map.yaml"
                -o "${CMAKE_CURRENT_BINARY_DIR}/reta.map"
                --arch "generic${VERSCRIPT_ARCH}${LTO_ARCH}"
                GenerateLinkerVersionScript
        MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/reta.map.yaml"
        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../symbol-versioning/symbol_version_tool.py"
    )
    # to force relinking upon changing the map file,
    # we add an OBJECT_DEPENDS
    set(TASK_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/reta.map")
    set_source_files_properties(Task.cpp PROPERTIES OBJECT_DEPENDS "${TASK_DEPENDS}")
    # inform linker about version script
    set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS " -Wl,-version-script=${CMAKE_CURRENT_BINARY_DIR}/reta.map")

    if (CHECK_SYMBOL_VERSIONING)
        add_custom_target(CheckRetaVersionScript ALL
            "${PYTHON_EXECUTABLE}"
            "${CMAKE_CURRENT_SOURCE_DIR}/../symbol-versioning/symbol_version_tool.py"
            -i "${CMAKE_CURRENT_SOURCE_DIR}/reta.map.yaml"
            --arch "generic${VERSCRIPT_ARCH}${LTO_ARCH}"
            --library $<TARGET_FILE:${PROJECT_NAME}>
            CheckGeneratedLibraries
            COMMENT "Checking whether all symbols are versioned correctly..."
        )
    endif ()
endif ()

# Set SOVERSION (version of our shared library)
set_target_properties(${PROJECT_NAME} PROPERTIES
        VERSION ${PROJECT_VERSION}
        SOVERSION ${PROJECT_VERSION_MAJOR}
        CXX_STANDARD_REQUIRED 1
        CXX_STANDARD 17
)

# Link test exe against our library
target_link_libraries(${PROJECT_NAME} PUBLIC EtherLab::pdserv)

# Set include path (for build and install time)
target_include_directories(${PROJECT_NAME} PUBLIC
        "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
        "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>"
        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../${PROJECT_NAME}>"
        "$<INSTALL_INTERFACE:include>"
)

# ---------------------------------------------------------------------------

# Install files

# Our library
install(
        TARGETS ${PROJECT_NAME}
        EXPORT ${PROJECT_NAME}Targets
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

# Auto-generated headers
install(FILES
        ${CMAKE_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_export.h
        ${CMAKE_BINARY_DIR}/${PROJECT_NAME}/config.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
)

install(DIRECTORY ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
)

# Cmake target export and pkg-config
install(FILES
        ${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake
        ${CMAKE_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

install(EXPORT ${PROJECT_NAME}Targets
        FILE ${PROJECT_NAME}Targets.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

install(FILES
        ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig/
)

# ---------------------------------------------------------------------------
