OPTIONS= /NOLOGO
COPTIONS= /03
OBJFILES=energy_3D.obj recover_list_3D.obj \
ini_divide_3D.obj keep_list_3D.obj \
ext_moving_NONE_3D.obj \
SPHYSICS_3D.obj getdata_3D.obj \
check_limits_3D.obj \
divide_3D.obj \
movingObjects_3D.obj movingGate_3D.obj \
movingPaddle_3D.obj movingWedge_3D.obj \
updateNormals_3D.obj vorticity_3D.obj\
periodicityCorrection_3D.obj \
ac_NONE_3D.obj \
kernel_correction_NC_3D.obj \
ac_3D.obj \
poute_3D.obj \
gradients_calc_basic_3D.obj \
monaghanBC_3D.obj \
self_BC_Monaghan_3D.obj \
celij_BC_Monaghan_3D.obj \
rigid_body_motion_3D.obj \
variable_time_step_3D.obj \
viscosity_laminar+SPS_3D.obj \
correct_SPS_3D.obj \
kernel_quadratic_3D.obj \
EoS_Tait_3D.obj \
densityFilter_Shepard_3D.obj \
ac_Shepard_3D.obj \
pre_celij_Shepard_3D.obj \
pre_self_Shepard_3D.obj \
step_predictor_corrector_3D.obj
.f.obj:
ifort $(OPTIONS) $(COPTIONS) /O3 /c $<
SPHYSICS_3D.exe: $(OBJFILES)
xilink /OUT:$@ $(OPTIONS) $(OBJFILES)
clean:
del *.mod *.obj
makefile 이 위와 같은 구조로 되어 있는데요.
(오랫동안 사용되어오고 검증된, open source 의 makefile 입니다.)
컴파일 시 obj 을 만들어 주는 룰이 어떻게 정의가 되어 있는지 잘 모르겠습니다.
생각되는 순서상으로는
1. OBJFILES 에 주저리주저리 써 있는 obj 들을 먼저 만들어주고
2. 만들어진 obj 들을 이용해서 종합적으로 컴파일된 (SPHYSICS_3D.exe?) 만들어주는 과정으로 보이는데,
obj 들과 같은 이름을 갖는 대응되는 .f 파일들이 디렉토리에는 주루룩 있습니다.
그런데 제가 궁금한 것은 obj을 만들어 주기 위해 source 를 compile 하는 과정이 어떻게 되어 있길래
이름이 같은 .f ====> 이름이 같은 .obj 들을 만들어 줄 수 있는 건지..
(예를 들어... energy_3D.f ======> energy_3D.obj)
그리고 제가 받아서 컴파일할 때에는
이러한 매칭 작업해석을 못하더군요.
make: *** No rule to make target `energy_3D.obj', needed by `SPHYSICS_3D.exe'. Stop.
위와 같은 메시지가 나오면서, obj 을 만들지 못하고 에러가 납니다.
무엇이 문제일까요?
ifort $(OPTIONS) $(COPTIONS) /O3 /c $< 이 부분이 실행되었을 때
이름이 같은 .f ====> 이름이 같은 .obj 들을 만들어주는 부분은 어디인가요? $< 이 그 역할을 하나요?
그리고 만약 그 부분이 제대로 동작을 못하고 위와 같이 에러가 난다면 가장 먼저 어떤 부분을 의심해 봐야 할까요?
첫댓글 참고로 컴파일러는 intel linux fortran 입니다.
1. 이유는 리눅스용이 아닌 윈도용이라서 그렇습니다. 각 컴파일러 동작 옵션 명령, 파일확장자규칙..등등..
당연히 리눅스상에선 동작하지 않습니다.
실행파일 확장자도 EXE로 붙이는 것이 너무 눈에 띄죠?(이건 에러의 원인은 아닙니다만..)
--------------------------------------------------------------------------------------------------------------------------------------------------
규칙 설명
2. .f -> .obj 가 만들어지는 것은 Make 의 suffixes 규칙을 공부하시면 됩니다. (결과는 보시는 것과 같고.. makefile의 매크로 동작 규칙을 공부하면 됩니다.)
작동 수행 과정은 make 명령을 내리면 makefile에 적힌 수행을 하고
위 파일에선
기본동작으로 SPHYSICS_3D.exe: $(OBJFILES) 을 수행하고
$(OBJFILES)가 확장되서 OBJFILES = 에 있는 파일을 요구하게 됩니다.
각 objfile의 항목은 suffix 규칙에 의해
.f.obj:
ifort $(OPTIONS) $(COPTIONS) /O3 /c $<
부분이 실행됩니다. $< 같은 독특한 표현은 make 의 규칙입니다. 파일 이름에 대한 의미를 담고 있습니다. 몇 가지 더 되고요.
+ 코멘트 1 : 위에 COPTIONS라는 변수를 만들어 최적화 레벨에 대한 컴파일 옵션을 변수를 통해 사용하려 했으나..
그냥 고정적으로 O3를 컴파일 명령에 집어 넣는.. 좀 거시기한 사용을 보여주네요.
원래의 머릿속에는
위쪽에
COPTIONS= /03 /C
로 하고
ifort $(OPTIONS) $(COPTIONS) $<
로 할 생각이었을 것인데..
실행이 완료되면 차례로 각 단계가 복귀 되면서
xilink /OUT:$@ $(OPTIONS) $(OBJFILES)
로 실행파일이 만들어 집니다.
+ 코멘트 2 :. 이거 일반적인 Make형식이 아니고 윈도우 비주얼 포트란 계열에서 제공하는 NMAKE 툴의 형식인 듯 보이는데요..
그리고 make파일은 탭문자가 정확해야합니다. 그래야 오해의 소지가 없습니다.
남에게 보여주기 위해 이렇게 올릴 때는 파일 자체로 올려야 합니다. 이렇게 글로 옮기면 탭이 무너지니..
SPHYSICS라고 구글에 검색하니 이 프로젝트인가 보네요.
https://wiki.manchester.ac.uk/sphysics/index.php/SPHYSICS_FAQ
중간에 보면
How do I generate a geometry using SPHysics in fortran codes?
이하 문단에
(iii) ifort on windows: NMAKE/f"SPHYSICSgen_win_ifort.mak"
라는 것이 보이네요... 역시 이 파일은 NMAKE용 make파일입니다.
(i) gfortran on linux/Mac/cygwin: make -f SPHYSICSgen_gfortran.mak
(ii) ifort on linux: make -f SPHYSICSgen_ifort.mak
(iii) ifort on windows: NMAKE/f"SPHYSICSgen_win_ifort.mak"
(iv) FTN95 on windows: mk32 -f SPHYSICSgen_ftn95.mak
(ii) ifort on linux ^^;
답변 감사드립니다. makefile 자체는 linux 용 옵션으로 만들었는데, 저렇게 보니 window 용으로 잘못 생성이 되어 있군요. 덕분에 문제 해결했습니다. 감사합니다. ^^