Почему makefile перекомпилирует все при изменении заголовочного файла? - PullRequest
0 голосов
/ 13 декабря 2018

Мой make-файл перекомпилирует все при изменении заголовочного файла. Как я могу сделать так, чтобы он перекомпилировал только необходимые файлы?Например, a_functions.c использует ah.

Всякий раз, когда я изменяю файл .c, make-файл перекомпилирует этот файл только в объект.

SHELL=/bin/sh
CC=gcc
CFLAGS=-Wall
OBJECTS=main.o a_functions.o b_functions.o c_functions.o d_functions.o
DEPS=main.h a.h b.h c.h d.h
PROGRAM_NAME=program1
INSTALL_PATH=/usr/local/bin

%.o: %.c $(DEPS)
    $(CC) -c $(CFLAGS) $< -o $@

.PHONY: all
all: $(PROGRAM_NAME)

$(PROGRAM_NAME): $(OBJECTS)
    $(CC) $(OBJECTS) -o $(PROGRAM_NAME)

.PHONY: install
install: $(PROGRAM_NAME)
    install -c $(PROGRAM_NAME) $(INSTALL_PATH)/

.PHONY: uninstall
uninstall:
    rm -v $(INSTALL_PATH)/$(PROGRAM_NAME)

.PHONY: clean
clean:
    rm -v $(PROGRAM_NAME) *.o

Если я изменяю заголовочный файл ниже, это происходит

$ make
gcc -c -Wall main.c -o main.o
gcc -c -Wall a_functions.c -o a_functions.o
gcc -c -Wall b_functions.c -o b_functions.o
gcc -c -Wall c_functions.c -o c_functions.o
gcc -c -Wall d_functions.c -o d_functions.o
gcc main.o a_functions.o b_functions.o c_functions.o d_functions.o -o program1

Когда я изменяю файл .c, это происходит, что я хотел бы также для всех заголовков.

$ make
gcc -c -Wall a_functions.c -o a_functions.o
gcc main.o a_functions.o b_functions.o c_functions.o d_functions.o -o program1

Является ли обычной практикой желание, чтобы это было так?Как бы я изменил свой код, чтобы исправить проблему?

1 Ответ

0 голосов
/ 13 декабря 2018

У вас есть правило, которое гласит, что все файлы .o, созданные из файлов .c, также зависят от содержимого $(DEPS)

%.o: %.c $(DEPS)
    $(CC) -c $(CFLAGS) $< -o $@

, в котором содержатся все ваши файлы .h.

DEPS=main.h a.h b.h c.h d.h

Вы должны удалить $(DEPS) из этого правила и указать зависимости конкретно для каждого файла .o, что-то вроде следующего:

a_functions.o: a.h
main.o: a.h b.h

Если вы установили его, вы можете использоватьmakedepend чтобы выполнить «тяжелую работу», отработать зависимости для вас и обновить ваш Makefile.И даже добавьте его, как правило, так:

depend:
    makedepend -- $(CFLAGS) -- $(SRCS)

(для этого вам потребуется определить, какие у вас исходные файлы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...