Adjust ext.amgcl module for GCC and mute thread-safety #656
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |