Вызов flex из make-файла - PullRequest
0 голосов
/ 19 марта 2012

Я хотел бы вызвать flex для создания файла .l, а затем вызвать gcc для сборки всего.

Я попробовал:

comp:
    lex scanner.l   \
    gcc -o a.out main.c hash.c -I.  

ошибка:

lex scanner.l   \
    gcc -o a.out main.c hash.c -I.  
lex: impossible to opne gcc
/usr/bin/m4:stdin:2994: ERROR: end of file in string

и

lex scanner.l
<tab> gcc -o a.out main.c hash.c -I.

ошибка: отсутствует разделитель.

Файл lex.yy.c, созданный с помощью lex, включен в основной файл.

Заранее спасибо,

Pedro

Ответы [ 4 ]

3 голосов
/ 19 марта 2012

Попробуйте:

lex.yy.c: scanner.l
    lex scanner.l

comp: main.c hash.c
    gcc -o a.out main.c hash.c -I.

main.c: lex.yy.c

Первый набор правил сообщает make, что lex.yy.c необходимо перестроить в любое время scanner.l изменяет и предоставляет команду для воссоздания lex.yy.c .Второй набор правил сообщает make, что поддельная цель comp зависит от main.c и hash.c .Если какой-либо файл изменится, то вызов make comp вызовет перекомпиляцию.Последняя строка - это автономная зависимость, которая указывает make считать main.c грязным в любое время, когда lex.yy.c изменяется.Это также заставит вызов make comp для создания lex.yy.c , если он не существует.

1 голос
/ 19 марта 2012
all: a.out

lex.yy.c: scanner.l
    lex scanner.l

a.out: lex.yy.c main.c hash.c
    gcc -o a.out main.c hash.c -I.  
1 голос
/ 19 марта 2012

Удалите обратную косую черту или добавьте точку с запятой (;) перед ней.
Как и сейчас, две команды добавляются в одну строку и выполняются как одна длинная команда.

0 голосов
/ 19 марта 2012

IIRC обычный шаблон Makefle

a.out: lex.yy.c main.c hash,c
<tab> gcc -o a.out main.c hash.c lex.yy.c -I. -ll

lex.yy.c: scanner.l
<tab> lex scanner.l

Это неправильно, потому что в исходном коде main.c содержит lex.yy.c

Предполагается, что исходный код изменен таким образом, что main.c включает , а не , включая lex.yy.c

Без этого изменения произойдет сбой, потому что будет два определения yylex (), одно из его #include в main.c, а другое потому, что оно поставляется как модуль компиляции исходного кода. Я призываю людей не включать файл .c в другой файл .c.

В общем, соглашение заключается в использовании другого расширения файла (.i) для включенных исходных файлов, которые генерируют уникальные символы и код.

...