我們正在重構我們的代碼庫,並試圖限制不同組件之間的直接依賴關係。我們的源碼樹有幾個頂級目錄:src/a,src/b和src/c。makefile可以在C++中強制實現依賴性限制
我們要執行一套restirctions的:
- 文件中不能在B或C
- 文件依賴的文件在B可以依賴於文件,但不是在C C
- 文件可以直接取決於b中的文件但不是
執行第一個操作很簡單。我有這樣一個隱含的規則:
build/a/%.o : src/a/%.cpp
$(CXX) -I src/a $(OTHER_FLAGS) -o [email protected] $<
如果嘗試下一個文件,包括從B或C頭文件作爲標題沒有找到構建失敗。
第二個規則有一個類似的規則,它將src/a和src/b指定爲include目錄。建設c出現了問題。以下是允許的。
src/c/C.cpp
#include "b.h"
void C() { ... }
src/b/b.h
#include "a.h"
class B { ... };
src/a/a.h
class A { ... };
這裏,來自c的文件包括來自b(允許)的文件,該文件又包括來自(也允許)的文件。我們要防止這樣的代碼:
src/c/C_bad.cpp
// Direct inclusion of a
#include "a.h"
src/c/c_bad.h
// Direct inclusion of a
#include "a.h"
對於允許的情況下進行編譯,在SRC/C建立檔案必須包括-Isrc/A編譯命令,但允許第二種情況也編譯。
我懷疑我的問題的答案是編寫一個腳本,它查看編譯器生成的依賴關係,發現潛在的非法依賴關係,然後查看源文件以確定這是否是直接依賴關係。有沒有合理的方法來組合編譯器和/或makefile結構?
如果有問題,我們使用的是GNU Make 3.81和g ++ 4.5.3,但如果可能的話,我們希望是便攜式的。
更新
我們正在尋找的東西它需要努力違反規定,沒有一個地方需要努力遵循的規則。 (過去的經驗表明,後者不太可能奏效。)雖然在其他答案中有一些很好的想法,但我接受寫一個腳本的人,因爲那是一個花費最多努力工作的人周圍。
感謝大家的回答。
如果我從SRC/B/b.h(而不是從詳細的目錄)#包括「A.H」,可以構建做出失敗,或者我們將不得不依靠一個代碼審查,明白了嗎?看起來你也可以在src/b/detail/b.h中包含c/c.h,並且不會失敗。那是對的嗎? –