目录
本文主要总结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
提供帮助函数,用来创建配置文件
- 创建配置文件: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>]
)
- 创建版本文件
write_basic_package_version_file(<filename>
[VERSION <major.minor.patch>]
COMPATIBILITY <AnyNewerVersion|SameMajorVersion|SameMinorVersion|ExactVersion>
[ARCH_INDEPENDENT] )