背景知识
qmake是Qt开发者们比较熟悉的工具,作为Qt5中使用的构建系统它存在不少缺陷和限制,因此在Qt for MCUs以及即将发布的Qt6中,将会使用cmake作为标准的第三方构建系统来构建Qt项目,Qt公司将继续在qmake上支持用户,但不会进一步开发它或使用它来构建Qt框架本身。
cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)过程中的衍生品,最终形成体系,成为一个独立的开放源代码项目。项目诞生于2001年。cmake的流行其实要归功于 KDE4 的开发(似乎跟当年的 svn 一样,KDE 将代码仓库从CVS迁移到SVN,同时证明了SVN管理大型项目的可用性) 。
cmake有着诸多优点,开发源代码/跨平台/能够管理大型项目/简单的工具链/高效构建以及可扩展性,它的编写需要熟悉“cmake语言和语法”。
推荐网上搜到一个比较不错的资料《CMake实践》,扫码即可获取。
CMake的编写
CMake自动生成构建系统,例如makefile和Visual Studio工程文件。先来看Qt Creator默认生成的MCU工程的CMakeLists.txt文件:
cmake_minimum_required (VERSION 3.15)
project(helloworld VERSION 0.0.1 LANGUAGES C CXX ASM)
find_package(Qul)
add_executable(helloworld)
qul_target_qml_sources(helloworld helloworld.qml)
target_link_libraries(helloworld Qul::QuickUltralite)
app_target_setup_os(helloworld)
app_target_default_main(helloworld helloworld)
CMakeLists.txt,这个文件是 cmake 的构建定义文件,文件名是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt。
cmake_minimum_required 定义了最小版本号
project(helloworld VERSION 0.0.1 LANGUAGES C CXX ASM)定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。
find_package(Qul)定义了Qt Quick Ultralite(简称Qul)附带的库和头文件
add_executable(helloworld)定义了这个工程会生成一个文件名为 helloworld 的可执行文件
qul_target_qml_sources(helloworld helloworld.qml)用来添加qml源文件,添加C++文件用法类似:qul_target_generate_interfaces(example example.h)
target_link_libraries(helloworld Qul::QuickUltralite)添加链接库,此命令自动添加适当的include目录、编译定义和库。
app_target_setup_os(helloworld)使用它可以根据OS变量的值,例如:
set(OS "BareMetal")
或
set(OS "FreeRTOS ")
对OS进行额外的设置。这个命令链接正确的平台库并执行其他操作,比如编译和链接FreeRTOS源代码。
CMake的执行
CMakeLists.txt所在目录上运行cmake即可构建项目,例如,为STM32F769I-Discovery板构建:
cmake <source_directory>
-DCMAKE_TOOLCHAIN_FILE=<qul_directory>/cmake/toolchain/armgcc.cmake
-DQUL_PLATFORM=STM32F769I-DISCOVERY-baremetal
CMAKE_TOOLCHAIN_FILE变量用于切换到armgcc编译器工具链,QUL_PLATFORM变量决定要为哪个特定的板卡构建。
其他参考
还有很多其他命令的用法,具体可参考Qt官方文档:
https://doc.qt.io/QtForMCUs/qtul-cmake-reference.html