一、基础概念

Target and Dependencies Control

CMake工程被组织成一个个Target,每个Target具有Target Properties用于描述自身的细节。Target分为两类,一类是Executable TargetLibrary 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