.pro文件代码:
#flex/bison sources
FLEXSOURCES += \
lexyacc/vlg.l \
lexyacc/cst.l
BISONSOURCES += \
lexyacc/vlg.y \
lexyacc/cst.y
#flex
flex.input = FLEXSOURCES
flex.output = $$PWD/${QMAKE_FILE_BASE}_lex.cpp
flex.commands = flex -P${QMAKE_FILE_BASE} -o${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
flex.clean = ${QMAKE_FILE_OUT}
flex.variable_out = SOURCES
flex.CONFIG = target_predeps
QMAKE_EXTRA_COMPILERS += flex
#bison
bison.input = BISONSOURCES
bison.output = $$PWD/${QMAKE_FILE_BASE}_yacc.cpp
bison.commands = bison -d -l -o ${QMAKE_FILE_OUT} -p ${QMAKE_FILE_BASE} ${QMAKE_FILE_IN}
bison.clean = $$$$PWD/${QMAKE_FILE_BASE}_yacc.cpp $$$$PWD/${QMAKE_FILE_BASE}_yacc.hpp
bison.variable_out = SOURCES
bison.CONFIG = target_predeps
QMAKE_EXTRA_COMPILERS += bison
首先定义了变量FLEXSOURCES 和 BISONSOURCES 分别指向lex/yacc文件列表。因为我的项目中共有两个parser,所以相应的有两个lex文件和两个yacc文件。
qmake允许自定义工具来处理特殊的文件,这里我定义了两个工具分别名为flex和bison,有关这部分内容可以参考qmake Manual,不过官方文档中关于这部分的说明并不详细,很多参数并没有在文档中给出,更详细的说明可以参考这篇非官方的文档Undocumented qmake,其中列出了很多官方文档中没有的内容。
下面详细解释这两个自定义工具。
input 属性指定了自定义工具需要处理的文件列表。我们自定义的flex工具需要处理的是lex文件,也就是FLEXSOURCES中的文件,相应的,bison工具需要处理的是BISONSOURCES中的文件。
output 属性指定了自定义工具执行后生成的文件名(可以包含路径)。需要注意的是,并不能保证最终生成的文件与output定义一致,或者说这仅仅是我们希望能够得到的文件。在我们定义的output中,PWD为项目当前路径,QMAKE_FILE_BASE为当前处理的文件名去除后缀。例如当flex工具处理vlg.l 时,output为vlg_lex.cpp,路径在当前路径下,当bison处理cst.y,output为cst_yacc.cpp,路径在当前路径下(但事实并非仅仅如此,后面会讲到)。
commands 属性指定了工具需要执行的命令。其中QMAKE_FILE_IN为当前的input,QMAKE_FILE_OUT即为当前input的output。例如当flex处理vlg.l 时,commands为
flex -Pvlg -o somepath/vlg_lex.cpp vlg.l
又例如当bison处理vlg.y时,commands为
bison -d -l -o somepath/vlg_yacc.cpp -p vlg vlg.y
这时会发现,如果执行上面的命令,bison实际上会生成vlg_yacc.cpp和vlg_yacc.hpp两个文件,而vlg_yacc.hpp并不在之前定义的output中,不过这对后面的编译链接过程并没有影响。
clean 属性指定了当我们执行clean操作时需要删除的文件。所以在bison的clean中,我们需要把上面说的两个文件都删除。
variable_out 属性指定了生成的output将会被添加到哪里。在我们的定义中,flex和bison的output都会被添加到SOURCES中,以便让qmake继续处理。
CONFIG 属性对自定义工具进行若干配置。我们添加的target_predeps参数将会使flex和bison优先执行。其他配置具体可以查阅文档。
最后,把自定义的flex和bison工具添加到QMAKE_EXTRA_COMPILERS中,qmake将会识别这两个自定义工具,并在bulid或clean时按定义执行它们。所以,当qmake执行时,通过调用flex和bison,会先得到vlg_lex.cpp vlg_yacc.cpp vlg_yacc.hpp cst_lex.cpp cst_yacc.cpp cst_yacc.hpp这六个文件,然后在继续编译链接过程。
以上方法在Windows/Desktop Qt 5.3 MSVC 32bit 构建套件下运行测试通过,并且支持shadow build。
版权声明:本文为CSDN博主「liyccccc」的原创文章,遵循CC 4.0 BY-SA版权协议
原文链接:https://blog.csdn.net/liyccccc/article/details/27341963