코드베이스를 리팩토링하고 서로 다른 구성 요소 간의 직접적인 종속성을 제한하려고합니다. 소스 트리는 src/a, src/b 및 src/c와 같은 몇 개의 최상위 디렉토리를 가지고 있습니다.makefile에서 C++의 종속성 제한을 적용 할 수 있습니까?
- 파일 A는 파일 A를하지만
- 파일 C C에 따라 달라질 수 있습니다 B에서 B 또는 C
- 파일에있는 파일의 의존 할 수에서 :
우리는 restirctions의 집합을 적용 할 직접 파일에 의존 할 수 있지만 a는 없습니다.
첫 번째 시행은 간단합니다. 나는이 같은 묵시적 규칙이 : 헤더가 발견되지 않는 등의 시도에서 파일이 B 또는 C에서 헤더 파일을 포함 할 경우
build/a/%.o : src/a/%.cpp
$(CXX) -I src/a $(OTHER_FLAGS) -o [email protected] $<
를 빌드가 실패합니다.
두 번째 규칙은 src/a와 src/b를 포함 디렉토리로 지정하는 비슷한 규칙을 가지고 있습니다. 문제는 건물 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에서 파일 차례로 (또는 허용) (A)로부터 파일을 포함하는 (수) (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"
를 들어, 컴파일 a를 -Isrc/A를 포함해야 SRC/C 파일을 구축하기위한 명령하지만, 그 두 번째의 경우는 컴파일 할 수 있습니다.
필자는 내 문제에 대한 대답이 컴파일러에서 생성 된 종속성을 확인하고 잠재적으로 불법적 인 종속성을 찾은 다음 소스 파일을보고 이것이 직접적인 종속성인지 확인하는 스크립트를 작성한 것으로 의심됩니다. 컴파일러 및/또는 makefile 구조를 결합하는 합리적인 방법이 있습니까?
우리는 GNU Make 3.81과 g ++ 4.5.3을 사용하고 있지만 가능한 경우 이식성이 좋고 싶습니다.
우리는 그것, 그것은 규칙을 준수하는 노력이 필요없는 하나의 규칙을 위반하는 노력이 필요 뭔가를 찾고있다
업데이트. (과거의 경험은 후자가 작동하지 않을 것으로 나타났습니다.) 다른 대답에는 좋은 아이디어가 있지만, 스크립트를 작성하는 것을 받아들입니다. 스크립트를 작성하는 것이 가장 효과적입니다. 약.
답장을 보내 주셔서 감사합니다.
, 빌드가 실패 할 수있다, 또는 우리는 그것을 잡으려고 코드 리뷰에 의존해야? 당신이 또한 SRC/B/세부/b.h에서 C/c.h을 포함 실패 빌드를 수없는 것 같다. 그 맞습니까? –