CMake依赖于包含的文件



从为(f)词法分析器定义lex包含文件的问题中,我们已经知道没有已知的lex发行版具有包含文件功能,例如将规则包含到lex文件中。

建议写一个自己的预处理器。

当定义自己的预处理器时,当然会生成对所包含文件的依赖关系,因此当这样的文件被更改时,人们希望重新构建"词法"。文件。与C/c++的依赖关系处理(据我所知)自动(可能通过一些CMake脚本)。

  • 如何完成lex文件中包含的文件的依赖规则?

编辑

假设我有一个原始的.l文件configimpl.l,其中包括文件aa.incbb.inc,通过python脚本将原始的.l文件(${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l)转换为新的.l(${GENERATED_SRC}/${lex_file}.l)文件(我们也有一个输出文件${GENERATED_SRC}/${lex_file}.corr,但这与这里无关)。当然,一切都是"制造"的。变量等设置正确

我的预处理代码(即包括包含文件到.l文件)是:

add_custom_command(
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l  ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${CMAKE_CURRENT_LIST_DIR}
DEPENDS ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${LEX_INC_FILES}
OUTPUT  ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.l
)

,这工作得很好,除非aa.incbb.inc更改了生成的include "${GENERATED_SRC}/${lex_file}.lis not rebuild.

基于这个问题:动态依赖于自定义源文件我已经尝试创建一些东西,但失败了。

add_custom_command(
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/dep_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l  ${GENERATED_SRC}/${lex_file}.d ${GENERATED_SRC}/${lex_file}.l ${CMAKE_CURRENT_LIST_DIR}
DEPENDS ${CMAKE_CURRENT_LIST_DIR}/dep_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
OUTPUT  ${GENERATED_SRC}/${lex_file}.d
)
set_source_files_properties(${GENERATED_SRC}/${lex_file}.d PROPERTIES GENERATED 1)
add_custom_command(
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l  ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${CMAKE_CURRENT_LIST_DIR}
DEPENDS ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
DEPFILE ${GENERATED_SRC}/${lex_file}.d
OUTPUT  ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr
)

所以我首先运行一个依赖检测步骤,创建一个文件${GENERATED_SRC}/${lex_file}.d,内容如下:

${GENERATED_SRC}/generated_src/configimpl.l: ${CMAKE_CURRENT_LIST_DIR}/aa.inc
${GENERATED_SRC}/generated_src/configimpl.l: ${CMAKE_CURRENT_LIST_DIR}/bb.inc

在这个生成的文件中,路径当然被设置为完整路径。在此之后,运行原始的预处理步骤,但现在有了额外的DEPFILE ${GENERATED_SRC}/${lex_file}.d,这应该表明有一些额外的依赖项。

当我更改aa.incbb.inc时,${GENERATED_SRC}/${lex_file}.l没有重建,我错过了什么?

使用CMake版本:CMake版本3.22.1使用生成器:NMake Makefiles

将DEPFILE输出设置为一行,这样效果最好。从记忆中来看,我认为深度文件的解析器不够聪明,无法处理多行。如果有疑问,请参见gcc的-MT -MD的输出,格式应该相同。

最新更新