2012-01-23 3 views
6

소스 파일 (.cpp, .c, .cc) 및 헤더 파일 (.hpp, .h, .hh)에 대한 다양한 확장명을 가진 C++ 프로젝트가 있습니다.). 소스 파일은 SRC라는 디렉토리에있는 헤더 파일은 INC라는 디렉토리에 예상 할 수 있습니다합니다.메이크 파일에서 여러 소스 파일 확장명 작업

나는 물론이 경우 작동

vpath %.c $(SRC) 

%.o: %.c 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

같은 규칙과 소스를 컴파일하고 싶습니다 나는 소스 파일이 % .c 형식 일 것이라는 것을 알고 있지만, 여러 가능한 파일 확장자의 경우 % .cpp와 % .cc에 대해서도 유사한 규칙을 만들어야 할 것입니다. 물론 세 가지 규칙은 큰 의미는 없지만 규칙을 다시 쓰지 않아도 다른 언어로도 프로젝트의 끌어서 놓기로이 메이크 파일을 사용할 수 있으면 좋을 것입니다. 당신의 도움에 대한

SRC_EXT = cpp c cc 
vpath %.$(SRC_EXT) $(SRC) 

%.o: %.$(SRC_EXT) 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

감사 :

그래서 내가 어떻게 규칙 (또는 같은 목표를 달성 다른 구조)처럼 작동 쓸 수 있습니다.

답변

3

표준 POSIX make에서는 사용할 수 없습니다. 그러나 vpath에 대해 언급 한 이후로 나는 당신이 GNU make를 사용하고 있다고 가정 할 것이다. 당신은 충분히 새로운 GNU 만들 필요가 없습니다, 또는 다른 솔루션을 원하는 경우,

SRC_EXT = cpp c cc 

define compile_rule 
%.o : %.$1 
     $$(COMPILER) $$(FLAGS) $$< $$(INCFLAG)$$(INC) 
endef  
$(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT)))) 

을 : 당신은 충분히 새 버전 (3.81 이상)가있는 경우, 당신은 전화 및 평가와 함께이 충분히 쉽게 할 수 있습니다 생성 된 메이크 파일을 사용하여 동일한 작업을 수행 할 수 있습니다.

+0

아하! 큰! 나는 컴파일 규칙을 호출하는 방법을 궁금해했다. 그러나 foreach가 처음에 어떻게 불려지나요? SRC_EXT 변수를 설정 한 직후 바로 호출되기 때문에 파일에 그냥 앉아 있나? .o 파일이 최신 파일이더라도 모든 소스 파일을 강제로 다시 컴파일합니까? – user487100

+1

메이크 파일 파싱은 모든 것을 확장하는 것에 관한 것입니다. make가 "즉각적인 문맥 (immediate context)"에서 변수 나 함수를 만날 때마다 (GNU make 매뉴얼에서 "Make Makefile을 읽는 방법"참조), 확장 될 것이다. 그것은 물론 많은 단계를 포함 할 수 있습니다. 확장이 완료되면 남은 것은 무엇이든지 makefile로 구문 분석됩니다. eval 기능은 특별한 기능입니다. 기본적으로이 foreach 루프는 메이크 파일을 읽을 때 make에 의해 확장되고 구문 분석되며 규칙을 작성한 것과 같은 방식으로 규칙을 정의합니다. 따라서 다른 make 규칙처럼 작동합니다 (재 컴파일을 강제하지는 않음). – MadScientist

+0

매우 근사합니다. 감사! – user487100

관련 문제