CMake 3.18中的新功能

本文翻译自New features in CMake 3.18
原文作者:Cristian Adam,Qt公司高级软件工程师
翻译校审:Haipeng Yu

 

7月15日Kitware发布了CMake 3.18。其发布说明包含了更新列表。

以下罗列那些可提升Qt开发者使用CMake体验的更新。

 

支持搜集分析功能(Profiling support)

过去很难搜集CMake配置项目消耗的时间信息。现在有了支持搜集分析功能,可以很方便找出这些信息。


下面的命令行参数(可在”Initial CMake参数”项目设置中传递到Qt Creator 4.13)

--profiling-format=google-trace
--profiling-output=qtcreator-cmake.json

将生成一个qtcreator-cmake.json的文件(大小为40 MiB,供Qt Creator使用),可以通过Chrome Trace Format Viewer加载进Qt Creator。

看起来像这样:

这个功能可在Kitware的!2760中查看。


预编译头文件


CMake 3.16支持预编译头文件,但之后加入CMake的功能都取消了对预编译头文件的支持。

CMake 3.18修复了以下用例:

  • iOS 多架构 (#20497)
  • 基于MSVC的Ninja多功能配置 (#20711)
  • 基于MSVC的Ninja多配置和可复用PCH支持 (#20721)

Cmake 3.18将在生成源步骤(PCH,Unity)运行之后运行AUTOMOC步骤。之前的版本是反过来的。

这修复了#20119:需要Qt Creator让CMake配置项目两次作为变通方案。

缺点是如果您将Q_OBJECT宏和AUTOMOC设置为ON,那么只有头文件的库在使用CMake 3.18时将无法编译。更多相关细节,请参阅#20980#20968

要解决这个问题,需要向这些库添加一个虚拟源文件:

file(GENERATE
     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx
     CONTENT "/*empty file*/")
target_sources(CommonPCH_Lib PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx)


Unity构建

添加了UNITY_BUILD_MODE目标属性以告诉生成器使用哪种算法对包含的源文件进行分组。

CMake 3.16默认BATCH模式,新添加的CMake 3.18默认是GROUP模式。

add_library(example_library
            source1.cxx
            source2.cxx
            source3.cxx
            source4.cxx)

set_target_properties(example_library PROPERTIES
                      UNITY_BUILD_MODE BATCH
                      UNITY_BUILD_BATCH_SIZE 2)

假设source3.cxxsource4.cxx之间存在命名冲突,并且他们在同一batch中,我们需要创造方法去解决这个问题。

相比仅具有source4.cxx的对象库,或更改源文件的顺序(source4.cxx, source1.cxx, source2.cxx, source3.cxx),我们现在可以这样做:

add_library(example_library
            source1.cxx
            source2.cxx
            source3.cxx
            source4.cxx)

set_target_properties(example_library PROPERTIES
                      UNITY_BUILD_MODE GROUP)

set_source_files_properties(source1.cxx source2.cxx source3.cxx
                            PROPERTIES UNITY_GROUP "bucket1")
set_source_files_properties(source4.cxx
                            PROPERTIES UNITY_GROUP "bucket2")

这个功能可在Kitware的!4716中查看。


更少的编译器检查

下面给出了C++的“Hello World”的CMakeLists.txt:

cmake_minimum_required(VERSION 3.17)

project(hello)

add_executable(hello hello.cpp)

当使用CMake 3.17进行配置时,我们会得到如下输出:

$ cmake -E time cmake -G Ninja -S . -B build
-- The C compiler identification is MSVC 19.25.28614.0
-- The CXX compiler identification is MSVC 19.25.28614.0
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Projects/c++/HelloWorld/build
Elapsed time: 4 s. (time), 3.825 s. (clock)

使用CMake 3.18,我们会得到如下输出:

$ cmake -E time cmake -G Ninja -S . -B build
-- The C compiler identification is MSVC 19.25.28614.0
-- The CXX compiler identification is MSVC 19.25.28614.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Projects/c++/HelloWorld/build
Elapsed time: 2 s. (time), 2.029 s. (clock)


这是由于!4789 enable_language: Assume compiler works if ABI detection compiles!

CMake现在只执行两个try_compile,而不是四个,默认语言CCXX各一次。

通过如下方法:

cmake_minimum_required(VERSION 3.17)

project(hello LANGUAGES CXX)

add_executable(hello hello.cpp)

我们只需有一个try_compile:

$ cmake -E time cmake -G Ninja -S . -B build
-- The CXX compiler identification is MSVC 19.25.28614.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Projects/c++/HelloWorld/build
Elapsed time: 1 s. (time), 1.222 s. (clock)

这对于使用Qt Creator的CMake编译Qt 6的情况会有所帮助。


Qt 6加速功能


以下功能将使Qt6 CMake代码更加精简和快速:

  • 创建file(CONFIGURE)子命令是为了复制configure_file()功能,而不用利用磁盘上已存在的文件作为输入。而是将内容作为字符串传递。# 20388
  • 添加了cmake_language()命令,用于对脚本或内置命令进行元操作。该命令以CALL其他命令的模式开始,并使用EVAL CODE就地评估CMake脚本。# 18392!4408
  • 具有SOURCE范围的set_property()命令获得了DIRECTORYTARGET_DIRECTORY选项,以在提供的目录范围中设置属性。#20128
  • file()命令获得了ARCHIVE_CREATEARCHIVE_EXTRACT子命令,以便将cmake(1) -E tar功能公开给cmake脚本。# 20443

 

已标记关键词 清除标记
相关推荐