Skip to content

Commit f0effec

Browse files
author
Julián Bermúdez Ortega
authored
Refactor CMakeLists.txt. (#28)
1 parent 85ec50d commit f0effec

File tree

2 files changed

+141
-209
lines changed

2 files changed

+141
-209
lines changed

micro_ros_agent/CMakeLists.txt

Lines changed: 141 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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.
@@ -12,246 +12,189 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
16-
# Set CMake version
1715
cmake_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+
)
2320
set(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)
3724
find_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

Comments
 (0)