makeを使って複数あるFortranソースコードをビルドしようとしています.
OceanWave3Dhttps://github.com/apengsigkarup/OceanWave3D-Fortran90というオープンソースコードに入っているmakefileなのですが,UnixやLinux環境で作られているためWindows用に書き換える作業を行っています.
treeの情報(一部抜粋)は以下の通りです.srcの各フォルダの中にソースコード(.f90)やインクルードファイル(makefile.inc)が入っています
C:. ├─build ├─GUI │ ├─MainWindow │ …… ├─src │ ├─analyticalsolutions │ ├─curvilinear │ ……
実現したいこと
オブジェクトファイルを作成させてエラーを解消する.
自分なりに調べた結果,ターゲットReleaseを実行するのに必要なオブジェクトファイル(.o)が作成されていないので,下記のエラーが出ているのだと推測しています.ただ,makefileの下部に以下のパターンルール?が記述されています。 必要な依存ファイルがない場合,makeは依存ファイルを作成するために,このパターンルールに飛び,オブジェクトファイルを作成するものだと思っていますが,なぜエラー終了となるのでしょうか…
# Generic compilation rules … $(BUILDDIR)\%.o: %.f90 @if ls *.mod &> \dev\null; then \ mv -v *.mod $(BUILDDIR); \ cp -v thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS)
違う理由であれば解消方法をご教授下さい.
発生している問題・エラーメッセージ
C:\Users\A\Desktop\OceanWave3D-Fortran90-master>make Release makefile:141: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.o' へのコマンドを置き換えます makefile:134: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.o' への古いコマンドは無視されます makefile:147: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.mod' へのコマンドを置き換えます makefile:144: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.mod' への古いコマンドは無視されます make: *** `Release' に必要なターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build\precision.o' を make するルールがありません. 中止.
該当のソースコード
インクルードファイル(common.mk)の内容
# For inclusion in makefile for use with GNU make (gmake) # # Purpose: Modify to local configuration by user. # # Program name PROGNAME = OceanWave3D LIBNAME = libOceanWave3D_botp.so # 追加 $(PWD)などの変数がWindows環境では認識されないため HOME=C:\Users\A\Desktop\OceanWave3D-Fortran90-master # Installation directory INSTALLDIR = $(HOME)\bin LIBINSTALLDIR = $(HOME)\lib # Build directory where object files are stored # BUILDDIR = $(PWD)\build BUILDDIR = $(HOME)\build # The build environment is set either by the choice of a compiler # flag, or by creating a block for a specific $USER. # Choose the Fortran compiler on this system # E.g. pathf90, f90, gfortran, gf90, ifort FC = gfortran #FC = gfortran44 #FC = gfortran-4.4 #FC = gf90 USER = hbb # First the blocks based on compiler name: … ifeq ($(FC),gfortran) # MacOS, apek LIBDIRS = -L $(HOME)\lib\ # -L\Users\apek\Documents\Fortran\Harwell\lib -L\usr\local\atlas\lib -L\Users\apek\Documents\Fortran\SPARSKIT2 # LINLIB = -lharwell -lskit -latlas -llapack -l_VTK_IO # LINLIB = -lharwell -lskit -latlas -l_VTK_IO -framework veclib LINLIB = -lharwell -lskit -latlas -framework veclib DBFLAGS = -pg -g -O -fcheck=all -ffpe-trap=invalid,zero,overflow OPTFLAGS = -O2 endif … # Then the blocks for specific users (this clobbers the above info.) ifeq ($(USER),hbb) # hbb machine, gfortran FC=gfortran LIBDIRS = -L $(HOME)\lib\ LINLIB = -lharwell -lskit -llapack -lblas DBFLAGS = -pg -g -fbounds-check -ffpe-trap=invalid,zero,overflow -ffree-line-length-none -fno-automatic OPTFLAGS = -pg -O3 -ffree-line-length-none -fno-automatic -ffpe-trap=invalid,zero,overflow # OPTFLAGS = -g -fast endif …
makefileの内容
# makefile for use with GNU make (gmake) # # Author: Allan P. Engsig-Karup. # include common.mk .SUFFIXES: .f90 .f # Source files # subdirectories - complete directory-tree should be included # # Perhaps use perl script sfmakedepend in the future for dependency list? SOURCES := include src\variabledefs\makefile.inc include src\utilities\makefile.inc include src\analyticalsolutions\makefile.inc include src\curvilinear\makefile.inc include src\fft\makefile.inc include src\functions\makefile.inc include src\multigrid\makefile.inc include src\pressure\makefile.inc include src\timeintegration\makefile.inc include src\wrappers\makefile.inc include src\initialization\makefile.inc include src\IO\makefile.inc include src\main\makefile.inc include src\iterative\makefile.inc include src\OpenFoam\makefile.inc # Search paths for source dependencies VPATH = src\variabledefs VPATH += src\analyticalsolutions VPATH += src\variabledefs VPATH += src\analyticalsolutions VPATH += src\curvilinear VPATH += src\fft VPATH += src\functions VPATH += src\initialization VPATH += src\IO VPATH += src\main VPATH += src\multigrid VPATH += src\pressure VPATH += src\timeintegration VPATH += src\utilities VPATH += src\wrappers VPATH += src\iterative VPATH += src\OpenFoam VPATH += src\OpenFoam\IO VPATH += src\OpenFoam\OpenFoam VPATH += $(BUILDDIR) # Include directories INCLUDEDIRS += -I$(BUILDDIR) # Object files OBJECTS := $(SOURCES:.f=.o) OBJECTS := $(OBJECTS:.f90=.o) #OBJECTS := $(OBJECTS:.f=.o) OBJECTSNODIR = $(notdir $(OBJECTS)) OBJECTSBUILDDIR = $(addprefix $(BUILDDIR)\,$(OBJECTSNODIR)) # #test: $(OBJECTSBUILDDIR) # @echo $(OBJECTSBUILDDIR) # default target creates directory #default: # -@mkdir -p -v $(BUILDDIR) # @echo "To install OceanWave3D type 'make Debug|Release'" default: @if not exist $(BUILDDIR) mkdir $(BUILDDIR) @echo "To install OceanWave3D type 'make Debug|Release'" # Targets for linking Release: FFLAGS = $(OPTFLAGS) Release: $(OBJECTSBUILDDIR) @if ls *.mod &> \dev\null; then \ mv -v .\*.mod $(BUILDDIR); \ cp -v .\thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi @echo "*** Starting linking of files for OceanWave3D (Release)... ***" @$(FC) $(FFLAGS) -o $(INSTALLDIR)\$(PROGNAME) $(OBJECTSBUILDDIR) $(LIBDIRS) $(LINLIB) $(INCLUDEDIRS) @echo "OceanWave3D has been built successfully." Debug: FFLAGS = $(DBFLAGS) Debug: $(OBJECTSBUILDDIR) @if ls *.mod &> \dev\null; then \ mv -v *.mod $(BUILDDIR); \ cp -v thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi @echo "*** Starting linking of files for OceanWave3D (Debug)... ***" $(FC) $(FFLAGS) -o $(INSTALLDIR)\$(PROGNAME) $(OBJECTSBUILDDIR) $(LIBDIRS) $(LINLIB) $(INCLUDEDIRS) all: Release sharedLib: FFLAGS = $(SHLIBFLAGS) sharedLib: $(OBJECTSBUILDDIR) @if ls *.mod &> \dev\null; then \ mv -v .\*.mod $(BUILDDIR); \ cp -v .\thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi @echo "*** Starting linking of files for OceanWave3D (Release)... ***" @$(FC) $(FFLAGS) -o $(FOAM_USER_LIBBIN)\$(LIBNAME) $(OBJECTSBUILDDIR) $(LIBDIRS) $(LINLIB) $(INCLUDEDIRS) @echo "Shared library for OceanWave3D has been built successfully." # Compile only - compile all source file to build directory compile: $(OBJECTSBUILDDIR) clean: # rm -f $(BUILDDIR)\*.o # rm -f $(BUILDDIR)\*.mod # rm -f $(INSTALLDIR)\$(PROGNAME) del $(BUILDDIR)\*.o del $(BUILDDIR)\*.mod del $(INSTALLDIR)\$(PROGNAME) # # Special source dependencies # # For defining generic rules: # # $@ - The current target's full name. # $* - The current target's file name without a suffix. # $? - A list of the current target's changed dependencies. # $< - A single changed dependency of the current target. # Generic compilation rules $(BUILDDIR)\%.o: %.f $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) $(BUILDDIR)\%.o: %.f90 @if ls *.mod &> \dev\null; then \ mv -v *.mod $(BUILDDIR); \ cp -v thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) $(BUILDDIR)\%.mod: %.f $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) $(BUILDDIR)\%.mod: %.f90 $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) # / を \ に変更する前 #$(BUILDDIR)/%.o: %.f # $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) #$(BUILDDIR)/%.o: %.f90 # @if ls *.mod &> /dev/null; then \ mv -v *.mod $(BUILDDIR); \ cp -v thirdpartylibs/LIB_VTK_IO/static/lib_vtk_io.mod $(BUILDDIR); \ fi # $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) #$(BUILDDIR)/%.mod: %.f # $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) #$(BUILDDIR)/%.mod: %.f90 # $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS)
試したこと
- common.mkとmakefileにおいて/をバックスラッシュ\に変更
結果下記の警告が表示されるようになるが,ファイルの場所は示せるようになった.
makefile:141: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.o' へのコマンドを置き換えます
\build%.oの間に\が表示されないのはなぜでしょう…これもエラーの原因でしょうか?
- rmや$(PWD)などWindows環境で認識されないコマンドや変数を修正(元のコードはコメントアウト表示#)
- コマンドプロンプトにmakeと打ち込む
- To install OceanWave3D type 'make Debug|Release とコマンドプロンプトに表示されbuildフォルダがカレントディレクトリに作成される
- make Releaseと打ち込むと上記のエラーが出現しコンパイル作業が中止される
補足情報(FW/ツールのバージョンなど)
- PC OS:Windows 10 Home
- CPU:Intel(R) Core(TM) i9-9900K
- コンパイラ:gfortran
- Make: GNU Make
これ以上は自分で解決できそうにありません.ご教授よろしくお願いいたします。
0 コメント