forked from orocos-toolchain/rtt
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrtt_macros.cmake
174 lines (156 loc) · 8.15 KB
/
rtt_macros.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#
# Include and link against required stuff
#
#
# RTT supplies header files which should be included when
# using RTT. Each subdir should use this macro
# to supply its header-files.
#
# Usage: GLOBAL_ADD_INCLUDE( RELATIVE_LOCATION hpp1, hpp2 ...)
MACRO( GLOBAL_ADD_INCLUDE COMPONENT_LOCATION )
INSTALL(FILES ${ARGN} DESTINATION include/${COMPONENT_LOCATION} COMPONENT headers)
ENDMACRO( GLOBAL_ADD_INCLUDE COMPONENT_LOCATION )
#
# Sources should add themselves by calling 'GLOBAL_ADD_SRC'
# instead of 'ADD_LIBRARY' in CMakeLists.txt.
#
# This gives a centralised location where all sources are registered
# and lets us make the library in just one place.
#
#
# Usage: GLOBAL_ADD_SRC( src1 src2 src3 )
#
MACRO( GLOBAL_ADD_SRC )
STRING(LENGTH "${ARGN}" NOTEMPTY)
IF(NOTEMPTY)
SET (ENV{GLOBAL_LIBRARY_SRCS} "$ENV{GLOBAL_LIBRARY_SRCS}${ARGN};" )
ENDIF(NOTEMPTY)
ENDMACRO( GLOBAL_ADD_SRC )
#
# Usage: ADD_RTT_TYPEKIT( name version file1.cpp [file2.cpp...] )
#
# Requires: OROCOS_TARGET,
# PROJ_BINARY_DIR (optional, if given plugin is also installed in PROJ_BINARY_DIR/orocos/types ),
# RTT_DEFINITIONS (optional, added as COMPILE_DEFINITIONS to target's properties).
#
# The resulting CMake target's name is '${name}-${OROCOS_TARGET}_plugin'
# The resulting filename is '${name}-${OROCOS_TARGET}[.dll|.so|...]'
#
macro(ADD_RTT_TYPEKIT name version)
ADD_LIBRARY(${name}-${OROCOS_TARGET}_plugin SHARED ${ARGN})
STRING( REGEX MATCHALL "[0-9]+" versions ${version} )
LIST( GET versions 0 version_major)
LIST( GET versions 1 version_minor)
LIST( GET versions 2 version_patch)
SET_TARGET_PROPERTIES( ${name}-${OROCOS_TARGET}_plugin PROPERTIES
VERSION "${version}"
SOVERSION "${version_major}.${version_minor}"
OUTPUT_NAME ${name}-${OROCOS_TARGET}
COMPILE_DEFINITIONS "${RTT_DEFINITIONS}"
INSTALL_RPATH_USE_LINK_PATH 1
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib/orocos${OROCOS_SUFFIX};${CMAKE_INSTALL_PREFIX}/lib;${AC_INSTALL_DIR}"
INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib/orocos${OROCOS_SUFFIX}/types"
CLEAN_DIRECT_OUTPUT 1)
IF (UNIX AND NOT APPLE)
SET_TARGET_PROPERTIES( ${name}-${OROCOS_TARGET}_plugin PROPERTIES
LINK_FLAGS "-Wl,-zdefs")
ENDIF ()
if (DLL_EXPORT_PREFIX)
string(TOUPPER ${DLL_EXPORT_PREFIX} UDLL_EXPORT_PREFIX )
set(DEFINE_PREFIX "RTT_${UDLL_EXPORT_PREFIX}_DLL_EXPORT")
SET_TARGET_PROPERTIES( ${name}-${OROCOS_TARGET}_plugin PROPERTIES DEFINE_SYMBOL "${DEFINE_PREFIX}")
endif()
target_link_libraries(${name}-${OROCOS_TARGET}_plugin orocos-rtt-${OROCOS_TARGET}_dynamic)
if(DLL_EXPORT_PREFIX)
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/rtt-${DLL_EXPORT_PREFIX}-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/rtt-${DLL_EXPORT_PREFIX}-config.h @ONLY)
endif()
# Note: typkits don't get the symlinks
install(TARGETS ${name}-${OROCOS_TARGET}_plugin
EXPORT ${LIBRARY_EXPORT_FILE}
ARCHIVE DESTINATION lib/orocos${OROCOS_SUFFIX}/types
LIBRARY DESTINATION lib/orocos${OROCOS_SUFFIX}/types
RUNTIME DESTINATION lib/orocos${OROCOS_SUFFIX}/types)
get_target_property(TYPEKITLIB_DIR ${name}-${OROCOS_TARGET}_plugin LOCATION)
get_target_property(DEBUG_TYPEKITLIB_DIR ${name}-${OROCOS_TARGET}_plugin DEBUG_LOCATION)
# Only copy if it was built:
if (WIN32)
# In win32, we don't know which one will be built, so we prefix it with 'if exist', which is not portable.
# Only the first comment is displayed, so its a non-filename specific comment.
add_custom_command(TARGET ${name}-${OROCOS_TARGET}_plugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJ_BINARY_DIR}/rtt/types"
COMMAND if exist ${TYPEKITLIB_DIR} ${CMAKE_COMMAND} -E copy "${TYPEKITLIB_DIR}" "${PROJ_BINARY_DIR}/rtt/types"
COMMENT "Copying ${name}-${OROCOS_TARGET}_plugin to ${PROJ_BINARY_DIR}/rtt/types" VERBATIM)
add_custom_command(TARGET ${name}-${OROCOS_TARGET}_plugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJ_BINARY_DIR}/rtt/types"
COMMAND if exist ${DEBUG_TYPEKITLIB_DIR} ${CMAKE_COMMAND} -E copy "${DEBUG_TYPEKITLIB_DIR}" "${PROJ_BINARY_DIR}/rtt/types"
VERBATIM)
else()
add_custom_command(TARGET ${name}-${OROCOS_TARGET}_plugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJ_BINARY_DIR}/rtt/types"
COMMAND ${CMAKE_COMMAND} -E copy "${TYPEKITLIB_DIR}" "${PROJ_BINARY_DIR}/rtt/types"
COMMENT "Copying ${TYPEKITLIB_DIR} to ${PROJ_BINARY_DIR}/rtt/types" VERBATIM)
endif()
endmacro(ADD_RTT_TYPEKIT name)
#
# Usage: ADD_RTT_PLUGIN( name version file1.cpp [file2.cpp...] )
#
# Requires: OROCOS_TARGET,
# PROJ_BINARY_DIR (optional, if given plugin is also installed in PROJ_BINARY_DIR/orocos/plugins ),
# RTT_DEFINITIONS (optional, added as COMPILE_DEFINITIONS to target's properties).
# DLL_EXPORT_PREFIX (optional, defines the symbol RTT_${UDLL_EXPORT_PREFIX}_DLL_EXPORT used for DLL import/export symbols on win32
#
# The resulting CMake target's name is '${name}-${OROCOS_TARGET}_plugin'
# The resulting filename is '${name}-${OROCOS_TARGET}[.dll|.so|...]'
#
macro(ADD_RTT_PLUGIN name version)
ADD_LIBRARY(${name}-${OROCOS_TARGET}_plugin SHARED ${ARGN})
STRING( REGEX MATCHALL "[0-9]+" versions ${version} )
LIST( GET versions 0 version_major)
LIST( GET versions 1 version_minor)
LIST( GET versions 2 version_patch)
SET_TARGET_PROPERTIES( ${name}-${OROCOS_TARGET}_plugin PROPERTIES
VERSION "${version}"
SOVERSION "${version_major}.${version_minor}"
OUTPUT_NAME ${name}-${OROCOS_TARGET}
COMPILE_DEFINITIONS "${RTT_DEFINITIONS}"
INSTALL_RPATH_USE_LINK_PATH 1
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib/orocos${OROCOS_SUFFIX}/types;${CMAKE_INSTALL_PREFIX}/lib;${AC_INSTALL_DIR}"
INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib/orocos${OROCOS_SUFFIX}/plugins"
CLEAN_DIRECT_OUTPUT 1)
IF (UNIX AND NOT APPLE)
SET_TARGET_PROPERTIES( ${name}-${OROCOS_TARGET}_plugin PROPERTIES
LINK_FLAGS "-Wl,-zdefs")
ENDIF ()
if (DLL_EXPORT_PREFIX)
string(TOUPPER ${DLL_EXPORT_PREFIX} UDLL_EXPORT_PREFIX )
set(DEFINE_PREFIX "RTT_${UDLL_EXPORT_PREFIX}_DLL_EXPORT")
SET_TARGET_PROPERTIES( ${name}-${OROCOS_TARGET}_plugin PROPERTIES DEFINE_SYMBOL "${DEFINE_PREFIX}")
endif()
target_link_libraries(${name}-${OROCOS_TARGET}_plugin orocos-rtt-${OROCOS_TARGET}_dynamic)
if(DLL_EXPORT_PREFIX)
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/rtt-${DLL_EXPORT_PREFIX}-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/rtt-${DLL_EXPORT_PREFIX}-config.h @ONLY)
endif()
# Note: plugins do get the symlinks
install(TARGETS ${name}-${OROCOS_TARGET}_plugin
ARCHIVE DESTINATION lib/orocos${OROCOS_SUFFIX}/plugins
LIBRARY DESTINATION lib/orocos${OROCOS_SUFFIX}/plugins
RUNTIME DESTINATION lib/orocos${OROCOS_SUFFIX}/plugins)
get_target_property(PLUGINLIB_DIR ${name}-${OROCOS_TARGET}_plugin LOCATION)
get_target_property(DEBUG_PLUGINLIB_DIR ${name}-${OROCOS_TARGET}_plugin DEBUG_LOCATION)
if (WIN32)
# In win32, we don't know which one will be built, so we prefix it with 'if exist', which is not portable.
add_custom_command(TARGET ${name}-${OROCOS_TARGET}_plugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJ_BINARY_DIR}/rtt/plugins"
COMMAND if exist ${PLUGINLIB_DIR} ${CMAKE_COMMAND} -E copy "${PLUGINLIB_DIR}" "${PROJ_BINARY_DIR}/rtt/plugins"
COMMENT "Copying ${name}-${OROCOS_TARGET}_plugin to ${PROJ_BINARY_DIR}/rtt/plugins" VERBATIM)
add_custom_command(TARGET ${name}-${OROCOS_TARGET}_plugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJ_BINARY_DIR}/rtt/plugins"
COMMAND if exist ${DEBUG_PLUGINLIB_DIR} ${CMAKE_COMMAND} -E copy "${DEBUG_PLUGINLIB_DIR}" "${PROJ_BINARY_DIR}/rtt/plugins"
VERBATIM)
else()
add_custom_command(TARGET ${name}-${OROCOS_TARGET}_plugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJ_BINARY_DIR}/rtt/plugins"
COMMAND ${CMAKE_COMMAND} -E copy "${PLUGINLIB_DIR}" "${PROJ_BINARY_DIR}/rtt/plugins"
COMMENT "Copying ${PLUGINLIB_DIR} to ${PROJ_BINARY_DIR}/rtt/plugins" VERBATIM)
endif()
endmacro(ADD_RTT_PLUGIN name)