CMake:添加带有未知生成的源文件的可执行文件

时间:2019-06-27 20:26:55

标签: cmake

我有一个工具可以生成一组源文件,这些文件的名称我事先都不知道。

如何为场景编写适当的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

尝试1

我尝试使用GLOB查找生成的所有文件。因此,将以下几行放在CMakeLists.txt的末尾。这不起作用,因为在运行cmake ..时,src下没有文件。因此,此解决方案永远不会链接生成的源文件。

file(GLOB GeneratedSourceFiles ${CMAKE_SOURCE_DIR}/src/*.cpp)
target_sources(a.out PUBLIC ${GeneratedSourceFiles})

0 个答案:

没有答案