diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..1ffbcdc2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,158 @@ +cmake_minimum_required(VERSION 3.10) +project(amg4psblas VERSION 1.0 LANGUAGES C Fortran) + + +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") + +# Check for the installation path for psblas +if(NOT DEFINED PSBLAS_INSTALL_DIR) + message(FATAL_ERROR "Please specify the path to the psblas installation directory using -DPSBLAS_INSTALL_DIR=") +endif() + +# Set the include and library directories based on the provided path +set(INSTALLDIR "${PSBLAS_INSTALL_DIR}") +set(INCDIR "${INSTALLDIR}/include") +set(MODDIR "${INSTALLDIR}/modules") +set(LIBDIR "${INSTALLDIR}/lib") + + +message(STATUS "PSBLAS DIRECTORY INC ${INCDIR}; MOD ${MODDIR}; LIB ${LIBDIR};") + +# Find the psblas package +find_package(psblas REQUIRED PATHS ${INSTALLDIR}) + +if(NOT psblas_FOUND) + message(FATAL_ERROR "PSBLAS not found!") +else() + message(STATUS "Found PSBLAS: ${psblas_LIBRARIES}") +endif() + +# Include directories for the project +include_directories(${PSBLAS_INSTALL_DIR}) + + +# Include directories for the Fortran compiler +include_directories(${INCDIR} ${MODDIR} ${LIBDIR}) + + + + + + + + + + + + +#TODO: what follow should be taken from psblas. We need to set in PSBLAS CMakeLists.txt the right variable to be used here +#------------------------------------ +# Fortran name mangling introspection +#------------------------------------ +include("${CMAKE_CURRENT_LIST_DIR}/cmake/CapitalizeString.cmake") +include(FortranCInterface) +CapitalizeString(${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 "") + add_compile_options("-D${fc_case}Case") +elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "_") + add_compile_options("-D${fc_case}Underscore") +elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "__") + add_compile_options("-D${fc_case}DoubleUnderscore") +else() + message( FATAL_ERROR "Fortran name mangling suffix, \'${FortranCInterface_GLOBAL__SUFFIX}\', unknown to PSBLAS") +endif() + + + message(STATUS "win? ${WIN32};") +if(TRUE )#NOT ${WIN32}) +#previous check did not work if WIN32 is empty string + #---------------------------------------------- + # Determine system endian-ness and pointer size + #---------------------------------------------- + include(TestBigEndian) + TEST_BIG_ENDIAN(IS_BIG_ENDIAN) + if(IS_BIG_ENDIAN) + message( STATUS "System appears to be big endian.") + else() + message( STATUS "System appears to be little endian.") + add_compile_options(-DLittleEndian) + endif() + include(CheckTypeSize) + CHECK_TYPE_SIZE("void *" VOID_P_SIZE LANGUAGE C) + if(${VOID_P_SIZE} EQUAL 8) + add_compile_options(-DPtr64Bits) + endif() + message(STATUS "Have 64bit pointers") + + #add define values for integer size (IPKx) and long size (LPKx) + CHECK_TYPE_SIZE("int" INT_SIZE LANGUAGE C) + CHECK_TYPE_SIZE("long" LONG_SIZE LANGUAGE C) + message(STATUS "INT SIZE ${INT_SIZE}") + + add_compile_options(-DIPK${INT_SIZE}) + add_compile_options(-DLPK${LONG_SIZE}) + + +endif() + + + + + + + + + + + + + + + +include(${CMAKE_CURRENT_LIST_DIR}/amgprec/CMakeLists.txt) # include amgprec_source_files and amgprec_source_C_files source files + +add_library(amgprec_C OBJECT ${amgprec_source_C_files}) + +target_link_libraries(amgprec_C + #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} + #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} + psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base) #TODO check actual libraries needed + +add_library(amgprec ${amgprec_source_files} $) + +set_target_properties(amgprec + PROPERTIES + Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/modules" + POSITION_INDEPENDENT_CODE TRUE + OUTPUT_NAME psb_amgprec + LINKER_LANGUAGE Fortran + ) + +target_include_directories(amgprec PUBLIC + $ + $) + +message(STATUS "include dir := ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}") + +#target_include_directories(base PUBLIC ${CMAKE_Fortran_MODULE_DIRECTORY}) + +target_include_directories(amgprec PUBLIC ${INCDIR} ${MODDIR}) +target_link_libraries(amgprec + #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} + #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} + psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base) #TODO check actual libraries needed + + + + +# Install the library +install(TARGETS amgprec + DESTINATION lib +) + +# Optionally, you can install the headers +install(DIRECTORY include/ + DESTINATION include +)