QMAKE_EXTRA_COMPILERS - 头文件之间依赖关系的问题

时间:2010-12-21 15:14:37

标签: c++ qt bison qmake flex-lexer

我正在使用flex和bison创建一个Qt项目。头文件_CMPL_Parser.hh(由bison生成)与头文件compile.hh#include _CMPL_Parser.hh)之间存在依赖关系。

我使用QMAKE_EXTRA_COMPILERS在我的项目中包含flex和bison(请参阅下面的项目文件部分)。不幸的是,_CMPL_Parser.hh是在编译器需要此文件以将其包含在compiler.hh -> compiler.cc中之后创建的。

...

FLEX_SOURCES = src/cmpl/CMPL_Scanner.l
BISON_SOURCES = src/cmpl/CMPL_Parser.yy

flex.commands=flex -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
flex.output= $$OUT_PWD/_CMPL_Scanner.cc
flex.input=FLEX_SOURCES
flex.variable_out=SOURCES
flex.name=flex ${QMAKE_FILE_IN}
QMAKE_EXTRA_COMPILERS+=flex

bisonsource.commands=bison -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
bisonsource.output= $$OUT_PWD/_CMPL_Parser.cc
bisonsource.input=BISON_SOURCES
bisonsource.variable_out=SOURCES
bisonsource.name=bisonsource ${QMAKE_FILE_IN}
QMAKE_EXTRA_COMPILERS+=bisonsource

bisonheader.commands=@true
bisonheader.output= $$OUT_PWD/_CMPL_Parser.hh
bisonheader.input=BISON_SOURCES
bisonheader.variable_out=HEADERS
bisonheader.name=bisonheader ${QMAKE_FILE_IN}
#bisonheader.depends= bin/_CMPL_Parser.cc
QMAKE_EXTRA_COMPILERS+=bisonheader

...

HEADERS += src/cmpl/Compiler.hh \
           src/cmpl/FileIO.hh \
     ...

SOURCES += src/cmpl/Compiler.cc \
           src/cmpl/FileIO.cc \
       ...

我还尝试在项目文件中定义以下依赖项。但它也失败了。

chh.input = src/cmpl/Compiler.hh
chh.depends = $$OUT_PWD/_CMPL_Parser.hh
chh.name = chh
chh.dependency_type = TYPE_C
chh.variable_out = HEADERS
QMAKE_EXTRA_COMPILERS += chh

如何表达_CMPL_Parser.hh在被其他文件使用之前是否可以创建?

感谢。

1 个答案:

答案 0 :(得分:2)

  1. 据我所见,QMake已经附带了lex / yacc集成,在所有平台上都使用flex。所以对于flex,只需说:

    CONFIG += lex
    LEXSOURCES += src/cmpl/CMPL_Scanner.l
    
  2. QMake确实不支持野牛开箱即用。但看到yacc和野牛基本相同,我会尝试以下内容:

    QMAKE_YACC=bison
    # maybe adjust some other QMAKE_YACC* variables
    CONFIG += yacc    
    YACCSOURCES += src/cmpl/CMPL_Parser.yy
    
  3. 此外,如果在bison作业完成之前遇到编译作业运行的问题(看起来是一个qmake错误),你应该使用这个解决方法:

    lex.CONFIG += target_predeps
    yacc_impl.CONFIG += target_predeps
    yacc_decl.CONFIG += target_predeps
    

    这将强制每个QMAKE_EXTRA_COMPILERS的输出成为(主)目标的依赖关系,有效地确保在编译开始之前生成的文件可用。