如何解决添加带有生成源文件的 CMake 库
tl;dr;
在 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 个步骤:
使用 add_dependencies 这应该工作。但事实并非如此。它不起作用的原因是 build/parse.c 在第一次通过时不存在。我已经能够通过注释掉 parse.c 来解决它。半楼完成后。然后我可以取消注释它,它就会编译成功。
我已经研究过使用 ADD_CUSTOM_COMMAND,我相信它会在运行 cmake ..
而不是运行 ninja
时运行柠檬。但是,当运行 cmake ..
时,“lemon”尚不存在,因此无法运行自定义命令。
编辑 1
所以我想出了一个黑客...
execute_process(COMMAND touch ${CMAKE_SOURCE_DIR}/build/parse.c)
所以当 cmake ..
运行时,它会在正确的位置创建一个空文件。但是,必须有更好的方法。感谢帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。