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

Ede*_*ana 5 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}")
Run Code Online (Sandbox Code Playgroud)

我试图制作并安装它,但它不工作,文件没有改变.我做了什么错了?

小智 11

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

const char* ROOT_PATH = "${BUILD_PATH}";
Run Code Online (Sandbox Code Playgroud)

在你的CMakeLists.txt,你可以做这样的事情:

configure_file( io_utils.h.in io_utils.h )
Run Code Online (Sandbox Code Playgroud)

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

const char* ROOT_PATH = "/path/to/CMakeLists.txt";
Run Code Online (Sandbox Code Playgroud)

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

  • 由于并非所有文件都是您可能想要搜索/替换的标头,因此获得原始问题的答案以及建议的替代方案仍然很有趣。 (2认同)