Использование опции префикса для flex в стеке automake / flex / bison - PullRequest
1 голос
/ 17 августа 2011

Я конвертирую процесс сборки для использования automake / libtool, и я столкнулся с проблемой для поддержки набора .l / .y.

Исходный процесс сборки выполнялся в два этапа:

flex -t  -Pq_parser_yy ../../code/q_parser.l > q_parser.h
bison ../../code/q_parser.y -o q_parser.c

Flex: я не знаю, как воссоздать опцию -P из файла Makefile.am. В моем Makefile.am я просто перечисляю q_parser.l и позволяю automake выяснить, что делать - но он выдает q_parser.c, а не q_parser.h.

q_parser.h затем включается в q_parser.y, который выводит q_parser.c. Очень запутанно для тех, кто никогда не использовал flex / bison!

Итак, как это работает с automake:

.l.c:
  $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)

q_parser.c: $(db_dir)/q_parser.l
  $(am__skiplex) \
  $(SHELL) $(YLWRAP) `test -f '$(db_dir)/q_parser.l' || echo '$(srcdir)/'`$(db_dir)/q_parser.l $(LEX_OUTPUT_ROOT).c q_parser.c -- $(LEX) $(LFLAGS) $(AM_LFLAGS)

.y.c:
  $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)

Таким образом, automake отображает .l -> .c и .y -> .c, поэтому я столкнулся с ошибкой, когда gcc пытается прочитать вывод .l -> .c и падает на себя.

Мне нужно переопределить automake, чтобы выполнить .l -> .h, и тогда я должен быть в порядке, чтобы позволить ему занять колесо. Любые советы?

1 Ответ

2 голосов
/ 18 августа 2011

Вы можете просто обойти все эти аккуратные вещи, так как это мешает вам:

q_parser.h : ../../code/q_parser.l
        $(LEX) $(LFLAGS) $(AM_LFLAGS) -Pq_parser_yy -o$@ $<
q_parser.c : ../../code/q_parser.y q_parser.h
        $(YACC) $(YFLAGS) $< -o $@

В любом случае, похоже, что совместимость с POSIX - это то, что вам нужно.

...