2010-12-21 35 views
3

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

我使用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 

[email protected] 
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是之前被其他文件中使用它来创建?

谢谢。

回答

2
  1. QMake已经配备了一个lex/yacc集成,它可以在所有平台上使用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. 此外,如果碰上其中野牛工作完成之前编译作业运行的问题(一qmake的错误,似乎),你应该使用此解决方法:

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

    这将迫使这些QMAKE_EXTRA_COMPILERS的输出是(主)目标的依赖,有效地保证了生成的文件可用之前编译开始。