QMAKE_EXTRA_COMPILERS — проблемы с зависимостями между заголовочными файлами

Я создаю проект Qt, используя flex и bison. Существует зависимость между заголовочным файлом _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 должен быть создан до того, как он будет использоваться другими файлами?

Спасибо.


person Mike    schedule 21.12.2010    source источник


Ответы (1)


  1. Насколько я понимаю, QMake уже поставляется с интеграцией lex/yacc, которая использует flex на всех платформах. Итак, для гибкости просто скажите:

    CONFIG += lex
    LEXSOURCES += src/cmpl/CMPL_Scanner.l
    
  2. QMake действительно не поддерживает bison из коробки. Но, поскольку yacc и bison в основном одинаковы, я бы попробовал что-то вроде следующего:

    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 быть зависимостью от (основной) цели, эффективно гарантируя, что сгенерированные файлы будут доступны до начала компиляции.

person Marc Mutz - mmutz    schedule 29.04.2011