1、SET
SET(<variable><value> ... CACHE <type> <docstring> [FORCE])
将缓存条目variable设置为值<value>...,除非用户进行设置或者使用了选项FORCE,默认情况下缓存条目的值不会被覆盖。缓存条目可以通过CMAKE的GUI界面的add entry按钮来增加。缓存条目的实质为可以跨层级实现传递的变量,类似于全局变量。
缓存条目的<type>主要有以下几类:
BOOl
FILEPATH
STRING/STRINGS:文本行,CMAKE的GUI界面对此类缓存条目会提供一个文本框
INTERNAl:文本行,只用于内部,不对外呈现,主要用于运行过程中存储变量,因此使用该类意味着使用FORCE。
缓存条目的几个注意事项:
1)如果变量先前未定义或者使用了FORCE选项,则缓存条目会被直接赋值
2)可以使用cmake的-D选项直接给缓存条目赋值,这样CMakeList.txt内的set命令只会为缓存条目添加类型。
3)如果变量类型为目录或者文件类型,通过-D选项传入的若只是相对路径,那么set会将相对路径变成绝对路径。
2、configure_file
configure_file指令通过读取文件中的内容,将CMakeLists.txt文件中的变量转为C/C++中可识别的宏定义,然后存入另外一个文件中。其语法格式如下。其中,input为输入的文件,output为输出的文件,其中,输入文件为xxx-config.h.in,输出文件为xxx-config.h。
configure_file("${PROJECT_SOURCE_DIR}/versionInfo.rc.in" "${MY_VERSIONINFO}")
3、AUX_SOURCE_DIRECTORY
aux_source_directory(<dir> <variable>)
搜集所有在指定路径下的源文件的文件名,并将输出结果列表储存在指定的变量中。
# 查找当前目录下的所有源文件
# 并将名称保存到 SRC_LIST变量
aux_source_directory(. SRC_LIST)
add_executable(${TARGET} ${SRC_LIST})
不过这个方法也有它的缺点,就是把当前目录下的源文件都添加到变量SRC_LIST上了,并且只能检测目录下的cpp文件。如果我们不需要一些文件,可以进行这样操作:
set(SRC_LIST
./main.c
./test1.c
./test2.c
)
4、set_target_properties
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
sets properties on targets.这句命令是列出所有你想要改变的目标,然后提供你想要设定的值。你可以使用任意你想要的属性值然后通过get_property()和get_target_property()提取
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES VERSION "${VERSION_FLAG}")
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TARGET_BIN_OUTPUT_PATH}")
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
"${TARGET_OUTPUT_NAME}")
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES FOLDER "${FOLDER_PATH}")
RUNTIME_OUTPUT_DIRECTORY:指明了运行时目标文件应该建立的位置
ARCHIVE_OUTPUT_DIRECTORY:指明了已经完成的目标文件应该建立的位置
FOLDER:设定文件夹名称。用来在IDE中组织目标,目标没有FOLDER属性将会出现在顶级目录。targets连上相同的FOLDER属性值将会出现在文件名相邻的两边。
5、TARGET_LINK_LIBRARIES
指明使用的库或者标志当链接到给定的目标或者他的依赖对象。
target_link_libraries(<target>...<item>...)
6、ADD_DEPENDENCIES
功能同target_link_libraries,但依赖库没有时,target_link_libraries会报错。用到的情况就是两个target有依赖关系并且依赖库也是通过编译源代码产生的,这时候可以通过add_dependencies在直接编译上层target时,自动检查下层依赖库是否已经生成。没有的话先编译下层依赖库,再编译上层target,最后link。
7、file指令
file(GLOB HEADERS "./*.h" "./*.hpp")
source_group("include" FILES ${HEADERS})
file指令可以包含所需要的文件
8、add_definitions命令
add_definitions(-DFOO -DBAR)
//用于添加编译器命令行标志(选项),通常情况下我们使用其来添加预处理器定义
参考: