LidarView超级构建(一):顶层CMakeLists.txt 文件分析

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进行项目管理,包括下载、更新/补丁、配置、构建、安装、测试流程。

官方文档:

ExternalProject — CMake 3.26.4 Documentation

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
修改CMakeLists.txt文件是在ROS package中进行配置和构建的重要步骤之一。下面是修改CMakeLists.txt文件的一般步骤: 1. 打开CMakeLists.txt文件:在你的ROS package目录中找到CMakeLists.txt文件,并使用文本编辑器打开它。 2. 添加依赖项:如果你的ROS package依赖于其他的ROS package,你需要在CMakeLists.txt文件中添加这些依赖项。你可以使用`find_package()`函数来查找和链接这些依赖项。例如,如果你的package依赖于roscpp和std_msgs,你可以在CMakeLists.txt文件中添加以下代码: ```cmake find_package(catkin REQUIRED COMPONENTS roscpp std_msgs) ``` 3. 设置编译选项:你可以在CMakeLists.txt文件中设置一些编译选项,例如编译标志、编译器选项等。你可以使用`add_compile_options()`函数来设置这些选项。例如,如果你想添加一些编译标志,你可以在CMakeLists.txt文件中添加以下代码: ```cmake add_compile_options(-std=c++11 -Wall -Wextra) ``` 4. 添加可执行文件或库:如果你的ROS package包含可执行文件或库,你需要在CMakeLists.txt文件中添加它们。你可以使用`add_executable()`函数来添加可执行文件,使用`add_library()`函数来添加库。例如,如果你想添加一个名为"my_node"的可执行文件,你可以在CMakeLists.txt文件中添加以下代码: ```cmake add_executable(my_node src/my_node.cpp) target_link_libraries(my_node ${catkin_LIBRARIES}) ``` 5. 添加其他必要的配置:根据你的需求,你可能需要添加其他的配置,例如消息生成、服务生成等。这些配置可以根据你的ROS package的具体需求来进行添加。 6. 保存并关闭文件:完成所有的修改后,保存并关闭CMakeLists.txt文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值