0

tl;博士;

在 CMake 中使用 ADD_LIBRARY 时,它将检查cmake ..所有源文件是否存在。我有一些是在编译时生成的。有没有办法强制 CMake 忽略丢失的文件,因为它们会在需要时存在?

完整版本:

我正在尝试使用 CMake 构建 Sqlite3,并且可以编译它,但是,我需要在 CMake 中注释掉几行并运行它,然后取消注释并再次运行它。我想一口气做完所有事情。

我遇到的主要问题是 Sqlite3 使用了一个名为“lemon”的代码生成器。所以要正确构建一切,我需要编译柠檬。然后我需要运行柠檬。一旦柠檬完成运行,就会有一个名为“parse.c”的新文件。“parse.c”需要包含在构建 sqlite3 的源代码中。

我将删除代码以显示适用的位。

set(SourceFiles
    #Lots of Files are here
    build/parse.c
    )

add_executable(lemon sqlite/tool/lemon.c)
add_custom_target(CreateParse ALL COMMAND 
    cp ../sqlite/tool/lempar.c . 
    && ./lemon -s ../sqlite/src/parse.y 
    && mv ../sqlite/src/parse.h . 
    && mv ../sqlite/src/parse.c . 
    && mv ../sqlite/src/parse.out .)
add_library(sqlite ${SourceFiles})

add_dependencies(CreateParse lemon)
add_dependencies(sqlite CreateParse)

所以这里发生了3个步骤:

  1. 可执行柠檬被创建。
  2. 柠檬用于创建 parse.c(除其他外)
  3. parse.c 与大量其他文件一起编译以创建 sqlite3 库。

使用 add_dependencies 这应该可以工作。但事实并非如此。它不起作用的原因是第一次传递时 build/parse.c 不存在。我已经能够通过注释掉 parse.c 来解决它。完成一半建筑后。然后我可以取消注释它,它将成功编译。

我已经研究过使用 ADD_CUSTOM_COMMAND,我相信它会在cmake ..运行而不是运行时运行柠檬ninja。但是,当cmake ..运行时,“柠檬”还不存在,因此自定义命令无法运行。

编辑 1

所以我想出了一个黑客...

execute_process(COMMAND touch ${CMAKE_SOURCE_DIR}/build/parse.c)

因此,当cmake ..运行时,它将在正确的位置创建一个空文件。但是,必须有更好的方法。帮助表示赞赏。

4

0 回答 0