Makefile круговой зависимости - PullRequest
       33

Makefile круговой зависимости

4 голосов
/ 09 сентября 2010

Вот мой 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$@ -c $(CFLAGS) $<
%.lex.c : %.lex %.tab.h
    flex -o$@ $<
%.tab.c %.tab.h : %.y
    bison --verbose -o$@ -d $<

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

Как мне улучшить мой make-файл?

Ответы [ 4 ]

6 голосов
/ 09 сентября 2010

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

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

program.lex:;
2 голосов
/ 09 сентября 2010

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

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

%.l.c: %.l
    flex -o$@ $<
program.l.o: program.tab.h

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

2 голосов
/ 09 сентября 2010

запустить make с -d:

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.

есть неявное правило ссылки, которое вызывается, а не lex I изначально положил

избавиться от расширений ".lex. *"

0 голосов
/ 09 сентября 2010

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

 homework1:  program.tab.o program.lex.o
         ${CC} -o $@ program.tab.o program.lex.o ${LDFLAGS}

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

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

.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 $@ -c $(CFLAGS) $<
%.lex.c : %.l %.tab.h
    flex -o $@ $<
%.tab.c %.tab.h : %.y
    bison --verbose -o $@ -d $<

Предупреждающее сообщение исчезает.(Я создал вашу среду с помощью 'touch program.lex program.y' изначально; затем я переместил program.lex в program.l).

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

...