2016-09-27 3 views
0

とcmakeの使用:私は大きなプロジェクトの一環として、次の作業CMakeList.txtを持っているMPIとMPE

# Project details 
# --------------- 
project(DAMZernike2016_mpi) 

enable_language (C Fortran) 

SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../utils/" ${CMAKE_MODULE_PATH}) 

find_package(MPI REQUIRED) # This is redundant (it has been previously checked), but convenient not to forget that MPI is necessary 
add_definitions(${MPI_Fortran_COMPILE_FLAGS}) 
include_directories(${MPI_Fortran_INCLUDE_PATH}) 
link_directories(${MPI_Fortran_LIBRARIES}) 

# Fortran compiler flags 
# ====================== 
set (CMAKE_Fortran_FLAGS_RELEASE "-O3") 
set (CMAKE_Fortran_FLAGS_DEBUG "-O0 -g") 

# Defines auxiliary containers with program names and directory with ancillary files 
# ================================================================================== 
set (DAMZernike_2016_mpi_PROGRAMS "DAMZernike-Jacobi_STO_mpi" "DAMZernike-Jacobi_GTO_mpi") 

set (DAMZernike_2016_mpi_EXECUTABLES "") 

set (ancillarydir "../DAMZernike2016") 

# Prepares Zernike-Jacobi_ckplm.F90 to be compiled without optimization (-O0) 
# ============================================================================= 

set (ckplm_file "${ancillarydir}/Zernike-Jacobi_ckplm.F90") 

SET_SOURCE_FILES_PROPERTIES(${ckplm_file} PROPERTIES COMPILE_FLAGS -O0) # Zernike-Jacobi_ckplm.F90 compiled without optimization to prevent long delay in compilation 

# Ancillary files for libraries 
# =========================================================================== 

set (ancillaryfiles "${ancillarydir}/DAMZernike_2016_GLOBAL.F90" "${ancillarydir}/Zernike-Jacobi_ckplm.F90" "${ancillarydir}/Zernike-Jacobi_paribkb.F90" 
"${ancillarydir}/Zernike-Jacobi_quadrat.f" "${ancillarydir}/Zernike-Jacobi_stngexp.f" 
"${ancillarydir}/Zernike-Jacobi_subVABC.F90") 

# Creates a library with modules 
# ============================== 
add_library(DAMZernikeGLOBAL_mpi_mods DAMZernike_2016_mpi_GLOBAL.F90 ${ancillaryfiles}) 

# Create binaries 
# =============== 
foreach (p ${DAMZernike_2016_mpi_PROGRAMS}) 
    add_executable(${p}.exe "${p}.F90") 
    list (APPEND DAMZernike_2016_mpi_EXECUTABLES ${p}.exe) 
endforeach (p) 

# Links binaries to modules 
# ========================= 
foreach (p ${DAMZernike_2016_mpi_EXECUTABLES}) 
    target_link_libraries("${p}" DAMZernikeGLOBAL_mpi_mods ${MPI_Fortran_LIBRARIES}) 
    message("Adds ${p}") 
endforeach (p) 

# install executables and scripts 
# =============================== 
install (TARGETS ${DAMZernike_2016_mpi_EXECUTABLES} RUNTIME DESTINATION ".")  # Default installation directory: /usr/local/bin/ 

と私は、正確には(MPEとの目標をリンクするためにそれを変更したいですMPEFC)は、すなわちのようなものに相当するCMakeのために:

CC = /usr/local/bin/mpicc 
LD = /usr/local/bin/mpefc 
OBJ = ring.o 
SRC = ring.c 
EXEC = ring 
CFLAGS = -g 
LDFLAGS = -lm -mpilog 

all: $(EXEC) 

$(EXEC): ${OBJ} 
    $(LD) $(LDFLAGS) $< -o $(EXEC) 

ring.o: ${SRC} 
    $(CC) $(CFLAGS) -c ring.c 

clean: 
    $(RM) ${OBJ} $(EXEC) 
    $(RM) *.clog2 *.slog2 

私はまた、MPEがインストールされているかどうかを見つけるために、他の場所(https://github.com/losalamos/CLAMR/blob/master/cmake/Modules/FindMPE.cmake)からFindMPE.cmakeを選びました。これは私のシステムで動作し、次のようないくつかの変数を返します。

MPE_LOG_INCLUDE_PATH = /usr/local/include 
MPE_LOG_LIBRARIES = /usr/lib64/libmpe_f2cmpi.a;/usr/lib64/liblmpe.a;/usr/local/lib/libmpe.a 
MPE_COMPILER = /usr/local/bin/mpefc 

私は非常に多くの未熟な試みをしており、ネット上で適切な情報を見つけることができません。

ヒント?

答えて

0

私はあなたの痛みを感じます。残念ながら、cmakeはコンパイラ/リンカラッパーを使用することで特に優れていません。通常は、適切な..._LIBRARIES..._COMPILE_FLAGS..._LINK_FLAGS検索スクリプトの出力を使用する必要があります。あなたの場合、これは次のようになります:

find_package(MPI REQUIRED) 
find_package(MPE REQUIRED) 

# Links binaries to modules 
# ========================= 
foreach (p ${DAMZernike_2016_mpi_EXECUTABLES}) 
    target_link_libraries("${p}" DAMZernikeGLOBAL_mpi_mods ${MPE_LOG_LIBRARIES} ${MPI_Fortran_LIBRARIES}) 
    set_target_properties("${p}" PROPERTIES COMPILE_FLAGS "${MPI_Fortran_COMPILE_FLAGS} ${MPE_COMPILE_FLAGS}") 
    set_target_properties("${p}" PROPERTIES LINK_FLAGS "${MPI_Fortran_LINK_FLAGS} ${MPE_LINK_FLAGS}" 
    message("Adds ${p}") 
endforeach (p) 

残念ながら私は答えをテストすることはできません。私は...FLAGS変数の存在をテストすることをお勧めします。

+0

私はシンプルかつエレガントに見えるあなたのソリューションを試してみましたが、残念ながらそれは動作しません。問題は、この変更があっても、結果のmakeがオブジェクトをgfortranとリンクしようとしており、mpifcをリンカとして使用する必要があるということです。 (私が望むものの例として上に引用したMakefileの空白行を除いた2行目と10行目を参照してください)。私はあなたの提案に欠けているのは、gfortranからmpifcへのリンカーの変更をどのように行うかということだけだと思います。私はその質問に答えると、あなたの提案がうまくいくと感じています。 – Rafa

+0

はい、これが予想されます。 'mpifc'は内部的に' gfortran'も使用しています。 CMakeは 'mpifc'のように動作するようにこれらのパラメータをエミュレートしようとします。 'mpifc'のリンカコマンドとCMakeのリンカコマンドがどのように異なるかを調べる必要があります。 'mpifc -show'を使用してください。すべてが失敗した場合は、 'CMAKE_LINKER'を設定しようとすることもできますが、本当にそれをお勧めすることはできません。 – Zulan

+0

私は誤ってmpefcの代わりにmpifcを書きましたが、この場合もあなたの提案はうまくいくようです。/usr/local/share/mpich2-install/bin/mpif90 "を実行し、"/usr/local/bin/mpefc -show "を実行しています:" mpefc:****プロファイルオプションは指定されていません!/usr/local/share/mpich2-install/include -L/usr/local/bin/mpefc -link-info "私は次のものを持っています:" gfortran -I/usr/local/share/mpich2-install// share/mpich2-install/lib -lmpichf90 -lmpichf90 -lmpich -lopa -lmpl -lrt -lpthread "これをCMakeLists.txtに実装するのを助けてくれますか?ありがとう。 – Rafa

0

Zulanのヒントに続いて、MPEが望まれているのかどうかを制御するためにCACHE変数USE_MPEを導入し、次のコードは、仕事をしていません:

# Links binaries to modules 
# ========================= 
if(${USE_MPE}) 
    find_package(MPE) 
    if (MPE_FOUND) 
     message("Uses MPE for clog2 generation") 
     set (MPI_Fortran_COMPILE_FLAGS "-lfmpich -llmpe -lmpe -lpmpich" ${MPI_Fortran_COMPILE_FLAGS}) 
    endif (MPE_FOUND) 
endif(${USE_MPE}) 
foreach (p ${DAMZernike_2016_mpi_EXECUTABLES}) 
    target_link_libraries("${p}" DAMZernikeGLOBAL_mpi_mods ${MPE_LOG_LIBRARIES} ${MPI_Fortran_LIBRARIES}) 
    set_target_properties("${p}" PROPERTIES COMPILE_FLAGS "${MPI_Fortran_COMPILE_FLAGS} ${MPE_COMPILE_FLAGS}") 
    set_target_properties("${p}" PROPERTIES LINK_FLAGS "${MPI_Fortran_LINK_FLAGS} ${MPE_LINK_FLAGS}") 
    message("Adds ${p}") 
endforeach (p) 
関連する問題