2016-10-03 4 views
2

Обратите внимание, что на SO есть похожие вопросы, но я думаю, что моя ситуация другая, да еще мой Makefile чрезвычайно прост и прост. Я новичок в Makefile.makefile скомпилирует все файлы вместо последних отредактированных

Предположим, что мне нужно составить проект, который выглядит следующим образом -

. 
├── [4.0K] bin 
├── [ 517] Makefile 
├── [4.0K] obj 
└── [4.0K] src 
    ├── [ 117] func1.cpp 
    ├── [ 76] func2.cpp 
    ├── [ 137] global.h 
    └── [ 97] main1.cpp 

и мой Makefile выглядит следующим образом -

CC   := g++ 
CFLAGS  := -g -Wall -std=c++0x 
LDFLAGS  := -lm 

NAMES := func1.cpp func2.cpp main1.cpp 
SRC  := $(addprefix src/,$(NAMES)) 
OBJ  := $(addprefix obj/,$(NAMES:.cpp=.o)) 
DEPS := $(OBJ:.o=.d) 

.PHONY: clean all debug 

all: prog 

debug: 
    $(info $$SRC: ${SRC}) 
    $(info $$OBJ: ${OBJ}) 
    $(info $$DEPS: ${DEPS}) 

prog: bin/prog 

bin/prog: $(OBJ) 
    $(CC) $^ -o [email protected] 

$(OBJ): $(SRC) 
    $(CC) $(CFLAGS) -I/src/global.h -c $(addprefix src/,$(notdir $(@:.o=.cpp))) -o [email protected] 

-include $(DEPS) 

clean: 
    rm -rf bin/* 
    rm -rf obj/* 

Предположим, я открыл файл func1.cpp и внесены некоторые изменения , Когда я вызываю make, он компилирует все файлы, но должен был скомпилировать только один (func1.cpp).

Как исправить это?

Примечание: мне нужно prog, bin/prog по другой причине, и я не могу сделать рецепты, как obj/%.o: src/%.c, потому что я мог бы иметь другую цель из подмножества одних и тех же объектов.

+2

Возможный дубликат [Как заставить Makefile перекомпилировать только измененные файлы?] (Http://stackoverflow.com/questions/7815400/how-do-i-make-makefile-to-recompile-only-changed- файлы) – Xirema

+0

Я подозреваю, что вам просто нужно добавить '-MMD -MP' в ваш' CFLAGS'. Или, может быть, только для вашей команды '$ (OBJ): $ (SRC)' target. – Galik

ответ

5

Когда вы пишете правило, как:

$(OBJ): $(SRC) 
    cmd 

в вашем случае является

obj/func1.o obj/func2.o obj/main.o : src/func1.cpp src/func2.cpp src/main1.cpp 
    cmd 

Предпосылками не получают пронеслись через. Это генерирует одно правило для каждой цели со всеми необходимыми условиями. То есть:

obj/func1.o : src/func1.cpp src/func2.cpp src/main1.cpp 
    cmd 

obj/func2.o : src/func1.cpp src/func2.cpp src/main1.cpp 
    cmd 

obj/main.o : src/func1.cpp src/func2.cpp src/main1.cpp 
    cmd 

Поскольку src/func1.cpp является PREREQ для всех объектных файлов, все они получают перекомпилировать.

То, что вы хотите вместо этого использовать static pattern rule:

obj/%.o : src/%.cpp 
    $(CC) $(CFLAGS) -I/src -c $< -o [email protected]   

Обратите внимание, что -I для включают каталоги, не включают в себя файлы.

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