Как определить правила в Makefile для компиляции только тех файлов * .cpp, которые были изменены (и их зависимостей), а не всех файлов * .cpp

Допустим, у меня есть файлы:

Libs:

one.cpp, one.htwo.cpp, two.hthree.cpp, three.h

Программа:

program.cpp

Есть ли способ создать Makefile, который будет компилировать только тот * .cpp, который был изменен после последней компиляции?

В настоящее время у меня есть что-то подобное:

SRCS = one.cpp two.cpp three.cpp
OBJS = $(SRCS:.cpp=.o)

all: $(OBJS) program

.cpp.o:
    g++ -Wall -c 
SRCS = one.cpp two.cpp three.cpp
OBJS = $(SRCS:.cpp=.o)

all: $(OBJS) program

.cpp.o:
    g++ -Wall -c $<

program:
    g++ -Wall $(OBJS) program.cpp -o program

clean:
    rm -f $(OBJS) program
lt; program: g++ -Wall $(OBJS) program.cpp -o program clean: rm -f $(OBJS) program

Я отлично работаю, но когда я компилирую свою программу и затем меняю two.cpp или two.h, мне нужно сначала запустить «make clean», потому что когда я запускаю второй «make», я получаю:

Nothing to be done for 'all'.

Я хотел бы изменить свой Makefile таким образом, чтобы он распознавал мои изменения и перекомпилировал этот файл и его зависимости (если one.cpp использует код из файла two.cpp, который был изменен, оба файла должны быть перекомпилированы).

Так что, если я изменю two.cpp, make должен сделать:

g++ -Wall -c two.cpp
g++ -Wall $(OBJS) program.cpp -o program

Но если one.cpp использует код из two.cpp, который был изменен, make shold do:

g++ -Wall -c one.cpp
g++ -Wall -c two.cpp
g++ -Wall $(OBJS) program.cpp -o program

Ответы на вопрос(3)

Ваш ответ на вопрос