2008-10-30 5 views
13

단일 DLL (플러그인 시스템 용)을 컴파일하기위한 메이크 파일 템플릿이 있습니다. 사용자의 makefile은 다음과 같습니다 : 내가 가지고있는 makefile.in에서파일이 메이크 파일에 있는지 확인하는 방법

EXTRA_SRCS=file1 file2 
include makefile.in 

:

plugin.os 메인 C++ 파일입니다
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS)) 

컴파일 될 수 있습니다. BTW, 끝나는 파일이 .os

지금, 문제는 여분의 소스는 아마 (그러나 반드시)는 헤더 파일된다는 것입니다 (gcc으로 즉 -fpic 옵션을 사용하여) 공유 라이브러리에 대한 컴파일 된 오브젝트 파일입니다이다. 이상적으로는 대상을 plugin.osfile.cpp에 대한 종속성으로 추가하고 싶습니다 (존재하는 경우에만).

이 방법은 윈도우와 리눅스 모두에서 작동해야하며, 적어도 각각에 적용 가능해야합니다. 그러나, 나는 make의 GNU 버전만을 사용한다. 특정 목록과 일치하기 위해 (... 필터) $를 사용할 필요가 없습니다

$(wildcard $(HEADER_FILES)) 

수행 EDIT

$(wildcard *.h) 

:

답변

18

는 "와일드 카드"기능을 사용하여 와일드 카드 기능은 존재하지 않는 파일을 자동으로 필터링합니다.

+0

내가 원하는 것은 아닙니다. 테스트 할 .h 파일의 특정 목록이 있습니다. – PierreBdR

+0

와일드 카드를 사용할 필요가 없습니다. $ (와일드 카드 $ (HEADER_FILES)) 사용 – JesperE

4

사용중인 컴파일러를 지정하지 않았지만 gcc/g ++에 액세스 할 수있는 경우 -MM 옵션을 사용할 수 있습니다.

내가하는 일은 모든 .c 또는 .cpp 파일에 대해 .d 확장자를 가진 파일을 만든 다음 .d 파일을 "포함"하는 것입니다. 내 메이크 파일이 같은 것을 사용 :

%.d: %.c 
     gcc $(INCS) $(CFLAGS) -MM $< -MF [email protected] 

%.d: %.cpp 
     g++ $(INCS) $(CXXFLAGS) -MM $< -MF [email protected] 

나는 다음과 같은 종속성을 만들 :

C_DEPS=$(C_SRCS:.c=.d) 
CPP_DEPS=$(CPP_SRCS:.cpp=.d) 
DEPS=$(C_DEPS) $(CPP_DEPS) 

을하고이 메이크 파일의 맨 아래에 :

include $(DEPS) 

이 이것을인가 네가 할 행동의 종류? 이 방법의 장점은 실제로 컴파일 할 때 GNU가 아닌 컴파일러를 사용하는 경우에도 GNU 컴파일러가 종속성을 계산할 수 있다는 것입니다. 간단한

$(filter $(wildcard *.h),$(HEADER_FILES)) 

당신이 원하는

+0

나는 차라리 makeflie 생성을 피할 것이지만 ... 감사합니다! – PierreBdR

2

을합니까?

+0

mmhh ..이 필터 명령에 대해 알지 못했습니다! 그것은 무엇을합니까? – PierreBdR

+0

Make의 문서 (정보 페이지, 맨 페이지 제외)를 읽으십시오 : $ (필터 패턴, 텍스트)는 적어도 하나의 패턴과 일치하는 TEXT의 단어입니다. (패턴은 정규 표현식이 아닌 파일 패턴을 만들므로 일반 파일 이름이 정확히 일치해야합니다.) – ephemient