QGC4.3.0源码学习 - 阅读顶层CMakeLists.txt(2)

设置c++语言标准

set(CMAKE_CXX_STANDARD 14)

 CMAKE_CXX_STANDARDcmake规定的标准变量,可取的值参考官方文档:

CXX_STANDARD — CMake 3.29.2 Documentation

基本上从值上就能退出将要使用的C++语言标准,如98代表c++98,11代表c++11,20代表c++20,这里使用c++14标准。

set(CMAKE_CXX_STANDARD_REQUIRED ON)

 CMAKE_CXX_STANDARD_REQUIRED 是一个布尔值变量,用于指定是否强制使用 CMAKE_CXX_STANDARD 中设置的 C++ 版本。如果设置为 ON,那么 CMake 会要求编译器必须支持 CMAKE_CXX_STANDARD 中设置的 C++ 版本,否则会配置失败。如果设置为 OFF 或者未设置,那么如果编译器不支持 CMAKE_CXX_STANDARD 中设置的 C++ 版本,CMake 会回退到编译器支持的最新版本。

cmake install

cmake install是 cmake工具中重要部分,主要功能是将构建目标、文件、文件夹、脚本等安装到指定位置,详细内容请参考官方文档:

install — CMake 3.29.2 Documentation

有一篇知乎文章请大家参考:

CMake Install:深度解析与实践 - 知乎 (zhihu.com)

CMake官方教程,关于install和ctest有示例介绍:

Step 5: Installing and Testing — CMake 3.29.2 Documentation

install命令基本结构为:

install(<TYPE> files... DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP])

 设置安装路径前缀

CMAKE_INSTALL_PREFIX:cmake安装前缀,用于install命令所有<dir>的前缀。

QGC 顶层 CMakeLists.txt有关于 install 规定:

if(LINUX)
    set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/AppDir/usr)
else()
    set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/staging)
endif()

以上代码含义是:如果是linux系统将安装前缀设置为:build目录/AppDir/usr(没有则自动创建)

如果非linux系统,将安装前缀设置为:build目录/staging

执行安装命令

在Qt Creator 完成build之后,不会自动进行安装工作,打开Desktop_Qt_6_7_0_MinGW_64_bit-Debug文件夹(${CMAKE_BINARY_DIR}),在终端输入:

cmake --install .

 执行完安装命令之后,产生新的文件夹 staging,有内容如下:

对照顶层 CMakeLists.txt 如下代码:

install(
    TARGETS ${PROJECT_NAME}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    BUNDLE  DESTINATION .
)

动态库安装到lib目录,可执行文件安装到bin目录,静态库文件安装到lib目录。需要注意的是顶层只有add_executable命令,并没有add_library所以在执行顶层CMakeLists.txt产生的cmake_install.cmake之后,不会产生lib目录,将会产生bin目录用来存放生成的可执行文件。

安装qml程序必备qml模块

因为QGC是一个使用了 qml 的应用程序,所以在运行前需要安装 qml 模块。在顶层 CMakeLists.txt中,有如下安装qml模块的命令:

qt_generate_deploy_qml_app_script(
    TARGET ${PROJECT_NAME}
    OUTPUT_SCRIPT deploy_script
    # DEPLOY_TOOL_OPTIONS
    MACOS_BUNDLE_POST_BUILD
    NO_UNSUPPORTED_PLATFORM_ERROR
    DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM
)

根据qt官方文档,qt_generate_deploy_qml_app_script | Qt QML 6.7.1此命令作用是产生QML应用程序的部署脚本文件,要求:

find_package(Qt6 REQUIRED COMPONENTS Qml)

TARGET:指定可执行文件名称。

OUTPUT_SCRIPT:指定deploy脚本名称。

MACOS_BUNDLE_POST_BUILD:当目标是macOS bundle时,此选项启用额外步骤,创建一个构建后规则,此规则使用部署脚本去部署QML模块,以允许应用程序直接从构建目录运行,其他平台忽略此选项。

NO_UNSUPPORTED_PLATFORM_ERROR:对qt_deploy_runtime_dependencies不支持平台调用qt_generate_deploy_qml_app_script将导致致命错误,除非声明了NO_UNSUPPORTED_PLATFORM_ERROR。

DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM:即使当前平台不支持qt_generate_deploy_qml_app_script,但有此声明仍可以安装QML模块。

QGC顶层CMakeLists.txt紧跟着qt_generate_deploy_qml_app_script,完成deploy_script的调用:

install(SCRIPT ${deploy_script})

 根据Qt官方文档,在使用GNU安装布局后,除了macOS app bundle,其它所有平台,将qmldir和qml模块插件安装在:

${ CMAKE_INSTALL_PREFIX }/qml

 

安装资源文件目录

在QGC顶层CMakeLists.txt有安装资源目录的语句:

install(
    DIRECTORY ${CMAKE_SOURCE_DIR}/resources/
    DESTINATION ${CMAKE_INSTALL_DATADIR}/qgroundcontrol
)

 以上的含义是,将${CMAKE_SOURCE_DIR}/resources文件夹,整体复制到${CMAKE_INSTALL_DATADIR}/qgroundcontrol位置,CMAKE_INSTALL_DATADIR是指:

${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/qgroundcontrol

 本机上${CMAKE_INSTALL_DATADIR},表示/share:


 

其它Linux安装事项

configure_file(
        ${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.metainfo.xml.in
        ${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml
        @ONLY
)

 configure_file命令可参考CMake官方文档

configure_file — CMake 3.29.2 Documentation

作用是将文件复制到另一个位置,并修改@xxx@中xxx内容。

例如CMakeLists.txt定义一个变量

set(cmake_build_version 2)

输入文件(xx.xx.in)中

#define BUILD_VERSION @cmake_build_version@

那么在输出文件(xx.xx)将会自动生成

#define BUILD_VERSION  2

QGC此处调用configure_file作用主要是根据

${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.metainfo.xml.in

 产生一个xml文件:

${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml

 并根据 CMakeLists.txt 或者 .cmake 文件修改 .xml.in 内所有 @ xxx @ 包含的变量:

 使用vs code搜索REL_DATE和REL_VERSION:

处于注释状态,因此将不会替换 REL_DATE 和 REL_VERSION。

install(
        FILES ${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop
        DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
)

 以上代码表示:

${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop

安装到:

${CMAKE_INSTALL_PREFIX}/share/applications
install(
        FILES ${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml
        DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo/
)

  以上代码表示:

${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml

安装到:

${CMAKE_INSTALL_PREFIX}/share/metainfo/

可以看出,因为本机处于win32环境,并没有进行安装。

install(
        FILES ${CMAKE_SOURCE_DIR}/resources/icons/qgroundcontrol.png
        DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps/
        RENAME org.mavlink.qgroundcontrol.png
)

 同样表示将

${CMAKE_SOURCE_DIR}/resources/icons/qgroundcontrol.png

安装到:

${CMAKE_INSTALL_PREFIX}/share/ icons/hicolor/128x128/apps/

 并重命名为 org.mavlink.qgroundcontrol.png

Win32环境下其它安装事项

install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/CreateWinInstaller.cmake")

以上表示将调用

${CMAKE_SOURCE_DIR}/cmake/CreateWinInstaller.cmake

进行win32环境下安装工作,查看此.cmake文件:

主要工作是:

将cmake格式表示的资源文件路径,转换为本机环境使用路径;

查找QGC安装命令程序 QGC NSIS

调用QGC NSIS,将安装,卸载QGC等功能注册到windows

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值