#
# $Id$
# $HeadURL$
# $Author$
#

IF(BUILD_RTI)

INCLUDE(MacroRTIDDSGen)
INCLUDE(MacroCodeGenIdl)

# Resolve <DDS/...> includes (generic_data_reader.h, generic_dtc.h, ...) to the
# real headers under Lts/DDS/ instead of the migration stub tree in include/.
# The generated core_dtc_impl.h relies on GenericDtc::TopicType, which only the
# real DDSGeneric::GenericDataReader base provides — the stub variant lacks it.
# Same fix the migrated service CMakeLists (FileManagement/FilterManagement)
# already enforce; svcFileManagement links svcCoreClient, so Core must build.
include_directories(BEFORE ${CMAKE_SOURCE_DIR}/Lts)

SET(xml_FILE core.xml)

#
# --- Library svcCoreCommon / ddscore --------------------------------------------------------------------------------
#
SET(SRCS_common
  core_export.h
  function_reply_object.cpp
  function_reply_object.h
  logger.cpp
  logger.h
)

# Generates core.idl / core_enums.idl
CODEGEN_IDL_SVC(SRCS_common ${xml_FILE})

# Generate core.sql
CODEGEN_SQL(SRCS_common ${xml_FILE})

# Generate *.cpp/*.hpp from core_enums.idl / core.idl
RTIDDSGEN(SRCS_common core_enums.idl)
RTIDDSGEN(SRCS_common core.idl)

# Generate core_dt[s,c]_types.h, core_ft[s,c]_types.h
CODEGEN_TOPIC_TYPEDEFS(SRCS_common ${xml_FILE})
# generate core_[d|f]tc.h
CODEGEN_CLIENT_TOPICS_IFC(SRCS_common ${xml_FILE})

# Get the generated core_dtc.h path for manual MOC handling
# When BUILD_GRANTLEE=OFF, file is in source dir; otherwise in build dir
IF(BUILD_GRANTLEE)
  SET(CORE_DTC_H_GENERATED "${CMAKE_CURRENT_BINARY_DIR}/core_dtc.h")
ELSE()
  SET(CORE_DTC_H_GENERATED "${CMAKE_CURRENT_SOURCE_DIR}/core_dtc.h")
  # Copy to build directory for consistent MOC handling
  CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/core_dtc.h" "${CMAKE_CURRENT_BINARY_DIR}/core_dtc.h" COPYONLY)
ENDIF()

NGL_ADD_LIBRARY2(WS AAR HLA SV ddscore SHARED ${SRCS_common})

# Add RTI compile definitions explicitly (required for RTI headers to compile)
# NDDS_USER_SYMBOL_EXPORT triggers visibility attributes in RTI-generated code
# without the later undef that happens with NDDS_USER_DLL_EXPORT
TARGET_COMPILE_DEFINITIONS(ddscore
    PRIVATE
        RTI_UNIX
        RTI_LINUX
        RTI_64BIT
        MAKE_DDSCORE_LIB
    PUBLIC
        NDDS_USER_SYMBOL_EXPORT
)

# Skip AUTOMOC for generated header - it will be processed manually with correct dependencies
SET_SOURCE_FILES_PROPERTIES(${CORE_DTC_H_GENERATED} PROPERTIES SKIP_AUTOMOC ON)

# Ensure AUTOMOC can find generated headers - add include path
TARGET_INCLUDE_DIRECTORIES(ddscore
  PUBLIC
    ${CMAKE_CURRENT_BINARY_DIR}/../../
)
NGL_TARGET_INCLUDE_DIRECTORIES(ddscore
  PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/../../
)

# Manually add MOC for the generated core_dtc.h with proper include paths
QT6_WRAP_CPP(ddscore_moc_sources ${CORE_DTC_H_GENERATED} 
  OPTIONS --include core_dtc.h -I${CMAKE_CURRENT_BINARY_DIR}/../.. -I${CMAKE_CURRENT_SOURCE_DIR}/../..
)
TARGET_SOURCES(ddscore PRIVATE ${ddscore_moc_sources})
IF(BUILD_RTI)
NGL_TARGET_LINK_LIBRARIES(ddscore
  PRIVATE
    NGLLogger
  PUBLIC
    LtsUtilsCoreHeaderOnly
    ddsdts
    Qt6::Core
    RTI::nddsc    # DDS_GroupDataQosPolicy_initialize (wo auch immer das herkommt)
    RTI::nddscore # RTI_LOG_ANY_FAILURE_s (wo auch immer das herkommt)
    RTI::nddscpp2
)
ENDIF(BUILD_RTI)

NGL_INSTALL_TARGET(ddscore)

#
# --- Library svcCoreClient --------------------------------------------------------------------------------
#
SET(SRCS_client
  core_export.h
  pacemaker.h
  pacemaker.cpp
  topic_lock_master.h
  topic_lock_master.cpp
)

# generate core_[d|f]tc_impl.[cpp|h]
CODEGEN_CLIENT_TOPICS_IMPL(SRCS_client ${xml_FILE})

NGL_ADD_LIBRARY2(AAR SV WS HLA svcCoreClient SHARED ${SRCS_client})
# NGL_ADD_LIBRARY2 (unlike NGL_ADD_LIBRARY) does not define the
# MAKE_<SYMBOL>_LIB compile guard, but the generated core_[d|f]tc_impl.h
# headers require MAKE_SVCCORECLIENT_LIB — same situation as ddscore above,
# which defines MAKE_DDSCORE_LIB explicitly for the same reason.
TARGET_COMPILE_DEFINITIONS(svcCoreClient PRIVATE MAKE_SVCCORECLIENT_LIB)
NGL_TARGET_INCLUDE_DIRECTORIES(svcCoreClient
  PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/../../
    ${CMAKE_CURRENT_BINARY_DIR}/../../
)

IF(BUILD_RTI)
NGL_TARGET_LINK_LIBRARIES(svcCoreClient
  PRIVATE
    RTI::nddscpp2
    ddsconnector
  PUBLIC
    ddscore
    ddsftc
)
ENDIF(BUILD_RTI)
NGL_INSTALL_TARGET(svcCoreClient)

#
# --- Library svcCoreServer --------------------------------------------------------------------------------
#  not used (no core service needed)
#
#
# --- Topic Type Plugin --------------------------------------------------------------
#
CREATE_TOPIC_TYPE_PLUGIN(${xml_FILE})

ENDIF(BUILD_RTI)
