2011-04-19 2 views
2

초급 질문 : 중간 크기의 C++/C 프로그램을 고도로 모듈화했습니다. 그것은 공통 인터페이스를 가지고있어서 같은 함수 선언으로 여러 다른 소스를 드롭 할 수 있지만 구현이 다르며 다른 기능을 가진 실행 파일을 얻을 수 있습니다.Makefile에서 종속성 트리를 자동 생성하는 방법이 있습니까?

저는 건물 책임을 다룰 수있는 시스템을 만들고 있습니다. 현재 구성 파일의 내용 (make 프로세스 용)을 기반으로 전문 소스를 가져 와서 적절한 일반 이름을 가진 임시 폴더에 덤프 할 수 있습니다. 이제는 프로젝트 만 컴파일하면됩니다.

문제는 소스의 개수가 다양하고 소스가 의존하는 헤더가 개별 구현으로 변경 될 수 있다는 것입니다. 즉, 정적 makefile은 트릭을하지 않습니다.

'1' Makefile 시스템 만 사용하면 Main.cpp가 컴파일해야하는 개체 (.o) 파일 목록을 자동 생성하는 방법이 있습니까?

필자는 makefile에서 호출하는 작은 python 스크립트를 작성하여이 작업을 수행 할 수 있음을 알고 있습니다. 이후 기본 Main.cpp 파일로 시작하여 종속성을 검사하는 c- 파일을 구문 분석하여 사용자 정의 makefile을 만듭니다.

하지만 더 표준화 된 솔루션이나 make 내에서이를 수행 할 수있는 방법이 있다면이 해킹 된 솔루션으로 전환하고 싶지 않습니다.

'2'
makefile 시스템에서이 기능을 사용할 수없는 경우 사용자 지정 Python 스크립트를 사용해야합니까? 아니면보다 세련된 솔루션이 있습니까?

...............

완벽하게 명확하게하기 위해, 다시 나는 의존성/소스/헤더/개체의 일정 목록이 없어 내가하고 싶지 않아 내 최종 사용자가 그러한 목록을 유지하도록 강요하십시오.

내 C- 파일의 내용을 기반으로이 트리를 자동 생성하는 방법이 필요합니다.

사과가 "멍청한"질문이라면, 나는 메이크업의 세계에 비교적 새롭고, 대부분은 독학을 좋아합니다.

감사합니다.

질문이 있으시면 언제든지 문의하십시오.

참고로 내 프로젝트의 소스가 너무 많아서 모두 게시 할 수 없으므로 독점적/연구 목적으로 프로젝트를 수행 할 수 없습니다.

+0

소스를 찾는 데 사용할 수있는 멋진 셸 명령이 있습니까? – alternative

+0

개체 목록을 생성하려면 임시 폴더를 검사하면됩니까? 즉, 임시 폴더에는 컴파일해야하는 모든 소스가 포함되어 있으며 다른 소스는 포함되어 있지 않습니다 (지금은 헤더를 신경 쓰지 마십시오). – Beta

답변

1

는보고 here (고급 자동 종속성 세대)

+0

이것은 * 괜찮은 방법입니다. 그러나 원본 종속성이 변경 될 때 * 2 * 빌드가 필요한 경우가 많으므로이 형식의 "자동 종속성"생성을 그대로 유지해야합니다. – Barry

0

예, GCC를 사용하는 경우 되세요! 다음은 현재 프로젝트에서 사용하고있는 Makefile의 일부입니다 (모든 실제 용도로, 공개 도메인 아래에서 재미있게 꾸밀 것입니다).

CC=$(CROSS)gcc -c -g -Wall -Werror -ansi -pedantic $(DEFINES) -I./include 

%.o: %.c .d/%.d 
    # Your build code here 

.d/%.d: %.c 
    @$(CC) -MM $< -MF [email protected] 

-include $(OBJECTS:%.o=.d/%.d) 
-include $(LOBJECTS:%.o=.d/%.d) 

내가 놓친 것이 있으면 알려 주시면 Makefile을 다시 확인하겠습니다.

$ (OBJECTS)는 바이너리에서 원하는 개체의 목록이고 $ (LOBJECTS)는 정적 보관으로 컴파일되는 개체의 목록입니다. $ (OBJECTS) 및 $ (LIB) ($ (LOBJECTS)에 의해 작성된)은 최종 실행 파일로 컴파일됩니다.따라서 모든 것이 서로 다른 유형의 객체를 여러 빌드로 연결 한 후에 연결됩니다.

오 그래, 당신이 mkdir .d인지 확인하십시오. 그렇지 않으면 실패 할 수 있습니다. 빈 .d 디렉토리를 버전 제어에 체크인하고 싶을 것입니다.

유일한주의 사항은 소스를 나열해야한다는 것입니다. 그러나 원하는 경우 find을 사용하여 모든 소스를 찾을 수있는 약간의 도구를 설정할 수 있습니다.

마지막으로, 여러 대상 (%.o .d/%d)을 사용하면 더 효율적이고 읽기 쉽도록 정리할 수 있습니다. 나는 그것을 조사해야 할 것이다. 나를 상기시켜 줘서 고마워.

-3

빌드를 단순화하는 한 가지 방법은 종속성 건너 뛰기입니다. 매번 모든 것을 다시 컴파일하십시오. 빌드가 여러 번 수행되어야하거나 "오랜 시간이 걸린다"는 정의가 사용에 따라 달라지는 경우 () 종속성이 많이 변경되므로 자세한 종속성 빌드를 수행하는 것이 좋습니다.

+0

아니요. 이것은 좋은 대답이 아니며 절대적으로 말도 안됩니다. 종속성을 설정하는 데 1 분이 소요됩니다! 매번 모든 것을 다시 컴파일하는 데 왜 시간을 낭비해야합니까? – alternative

+0

@mathepic : 대부분의 최근 프로젝트에서 모든 것을 컴파일 할 시간은 1 초에서 5 초 사이입니다. 저것은 정비 문제의 진짜 가치가 있는가? – wallyk

+0

@wallyk 12 번 이상 컴파일해야하는 경우, 설정하는 데 (그리고 일반적으로) 시간이 걸리기 때문에 그렇습니다. – alternative

관련 문제