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

add_library(${PROJECT_NAME}
        Domain.cpp
        Factory.cpp
        GenericSubDevice.cpp
        IoLinkDevice.cpp
        Master.cpp
        SubDevice.cpp
        SwappedSync.cpp
        devices/EL6224.cpp
        devices/EL6692.cpp
        devices/Ex1xxx.cpp
        devices/Ex20xx.cpp
        devices/Ex3xxx.cpp
        devices/Ex4xxx.cpp
        devices/Festo.cpp
        devices/IfmIoLink.cpp
        devices/Infra.cpp
        devices/Movitrac.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 ecapp.map
        COMMAND "${PYTHON_EXECUTABLE}"
        ARGS "${CMAKE_CURRENT_SOURCE_DIR}/../symbol-versioning/symbol_version_tool.py"
                -i "${CMAKE_CURRENT_SOURCE_DIR}/ecapp.map.yaml"
                -o "${CMAKE_CURRENT_BINARY_DIR}/ecapp.map"
                --arch "generic${VERSCRIPT_ARCH}${LTO_ARCH}"
                GenerateLinkerVersionScript
        MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/ecapp.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(ECAPP_MAP_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/ecapp.map")
    set_source_files_properties(Factory.cpp PROPERTIES OBJECT_DEPENDS "${ECAPP_MAP_DEPENDS}")
    # inform linker about version script
    set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS " -Wl,-version-script=${CMAKE_CURRENT_BINARY_DIR}/ecapp.map")

    if (CHECK_SYMBOL_VERSIONING)
        add_custom_target(CheckEcappVersionScript ALL
            "${PYTHON_EXECUTABLE}"
            "${CMAKE_CURRENT_SOURCE_DIR}/../symbol-versioning/symbol_version_tool.py"
            -i "${CMAKE_CURRENT_SOURCE_DIR}/ecapp.map.yaml"
            --arch "generic${VERSCRIPT_ARCH}${LTO_ARCH}"
            --library $<TARGET_FILE:${PROJECT_NAME}>
            CheckGeneratedLibraries
            COMMENT "Checking whether all symbols are versioned correctly..."
        )
        add_dependencies(CheckEcappVersionScript ${PROJECT_NAME})
    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
)

target_link_libraries(${PROJECT_NAME} PUBLIC EtherLab::pdserv EtherLab::ethercat)

# 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
        NAMESPACE EtherLab::
        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/
)

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