LidarView是基于ParaView的3D雷达数据感知,录制以及可视化开源平台。该平台由Kitware开发,可以播放Velodyne、Ouster、Opsys、Lumotive、RobSense、Hesai、LeiShen LS雷达数据,并支持其他格式数据播放的插件开发。源码地址如下:
LidarView / LidarView · GitLab
LidarView可以播放并回放以 .pcap 文件记录的数据流。
作为以ParaView框架开发的平台,LidarView可以很方便的支持ParaView的特征和插件。
本系列对Kitware提供的superbuild自动编译在windows系统下的操作进行说明。在windows系统下,superbuild会自动下载并编译LidarView以及其所需要的所有其他项目。
superbuild使用Ninja进行代码编译管理。Ninja是一个关注于速度的小型构建系统。它被设计为由更高级别的构建系统(如CMake)生成其输入文件,并且它被设计为尽可能快地运行构建。
superbuild下载为:
git clone --recursive https://gitlab.kitware.com/LidarView/lidarview-superbuild.git lvsb
本文对superbuild构建顶层CMakeLists.txt进行说明。
该文件主要定义了一些函数及宏,最后调用pvsb/superbuild文件夹下的CMakeLists.txt
初始配置
cmake_minimum_required(VERSION 3.12)
project(lidarview-superbuild)
# Set a default build type if none was specified
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to 'Release' as none was specified.")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
"MinSizeRel" "RelWithDebInfo")
endif()
LidarView支持的构建类型(CMAKE_BUILD_TYPE )为Release及RelWithDebInfo
cmake set的变量有3种类型,一般变量,缓存变量,环境变量。
缓存变量会缓存到CMakeCache.txt中,FORCE用于每次运行cmake强制更新CMakeCache中该变量的值,否则,会使用第一次赋予的值。当再次运行该cmake时,会到缓存文件中获取该值。
环境变量在全局范围内起作用,并且不会被缓存。用$ENV{<varianble>}访问,可以用set或者unset改变,改变只在当前运行的cmake中起作用。更改后的值不会写回调用进程,后续的构建或测试进程也看不到它们。
list(INSERT CMAKE_MODULE_PATH 0
"${CMAKE_CURRENT_LIST_DIR}/pvsb/cmake")
pvsb模块位于./pvsb/cmake文件夹下。cmake模块文件用为*.cmake,里面包含了一些宏和函数。编译运行使,该模块中的命令会在包含处得到执行,并在以后的地方能够访问该模块中的宏和函数。
CMAKE_MODULE_PATH:用逗号分隔的目录列表。include和find_package命令在检查cmake附带的默认模块之前,会先在该列表中的文件夹中搜索模块。
CMAKE_CURRENT_LIST_DIR:当前处理cmake文件(CMakeLists.txt 或者 *.cmake)的完整目录。
# Set LV_BUILD_PLATFORM
set(LV_DISTRO "${CMAKE_SYSTEM_NAME}")
if(UNIX AND NOT APPLE)
# Use Distro Name+Version instead of plain "Linux"
find_program(LSB_RELEASE_EXEC lsb_release)
if(NOT LSB_RELEASE_EXEC)
message(WARNING "Could not detect lsb_release executable")
else()
execute_process(COMMAND "${LSB_RELEASE_EXEC}" --short --id OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND "${LSB_RELEASE_EXEC}" --short --release OUTPUT_VARIABLE LSB_RELEASE_VERSION_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)
set(LV_DISTRO "${LSB_RELEASE_ID_SHORT}${LSB_RELEASE_VERSION_SHORT}")
endif()
endif()
set (LV_BUILD_PLATFORM "${LV_DISTRO}-${CMAKE_SYSTEM_PROCESSOR}")
# WIP: This is temporary, we can get rid of it once lidarview plugins
# are built inside superbuild
set(LidarView_SOURCE_DIR)
if (NOT lidarview_SOURCE_SELECTION STREQUAL "source")
set(LidarView_SOURCE_DIR "${CMAKE_SOURCE_DIR}/pvsb/superbuild/lidarview/src")
else()
set(LidarView_SOURCE_DIR "${lidarview_SOURCE_DIR}")
endif()
CMAKE_SYSTEM_NAME:构建操作系统的名称。请注意,在脚本模式下运行时,CMAKE_SYSTEM_NAME默认情况下没有设置任何值,因为它没有构建任何东西。相关资料请查看https://stackoverflow.com/questions/26434308/cmake-system-name-blankhttps://stackoverflow.com/questions/26434308/cmake-system-name-blankfind_program用于查找程序,在该代码中,将创建LSB_RELEASE_EXEC缓存变量,如果指定了NO_CACHE,则该变量为普通变量。如果找到程序,会将结果存储在变量中,如果没有清除该变量,后续不会重复搜索。如果没有找,结果将为<VAR>-NOTFOUND。
CMAKE_SYSTEM_PROCESSOR:在非交叉编译中,该变量与CMAKE_HOST_SYSTEM_PROCESSOR变量相同。在许多情况下,这将对应于构建的目标架构,但这并不保证。(例如,在Windows上,即使使用具有32位目标的MSVC cl编译器,主机也可能是AMD64。)
CMAKE_SOURCE_DIR:这是当前CMake源码树顶层的完整路径,即顶层CMakeLists.txt所在的路径。
定义宏superbuild_setup_variables
macro (superbuild_setup_variables)
# 该文件在 ./pvsb/superbuild/cmake 文件夹中
# 定义了用于版本号获取与设置的相关函数和宏
include(SuperbuildVersionMacros)
# Determine paraview version
if (paraview_SOURCE_SELECTION STREQUAL "git")
# Assuming master; just use the latest version, but let the user set their
# own version in case it is actually a branch from some other version.
set(PARAVIEW_VERSION_DEFAULT "5.11.0"
CACHE STRING "The default version of ParaView to use if it cannot be detected")
mark_as_advanced(PARAVIEW_VERSION_DEFAULT)
set(paraview_default_version "${PARAVIEW_VERSION_DEFAULT}")
elseif (paraview_SOURCE_SELECTION STREQUAL "source")
# If it is a git repo, we'll get it that way, otherwise we will look at the
# `version.txt` in the checkout.
set(paraview_default_version "")
else ()
# The selection is the version number; use it.
set(paraview_default_version "${paraview_SOURCE_SELECTION}")
endif()
# project:paraview
# defualt:${paraview_default_version}
# include_file:"paraview-version.cmake" "version.txt"
# version_file: "version.txt"
superbuild_set_version_variables(paraview "${paraview_default_version}" "paraview-version.cmake" "version.txt")
set(paraview_version "${paraview_version_major}.${paraview_version_minor}")
# Determine lidarview (or lidarview based-app) version
if (lidarview_SOURCE_SELECTION STREQUAL "git")
# Assuming master; just use the latest version, but let the user set their
# own version in case it is actually a branch from some other version.
set(LIDARVIEW_VERSION_DEFAULT "4.3.0"
CACHE STRING "The default version of LidarView to use if it cannot be detected")
mark_as_advanced(LIDARVIEW_VERSION_DEFAULT)
set(lidarview_default_version "${LIDARVIEW_VERSION_DEFAULT}")
elseif (lidarview_SOURCE_SELECTION STREQUAL "source")
# If it is a git repo, we'll get it that way, otherwise we will look at the
# `version.txt` in the checkout.
set(lidarview_default_version "")
else ()
# The selection is the version number; use it.
set(lidarview_default_version "${lidarview_SOURCE_SELECTION}")
endif()
superbuild_set_version_variables(lidarview "${lidarview_default_version}" "lidarview-version.cmake" "version.txt")
set(lidarview_version "${lidarview_version_major}.${lidarview_version_minor}")
endmacro ()
在该宏内,首先定义了用于版本号获取与设置的相关函数和宏。确定了paraview的版本信息,确定了lidarview的相关信息。
paraview_SOURCE_SELECTION变量决定了是从git上还是源码中进行相关操作。如果该变量无法匹配"git","source",则会直接赋值给paraview_default_version。
定函数superbuild_find_projects
该宏中首先调用了include(ParaViewSuperbuildMacros),该文件比较简单,代码如下:
# ParaViewSuperBuildMacros.cmake
macro (paraview_superbuild_add_pdf name outname)
superbuild_add_project("${name}"
DOWNLOAD_NO_EXTRACT 1
CONFIGURE_COMMAND
""
BUILD_COMMAND
""
INSTALL_COMMAND
"${CMAKE_COMMAND}" -E copy_if_different
<DOWNLOADED_FILE>
"<INSTALL_DIR>/doc/${outname}")
if (${name}_enabled)
set("${name}_pdf" "${superbuild_install_location}/doc/${outname}")
endif ()
endmacro ()
然后设置变量projects,其中保存了所有需要的项目名称,将project的内容保存在var表示的变量中,并设定为父作用域可用。
#SuperBuild Macros
function (superbuild_find_projects var)
# 该文件在./pvsb/cmake文件夹中
include(ParaViewSuperbuildMacros)
# Some of these allow using system libraries.
set(projects
boost
bzip2
ceres
curl
cxx11
darknet
eigen
flann
fortran
freetype
g2o
gdal
geotiff
glog
gtsam
hesaisdk
jsonc
lapack
las
lidarview
nanoflann
nlohmannjson
numpy
opencv
paraview
pcap
pcl
pdal
png
proj
python3
pythonbeniget
pythoncython
pythongast
pythonply
pythonpythran
pythonqt
pythonsetuptools
qhull
qt5
slam
sqlite
tiff
xerces
xz
yaml
zlib
zstd
)
if (WIN32)
list(APPEND projects
pywin32)
endif()
if (UNIX)
list(APPEND projects
ffi
libxml2
sqlite)
if (NOT APPLE)
list(APPEND projects
fontconfig
gperf
pkgconf
teaserpp
utillinux)
endif()
endif()
# Add lidarview-based app project from old build system
# with superbuild as a submodule.
# Should be deprecated for open source projects.
if (COMMAND add_project_to_superbuild)
add_project_to_superbuild(projects)
endif()
set("${var}"
${projects}
PARENT_SCOPE)
endfunction ()
定义函数superbuild_add_packaing
查找Qt包(find_package(Qt5 QUIET REQUIRED COMPONENTS Core)
设置qt5路径,qt5版本号,LidarView源码路径,paraivew版本号,库类型
function (superbuild_add_packaging)
# Qt logic from pvsb
if (qt5_enabled AND (USE_SYSTEM_qt5 OR APPLE OR WIN32))
list(APPEND superbuild_export_variables
Qt5_DIR)
find_package(Qt5 QUIET REQUIRED COMPONENTS Core)
set(qt5_version "${Qt5Core_VERSION_MAJOR}.${Qt5Core_VERSION_MINOR}")
else ()
set(qt5_version "${qt5_SOURCE_SELECTION}")
endif ()
list(APPEND superbuild_export_variables
qt5_version)
# ParaView shared libs logic from pvsb
if (BUILD_SHARED_LIBS_paraview STREQUAL "<same>")
set(paraview_is_shared "${BUILD_SHARED_LIBS}")
else ()
set(paraview_is_shared "${BUILD_SHARED_LIBS_paraview}")
endif ()
# pass some variables that are required for packaging step:
list(APPEND superbuild_export_variables
LidarView_SOURCE_DIR
paraview_version
paraview_is_shared)
# Packaging tests
if (WIN32)
set(generators
ZIP
NSIS)
elseif (APPLE)
set(generators
DragNDrop)
else ()
set(generators
TGZ)
endif ()
list(GET generators 0 default_generator)
foreach (generator IN LISTS generators)
superbuild_add_extra_package_test(lidarview "${generator}"
LABELS "LidarView" # does not have to be ${SOFTWARE_NAME} I think, it is currently not available here
TIMEOUT 6400)
endforeach ()
endfunction ()
定义函数superbuild_add_tests
该函数执行了添加测试用的子文件夹
function (superbuild_add_tests)
add_subdirectory("${CMAKE_SOURCE_DIR}/tests" "${CMAKE_BINARY_DIR}/tests")
endfunction ()
编译流程控制及相关依赖库设置
cmake中option用于控制编译流程,相当于C语言中的宏条件编译
以下是一些依赖项的相关变量的定义
# Dependencies Options
option(ENABLE_all "Enable all optional dependencies like pcl, ceres, opencv, ..." OFF)
if (ENABLE_all) # 检查ENABLE_all变量,如果ON,则全部编译
set(ENABLE_opencv ON CACHE BOOL "enable OpenCV")
set(ENABLE_ceres ON CACHE BOOL "enable Ceres")
set(ENABLE_pcl ON CACHE BOOL "enable PCL")
set(ENABLE_nanoflann ON CACHE BOOL "enable nanoflann")
# set(ENABLE_darknet ON CACHE BOOL "enable darknet")
set(ENABLE_g2o ON CACHE BOOL "enable G2O")
set(ENABLE_gtsam ON CACHE BOOL "enable Gtsam")
set(ENABLE_teaserpp ON CACHE BOOL "enable Teaser++")
endif(ENABLE_all)
# Qt logic from pvsb
# Differences:
# - add qtspeech
set(qt5_skip_modules
qtspeech
qtconnectivity
qtgamepad
qtlocation
qtsensors
qtserialport
qtwayland
qtwebchannel
qtwebengine
qtwebsockets)
set(_superbuild_qt5_default_selection "5.15")
set(qt5_ENABLE_SVG ON CACHE INTERNAL "ParaView requires SVG support") # Localisation lib only required for qtwebkit
# Config Boost
set(boost_libraries
atomic
date_time
filesystem
iostreams
program_options
thread
timer
chrono
regex
serialization
system)
set(boost_extra_options
"-sNO_BZIP2=1")
# Check if some Boost environment variables could hide local Boost install
if (NOT USE_SYSTEM_boost AND (DEFINED ENV{BOOSTROOT} OR DEFINED ENV{BOOST_ROOT} OR DEFINED ENV{BOOST_LIBRARYDIR} OR DEFINED ENV{BOOST_INCLUDEDIR}))
message(WARNING "Some Boost environment variables are set and may hide the local superbuild Boost installation. "
"Consider enabling USE_SYSTEM_boost flag or unsetting the following environement variables :\n"
" BOOSTROOT=$ENV{BOOSTROOT}\n BOOST_ROOT=$ENV{BOOST_ROOT}\n BOOST_LIBRARYDIR=$ENV{BOOST_LIBRARYDIR}\n BOOST_INCLUDEDIR=$ENV{BOOST_INCLUDEDIR}")
endif()
以下定义了版本下载的相关设置文件,测试相关设置文件,以及依赖库的相关设置文件。
version.cmake文件中设定了所有相关项目源码的获取方式,并生成了相关参数,为后续ExternalProject_add函数提供输入数据。
# Versions and projects
list(APPEND superbuild_version_files
"${CMAKE_CURRENT_LIST_DIR}/versions.cmake"
"${CMAKE_CURRENT_LIST_DIR}/pvsb/versions.cmake")
list(APPEND superbuild_ctest_custom_files
"${CMAKE_CURRENT_LIST_DIR}/pvsb/cmake/CTestCustom.cmake")
list(APPEND superbuild_project_roots
"${CMAKE_CURRENT_LIST_DIR}/projects"
"${CMAKE_CURRENT_LIST_DIR}/pvsb/projects")
定义了qt及paraview的一些变量
# set the default arguments used for "git clone"
set(_git_clone_arguments_default --progress)
# set the default projects
set(_superbuild_default_cxx11 ON)
set(_superbuild_default_lidarview ON)
# set the default for qt5 to be 5.15
set(_superbuild_qt5_default_selection "5.15")
# Force qt SVG support, so ParaView can use SVG icons
set(qt5_ENABLE_SVG ON CACHE INTERNAL "ParaView requires SVG support")
# Force build shared libs
set(_superbuild_no_static_everywhere ON)
set(BUILD_SHARED_LIBS ON)
# Set fixed paraview version on PDAL fix commit until new release come out
set(paraview_GIT_TAG "b5bd6d8beff4d9acdce5b44e0da951710809e4ca" CACHE STRING "")
mark_as_advanced(paraview_GIT_TAG)
# Set ParaView arguments
set(PARAVIEW_EXTERNAL_PROJECTS "pythonqt" CACHE INTERNAL "")
set(PARAVIEW_EXTRA_CMAKE_ARGUMENTS
"-DVTK_MODULE_ENABLE_VTK_libproj=YES"
"-DPARAVIEW_PLUGIN_ENABLE_PythonQtPlugin=ON"
"-DPARAVIEW_PLUGIN_AUTOLOAD_PythonQtPlugin=ON"
CACHE INTERNAL "")
调用superbuild
# common-superbuild
add_subdirectory(pvsb/superbuild)
在pvsb/superbuild/CMakeLists.txt中进行了相关项目依赖项的整理,并调用ExternalProject_add进行项目管理,包括下载、更新/补丁、配置、构建、安装、测试流程。
官方文档: