cmake_minimum_required(VERSION 2.6)
PROJECT(corba)

SET (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}")
INCLUDE(RubyExtensions)

IF(APPLE)
  set(CMAKE_SHARED_MODULE_SUFFIX ".bundle")
  set(CMAKE_MACOSX_RPATH 1)
ENDIF(APPLE)

if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
    message(STATUS "running on Linux, implementing the __orogen_getTID() operation on all tasks")
    add_definitions(-DHAS_GETTID)
else()
    message(STATUS "NOT running on Linux (cmake reports ${CMAKE_SYSTEM_NAME}). The __orogen_getTID() operation will be a dummy")
endif()

ADD_DEFINITIONS(-D_REENTRANT)
MACRO(CMAKE_USE_FULL_RPATH install_rpath)
    # use, i.e. don't skip the full RPATH for the build tree
    SET(CMAKE_SKIP_BUILD_RPATH  FALSE)

    # when building, don't use the install RPATH already
    # (but later on when installing)
    SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 

    # the RPATH to be used when installing
    SET(CMAKE_INSTALL_RPATH ${install_rpath})

    # add the automatically determined parts of the RPATH
    # which point to directories outside the build tree to the install RPATH
    SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
ENDMACRO(CMAKE_USE_FULL_RPATH)
CMAKE_USE_FULL_RPATH("")

include(FindPkgConfig)

pkg_check_modules(RTT_Typelib REQUIRED rtt_typelib-${OROCOS_TARGET})
include_directories( ${RTT_Typelib_INCLUDE_DIRS} )
link_directories( ${RTT_Typelib_LIBRARY_DIRS} )

pkg_check_modules(RTT REQUIRED orocos-rtt-${OROCOS_TARGET})
ADD_DEFINITIONS( ${RTT_CFLAGS} )
INCLUDE_DIRECTORIES( ${RTT_INCLUDE_DIRS} )
LINK_DIRECTORIES( ${RTT_LIBRARY_DIRS} )

pkg_check_modules(RTT_MQUEUE orocos-rtt-mqueue-${OROCOS_TARGET})
if (RTT_MQUEUE_FOUND)
    include_directories( ${RTT_MQUEUE_INCLUDE_DIRS} )
    add_definitions(-DHAS_MQUEUE)
    list(APPEND ADDITIONAL_RTT_PLUGINS rtt-transport-mqueue)
else()
    message(STATUS "could not find the RTT MQueue transport, disabling support in orocos.rb")
endif()

pkg_check_modules(RTT_ROS orocos-rtt-ros-${OROCOS_TARGET} roscpp)
if (RTT_ROS_FOUND)
    include_directories( ${RTT_ROS_INCLUDE_DIRS} )
    add_definitions(-DHAS_ROS)
    list(APPEND ADDITIONAL_RTT_PLUGINS rtt-transport-ros)
    list(APPEND ROS_FILES ros.cc)
else()
    message(STATUS "could not find the RTT ROS transport, disabling support in orocos.rb")
endif()

pkg_check_modules(RTT_CORBA REQUIRED orocos-rtt-corba-${OROCOS_TARGET})
FIND_PATH(IDL_DIR TaskContext.idl ${RTT_CORBA_INCLUDE_DIRS})
if (NOT IDL_DIR)
    message(FATAL_ERROR "cannot find the Orocos/CORBA IDL files")
endif()
FILE(GLOB IDL_FILES ${IDL_DIR}/*.idl)

pkg_check_modules(TYPELIB REQUIRED typelib)
INCLUDE_DIRECTORIES( ${TYPELIB_INCLUDE_DIRS} )
LINK_DIRECTORIES( ${TYPELIB_LIBRARY_DIRS} )

pkg_check_modules(TYPELIB_RUBY REQUIRED typelib_ruby)
INCLUDE_DIRECTORIES( ${TYPELIB_RUBY_INCLUDE_DIRS} )
LINK_DIRECTORIES( ${TYPELIB_RUBY_LIBRARY_DIRS} )

list(APPEND CMAKE_PREFIX_PATH ${RTT_PREFIX})
find_package(RTTPlugin COMPONENTS rtt-typekit rtt-transport-corba ${ADDITIONAL_RTT_PLUGINS})

ADD_DEFINITIONS( -DOROCOS_TARGET=${OROCOS_TARGET} )
INCLUDE_DIRECTORIES( ${RTT_CORBA_INCLUDE_DIRS} )
LINK_DIRECTORIES( ${RTT_CORBA_LIBRARY_DIRS} )

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
MACRO(TAO_ORB)
    ADD_DEFINITIONS(-DCORBA_IS_TAO)
    INCLUDE_DIRECTORIES(/usr/include/orbsvcs)
    FOREACH(idl_file ${IDL_FILES})
        FILE(RELATIVE_PATH idl_basename ${IDL_DIR} ${idl_file})

        STRING(REGEX REPLACE ".idl$" "C.h"   hdr_file ${idl_basename})
        STRING(REGEX REPLACE ".idl$" "C.inl" inl_file ${idl_basename})
        STRING(REGEX REPLACE ".idl$" "C.cpp" cpp_file ${idl_basename})
        SET(client_hdr "${hdr_file};${inl_file}")
        SET(client_imp ${cpp_file})

        LIST(APPEND ORB_IDL_FILES ${client_imp})
        add_custom_command(OUTPUT ${client_hdr} ${client_imp}
            COMMAND tao_idl -Gt -Gd ${CMAKE_CURRENT_SOURCE_DIR}/${idl_file} -I${CMAKE_CURRENT_SOURCE_DIR}
            DEPENDS ${idl_file})
    ENDFOREACH(idl_file ${IDL_FILES})

    SET(ORB_LIBRARIES /usr/lib/libTAO.so /usr/lib/libTAO_CosNaming.so)
ENDMACRO(TAO_ORB)
MACRO(OMNIORB)
    ADD_DEFINITIONS(-DCORBA_IS_OMNIORB)
    FOREACH(idl_file ${IDL_FILES})
        FILE(RELATIVE_PATH idl_basename ${IDL_DIR} ${idl_file})

        STRING(REGEX REPLACE ".idl$" "C.h"   hdr_file ${idl_basename})
        STRING(REGEX REPLACE ".idl$" "DynSK.cpp" dyn_file ${idl_basename})
        STRING(REGEX REPLACE ".idl$" "C.cpp" cpp_file ${idl_basename})
        SET(client_hdr "${hdr_file}")
        SET(client_imp "${cpp_file};${dyn_file}")

        LIST(APPEND ORB_IDL_FILES ${client_imp})
        add_custom_command(OUTPUT ${client_hdr} ${client_imp}
            COMMAND omniidl -bcxx -Wba -Wbh=C.h -Wbs=C.cpp -Wbd=DynSK.cpp -I${CMAKE_CURRENT_SOURCE_DIR} ${idl_file}
            DEPENDS ${idl_file})
    ENDFOREACH(idl_file ${IDL_FILES})

    SET(ORB_LIBRARIES omniORB4 omniDynamic4)
ENDMACRO(OMNIORB)


link_directories(${RTT_ROS_LIBRARY_DIRS})


OMNIORB()
SET(EXTENSION_NAME rorocos)
ADD_RUBY_EXTENSION(${EXTENSION_NAME}
    ruby_task_context.cc rorocos.cc corba.cc datahandling.cc operations.cc
    lib/corba_name_service_client.cc ${ORB_IDL_FILES} ${ROS_FILES})

# OmniORB defines static global variables for internal bookkeeping. They show up
# as warning under -Wunused-variable
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-Wunused-variable" CXX_SUPPORTS_WUNUSED_VARIABLE)
if (CXX_SUPPORTS_WUNUSED_VARIABLE)
    set_source_files_properties(${ORB_IDL_FILES} PROPERTIES COMPILE_FLAGS "-Wno-unused-variable")
endif()

target_link_libraries(${EXTENSION_NAME} ${ORB_LIBRARIES} ${RTT_LIBRARIES}
    ${RTT_CORBA_LIBRARIES} ${TYPELIB_LIBRARIES}
    ${RTT_PLUGIN_rtt-typekit_LIBRARY}
    ${RTT_PLUGIN_rtt-transport-corba_LIBRARY}
    ${RTT_Typelib_LIBRARIES}
    ${RTT_ROS_LIBRARIES})
if (RTT_MQUEUE_FOUND)
    target_link_libraries(${EXTENSION_NAME}
        ${RTT_PLUGIN_rtt-transport-mqueue_LIBRARY})
endif()

INSTALL(TARGETS ${EXTENSION_NAME} LIBRARY DESTINATION ".")

