У меня есть следующие работает CMakeList.txt как часть более крупного проекта:Использование CMake с 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/
, и я хотел бы изменить его, чтобы связать цели с ПДВ (точнее, с 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
Я также выбрал FindMPE.cmake из других (https://github.com/losalamos/CLAMR/blob/master/cmake/Modules/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
среди других.
Я совершил немало бесплодных попыток и не могу найти подходящую информацию в сети.
Подсказка?
Я попробовал ваше решение, которое выглядит просто и элегантно, но к сожалению, это не работает. Проблема в том, что даже с этим изменением результирующий make пытается связать объекты с gfortran, и он должен взять mpifc в качестве компоновщика. (См. Вторую и десятую строки, за исключением пустых строк, в Makefile, который я привел выше, как пример того, что я хочу). Я предполагаю, что единственное, что не хватает вашему предложению, - это то, как выполнить изменения в компоновщике от gfortran до mpifc. Я чувствую, что если на этот вопрос будет дан ответ, ваше предложение будет работать. – Rafa
Да, это ожидается. 'mpifc', вероятно, также использует' gfortran' внутри, с определенным набором параметров. CMake пытается подражать этим параметрам, чтобы вести себя как 'mpifc'. Вам придется попытаться выяснить, как команда компоновщика mpifc отличается от команды CMake, например. с помощью 'mpifc -show'. Если все провалится, вы также можете попытаться установить 'CMAKE_LINKER', но я не могу этого рекомендовать. – Zulan
Я неправильно написал mpifc вместо mpefc, но ваше предложение, похоже, тоже в этом случае. Запуск «/ usr/local/bin/mpefc -show» Я получил: «mpefc: **** Не задан параметр профилирования!/Usr/local/share/mpich2-install/bin/mpif90» и выполняется «/ usr/local/bin/mpefc -link-info «Я получил:« gfortran -I/usr/local/share/mpich2-install/include -I/usr/local/share/mpich2-install/include -L/usr/local/share/mpich2-install/lib -lmpichf90 -lmpichf90 -lmpich -lopa -lmpl -lrt -lpthread «Не могли бы вы помочь мне реализовать это в CMakeLists.txt? Благодарю. – Rafa