2016-06-17 2 views
0

기본 디렉토리 src와 두 개의 서브 디렉토리 src/foo와 src/tests가 있습니다. src/tests에는 src/tests/tests.cpp를 빌드하는 Makefile이 있습니다. 내가 src/foo/Makefile에하나의 타겟이 다른 타겟의 타겟에 의존하도록 Makefile을 구조화하려면 어떻게해야합니까?

%.o : %.cpp 
    ${GCC} -c ${CXXFLAGS} $< -o [email protected] 

으로 컴파일하고있는 src/foo/*. o에 의존하기를 바란다. 하나 또는 다른 것을 포함 시켜서 Makefile을 구조화하는 좋은 방법이 있습니까? 당신은 GNU가 만들어 사용하는 가정

# Obviously this is impossible right now since OBJECT_FILES is not defined in this Makefile. 
tests: tests.o ${OBJECT_FILES} 
    ${GCC} ${CXXFLAGS} tests.o ${OBJECT_FILES} -o tests 

tests.o: tests.cpp 
    ... 
+1

나는 Makefile을 도려 내고 더 나은 빌드 시스템을 사용한다. 개인적으로 나는 CMake를 선호하지만 주위에는 다른 사람들이 있습니다. – Jens

+0

예,'make'는 네이티브 재귀 또는 전체 프로젝트 범위 대상 종속성을 수행하지 않습니다. 'cmake' 외에도 'scons' 또는 오래된'cons'를 체크하십시오. 'scons'는 기본적으로 재귀 적입니다 : 프로젝트를 전체적으로 보았고, 어디서나 의존성을 가질 수 있습니다. 대부분의 경우 지금 시도해 보는 것과 같은 종속성을 지정할 필요조차 없지만 자체적으로 발견 할 수 있습니다. – Dummy00001

답변

0

: 즉

는 SRC/푸/메이크 파일은 다음과 같습니다

OBJECT_FILES += bar.o baz.o ... 

main: main.o ${OBJECT_FILES} 
    ${GCC} ${CXXFLAGS} main.o ${OBJECT_FILES} -o main 

%.o : %.cpp 
    ${GCC} -c ${CXXFLAGS} $< -o [email protected] 

나는 SRC/테스트/메이크가 그런 짓을 할 가짜 표적을 사용할 수 있습니다.

.PHONY: foo_objets 

foo_objects: 
    $(MAKE) -C ../../src/foo 

test의 종속성을 정의 foo_objects. 이 자기를 결합

tests: tests.o ${OBJECT_FILES} foo_objects 
    ${GCC} ${CXXFLAGS} tests.o ${OBJECT_FILES} -o tests 
+0

.PHONY 대상은 종속성 검사를 제거합니다. 종속성 검사는 빌드 실패보다 좋지만 이상적이지 않습니다. 또한 "make"를 입력하여 재귀 적 make를 수행하지 마십시오. 달리 동시성 제어를 잃어 버리면 항상'$ (MAKE)'를 사용하십시오. –

1

사실, 권장하지, 하나의 프로젝트가 어렵다 위해 파일을 포함합니다. 이유에 대한 자세한 내용은 Recursive Make Considered Harmful을 참조하십시오. 이것은 재귀 적으로 make를 호출 할 때에 만 적용되며, 프로젝트의 다른 부분들이 상호 의존성을 가질 때만 적용된다는 점에 유의하십시오.

재귀 옵션을 사용하지 않으면 다른 옵션이 좋지 않습니다. 가장 확실한 것은 tests 디렉토리의 src 메이크 파일 include입니다. 그러나 src 메이크 파일은 tests 디렉토리에있을 때 true가 아닌 현재 디렉토리에 대한 암시 적 가정을합니다.

가장 좋은 방법은 srctests을 모두 만드는 프로젝트의 루트에 하나의 make 파일을 만드는 것입니다. 이렇게하면 종속성 사양이 간단 해집니다.

프로젝트를 진행하는 동안 프로젝트 요구 사항은 표준 수준으로 유지됩니다. 컴파일을위한 패턴 규칙조차도 make에 내장 된 패턴 규칙의 단순화 된 버전입니다 (즉, make 파일에서 패턴 규칙을 삭제할 수 있으며 모든 것이 계속 작동합니다). 그러한 경우, 휠을 재발 명하려는 것은 나에게 불필요한 것처럼 보입니다.

표준 빌드 생성 도구 중 하나를 사용하는 것이 좋습니다. automake은 보편적으로 사용할 수 있고 컴파일 링 머신에 특별한 도구가 필요 없기 때문에 내가 가장 좋아하는 도구입니다. 그것의 학습 곡선은 다른 프로젝트보다 약간 가파르므로, 특히 단순한 프로젝트에서는 그렇지만, 배우는 동안 얻는 도구는 사용하지 않는 프로젝트에 유용합니다.

그런데 다시 말하면, 어떤 사람들은 자동 도구가 복수심으로 싫어합니다. 자기 자신에게.

관련 문제