forked from clydemcqueen/gscam2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
171 lines (132 loc) · 4.4 KB
/
CMakeLists.txt
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
cmake_minimum_required(VERSION 3.12)
project(gscam2)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# Default to SHARED, but user can turn this off to get STATIC
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
# Gstreamer doesn't provide CMake files
find_package(PkgConfig REQUIRED)
pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0 IMPORTED_TARGET)
pkg_check_modules(GST_APP REQUIRED gstreamer-app-1.0 IMPORTED_TARGET)
find_package(ament_cmake REQUIRED)
find_package(camera_calibration_parsers REQUIRED)
find_package(camera_info_manager REQUIRED)
find_package(class_loader REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_components REQUIRED)
find_package(rclpy REQUIRED)
find_package(ros2_shared REQUIRED)
find_package(sensor_msgs REQUIRED)
# Create ament index resource which references the libraries in the binary dir
set(node_plugins "")
# How to build a library:
# https://docs.ros.org/en/humble/How-To-Guides/Ament-CMake-Documentation.html#building-a-library
#=============
# GSCam node
#=============
add_library(gscam_node src/gscam_node.cpp)
add_library(gscam2::gscam_node ALIAS gscam_node)
target_compile_definitions(gscam_node
PRIVATE "COMPOSITION_BUILDING_DLL")
target_include_directories(gscam_node
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_link_libraries(gscam_node
PRIVATE
camera_calibration_parsers::camera_calibration_parsers
camera_info_manager::camera_info_manager
class_loader::class_loader
rclcpp_components::component
ros2_shared::ros2_shared
sensor_msgs::sensor_msgs_library
PUBLIC
rclcpp::rclcpp
PkgConfig::GSTREAMER
PkgConfig::GST_APP)
rclcpp_components_register_nodes(gscam_node "gscam2::GSCamNode")
set(node_plugins "${node_plugins}gscam2::GSCamNode;$<TARGET_FILE:gscam_node>\n")
#=============
# Test subscriber node
#=============
add_library(subscriber_node src/subscriber_node.cpp)
add_library(gscam2::subscriber_node ALIAS subscriber_node)
target_compile_definitions(subscriber_node
PRIVATE "COMPOSITION_BUILDING_DLL")
target_include_directories(subscriber_node
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_link_libraries(subscriber_node
PRIVATE
class_loader::class_loader
rclcpp_components::component
sensor_msgs::sensor_msgs_library
PUBLIC
rclcpp::rclcpp)
rclcpp_components_register_nodes(subscriber_node "gscam2::ImageSubscriberNode")
set(node_plugins "${node_plugins}gscam2::ImageSubscriberNode;$<TARGET_FILE:subscriber_node>\n")
#=============
# GSCam main, statically linked to make IDE debugging easier
#=============
add_executable(gscam_main
src/gscam_main.cpp)
target_link_libraries(gscam_main
PRIVATE
gscam2::gscam_node)
#=============
# Manual composition of camera and subscriber nodes, IPC=true
#=============
add_executable(ipc_test_main src/ipc_test_main.cpp)
target_link_libraries(ipc_test_main
PRIVATE
gscam2::gscam_node
gscam2::subscriber_node
sensor_msgs::sensor_msgs_library)
#=============
# Test
#=============
if(BUILD_TESTING)
# Load & run linters listed in package.xml
find_package(ament_lint_auto REQUIRED)
ament_lint_auto_find_test_dependencies()
# Smoke test
find_package(ament_cmake_gtest)
ament_add_gtest(smoke_test
test/smoke_test.cpp
ENV GSCAM_CONFIG="videotestsrc pattern=snow ! capsfilter caps=video/x-raw,width=800,height=600 ! videoconvert")
if(TARGET smoke_test)
target_link_libraries(smoke_test
gscam2::gscam_node
sensor_msgs::sensor_msgs_library)
endif()
endif()
#=============
# Install
#=============
install(DIRECTORY include/${PROJECT_NAME}
DESTINATION include)
install(TARGETS gscam_node subscriber_node
EXPORT gscam2_targets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
install(TARGETS gscam_main ipc_test_main
DESTINATION lib/${PROJECT_NAME})
install(DIRECTORY cfg launch
DESTINATION share/${PROJECT_NAME})
#=============
# Export targets, ament_export_targets will call "install(EXPORT ...)"
#=============
ament_export_targets(gscam2_targets HAS_LIBRARY_TARGET)
ament_export_dependencies(rclcpp sensor_msgs)
ament_package()