Makefiles компилирует файлы, даже когда ничего не меняется - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь создать make-файл, для маленькой оболочки пишу. Файлы:

myShell.c
myShellFunc.c
parser.y
shel.l

Makefile:

CC = gcc
CFLAGS= -g -Wall


myshell: myShell.o myShellFunc.o parser.tab.o lex.yy.o
    $(CC) $(CFLAGS) myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

myShell.o: myShell.c myShell.h parser.tab.h
myShellFunc.o: myShellFunc.c myShell.h

parser.tab.c: bisonfiles
parser.tab.h: bisonfiles
lex.yy.c: shell.l
    flex shell.l

.PHONY: bisonfiles
bisonfiles: parser.y
    bison -d parser.y

Проблема в том, что даже если в файлах нет изменений, он все равно их компилирует.

Когда я запускаю make в первый раз, я получаю это:

bison -d parser.y
gcc -g -Wall   -c -o myShell.o myShell.c
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
flex shell.l
gcc -g -Wall   -c -o lex.yy.o lex.yy.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

Второй раз, когда я запускаю его, ничего не меняя:

bison -d parser.y
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

В третий раз я запускаю его, ничего не меняя:

bison -d parser.y
gcc -g -Wall   -c -o myShell.o myShell.c
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

Почему это происходит, когда я не внес никаких изменений?
Как правильно написать make-файл?

1 Ответ

0 голосов
/ 20 апреля 2019

Из GNU составляют документацию ...

Лживая цель не должна быть предпосылкой для реального файла цели; если это, его рецепт будет запускаться каждый раз, когда make идет, чтобы обновить это файл.

Но у вас есть ...

parser.tab.c: bisonfiles
parser.tab.h: bisonfiles
lex.yy.c: shell.l
        flex shell.l

.PHONY: bisonfiles
bisonfiles: parser.y
        bison -d parser.y

Здесь bisonfiles был объявлен целью .PHONY и, следовательно, вы видите, что bison -d parser.y запускается при каждом вызове make.

Самое простое решение, вероятно, состоит в том, чтобы полностью избавиться от цели bisonfiles и просто использовать правило шаблона ...

%.tab.c %.tab.h: %.y
        bison -d $<
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...