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接口设置为可见(_EXPORT)。

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>])