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个步骤:
- 可执行柠檬被创建。
- 柠檬用于创建 parse.c(除其他外)
- 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 ..
运行时,它将在正确的位置创建一个空文件。但是,必须有更好的方法。帮助表示赞赏。