#cmakedefine substitution

时间:2018-01-26 15:39:05

标签: cmake c-preprocessor config

假设我的CMakeLists.txt有:

check_function_exists(getopt HAVE_GETOPT)
configure_file(config.h.in config.h @ONLY)

并在config.h.in我有:

#cmakedefine HAVE_GETOPT @HAVE_GETOPT@
#cmakedefine STDLIB_HAS_GETOPT @HAVE_GETOPT@

我希望看到

#define HAVE_GETOPT 1
#define STDLIB_HAS_GETOPT 1
通过后。相反,我得到:

#define HAVE_GETOPT 1 
/* #undef STDLIB_HAS_GETOPT */

为什么行为不同?

注意:

  • 将cMake v3.5.1和GNU / Linux Mint 18.3与内核4.10一起使用。

3 个答案:

答案 0 :(得分:2)

要获得所需的行为,请不要使用cmakedefine,而是使用cmakedefine01代替(请注意尾随01)。在您的示例中:

#cmakedefine01 HAVE_GETOPT @HAVE_GETOPT@
#cmakedefine01 STDLIB_HAS_GETOPT @HAVE_GETOPT@

文档:https://cmake.org/cmake/help/latest/command/configure_file.html

答案 1 :(得分:1)

对于STDLIB_HAS_GETOPT,您不能在第二个参数中使用不同的变量,然后在第一个参数中使用。您必须在运行configure_file之前定义check_function_exists(getopt HAVE_GETOPT) set(STDLIB_HAS_GETOPT HAVE_GETOPT) configure_file(config.h.in config.h @ONLY)

<Directory Id="DesktopFolder"/>

答案 2 :(得分:0)

对于configure_file

Documentation很明确:

...表格的输入行:

#cmakedefine VAR ...

将替换为:

#define VAR ...

或:

/* #undef VAR */

取决于是否在CMake中设置了VAR ...

只有 VAR 的值才有意义,其后的所有内容都与#define#undef之间的CMake选择无关。

因此,#cmakedefine HAVE_GETOPT转换为#define,但#cmakedefine STDLIB_HAS_GETOPT转换为#undef(因为变量 STDLIB_HAS_GETOPT 未设置为CMake代码)。