Cmake与autotools一样都是生成makefile的工具,但其步骤更清晰明了,这里做一下解析。
CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码。因此CMake的编译基本就两个步骤:
- cmake
- make
CMakeLists.txt是以目录为执行单位的,CMakeLists.txt中可以添加子目录,子目录下也存在一个该目录的CMakeLists.txt文件。
以mbedtls的CMakeLists.txt为例:
调试方法:
在buildroot环境中,调试CMakeLists.txt的方法如下:
- 修改CMakeLists.txt,在其中加入调试语句
message( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]
"message to display" ...)
打印变量的示例如下:message(STATUS ${CMAKE_COMPILER_IS_MSVC})
2. 执行如下命令,就会输出加入的调试信息。
$ make mbedtls-reconfigure > m1.txt 2>&1
实例分析:
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
该命令指定了编译该工程对cmake的最高、最低版本要求,如果 CMake 的运行版本低于所需版本,它将停止处理项目并报告错误。
project("mbed TLS" C)
project(<PROJECT-NAME> [<language-name>...])
指定工程名称以及语言
option(USE_PKCS11_HELPER_LIBRARY "Build mbed TLS with the pkcs11-helper library." OFF)
option(<variable> "<help_text>" [value])
- variable:定义选项名称
- help_text:说明选项的含义
- value:定义选项默认状态,一般是OFF或者ON,除去ON之外,其他所有值都为认为是OFF。
string(REGEX MATCH "IAR" CMAKE_COMPILER_IS_IAR "${CMAKE_C_COMPILER_ID}")
string(REGEX MATCH <regular_expression> <output_variable> <input> [<input>...])
从所有<input> ...中查找<regular_expression>匹配到的字符串,并存放于<output_variable>,查不到输出为空字符串。多个输入时先连接再做操作。只匹配第一次。以上语句是查找Cmake的编译器是否是IAR规范。
set(WARNING_BORDER "*******************************************************\n")

本文解析了CMake生成makefile的方法,其编译基本步骤为cmake和make,CMakeLists.txt以目录为执行单位。还介绍了在buildroot环境中调试CMakeLists.txt的方法,最后通过mbedtls的CMakeLists.txt实例,分析了cmake相关命令的使用,如指定版本要求、设置变量等。
最低0.47元/天 解锁文章
7358

被折叠的 条评论
为什么被折叠?



