소스 파일 (.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)
감사 :
그래서 내가 어떻게 규칙 (또는 같은 목표를 달성 다른 구조)처럼 작동 쓸 수 있습니다.
아하! 큰! 나는 컴파일 규칙을 호출하는 방법을 궁금해했다. 그러나 foreach가 처음에 어떻게 불려지나요? SRC_EXT 변수를 설정 한 직후 바로 호출되기 때문에 파일에 그냥 앉아 있나? .o 파일이 최신 파일이더라도 모든 소스 파일을 강제로 다시 컴파일합니까? – user487100
메이크 파일 파싱은 모든 것을 확장하는 것에 관한 것입니다. make가 "즉각적인 문맥 (immediate context)"에서 변수 나 함수를 만날 때마다 (GNU make 매뉴얼에서 "Make Makefile을 읽는 방법"참조), 확장 될 것이다. 그것은 물론 많은 단계를 포함 할 수 있습니다. 확장이 완료되면 남은 것은 무엇이든지 makefile로 구문 분석됩니다. eval 기능은 특별한 기능입니다. 기본적으로이 foreach 루프는 메이크 파일을 읽을 때 make에 의해 확장되고 구문 분석되며 규칙을 작성한 것과 같은 방식으로 규칙을 정의합니다. 따라서 다른 make 규칙처럼 작동합니다 (재 컴파일을 강제하지는 않음). – MadScientist
매우 근사합니다. 감사! – user487100