Skip to content

Modernize the build process to use CMake #27

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
37 changes: 37 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
root = true

[*]
end_of_line = lf
trim_trailing_whitespace = true
charset = utf-8

[Makefile]
indent_style = tab

[*.{c,cpp,h,hpp,f,f90,F,F90}]
indent_style = space
indent_size = 4
insert_final_newline = true

[*.{f,F}]
max_line_length = 72

[*.{f90,f95,f03,F90,F95,F03}]
max_line_length = 132

[*{c,cpp,h,hpp}]
curly_bracket_next_line = true
indent_brace_style = Allman

[CMakeLists.txt]
indent_style = space
indent_size = 4

[*.cmake]
indent_style = space
indent_size = 4

[*.{yaml,yml}]
indent_style = space
indent_size = 2

106 changes: 106 additions & 0 deletions .github/workflows/build-msys2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
name: Build on Windows with MSYS2

on:
push:
branches:
- main
- cmake_integration
paths:
- .github/workflows/*.yml
- '**CMakeLists.txt'
- 'cmake/**'
- 'examples/**'
- 'src/**'
- '!**Makefile'
- '!**md'
pull_request:
paths:
- .github/workflows/*.yml
- '**CMakeLists.txt'
- 'cmake/**'
- 'examples/**'
- 'src/**'
- '!**Makefile'
- '!**md'

permissions:
contents: read

jobs:

test-install-release:
runs-on: ${{ matrix.os.runs-on }}
env:
BUILD_TYPE: Release
FFLAGS: ${{ matrix.fflags }}


strategy:
fail-fast: false
matrix:
fflags:
- "-fimplicit-none "
- "-fimplicit-none -fopenmp"
os:
# - { icon: '⬛', sys: mingw32, runs-on: 'windows-latest' }
- { icon: '🟦', sys: mingw64, runs-on: 'windows-latest', fortran: 'gcc-fortran' }
- { icon: '🟨', sys: ucrt64, runs-on: 'windows-latest', fortran: 'gcc-fortran' }
- { icon: '🟧', sys: clang64, runs-on: 'windows-latest', fortran: 'flang' }
- { icon: '🟩', sys: clangarm64, runs-on: 'windows-11-arm', fortran: 'flang' }
name: 🚧${{ matrix.os.icon }} ${{ matrix.os.sys }}
defaults:
run:
shell: msys2 {0}
steps:

- name: '🧰 Checkout SLICOT'
uses: actions/checkout@v4
with:
fetch-depth: 0
persist-credentials: false

- name: '${{ matrix.os.icon }} Setup MSYS2'
uses: msys2/setup-msys2@v2
with:
msystem: ${{matrix.os.sys}}
update: true
install: >-
git
make
pacboy: >-
${{ matrix.os.fortran }}
toolchain:p
cmake:p
ninja:p
lapack:p

- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: >
cmake -B build -G Ninja
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
-D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install
-D SLICOT_TESTING:BOOL=ON
-D BUILD_SHARED_LIBS:BOOL=${{ matrix.os.fortran == 'flang' && 'OFF' || 'ON' }}
-D CMAKE_EXE_LINKER_FLAGS="-Wl,--stack=2097152"


- name: '🚧 Build'
run: |
cmake --build build --config ${{env.BUILD_TYPE}}

- name: Test with OpenMP
working-directory: ${{github.workspace}}/build
if: ${{ contains( matrix.fflags, 'openmp' ) }}
run: ctest -C ${{env.BUILD_TYPE}} --schedule-random -j1 --output-on-failure --timeout 100

- name: Test
working-directory: ${{github.workspace}}/build
if: ${{ !contains( matrix.fflags, 'openmp' ) }}
run: ctest -C ${{env.BUILD_TYPE}} --schedule-random -j2 --output-on-failure --timeout 100

- name: Install
run: cmake --build build --target install -j2

#
209 changes: 209 additions & 0 deletions .github/workflows/build-unix.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
name: Build on Unix

on:
push:
branches:
- main
- cmake_integration
paths:
- .github/workflows/*.yml
- '**CMakeLists.txt'
- 'cmake/**'
- 'examples/**'
- 'src/**'
- '!**Makefile'
- '!**md'
pull_request:
paths:
- .github/workflows/*.yml
- '**CMakeLists.txt'
- 'cmake/**'
- 'examples/**'
- 'src/**'
- '!**Makefile'
- '!**md'

permissions:
contents: read

#env:
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)

defaults:
run:
shell: bash

jobs:

test-install-release:
# Use GNU compilers

# The CMake configure and build commands are platform agnostic and should work equally
# well on Windows or Mac. You can convert this to a matrix build if you need
# cross-platform coverage.
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
runs-on: ${{ matrix.os }}
timeout-minutes: 5

env:
BUILD_TYPE: Release
FFLAGS: ${{ matrix.fflags }}

strategy:
fail-fast: true
matrix:
os: [ macos-latest, ubuntu-latest ]
fflags: [
"-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -fimplicit-none -frecursive ",
"-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -fimplicit-none -frecursive -fopenmp" ]
# Better flags but not used by now:
# "-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -Werror=conversion -fimplicit-none -frecursive -fcheck=all",
# "-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -Werror=conversion -fimplicit-none -frecursive -fcheck=all -fopenmp" ]

steps:

- name: Checkout SLICOT
uses: actions/[email protected]

- name: Install ninja-build tool
uses: seanmiddleditch/gha-setup-ninja@v6

- name: Install basics (Ubuntu)
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
sudo apt update
sudo apt install -y cmake liblapack-dev libblas-dev
- name: Install basics (MacOS)
if: ${{ matrix.os == 'macos-latest' }}
run: |
brew install lapack

- name: Use GCC-14 on MacOS
if: ${{ matrix.os == 'macos-latest' }}
run: >
cmake -B build -G Ninja
-D CMAKE_C_COMPILER="gcc-14"
-D CMAKE_Fortran_COMPILER="gfortran-14"
-D USE_FLAT_NAMESPACE:BOOL=ON
-D CMAKE_PREFIX_PATH="/opt/homebrew/opt/lapack"
-D BLA_VENDOR=Generic

- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: >
cmake -B build -G Ninja
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
-D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install
-D SLICOT_TESTING:BOOL=ON
-D BUILD_SHARED_LIBS:BOOL=ON

- name: Build
# Execute tests defined by the CMake configuration.
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
run: cmake --build build --config ${{env.BUILD_TYPE}}

- name: Test with OpenMP
working-directory: ${{github.workspace}}/build
if: ${{ contains( matrix.fflags, 'openmp' ) }}
run: ctest -C ${{env.BUILD_TYPE}} --schedule-random -j1 --output-on-failure --timeout 100

- name: Test
working-directory: ${{github.workspace}}/build
if: ${{ !contains( matrix.fflags, 'openmp' ) }}
run: ctest -C ${{env.BUILD_TYPE}} --schedule-random -j2 --output-on-failure --timeout 100

- name: Install
run: cmake --build build --target install -j2

coverage:
runs-on: ubuntu-latest
env:
BUILD_TYPE: Coverage
FFLAGS: "-fopenmp"
steps:

- name: Checkout SLICOT
uses: actions/[email protected]

- name: Install ninja-build tool
uses: seanmiddleditch/gha-setup-ninja@v6

- name: Install basics
run: |
sudo apt update
sudo apt install -y cmake liblapack-dev libblas-dev


- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: >
cmake -B build -G Ninja
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
-D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install
-D SLICOT_BUILD_TESTING:BOOL=ON
-D SLICOT_BUILD_SHARED_LIBS:BOOL=ON

- name: Build
# Execute tests defined by the CMake configuration.
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
run: cmake --build build --config ${{env.BUILD_TYPE}}

- name: Test with OpenMP
working-directory: ${{github.workspace}}/build
run: ctest -C ${{env.BUILD_TYPE}} --schedule-random -j1 --output-on-failure --timeout 100

- name: Generate HTML Report
uses: threeal/[email protected]
with:
html-out: coverage.html

# memory-check:
# runs-on: ubuntu-latest
# env:
# BUILD_TYPE: Debug
#
# steps:
#
# - name: Checkout SLICOT
# uses: actions/[email protected]
#
# - name: Install ninja-build tool
# uses: seanmiddleditch/gha-setup-ninja@v6
#
# - name: Install APT packages
# run: |
# sudo apt update
# sudo apt install -y cmake valgrind gfortran liblapack-dev libblas-dev
#
# - name: Configure CMake
# run: >
# cmake -B build -G Ninja
# -D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
# -D SLICOT_TESTING:BOOL=ON
# -D SLICOT_BUILD_SHARED_LIBS:BOOL=ON
#
# - name: Build
# run: cmake --build build --config ${{env.BUILD_TYPE}}
#
# - name: Test
# working-directory: ${{github.workspace}}/build
# run: |
# ctest -C ${{env.BUILD_TYPE}} --schedule-random -j2 -T memcheck > memcheck.out
# cat memcheck.out
# if tail -n 1 memcheck.out | grep -q "Memory checking results:"; then
# exit 0
# else
# for f in Testing/Temporary/MemoryChecker.*.log; do
# if tail -n 1 $f | grep -q "ERROR SUMMARY: 0 errors"; then
# tail -n 1 $f
# continue
# else
# echo "Memory check failed in $f"
# cat $f
# exit 1
# fi
# done
# exit 0
# fi
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
*.swp
build*/
*.obj
*.o
*.a
*.lib
Loading
Loading