1- # Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima).
1+ # Copyright 2018-present Proyectos y Sistemas de Mantenimiento SL (eProsima).
22#
33# Licensed under the Apache License, Version 2.0 (the "License");
44# you may not use this file except in compliance with the License.
1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15-
16- # Set CMake version
1715cmake_minimum_required (VERSION 3.5)
1816
19- # Set proyect name
20- project (micro_ros_agent)
21-
22-
17+ option (UROSAGENT_GENERATE_PROFILE
18+ "Generates agent.refs according to the .msgs provided in the .repos" OFF
19+ )
2320set (CMAKE_C_CLANG_TIDY clang-tidy -checks=*)
2421
25- # Default to C++14
26- if (NOT CMAKE_CXX_STANDARD)
27- set (CMAKE_CXX_STANDARD 14)
28- endif ()
22+ project (micro_ros_agent LANGUAGES CXX)
2923
30- if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
31- add_compile_options (-Wall -Wextra -Wpedantic)
32- endif ()
33-
34-
35- # Find packages depencences
36- find_package (rosidl_cmake REQUIRED)
3724find_package (ament_cmake REQUIRED)
38- find_package (fastcdr REQUIRED CONFIG)
39- find_package (fastrtps REQUIRED CONFIG)
40- find_package (microxrcedds_agent REQUIRED CONFIG)
41- find_package (ament_cmake_python REQUIRED)
42-
43-
44- # Export dependencies to downstream packages
45- ament_export_dependencies(fastcdr)
46- ament_export_dependencies(fastrtps)
47- ament_export_dependencies(microxrcedds_agent)
48-
49-
50- # Set variables
51- set (_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR} /python" )
52-
53- set (_XML_INTERFACE_GEN_BIN "${_OUTPUT_PATH} /bin/Xml_interface_gen.py" )
54- normalize_path(_XML_INTERFACE_GEN_BIN "${_XML_INTERFACE_GEN_BIN} " )
25+ find_package (microxrcedds_agent REQUIRED)
5526
56- set (_XML_DEFAULT_READ_BIN "${_OUTPUT_PATH} /bin/Xml_read_default_profiles.py" )
57- normalize_path(_XML_DEFAULT_READ_BIN "${_XML_DEFAULT_READ_BIN} " )
58-
59- set (_PYTHON_PKG_TOOL ${PROJECT_NAME} )
60-
61- set (_RESOURCE_DIR "${_OUTPUT_PATH} /resource" )
62- normalize_path(_RESOURCE_DIR "${_RESOURCE_DIR} " )
27+ add_executable (${PROJECT_NAME} src/main.cpp)
6328
29+ target_link_libraries (${PROJECT_NAME}
30+ PRIVATE
31+ microxrcedds_agent
32+ $<$<BOOL :$<PLATFORM_ID:Linux>>:rt>
33+ $<$<BOOL :$<PLATFORM_ID:Linux>>:dl>
34+ )
6435
65- set (_DEFAULT_FASTRTPS_PROFILES_PATH "${_OUTPUT_PATH} /gen/DEFAULT_FASTRTPS_PROFILES.xml" )
66- normalize_path(_DEFAULT_FASTRTPS_PROFILES_PATH "${_DEFAULT_FASTRTPS_PROFILES_PATH} " )
36+ set_target_properties (${PROJECT_NAME} PROPERTIES
37+ CXX_STANDARD
38+ 11
39+ CXX_STANDARD_REQUIRED
40+ YES
41+ )
6742
43+ target_compile_options (${PROJECT_NAME}
44+ PRIVATE
45+ $<$<OR :$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wall>
46+ $<$<OR :$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wextra>
47+ $<$<OR :$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wpedantic>
48+ )
6849
69- # Get colcon call dir
70- get_filename_component (_COLCON_CALL_DIR "${PROJECT_BINARY_DIR} " DIRECTORY )
71- get_filename_component (_COLCON_CALL_DIR "${_COLCON_CALL_DIR} " DIRECTORY )
50+ ament_export_dependencies(microxrcedds_agent)
7251
52+ ament_package()
7353
74- # Generate python header
75- set (
76- _PYTHON_SCRIPT_HEAD
77- "
78- import os\n
79- import sys\n
80- sys.path.append('${_OUTPUT_PATH} ')\n
81- from ${_PYTHON_PKG_TOOL} import *\n
82- "
83- )
54+ install (
55+ TARGETS
56+ ${PROJECT_NAME}
57+ DESTINATION
58+ lib/${PROJECT_NAME}
59+ )
8460
61+ if (UROSAGENT_GENERATE_PROFILE)
62+ set (_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR} /python" )
8563
86- # Copy pyton files
87- file (COPY "bin" " ${_PYTHON_PKG_TOOL} " "resource" DESTINATION " ${CMAKE_CURRENT_BINARY_DIR} /python " )
64+ set (_XML_INTERFACE_GEN_BIN " ${_OUTPUT_PATH} /bin/Xml_interface_gen.py" )
65+ normalize_path(_XML_INTERFACE_GEN_BIN " ${_XML_INTERFACE_GEN_BIN} " )
8866
67+ set (_XML_DEFAULT_READ_BIN "${_OUTPUT_PATH} /bin/Xml_read_default_profiles.py" )
68+ normalize_path(_XML_DEFAULT_READ_BIN "${_XML_DEFAULT_READ_BIN} " )
8969
90- # Extract all packages and manifiest paths
91- execute_process (
92- COMMAND
93- "${PYTHON_EXECUTABLE} "
94- "-c"
95- "${_PYTHON_SCRIPT_HEAD} for package in GetInterfacePackages(GetPackageList('${_COLCON_CALL_DIR} ')): print ('%s,%s' % (package, GetPackageName(package)))"
96- OUTPUT_VARIABLE _packages
97- RESULT_VARIABLE _result
98- OUTPUT_STRIP_TRAILING_WHITESPACE
99- )
100- if (NOT _result EQUAL 0)
101- message (FATAL_ERROR "Error finding xml packages" )
102- endif ()
70+ set (_PYTHON_PKG_TOOL ${PROJECT_NAME} )
10371
72+ set (_RESOURCE_DIR "${_OUTPUT_PATH} /resource" )
73+ normalize_path(_RESOURCE_DIR "${_RESOURCE_DIR} " )
10474
105- # Convert output to list
106- string (REPLACE " \n " ";" _packages ${_packages} )
75+ set (_DEFAULT_FASTRTPS_PROFILES_PATH " ${_OUTPUT_PATH} /gen/DEFAULT_FASTRTPS_PROFILES.xml" )
76+ normalize_path(_DEFAULT_FASTRTPS_PROFILES_PATH " ${_DEFAULT_FASTRTPS_PROFILES_PATH} " )
10777
78+ get_filename_component (_COLCON_CALL_DIR "${PROJECT_BINARY_DIR} " DIRECTORY )
79+ get_filename_component (_COLCON_CALL_DIR "${_COLCON_CALL_DIR} " DIRECTORY )
10880
109- # Extract all msg from each package (stored in ${package}_MSG_FILES)
110- set (ALL_MSG_FILES "" )
111- foreach (package ${_packages} )
112-
113- # Extract info
114- string (REPLACE "," ";" package ${package} )
115- list ( GET package 0 package_file)
116- list ( GET package 1 package )
81+ set (_PYTHON_SCRIPT_HEAD
82+ "
83+ import os \n
84+ import sys \n
85+ sys.path.append(' ${_OUTPUT_PATH} ') \n
86+ from ${_PYTHON_PKG_TOOL} import * \n
87+ "
88+ )
11789
90+ file (
91+ COPY
92+ "bin" "${_PYTHON_PKG_TOOL} " "resource"
93+ DESTINATION
94+ "${CMAKE_CURRENT_BINARY_DIR} /python"
95+ )
11896
119- # Get all msg files
12097 execute_process (
121- COMMAND
122- "${PYTHON_EXECUTABLE} "
123- "-c"
124- "${_PYTHON_SCRIPT_HEAD} for msg in GetInterfacePackageMsgs('${package_file} '): print ('%s' % msg)"
125- OUTPUT_VARIABLE ${package} _MSG_FILES
126- RESULT_VARIABLE _result
127- OUTPUT_STRIP_TRAILING_WHITESPACE
128- )
129- if (NOT _result EQUAL 0)
130- message (FATAL_ERROR "Error finding .msg files" )
131- endif ()
98+ COMMAND
99+ "${PYTHON_EXECUTABLE} "
100+ "-c"
101+ "${_PYTHON_SCRIPT_HEAD} for package in GetInterfacePackages(GetPackageList('${_COLCON_CALL_DIR} ')): print ('%s,%s' % (package, GetPackageName(package)))"
102+ OUTPUT_VARIABLE
103+ _packages
104+ RESULT_VARIABLE
105+ _result
106+ OUTPUT_STRIP_TRAILING_WHITESPACE
107+ )
132108
133- # Skip if there are no msgs to create
134- if (${package} _MSG_FILES STREQUAL "" )
135- continue ()
109+ if (NOT _result EQUAL 0)
110+ message (FATAL_ERROR "Error finding XML packages" )
136111 endif ()
137112
138- # Generate list
139- string (REPLACE "\n " ";" ${package} _MSG_FILES ${${package} _MSG_FILES})
140-
141- endforeach ()
113+ string (REPLACE "\n " ";" _packages ${_packages} )
142114
115+ set (ALL_MSG_FILES "" )
116+ foreach (package ${_packages} )
143117
144- # Append defaul xml profiles
145- execute_process (
146- COMMAND "${PYTHON_EXECUTABLE} " "${_XML_DEFAULT_READ_BIN} " "--default-xml-path" "${_RESOURCE_DIR} "
147- OUTPUT_VARIABLE _XmlDoc
148- RESULT_VARIABLE _result
149- )
150- if (NOT _result EQUAL 0)
151- message (FATAL_ERROR "Error in typesuppor generation" )
152- endif ()
153-
154-
155- # Create one xml for each message
156- foreach (package ${_packages} )
157- string (REPLACE "," ";" package ${package} )
158- list (GET package 0 package_file)
159- list (GET package 1 package)
160-
118+ string (REPLACE "," ";" package ${package} )
119+ list (GET package 0 package_file)
120+ list (GET package 1 package)
161121
162- # Skip this generation if there are no msgs to process
163- if (${package} _MSG_FILES STREQUAL "" )
164- continue ()
165- endif ()
122+ execute_process (
123+ COMMAND
124+ "${PYTHON_EXECUTABLE} "
125+ "-c"
126+ "${_PYTHON_SCRIPT_HEAD} for msg in GetInterfacePackageMsgs('${package_file} '): print ('%s' % msg)"
127+ OUTPUT_VARIABLE
128+ ${package} _MSG_FILES
129+ RESULT_VARIABLE
130+ _result
131+ OUTPUT_STRIP_TRAILING_WHITESPACE
132+ )
166133
134+ if (NOT _result EQUAL 0)
135+ message (FATAL_ERROR "Error finding .msg files" )
136+ endif ()
167137
138+ if (${package} _MSG_FILES STREQUAL "" )
139+ continue ()
140+ endif ()
168141
169- # generate script argument file
170- set (generator_arguments_file "${_OUTPUT_PATH} /XML_ArgFiles/${package} _Args.json" )
171- rosidl_write_generator_arguments(
172- "${generator_arguments_file} "
173- PACKAGE_NAME "${package} "
174- ROS_INTERFACE_FILES "${${package} _MSG_FILES}"
175- ROS_INTERFACE_DEPENDENCIES "NULL"
176- OUTPUT_DIR "NULL"
177- TEMPLATE_DIR "NULL"
178- TARGET_DEPENDENCIES "NULL"
179- ADDITIONAL_FILES ""
180- )
142+ string (REPLACE "\n " ";" ${package} _MSG_FILES ${${package} _MSG_FILES})
181143
144+ endforeach ()
182145
183- # execute python script
184- execute_process (
185- COMMAND "${PYTHON_EXECUTABLE} " "${_XML_INTERFACE_GEN_BIN} " --generator-arguments-file "${generator_arguments_file} "
186- OUTPUT_VARIABLE _XmlGen
187- RESULT_VARIABLE _result
146+ execute_process (
147+ COMMAND
148+ "${PYTHON_EXECUTABLE} " "${_XML_DEFAULT_READ_BIN} " "--default-xml-path" "${_RESOURCE_DIR} "
149+ OUTPUT_VARIABLE
150+ _XmlDoc
151+ RESULT_VARIABLE
152+ _result
188153 )
154+
189155 if (NOT _result EQUAL 0)
190156 message (FATAL_ERROR "Error in typesuppor generation" )
191157 endif ()
192158
159+ foreach (package ${_packages} )
160+ string (REPLACE "," ";" package ${package} )
161+ list (GET package 0 package_file)
162+ list (GET package 1 package)
163+
164+ if (${package} _MSG_FILES STREQUAL "" )
165+ continue ()
166+ endif ()
167+
168+ set (generator_arguments_file "${_OUTPUT_PATH} /XML_ArgFiles/${package} _Args.json" )
169+ rosidl_write_generator_arguments(
170+ "${generator_arguments_file} "
171+ PACKAGE_NAME "${package} "
172+ ROS_INTERFACE_FILES "${${package} _MSG_FILES}"
173+ ROS_INTERFACE_DEPENDENCIES "NULL"
174+ OUTPUT_DIR "NULL"
175+ TEMPLATE_DIR "NULL"
176+ TARGET_DEPENDENCIES "NULL"
177+ ADDITIONAL_FILES ""
178+ )
193179
194- # Strore xml
195- set (_XmlDoc "${_XmlDoc}${_XmlGen} " )
196-
197- endforeach ()
198-
199-
200- # Close profile
201- set (_XmlDoc "<profiles>\n ${_XmlDoc} </profiles>\n " )
202-
203-
204- # Save
205- file (WRITE "${_DEFAULT_FASTRTPS_PROFILES_PATH} " "${_XmlDoc} " )
206-
207-
208- # Only compile uROS agent if rclcpp is found
209- find_package (rclcpp QUIET )
210- if (rclcpp_FOUND)
211- find_package (microxrcedds_agent REQUIRED)
212-
213- add_executable (${PROJECT_NAME} src/main.cpp)
214- ament_target_dependencies(
215- ${PROJECT_NAME}
216- rclcpp
217- microxrcedds_agent
218- )
219-
220- # TODO(Javier) Temporal until thread error is solver
221- target_link_libraries (
222- ${PROJECT_NAME}
223- microxrcedds_agent
224- )
225-
226- else ()
227- message ("uROS agent node will be not build" )
228- endif ()
229-
230-
231-
180+ execute_process (
181+ COMMAND
182+ "${PYTHON_EXECUTABLE} " "${_XML_INTERFACE_GEN_BIN} " --generator-arguments-file "${generator_arguments_file} "
183+ OUTPUT_VARIABLE
184+ _XmlGen
185+ RESULT_VARIABLE
186+ _result
187+ )
232188
233- # Install the package.xml file, and generate code for ``find_package`` so that other packages can get information about this package.
234- ament_package()
189+ if (NOT _result EQUAL 0)
190+ message (FATAL_ERROR "Error in typesuppor generation" )
191+ endif ()
235192
193+ set (_XmlDoc "${_XmlDoc}${_XmlGen} " )
236194
237- # Only install if uROS_Agent is comiled
238- if (rclcpp_FOUND)
239- install (TARGETS
240- ${PROJECT_NAME}
241- DESTINATION lib/${PROJECT_NAME}
242- )
243- endif ()
244-
245-
246- #Install
247- install (
248- FILES "${_DEFAULT_FASTRTPS_PROFILES_PATH} "
249- DESTINATION lib/${PROJECT_NAME}
250- )
195+ endforeach ()
251196
197+ set (_XmlDoc "<profiles>\n ${_XmlDoc} </profiles>\n " )
252198
253- # Install package
254- #install(
255- # DIRECTORY cmake resource
256- # DESTINATION share/${PROJECT_NAME}
257- #)
199+ file (WRITE "${_DEFAULT_FASTRTPS_PROFILES_PATH} " "${_XmlDoc} " )
200+ endif ()
0 commit comments