我有一个工具可以生成一组源文件,这些文件的名称我事先都不知道。
如何为场景编写适当的CMakeLists.txt脚本?此处CMake Compiling Generated Files之前已经有人问过这个问题。但这没有适当的解决方案。
例如,在第一个答案(https://stackoverflow.com/a/8748478/2912478)中,OP可以根据输入的.idl
文件来预测将生成哪些文件。第二个答案(https://stackoverflow.com/a/39258996/2912478)显示了三种不同的解决方法,但我真的无法解决他的问题。
我准备了一个简单的测试用例。假设我有这个静态文件存放在主文件(main.cpp
)中。
# main.cpp
void foo(void);
int main() {
foo();
return 0;
}
当前,我正在使用此CMakeLists.txt
。自定义命令在src
下生成源文件。
# CMakeLists.txt
add_executable(a.out main.cpp)
add_custom_command(
OUTPUT mylib.cpp
COMMAND ${CMAKE_SOURCE_DIR}/genf.sh ${CMAKE_SOURCE_DIR}/src
DEPENDS ${CMAKE_SOURCE_DIR}/genf.sh
)
add_custom_target(GenFile DEPENDS mylib.cpp)
add_dependencies(a.out GenFile)
这里是假设的代码生成器genf.sh
。我使用一个随机数来模仿这样一个事实,即我们不知道生成器将生成哪些文件。
#!/bin/bash
rm -rf $1/*
fname=$(echo $((1 + RANDOM % 100)))
echo "Generating src$fname.cpp"
echo "void foo(void) {}" > $1/src$fname.cpp
我尝试使用GLOB查找生成的所有文件。因此,将以下几行放在CMakeLists.txt
的末尾。这不起作用,因为在运行cmake ..
时,src下没有文件。因此,此解决方案永远不会链接生成的源文件。
file(GLOB GeneratedSourceFiles ${CMAKE_SOURCE_DIR}/src/*.cpp)
target_sources(a.out PUBLIC ${GeneratedSourceFiles})