如何使用CMake将文件中的字符串替换为当前目录的值

时间:2014-03-09 21:50:54

标签: cmake

我正在尝试让另一个人的研究代码重现,以便其他人不会遇到我现在遇到的同样的问题。但是,我缺乏cmake的经验。这是我在阅读文档后可以做的事情:
在与我的CMakeLists.txt相同的文件夹中,我有一个名为io_utils.h的文件,其中ROOT_PATH变量的值为VALUE_ROOT_PATH。 我想用文件的当前目录的值替换该字符串。所以我尝试将以下内容添加到CMakeLists.txt

# Set ROOT_PATH in io_utils.h
FIND_PATH(BUILD_PATH CMakeLists.txt . )
FILE(READ ${BUILD_PATH}io_utils.h IO_UTILS)
STRING(REGEX REPLACE "VALUE_ROOT_PATH" "${BUILD_PATH}" MOD_IO_UTILS "${IO_UTILS}" )
FILE(WRITE ${BUILD_PATH}io_utils.h "${MOD_IO_UTILS}")

我尝试制作并安装它但它无法正常工作,文件未更改。我做了什么错了?

2 个答案:

答案 0 :(得分:11)

我建议使用configure_file cmake宏的不同方法。首先,创建一个模板文件,该文件引用您计划在cmake中设置的任何变量,然后宏将实际值替换为变量。例如,假设我们有一个模板文件io_utils.h.in,如下所示:

const char* ROOT_PATH = "${BUILD_PATH}";

CMakeLists.txt中,您可以执行以下操作:

configure_file( io_utils.h.in io_utils.h )

当您运行cmake时,它将使用第一个文件作为模板(此处为io_utils.h.in)生成第二个文件(此处称为io_utils.h),其值替换为:< / p>

const char* ROOT_PATH = "/path/to/CMakeLists.txt";

顺便说一下,CMake有一个内置变量,它引用了名为CMakeLists.txt的顶级CMAKE_SOURCE_DIR的目录。尝试使用此变量替换上面的BUILD_PATH

答案 1 :(得分:1)

在这种情况下,定义宏并让预处理器完成工作似乎要容易得多:

add_definition(ROOT_PATH ${VALUE_ROOT_PATH})