# -*- cmake -*-

if (WIN32)
if(NOT TCF_OPSYS)
  set(TCF_OPSYS "Windows")
endif()
if(NOT TCF_MACHINE)
  set(TCF_MACHINE "x86_64")
endif()
endif (WIN32)

set(TCF_BASE_DIR ${TCF_DIR}/agent)

# sources to build
set(TCF_SRCS)

# get all regular source files
file(GLOB TCF_SRCS_REL RELATIVE ${TCF_BASE_DIR}
	${TCF_BASE_DIR}/system/${TCF_OPSYS}/tcf/*.c
	${TCF_BASE_DIR}/machine/${TCF_MACHINE}/tcf/*.c
	${TCF_BASE_DIR}/tcf/framework/*.c
	${TCF_BASE_DIR}/tcf/services/*.c
	${TCF_BASE_DIR}/tcf/main/*.c)

# remove non-library files
file(GLOB TCF_MAIN_REL RELATIVE ${TCF_BASE_DIR}
	${TCF_BASE_DIR}/tcf/main/main*.c)
list(REMOVE_ITEM TCF_SRCS_REL ${TCF_MAIN_REL})

if(DEFINED TCF_EXTRA_DIR)
  foreach(extraDir ${TCF_EXTRA_DIR})
    # get extra all source files
    file(GLOB TCF_EXTRA_SRCS_REL RELATIVE ${extraDir}
      ${extraDir}/system/${TCF_OPSYS}/tcf/*.c
      ${extraDir}/machine/${TCF_MACHINE}/tcf/*.c
      ${extraDir}/tcf/framework/*.c
      ${extraDir}/tcf/services/*.c
      ${extraDir}/tcf/main/*.c)

    # Override regular files with extra files
    list (LENGTH TCF_EXTRA_SRCS_REL LEN_TCF_EXTRA_SRCS_REL)

    if (NOT LEN_TCF_EXTRA_SRCS_REL EQUAL 0)
      list(REMOVE_ITEM TCF_SRCS_REL ${TCF_EXTRA_SRCS_REL})
    endif ()
    
    foreach(file ${TCF_EXTRA_SRCS_REL})
      list(APPEND TCF_SRCS ${extraDir}/${file})
    endforeach(file)
  endforeach(extraDir)
endif()

foreach(file ${TCF_SRCS_REL})
  list(APPEND TCF_SRCS ${TCF_BASE_DIR}/${file})
endforeach(file)

if(DEFINED TCF_EXTRA_DIR)
  foreach(extraDir ${TCF_EXTRA_DIR})
    include_directories(${extraDir} ${extraDir}/system/${TCF_OPSYS} ${extraDir}/machine/${TCF_MACHINE})
  endforeach(extraDir)
endif()

include_directories(${TCF_BASE_DIR} ${TCF_BASE_DIR}/system/${TCF_OPSYS} ${TCF_BASE_DIR}/machine/${TCF_MACHINE})

set_source_files_properties(${TCF_SRCS} PROPERTIES
  COMPILE_FLAGS "${MULTI_THREADED_COMPILE_FLAGS}")
add_library(${TCF_LIB_NAME} ${TCF_LIB_TYPE} ${TCF_SRCS})
target_link_libraries(${TCF_LIB_NAME}
  ${UUID_LIB_NAME} ${MULTI_THREADED_LINK_LIBS} ${SOCKET_LINK_LIBS})

if(SSL_LIB_NAME)
  target_link_libraries(${TCF_LIB_NAME} ${SSL_LIB_NAME})
else()
  add_definitions("-DENABLE_SSL=0")
endif()

if(DEFINED TCF_PLUGIN_PATH)
  add_definitions(-DPATH_Plugins=${TCF_PLUGIN_PATH})
  if (UNIX)
    target_link_libraries(${TCF_LIB_NAME} dl)
  endif()
endif()
