Clean/refactor CMake build to add upstream changes

pull/12/head
Izaak Beekman 8 years ago
parent dcf61f9d71
commit ee1b2f6d6e
No known key found for this signature in database
GPG Key ID: A93CE70D8021BD0F

@ -1,7 +1,13 @@
# FDEFINES : -DHAVE_LAPACK -DHAVE_FINAL -DHAVE_ISO_FORTRAN_ENV -DHAVE_FLUSH_STMT -DHAVE_VOLATILE -DSERIAL_MPI -DMPI_MOD
# CDEFINES : -DLowerUnderscore -DPtr64Bits
#----------------------------------- #-----------------------------------
# Set oldest allowable CMake version # Set oldest allowable CMake version
#----------------------------------- #-----------------------------------
cmake_minimum_required(VERSION 3.4) cmake_minimum_required(VERSION 3.10)
cmake_policy(VERSION 3.10.0...3.12.4)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
#---------------------------------------------- #----------------------------------------------
# Define canonical CMake build types and extras # Define canonical CMake build types and extras
@ -14,7 +20,7 @@ set_property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYP
#----------------------------------------------------- #-----------------------------------------------------
# Determine version from .VERSION file or git describe # Determine version from .VERSION file or git describe
#----------------------------------------------------- #-----------------------------------------------------
include("${CMAKE_SOURCE_DIR}/cmake/setVersion.cmake") include(setVersion)
set_version( set_version(
VERSION_VARIABLE PSBLAS_Version VERSION_VARIABLE PSBLAS_Version
GIT_DESCRIBE_VAR full_git_describe GIT_DESCRIBE_VAR full_git_describe
@ -24,7 +30,9 @@ message( STATUS "Building PSBLAS version: ${full_git_describe}" )
#------------------------------------------ #------------------------------------------
# Name project and specify source languages # Name project and specify source languages
#------------------------------------------ #------------------------------------------
project(psblas VERSION "${PSBLAS_Version}" LANGUAGES C Fortran) project(psblas
VERSION "${PSBLAS_Version}"
LANGUAGES C Fortran)
#----------------------------------------------------------------- #-----------------------------------------------------------------
# Define a target to create a checksummed & signed release archive # Define a target to create a checksummed & signed release archive
@ -40,24 +48,7 @@ endif()
#-------------------------- #--------------------------
# Prohibit in-source builds # Prohibit in-source builds
#-------------------------- #--------------------------
if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") include(CheckOutOfSourceBuild)
message(FATAL_ERROR "ERROR! "
"CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
" == CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"\nThis archive does not support in-source builds:\n"
"You must now delete the CMakeCache.txt file and the CMakeFiles/ directory under "
"the 'src' source directory or you will not be able to configure correctly!"
"\nYou must now run something like:\n"
" $ rm -r CMakeCache.txt CMakeFiles/"
"\n"
"Please create a directory outside the ${CMAKE_PROJECT_NAME} source tree and build under that outside directory "
"in a manner such as\n"
" $ mkdir build\n"
" $ cd build\n"
" $ CC=gcc FC=gfortran cmake -DBUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/path/to/install/dir /path/to/psblas3/src/dir \n"
"\nsubstituting the appropriate syntax for your shell (the above line assumes the bash shell)."
)
endif()
#---------------------------------------------------- #----------------------------------------------------
# Define coverage flags and report untested compilers # Define coverage flags and report untested compilers
@ -76,12 +67,11 @@ else()
) )
endif() endif()
#------------------------------------- #------------------------------------
# Fortran name mangling intro-spection # Fortran name mangling introspection
#------------------------------------- #------------------------------------
include("${CMAKE_SOURCE_DIR}/cmake/CapitalizeString.cmake")
include(FortranCInterface) include(FortranCInterface)
CapitalizeString(${FortranCInterface_GLOBAL__CASE} fc_case) string(TOUPPER ${FortranCInterface_GLOBAL__CASE} fc_case)
message(STATUS "Name mangling capitalization: ${fc_case}") message(STATUS "Name mangling capitalization: ${fc_case}")
message(STATUS "Name mangling fortran global suffix underscore: ${FortranCInterface_GLOBAL__SUFFIX}") message(STATUS "Name mangling fortran global suffix underscore: ${FortranCInterface_GLOBAL__SUFFIX}")
if(FortranCInterface_GLOBAL__SUFFIX STREQUAL "") if(FortranCInterface_GLOBAL__SUFFIX STREQUAL "")
@ -91,7 +81,7 @@ elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "_")
elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "__") elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "__")
add_definitions("-D${fc_case}DoubleUnderscore") add_definitions("-D${fc_case}DoubleUnderscore")
else() else()
message( FATAL_ERROR "Fortran name mangling suffix, \'${FortranCInterface_GLOBAL__SUFFIX}\', unknown to morfeus/NEMO") message( FATAL_ERROR "Fortran name mangling suffix, \'${FortranCInterface_GLOBAL__SUFFIX}\', unknown to PSBLAS")
endif() endif()
#---------------------------------------------- #----------------------------------------------
@ -154,228 +144,142 @@ CHECK_Fortran_SOURCE_COMPILES(
if(HAVE_FLUSH_STMT) if(HAVE_FLUSH_STMT)
add_definitions(-DHAVE_FLUSH_STMT) add_definitions(-DHAVE_FLUSH_STMT)
endif() endif()
CHECK_Fortran_SOURCE_COMPILES(
#---------------------------------------------------------------------------- "
# Find MPI and set some flags so that FC and CC can point to gfortran and gcc module conftest_mod
#---------------------------------------------------------------------------- type foo
# If the user passes FC=mpifort etc. check and prefer that location integer :: i
get_filename_component( FTN_COMPILER_NAME "${CMAKE_Fortran_COMPILER}" contains
NAME ) final :: destroy_foo
get_filename_component( C_COMPILER_NAME "${CMAKE_C_COMPILER}" end type foo
NAME ) private destroy_foo
get_filename_component( FTN_COMPILER_DIR "${CMAKE_Fortran_COMPILER}" contains
REALPATH ) subroutine destroy_foo(a)
get_filename_component( C_COMPILER_DIR "${CMAKE_C_COMPILER}" type(foo) :: a
REALPATH ) ! Just a test
end subroutine destroy_foo
if (FTN_COMPILER_NAME MATCHES "^[mM][pP][iI]") end module conftest_mod
set (MPI_Fortran_COMPILER "${CMAKE_Fortran_COMPILER}") program conftest
use conftest_mod
type(foo) :: foovar
end program"
HAVE_FINAL
SRC_EXT f90
)
if(HAVE_FINAL)
add_definitions(-DHAVE_FINAL)
endif() endif()
if (C_COMPILER_NAME MATCHES "^[mM][pP][iI]") CHECK_Fortran_SOURCE_COMPILES(
set (MPI_C_COMPILER "${CMAKE_C_COMPILER}") "
program xtt
type foo
integer :: i
end type foo
type, extends(foo) :: new_foo
integer :: j
end type new_foo
class(foo), allocatable :: fooab
type(new_foo) :: nfv
integer :: info
allocate(fooab, mold=nfv, stat=info)
end program"
HAVE_MOLD
SRC_EXT f90)
if(HAVE_MOLD)
add_definitions(-DHAVE_MOLD)
endif() endif()
CHECK_Fortran_SOURCE_COMPILES(
find_package( MPI ) "
program conftest
if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) OR (NOT MPIEXEC)) type foo
find_program (MY_MPI_EXEC NAMES mpirun mpiexec lamexec srun integer :: i
HINTS "${FTN_COMPILER_DIR}" "${C_COMPILER_DIR}" end type foo
PATH_SUFFIXES bin) type, extends(foo) :: bar
set ( MPI_HOME "${MPI_HOME}" "${MY_MPI_EXEC}" "${MY_MPI_EXEC}/.." ) integer j
find_package( MPI REQUIRED ) end type bar
type(bar) :: barvar
end program "
HAVE_EXTENDS_TYPE_OF
SRC_EXT f90)
if(HAVE_EXTENDS_TYPE_OF)
add_definitions(-DHAVE_EXTENDS_TYPE_OF)
endif() endif()
list(REMOVE_DUPLICATES MPI_Fortran_INCLUDE_PATH) CHECK_Fortran_SOURCE_COMPILES(
"
# Test for consistent MPI environment program stt
if (NOT MPIEXEC) type foo
message ( ERROR "CMake failed to find `mpiexec` or similar. If MPI is installed integer :: i
on your system then please point CMake to the desired MPI runtime end type foo
using `cmake-gui` or `ccmake`. Otherwise, we will proceed with a type, extends(foo) :: new_foo
serial build. If you beleive you are getting this message in error, integer :: j
please report this at https://github.com/sfilippone/psblas3/issues.") end type new_foo
type(foo) :: foov
type(new_foo) :: nfv1, nfv2
write(*,*) 'foov == nfv1? ', same_type_as(foov,nfv1)
write(*,*) 'nfv2 == nfv1? ', same_type_as(nfv2,nfv1)
end program"
HAVE_SAME_TYPE_AS
SRC_EXT f90)
if(HAVE_SAME_TYPE_AS)
add_definitions(-DHAVE_SAME_TYPE_AS)
endif() endif()
get_filename_component(MPIEXEC_RELATIVE_LOC "${MPIEXEC}" #----------------------------------------------------------------------------
PROGRAM) # Find MPI and set some flags so that FC and CC can point to gfortran and gcc
get_filename_component(MPIEXEC_ABS_LOC "${MPIEXEC_RELATIVE_LOC}" #----------------------------------------------------------------------------
REALPATH) find_package( MPI )
get_filename_component(MPIEXEC_DIR "${MPIEXEC_ABS_LOC}"
DIRECTORY)
get_filename_component(MPICC_RELATIVE_LOC "${MPI_C_COMPILER}"
PROGRAM)
get_filename_component(MPICC_ABS_LOC "${MPICC_RELATIVE_LOC}"
REALPATH)
get_filename_component(MPICC_DIR "${MPICC_ABS_LOC}"
DIRECTORY)
get_filename_component(MPIFC_RELATIVE_LOC "${MPI_Fortran_COMPILER}"
PROGRAM)
get_filename_component(MPIFC_ABS_LOC "${MPIFC_RELATIVE_LOC}"
REALPATH)
get_filename_component(MPIFC_DIR "${MPIFC_ABS_LOC}"
DIRECTORY)
if ((MPIEXEC_DIR STREQUAL MPICC_DIR) AND (MPIEXEC_DIR STREQUAL MPIFC_DIR))
message ( STATUS "MPI runtime and compile time environments appear to be consistent")
else()
message ( WARNING "MPIEXEC is in \"${MPIEXEC_DIR},\"
which differs from the location of MPICC and/or MPIFC which are in
\"${MPICC_DIR}\" and \"${MPIFC_DIR},\" respectively.
This is likely indicative of an inconsistent MPI environment")
endif()
#----------------------------------------------- if(MPI_FOUND)
# Work around an issue present on fedora systems #-----------------------------------------------
#----------------------------------------------- # Work around an issue present on fedora systems
if( (MPI_C_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") ) #-----------------------------------------------
message ( WARNING if( (MPI_C_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") )
"The `noexecstack` linker flag was found in the MPI_<lang>_LINK_FLAGS variable. This is message ( WARNING
"The `noexecstack` linker flag was found in the MPI_<lang>_LINK_FLAGS variable. This is
known to cause segmentation faults for some Fortran codes. See, e.g., known to cause segmentation faults for some Fortran codes. See, e.g.,
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71729 or https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71729 or
https://github.com/sourceryinstitute/OpenCoarrays/issues/317. https://github.com/sourceryinstitute/OpenCoarrays/issues/317.
`noexecstack` is being replaced with `execstack`" `noexecstack` is being replaced with `execstack`"
) )
string(REPLACE "noexecstack" string(REPLACE "noexecstack"
"execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS}) "execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS})
string(REPLACE "noexecstack" string(REPLACE "noexecstack"
"execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS}) "execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS})
set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING
"MPI C linking flags" FORCE) "MPI C linking flags" FORCE)
set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING
"MPI Fortran linking flags" FORCE) "MPI Fortran linking flags" FORCE)
endif() endif()
#--------------------------------------------------------
# Make sure a simple "hello world" C mpi program compiles
#--------------------------------------------------------
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_FLAGS} ${MPI_C_LINK_FLAGS})
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH})
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES})
include (CheckCSourceCompiles)
CHECK_C_SOURCE_COMPILES("
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf('Hello world from processor %s, rank %d out of %d processors',
processor_name, world_rank, world_size);
MPI_Finalize();
}"
MPI_C_COMPILES)
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
unset(OLD_REQUIRED_FLAGS)
unset(OLD_INCLUDES)
unset(OLD_LIBRARIES)
if (NOT MPI_C_COMPILES)
message(FATAL_ERROR "MPI_C is missing! "
"Try setting MPI_C_COMPILER to the appropriate C compiler wrapper script and reconfigure. "
"i.e., `cmake -DMPI_C_COMPILER=/path/to/mpicc ..` or set it by editing the cache using "
"cmake-gui or ccmake."
)
endif()
#--------------------------------------------------------------
# Make sure a simple "hello world" Fortran mpi program compiles
# Try using mpi.mod first then fall back on includ 'mpif.h'
#--------------------------------------------------------------
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_FLAGS} ${MPI_Fortran_LINK_FLAGS})
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
set(CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_INCLUDE_PATH})
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
include (CheckFortranSourceCompiles)
CHECK_Fortran_SOURCE_COMPILES("
program mpi_hello
use mpi
implicit none
integer :: ierr, mpi_world_size, mpi_world_rank, res_len
character*(MPI_MAX_PROCESSOR_NAME) :: proc
call mpi_init(ierr)
call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr)
call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr)
call mpi_get_processor_name(proc,res_len,ierr)
write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.'
call mpi_finalize(ierr)
end program
"
MPI_Fortran_MODULE_COMPILES)
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
unset(OLD_REQUIRED_FLAGS)
unset(OLD_INCLUDES)
unset(OLD_LIBRARIES)
#--------------------------------
# If that failed try using mpif.h
#--------------------------------
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_FLAGS} ${MPI_Fortran_LINK_FLAGS})
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
set(CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_INCLUDE_PATH})
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
include (CheckFortranSourceCompiles)
CHECK_Fortran_SOURCE_COMPILES("
program mpi_hello
implicit none
include 'mpif.h'
integer :: ierr, mpi_world_size, mpi_world_rank, res_len
character*(MPI_MAX_PROCESSOR_NAME) :: proc
call mpi_init(ierr)
call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr)
call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr)
call mpi_get_processor_name(proc,res_len,ierr)
write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.'
call mpi_finalize(ierr)
end program
"
MPI_Fortran_INCLUDE_COMPILES)
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
unset(OLD_REQUIRED_FLAGS)
unset(OLD_INCLUDES)
unset(OLD_LIBRARIES)
if ( (NOT MPI_Fortran_MODULE_COMPILES) AND (NOT MPI_Fortran_INCLUDE_COMPILES) )
message ( WARNING "It appears that the Fortran MPI compiler is not working. ")
endif()
if ( MPI_Fortran_MODULE_COMPILES ) #----------------
add_definitions(-DMPI_WORKING_MODULE) # Setup MPI flags
#----------------
list(REMOVE_DUPLICATES MPI_Fortran_INCLUDE_PATH)
set(CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS})
set(CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS})
set(CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS})
set(CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS})
include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH})
if(MPI_Fortran_HAVE_F90_MODULE OR MPI_Fortran_HAVE_F08_MODULE)
add_definitions(-DMPI_MOD)
endif()
set(SERIAL_MPI OFF)
else() else()
message ( WARNING "It appears that MPI was built with a different Fortran compiler. " add_definitions(-DSERIAL_MPI)
"It is possible that this may cause unpredictable behavior. The build will continue " add_definitions(-DMPI_MOD)
"using `mpif.h` BUT please report any suspicious behavior to the ${CMAKE_PROJECT_NAME} " set(SERIAL_MPI ON)
"developers."
)
endif() endif()
#---------------- #------------------------------
# Setup MPI flags # Find Linear Algebra Libraries
#---------------- #------------------------------
set(CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS}) find_package(BLAS REQUIRED)
set(CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS}) find_package(LAPACK REQUIRED)
set(CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}) add_definitions(-DHAVE_LAPACK)
set(CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS})
include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH})
#--------------------------------------------------- #---------------------------------------------------
# Use standardized GNU install directory conventions # Use standardized GNU install directory conventions
@ -386,9 +290,11 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
#-----------------------------------
# Turn on testing/ctest capabilities
#-----------------------------------
enable_testing() enable_testing()
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Add custom properties on targets for controling number of ranks during tests # Add custom properties on targets for controling number of ranks during tests
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
@ -429,6 +335,7 @@ install(
) )
if(MPI_FOUND)
#------------------------------------------ #------------------------------------------
# Add portable unistall command to makefile # Add portable unistall command to makefile
#------------------------------------------ #------------------------------------------
@ -443,48 +350,99 @@ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure)
# See JSON-Fortran's CMakeLists.txt file to find out how to get the check target to depend # See JSON-Fortran's CMakeLists.txt file to find out how to get the check target to depend
# on the test executables # on the test executables
#--------------------------------------------------------------------------------------- #----------------------------------
# Define macro for adding CAF tests, and ensuring proper flags are passed to MPI runtime
#---------------------------------------------------------------------------------------
# Determine if we're using Open MPI # Determine if we're using Open MPI
#---------------------------------
execute_process(COMMAND ${MPIEXEC} --version execute_process(COMMAND ${MPIEXEC} --version
OUTPUT_VARIABLE mpi_version_out) OUTPUT_VARIABLE mpi_version_out)
if (mpi_version_out MATCHES "[Oo]pen[ -][Mm][Pp][Ii]") if (mpi_version_out MATCHES "[Oo]pen[ -][Mm][Pp][Ii]")
message( STATUS "OpenMPI detected") message( STATUS "OpenMPI detected")
set ( openmpi true ) set ( openmpi true )
endif () endif ()
endif()
include( ProcessorCount ) #---------------------------------------
ProcessorCount(N_CPU) # Add the PSBLAS libraries and utilities
function(add_mpi_test name num_mpi_rank test_target) #---------------------------------------
# Function to add MPI tests.
if(TARGET ${test_target}) # Link order, left to right:
get_target_property(min_test_ranks ${test_target} MIN_RANKS) # cbind.a, util.a krylov.a prec.a base.a
elseif(TARGET build_${test_target})
get_target_property(min_test_ranks build_${test_target} MIN_RANKS) include(${CMAKE_CURRENT_LIST_DIR}/base/CMakeLists.txt)
endif() add_library(base ${base_source_files})
if(min_test_ranks) set_target_properties(base
if(num_mpi_rank LESS min_test_ranks) PROPERTIES
message( FATAL_ERROR "Test ${name} requires ${min_test_ranks} but was only given ${num_mpi_ranks}" ) Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}"
endif() POSITION_INDEPENDENT_CODE TRUE
endif() OUTPUT_NAME psb_base
if ( ((N_CPU LESS num_mpi_rank) OR (N_CPU EQUAL 0)) ) LINKER_LANGUAGE Fortran
message(STATUS "Test ${name} is oversubscribed: ${num_mpi_rank} CAF ranks requested with ${N_CPU} system processor available.") )
if ( openmpi ) target_include_directories(base PUBLIC
if (min_test_ranks) $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}>
set( num_mpi_rank ${min_test_ranks} ) $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
elseif ( N_CPU LESS 2 ) if(MPI_FOUND)
set( num_mpi_rank 2 ) target_link_libraries(base PUBLIC ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES})
endif() endif()
set (test_parameters --oversubscribe)
message( STATUS "Open-MPI back end detected, passing --oversubscribe for oversubscribed test, ${name}, with ${num_mpi_rank} ranks." )
endif() include(${CMAKE_CURRENT_LIST_DIR}/prec/CMakeLists.txt)
endif() add_library(prec ${prec_source_files})
set(test_parameters -np ${num_mpi_rank} ${test_parameters}) set_target_properties(prec
add_test(NAME ${name} COMMAND "bash" "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/mpirun" ${test_parameters} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test_target}") PROPERTIES
set_property(TEST ${name} PROPERTY PASS_REGULAR_EXPRESSION "Test passed.") Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}"
endfunction(add_mpi_test) POSITION_INDEPENDENT_CODE TRUE
OUTPUT_NAME psb_prec
LINKER_LANGUAGE Fortran
)
target_include_directories(prec PUBLIC
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
target_link_libraries(prec PUBLIC base)
include(${CMAKE_CURRENT_LIST_DIR}/krylov/CMakeLists.txt)
add_library(krylov ${krylov_source_files})
set_target_properties(krylov
PROPERTIES
Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}"
POSITION_INDEPENDENT_CODE TRUE
OUTPUT_NAME psb_krylov
LINKER_LANGUAGE Fortran
)
target_include_directories(krylov PUBLIC
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
target_link_libraries(krylov PUBLIC base prec)
include(${CMAKE_CURRENT_LIST_DIR}/util/CMakeLists.txt)
add_library(util ${util_source_files})
set_target_properties(util
PROPERTIES
Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}"
POSITION_INDEPENDENT_CODE TRUE
OUTPUT_NAME psb_util
LINKER_LANGUAGE Fortran
)
target_include_directories(util PUBLIC
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
target_link_libraries(util PUBLIC base prec)
install(DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
FILES_MATCHING PATTERN "*.mod")
install(TARGETS base prec krylov util
EXPORT ${CMAKE_PROJECT_NAME}-targets
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)
# set(directory_list base prec krylov util test) # TODO: add cbind
# foreach(directory ${directory_list})
# add_subdirectory("${directory}")
# endforeach()
#add_subdirectory(cbind)
#----------------- #-----------------
# Add PSBLAS tests # Add PSBLAS tests
@ -492,17 +450,3 @@ endfunction(add_mpi_test)
# Unit tests targeting each function, argument, and branch of code # Unit tests targeting each function, argument, and branch of code
# add_mpi_test(initialize_mpi 2 initialize_mpi) # add_mpi_test(initialize_mpi 2 initialize_mpi)
add_definitions(
-DHAVE_METIS -DHAVE_LAPACK -DHAVE_MOLD -DHAVE_EXTENDS_TYPE_OF -DHAVE_SAME_TYPE_AS -DHAVE_FINAL -DMPI_MOD
)
# From ./configure CDEFINES section
add_definitions(
-DHAVE_METIS_
)
set(directory_list base prec krylov util test) # TODO: add cbind
foreach(directory ${directory_list})
add_subdirectory("${directory}")
endforeach()
#add_subdirectory(cbind)

@ -1,91 +1,4 @@
if (NOT MPI_C_FOUND) set(PSB_base_source_files
find_package(MPI REQUIRED)
set(CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS})
set(CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS})
set(CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS})
set(CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS})
include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH})
endif()
if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "GNU")
set(gfortran_compiler true)
endif()
include(CheckIncludeFile)
CHECK_INCLUDE_FILE("alloca.h" HAVE_ALLOCA)
if(NOT HAVE_ALLOCA)
add_definitions(-DALLOCA_MISSING)
message(WARNING "Could not find <alloca.h>. Assuming functionality is provided elsewhere.")
endif()
set(old_cmake_required_includes "${CMAKE_REQUIRED_INCLUDES}")
if(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${MPI_C_INCLUDE_PATH})
else()
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH})
endif()
set(old_cmake_required_flags "${CMAKE_REQUIRED_FLAGS}")
if(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS};${MPI_C_COMPILE_FLAGS};${MPI_C_LINK_FLAGS})
else()
set(CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_FLAGS};${MPI_C_LINK_FLAGS})
endif()
set(old_cmake_required_libraries "${CMAKE_REQUIRED_LIBRARIES}")
if(CMAKE_REQUIRED_LIBRARIES)
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES};${MPI_C_LIBRARIES})
else()
set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES})
endif()
set(MPI_HEADERS mpi.h)
include(CheckIncludeFiles)
CHECK_INCLUDE_FILES("mpi.h;mpi-ext.h" HAVE_MPI_EXT)
if(HAVE_MPI_EXT)
add_definitions(-DHAVE_MPI_EXT_H)
set(MPI_HEADERS ${MPI_HEADERS};mpi-ext.h)
endif()
set(CMAKE_REQUIRED_INCLUDES ${old_cmake_required_includes})
set(CMAKE_REQUIRED_FLAGS ${old_cmake_required_flags})
set(CMAKE_REQUIRED_LIBRARIES ${old_cmake_required_libraries})
#---------------------------------------------------
# Windows Intel MPI compatibility, see GH issue #435
#---------------------------------------------------
set(old_cmake_required_includes "${CMAKE_REQUIRED_INCLUDES}")
if(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${MPI_C_INCLUDE_PATH})
else()
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH})
endif()
CHECK_INCLUDE_FILES("mpi.h" HAVE_MPI_H)
include(CheckSymbolExists)
CHECK_SYMBOL_EXISTS(I_MPI_VERSION "mpi.h" HAVE_Intel_MPI)
if(HAVE_Intel_MPI AND WIN32)
add_definitions(-DUSE_GCC)
endif()
set(CMAKE_REQUIRED_INCLUDES ${old_cmake_required_includes})
set(PSBLAS_SO_VERSION 0)
if(gfortran_compiler)
if(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7.0.0)
set(PSBLAS_SO_VERSION 2)
elseif(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 6.0.0)
set(PSBLAS_SO_VERSION 1)
endif()
endif()
set(PSBLAS_MODDIR "${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}")
set(MOD_DIR_FLAG "${CMAKE_Fortran_MODDIR_FLAG}")
set(MPI_LIBS "")
foreach( lib IN LISTS MPI_Fortran_LIBRARIES)
set(MPI_LIBS "${MPI_LIBS} \"${lib}\"")
endforeach()
string(STRIP "${MPI_LIBS}" MPI_LIBS)
set(base_source_files
internals/psi_desc_impl.f90 internals/psi_desc_impl.f90
internals/psi_crea_bnd_elem.f90 internals/psi_crea_bnd_elem.f90
internals/psi_bld_tmphalo.f90 internals/psi_bld_tmphalo.f90
@ -131,223 +44,223 @@ tools/psb_zfree.f90
tools/psb_zins.f90 tools/psb_zins.f90
tools/psb_cd_switch_ovl_indxmap.f90 tools/psb_cd_switch_ovl_indxmap.f90
tools/psb_sasb.f90 tools/psb_sasb.f90
./internals/psi_desc_impl.f90 internals/psi_desc_impl.f90
./internals/psi_crea_bnd_elem.f90 internals/psi_crea_bnd_elem.f90
./internals/psi_bld_tmphalo.f90 internals/psi_bld_tmphalo.f90
./internals/psi_list_search.f90 internals/psi_list_search.f90
./internals/psi_crea_ovr_elem.f90 internals/psi_crea_ovr_elem.f90
./internals/psi_compute_size.f90 internals/psi_compute_size.f90
./internals/psi_dl_check.f90 internals/psi_dl_check.f90
./internals/psi_exist_ovr_elem.f90 internals/psi_exist_ovr_elem.f90
./internals/psi_srtlist.f90 internals/psi_srtlist.f90
./internals/psi_bld_tmpovrl.f90 internals/psi_bld_tmpovrl.f90
./internals/psi_crea_index.f90 internals/psi_crea_index.f90
./internals/psi_sort_dl.f90 internals/psi_sort_dl.f90
./tools/psb_iallc.f90 tools/psb_iallc.f90
./tools/psb_c_map.f90 tools/psb_c_map.f90
./tools/psb_dspalloc.f90 tools/psb_dspalloc.f90
./tools/psb_cspasb.f90 tools/psb_cspasb.f90
./tools/psb_dins.f90 tools/psb_dins.f90
./tools/psb_iasb.f90 tools/psb_iasb.f90
./tools/psb_sspfree.f90 tools/psb_sspfree.f90
./tools/psb_cd_lstext.f90 tools/psb_cd_lstext.f90
./tools/psb_dsprn.f90 tools/psb_dsprn.f90
./tools/psb_cins.f90 tools/psb_cins.f90
./tools/psb_csprn.f90 tools/psb_csprn.f90
./tools/psb_ifree.f90 tools/psb_ifree.f90
./tools/psb_sspasb.f90 tools/psb_sspasb.f90
./tools/psb_z_map.f90 tools/psb_z_map.f90
./tools/psb_zspins.f90 tools/psb_zspins.f90
./tools/psb_sins.f90 tools/psb_sins.f90
./tools/psb_cdins.f90 tools/psb_cdins.f90
./tools/psb_cspfree.f90 tools/psb_cspfree.f90
./tools/psb_cdalv.f90 tools/psb_cdalv.f90
./tools/psb_zallc.f90 tools/psb_zallc.f90
./tools/psb_cspins.f90 tools/psb_cspins.f90
./tools/psb_dallc.f90 tools/psb_dallc.f90
./tools/psb_cdrep.f90 tools/psb_cdrep.f90
./tools/psb_dspfree.f90 tools/psb_dspfree.f90
./tools/psb_zspfree.f90 tools/psb_zspfree.f90
./tools/psb_get_overlap.f90 tools/psb_get_overlap.f90
./tools/psb_cdals.f90 tools/psb_cdals.f90
./tools/psb_dfree.f90 tools/psb_dfree.f90
./tools/psb_dasb.f90 tools/psb_dasb.f90
./tools/psb_zfree.f90 tools/psb_zfree.f90
./tools/psb_zins.f90 tools/psb_zins.f90
./tools/psb_cd_switch_ovl_indxmap.f90 tools/psb_cd_switch_ovl_indxmap.f90
./tools/psb_sasb.f90 tools/psb_sasb.f90
./tools/psb_callc.f90 tools/psb_callc.f90
./tools/psb_cd_reinit.f90 tools/psb_cd_reinit.f90
./tools/psb_cd_set_bld.f90 tools/psb_cd_set_bld.f90
./tools/psb_s_map.f90 tools/psb_s_map.f90
./tools/psb_cdprt.f90 tools/psb_cdprt.f90
./tools/psb_glob_to_loc.f90 tools/psb_glob_to_loc.f90
./tools/psb_zasb.f90 tools/psb_zasb.f90
./tools/psb_zspalloc.f90 tools/psb_zspalloc.f90
./tools/psb_cspalloc.f90 tools/psb_cspalloc.f90
./tools/psb_iins.f90 tools/psb_iins.f90
./tools/psb_d_map.f90 tools/psb_d_map.f90
./tools/psb_cdren.f90 tools/psb_cdren.f90
./tools/psb_casb.f90 tools/psb_casb.f90
./tools/psb_zsprn.f90 tools/psb_zsprn.f90
./tools/psb_sspins.f90 tools/psb_sspins.f90
./tools/psb_zspasb.f90 tools/psb_zspasb.f90
./tools/psb_loc_to_glob.f90 tools/psb_loc_to_glob.f90
./tools/psb_dspasb.f90 tools/psb_dspasb.f90
./tools/psb_cdall.f90 tools/psb_cdall.f90
./tools/psb_sallc.f90 tools/psb_sallc.f90
./tools/psb_ssprn.f90 tools/psb_ssprn.f90
./tools/psb_dspins.f90 tools/psb_dspins.f90
./tools/psb_sspalloc.f90 tools/psb_sspalloc.f90
./tools/psb_cd_inloc.f90 tools/psb_cd_inloc.f90
./tools/psb_sfree.f90 tools/psb_sfree.f90
./tools/psb_cfree.f90 tools/psb_cfree.f90
./modules/psi_c_mod.f90 modules/psi_c_mod.f90
./modules/psi_mod.f90 modules/psi_mod.f90
./modules/auxil/psb_string_mod.f90 modules/auxil/psb_string_mod.f90
./modules/auxil/psb_sort_mod.f90 modules/auxil/psb_sort_mod.f90
./modules/auxil/psb_s_sort_mod.f90 modules/auxil/psb_s_sort_mod.f90
./modules/auxil/psi_d_serial_mod.f90 modules/auxil/psi_d_serial_mod.f90
./modules/auxil/psi_serial_mod.f90 modules/auxil/psi_serial_mod.f90
./modules/auxil/psb_i_sort_mod.f90 modules/auxil/psb_i_sort_mod.f90
./modules/auxil/psi_z_serial_mod.f90 modules/auxil/psi_z_serial_mod.f90
./modules/auxil/psi_i_serial_mod.f90 modules/auxil/psi_i_serial_mod.f90
./modules/auxil/psb_ip_reord_mod.f90 modules/auxil/psb_ip_reord_mod.f90
./modules/auxil/psb_c_sort_mod.f90 modules/auxil/psb_c_sort_mod.f90
./modules/auxil/psb_hash_mod.f90 modules/auxil/psb_hash_mod.f90
./modules/auxil/psb_d_sort_mod.f90 modules/auxil/psb_d_sort_mod.f90
./modules/auxil/psi_s_serial_mod.f90 modules/auxil/psi_s_serial_mod.f90
./modules/auxil/psi_c_serial_mod.f90 modules/auxil/psi_c_serial_mod.f90
./modules/auxil/psb_z_sort_mod.f90 modules/auxil/psb_z_sort_mod.f90
./modules/psb_base_mod.f90 modules/psb_base_mod.f90
./modules/psi_z_mod.f90 modules/psi_z_mod.f90
./modules/desc/psb_indx_map_mod.f90 modules/desc/psb_indx_map_mod.f90
./modules/desc/psb_repl_map_mod.f90 modules/desc/psb_repl_map_mod.f90
./modules/desc/psb_desc_const_mod.f90 modules/desc/psb_desc_const_mod.f90
./modules/desc/psb_gen_block_map_mod.f90 modules/desc/psb_gen_block_map_mod.f90
./modules/desc/psb_hash_map_mod.f90 modules/desc/psb_hash_map_mod.f90
./modules/desc/psb_glist_map_mod.f90 modules/desc/psb_glist_map_mod.f90
./modules/desc/psb_list_map_mod.f90 modules/desc/psb_list_map_mod.f90
./modules/psi_d_mod.f90 modules/psi_d_mod.f90
./modules/tools/psb_i_tools_mod.f90 modules/tools/psb_i_tools_mod.f90
./modules/tools/psb_d_tools_mod.f90 modules/tools/psb_d_tools_mod.f90
./modules/tools/psb_s_tools_mod.f90 modules/tools/psb_s_tools_mod.f90
./modules/tools/psb_tools_mod.f90 modules/tools/psb_tools_mod.f90
./modules/tools/psb_cd_tools_mod.f90 modules/tools/psb_cd_tools_mod.f90
./modules/tools/psb_z_tools_mod.f90 modules/tools/psb_z_tools_mod.f90
./modules/tools/psb_c_tools_mod.f90 modules/tools/psb_c_tools_mod.f90
./modules/psi_s_mod.f90 modules/psi_s_mod.f90
./modules/comm/psb_d_linmap_mod.f90 modules/comm/psb_d_linmap_mod.f90
./modules/comm/psb_s_linmap_mod.f90 modules/comm/psb_s_linmap_mod.f90
./modules/comm/psb_base_linmap_mod.f90 modules/comm/psb_base_linmap_mod.f90
./modules/comm/psb_i_comm_mod.f90 modules/comm/psb_i_comm_mod.f90
./modules/comm/psb_c_linmap_mod.f90 modules/comm/psb_c_linmap_mod.f90
./modules/comm/psb_c_comm_mod.f90 modules/comm/psb_c_comm_mod.f90
./modules/comm/psb_z_comm_mod.f90 modules/comm/psb_z_comm_mod.f90
./modules/comm/psb_z_linmap_mod.f90 modules/comm/psb_z_linmap_mod.f90
./modules/comm/psb_s_comm_mod.f90 modules/comm/psb_s_comm_mod.f90
./modules/comm/psb_d_comm_mod.f90 modules/comm/psb_d_comm_mod.f90
./modules/comm/psb_comm_mod.f90 modules/comm/psb_comm_mod.f90
./modules/comm/psb_linmap_mod.f90 modules/comm/psb_linmap_mod.f90
./modules/psblas/psb_psblas_mod.f90 modules/psblas/psb_psblas_mod.f90
./modules/psi_i_mod.f90 modules/psi_i_mod.f90
./modules/serial/psb_s_csr_mat_mod.f90 modules/serial/psb_s_csr_mat_mod.f90
./modules/serial/psb_z_mat_mod.f90 modules/serial/psb_z_mat_mod.f90
./modules/serial/psb_s_base_mat_mod.f90 modules/serial/psb_s_base_mat_mod.f90
./modules/serial/psb_s_base_vect_mod.f90 modules/serial/psb_s_base_vect_mod.f90
./modules/serial/psb_z_csc_mat_mod.f90 modules/serial/psb_z_csc_mat_mod.f90
./modules/serial/psb_d_csr_mat_mod.f90 modules/serial/psb_d_csr_mat_mod.f90
./modules/serial/psb_s_csc_mat_mod.f90 modules/serial/psb_s_csc_mat_mod.f90
./modules/serial/psb_i_base_vect_mod.f90 modules/serial/psb_i_base_vect_mod.f90
./modules/serial/psb_z_base_vect_mod.f90 modules/serial/psb_z_base_vect_mod.f90
./modules/serial/psb_c_csr_mat_mod.f90 modules/serial/psb_c_csr_mat_mod.f90
./modules/serial/psb_c_serial_mod.f90 modules/serial/psb_c_serial_mod.f90
./modules/serial/psb_c_base_vect_mod.f90 modules/serial/psb_c_base_vect_mod.f90
./modules/serial/psb_s_serial_mod.f90 modules/serial/psb_s_serial_mod.f90
./modules/serial/psb_d_csc_mat_mod.f90 modules/serial/psb_d_csc_mat_mod.f90
./modules/serial/psb_vect_mod.f90 modules/serial/psb_vect_mod.f90
./modules/serial/psb_base_mat_mod.f90 modules/serial/psb_base_mat_mod.f90
./modules/serial/psb_c_csc_mat_mod.f90 modules/serial/psb_c_csc_mat_mod.f90
./modules/serial/psb_z_base_mat_mod.f90 modules/serial/psb_z_base_mat_mod.f90
./modules/serial/psb_z_csr_mat_mod.f90 modules/serial/psb_z_csr_mat_mod.f90
./modules/serial/psb_c_mat_mod.f90 modules/serial/psb_c_mat_mod.f90
./modules/serial/psb_d_base_mat_mod.f90 modules/serial/psb_d_base_mat_mod.f90
./modules/serial/psb_d_serial_mod.f90 modules/serial/psb_d_serial_mod.f90
./modules/serial/psb_c_base_mat_mod.f90 modules/serial/psb_c_base_mat_mod.f90
./modules/serial/psb_d_base_vect_mod.f90 modules/serial/psb_d_base_vect_mod.f90
./modules/serial/psb_serial_mod.f90 modules/serial/psb_serial_mod.f90
./modules/serial/psb_s_mat_mod.f90 modules/serial/psb_s_mat_mod.f90
./modules/serial/psb_z_serial_mod.f90 modules/serial/psb_z_serial_mod.f90
./modules/serial/psb_d_mat_mod.f90 modules/serial/psb_d_mat_mod.f90
./modules/serial/psb_mat_mod.f90 modules/serial/psb_mat_mod.f90
./modules/error.f90 modules/error.f90
./modules/psb_check_mod.f90 modules/psb_check_mod.f90
./comm/psb_shalo.f90 comm/psb_shalo.f90
./comm/psb_dhalo.f90 comm/psb_dhalo.f90
./comm/psb_igather.f90 comm/psb_igather.f90
./comm/internals/psi_iovrl_restr.f90 comm/internals/psi_iovrl_restr.f90
./comm/internals/psi_covrl_upd.f90 comm/internals/psi_covrl_upd.f90
./comm/internals/psi_covrl_save.f90 comm/internals/psi_covrl_save.f90
./comm/internals/psi_sovrl_upd.f90 comm/internals/psi_sovrl_upd.f90
./comm/internals/psi_dovrl_restr.f90 comm/internals/psi_dovrl_restr.f90
./comm/internals/psi_zovrl_restr.f90 comm/internals/psi_zovrl_restr.f90
./comm/internals/psi_dovrl_save.f90 comm/internals/psi_dovrl_save.f90
./comm/internals/psi_zovrl_save.f90 comm/internals/psi_zovrl_save.f90
./comm/internals/psi_sovrl_restr.f90 comm/internals/psi_sovrl_restr.f90
./comm/internals/psi_zovrl_upd.f90 comm/internals/psi_zovrl_upd.f90
./comm/internals/psi_sovrl_save.f90 comm/internals/psi_sovrl_save.f90
./comm/internals/psi_iovrl_upd.f90 comm/internals/psi_iovrl_upd.f90
./comm/internals/psi_covrl_restr.f90 comm/internals/psi_covrl_restr.f90
./comm/internals/psi_iovrl_save.f90 comm/internals/psi_iovrl_save.f90
./comm/internals/psi_dovrl_upd.f90 comm/internals/psi_dovrl_upd.f90
./comm/psb_iovrl.f90 comm/psb_iovrl.f90
./comm/psb_cgather.f90 comm/psb_cgather.f90
./comm/psb_covrl.f90 comm/psb_covrl.f90
./comm/psb_zovrl.f90 comm/psb_zovrl.f90
./comm/psb_ihalo.f90 comm/psb_ihalo.f90
./comm/psb_dgather.f90 comm/psb_dgather.f90
./comm/psb_sovrl.f90 comm/psb_sovrl.f90
./comm/psb_dovrl.f90 comm/psb_dovrl.f90
./comm/psb_zgather.f90 comm/psb_zgather.f90
./comm/psb_zhalo.f90 comm/psb_zhalo.f90
./comm/psb_sgather.f90 comm/psb_sgather.f90
./comm/psb_chalo.f90 comm/psb_chalo.f90
./psblas/psb_snrmi.f90 psblas/psb_snrmi.f90
./psblas/psb_dspmm.f90 psblas/psb_dspmm.f90
./psblas/psb_samax.f90 psblas/psb_samax.f90
./psblas/psb_dspnrm1.f90 psblas/psb_dspnrm1.f90
./psblas/psb_sspnrm1.f90 psblas/psb_sspnrm1.f90
./psblas/psb_sspmm.f90 psblas/psb_sspmm.f90
./psblas/psb_dnrmi.f90 psblas/psb_dnrmi.f90
./psblas/psb_zamax.f90 psblas/psb_zamax.f90
./psblas/psb_cspmm.f90 psblas/psb_cspmm.f90
./psblas/psb_dspsm.f90 psblas/psb_dspsm.f90
./psblas/psb_casum.f90 psblas/psb_casum.f90
./psblas/psb_cnrmi.f90 psblas/psb_cnrmi.f90
./psblas/psb_znrm2.f90 psblas/psb_znrm2.f90
./psblas/psb_zspsm.f90 psblas/psb_zspsm.f90
./psblas/psb_camax.f90 psblas/psb_camax.f90
./psblas/psb_dnrm2.f90 psblas/psb_dnrm2.f90
./psblas/psb_znrmi.f90 psblas/psb_znrmi.f90
./psblas/psb_cspsm.f90 psblas/psb_cspsm.f90
./psblas/psb_sdot.f90 psblas/psb_sdot.f90
./psblas/psb_dasum.f90 psblas/psb_dasum.f90
./psblas/psb_zasum.f90 psblas/psb_zasum.f90
./psblas/psb_damax.f90 psblas/psb_damax.f90
./psblas/psb_zspmm.f90 psblas/psb_zspmm.f90
./psblas/psb_cnrm2.f90 psblas/psb_cnrm2.f90
./psblas/psb_ddot.f90 psblas/psb_ddot.f90
./psblas/psb_caxpby.f90 psblas/psb_caxpby.f90
./psblas/psb_cdot.f90 psblas/psb_cdot.f90
./psblas/psb_snrm2.f90 psblas/psb_snrm2.f90
./psblas/psb_sspsm.f90 psblas/psb_sspsm.f90
./psblas/psb_daxpby.f90 psblas/psb_daxpby.f90
./psblas/psb_zdot.f90 psblas/psb_zdot.f90
./psblas/psb_zaxpby.f90 psblas/psb_zaxpby.f90
./psblas/psb_zspnrm1.f90 psblas/psb_zspnrm1.f90
./psblas/psb_sasum.f90 psblas/psb_sasum.f90
./psblas/psb_saxpby.f90 psblas/psb_saxpby.f90
./psblas/psb_cspnrm1.f90 psblas/psb_cspnrm1.f90
serial/impl/psb_c_coo_impl.f90 serial/impl/psb_c_coo_impl.f90
serial/smmp.f90 serial/smmp.f90
serial/psb_srwextd.f90 serial/psb_srwextd.f90
@ -445,25 +358,9 @@ serial/impl/psb_z_base_mat_impl.F90
modules/cutil.c modules/cutil.c
) )
if (SERIAL_MPI) if (SERIAL_MPI)
set(base_source_files ${base_source_files} modules/fakempi.c) set(PSB_base_source_files ${PSB_base_source_files} modules/fakempi.c)
endif() endif()
add_library(base ${base_source_files}) foreach(file IN LISTS PSB_base_source_files)
list(APPEND base_source_files ${CMAKE_CURRENT_LIST_DIR}/${file})
set_target_properties(base endforeach()
PROPERTIES
Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}"
POSITION_INDEPENDENT_CODE TRUE
SOVERSION ${PSBLAS_SO_VERSION}
OUTPUT_NAME psb_base
)
target_link_libraries(base PRIVATE ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES})
install(DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
FILES_MATCHING PATTERN "*.mod")
install(TARGETS base
EXPORT ${CMAKE_PROJECT_NAME}-targets
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)

@ -0,0 +1,21 @@
#--------------------------
# Prohibit in-source builds
#--------------------------
if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
message(FATAL_ERROR "ERROR! "
"CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
" == CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"\nThis archive does not support in-source builds:\n"
"You must now delete the CMakeCache.txt file and the CMakeFiles/ directory under "
"the 'src' source directory or you will not be able to configure correctly!"
"\nYou must now run something like:\n"
" $ rm -r CMakeCache.txt CMakeFiles/"
"\n"
"Please create a directory outside the ${CMAKE_PROJECT_NAME} source tree and build under that outside directory "
"in a manner such as\n"
" $ mkdir build\n"
" $ cd build\n"
" $ CC=gcc FC=gfortran cmake -DBUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/path/to/install/dir /path/to/psblas3/src/dir \n"
"\nsubstituting the appropriate syntax for your shell (the above line assumes the bash shell)."
)
endif()

@ -1,152 +1,48 @@
if (NOT MPI_C_FOUND) set(PSB_krylov_source_files
find_package(MPI REQUIRED) psb_base_krylov_conv_mod.f90
psb_cbicg.f90
set(CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS}) psb_ccg.F90
set(CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS}) psb_ccgs.f90
set(CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}) psb_ccgstab.f90
set(CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}) psb_ccgstabl.f90
include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH}) psb_cfcg.F90
endif() psb_cgcr.f90
psb_c_krylov_conv_mod.f90
if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "GNU") psb_ckrylov.f90
set(gfortran_compiler true) psb_crgmres.f90
endif() psb_dbicg.f90
psb_dcg.F90
include(CheckIncludeFile) psb_dcgs.f90
CHECK_INCLUDE_FILE("alloca.h" HAVE_ALLOCA) psb_dcgstab.f90
if(NOT HAVE_ALLOCA) psb_dcgstabl.f90
add_definitions(-DALLOCA_MISSING) psb_dfcg.F90
message(WARNING "Could not find <alloca.h>. Assuming functionality is provided elsewhere.") psb_dgcr.f90
endif() psb_d_krylov_conv_mod.f90
psb_dkrylov.f90
set(old_cmake_required_includes "${CMAKE_REQUIRED_INCLUDES}") psb_drgmres.f90
if(CMAKE_REQUIRED_INCLUDES) psb_krylov_conv_mod.f90
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${MPI_C_INCLUDE_PATH}) psb_krylov_mod.f90
else() psb_sbicg.f90
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH}) psb_scg.F90
endif() psb_scgs.f90
set(old_cmake_required_flags "${CMAKE_REQUIRED_FLAGS}") psb_scgstab.f90
if(CMAKE_REQUIRED_FLAGS) psb_scgstabl.f90
set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS};${MPI_C_COMPILE_FLAGS};${MPI_C_LINK_FLAGS}) psb_sfcg.F90
else() psb_sgcr.f90
set(CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_FLAGS};${MPI_C_LINK_FLAGS}) psb_s_krylov_conv_mod.f90
endif() psb_skrylov.f90
set(old_cmake_required_libraries "${CMAKE_REQUIRED_LIBRARIES}") psb_srgmres.f90
if(CMAKE_REQUIRED_LIBRARIES) psb_zbicg.f90
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES};${MPI_C_LIBRARIES}) psb_zcg.F90
else() psb_zcgs.f90
set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES}) psb_zcgstab.f90
endif() psb_zcgstabl.f90
psb_zfcg.F90
set(MPI_HEADERS mpi.h) psb_zgcr.f90
include(CheckIncludeFiles) psb_z_krylov_conv_mod.f90
CHECK_INCLUDE_FILES("mpi.h;mpi-ext.h" HAVE_MPI_EXT) psb_zkrylov.f90
if(HAVE_MPI_EXT) psb_zrgmres.f90
add_definitions(-DHAVE_MPI_EXT_H) )
set(MPI_HEADERS ${MPI_HEADERS};mpi-ext.h) foreach(file IN LISTS PSB_krylov_source_files)
endif() list(APPEND krylov_source_files ${CMAKE_CURRENT_LIST_DIR}/${file})
set(CMAKE_REQUIRED_INCLUDES ${old_cmake_required_includes})
set(CMAKE_REQUIRED_FLAGS ${old_cmake_required_flags})
set(CMAKE_REQUIRED_LIBRARIES ${old_cmake_required_libraries})
#---------------------------------------------------
# Windows Intel MPI compatibility, see GH issue #435
#---------------------------------------------------
set(old_cmake_required_includes "${CMAKE_REQUIRED_INCLUDES}")
if(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${MPI_C_INCLUDE_PATH})
else()
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH})
endif()
CHECK_INCLUDE_FILES("mpi.h" HAVE_MPI_H)
include(CheckSymbolExists)
CHECK_SYMBOL_EXISTS(I_MPI_VERSION "mpi.h" HAVE_Intel_MPI)
if(HAVE_Intel_MPI AND WIN32)
add_definitions(-DUSE_GCC)
endif()
set(CMAKE_REQUIRED_INCLUDES ${old_cmake_required_includes})
set(PSBLAS_SO_VERSION 0)
if(gfortran_compiler)
if(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7.0.0)
set(PSBLAS_SO_VERSION 2)
elseif(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 6.0.0)
set(PSBLAS_SO_VERSION 1)
endif()
endif()
set(PSBLAS_MODDIR "${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}")
set(MOD_DIR_FLAG "${CMAKE_Fortran_MODDIR_FLAG}")
set(MPI_LIBS "")
foreach( lib IN LISTS MPI_Fortran_LIBRARIES)
set(MPI_LIBS "${MPI_LIBS} \"${lib}\"")
endforeach() endforeach()
string(STRIP "${MPI_LIBS}" MPI_LIBS)
set(krylov_source_files
psb_base_krylov_conv_mod.f90
psb_cbicg.f90
psb_ccg.F90
psb_ccgs.f90
psb_ccgstab.f90
psb_ccgstabl.f90
psb_cfcg.F90
psb_cgcr.f90
psb_c_krylov_conv_mod.f90
psb_ckrylov.f90
psb_crgmres.f90
psb_dbicg.f90
psb_dcg.F90
psb_dcgs.f90
psb_dcgstab.f90
psb_dcgstabl.f90
psb_dfcg.F90
psb_dgcr.f90
psb_d_krylov_conv_mod.f90
psb_dkrylov.f90
psb_drgmres.f90
psb_krylov_conv_mod.f90
psb_krylov_mod.f90
psb_sbicg.f90
psb_scg.F90
psb_scgs.f90
psb_scgstab.f90
psb_scgstabl.f90
psb_sfcg.F90
psb_sgcr.f90
psb_s_krylov_conv_mod.f90
psb_skrylov.f90
psb_srgmres.f90
psb_zbicg.f90
psb_zcg.F90
psb_zcgs.f90
psb_zcgstab.f90
psb_zcgstabl.f90
psb_zfcg.F90
psb_zgcr.f90
psb_z_krylov_conv_mod.f90
psb_zkrylov.f90
psb_zrgmres.f90
)
add_library(krylov ${krylov_source_files})
target_link_libraries(krylov PRIVATE ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES} prec)
install(DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
FILES_MATCHING PATTERN "*.mod")
set_target_properties ( krylov
PROPERTIES
SOVERSION ${PSBLAS_SO_VERSION}
Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}"
POSITION_INDEPENDENT_CODE TRUE
OUTPUT_NAME psb_krylov
)
install(TARGETS krylov EXPORT ${CMAKE_PROJECT_NAME}-targets
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)

@ -1,169 +1,66 @@
if (NOT MPI_C_FOUND)
find_package(MPI REQUIRED)
set(CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS}) set(PSB_prec_source_files
set(CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS}) psb_prec_const_mod.f90
set(CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}) psb_c_prec_mod.f90
set(CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}) psb_c_base_prec_mod.f90
include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH}) psb_d_bjacprec.f90
endif() psb_z_base_prec_mod.f90
psb_d_diagprec.f90
if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "GNU") impl/psb_dprecbld.f90
set(gfortran_compiler true) impl/psb_cprecinit.f90
endif() impl/psb_dprecinit.f90
impl/psb_zilu_fct.f90
include(CheckIncludeFile) impl/psb_silu_fct.f90
CHECK_INCLUDE_FILE("alloca.h" HAVE_ALLOCA) impl/psb_cprecset.f90
if(NOT HAVE_ALLOCA) impl/psb_s_prec_type_impl.f90
add_definitions(-DALLOCA_MISSING) impl/psb_dilu_fct.f90
message(WARNING "Could not find <alloca.h>. Assuming functionality is provided elsewhere.") impl/psb_cprecbld.f90
endif() impl/psb_c_diagprec_impl.f90
impl/psb_s_bjacprec_impl.f90
set(old_cmake_required_includes "${CMAKE_REQUIRED_INCLUDES}") impl/psb_z_prec_type_impl.f90
if(CMAKE_REQUIRED_INCLUDES) impl/psb_d_nullprec_impl.f90
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${MPI_C_INCLUDE_PATH}) impl/psb_c_nullprec_impl.f90
else() impl/psb_d_diagprec_impl.f90
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH}) impl/psb_zprecinit.f90
endif() impl/psb_d_prec_type_impl.f90
set(old_cmake_required_flags "${CMAKE_REQUIRED_FLAGS}") impl/psb_c_prec_type_impl.f90
if(CMAKE_REQUIRED_FLAGS) impl/psb_s_nullprec_impl.f90
set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS};${MPI_C_COMPILE_FLAGS};${MPI_C_LINK_FLAGS}) impl/psb_sprecinit.f90
else() impl/psb_z_bjacprec_impl.f90
set(CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_FLAGS};${MPI_C_LINK_FLAGS}) impl/psb_d_bjacprec_impl.f90
endif() impl/psb_z_nullprec_impl.f90
set(old_cmake_required_libraries "${CMAKE_REQUIRED_LIBRARIES}") impl/psb_dprecset.f90
if(CMAKE_REQUIRED_LIBRARIES) impl/psb_c_bjacprec_impl.f90
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES};${MPI_C_LIBRARIES}) impl/psb_zprecset.f90
else() impl/psb_sprecbld.f90
set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES}) impl/psb_cilu_fct.f90
endif() impl/psb_z_diagprec_impl.f90
impl/psb_sprecset.f90
set(MPI_HEADERS mpi.h) impl/psb_zprecbld.f90
include(CheckIncludeFiles) impl/psb_s_diagprec_impl.f90
CHECK_INCLUDE_FILES("mpi.h;mpi-ext.h" HAVE_MPI_EXT) psb_s_base_prec_mod.f90
if(HAVE_MPI_EXT) psb_s_bjacprec.f90
add_definitions(-DHAVE_MPI_EXT_H) psb_c_prec_type.f90
set(MPI_HEADERS ${MPI_HEADERS};mpi-ext.h) psb_s_nullprec.f90
endif() psb_d_nullprec.f90
psb_prec_mod.f90
set(CMAKE_REQUIRED_INCLUDES ${old_cmake_required_includes}) psb_d_prec_type.f90
set(CMAKE_REQUIRED_FLAGS ${old_cmake_required_flags}) psb_z_prec_type.f90
set(CMAKE_REQUIRED_LIBRARIES ${old_cmake_required_libraries}) psb_z_prec_mod.f90
psb_z_nullprec.f90
#--------------------------------------------------- psb_c_diagprec.f90
# Windows Intel MPI compatibility, see GH issue #435 psb_z_bjacprec.f90
#--------------------------------------------------- psb_s_prec_type.f90
set(old_cmake_required_includes "${CMAKE_REQUIRED_INCLUDES}") psb_c_nullprec.f90
if(CMAKE_REQUIRED_INCLUDES) psb_prec_type.f90
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${MPI_C_INCLUDE_PATH}) psb_d_prec_mod.f90
else() psb_s_diagprec.f90
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH}) psb_c_bjacprec.f90
endif() psb_s_prec_mod.f90
CHECK_INCLUDE_FILES("mpi.h" HAVE_MPI_H) psb_z_diagprec.f90
psb_d_base_prec_mod.f90
include(CheckSymbolExists) )
CHECK_SYMBOL_EXISTS(I_MPI_VERSION "mpi.h" HAVE_Intel_MPI)
if(HAVE_Intel_MPI AND WIN32) foreach(file IN LISTS PSB_prec_source_files)
add_definitions(-DUSE_GCC) list(APPEND prec_source_files ${CMAKE_CURRENT_LIST_DIR}/${file})
endif()
set(CMAKE_REQUIRED_INCLUDES ${old_cmake_required_includes})
set(PSBLAS_SO_VERSION 0)
if(gfortran_compiler)
if(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7.0.0)
set(PSBLAS_SO_VERSION 2)
elseif(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 6.0.0)
set(PSBLAS_SO_VERSION 1)
endif()
endif()
set(PSBLAS_MODDIR "${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}")
set(MOD_DIR_FLAG "${CMAKE_Fortran_MODDIR_FLAG}")
set(MPI_LIBS "")
foreach( lib IN LISTS MPI_Fortran_LIBRARIES)
set(MPI_LIBS "${MPI_LIBS} \"${lib}\"")
endforeach() endforeach()
string(STRIP "${MPI_LIBS}" MPI_LIBS)
set(prec_source_files
./psb_prec_const_mod.f90
./psb_c_prec_mod.f90
./psb_c_base_prec_mod.f90
./psb_d_bjacprec.f90
./psb_z_base_prec_mod.f90
./psb_d_diagprec.f90
./impl/psb_dprecbld.f90
./impl/psb_cprecinit.f90
./impl/psb_dprecinit.f90
./impl/psb_zilu_fct.f90
./impl/psb_silu_fct.f90
./impl/psb_cprecset.f90
./impl/psb_s_prec_type_impl.f90
./impl/psb_dilu_fct.f90
./impl/psb_cprecbld.f90
./impl/psb_c_diagprec_impl.f90
./impl/psb_s_bjacprec_impl.f90
./impl/psb_z_prec_type_impl.f90
./impl/psb_d_nullprec_impl.f90
./impl/psb_c_nullprec_impl.f90
./impl/psb_d_diagprec_impl.f90
./impl/psb_zprecinit.f90
./impl/psb_d_prec_type_impl.f90
./impl/psb_c_prec_type_impl.f90
./impl/psb_s_nullprec_impl.f90
./impl/psb_sprecinit.f90
./impl/psb_z_bjacprec_impl.f90
./impl/psb_d_bjacprec_impl.f90
./impl/psb_z_nullprec_impl.f90
./impl/psb_dprecset.f90
./impl/psb_c_bjacprec_impl.f90
./impl/psb_zprecset.f90
./impl/psb_sprecbld.f90
./impl/psb_cilu_fct.f90
./impl/psb_z_diagprec_impl.f90
./impl/psb_sprecset.f90
./impl/psb_zprecbld.f90
./impl/psb_s_diagprec_impl.f90
./psb_s_base_prec_mod.f90
./psb_s_bjacprec.f90
./psb_c_prec_type.f90
./psb_s_nullprec.f90
./psb_d_nullprec.f90
./psb_prec_mod.f90
./psb_d_prec_type.f90
./psb_z_prec_type.f90
./psb_z_prec_mod.f90
./psb_z_nullprec.f90
./psb_c_diagprec.f90
./psb_z_bjacprec.f90
./psb_s_prec_type.f90
./psb_c_nullprec.f90
./psb_prec_type.f90
./psb_d_prec_mod.f90
./psb_s_diagprec.f90
./psb_c_bjacprec.f90
./psb_s_prec_mod.f90
./psb_z_diagprec.f90
./psb_d_base_prec_mod.f90
)
add_library(prec ${prec_source_files})
target_link_libraries(prec PRIVATE ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES} base)
install(DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
FILES_MATCHING PATTERN "*.mod")
set_target_properties ( prec
PROPERTIES
SOVERSION ${PSBLAS_SO_VERSION}
Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}"
POSITION_INDEPENDENT_CODE TRUE
OUTPUT_NAME psb_prec
)
install(TARGETS prec EXPORT ${CMAKE_PROJECT_NAME}-targets
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)

@ -1,140 +1,36 @@
if (NOT MPI_C_FOUND) set(PSB_util_source_files
find_package(MPI REQUIRED) metis_int.c
psb_amd_order.c
set(CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS}) psb_blockpart_mod.f90
set(CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS}) psb_c_hbio_impl.f90
set(CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}) psb_c_mat_dist_impl.f90
set(CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}) psb_c_mat_dist_mod.f90
include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH}) psb_c_mmio_impl.f90
endif() psb_c_renum_impl.F90
psb_d_hbio_impl.f90
if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "GNU") psb_d_mat_dist_impl.f90
set(gfortran_compiler true) psb_d_mat_dist_mod.f90
endif() psb_d_mmio_impl.f90
psb_d_renum_impl.F90
include(CheckIncludeFile) psb_gps_mod.f90
CHECK_INCLUDE_FILE("alloca.h" HAVE_ALLOCA) psb_hbio_mod.f90
if(NOT HAVE_ALLOCA) psb_i_mmio_impl.f90
add_definitions(-DALLOCA_MISSING) psb_mat_dist_mod.f90
message(WARNING "Could not find <alloca.h>. Assuming functionality is provided elsewhere.") psb_metispart_mod.F90
endif() psb_mmio_mod.F90
psb_renum_mod.f90
set(old_cmake_required_includes "${CMAKE_REQUIRED_INCLUDES}") psb_s_hbio_impl.f90
if(CMAKE_REQUIRED_INCLUDES) psb_s_mat_dist_impl.f90
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${MPI_C_INCLUDE_PATH}) psb_s_mat_dist_mod.f90
else() psb_s_mmio_impl.f90
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH}) psb_s_renum_impl.F90
endif() psb_util_mod.f90
set(old_cmake_required_flags "${CMAKE_REQUIRED_FLAGS}") psb_z_hbio_impl.f90
if(CMAKE_REQUIRED_FLAGS) psb_z_mat_dist_impl.f90
set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS};${MPI_C_COMPILE_FLAGS};${MPI_C_LINK_FLAGS}) psb_z_mat_dist_mod.f90
else() psb_z_mmio_impl.f90
set(CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_FLAGS};${MPI_C_LINK_FLAGS}) psb_z_renum_impl.F90
endif() )
set(old_cmake_required_libraries "${CMAKE_REQUIRED_LIBRARIES}") foreach(file IN LISTS PSB_util_source_files)
if(CMAKE_REQUIRED_LIBRARIES) list(APPEND util_source_files ${CMAKE_CURRENT_LIST_DIR}/${file})
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES};${MPI_C_LIBRARIES})
else()
set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES})
endif()
set(MPI_HEADERS mpi.h)
include(CheckIncludeFiles)
CHECK_INCLUDE_FILES("mpi.h;mpi-ext.h" HAVE_MPI_EXT)
if(HAVE_MPI_EXT)
add_definitions(-DHAVE_MPI_EXT_H)
set(MPI_HEADERS ${MPI_HEADERS};mpi-ext.h)
endif()
set(CMAKE_REQUIRED_INCLUDES ${old_cmake_required_includes})
set(CMAKE_REQUIRED_FLAGS ${old_cmake_required_flags})
set(CMAKE_REQUIRED_LIBRARIES ${old_cmake_required_libraries})
#---------------------------------------------------
# Windows Intel MPI compatibility, see GH issue #435
#---------------------------------------------------
set(old_cmake_required_includes "${CMAKE_REQUIRED_INCLUDES}")
if(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${MPI_C_INCLUDE_PATH})
else()
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH})
endif()
CHECK_INCLUDE_FILES("mpi.h" HAVE_MPI_H)
include(CheckSymbolExists)
CHECK_SYMBOL_EXISTS(I_MPI_VERSION "mpi.h" HAVE_Intel_MPI)
if(HAVE_Intel_MPI AND WIN32)
add_definitions(-DUSE_GCC)
endif()
set(CMAKE_REQUIRED_INCLUDES ${old_cmake_required_includes})
set(PSBLAS_SO_VERSION 0)
if(gfortran_compiler)
if(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7.0.0)
set(PSBLAS_SO_VERSION 2)
elseif(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 6.0.0)
set(PSBLAS_SO_VERSION 1)
endif()
endif()
set(PSBLAS_MODDIR "${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}")
set(MOD_DIR_FLAG "${CMAKE_Fortran_MODDIR_FLAG}")
set(MPI_LIBS "")
foreach( lib IN LISTS MPI_Fortran_LIBRARIES)
set(MPI_LIBS "${MPI_LIBS} \"${lib}\"")
endforeach() endforeach()
string(STRIP "${MPI_LIBS}" MPI_LIBS)
set(util_source_files
metis_int.c
psb_amd_order.c
psb_blockpart_mod.f90
psb_c_hbio_impl.f90
psb_c_mat_dist_impl.f90
psb_c_mat_dist_mod.f90
psb_c_mmio_impl.f90
psb_c_renum_impl.F90
psb_d_hbio_impl.f90
psb_d_mat_dist_impl.f90
psb_d_mat_dist_mod.f90
psb_d_mmio_impl.f90
psb_d_renum_impl.F90
psb_gps_mod.f90
psb_hbio_mod.f90
psb_i_mmio_impl.f90
psb_mat_dist_mod.f90
psb_metispart_mod.F90
psb_mmio_mod.F90
psb_renum_mod.f90
psb_s_hbio_impl.f90
psb_s_mat_dist_impl.f90
psb_s_mat_dist_mod.f90
psb_s_mmio_impl.f90
psb_s_renum_impl.F90
psb_util_mod.f90
psb_z_hbio_impl.f90
psb_z_mat_dist_impl.f90
psb_z_mat_dist_mod.f90
psb_z_mmio_impl.f90
psb_z_renum_impl.F90
)
add_library(util ${util_source_files})
target_link_libraries(util PRIVATE ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES} base)
install(DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
FILES_MATCHING PATTERN "*.mod")
set_target_properties ( util
PROPERTIES
SOVERSION ${PSBLAS_SO_VERSION}
Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}"
POSITION_INDEPENDENT_CODE TRUE
OUTPUT_NAME psb_util
)
install(TARGETS util EXPORT ${CMAKE_PROJECT_NAME}-targets
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)

Loading…
Cancel
Save