Cómo definir reglas en el Makefile para compilar solo los archivos * .cpp que se modificaron (y sus dependencias), no todos los archivos * .cpp

Digamos que tengo archivos:

Libs:

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

Programa:

program.cpp

¿Hay alguna forma de crear Makefile que compile solo ese * .cpp que se modificó desde la última compilación?

Actualmente tengo algo así:

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

Funciono bien, pero cuando compilo mi programa y luego cambio two.cpp o two.h primero necesito ejecutar "make clean", porque cuando ejecuto "make" en segundo lugar obtengo:

Nothing to be done for 'all'.

Me gustaría cambiar mi Makefile de esa manera, reconocería mis cambios y volvería a compilar ese archivo y sus dependencias (si one.cpp usa el código de two.cpp que se modificó, ambos archivos deberían volver a compilarse).

Entonces, si modifico two.cpp, make debería hacer:

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

Pero si one.cpp usa el código de two.cpp que fue modificado, haga que shold haga:

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta