2017-05-31 18 views
0

私はいくつかのf90ファイルを通常のgfortranコンパイラを使ってコンパイルする必要があり、いくつかはmpifortラッパーを使ってコンパイルする必要があるプロジェクトを持っています。私は適切にこれを収容するためにCMakeファイルを書く方法を知らない。また、以前はCMakeを使ったことがありませんでしたが、それに精通していませんが、ドキュメンテーションや(かなり古くなった)チュートリアルから理解しようとしています。次のようにgfortranとmpifortの両方でFortranプロジェクト用のCMakeファイルを書く

マイプロジェクトディレクトリに見えます:./src/ディレクトリで

├── CMakeLists.txt 
├── README.md 
├── bin 
├── build 
├── compile 
├── src 
│   ├── CMakeCache.txt 
│   ├── CMakeFiles 
│   │   ├── 3.8.1 
│   │   │   ├── CMakeCCompiler.cmake 
│   │   │   ├── CMakeCXXCompiler.cmake 
│   │   │   ├── CMakeDetermineCompilerABI_C.bin 
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin 
│   │   │   ├── CMakeDetermineCompilerABI_Fortran.bin 
│   │   │   ├── CMakeFortranCompiler.cmake 
│   │   │   ├── CMakeSystem.cmake 
│   │   │   ├── CompilerIdC 
│   │   │   │   ├── CMakeCCompilerId.c 
│   │   │   │   ├── a.out 
│   │   │   │   └── tmp 
│   │   │   ├── CompilerIdCXX 
│   │   │   │   ├── CMakeCXXCompilerId.cpp 
│   │   │   │   ├── a.out 
│   │   │   │   └── tmp 
│   │   │   └── CompilerIdFortran 
│   │   │    ├── CMakeFortranCompilerId.F 
│   │   │    ├── a.out 
│   │   │    └── tmp 
│   │   ├── CMakeDirectoryInformation.cmake 
│   │   ├── CMakeOutput.log 
│   │   ├── CMakeTmp 
│   │   ├── Makefile.cmake 
│   │   ├── Makefile2 
│   │   ├── TargetDirectories.txt 
│   │   ├── cmake.check_cache 
│   │   ├── feature_tests.bin 
│   │   ├── feature_tests.c 
│   │   ├── feature_tests.cxx 
│   │   ├── progress.marks 
│   │   └── streetcanyon.dir 
│   │    ├── DependInfo.cmake 
│   │    ├── INC_BBB.f90.o 
│   │    ├── INC_BBB.f90.o.provides.build 
│   │    ├── INC_BC.f90.o 
│   │    ├── INC_BC.f90.o.provides.build 
│   │    ├── INC_BOUNDC.f90.o 
│   │    ├── INC_BOUNDC.f90.o.provides.build 
│   │    ├── INC_BUOY.f90.o 
│   │    ├── INC_BUOY.f90.o.provides.build 
│   │    ├── INC_COEF.f90.o 
│   │    ├── INC_COEF.f90.o.provides.build 
│   │    ├── INC_COEFB.f90.o 
│   │    ├── INC_COEFB.f90.o.provides.build 
│   │    ├── INC_GEO.f90.o 
│   │    ├── INC_GEO.f90.o.provides.build 
│   │    ├── INC_INDEX.f90.o 
│   │    ├── INC_INDEX.f90.o.provides.build 
│   │    ├── INC_OBSTACLE.f90.o 
│   │    ├── INC_OBSTACLE.f90.o.provides.build 
│   │    ├── INC_PAR.f90.o 
│   │    ├── INC_PAR.f90.o.provides.build 
│   │    ├── INC_PRINT.f90.o 
│   │    ├── INC_PRINT.f90.o.provides.build 
│   │    ├── INC_SOURCE.f90.o 
│   │    ├── INC_SOURCE.f90.o.provides.build 
│   │    ├── INC_STAT.f90.o 
│   │    ├── INC_STAT.f90.o.provides.build 
│   │    ├── INC_TIME.f90.o 
│   │    ├── INC_TIME.f90.o.provides.build 
│   │    ├── INC_TITLE.f90.o 
│   │    ├── INC_TITLE.f90.o.provides.build 
│   │    ├── INC_TREES.f90.o 
│   │    ├── INC_TREES.f90.o.provides.build 
│   │    ├── INC_UVW.f90.o 
│   │    ├── INC_UVW.f90.o.provides.build 
│   │    ├── INC_VEC.f90.o 
│   │    ├── INC_VEC.f90.o.provides.build 
│   │    ├── INC_WALL.f90.o 
│   │    ├── INC_WALL.f90.o.provides.build 
│   │    ├── build.make 
│   │    ├── cmake_clean.cmake 
│   │    ├── cmake_clean_Fortran.cmake 
│   │    ├── depend.internal 
│   │    ├── depend.make 
│   │    ├── flags.make 
│   │    ├── fortran.internal 
│   │    ├── inc_bbb.mod.stamp 
│   │    ├── inc_bc.mod.stamp 
│   │    ├── inc_boundc.mod.stamp 
│   │    ├── inc_buoy.mod.stamp 
│   │    ├── inc_coef.mod.stamp 
│   │    ├── inc_coefb.mod.stamp 
│   │    ├── inc_geo.mod.stamp 
│   │    ├── inc_index.mod.stamp 
│   │    ├── inc_obstacle.mod.stamp 
│   │    ├── inc_par.mod.stamp 
│   │    ├── inc_print.mod.stamp 
│   │    ├── inc_source.mod.stamp 
│   │    ├── inc_stat.mod.stamp 
│   │    ├── inc_time.mod.stamp 
│   │    ├── inc_title.mod.stamp 
│   │    ├── inc_trees.mod.stamp 
│   │    ├── inc_uvw.mod.stamp 
│   │    ├── inc_vec.mod.stamp 
│   │    ├── inc_wall.mod.stamp 
│   │    ├── link.txt 
│   │    └── progress.make 
│   ├── INC_BBB.f90 
│   ├── INC_BC.f90 
│   ├── INC_BOUNDC.f90 
│   ├── INC_BUOY.f90 
│   ├── INC_COEF.f90 
│   ├── INC_COEFB.f90 
│   ├── INC_GEO.f90 
│   ├── INC_INDEX.f90 
│   ├── INC_OBSTACLE.f90 
│   ├── INC_PAR.f90 
│   ├── INC_PAR.f90_8ob 
│   ├── INC_PRINT.f90 
│   ├── INC_SOURCE.f90 
│   ├── INC_STAT.f90 
│   ├── INC_TIME.f90 
│   ├── INC_TITLE.f90 
│   ├── INC_TREES.f90 
│   ├── INC_UVW.f90 
│   ├── INC_VEC.f90 
│   ├── INC_WALL.f90 
│   ├── Makefile 
│   ├── cmake_install.cmake 
│   ├── grid_binary 
│   ├── grid_binary(8\ obsttacles) 
│   ├── inc_bbb.mod 
│   ├── inc_bc.mod 
│   ├── inc_boundc.mod 
│   ├── inc_buoy.mod 
│   ├── inc_coef.mod 
│   ├── inc_coefb.mod 
│   ├── inc_geo.mod 
│   ├── inc_index.mod 
│   ├── inc_obstacle.mod 
│   ├── inc_par.mod 
│   ├── inc_print.mod 
│   ├── inc_source.mod 
│   ├── inc_stat.mod 
│   ├── inc_time.mod 
│   ├── inc_title.mod 
│   ├── inc_trees.mod 
│   ├── inc_uvw.mod 
│   ├── inc_vec.mod 
│   ├── inc_wall.mod 
│   ├── mpi_par.f90 
│   ├── source 
│   ├── streetcanyon.f90 
│   └── streetcanyon.f90~ 

mpifort使用してコンパイルするstreetcanyon.f90mpi_par.f90必要性が、残りはgfortranを介して行うことができます。 streetcanyon.f90を最終実行ファイルにコンパイルする必要があります。私は、プロジェクトのルートディレクトリに含まれている以下のCMakeList.txtを使用して試してみました:私はFortranのための適切なプロジェクト構造を以下だ場合、私はまた、知らない

#./CMakeList.txt 
cmake_minimum_required (VERSION 3.8.0) 
project(mpi) 
enable_language (Fortran) 

file(GLOB SOURCES src/*.f90) 

add_executable(streetcanyon ${SOURCES}) 

+0

MPIラッパーですべてをコンパイルできないのはなぜですか?それが私のプロジェクトでやっていることです。 –

+0

それは可能かもしれないが、それは悪い習慣かもしれないと思った。例えば ​​'gfortran'の代わりに' mpifort'を呼ぶとき、何が「フードの下で」起こっているのか正確には分かりません。 – Lars

+0

本当に悪いことはありません。 MPIラッパーですべてをコンパイルしない理由はわかりません。どのようにしてどのように決定するのですか? –

答えて

0

CMakeのFindMPIモジュールを使用してください。コンパイルフラグとライブラリをmpifortから抽出し、通常のCMake変数として利用できるようにします。これらのフラグをライブラリに適用するだけです。唯一の難しい部分は、適用する必要があるいくつかの異なることがあるということです。ここでは、あなたがそれを使用したい方法の例を示します。

cmake_minimum_required (VERSION 3.8.0) 
project(mpi) 
enable_language (Fortran) 

find_package(MPI) 
if(NOT MPI_Fortran_FOUND) 
    message(FATAL_ERROR "Could not find Fortran MPI. Please set MPI_Fortran_COMPILER to point to the mpifort wrapper.") 
endif() 

include_directories(${MPI_Fortran_INCLUDE_PATH}) 
add_compile_options(${MPI_Fortran_COMPILE_FLAGS}) 

file(GLOB SOURCES src/*.f90) 

add_executable(streetcanyon ${SOURCES}) 
target_link_libraries(streetcanyon ${MPI_Fortran_LIBRARIES}) 
set_property(TARGET streetcanyon APPEND_STRING PROPERTY LINK_FLAGS "${MPI_Fortran_LINK_FLAGS}") 

これは、ユースケースの99%で問題ないはずmpifortはそれらをコンパイルしたであろう道、streetcanyon源のすべてをコンパイルします。

:あなたは本当に唯一のmpifortのようないくつかのファイルが持っているでしょうコンパイルしたい場合は、あなたが言ったように、その後、代わりの

add_compile_options(${MPI_Fortran_COMPILE_FLAGS}) 

あなたはいじるのビットは、唯一の特定のソースファイルにコンパイルオプションMPIを渡すことができます

set(MPI_SOURCES foo.f90 bar.f90...) 
set(NO_MPI_SOURCES baz.f90...) 

# convert CMake list to string for PROPERTY COMPILE_FLAGS 
set(MPI_Fortran_COMPILE_FLAGS_STR "") 
foreach(ELEMENT ${MPI_Fortran_COMPILE_FLAGS}) 
    set(MPI_Fortran_COMPILE_FLAGS_STR "${MPI_Fortran_COMPILE_FLAGS_STR } ${ELEMENT}") 
endforeach() 

set_property(SOURCE ${MPI_SOURCES} PROPERTY COMPILE_FLAGS ${MPI_Fortran_COMPILE_FLAGS_STR}) 

...later... 
add_executable(streetcanyon ${MPI_SOURCES} ${NO_MPI_SOURCES}) 
+0

ありがとう!あなたの説明は非常に徹底的です。できるだけ早く試してみるつもりです。うまくいけば、私は肯定的なニュースであなたに戻ってくることができるだろう – Lars

関連する問題