CMakeLists - Option
CMake中的option用于控制编译流程,相当于C语言中的宏条件编译
1. option
option(<variable> "<help_text>" [value])
- variable:定义选项名称
- help_text:说明选项的含义
- value:定义选项默认状态,一般是OFF或者ON,除去ON之外,其他所有值都为认为是OFF。
option 依赖控制 cmakelist
add_definitions() 用来定义项目的宏
2. function
function的定义格式如下:后面可作为命令供调用
function(<name> [<arg1> ...])
<commands>
endfunction()
其中name是function的名字,参数为arg1, arg2等。function名称不区分大小写,但强烈建议使用function定义中声明的相同名称。通常,function使用全小写名称。示例代码段如下:
message("1.function名称不区分大小写,但始终建议使用function定义中声明的相同名称")
function(csdn_addr)
message("csdn addr: https://blog.csdn.net/fengbingchun")
endfunction()
csdn_addr()
CSDN_ADDR()
csdn_ADDR()
3. configure_file
configure_file 指令通过读取输入文件中的内容,将 CMakeLists.txt 文件中的变量转变为 C/C++ 中可识别的宏定义,然后存入另一个文件中。其语法格式如下。其中,input 为输入的文件,output 为输出的文件。通常,输入文件为 http://xxx-config.h.in,输出文件为 xxx-config.h。
configure_file(<input> <output>
[NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
FILE_PERMISSIONS <permissions>...]
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
主要参数说明:
- input:输入的文件名,通常为 http://xxx-config.h.in;
- output:输出的文件名,通常为 xxx-config.h;
- @ONLY:在
<input>文件中只使用 @VAR@ 的方式获取变量值,不适用 ${VAR} 的方式;
4. find_program
用于查找(在默认路径下,以及path1,path2...)程序 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),如果没有找到则结果为 <VAR>-NOTFOUND。
find_program (<VAR> name1 [path1 path2 ...])
find_program ( SVNVERSION svnversion NO_CMAKE_FIND_ROOT_PATH )
5. set_property
在给定范围内设置一个对象的属性。
set_property(<GLOBAL |
DIRECTORY [<dir>] |
TARGET [<target1> ...] |
SOURCE [<src1> ...]
[DIRECTORY <dirs> ...]
[TARGET_DIRECTORY <targets> ...] |
INSTALL [<file1> ...] |
TEST [<test1> ...] |
CACHE [<entry1> ...] >
[APPEND] [APPEND_STRING]
PROPERTY <name> [<value1> ...])
# 其基本格式为:
set_property(<Scope> [APPEND] [APPEND_STRING] PROPERTY <name> [value...])
6. check_source_compiles / check_c_source_compiles / check_cxx_source_compiles
尝试仅编译一段代码来生成可执行程序,从而检测编译器是否支持代码中的某些语言特性。原型为:
check_source_compiles(<lang> <code> <resultVar>
[FAIL_REGEX <regex1> [<regex2>...]]
[SRC_EXT <extension>]) # needs "include(CheckSourceCompiles)"
check_c_source_compiles(<code> <resultVar>
[FAIL_REGEX <regex1> [<regex2>...]]) # needs "include(CheckCSourceCompiles )"
check_cxx_source_compiles(<code> <resultVar>
[FAIL_REGEX <regex1> [<regex2>...]]) # needs "include(CheckCXXSourceCompiles)"
include(CheckCXXSourceCompiles)
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/checks/atomic_check.cpp atomic_check_cpp)
check_cxx_source_compiles("${atomic_check_cpp}" HAVE_CXX_ATOMICS_WITHOUT_LIB)
if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
# cmake --help-policy CMP0075
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
check_cxx_source_compiles("${atomic_check_cpp}" HAVE_CXX_ATOMICS_WITH_LIB)
if(NOT HAVE_CXX_ATOMICS_WITH_LIB)
message(WARNING "Compiler doesn't support std::atomic<long long>")
else()
update_cached_list(MK_LINK_LIBRARIES atomic)
endif()
endif()
7. GenerateExportHeader
generate_export_header()用于为library export宏定义。生成一个适用于预处理的文件,包含用在library中的EXPORT宏定义。
适用场景:假设我们用了一个自定义library,为避免跟用到的其他库重名,但又不得不开放public接口,就可以应用到generate_export_header 导出library export宏定义,将非public接口隐藏,将public接口设置为可见(
CMake v3.12新增对C项目支持,老版本只支持C++项目。
include (GenerateExportHeader)
GENERATE_EXPORT_HEADER( LIBRARY_TARGET
[BASE_NAME <base_name>]
[EXPORT_MACRO_NAME <export_macro_name>]
[EXPORT_FILE_NAME <export_file_name>]
[DEPRECATED_MACRO_NAME <deprecated_macro_name>]
[NO_EXPORT_MACRO_NAME <no_export_macro_name>]
[STATIC_DEFINE <static_define>]
[NO_DEPRECATED_MACRO_NAME <no_deprecated_macro_name>]
[DEFINE_NO_DEPRECATED]
[PREFIX_NAME <prefix_name>])