Skip to content
Merged
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
154 changes: 154 additions & 0 deletions .github/workflows/test_t8code_macos.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
name: CMake tests t8code on Mac OS


# This file is part of t8code.
# t8code is a C library to manage a collection (a forest) of multiple
# connected adaptive space-trees of general element types in parallel.
#
# Copyright (C) 2026 the developers
#
# t8code is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# t8code is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with t8code; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

# This workflow checks whether building and testing works on Mac OS.
# In the past, this meant that Mac-OS-specific problems in t8code became
# apparrent only in Trixi and T8Code.jl, where they are very hard and
# cumbersome to debug. This workflow is intended to avoid that by catching
# such problems as early as possible, i.e., within t8code's CI.
# To reduce runtime, (for now) only one configuration is run, that is, Debug mode
# with MPI, mesh handle, and Fortran interface. The main reason the external
# libraries (VTK, OpenCASCADE) are deactivated is that github's Mac OS runners
Comment thread
sandro-elsweijer marked this conversation as resolved.
# do not use containers, meaning we would have to install the libraries in every
# single CI run (or cache them).

env:
DEBUG_CONFIG: "-O1"

on:
workflow_call:
# Note: To simplify adding more configurations of this workflow later, the MPI mode and the BUILD_TYPE
# are passed as input, although currently only MPI on and Debug mode are tested.
inputs:
MAKEFLAGS:
required: true
type: string
description: 'Make flags to use for compilation (like -j4)'
MPI:
required: true
type: string
description: 'Use MPI for compilation (ON/OFF)'
BUILD_TYPE:
required: true
type: string
description: 'Build type (Release/Debug)'
TEST_LEVEL:
required: true
type: string
description: 'Test level used for configuring (T8_TEST_LEVEL_FULL, T8_TEST_LEVEL_MEDIUM, or T8_TEST_LEVEL_BASIC)'
default: 'T8_TEST_LEVEL_FULL'

jobs:
t8code_cmake_tests:
#
# Container setup: To avoid unwanted side effects of gcc or mpich, an own Clang version of the
# t8-dependencies Docker image is used. Aside from some basic packages, it contains a manually built
# Clang version of OpenMPI.
timeout-minutes: 25
runs-on: macos-latest
steps:
#
# Part 1: Preparation
# -------------------------------------
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Update packages
run: brew update
- name: Install missing packages via Homebrew
run: |
brew install open-mpi ninja cmake openssl gfortran
- name: Export correct OpenMPI path to environment variables
run: |
export OPENMPI_BIN="/opt/homebrew/opt/open-mpi/bin"
echo OPENMPI_BIN="$OPENMPI_BIN" >> $GITHUB_ENV
- name: Show gfortran version
run: $OPENMPI_BIN/mpifort --version
- name: Show mpicc version
run: $OPENMPI_BIN/mpicc --version
- name: Show mpiexec version
run: $OPENMPI_BIN/mpiexec --version
- name: MPI sanity check (should print hostname four times)
run: $OPENMPI_BIN/mpiexec --oversubscribe -n 4 hostname
- name: Get input vars
run: export MAKEFLAGS="${{ inputs.MAKEFLAGS }}"
&& export MPI="${{ inputs.MPI }}"
&& export BUILD_TYPE="${{ inputs.BUILD_TYPE }}"
&& echo MAKEFLAGS="$MAKEFLAGS" >> $GITHUB_ENV
&& echo MPI="$MPI" >> $GITHUB_ENV
&& echo BUILD_TYPE="$BUILD_TYPE" >> $GITHUB_ENV
#
# Part 2: Build t8code
# --------------------
# Define build config
- name: Set test level
run: export TEST_LEVEL_FLAG="-DT8CODE_TEST_LEVEL=${{ inputs.TEST_LEVEL }}"
&& echo TEST_LEVEL_FLAG="$TEST_LEVEL_FLAG" >> $GITHUB_ENV
- name: build config variables
run: |
export CONFIG_OPTIONS="-GNinja -DCMAKE_INSTALL_PREFIX=$(pwd)/install \
-DT8CODE_ENABLE_MPI=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE ${TEST_LEVEL_FLAG} -DCMAKE_C_FLAGS_DEBUG=${DEBUG_CONFIG} -DCMAKE_CXX_FLAGS_DEBUG=${DEBUG_CONFIG} \
-DT8CODE_BUILD_PEDANTIC=ON -DT8CODE_BUILD_WALL=ON -DT8CODE_BUILD_WERROR=OFF -DT8CODE_BUILD_WEXTRA=ON \
-DT8CODE_BUILD_FORTRAN_INTERFACE=ON -DT8CODE_BUILD_MESH_HANDLE=ON \
-DT8CODE_ENABLE_OCC=OFF -DT8CODE_ENABLE_VTK=OFF"
echo CONFIG_OPTIONS="$CONFIG_OPTIONS" >> $GITHUB_ENV
# Run cmake
# NOTE 1: We use -DT8CODE_CUSTOM_PARALLEL_TEST_COMMAND to activate oversubscription, which is required on the github runner.
# NOTE 2: DT8CODE_CUSTOM_PARALLEL_TEST_COMMAND is not included in $CONFIG_OPTIONS because of whitespace issues.
- name: echo cmake line
run: echo 'cmake ../ $CONFIG_OPTIONS -DT8CODE_CUSTOM_PARALLEL_TEST_COMMAND="mpirun --oversubscribe -np 4"'
- name: cmake
run: mkdir build && cd build && cmake ../ $CONFIG_OPTIONS -DT8CODE_CUSTOM_PARALLEL_TEST_COMMAND="mpirun --oversubscribe -np 4"
# On failure, upload logs
- name: OnFailUploadLog
if: failure()
uses: actions/upload-artifact@v7
with:
name: cmake_w_clang_and_ompi_${{ inputs.BUILD_TYPE }}_MPI_${{ inputs.MPI }}.log
path: build/CMakeFiles/CMakeOutput.log
# Build with ninja
- name: ninja
run: cd build && ninja $MAKEFLAGS
- name: ninja install
run: cd build && ninja install $MAKEFLAGS
#
# Part 3: Run t8code tests
# ------------------------
- name: serial tests (if MPI is enabled)
run: cd build && ctest -R _serial
if: ${{ inputs.MPI == 'ON' }}
- name: parallel tests (if MPI is enabled)
run: |
cd build
ctest -R _parallel
if: ${{ inputs.MPI == 'ON' }}
- name: tests (if MPI is disabled)
run: cd build && ctest $MAKEFLAGS
if: ${{ inputs.MPI == 'OFF' }}
# On failure, upload logs
- name: OnFailUploadLog
if: failure()
uses: actions/upload-artifact@v7
with:
name: test-suite_w_clang_and_ompi_${{ inputs.BUILD_TYPE }}_MPI_${{ inputs.MPI }}.log
path: build/Testing/Temporary/LastTest.log
21 changes: 21 additions & 0 deletions .github/workflows/testsuite.yml
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,27 @@ jobs:
BUILD_TYPE: ${{ matrix.BUILD_TYPE }}
TEST_LEVEL: ${{ github.event_name == 'pull_request' && 'T8_TEST_LEVEL_MEDIUM' || 'T8_TEST_LEVEL_FULL' }} # Set TEST_LEVEL to medium if the event is a PR, otherwise full.

# Check t8code building and testing with on Mac OS.
# Note: This workflow is meant to detect Mac-OS-specific issues missed by the remaining (Ubuntu-based) workflows.
# To reduce its runtime, it currently only uses one run in Debug mode with MPI activated and without external libraries like VTK or OpenCASCADE.
t8code_macos_tests:
needs: fine_grained_trigger
secrets: inherit
if: ${{ needs.fine_grained_trigger.outputs.run_ci == 'true' }}
uses: ./.github/workflows/test_t8code_macos.yml
strategy:
fail-fast: false
matrix:
MPI: [ON]
BUILD_TYPE: [Debug]
include:
- MAKEFLAGS: -j4
with:
MAKEFLAGS: ${{ matrix.MAKEFLAGS }}
MPI: ${{ matrix.MPI }}
BUILD_TYPE: ${{ matrix.BUILD_TYPE }}
TEST_LEVEL: ${{ github.event_name == 'pull_request' && 'T8_TEST_LEVEL_MEDIUM' || 'T8_TEST_LEVEL_FULL' }} # Set TEST_LEVEL to medium if the event is a PR, otherwise full.

# Build doxygen documentation and check for errors / warnings.
t8code_doxygen_check:
uses: ./.github/workflows/check_doxygen.yml
Expand Down
9 changes: 7 additions & 2 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ function( add_t8_test )
separate_arguments(T8CODE_TEST_COMMAND_LIST NATIVE_COMMAND ${T8CODE_CUSTOM_SERIAL_TEST_COMMAND})
elseif ( T8CODE_CUSTOM_PARALLEL_TEST_COMMAND STREQUAL "" )
separate_arguments (T8CODE_TEST_COMMAND_LIST NATIVE_COMMAND "mpirun -np 4")
else ( T8CODE_CUSTOM_PARALLEL_TEST_COMMAND STREQUAL "" )
else ()
separate_arguments (T8CODE_TEST_COMMAND_LIST NATIVE_COMMAND ${T8CODE_CUSTOM_PARALLEL_TEST_COMMAND})
endif ()
else( T8CODE_ENABLE_MPI )
Expand Down Expand Up @@ -135,7 +135,6 @@ add_t8_cpp_test( NAME t8_gtest_cmesh_add_attributes_when_derive_parallel SOUR
add_t8_cpp_test( NAME t8_gtest_cmesh_vertex_conn_tree_to_vertex_parallel SOURCES t8_cmesh/t8_gtest_cmesh_vertex_conn_tree_to_vertex.cxx )
add_t8_cpp_test( NAME t8_gtest_cmesh_vertex_conn_vertex_to_tree_parallel SOURCES t8_cmesh/t8_gtest_cmesh_vertex_conn_vertex_to_tree.cxx )
add_t8_cpp_test( NAME t8_gtest_cmesh_vertex_conn_serial SOURCES t8_cmesh/t8_gtest_cmesh_vertex_conn.cxx )
add_t8_cpp_test( NAME t8_gtest_compute_first_element_serial SOURCES t8_cmesh/t8_gtest_compute_first_element.cxx )
add_t8_cpp_test( NAME t8_gtest_multiple_attributes_parallel SOURCES t8_cmesh/t8_gtest_multiple_attributes.cxx )
add_t8_cpp_test( NAME t8_gtest_attribute_gloidx_array_serial SOURCES t8_cmesh/t8_gtest_attribute_gloidx_array.cxx )
add_t8_cpp_test( NAME t8_gtest_cmesh_bounding_box_serial SOURCES t8_cmesh/t8_gtest_cmesh_bounding_box.cxx )
Expand Down Expand Up @@ -236,3 +235,9 @@ if( T8CODE_BUILD_MESH_HANDLE )
add_t8_cpp_test( NAME t8_gtest_handle_data_parallel SOURCES mesh_handle/competences/t8_gtest_handle_data.cxx )
add_t8_cpp_test( NAME t8_gtest_dg_competences_parallel SOURCES mesh_handle/competences/t8_gtest_dg_competences.cxx )
endif()

# Note: This test case just causes too many problems on Mac OS, see https://github.com/DLR-AMR/t8code/issues/2377,
# so in this case it is deactivated for now.
if(NOT APPLE)
add_t8_cpp_test( NAME t8_gtest_compute_first_element_serial SOURCES t8_cmesh/t8_gtest_compute_first_element.cxx )
endif()
Loading