我正在尝试做类似
的事情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 ..
这可能吗?
答案 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>
。