我有一个自定义工具,可以处理给定的IDL文件列表,并生成许多.cpp和.h文件作为输出。我想将这些文件添加到我的CMakeLists中要编译的事物列表中,并且还模拟这些文件在IDL上的依赖关系。 为了简单起见,我将声明对任何IDL文件的任何更改都应该触发所有cpp / h的重新生成。
我有一个自定义命令,负责运行生成器工具并将所有IDL文件列为依赖项。
我的问题是在构建时将后续的cpp / h文件列表导入cmake。无法从IDL文件的名称推断出将生成哪些cpp文件。但是,我的生成器工具会将生成的文件列表输出到文本文件中。
所以我的问题是:我如何指示cmake“读取此文本文件并将内容添加为要编译的额外源和头文件”,同时请记住,所述文本文件仅存在于某一点构建?
答案 0 :(得分:3)
CMake需要能够在配置时推断参与构建的所有.cpp文件的名称。之后无法在不重新运行CMake的情况下添加文件。
一种可能的方法是使用两阶段CMake构建:您可以创建一个单独的CMake项目,而不是直接从主项目构建生成的源文件。
然后在主CMake项目中添加一个在代码生成后运行的自定义目标,并调用CMake来配置和构建生成的文件项目。
这里的缺点是生成的文件不再作为主项目的一部分出现。如果你不想每次重建生成的源都需要一些技巧 - 自定义目标总是被认为是过时的,所以你可能想在这里使用一个脚本,如果生成的文件只在子项目上运行CMake改变。
答案 1 :(得分:2)
这已经晚了几年,但这很好用:
#run whatever tool that generates the cpp files
execute_process(COMMAND "./your_tool.sh")
#read files from files.txt and make a cmake 'list' out of them
file(READ "files.txt" SOURCES)
#found this technique to build the cmake list here:
#http://public.kitware.com/pipermail/cmake/2007-May/014236.html
#maybe there is a better way...
STRING(REGEX REPLACE ";" "\\\\;" SOURCES "${SOURCES}")
STRING(REGEX REPLACE "\n" ";" SOURCES "${SOURCES}")
#at this point you have your source files inside ${SOURCES}
#build a static library...?
add_library(mylib STATIC ${SOURCES})
答案 2 :(得分:0)
有一个函数直接从文件构建列表:
file(STRINGS <filename> <variable> [<options>...])