从为(f)词法分析器定义lex包含文件的问题中,我们已经知道没有已知的lex发行版具有包含文件功能,例如将规则包含到lex文件中。
建议写一个自己的预处理器。
当定义自己的预处理器时,当然会生成对所包含文件的依赖关系,因此当这样的文件被更改时,人们希望重新构建"词法"。文件。与C/c++的依赖关系处理(据我所知)自动(可能通过一些CMake脚本)。
- 如何完成lex文件中包含的文件的依赖规则?
编辑
假设我有一个原始的.l
文件configimpl.l
,其中包括文件aa.inc
和bb.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.inc
或bb.inc
更改了生成的include "${GENERATED_SRC}/${lex_file}.l
is 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.inc
或bb.inc
时,${GENERATED_SRC}/${lex_file}.l
没有重建,我错过了什么?
使用CMake版本:CMake版本3.22.1使用生成器:NMake Makefiles
将DEPFILE输出设置为一行,这样效果最好。从记忆中来看,我认为深度文件的解析器不够聪明,无法处理多行。如果有疑问,请参见gcc的-MT -MD
的输出,格式应该相同。