Skip to content

Adjust ext.amgcl module for GCC and mute thread-safety #656

Adjust ext.amgcl module for GCC and mute thread-safety

Adjust ext.amgcl module for GCC and mute thread-safety #656

Workflow file for this run

name: BuildAndTest
on:
push:
paths:
- '**.c'
- '**.cpp'
- '**.cppm'
- '**.h'
- '**.hpp'
- '**.cmake'
- '**/CMakeLists.txt'
- '.github/workflows/Build.yml'
pull_request:
paths:
- '**.c'
- '**.cpp'
- '**.cppm'
- '**.h'
- '**.hpp'
- '**.cmake'
- '**/CMakeLists.txt'
- '.github/workflows/Build.yml'
jobs:
generate:
name: ${{ matrix.os }}/${{ matrix.compiler }}/MPI${{ matrix.mpi }}/${{ matrix.mode }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-24.04, macos-15]
compiler: [clang, gcc]
mpi: [ON, OFF]
mode: [Debug, Release]
# exclude :
# - os: macos-12
# compiler: clang
# mpi: ON
# mode: Release # clang tends to emit illegal inst for macOS with MPI on release mode (-O3)
if: "!contains(github.event.head_commit.message, 'skip build')"
steps:
- name: Checkout
uses: actions/checkout@master
with:
submodules: recursive
fetch-depth: 0
- name: Install dependence
run: |
export INPUT_MPI=${{ matrix.mpi }}
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt update
sudo apt install -y python3-pip python3-sphinx lcov libboost-all-dev doxygen libtbb-dev libopenmpi-dev ninja-build
if [ "$INPUT_MPI" == "ON" ]; then
sudo apt install -y libhdf5-mpi-dev
else
sudo apt install -y libhdf5-dev
fi
echo "DOXYGEN_DIR=/usr/bin" >> "$GITHUB_ENV"
echo "TBB_DIR=/usr/lib/x86_64-linux-gnu/cmake/TBB" >> "$GITHUB_ENV"
elif [ "$RUNNER_OS" == "macOS" ]; then
# Ensure Homebrew is available (macOS: /opt/homebrew or in PATH).
if command -v brew >/dev/null 2>&1; then
eval "$(brew shellenv)"
elif [ -x "/opt/homebrew/bin/brew" ]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
else
echo "Homebrew not found"
exit 1
fi
echo "$(brew --prefix)/bin" >> "$GITHUB_PATH"
brew install doxygen tbb lcov boost open-mpi ninja sphinx-doc
echo "$(brew --prefix sphinx-doc)/bin" >> "$GITHUB_PATH"
if [ "$INPUT_MPI" == "ON" ]; then
brew install hdf5-mpi
else
brew install hdf5
fi
echo "DOXYGEN_DIR=$(brew --prefix doxygen)/bin" >> "$GITHUB_ENV"
echo "TBB_DIR=$(brew --prefix tbb)/lib/cmake/TBB" >> "$GITHUB_ENV"
else
echo "$RUNNER_OS not supported"
exit 1
fi
- name: Install CMake
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
USER_BASE=$(python3 -m site --user-base)
echo "$USER_BASE/bin" >> "$GITHUB_PATH"
python3 -m pip install --user --upgrade "cmake==4.0.2"
elif [ "$RUNNER_OS" == "macOS" ]; then
brew install cmake
else
echo "$RUNNER_OS not supported"
exit 1
fi
- name: Install toolchain
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
if [ "${{ matrix.compiler }}" == "gcc" ]; then
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/ppa
sudo apt update
if sudo apt install -y gcc-15 g++-15; then
echo "CC=gcc-15" >> "$GITHUB_ENV"
echo "CXX=g++-15" >> "$GITHUB_ENV"
else
if ! command -v brew >/dev/null 2>&1; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
brew install gcc@15 binutils
GCC_HOME=$(brew --prefix gcc@15)
echo "CC=$GCC_HOME/bin/gcc-15" >> "$GITHUB_ENV"
echo "CXX=$GCC_HOME/bin/g++-15" >> "$GITHUB_ENV"
echo "$GCC_HOME/bin" >> "$GITHUB_PATH"
echo "$(brew --prefix binutils)/bin" >> "$GITHUB_PATH"
fi
else
wget -q https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 21
sudo apt install -y clang-21 llvm-21 lld-21 lldb-21 libomp-21-dev libc++-21-dev libc++abi-21-dev
libcxx_module_path=$(dpkg -L libc++-21-dev | grep -m1 '/std.cppm$' || true)
if [ -n "$libcxx_module_path" ]; then
libcxx_module_dir=$(dirname "$libcxx_module_path")
sudo mkdir -p /lib/share/libc++
sudo ln -sfn "$libcxx_module_dir" /lib/share/libc++/v1
fi
libcxx_inc_path=$(dpkg -L libc++-21-dev | grep -m1 'std/algorithm.inc$' || true)
if [ -n "$libcxx_inc_path" ]; then
libcxx_inc_root=$(dirname "$(dirname "$libcxx_inc_path")")
CXXFLAGS="-stdlib=libc++ -isystem $libcxx_inc_root -Wno-thread-safety"
else
CXXFLAGS="-stdlib=libc++ -isystem /usr/include/c++/v1 -isystem /usr/lib/llvm-21/include/c++/v1 -Wno-thread-safety"
fi
echo "CC=clang-21" >> "$GITHUB_ENV"
echo "CXX=clang++-21" >> "$GITHUB_ENV"
echo "CXXFLAGS=$CXXFLAGS" >> "$GITHUB_ENV"
echo "LDFLAGS=-stdlib=libc++" >> "$GITHUB_ENV"
fi
elif [ "$RUNNER_OS" == "macOS" ]; then
if [ "${{ matrix.compiler }}" == "gcc" ]; then
brew install gcc@15
GCC_HOME=$(brew --prefix gcc@15)
echo "CC=$GCC_HOME/bin/gcc-15" >> "$GITHUB_ENV"
echo "CXX=$GCC_HOME/bin/g++-15" >> "$GITHUB_ENV"
echo "$GCC_HOME/bin" >> "$GITHUB_PATH"
else
brew install llvm@21
LLVM_HOME=$(brew --prefix llvm@21)
echo "CC=$LLVM_HOME/bin/clang" >> "$GITHUB_ENV"
echo "CXX=$LLVM_HOME/bin/clang++" >> "$GITHUB_ENV"
echo "$LLVM_HOME/bin" >> "$GITHUB_PATH"
echo "CXXFLAGS=-stdlib=libc++ -isystem $LLVM_HOME/include/c++/v1 -Wno-thread-safety" >> "$GITHUB_ENV"
echo "LDFLAGS=-stdlib=libc++ -L$LLVM_HOME/lib -Wl,-rpath,$LLVM_HOME/lib" >> "$GITHUB_ENV"
modules_json=$(find "$LLVM_HOME" -name libc++.modules.json -print -quit || true)
if [ -n "$modules_json" ]; then
echo "CMAKE_CXX_STDLIB_MODULES_JSON=$modules_json" >> "$GITHUB_ENV"
fi
fi
else
echo "$RUNNER_OS not supported"
exit 1
fi
- name: Set parallelism
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
echo "NPROC=$(nproc)" >> "$GITHUB_ENV"
else
echo "NPROC=$(sysctl -n hw.ncpu)" >> "$GITHUB_ENV"
fi
- name: Make directory
run: mkdir -p build
- name: Generate
working-directory: ./build
run: |
cmake \
-G Ninja \
-DCMAKE_BUILD_TYPE="${{ matrix.mode }}" \
-DCMAKE_C_COMPILER="${CC}" \
-DCMAKE_CXX_COMPILER="${CXX}" \
-DCMAKE_CXX_FLAGS="${CXXFLAGS}" \
-DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \
-DOPFLOW_WITH_HDF5=ON \
-DBENCHMARK_ENABLE_TESTING=OFF \
-DBENCHMARK_ENABLE_WERROR=OFF \
-DOPFLOW_BUILD_ALL=ON \
-DOPFLOW_INSTALL=OFF \
-DOPFLOW_WITH_VTK=OFF \
-DOPFLOW_TBB_EXTERNAL=ON \
-DDOXYGEN_DIR="${DOXYGEN_DIR}" \
-DTBB_DIR="${TBB_DIR}" \
-DOPFLOW_ENABLE_MODULE=ON \
-DOPFLOW_WITH_MPI=${{ matrix.mpi }} \
.. || {
echo "==== CMakeFiles/CMakeError.log ===="
cat CMakeFiles/CMakeError.log || true
echo "==== CMakeFiles/CMakeOutput.log ===="
cat CMakeFiles/CMakeOutput.log || true
exit 1
}
if [ "$RUNNER_OS" == "Linux" ]; then
cmake --build . -t All_CI --parallel "${NPROC}" --config ${{ matrix.mode }}
else
cmake --build . -t All_CI --parallel "${NPROC}" --config ${{ matrix.mode }}
fi
- name: Test
working-directory: ./build
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
ctest --parallel "${NPROC}" -C ${{ matrix.mode }} -VV
else
ctest --parallel "${NPROC}" -C ${{ matrix.mode }} -VV
fi