Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 121 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
name: CI
on:
push:
paths:
- '.github/workflows/**'
- 'cmake/**'
- 'example/**'
- 'include/**'
- 'src/**'
- 'subprojects/**'
- 'test/**'
- 'CMakeLists.txt'
- 'config.cmake'
pull_request:
paths:
- '.github/workflows/**'
- 'cmake/**'
- 'example/**'
- 'include/**'
- 'src/**'
- 'subprojects/**'
- 'test/**'
- 'CMakeLists.txt'
- 'config.cmake'

env:
CI: "ON"
HOMEBREW_NO_ANALYTICS: "ON"
HOMEBREW_NO_AUTO_UPDATE: "ON"
HOMEBREW_NO_BOTTLE_SOURCE_FALLBACK: "ON"
HOMEBREW_NO_GITHUB_API: "ON"
HOMEBREW_NO_INSTALL_CLEANUP: "ON"
BUILD_DIR: _build
CMAKE_OPTIONS: >-
-DWITH_UNIT_TESTS=true

jobs:

gfortran-build:

runs-on: ${{ matrix.os }}

env:
FC: gfortran

strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
mpi: [openmpi] # mpich
config: [Debug]
version: [13]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Get the number of available processes
run: |
NPROC=$(nproc)
echo "NPROC=$NPROC" >> $GITHUB_ENV

- name: Install gfortran (Linux)
run: |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install -y gfortran-${{ matrix.version }}
sudo update-alternatives \
--install /usr/bin/gfortran gfortran /usr/bin/gfortran-${{ matrix.version }} 100

- name: Enable MPI build
if: contains(matrix.mpi, 'openmpi') || contains(matrix.mpi, 'mpich')
run: echo "WITH_MPI=true" >> $GITHUB_ENV

- name: Set Compiler
run: |
echo "FC=${FC}" >> ${GITHUB_ENV}

- name: Install LAPACK/BLAS
run: |
sudo apt-get install liblapack-dev libblas-dev

- name: Install OpenMPI
if: contains(matrix.mpi, 'openmpi')
run: |
sudo apt-get update
sudo apt-get install libopenmpi-dev libscalapack-openmpi-dev
echo "CMAKE_OPTIONS=${CMAKE_OPTIONS} -DSCALAPACK_LIBRARY='scalapack-openmpi'" >> $GITHUB_ENV
echo "CMAKE_DEP_OPTIONS=-DSCALAPACK_LIBRARY='scalapack-openmpi'" >> $GITHUB_ENV

# - name: Install MPICH
# if: contains(matrix.mpi, 'mpich')
# run: |
# sudo apt-get update
# sudo apt-get install mpich libscalapack-mpich-dev
# echo "CMAKE_OPTIONS=${CMAKE_OPTIONS}" >> $GITHUB_ENV
# echo "CMAKE_DEP_OPTIONS=-DSCALAPACK_LIBRARY='scalapack-mpich'" >> $GITHUB_ENV

- name: Set extra CMake flags
run: |
echo "CMAKE_OPTIONS=${CMAKE_OPTIONS} -DENABLE_DYNAMIC_LOADING=true" >> $GITHUB_ENV
if [[ "${{ matrix.mpi }}" == "openmpi" || "${{ matrix.mpi }}" == "mpich" ]]; then
echo "CMAKE_OPTIONS=${CMAKE_OPTIONS} -DTEST_MPI_PROCS=${NPROC}" >> $GITHUB_ENV
fi

- name: Configure build
run: >-
cmake -B ${BUILD_DIR} -G Ninja
-DCMAKE_INSTALL_PREFIX=${PWD}/${INSTALL_DIR}
-DCMAKE_BUILD_TYPE=${{ matrix.config }}
${CMAKE_OPTIONS}
-DWITH_MPI=${WITH_MPI}

- name: Build project
run: cmake --build ${BUILD_DIR} -j

- name: Run regression tests
run: |
echo "SCALAPACKFX_TEST_OMP_THREADS=1" >> $GITHUB_ENV
echo "TEST_UUID=$(uuidgen)" >> ${GITHUB_ENV}
ctest -j ${SCALAPACKFX_TEST_OMP_THREADS} --output-on-failure --test-dir ${BUILD_DIR}
239 changes: 185 additions & 54 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,72 +1,203 @@
cmake_minimum_required(VERSION 3.16)
#[=============================================================================[
# Basic project definition #
]=============================================================================]

cmake_minimum_required(VERSION 3.22...3.29)

list(APPEND CMAKE_MESSAGE_CONTEXT scalapackfx)

project(
scalapackfx
VERSION 1.3.0
DESCRIPTION "Modern Fortran Interface for ScaLAPACK"
LANGUAGES Fortran
)

#[=============================================================================[
# Options #
]=============================================================================]

option(
SCALAPACKFX_BUILD_SHARED_LIBS
"scalapackfx: Build as shared library"
OFF
)

option(
SCALAPACKFX_BUILD_EXAMPLES
"scalapackfx: Whether to build the examples"
${PROJECT_IS_TOP_LEVEL}
)
option(
SCALAPACKFX_BUILD_TESTS
"scalapackfx: Whether to build the tests"
${PROJECT_IS_TOP_LEVEL}
)
option(
SCALAPACKFX_INSTALL
"scalapackfx: Install project"
${PROJECT_IS_TOP_LEVEL}
)
set(
SCALAPACKFX_INSTALL_MODULEDIR
"modules"
CACHE STRING
"scalapackfx: Sub-directory for installed Fortran module files (relative to CMAKE_INSTALL_LIBDIR)"
)

option(
SCALAPACKFX_SUBPROJECT_REQUIRE_FIND
"scalapackfx: Require find_package for all subprojects"
OFF
)
option(
SCALAPACKFX_SUBPROJECT_DISABLE_FIND
"scalapackfx: Disable find_package for all subprojects"
OFF
)

set(
SCALAPACKFX_TEST_OMP_THREADS
"1"
CACHE STRING
"Nr. of OpenMP-threads used for testing"
)

set(SCALAPACKFX_TEST_MPI_PROCS
"1"
CACHE STRING
"Nr. of MPI processes used for testing"
)

set(
SCALAPACKFX_MPIEXEC_POSTFLAGS
""
CACHE STRING
"Additional flags for the mpiexec command (to be added after the mpiexec command name)"
)


#[=============================================================================[
# Project configuration #
]=============================================================================]

include(FetchContent)
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules)
include(scalapackfxHelpers)
include(ScalapackFxUtils)

include(${CMAKE_CURRENT_SOURCE_DIR}/config.cmake)
set(BUILD_SHARED_LIBS ${SCALAPACKFX_BUILD_SHARED_LIBS})
scalapackfx_setup_build_type("RelWithDebInfo")

find_package(MPI REQUIRED)

project(ScalapackFx VERSION 1.2.0 LANGUAGES Fortran)
set(
MPI_TEST_RUNNER
${MPIEXEC_PREFLAGS} ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${SCALAPACKFX_TEST_MPI_PROCS}
${MPIEXEC_POSTFLAGS} ${SCALAPACKFX_MPIEXEC_POSTFLAGS}
)

setup_build_type()

#
# Prerequisites
#
find_package(CustomScalapack REQUIRED QUIET)
find_package(CustomLapack REQUIRED)
find_program(FYPP fypp)
if(NOT FYPP)
message(FATAL_ERROR "Preprocessor fypp could not be found")
endif()

#
# Build instructions
#
include(GNUInstallDirs)
include(subprojects/fypp.cmake)

# Extra flags from cmake options and compiler capabilities
scalapackfx_add_fypp_defines(FYPP_FLAGS)

set(FYPP_FLAGS "${FYPP_FLAGS}")

set(FYPP_CONFIG_FLAGS "${FYPP_FLAGS}")
# Make sure, the line-marker option is not set
list(REMOVE_ITEM FYPP_CONFIG_FLAGS "-n")
set(FYPP_BUILD_FLAGS "${FYPP_FLAGS}" "--file-var-root=${CMAKE_SOURCE_DIR}"
"$<IF:$<CONFIG:Debug>,-DDEBUG=1,-DDEBUG=0>")

set(PYTHON_INTERPRETER "python3" CACHE STRING
"Python interpreter to use for preprocessor")

set(fypp_flags ${FYPP_BUILD_FLAGS})
list(APPEND
fypp_flags -I${CMAKE_CURRENT_SOURCE_DIR}/include -DRELEASE="'${VERSION}'"
)

#[=============================================================================[
# Main definition #
]=============================================================================]

add_subdirectory(src)

add_subdirectory(lib)
if(NOT BUILD_EXPORTED_TARGETS_ONLY)
if (SCALAPACKFX_BUILD_EXAMPLES)
add_subdirectory(example)
endif ()
if (SCALAPACKFX_BUILD_TESTS)
include(subprojects/Fortuno.cmake)
enable_testing()
add_subdirectory(test)
endif()
endif ()

#
# Installation
#
add_library(ScalapackFx INTERFACE)
target_link_libraries(ScalapackFx INTERFACE scalapackfx)
install(TARGETS ScalapackFx EXPORT scalapackfx-targets)

install(EXPORT scalapackfx-targets
FILE scalapackfx-targets.cmake
NAMESPACE ScalapackFx::
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/scalapackfx"
EXPORT_LINK_INTERFACE_LIBRARIES)

configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/utils/export/scalapackfx-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/cmake/scalapackfx-config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapackfx)

write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/cmake/scalapackfx-config-version.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion)

install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/scalapackfx-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/cmake/scalapackfx-config-version.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapackfx)

install(
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapackfx)

get_pkgconfig_params(PKGCONFIG_REQUIRES PKGCONFIG_LIBS PKGCONFIG_LIBS_PRIVATE PKGCONFIG_C_FLAGS)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/utils/export/scalapackfx.pc.in
${CMAKE_CURRENT_BINARY_DIR}/scalapackfx.pc @ONLY)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/scalapackfx.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")

#[=============================================================================[
# Install or Export #
]=============================================================================]

if (SCALAPACKFX_INSTALL)

# pkg-config files
configure_file(cmake/scalapackfx.pc.in scalapackfx.pc @ONLY)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/scalapackfx.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
COMPONENT scalapackfx_development
)

# cmake export files
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/scalapackfxConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
configure_package_config_file(
cmake/scalapackfxConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/scalapackfxConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapackfx
)
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/scalapackfxConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/scalapackfxConfig.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapackfx
COMPONENT scalapackfx_development
)

export(
EXPORT scalapackfxTargets
FILE scalapackfxTargets.cmake
NAMESPACE scalapackfx::
)
install(
EXPORT scalapackfxTargets
FILE scalapackfxTargets.cmake
NAMESPACE scalapackfx::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapackfx
COMPONENT scalapackfx_development
)
endif ()

# Make project available for FetchContent
if (NOT PROJECT_IS_TOP_LEVEL)
# Propagate variables
set(scalapackfx_VERSION ${scalapackfx_VERSION} PARENT_SCOPE)
set(scalapackfx_VERSION_MAJOR ${scalapackfx_VERSION_MAJOR} PARENT_SCOPE)
set(scalapackfx_VERSION_MINOR ${scalapackfx_VERSION_MINOR} PARENT_SCOPE)
set(scalapackfx_VERSION_PATCH ${scalapackfx_VERSION_PATCH} PARENT_SCOPE)
set(scalapackfx_VERSION_TWEAK ${scalapackfx_VERSION_TWEAK} PARENT_SCOPE)
endif ()
6 changes: 6 additions & 0 deletions cmake/scalapackfx.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@

Cflags: -I@CMAKE_INSTALL_FULL_LIBDIR@/@SCALAPACKFX_INSTALL_MODULEDIR@
Libs: -L@CMAKE_INSTALL_FULL_LIBDIR@ -lscalapackfx
6 changes: 6 additions & 0 deletions cmake/scalapackfxConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
@PACKAGE_INIT@

include(CMakeFindDependencyMacro)
find_dependency(MPI)

include(${CMAKE_CURRENT_LIST_DIR}/scalapackfxTargets.cmake)
Loading