【CMake】第5章 配置和构建时的操作

mkdir -p build
cd build
cmake ..   # 在build文件夹中生成 项目的配置;
cmake --build .  # 编译可执行文件(也被称为构建示例项目)

5.1 使用和平台无关的文件操作

  • 展示如何以可移植的方式下载库文件;
  • 使用-E标志可以以操作系统无关的方式运行许多公共操作(调用CMake命令本身来执行实际工作);
  • 构建过程中,必须执行一系列没有输出的命令时,可以使用add_custon_target命令;

5.2 配置时 运行自定义命令

讨论如何使用execute_process命令在配置时运行定制化命令;

5.3 构建时 运行自定义命令I:使用add_custom_command

5.4 构建时 运行自定义命令II:使用add_custom_target

5.6 探究编译和链接命令

  1. 如何确保代码能成功编译为可执行文件;
  2. 如何确保编译器理解相应标志位;
  3. 如何确保特定代码能成功编译成可执行程序;

try_compile生成一个小项目,将编译成功或失败的状态保存在omp_taskloop_teset_1
check_cxx_source_compiles函数,将检查结果保存到omp_taskloop_test_2变量中;

5.7 探究编译器标志命令

Sanitizers:静态和动态代码分析非常有用的工具。
使用方式:设置标志位,重新编译代码可以检查内存错误、未初始化读取,线程安全;

## 疑问1:CMAKE_REQUIRED_FLAGS变量的作用
#设置 CMAKE_REQUIRED_FLAGS 变量, check_cxx_compiler_flag 函数在内部使用该变量
set(CMAKE_REQUIRED_FLAGS ${ASAN_FLAGS})
#调用 check_cxx_compiler_flag 来确保编译器理解 ASAN_FLAGS 变量中的标志
check_cxx_compiler_flag(${ASAN_FLAGS} asan_works)
#取消设置 CMAKE_REQUIRED_FLAGS
unset(CMAKE_REQUIRED_FLAGS)

## 疑问2:target_compile_options函数的作用:为库、可执行文件设置编译选项;

target_compile_options(<target> [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
##编译选项可以添加三个级别的可见性: INTERFACE 、 PUBLIC 和 PRIVATE 。可见性的含义如下:
## PRIVATE,编译选项会应用于给定的目标,不会传递给与目标相关的目标。比如,即使exe将链接到A库,exe也不会继承A目标上设置的编译器选项。
## INTERFACE,给定的编译选项将只应用于指定目标,并传递给与目标相关的目标。
## PUBLIC,编译选项将应用于指定目标和使用它的目标

5.8 探究可执行命令

示例展示了:如何检查是否可以在当前系统上编译、链接和运行代码;

set(CMAKE_REQUIRED_LIBRARIES PkgConfig::UUID)
check_c_source_runs("${_test_uuid}" _runs)
unset(CMAKE_REQUIRED_LIBRARIES)

5.9 使用生成器表达式微调配置和编译

CMake分两个阶段生成项目的构建系统:配置阶段(解析CMakeLists.txt)和生成阶段(实际生成构建环境);
生成器表达式在第二阶段进行计算,可以使用仅在生成时才能知道的信息来调整构建。
生成器表达式来解析特定目标的文件路径;

  • 逻辑表达式($condigtion:outcome)
  • 信息表达式($)
  • 输出表达式($)
$ mkdir -p build_seq
$ cd build_seq
$ cmake -D USE_MPI=OFF ..
$ cmake --build .
$ ./example
hello from a sequential binary

未完待续

你可能感兴趣的:(cmake)