CMake Manual [TODO]

CMake 常用指令

CMake Manual 摘要

[CMakeLists.txt]

1
2
3
4
5
6
[Example]
PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

PROJECT

PROJECT指令可定义工程名称, 并指定工程支持的语言, (支持的语言列表是可以忽略的, 默认情况表示支持所有语言)

1
PROJECT(projectname [CXX] [C] [Java])

PROJECT隐式的定义了两个 cmake 变量:
<projectname>_BINARY_DIR 和 <projectname>_SOURCE_DIR, 因此[Example]中直接使用.

因为采用的是内部编译,两个变量目前指的都是工程所在路径/backup/cmake/t1.
同时 cmake 系统也预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR,
其值分别与 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR一致. 为了统一起见,
建议直接使用 PROJECT_BINARY_DIR, PROJECT_SOURCE_DIR, 即使修改了工程名称,也不会影响这两个变量.
如果使用了_SOURCE_DIR,修改工程名称后,需要同时修改这些变量.

SET

1
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

SET 指令可以用来显式的定义变量, (也可隐式, 尚未研究)
如果有多个源文件,也可以定义成:

1
SET(SRC_LIST main.c t1.c t2.c)

MESSAGE

三种信息类型:
SEND_ERROR, 产生错误,生成过程被跳过.
SATUS, 输出前缀为—的信息.
FATAL_ERROR, 立即终止所有 cmake 过程.

1
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)

INCLUDE_DIRECTORIES

向工程添加多个特定的头文件搜索路径, 路径之间用空格分割,如果路径中包含了空格, 可以使用双引号将它括起来, 默认的行为是追加到当前的头文件搜索路径的后面.

1
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

两种方式来进行控制搜索路径添加的方式:
1, CMAKE_INCLUDE_DIRECTORIES_BEFORE, 通过 SET 为 on, 可以将添加的头文件搜索路径放在已有路径的前面
2, 通过 AFTER 或者 BEFORE 参数, 也可控制追加还是置前

添加非标准的共享库搜索路径,比如,在工程内部同时存在共享库和可执行二进制,在编译时就需要指定一下这些共享库的路径

1
LINK_DIRECTORIES(directory1 directory2 ...)

为 target 添加需要链接的共享库(静态库.a与动态库.so)

1
TARGET_LINK_LIBRARIES(target library1, <debug | optimized> library2 ...)

ADD_EXECUTABLE

定义了这个工程会生成一个文件名为的可执行文件, 相关的源文件在 SRC_LIST 中

1
ADD_EXECUTABLE(<exec_filename> ${SRC_LIST})

如在 IF 控制语句,变量是直接使用变量名引用,而不需要${}. 如果使用了${}去应用变量,其实 IF 会去判断名为${}所代表的值的变量, 那当然是不存在的了.

特殊环境变量

CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH
务必注意, 这两个是环境变量而不是 cmake 变量。
使用方法是要在 bash 中用 export 或者在 csh 中使用 set 命令设置或者
CMAKE_INCLUDE_PATH=/home/include cmake ..等方式。

Contents
  1. 1. CMake 常用指令
    1. 1.1. CMake Manual 摘要
    2. 1.2. [CMakeLists.txt]
      1. 1.2.1. PROJECT
      2. 1.2.2. SET
      3. 1.2.3. MESSAGE
      4. 1.2.4. INCLUDE_DIRECTORIES
      5. 1.2.5. LINK_DIRECTORIES
      6. 1.2.6. TARGET_LINK_LIBRARIES
      7. 1.2.7. ADD_EXECUTABLE
      8. 1.2.8. 特殊环境变量