添加带有生成源文件的 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 个步骤:

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

使用 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...