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 “.”)