makefile에 파일이 있는지 확인하는 방법
-
05-07-2019 - |
문제
플러그인 시스템의 경우 단일 DLL을 컴파일하는 MakeFile 템플릿이 있습니다. 사용자의 makefile은 다음과 같습니다.
EXTRA_SRCS=file1 file2
include makefile.in
에서 makefile.in
나는 가지고있다:
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
어디에 plugin.os
컴파일 할 기본 C ++ 파일입니다. BTW, 파일 끝입니다 .os
공유 라이브러리를 위해 컴파일 된 객체 파일 (즉, -fpic
옵션 gcc
)
이제 문제는 추가 소스가 아마도 헤더 파일 일 것입니다. 이상적으로는 대상의 종속성으로 추가하고 싶습니다. plugin.os
그리고 file.cpp
, 그러나 그들이 존재하는 경우에만.
이 방법은 Windows와 Linux 모두에서 작동하거나 적어도 각각에 적응할 수 있어야합니다. 그러나 나는 GNU 버전의 Make 만 사용합니다.
해결책
"와일드 카드"기능을 사용하십시오.
$(wildcard *.h)
편집 : 특정 목록과 일치하려면
$(wildcard $(HEADER_FILES))
$ (필터 ...)를 사용할 필요가 없으며 와일드 카드 기능은 존재하지 않는 파일을 자동으로 필터링합니다.
다른 팁
사용중인 컴파일러를 지정하지 않았지만 GCC/G ++에 액세스 할 수있는 경우 -mm 옵션을 사용할 수 있습니다.
내가하는 일은 모든 .c 또는 .cpp 파일마다 .d의 확장자가있는 파일을 작성한 다음 .D 파일을 "포함"하는 것입니다. 나는 makefile에서 이와 같은 것을 사용합니다.
%.d: %.c
gcc $(INCS) $(CFLAGS) -MM $< -MF $@
%.d: %.cpp
g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
그런 다음 다음과 같은 종속성을 만듭니다.
C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
그리고 이것은 makefile의 맨 아래에 있습니다.
include $(DEPS)
이것이 당신이가는 행동의 종류입니까? 이 방법의 장점은 실제 컴파일에 비 GNU 컴파일러를 사용하더라도 GNU 컴파일러가 종속성을 계산하는 데 적합한 작업을 수행한다는 것입니다.
간단합니다
$(filter $(wildcard *.h),$(HEADER_FILES))
당신이 원하는 것을합니까?