使用cmake传递变量值

时间:2015-07-13 15:15:50

标签: c++ cmake

我正在尝试做类似

的事情
cmake -DUSE_FILES_FOR_INPUT=ON ..

然后让make使用-DUSE_FILES_FOR_INPUT=ON编译我的文件。但我没有得到=ON值。它似乎应该写入flags.make文件,但它不是:

$ grep USE_FILES_FOR_INPUT source/CMakeFiles/myprogram.dir/flags.make
CXX_DEFINES = -DUSE_FILES_FOR_INPUT

如果我用-DUSE_FILES_FOR_INPUT=ON手动更改该文件,那么一切正常。 如何让cmake在flags.make中添加值?

我需要做的不同的方法:我使用的变量有BOOL类型,所以它足够好

CXX_DEFINES = -DUSE_FILES_FOR_INPUT时{p> cmake -DUSE_FILES_FOR_INPUT=ON .. 和 我CXX_DEFINES =

cmake -DUSE_FILES_FOR_INPUT=OFF ..

这可能吗?

2 个答案:

答案 0 :(得分:3)

这是一个小型演示,

// demo.cpp
#include <iostream>
using namespace std;

int main()
{
#ifdef USE_FILES_FOR_INPUT
    cout << "Using files.." << endl;
#else
    cout << "Not using files.." << endl;
#endif


    return 0;
}

CMakeLists.txt,

cmake_minimum_required(VERSION 3.0)

add_executable(demo demo.cpp)

if (USE_FILES_FOR_INPUT)
    add_definitions(-DUSE_FILES_FOR_INPUT)
endif()

示例输出

baris$ cmake . && make && ./demo
<...>
Not using files..

baris$ cmake -DUSE_FILES_FOR_INPUT=ON . && make && ./demo
<...>
Using files..

答案 1 :(得分:0)

您应该查看configure_file documentation。他们使用特殊的cmake构造#cmakedefine显示了一个示例。这可能比Baris描述的工作多一点,但我更喜欢使用configure_file#cmakedefine将cmake设置转换为C ++代码。

以下是完整的example

考虑一个包含foo.h.in文件的源树:

#cmakedefine FOO_ENABLE
#cmakedefine FOO_STRING "@FOO_STRING@"

相邻的CMakeLists.txt可以使用configure_file配置标头:

option(FOO_ENABLE "Enable Foo" ON)
if(FOO_ENABLE)
  set(FOO_STRING "foo")
endif()
configure_file(foo.h.in foo.h @ONLY)

这将在与此源目录对应的构建目录中创建foo.h。如果启用了FOO_ENABLE选项,则配置的文件将包含:

#define FOO_ENABLE
#define FOO_STRING "foo"

否则它将包含:

/* #undef FOO_ENABLE */
/* #undef FOO_STRING */

然后可以使用include_directories()命令将输出目录指定为包含目录:

include_directories(${CMAKE_CURRENT_BINARY_DIR})

以便来源可以包含标题为#include <foo.h>