2010-09-09 2 views
4

Вот мой Makefile:Makefile циклическая зависимость

.PHONY: all homework1 
CFLAGS= -g -O0 -Wall -Werror -Wno-unused-function 
LDFLAGS= -lm 

all : homework1 

homework1 : program.tab.o program.lex.o 
%.o : %.c 
    gcc [email protected] -c $(CFLAGS) $< 
%.lex.c : %.lex %.tab.h 
    flex [email protected] $< 
%.tab.c %.tab.h : %.y 
    bison --verbose [email protected] -d $< 

Всякий раз, когда я пытаюсь скомпилировать, я получаю предупреждение make: Circular program.lex <- program.lex.o dependency dropped. я не вижу, как program.lex зависит от program.lex.o вообще в Makefile. Я вижу, как дерево зависимостей составляет около 4 слоев, но оно не выглядит круговым.

Как я могу улучшить свой makefile?

+0

Не только ваш вопрос помечен как «домашняя работа» (без каких-либо просьб), но ваш исполняемый файл также называется «домашнее задание». Просто наблюдение! Нет комментариев: D – Rahul

+1

Это домашнее задание. Конечно, домашнее задание состоит в том, чтобы написать файлы flex и bison, а не makefile. Makefile должен быть легкой частью: P – Mike

+1

Makefiles никогда не бывает легким, по моему опыту. – reinierpost

ответ

2

@aaa карп является правильным, что является неявным правилом, но это не один из LEX правил, потому что они строят N.c или N.r из N.l, и это правило, которое строит N из N.o. Это выглядит как правило «Связывание одного объектного файла», описанное в info (make) Catalogue of Rules. Переименование файлов .lex на .l будет исправлено.

Также: работает flex, я не думаю, что вам действительно нужен файл .tab.h для создания источника лексера.Попробуйте вместо этого:

%.l.c: %.l 
    flex [email protected] $< 
program.l.o: program.tab.h 

Это добавит дополнительную зависимость к program.l.o.

+0

+1, я стою исправлен, понял это сейчас – Anycorn

+0

Спасибо! Устраняет проблему. Хотел бы я знать все эти неявные правила. Вы знаете, могу ли я их отключить? – Mike

+0

@Mike: http://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules - это каталог всех правил. 'make -r' будет работать без неявных правил, но я не помню, работает ли это как параметр в переменной' MAKEFLAGS', или если он должен быть указан в командной строке. –

2

перспективы сделать с опцией -d: ".lex *"

Considering target file `all'. 
File `all' does not exist. 
    Considering target file `homework1'. 
    File `homework1' does not exist. 
    Considering target file `program.lex.o'. 
    File `program.lex.o' does not exist. 
    Looking for an implicit rule for `program.lex.o'. 
    Trying pattern rule with stem `program.lex'. 
    Trying implicit prerequisite `program.lex.c'. 
    Found an implicit rule for `program.lex.o'. 
     Considering target file `program.lex.c'. 
     Looking for an implicit rule for `program.lex.c'. 
     Trying pattern rule with stem `program'. 
     Trying implicit prerequisite `program.lex'. 
     Found an implicit rule for `program.lex.c'. 
     Considering target file `program.lex'. 
     Looking for an implicit rule for `program.lex'. 
     Trying pattern rule with stem `program.lex'. 
     Trying implicit prerequisite `program.lex.o'. 
     Found an implicit rule for `program.lex'. 
make: Circular program.lex <- program.lex.o dependency dropped. 

есть неявное правило ссылки, которая вызывается, не ЛЕКС я первоначально подавлен

избавиться от расширения

+0

Нет - это правило, которое пытается связать программы, созданные из одного объектного файла. –

5

Проблема заключается в том, что в Make (в GNOME) есть неявное правило для связывания одного объектного файла для сборки en executable. Ваш файл makefile ничего не говорит о том, как построить program.lex, поэтому Make отказывается от неявного правила, чтобы построить его с program.lex.o.

С вашего макета, кажется, зависит от наличия program.lex, чтобы начать с, вы можете подавить неявное правило, добавляя свои собственные правила для program.lex (который ничего не делает):

program.lex:; 
+0

Приятный трюк, чтобы заставить замолчать неявное правило. Я этого раньше не видел. –

0

Моя немедленная реакция была, что вы нужно действие после того, как правило, которое говорит homework1: program.tab.o program.lex.o:

homework1: program.tab.o program.lex.o 
     ${CC} -o [email protected] program.tab.o program.lex.o ${LDFLAGS} 

Однако, поскольку вы также отмечены homework1 как .PHONY, может быть, вы не готовы связать Progra м еще. Но ваша проблема воспроизводит ...

Обычно источник для Lex (или Flex) хранится в .l файле, а не в .lex файле, так что я изменил Makefile, чтобы:

.PHONY: all homework1 
CFLAGS= -g -O0 -Wall -Werror -Wno-unused-function 
LDFLAGS= -lm 

all : homework1 

homework1 : program.tab.o program.lex.o 

%.o : %.c 
    gcc -o [email protected] -c $(CFLAGS) $< 
%.lex.c : %.l %.tab.h 
    flex -o [email protected] $< 
%.tab.c %.tab.h : %.y 
    bison --verbose -o [email protected] -d $< 

предупред сообщение уходит. (Я создал вашу среду, сначала используя «touch program.lex program.y», затем переместил program.lex в program.l).

Тем не менее, я все еще не совсем уверен, что происходит в сломанной версии, но он, вероятно, вращается вокруг неявных правил, как это предлагает @Beta.

+0

«Поломка» в «сломанной версии» из правила «Связывание одного объекта» ('foo.o' ->' foo'). –

Смежные вопросы