Skip to content

Commit 017d43b

Browse files
authored
Separate RobotecGPULidar project to external directory (#42)
* Separate RobotecGPULidar project to external directory * Add expected project tree info * Do not hardcode CMAKE_INSTALL_PREFIX * Make project files read-only. This commit changes RGL download directory from SOURCE_DIR to BINARY_DIR * Fix brackets
1 parent 01d26eb commit 017d43b

File tree

5 files changed

+90
-46
lines changed

5 files changed

+90
-46
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,6 @@
3636
build
3737
install
3838
cmake-build-debug
39-
RGLServerPlugin/include/rgl
39+
40+
external/*
41+
!external/CMakeLists.txt

CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
cmake_minimum_required(VERSION 3.16)
1+
cmake_minimum_required(VERSION 3.21)
22
project(RGLGazeboPlugin)
33

4-
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/install")
4+
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
5+
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/install")
6+
endif()
57

8+
add_subdirectory(external)
69
add_subdirectory(RGLServerPlugin)
710
add_subdirectory(RGLVisualize)

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,28 @@ Key features:
5353
```shell
5454
mkdir build
5555
cd build
56-
cmake .. # Add `-DRGL_FORCE_DOWNLOAD=ON` to make sure the downloaded RGL will be up-to-date
56+
cmake ..
5757
make -j
5858
make install
5959
cd ..
6060
export GZ_SIM_SYSTEM_PLUGIN_PATH=`pwd`/install/RGLServerPlugin:$GZ_SIM_SYSTEM_PLUGIN_PATH
6161
export GZ_GUI_PLUGIN_PATH=`pwd`/install/RGLVisualize:$GZ_GUI_PLUGIN_PATH
6262
```
63+
64+
#### Using custom build of RobotecGPULidar
65+
66+
By default, the `RGLGazebPlugin` downloads `RobotecGPULidar` binaries from [the official release](https://github.com/RobotecAI/RobotecGPULidar/releases). To use your own build of `RobotecGPULidar`, set the following CMake variables when configuring the project:
67+
```shell
68+
# RGL_CUSTOM_LIBRARY_PATH - Path to the custom RobotecGPULidar library build
69+
# RGL_CUSTOM_API_HEADER_PATH - Path to the include directory with API headers compatible with the custom library build
70+
# (`include` directory of `RobotecGPULidar` project)
71+
# Example:
72+
cmake \
73+
-DRGL_CUSTOM_LIBRARY_PATH="$HOME/RobotecGPULidar/build/lib/libRobotecGPULidar.so" \
74+
-DRGL_CUSTOM_API_HEADER_PATH="$HOME/RobotecGPULidar/include" \
75+
..
76+
```
77+
6378
## Demo:
6479

6580
![](docs/videos/prius.gif)

RGLServerPlugin/CMakeLists.txt

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.16)
1+
cmake_minimum_required(VERSION 3.21)
22
project(RGLServerPlugin)
33
set(CMAKE_CXX_STANDARD 20)
44

@@ -9,59 +9,23 @@ set(GZ_PLUGIN_VER ${gz-plugin2_VERSION_MAJOR})
99
gz_find_package(gz-sim8 REQUIRED)
1010
set(GZ_SIM_VER ${gz-sim8_VERSION_MAJOR})
1111

12-
1312
include_directories(include)
1413

15-
# Use this variable to make sure the downloaded RGL will be up-to-date
16-
set(RGL_FORCE_DOWNLOAD OFF CACHE BOOL
17-
"Removes existing RGL binaries and downloads a new one")
18-
19-
set(RGL_TAG "v0.17.0")
20-
21-
set(RGL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/include/rgl")
22-
set(RGL_SO_FILENAME "libRobotecGPULidar.so")
23-
set(RGL_SO_PATH "${RGL_PATH}/${RGL_SO_FILENAME}")
24-
set(RGL_API_HEADER_PATH "${RGL_PATH}/api/core.h")
25-
26-
set(RGL_SO_ZIP_FILENAME "RGL-core-linux-x64.zip")
27-
set(RGL_SO_ZIP_URL "https://github.com/RobotecAI/RobotecGPULidar/releases/download/${RGL_TAG}/${RGL_SO_ZIP_FILENAME}")
28-
set(RGL_API_HEADER_URL "https://raw.githubusercontent.com/RobotecAI/RobotecGPULidar/${RGL_TAG}/include/rgl/api/core.h")
29-
30-
if (RGL_FORCE_DOWNLOAD)
31-
file(REMOVE_RECURSE ${RGL_PATH})
32-
endif()
33-
34-
# Download RGL library
35-
if(NOT EXISTS ${RGL_SO_PATH})
36-
file(DOWNLOAD ${RGL_SO_ZIP_URL} ${RGL_PATH}/${RGL_SO_ZIP_FILENAME})
37-
file(ARCHIVE_EXTRACT INPUT ${RGL_PATH}/${RGL_SO_ZIP_FILENAME}
38-
DESTINATION ${RGL_PATH}
39-
PATTERNS ${RGL_SO_FILENAME}
40-
VERBOSE
41-
)
42-
file(REMOVE ${RGL_PATH}/${RGL_SO_ZIP_FILENAME})
43-
endif()
44-
45-
# Download RGL API header
46-
if(NOT EXISTS ${RGL_API_PATH})
47-
file(DOWNLOAD ${RGL_API_HEADER_URL} ${RGL_API_HEADER_PATH})
48-
endif()
49-
50-
set(RobotecGPULidar ${RGL_SO_PATH})
51-
5214
add_library(RGLServerPluginManager SHARED src/RGLServerPluginManager.cc src/Mesh.cc src/Utils.cc src/Scene.cc)
15+
target_include_directories(RGLServerPluginManager PRIVATE RobotecGPULidar)
5316
target_link_libraries(RGLServerPluginManager
5417
PRIVATE gz-plugin${GZ_PLUGIN_VER}::gz-plugin${GZ_PLUGIN_VER}
5518
PRIVATE gz-sim${GZ_SIM_VER}::gz-sim${GZ_SIM_VER}
56-
${RobotecGPULidar}
19+
PRIVATE RobotecGPULidar
5720
)
5821
set_target_properties(RGLServerPluginManager PROPERTIES INSTALL_RPATH "$ORIGIN")
5922

6023
add_library(RGLServerPluginInstance SHARED src/RGLServerPluginInstance.cc src/Lidar.cc src/Utils.cc src/LidarPatternLoader.cc)
24+
target_include_directories(RGLServerPluginInstance PRIVATE RobotecGPULidar)
6125
target_link_libraries(RGLServerPluginInstance
6226
PRIVATE gz-plugin${GZ_PLUGIN_VER}::gz-plugin${GZ_PLUGIN_VER}
6327
PRIVATE gz-sim${GZ_SIM_VER}::gz-sim${GZ_SIM_VER}
64-
${RobotecGPULidar}
28+
PRIVATE RobotecGPULidar
6529
)
6630
set_target_properties(RGLServerPluginInstance PROPERTIES INSTALL_RPATH "$ORIGIN")
6731

@@ -70,6 +34,7 @@ set_target_properties(RGLServerPluginInstance PROPERTIES INSTALL_RPATH "$ORIGIN"
7034
install(TARGETS RGLServerPluginInstance RGLServerPluginManager
7135
DESTINATION RGLServerPlugin
7236
)
73-
install(FILES ${RobotecGPULidar}
37+
# RobotecGPULidar needs to be installed manually as it is a dependent shared library
38+
install(IMPORTED_RUNTIME_ARTIFACTS RobotecGPULidar
7439
DESTINATION RGLServerPlugin
7540
)

external/CMakeLists.txt

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
2+
########################################################################
3+
# RobotecGPULidar
4+
########################################################################
5+
6+
set(RGL_PROJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/RobotecGPULidar")
7+
set(RGL_LIBRARY_DIR "${RGL_PROJECT_DIR}/lib")
8+
set(RGL_SO_FILENAME "libRobotecGPULidar.so")
9+
set(RGL_SO_PATH "${RGL_LIBRARY_DIR}/${RGL_SO_FILENAME}")
10+
set(RGL_INCLUDE_DIR "${RGL_PROJECT_DIR}/include")
11+
set(RGL_API_HEADERS_DIR "${RGL_INCLUDE_DIR}/rgl/api")
12+
13+
set(RGL_CUSTOM_LIBRARY_PATH "" CACHE FILEPATH
14+
"Path to the custom RobotecGPULidar library build. An alternative to release downloading.")
15+
set(RGL_CUSTOM_API_HEADER_PATH "" CACHE PATH
16+
"Path to the include directory with API headers compatible with the custom library build
17+
provided with `RGL_CUSTOM_LIBRARY_FILEPATH`.
18+
In most cases it will be path to `include` directory of RobotecGPULidar project")
19+
20+
if((RGL_CUSTOM_LIBRARY_PATH AND NOT RGL_CUSTOM_API_HEADER_PATH) OR
21+
(NOT RGL_CUSTOM_LIBRARY_PATH AND RGL_CUSTOM_API_HEADER_PATH))
22+
message(FATAL_ERROR "It is required to set both `RGL_CUSTOM_LIBRARY_PATH` and `RGL_CUSTOM_API_HEADER_PATH`\
23+
to finish custom RobotecGPULidar configuration")
24+
endif()
25+
26+
if(RGL_CUSTOM_LIBRARY_PATH AND RGL_CUSTOM_API_HEADER_PATH) # Copy custom RobotecGPULidar from the provided location
27+
file(MAKE_DIRECTORY ${RGL_LIBRARY_DIR})
28+
file(COPY ${RGL_CUSTOM_LIBRARY_PATH} DESTINATION ${RGL_LIBRARY_DIR})
29+
file(COPY ${RGL_CUSTOM_API_HEADER_PATH} DESTINATION ${RGL_PROJECT_DIR})
30+
else() # Download RobotecGPULidar from the release
31+
set(RGL_TAG "v0.17.0")
32+
set(RGL_API_CORE_HEADER_PATH "${RGL_API_HEADERS_DIR}/core.h")
33+
set(RGL_SO_ZIP_FILENAME "RGL-core-linux-x64.zip")
34+
set(RGL_SO_ZIP_URL "https://github.com/RobotecAI/RobotecGPULidar/releases/download/${RGL_TAG}/${RGL_SO_ZIP_FILENAME}")
35+
set(RGL_API_CORE_HEADER_URL "https://raw.githubusercontent.com/RobotecAI/RobotecGPULidar/${RGL_TAG}/include/rgl/api/core.h")
36+
37+
# Download RGL library if not present
38+
if(NOT EXISTS ${RGL_SO_PATH})
39+
set(RGL_SO_ZIP_PATH "${RGL_LIBRARY_DIR}/${RGL_SO_ZIP_FILENAME}")
40+
file(DOWNLOAD ${RGL_SO_ZIP_URL} ${RGL_SO_ZIP_PATH})
41+
file(ARCHIVE_EXTRACT INPUT ${RGL_SO_ZIP_PATH}
42+
DESTINATION ${RGL_LIBRARY_DIR}
43+
PATTERNS ${RGL_SO_FILENAME}
44+
VERBOSE
45+
)
46+
file(REMOVE ${RGL_SO_ZIP_PATH})
47+
endif()
48+
49+
# Download RGL API header if not present
50+
if(NOT EXISTS ${RGL_API_CORE_HEADER_PATH})
51+
file(DOWNLOAD ${RGL_API_CORE_HEADER_URL} ${RGL_API_CORE_HEADER_PATH})
52+
endif()
53+
endif()
54+
55+
add_library(RobotecGPULidar SHARED IMPORTED GLOBAL)
56+
set_target_properties(RobotecGPULidar PROPERTIES
57+
IMPORTED_LOCATION ${RGL_SO_PATH}
58+
INTERFACE_INCLUDE_DIRECTORIES ${RGL_INCLUDE_DIR}
59+
)

0 commit comments

Comments
 (0)