cmake 工具要领
主要工具逻辑
查看帮助
cmake --help-command
cmake set 定义变量后, 可以跟多个表达式, 来说明变量有多个数据段
set(QC_INCLUDE ${QC_INCLUDE} ${QC_SYSROOT}/usr/include/amss)
set(QC_INCLUDE ${QC_INCLUDE} ${QC_SYSROOT}/usr/include/amss/core)
检查环境变量中是否有某个值
Check environment variables
if ("$ENV{QNX_HOST}" STREQUAL “”)
CMakeCache.txt 干嘛用的
可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数)。
cmake 第一次运行时将生成 CMakeCache.txt 文件,我们可以通过ccmake或cmake-gui或make edit_cache对其进行编辑。
主要记录如下途径得到的变量:
CMakeLists.txt 中通过 set(... CACHE ...) 设置的变量
CMakeLists.txt 中的 option() 提供的选项
CMakeLists.txt 中find_package() 等find命令引入变量
命令行 cmake . -D := 定义变量
对应于命令行 -D 定义变量,-U 用来删除变量(支持globbing_expr),比如 cmake -U/QT/ 将删除所有名字中带有QT的cache项。
变量与Cache
cmake 的变量系统远比第一眼看上去复杂:
有些变量被cache,有些则不被cache
被cache的变量
有的不能通过ccmake等进行编辑(internal)
有的(带有描述和类型)可以被编辑(external)
有的只在ccmake的 advanced 模式出现
看个例子:
SET(var1 13)
变量 var1 被设置成 13
如果 var1 在cache中已经存在,该命令不会overwrite cache中的值
SET(var1 13 ... CACHE ...)
如果cache存在该变量,使用cache中变量
如果cache中不存在,将该值写入cache
SET(var1 13 ... CACHE ... FORCE)
不论cache中是否存在,始终使用该值
具体招式
find_xxx
为了避免每次运行都要进行头文件和库文件的探测,以及考虑到允许用户通过ccmake设置头文件路径和库文件的重要性,这些东西必须进行cache。
find_path 和 find_library 会自动cache他们的变量,如果变量已经存在且是一个有效值(即不是 -NOTFOUND 或 undefined),他们将什么都不做。
另一方面,模块查找时输出的变量(_FOUND,_INCLUDE_DIRS,_LIBRARIES)不应该被cache
连续定义project
一个cmake中开多个project, 连续定义多个工程和参数,编译多个目标
file GLOB_RECURSE
递归查找文件, 可以避免丑陋的子目录塞入CMakeList的问题。
file(<COPY|INSTALL> <files>... DESTINATION <dir>
[FILE_PERMISSIONS <permissions>...]
[DIRECTORY_PERMISSIONS <permissions>...]
[NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
[FOLLOW_SYMLINK_CHAIN]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS <permissions>...]] [...])
COPY将文件,目录和符号链接复制到目标文件夹。相对于当前源目录评估相对输入路径,相对于当前构建目录评估相对目的地。复制会保留输入文件的时间戳,并优化文件(如果该文件存在于具有相同时间戳的目标文件中)。复制将保留输入权限,除非给出明确的权限或NO_SOURCE_PERMISSIONS(默认为USE_SOURCE_PERMISSIONS)。
如果指定了FOLLOW_SYMLINK_CHAIN,则COPY将在给定的路径上递归解析符号链接,直到找到真实文件为止,然后在目标位置为遇到的每个符号链接安装相应的符号链接。
add_custom_command:
该命令可以为生成的构建系统添加一条自定义的构建规则。这里又包含两种使用方式,一种是通过自定义命令在构建中生成输出文件,另外一种是向构建目标添加自定义命令。命令格式分别为:
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[JOB_POOL job_pool]
[VERBATIM] [APPEND] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS])
下面命令中,TARGET是在本工程中会被执行的目标,可以是 executable, 也可以是 shared library. 需要制定对应的名字。
add_custom_command(TARGET <target>
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[VERBATIM] [USES_TERMINAL])
- ADD_CUSTOM_TARGET
该命令可以给指定名称的目标执行指定的命令,该目标没有输出文件,并始终被构建。命令的格式为:
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[JOB_POOL job_pool]
[VERBATIM] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
[SOURCES src1 [src2...]])
add_definitions()
为源文件的编译添加由-D定义的标志。
cmake使用的变量
通过如下
cmake --help-commond-list
可以查看所有的变量
CMAKE_C_COMPILER
CMAKE_C_COMPILER_TARGET
CMAKE_CXX_COMPILER
CMAKE_CXX_COMPILER_TARGET
CMAKE_ASM_COMPILER
CMAKE_ASM_DEFINE_FLAG
CMAKE_LINKER
CMAKE_AR
CMAKE_NM
CMAKE_OBJCOPY
CMAKE_OBJDUMP
CMAKE_RANLIB
CMAKE_STRIP
CMAKE_SH
编译so的时候不会进行link
在编译so的时候,虽然有用到其他so中的接口,但只要有头文件就可以,不需要link so。
使用CMAKE_TOOLCHAIN_FILE命令
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=/path/to/driveworks/samples/cmake/Toolchain-V5L.cmake \
-DVIBRANTE_PDK:STRING=/path/to/drive-t186ref-linux \
/path/to/driveworks/samples/folder