cmake简介(PART III: 变量与宏)

在cmake中内置了许多默认的变量,此外还可以根据自己的需要设置变量。cmake还可以根据模板文件自动替换其中的变量,从而实现自动添加版本号等功能。

变量

  • 变量的定义与使用

    在CMakeLists.txt中定义变量使用set()命令。

    1
    set(变量名 值)

    如果要使用变量,需要用以下方式:

    1
    ${变量名}
  • 内置变量

    cmake内置了很多变量,这些变量可以直接拿来使用,具体的可以使用man命令来查看。

    1
    man 7 cmake-variables

模板替换

在实际的项目中,我们一般需要定义一个宏来说明当前的版本号。

在camke中,我们可以通过定义模板,在替换其中的指定部分来针对不同的编译参数使用不同的变量:

首先我们创建模板,cmake/config.h.in

1
2
#define PROJECT_VERSION_MAJOR @VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @VERSION_MINOR@

其中的@...@部分会被替换。

之后我们在CMakeLists.txt中添加如下内容:

1
2
3
4
5
6
7
8
9
# 设置变量名
set (VERSION_MAJOR 2)
set (VERSION_MINOR 0)
# 复制config.h.in到config.h,并替换其中@中间的变量
configure_file (
"${PROJECT_SOURCE_DIR}/cmake/config.h.in"
"${PROJECT_SOURCE_DIR}/include/config.h"
)

configure_file()会将config.h.in中的内容用之前设定的变量所替换,并将替换后的内容保存在include/config.h中。

宏变量

很多情况下,我们需要根据条件来编译不同的模块。这里假设我们需要根据实际情况来选择是否要输出Hello World!

我们可以设置一个叫做DUMP_HELLO的宏变量,来控制是否需要打印。

修改main.c如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include "include/config.h"
#ifdef DUMP_HELLO
#include "include/echo.h"
#endif
#include "include/operations.h"
int main(int argc, char *argv[]) {
printf("The current of hello is %d.%d\n",
PROJECT_VERSION_MAJOR, PROJECT_VERSION_MINOR);
#ifdef DUMP_HELLO
echo();
#endif
int a = 1, b = 2;
int c = add(a, b);
printf("c = %d\n", c);
return 0;
}

我们可以通过修改模板config.h.in来控制是否定义该宏,在config.h.in中添加如下内容:

1
#cmakedefine DUMP_HELLO

并在CMakeLists.txt中添加:

1
2
option (DUMP_HELLO
"print Hello World when execute" OFF)

注意这里我们设置其为OFF也就是不打印Hello World!

既然不打印了,那也就不需要在编译echo.c这个文件了,我们可以在lib/CMakeLists.txt中修改如下:

1
2
3
if (DUMP_HELLO)
add_library(echo echo.c)
endif (DUMP_HELLO)

这样就可以了。


¶ The end

Share Link: http://d0u9.win/posts/650586122.html