1) Вот способ сделать то, что вы просите (более или менее):
C1_HEADERS = C1.hpp
C1.o: $(C1_HEADERS)
C2_HEADERS = C2.hpp $(C1_HEADERS)
C2.o: $(C2_HEADERS)
# and so on
Возможно, можно заменить эти вторые строки (Cn.o: $(Cn_HEADERS)
) вызовом функции или чем-то еще, но я действительно не думаю, что это стоит усилий.
2) Вот один из способов, с помощью которого ваш план перебивает:
// C1.hpp
#include "A.hpp"
...
// C1.cpp
#include "C1.hpp"
#include "B.cpp"
...
То есть C1.o
зависит от B.hpp
, а C2.o
- нет.
3) Вот лучший способ справиться с этими зависимостями: Advanced Auti-Dependency Generation .