CMake最佳实践(持续补充)
一、基础概念
Target and Dependencies Control
CMake工程被组织成一个个Target,每个Target具有Target Properties用于描述自身的细节。Target分为两类,一类是Executable Target或Library Target,称为Binary Target;另一类是用户自定义命令,称为Custom Target。使用CMake管理一个工程就是清晰地描述这些Target以及他们之间的依赖。
Binary Target
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
[e.g.]
add_executable(foo, ${source_files})
add_library(foo_static, STATIC, ${source_files}) # static library
add_library(foo_dynamic, SHARED, ${source_files}) # dynamic library
- INCLUDE_DIRECTORIES:编译器的\(-I\)参数;
- COMPILE_DEFINITIONS:编译器的\(-D\)参数;
- COMPILE_OPTIONS:用于指定其他编译属性;
- binary target之间的依赖使用target_link_libraries()命令描述。
Custom Target
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[JOB_POOL job_pool]
[VERBATIM] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
[SOURCES src1 [src2...]])
Dependencies Control
target_link_libraries(<target> <item>...)
add_dependencies(<target> [<target-dependency>]...)
Variables and CMake Built-in Variables
文件操作
指定Compiler
- Specify in command line
CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake ..
- Set CMake Built-in Variable in CMakeLists.txt
set(CMAKE_C_COMPILER "/usr/bin/clang") set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
find_package()
find_package()是CMake提供的一种寻找外部环境依赖的方法,常见的外部环境以来包括:
- Python
- CUDA
- CUDNN
- SWIG
- …