2012-05-19 2 views
2

다음 질문이 있습니다. 포트란 90 소스 파일 집합이 있는데 대부분 모듈이 들어 있습니다. 정적 라이브러리 (.a)를 만들어야하고 다음 Makefile을 사용했습니다.포트란 메이크 파일

.SUFFIXES: .o .c .f90 .f .mod 

DEPSF = tt_f90m, bt 
include Makefile.in #Contains compiler flags (CC, FORT, etc.) 
OBJS = $(DEPSF:,=.o).o 

mytt.a: $(OBJS) 
ar rc mytt.a $(OBJS) 
.f90.o: 
    $(FORT) -c $< 

그것은 잘 작동하지만 그것은 성가신 기능이 있습니다 : 나는 소스 파일 중 하나를 편집 할 경우 mytt.a 대상은 재건되지 않습니다. 모든 .o 및 .mod 파일을 제거해야만 문제가 발생합니다.

.... 


Considering target file `tt_f90m.o'. 
.... 
Found an implicit rule for `tt_f90m.o'. 
Considering target file `tt_f90m.mod'. 
Looking for an implicit rule for `tt_f90m.mod'. 
.... 
No implicit rule found for `tt_f90m.mod'. 
Finished prerequisites of target file `tt_f90m.mod'. 
No need to remake target `tt_f90m.mod'. 
Finished prerequisites of target file `tt_f90m.o'. 
Prerequisite `tt_f90m.mod' is older than target `tt_f90m.o'. 
No need to remake target `tt_f90m.o'. 

가 어떻게 올바르게 메이크 파일을 작성할 수 있습니다 다음과 같이 의 출력을 만들 -d

은?

+1

나는 질질 거리는 것을 싫어하지만 정말로 오랫동안 반복적 인 오류 메시지가 표시되면 읽는 것이 어렵습니다. 앞으로는 나타나는 오류 메시지의 패턴을 파악하고 몇 줄만 게시 할 수 있습니다. – Dan

+0

나는 동의한다, 나는 질문을 편집했다 –

답변

2

실제로이 질문에 대한 답을 얻었습니다. 문제점은 Fortran90에서 발생했습니다. .mod 파일이 종속 파일로 포함되어 있으므로 소스 파일이 변경된 경우 .mod 파일이 아니며 파일이 다시 컴파일되지 않습니다. 이 솔루션은 매우 간단합니다. 처음에는 그냥 쓰십시오

.SUFFIXES: 
.SUFFIXES: .c .f .f90 .F90 .o 

그리고 그게 전부입니다!

+0

나를 위해 일해도 고마워! 정확히 여기서 무슨 일이 일어나고 있는지에 대한 지혜의 말은 무엇입니까? 빈 SUFFIXES 라인은 무엇을합니까? –

+0

빈 SUFFIXES 행은 이전에 정의되었을 수있는 접미사를 지 웁니다. –

1

.mod 파일의 .f90.f 파일의 종속 관계를 사용자의 메이크 파일에 넣지는 않을 것입니다. .f, .mod 또는 .c으로 끝나는 파일 중 하나를 업데이트하면 .a 파일이 종속되어 있는지 확인하지 않고 .f90 파일을 다시 컴파일하지 않아도됩니다.

당신은이 문제를 해결하는 몇 가지 옵션이 있습니다. 하나는 makedepend과 같은 도구를 사용하는 것입니다. Makedepend 자체는 C에서만 작동하지만 포트란 버전이 존재합니다.

다른 하나는 명시 적으로 메이크 파일에서 어떤 개체 파일이 어떤 모듈과 C 파일에 의존하는지 명시하는 것입니다. 다음과 같이 보일 것입니다 :

.SUFFIXES: .o .c .f90 .f .mod 

DEPSF = tt_f90m, bt 
include Makefile.in #Contains compiler flags (CC, FORT, etc.) 
OBJS = $(DEPSF:,=.o).o 

mytt.a: $(OBJS) 
    ar rc mytt.a $(OBJS) 

ttf90m.o: bt.f90 foo.mod bar.f 
    $(FORT) -c $< -o [email protected] 

bt.o: ttf90m.f90 baz.mod floop.c 
    $(FORT) -c $< -o [email protected]  
+0

나는 makedepend를 볼 것이다. 제안 된 변형 (.o 파일의 종속성)이 좋습니다. 하지만 50 개 소스 파일을 가지고 "DEPSF"로 나열하고 싶다면 어떻게해야할까요? 그리고 위의 솔루션이 F77 파일 (모듈없이)에서 이상적으로 작동했음을 확신합니다. 해당 소스 파일이 변경되면 .o를 다시 빌드하도록 메이크 파일에 지시 할 수 있습니까? –

+0

패턴 규칙을 추가 할 수도 있습니다 (예). 그러나 패턴 규칙으로 컴파일 된 파일은 종속성 중 하나가 변경 될 때 다시 컴파일되지 않는다는 사실을 알고 있어야합니다. – Dan

+0

네, 그게 내가 가진 것입니다. 그래서, 포트란에 대한 유일한 단서가 있습니까? –