From ee1b2f6d6ed872c10b0b7e9cea280446868dcbd2 Mon Sep 17 00:00:00 2001 From: Izaak Beekman Date: Mon, 17 Dec 2018 15:22:36 -0500 Subject: [PATCH] Clean/refactor CMake build to add upstream changes --- CMakeLists.txt | 510 +++++++++++++--------------- base/CMakeLists.txt | 547 ++++++++++++------------------ cmake/CheckOutOfSourceBuild.cmake | 21 ++ krylov/CMakeLists.txt | 198 +++-------- prec/CMakeLists.txt | 231 ++++--------- util/CMakeLists.txt | 174 ++-------- 6 files changed, 616 insertions(+), 1065 deletions(-) create mode 100644 cmake/CheckOutOfSourceBuild.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a732af97..fa290c28e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 #----------------------------------- -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 @@ -14,7 +20,7 @@ set_property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYP #----------------------------------------------------- # Determine version from .VERSION file or git describe #----------------------------------------------------- -include("${CMAKE_SOURCE_DIR}/cmake/setVersion.cmake") +include(setVersion) set_version( VERSION_VARIABLE PSBLAS_Version GIT_DESCRIBE_VAR full_git_describe @@ -24,7 +30,9 @@ message( STATUS "Building PSBLAS version: ${full_git_describe}" ) #------------------------------------------ # 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 @@ -40,24 +48,7 @@ endif() #-------------------------- # 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() +include(CheckOutOfSourceBuild) #---------------------------------------------------- # Define coverage flags and report untested compilers @@ -76,12 +67,11 @@ else() ) endif() -#------------------------------------- -# Fortran name mangling intro-spection -#------------------------------------- -include("${CMAKE_SOURCE_DIR}/cmake/CapitalizeString.cmake") +#------------------------------------ +# Fortran name mangling introspection +#------------------------------------ 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 fortran global suffix underscore: ${FortranCInterface_GLOBAL__SUFFIX}") if(FortranCInterface_GLOBAL__SUFFIX STREQUAL "") @@ -91,7 +81,7 @@ elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "_") elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "__") add_definitions("-D${fc_case}DoubleUnderscore") 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() #---------------------------------------------- @@ -154,228 +144,142 @@ CHECK_Fortran_SOURCE_COMPILES( if(HAVE_FLUSH_STMT) add_definitions(-DHAVE_FLUSH_STMT) endif() - -#---------------------------------------------------------------------------- -# Find MPI and set some flags so that FC and CC can point to gfortran and gcc -#---------------------------------------------------------------------------- -# If the user passes FC=mpifort etc. check and prefer that location -get_filename_component( FTN_COMPILER_NAME "${CMAKE_Fortran_COMPILER}" - NAME ) -get_filename_component( C_COMPILER_NAME "${CMAKE_C_COMPILER}" - NAME ) -get_filename_component( FTN_COMPILER_DIR "${CMAKE_Fortran_COMPILER}" - REALPATH ) -get_filename_component( C_COMPILER_DIR "${CMAKE_C_COMPILER}" - REALPATH ) - -if (FTN_COMPILER_NAME MATCHES "^[mM][pP][iI]") - set (MPI_Fortran_COMPILER "${CMAKE_Fortran_COMPILER}") +CHECK_Fortran_SOURCE_COMPILES( + " +module conftest_mod + type foo + integer :: i + contains + final :: destroy_foo + end type foo + private destroy_foo +contains + subroutine destroy_foo(a) + type(foo) :: a + ! Just a test + end subroutine destroy_foo +end module conftest_mod +program conftest + use conftest_mod + type(foo) :: foovar +end program" + HAVE_FINAL + SRC_EXT f90 + ) +if(HAVE_FINAL) + add_definitions(-DHAVE_FINAL) endif() -if (C_COMPILER_NAME MATCHES "^[mM][pP][iI]") - set (MPI_C_COMPILER "${CMAKE_C_COMPILER}") +CHECK_Fortran_SOURCE_COMPILES( + " +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() - -find_package( MPI ) - -if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) OR (NOT MPIEXEC)) - find_program (MY_MPI_EXEC NAMES mpirun mpiexec lamexec srun - HINTS "${FTN_COMPILER_DIR}" "${C_COMPILER_DIR}" - PATH_SUFFIXES bin) - set ( MPI_HOME "${MPI_HOME}" "${MY_MPI_EXEC}" "${MY_MPI_EXEC}/.." ) - find_package( MPI REQUIRED ) +CHECK_Fortran_SOURCE_COMPILES( + " +program conftest + type foo + integer :: i + end type foo + type, extends(foo) :: bar + integer j + 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() -list(REMOVE_DUPLICATES MPI_Fortran_INCLUDE_PATH) - -# Test for consistent MPI environment -if (NOT MPIEXEC) - message ( ERROR "CMake failed to find `mpiexec` or similar. If MPI is installed -on your system then please point CMake to the desired MPI runtime -using `cmake-gui` or `ccmake`. Otherwise, we will proceed with a -serial build. If you beleive you are getting this message in error, -please report this at https://github.com/sfilippone/psblas3/issues.") +CHECK_Fortran_SOURCE_COMPILES( + " +program stt + type foo + integer :: i + end type foo + type, extends(foo) :: new_foo + integer :: j + 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() -get_filename_component(MPIEXEC_RELATIVE_LOC "${MPIEXEC}" - PROGRAM) -get_filename_component(MPIEXEC_ABS_LOC "${MPIEXEC_RELATIVE_LOC}" - REALPATH) -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() +#---------------------------------------------------------------------------- +# Find MPI and set some flags so that FC and CC can point to gfortran and gcc +#---------------------------------------------------------------------------- +find_package( MPI ) -#----------------------------------------------- -# Work around an issue present on fedora systems -#----------------------------------------------- -if( (MPI_C_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") ) - message ( WARNING -"The `noexecstack` linker flag was found in the MPI__LINK_FLAGS variable. This is +if(MPI_FOUND) + #----------------------------------------------- + # Work around an issue present on fedora systems + #----------------------------------------------- + if( (MPI_C_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") ) + message ( WARNING + "The `noexecstack` linker flag was found in the MPI__LINK_FLAGS variable. This is known to cause segmentation faults for some Fortran codes. See, e.g., https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71729 or https://github.com/sourceryinstitute/OpenCoarrays/issues/317. `noexecstack` is being replaced with `execstack`" - ) - string(REPLACE "noexecstack" - "execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS}) - string(REPLACE "noexecstack" - "execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS}) - set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING - "MPI C linking flags" FORCE) - set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING - "MPI Fortran linking flags" FORCE) -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 -#include -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() + ) + string(REPLACE "noexecstack" + "execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS}) + string(REPLACE "noexecstack" + "execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS}) + set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING + "MPI C linking flags" FORCE) + set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING + "MPI Fortran linking flags" FORCE) + 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() - message ( WARNING "It appears that MPI was built with a different Fortran compiler. " - "It is possible that this may cause unpredictable behavior. The build will continue " - "using `mpif.h` BUT please report any suspicious behavior to the ${CMAKE_PROJECT_NAME} " - "developers." - ) + add_definitions(-DSERIAL_MPI) + add_definitions(-DMPI_MOD) + set(SERIAL_MPI ON) endif() -#---------------- -# Setup MPI flags -#---------------- -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}) +#------------------------------ +# Find Linear Algebra Libraries +#------------------------------ +find_package(BLAS REQUIRED) +find_package(LAPACK REQUIRED) +add_definitions(-DHAVE_LAPACK) #--------------------------------------------------- # 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_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") +#----------------------------------- +# Turn on testing/ctest capabilities +#----------------------------------- enable_testing() - #------------------------------------------------------------------------------ # 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 #------------------------------------------ @@ -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 # 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 +#--------------------------------- execute_process(COMMAND ${MPIEXEC} --version OUTPUT_VARIABLE mpi_version_out) if (mpi_version_out MATCHES "[Oo]pen[ -][Mm][Pp][Ii]") message( STATUS "OpenMPI detected") set ( openmpi true ) endif () +endif() -include( ProcessorCount ) -ProcessorCount(N_CPU) -function(add_mpi_test name num_mpi_rank test_target) - # Function to add MPI tests. - if(TARGET ${test_target}) - get_target_property(min_test_ranks ${test_target} MIN_RANKS) - elseif(TARGET build_${test_target}) - get_target_property(min_test_ranks build_${test_target} MIN_RANKS) - endif() - if(min_test_ranks) - if(num_mpi_rank LESS min_test_ranks) - message( FATAL_ERROR "Test ${name} requires ${min_test_ranks} but was only given ${num_mpi_ranks}" ) - endif() - endif() - if ( ((N_CPU LESS num_mpi_rank) OR (N_CPU EQUAL 0)) ) - message(STATUS "Test ${name} is oversubscribed: ${num_mpi_rank} CAF ranks requested with ${N_CPU} system processor available.") - if ( openmpi ) - if (min_test_ranks) - set( num_mpi_rank ${min_test_ranks} ) - elseif ( N_CPU LESS 2 ) - set( num_mpi_rank 2 ) - endif() - set (test_parameters --oversubscribe) - message( STATUS "Open-MPI back end detected, passing --oversubscribe for oversubscribed test, ${name}, with ${num_mpi_rank} ranks." ) - endif() - endif() - set(test_parameters -np ${num_mpi_rank} ${test_parameters}) - add_test(NAME ${name} COMMAND "bash" "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/mpirun" ${test_parameters} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test_target}") - set_property(TEST ${name} PROPERTY PASS_REGULAR_EXPRESSION "Test passed.") -endfunction(add_mpi_test) +#--------------------------------------- +# Add the PSBLAS libraries and utilities +#--------------------------------------- + +# Link order, left to right: +# cbind.a, util.a krylov.a prec.a base.a + +include(${CMAKE_CURRENT_LIST_DIR}/base/CMakeLists.txt) +add_library(base ${base_source_files}) +set_target_properties(base + PROPERTIES + Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}" + POSITION_INDEPENDENT_CODE TRUE + OUTPUT_NAME psb_base + LINKER_LANGUAGE Fortran + ) +target_include_directories(base PUBLIC + $ + $) +if(MPI_FOUND) + target_link_libraries(base PUBLIC ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES}) +endif() + + +include(${CMAKE_CURRENT_LIST_DIR}/prec/CMakeLists.txt) +add_library(prec ${prec_source_files}) +set_target_properties(prec + PROPERTIES + Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${mod_dir_tail}" + POSITION_INDEPENDENT_CODE TRUE + OUTPUT_NAME psb_prec + LINKER_LANGUAGE Fortran + ) +target_include_directories(prec PUBLIC + $ + $) +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 + $ + $) +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 + $ + $) +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 @@ -492,17 +450,3 @@ endfunction(add_mpi_test) # Unit tests targeting each function, argument, and branch of code # 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) diff --git a/base/CMakeLists.txt b/base/CMakeLists.txt index cf8b8cad1..b4a38921a 100644 --- a/base/CMakeLists.txt +++ b/base/CMakeLists.txt @@ -1,91 +1,4 @@ -if (NOT MPI_C_FOUND) - 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 . 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 +set(PSB_base_source_files internals/psi_desc_impl.f90 internals/psi_crea_bnd_elem.f90 internals/psi_bld_tmphalo.f90 @@ -131,223 +44,223 @@ tools/psb_zfree.f90 tools/psb_zins.f90 tools/psb_cd_switch_ovl_indxmap.f90 tools/psb_sasb.f90 -./internals/psi_desc_impl.f90 -./internals/psi_crea_bnd_elem.f90 -./internals/psi_bld_tmphalo.f90 -./internals/psi_list_search.f90 -./internals/psi_crea_ovr_elem.f90 -./internals/psi_compute_size.f90 -./internals/psi_dl_check.f90 -./internals/psi_exist_ovr_elem.f90 -./internals/psi_srtlist.f90 -./internals/psi_bld_tmpovrl.f90 -./internals/psi_crea_index.f90 -./internals/psi_sort_dl.f90 -./tools/psb_iallc.f90 -./tools/psb_c_map.f90 -./tools/psb_dspalloc.f90 -./tools/psb_cspasb.f90 -./tools/psb_dins.f90 -./tools/psb_iasb.f90 -./tools/psb_sspfree.f90 -./tools/psb_cd_lstext.f90 -./tools/psb_dsprn.f90 -./tools/psb_cins.f90 -./tools/psb_csprn.f90 -./tools/psb_ifree.f90 -./tools/psb_sspasb.f90 -./tools/psb_z_map.f90 -./tools/psb_zspins.f90 -./tools/psb_sins.f90 -./tools/psb_cdins.f90 -./tools/psb_cspfree.f90 -./tools/psb_cdalv.f90 -./tools/psb_zallc.f90 -./tools/psb_cspins.f90 -./tools/psb_dallc.f90 -./tools/psb_cdrep.f90 -./tools/psb_dspfree.f90 -./tools/psb_zspfree.f90 -./tools/psb_get_overlap.f90 -./tools/psb_cdals.f90 -./tools/psb_dfree.f90 -./tools/psb_dasb.f90 -./tools/psb_zfree.f90 -./tools/psb_zins.f90 -./tools/psb_cd_switch_ovl_indxmap.f90 -./tools/psb_sasb.f90 -./tools/psb_callc.f90 -./tools/psb_cd_reinit.f90 -./tools/psb_cd_set_bld.f90 -./tools/psb_s_map.f90 -./tools/psb_cdprt.f90 -./tools/psb_glob_to_loc.f90 -./tools/psb_zasb.f90 -./tools/psb_zspalloc.f90 -./tools/psb_cspalloc.f90 -./tools/psb_iins.f90 -./tools/psb_d_map.f90 -./tools/psb_cdren.f90 -./tools/psb_casb.f90 -./tools/psb_zsprn.f90 -./tools/psb_sspins.f90 -./tools/psb_zspasb.f90 -./tools/psb_loc_to_glob.f90 -./tools/psb_dspasb.f90 -./tools/psb_cdall.f90 -./tools/psb_sallc.f90 -./tools/psb_ssprn.f90 -./tools/psb_dspins.f90 -./tools/psb_sspalloc.f90 -./tools/psb_cd_inloc.f90 -./tools/psb_sfree.f90 -./tools/psb_cfree.f90 -./modules/psi_c_mod.f90 -./modules/psi_mod.f90 -./modules/auxil/psb_string_mod.f90 -./modules/auxil/psb_sort_mod.f90 -./modules/auxil/psb_s_sort_mod.f90 -./modules/auxil/psi_d_serial_mod.f90 -./modules/auxil/psi_serial_mod.f90 -./modules/auxil/psb_i_sort_mod.f90 -./modules/auxil/psi_z_serial_mod.f90 -./modules/auxil/psi_i_serial_mod.f90 -./modules/auxil/psb_ip_reord_mod.f90 -./modules/auxil/psb_c_sort_mod.f90 -./modules/auxil/psb_hash_mod.f90 -./modules/auxil/psb_d_sort_mod.f90 -./modules/auxil/psi_s_serial_mod.f90 -./modules/auxil/psi_c_serial_mod.f90 -./modules/auxil/psb_z_sort_mod.f90 -./modules/psb_base_mod.f90 -./modules/psi_z_mod.f90 -./modules/desc/psb_indx_map_mod.f90 -./modules/desc/psb_repl_map_mod.f90 -./modules/desc/psb_desc_const_mod.f90 -./modules/desc/psb_gen_block_map_mod.f90 -./modules/desc/psb_hash_map_mod.f90 -./modules/desc/psb_glist_map_mod.f90 -./modules/desc/psb_list_map_mod.f90 -./modules/psi_d_mod.f90 -./modules/tools/psb_i_tools_mod.f90 -./modules/tools/psb_d_tools_mod.f90 -./modules/tools/psb_s_tools_mod.f90 -./modules/tools/psb_tools_mod.f90 -./modules/tools/psb_cd_tools_mod.f90 -./modules/tools/psb_z_tools_mod.f90 -./modules/tools/psb_c_tools_mod.f90 -./modules/psi_s_mod.f90 -./modules/comm/psb_d_linmap_mod.f90 -./modules/comm/psb_s_linmap_mod.f90 -./modules/comm/psb_base_linmap_mod.f90 -./modules/comm/psb_i_comm_mod.f90 -./modules/comm/psb_c_linmap_mod.f90 -./modules/comm/psb_c_comm_mod.f90 -./modules/comm/psb_z_comm_mod.f90 -./modules/comm/psb_z_linmap_mod.f90 -./modules/comm/psb_s_comm_mod.f90 -./modules/comm/psb_d_comm_mod.f90 -./modules/comm/psb_comm_mod.f90 -./modules/comm/psb_linmap_mod.f90 -./modules/psblas/psb_psblas_mod.f90 -./modules/psi_i_mod.f90 -./modules/serial/psb_s_csr_mat_mod.f90 -./modules/serial/psb_z_mat_mod.f90 -./modules/serial/psb_s_base_mat_mod.f90 -./modules/serial/psb_s_base_vect_mod.f90 -./modules/serial/psb_z_csc_mat_mod.f90 -./modules/serial/psb_d_csr_mat_mod.f90 -./modules/serial/psb_s_csc_mat_mod.f90 -./modules/serial/psb_i_base_vect_mod.f90 -./modules/serial/psb_z_base_vect_mod.f90 -./modules/serial/psb_c_csr_mat_mod.f90 -./modules/serial/psb_c_serial_mod.f90 -./modules/serial/psb_c_base_vect_mod.f90 -./modules/serial/psb_s_serial_mod.f90 -./modules/serial/psb_d_csc_mat_mod.f90 -./modules/serial/psb_vect_mod.f90 -./modules/serial/psb_base_mat_mod.f90 -./modules/serial/psb_c_csc_mat_mod.f90 -./modules/serial/psb_z_base_mat_mod.f90 -./modules/serial/psb_z_csr_mat_mod.f90 -./modules/serial/psb_c_mat_mod.f90 -./modules/serial/psb_d_base_mat_mod.f90 -./modules/serial/psb_d_serial_mod.f90 -./modules/serial/psb_c_base_mat_mod.f90 -./modules/serial/psb_d_base_vect_mod.f90 -./modules/serial/psb_serial_mod.f90 -./modules/serial/psb_s_mat_mod.f90 -./modules/serial/psb_z_serial_mod.f90 -./modules/serial/psb_d_mat_mod.f90 -./modules/serial/psb_mat_mod.f90 -./modules/error.f90 -./modules/psb_check_mod.f90 -./comm/psb_shalo.f90 -./comm/psb_dhalo.f90 -./comm/psb_igather.f90 -./comm/internals/psi_iovrl_restr.f90 -./comm/internals/psi_covrl_upd.f90 -./comm/internals/psi_covrl_save.f90 -./comm/internals/psi_sovrl_upd.f90 -./comm/internals/psi_dovrl_restr.f90 -./comm/internals/psi_zovrl_restr.f90 -./comm/internals/psi_dovrl_save.f90 -./comm/internals/psi_zovrl_save.f90 -./comm/internals/psi_sovrl_restr.f90 -./comm/internals/psi_zovrl_upd.f90 -./comm/internals/psi_sovrl_save.f90 -./comm/internals/psi_iovrl_upd.f90 -./comm/internals/psi_covrl_restr.f90 -./comm/internals/psi_iovrl_save.f90 -./comm/internals/psi_dovrl_upd.f90 -./comm/psb_iovrl.f90 -./comm/psb_cgather.f90 -./comm/psb_covrl.f90 -./comm/psb_zovrl.f90 -./comm/psb_ihalo.f90 -./comm/psb_dgather.f90 -./comm/psb_sovrl.f90 -./comm/psb_dovrl.f90 -./comm/psb_zgather.f90 -./comm/psb_zhalo.f90 -./comm/psb_sgather.f90 -./comm/psb_chalo.f90 -./psblas/psb_snrmi.f90 -./psblas/psb_dspmm.f90 -./psblas/psb_samax.f90 -./psblas/psb_dspnrm1.f90 -./psblas/psb_sspnrm1.f90 -./psblas/psb_sspmm.f90 -./psblas/psb_dnrmi.f90 -./psblas/psb_zamax.f90 -./psblas/psb_cspmm.f90 -./psblas/psb_dspsm.f90 -./psblas/psb_casum.f90 -./psblas/psb_cnrmi.f90 -./psblas/psb_znrm2.f90 -./psblas/psb_zspsm.f90 -./psblas/psb_camax.f90 -./psblas/psb_dnrm2.f90 -./psblas/psb_znrmi.f90 -./psblas/psb_cspsm.f90 -./psblas/psb_sdot.f90 -./psblas/psb_dasum.f90 -./psblas/psb_zasum.f90 -./psblas/psb_damax.f90 -./psblas/psb_zspmm.f90 -./psblas/psb_cnrm2.f90 -./psblas/psb_ddot.f90 -./psblas/psb_caxpby.f90 -./psblas/psb_cdot.f90 -./psblas/psb_snrm2.f90 -./psblas/psb_sspsm.f90 -./psblas/psb_daxpby.f90 -./psblas/psb_zdot.f90 -./psblas/psb_zaxpby.f90 -./psblas/psb_zspnrm1.f90 -./psblas/psb_sasum.f90 -./psblas/psb_saxpby.f90 -./psblas/psb_cspnrm1.f90 +internals/psi_desc_impl.f90 +internals/psi_crea_bnd_elem.f90 +internals/psi_bld_tmphalo.f90 +internals/psi_list_search.f90 +internals/psi_crea_ovr_elem.f90 +internals/psi_compute_size.f90 +internals/psi_dl_check.f90 +internals/psi_exist_ovr_elem.f90 +internals/psi_srtlist.f90 +internals/psi_bld_tmpovrl.f90 +internals/psi_crea_index.f90 +internals/psi_sort_dl.f90 +tools/psb_iallc.f90 +tools/psb_c_map.f90 +tools/psb_dspalloc.f90 +tools/psb_cspasb.f90 +tools/psb_dins.f90 +tools/psb_iasb.f90 +tools/psb_sspfree.f90 +tools/psb_cd_lstext.f90 +tools/psb_dsprn.f90 +tools/psb_cins.f90 +tools/psb_csprn.f90 +tools/psb_ifree.f90 +tools/psb_sspasb.f90 +tools/psb_z_map.f90 +tools/psb_zspins.f90 +tools/psb_sins.f90 +tools/psb_cdins.f90 +tools/psb_cspfree.f90 +tools/psb_cdalv.f90 +tools/psb_zallc.f90 +tools/psb_cspins.f90 +tools/psb_dallc.f90 +tools/psb_cdrep.f90 +tools/psb_dspfree.f90 +tools/psb_zspfree.f90 +tools/psb_get_overlap.f90 +tools/psb_cdals.f90 +tools/psb_dfree.f90 +tools/psb_dasb.f90 +tools/psb_zfree.f90 +tools/psb_zins.f90 +tools/psb_cd_switch_ovl_indxmap.f90 +tools/psb_sasb.f90 +tools/psb_callc.f90 +tools/psb_cd_reinit.f90 +tools/psb_cd_set_bld.f90 +tools/psb_s_map.f90 +tools/psb_cdprt.f90 +tools/psb_glob_to_loc.f90 +tools/psb_zasb.f90 +tools/psb_zspalloc.f90 +tools/psb_cspalloc.f90 +tools/psb_iins.f90 +tools/psb_d_map.f90 +tools/psb_cdren.f90 +tools/psb_casb.f90 +tools/psb_zsprn.f90 +tools/psb_sspins.f90 +tools/psb_zspasb.f90 +tools/psb_loc_to_glob.f90 +tools/psb_dspasb.f90 +tools/psb_cdall.f90 +tools/psb_sallc.f90 +tools/psb_ssprn.f90 +tools/psb_dspins.f90 +tools/psb_sspalloc.f90 +tools/psb_cd_inloc.f90 +tools/psb_sfree.f90 +tools/psb_cfree.f90 +modules/psi_c_mod.f90 +modules/psi_mod.f90 +modules/auxil/psb_string_mod.f90 +modules/auxil/psb_sort_mod.f90 +modules/auxil/psb_s_sort_mod.f90 +modules/auxil/psi_d_serial_mod.f90 +modules/auxil/psi_serial_mod.f90 +modules/auxil/psb_i_sort_mod.f90 +modules/auxil/psi_z_serial_mod.f90 +modules/auxil/psi_i_serial_mod.f90 +modules/auxil/psb_ip_reord_mod.f90 +modules/auxil/psb_c_sort_mod.f90 +modules/auxil/psb_hash_mod.f90 +modules/auxil/psb_d_sort_mod.f90 +modules/auxil/psi_s_serial_mod.f90 +modules/auxil/psi_c_serial_mod.f90 +modules/auxil/psb_z_sort_mod.f90 +modules/psb_base_mod.f90 +modules/psi_z_mod.f90 +modules/desc/psb_indx_map_mod.f90 +modules/desc/psb_repl_map_mod.f90 +modules/desc/psb_desc_const_mod.f90 +modules/desc/psb_gen_block_map_mod.f90 +modules/desc/psb_hash_map_mod.f90 +modules/desc/psb_glist_map_mod.f90 +modules/desc/psb_list_map_mod.f90 +modules/psi_d_mod.f90 +modules/tools/psb_i_tools_mod.f90 +modules/tools/psb_d_tools_mod.f90 +modules/tools/psb_s_tools_mod.f90 +modules/tools/psb_tools_mod.f90 +modules/tools/psb_cd_tools_mod.f90 +modules/tools/psb_z_tools_mod.f90 +modules/tools/psb_c_tools_mod.f90 +modules/psi_s_mod.f90 +modules/comm/psb_d_linmap_mod.f90 +modules/comm/psb_s_linmap_mod.f90 +modules/comm/psb_base_linmap_mod.f90 +modules/comm/psb_i_comm_mod.f90 +modules/comm/psb_c_linmap_mod.f90 +modules/comm/psb_c_comm_mod.f90 +modules/comm/psb_z_comm_mod.f90 +modules/comm/psb_z_linmap_mod.f90 +modules/comm/psb_s_comm_mod.f90 +modules/comm/psb_d_comm_mod.f90 +modules/comm/psb_comm_mod.f90 +modules/comm/psb_linmap_mod.f90 +modules/psblas/psb_psblas_mod.f90 +modules/psi_i_mod.f90 +modules/serial/psb_s_csr_mat_mod.f90 +modules/serial/psb_z_mat_mod.f90 +modules/serial/psb_s_base_mat_mod.f90 +modules/serial/psb_s_base_vect_mod.f90 +modules/serial/psb_z_csc_mat_mod.f90 +modules/serial/psb_d_csr_mat_mod.f90 +modules/serial/psb_s_csc_mat_mod.f90 +modules/serial/psb_i_base_vect_mod.f90 +modules/serial/psb_z_base_vect_mod.f90 +modules/serial/psb_c_csr_mat_mod.f90 +modules/serial/psb_c_serial_mod.f90 +modules/serial/psb_c_base_vect_mod.f90 +modules/serial/psb_s_serial_mod.f90 +modules/serial/psb_d_csc_mat_mod.f90 +modules/serial/psb_vect_mod.f90 +modules/serial/psb_base_mat_mod.f90 +modules/serial/psb_c_csc_mat_mod.f90 +modules/serial/psb_z_base_mat_mod.f90 +modules/serial/psb_z_csr_mat_mod.f90 +modules/serial/psb_c_mat_mod.f90 +modules/serial/psb_d_base_mat_mod.f90 +modules/serial/psb_d_serial_mod.f90 +modules/serial/psb_c_base_mat_mod.f90 +modules/serial/psb_d_base_vect_mod.f90 +modules/serial/psb_serial_mod.f90 +modules/serial/psb_s_mat_mod.f90 +modules/serial/psb_z_serial_mod.f90 +modules/serial/psb_d_mat_mod.f90 +modules/serial/psb_mat_mod.f90 +modules/error.f90 +modules/psb_check_mod.f90 +comm/psb_shalo.f90 +comm/psb_dhalo.f90 +comm/psb_igather.f90 +comm/internals/psi_iovrl_restr.f90 +comm/internals/psi_covrl_upd.f90 +comm/internals/psi_covrl_save.f90 +comm/internals/psi_sovrl_upd.f90 +comm/internals/psi_dovrl_restr.f90 +comm/internals/psi_zovrl_restr.f90 +comm/internals/psi_dovrl_save.f90 +comm/internals/psi_zovrl_save.f90 +comm/internals/psi_sovrl_restr.f90 +comm/internals/psi_zovrl_upd.f90 +comm/internals/psi_sovrl_save.f90 +comm/internals/psi_iovrl_upd.f90 +comm/internals/psi_covrl_restr.f90 +comm/internals/psi_iovrl_save.f90 +comm/internals/psi_dovrl_upd.f90 +comm/psb_iovrl.f90 +comm/psb_cgather.f90 +comm/psb_covrl.f90 +comm/psb_zovrl.f90 +comm/psb_ihalo.f90 +comm/psb_dgather.f90 +comm/psb_sovrl.f90 +comm/psb_dovrl.f90 +comm/psb_zgather.f90 +comm/psb_zhalo.f90 +comm/psb_sgather.f90 +comm/psb_chalo.f90 +psblas/psb_snrmi.f90 +psblas/psb_dspmm.f90 +psblas/psb_samax.f90 +psblas/psb_dspnrm1.f90 +psblas/psb_sspnrm1.f90 +psblas/psb_sspmm.f90 +psblas/psb_dnrmi.f90 +psblas/psb_zamax.f90 +psblas/psb_cspmm.f90 +psblas/psb_dspsm.f90 +psblas/psb_casum.f90 +psblas/psb_cnrmi.f90 +psblas/psb_znrm2.f90 +psblas/psb_zspsm.f90 +psblas/psb_camax.f90 +psblas/psb_dnrm2.f90 +psblas/psb_znrmi.f90 +psblas/psb_cspsm.f90 +psblas/psb_sdot.f90 +psblas/psb_dasum.f90 +psblas/psb_zasum.f90 +psblas/psb_damax.f90 +psblas/psb_zspmm.f90 +psblas/psb_cnrm2.f90 +psblas/psb_ddot.f90 +psblas/psb_caxpby.f90 +psblas/psb_cdot.f90 +psblas/psb_snrm2.f90 +psblas/psb_sspsm.f90 +psblas/psb_daxpby.f90 +psblas/psb_zdot.f90 +psblas/psb_zaxpby.f90 +psblas/psb_zspnrm1.f90 +psblas/psb_sasum.f90 +psblas/psb_saxpby.f90 +psblas/psb_cspnrm1.f90 serial/impl/psb_c_coo_impl.f90 serial/smmp.f90 serial/psb_srwextd.f90 @@ -445,25 +358,9 @@ serial/impl/psb_z_base_mat_impl.F90 modules/cutil.c ) 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() -add_library(base ${base_source_files}) - -set_target_properties(base - 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}" -) +foreach(file IN LISTS PSB_base_source_files) + list(APPEND base_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) +endforeach() diff --git a/cmake/CheckOutOfSourceBuild.cmake b/cmake/CheckOutOfSourceBuild.cmake new file mode 100644 index 000000000..ad1769522 --- /dev/null +++ b/cmake/CheckOutOfSourceBuild.cmake @@ -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() diff --git a/krylov/CMakeLists.txt b/krylov/CMakeLists.txt index eed33a90f..9f2fe2d5d 100644 --- a/krylov/CMakeLists.txt +++ b/krylov/CMakeLists.txt @@ -1,152 +1,48 @@ -if (NOT MPI_C_FOUND) - 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 . 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}\"") +set(PSB_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 + ) +foreach(file IN LISTS PSB_krylov_source_files) + list(APPEND krylov_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) 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}" -) diff --git a/prec/CMakeLists.txt b/prec/CMakeLists.txt index b007acf52..1fe2f5aa9 100644 --- a/prec/CMakeLists.txt +++ b/prec/CMakeLists.txt @@ -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(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 . 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}\"") +set(PSB_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 + ) + +foreach(file IN LISTS PSB_prec_source_files) + list(APPEND prec_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) 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}" -) diff --git a/util/CMakeLists.txt b/util/CMakeLists.txt index 747f8dcd2..811f9bba5 100644 --- a/util/CMakeLists.txt +++ b/util/CMakeLists.txt @@ -1,140 +1,36 @@ -if (NOT MPI_C_FOUND) - 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 . 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}\"") +set(PSB_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 + ) +foreach(file IN LISTS PSB_util_source_files) + list(APPEND util_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) 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}" -)