CMake之常用模块


本文主要总结cmake中常用到的模块。可以通过 cmake --help-module <module_name>查看帮助

CheckCXXSourceCompiles

检查是否C++源码编译和链接到可执行文件中,CXX可以为C,Fortran等语言
check_cxx_source_compiles

check_cxx_source_compiles(<code> <resultVar>
                          [FAIL_REGEX <regex1> [<regex2>...]])

CheckCXXCompilerFlag

检查CXX编译器是否支持给定的flag
check_cxx_compiler_flag(<flag> <var>) 检查flag是否被编译器支持,检查结果将保存在缓存变量var中

CMakePrintHelpers

用于调试,定义了两个函数用来打印属性和变量

cmake_print_properties([TARGETS target1 ..  targetN]
                      [SOURCES source1 .. sourceN]
                      [DIRECTORIES dir1 .. dirN]
                      [TESTS test1 .. testN]
                      [CACHE_ENTRIES entry1 .. entryN]
                      PROPERTIES prop1 .. propN )

用于打印指定文件的属性

cmake_print_variables(var1 var2 ..  varN)

用于打印给定变量的变量值,通过下面示例看使用场景:

include(CMakePrintHelpers)
file(GLOB DEPEND_SRC ${GMOCK_TEST_SRC}/*.cc)
foreach(var ${DEPEND_SRC})
    cmake_print_variables(${var})  # 这里的意图是打印出有哪些.cc文件
endforeach()

foreach(var a b c d)
    cmake_print_variables(${var})
endforeach()

set(d 10)
set(e "hello")
set(f 12.3)
foreach(var d e f)
    cmake_print_variables(${var})
endforeach()

target_sources(
    mock_lib
    PUBLIC
    ${DEPEND_SRC}
)

在这里插入图片描述

GNUInstallDirs

定义了GNU标准安装目录,包含以下变量:

  • CMAKE_INSTALL_<dir> :文件的目的目录(?),这个值通常是由install 命令的DESTINATION获取的
  • CMAKE_INSTALL_FULL_<dir> :对应于CMAKE_INSTALL_<dir>的绝对路径。
    其中,<dir>为以下值:
    • BINDIR:定义用户可执行文件所在的子目录,即所选安装目录下的bin目录,自验证值为bin
    • SBINDIR:目标代码库所在的子目录,lib或lib64,自验证值为lib
    • LIBEXECDIR
    • SYSCONFDIR
    • SHAREDSTATEDIR
    • LOCALSTATEDIR
    • RUNSTATEDIR
    • LIBDIR:库,lib或lib64
    • INCLUDEDIR:C头文件,该变量为include
      验证如下:
include(GNUInstallDirs)
message(STATUS "CMAKE_INSTALL_LIBDIR is: ${CMAKE_INSTALL_LIBDIR}")
message(STATUS "CMAKE_INSTALL_BINDIR is: ${CMAKE_INSTALL_BINDIR}")
message(STATUS "CMAKE_INSTALL_INCLUDEDIR is: ${CMAKE_INSTALL_INCLUDEDIR}")

message(STATUS "CMAKE_INSTALL_FULL_LIBDIR is: ${CMAKE_INSTALL_FULL_LIBDIR}")
message(STATUS "CMAKE_INSTALL_FULL_BINDIR is: ${CMAKE_INSTALL_FULL_BINDIR}")
message(STATUS "CMAKE_INSTALL_FULL_INCLUDEDIR is: ${CMAKE_INSTALL_FULL_INCLUDEDIR}")

输出:
在这里插入图片描述
从输出中可以看到,安装路径都是在usr/local下(如果是相对路径,默认前缀就是usr/local),这样的话直接安装会报权限不足。所以需要自己指定前缀

GenerateExportHeader

用于为库生成导出宏的函数,提供了GENERATE_EXPORT_HEADER()

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>] # 不导出宏的名称
          [INCLUDE_GUARD_NAME <include_guard_name>]
          [STATIC_DEFINE <static_define>] # 定义宏的名称
          [NO_DEPRECATED_MACRO_NAME <no_deprecated_macro_name>] # 设置宏的名称,在编译时将将要废弃的代码排除在外
          [DEFINE_NO_DEPRECATED] # 指示CMake生成预处理代码,以从编译中排除将要废弃的代码
          [PREFIX_NAME <prefix_name>]
          [CUSTOM_CONTENT_FROM_VARIABLE <variable>]
)

为适合预处理器生成一个文件,该文件包含在类库中使用的导出宏

CMakeDependentOption

cmake_dependent_option(<option> "<help_text>" <value> <depends> <force>) 用来定义依赖于其他选项的选项
当depends为true时,option是有效的,<help_text> 和初始值<value>可以使用;如果depends是无效的,option不可用且值为<force>

CMakePackageConfigHelpers

提供帮助函数,用来创建配置文件

  1. 创建配置文件:configure_package_config_file
configure_package_config_file(<input> <output>
  INSTALL_DESTINATION <path>
  [PATH_VARS <var1> <var2> ... <varN>]
  [NO_SET_AND_CHECK_MACRO]
  [NO_CHECK_REQUIRED_COMPONENTS_MACRO]
  [INSTALL_PREFIX <path>]
  )
  1. 创建版本文件
write_basic_package_version_file(<filename>
  [VERSION <major.minor.patch>]
  COMPATIBILITY <AnyNewerVersion|SameMajorVersion|SameMinorVersion|ExactVersion>
  [ARCH_INDEPENDENT] )

猜你喜欢

转载自blog.csdn.net/u010378559/article/details/130701925
今日推荐