Skip to content

Feature/time series dataframe #1567

Feature/time series dataframe

Feature/time series dataframe #1567

Workflow file for this run

name: devbuild
on:
push:
pull_request:
schedule:
- cron: '34 17 * * *'
jobs:
standalone_buffer:
if: ${{ github.event_name != 'schedule' || (github.event_name == 'schedule' && vars.MMGH_NIGHTLY == 'enable') }}
name: standalone_buffer_${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04]
cmake_build_type: [Release]
fail-fast: false
steps:
- uses: actions/checkout@v1
with:
fetch-depth: 1
- name: event name
run: |
echo "github.event_name: ${{ github.event_name }}"
- name: dependency by apt
run: |
sudo apt-get -qqy update
sudo apt-get -qy install \
sudo curl git build-essential make cmake libc6-dev gcc g++ \
python3 python3-dev python3-venv
- name: dependency by pip
run: |
sudo pip3 install setuptools
sudo pip3 install numpy pytest flake8
- name: dependency by manual script
run: sudo ${GITHUB_WORKSPACE}/contrib/dependency/install.sh pybind11
- name: show dependency
# Copy the commands from contrib/dependency/showdep.sh
run: |
echo "gcc path: $(which gcc)"
echo "gcc version: $(gcc --version)"
echo "cmake path: $(which cmake)"
echo "cmake version: $(cmake --version)"
echo "python3 path: $(which python3)"
echo "python3 version: $(python3 --version)"
echo "python3-config --prefix: $(python3-config --prefix)"
echo "python3-config --exec-prefix: $(python3-config --exec-prefix)"
echo "python3-config --includes: $(python3-config --includes)"
echo "python3-config --libs: $(python3-config --libs)"
echo "python3-config --cflags: $(python3-config --cflags)"
echo "python3-config --ldflags: $(python3-config --ldflags)"
echo "pip3 path: $(which pip3)"
python3 -c 'import numpy as np; print("np.__version__:", np.__version__, np.get_include())'
echo "pytest path: $(which pytest)"
echo "pytest version: $(pytest --version)"
echo "clang-tidy path: $(which clang-tidy)"
echo "clang-tidy version: $(clang-tidy -version)"
echo "flake8 path: $(which flake8)"
echo "flake8 version: $(flake8 --version)"
- name: ccache
uses: hendrikmuhs/[email protected]
with:
key: ${{ runner.os }}-standalone-buffer-${{ matrix.cmake_build_type }}
restore-keys: ${{ runner.os }}-standalone-buffer-${{ matrix.cmake_build_type }}
create-symlink: true
- name: make standalone_buffer
run: |
make standalone_buffer_setup
make standalone_buffer
build_ubuntu:
if: ${{ github.event_name != 'schedule' || (github.event_name == 'schedule' && vars.MMGH_NIGHTLY == 'enable') }}
name: build_${{ matrix.os }}_${{ matrix.cmake_build_type }}
runs-on: ${{ matrix.os }}
env:
QT_DEBUG_PLUGINS: 1
QT_QPA_PLATFORM: offscreen
# Fix issue: https://github.com/solvcon/modmesh/issues/366
# Use custom config for jurplel/install-qt-action@v4
AQT_CONFIG: "thirdparty/aqt_settings.ini"
strategy:
matrix:
# ubuntu-20.04 does not have built-in qt6
os: [ubuntu-22.04]
cmake_build_type: [Release]
fail-fast: false
steps:
- uses: actions/checkout@v1
with:
fetch-depth: 1
- name: event name
run: |
echo "github.event_name: ${{ github.event_name }}"
- name: dependency by apt
run: |
sudo apt-get -qqy update
sudo apt-get -qy install \
sudo curl git build-essential make cmake libc6-dev gcc g++ \
python3 python3-dev python3-venv
# Install qt6 only with ubuntu-22.04
# This page explains why we need libgl1-mesa-dev
# https://doc-snapshots.qt.io/qt6-dev/linux.html
#
# In short, OpenGL libraries and headers are required. Without
# installing this package, cmake won't find the correct lib path.
# This has been replaced by the 'install qt' section below to manage
# qt6 versioning independently from the OS.
# if [ "${{ matrix.os }}" == "ubuntu-22.04" ] ; then \
# sudo apt-get -qy install \
# qt6-3d-dev xvfb \
# libgl1-mesa-dev
# fi
- name: install qt
uses: jurplel/install-qt-action@v4
with:
aqtversion: '==3.1.*'
version: '6.6.3'
host: 'linux'
target: 'desktop'
arch: 'gcc_64'
modules: 'qt3d'
setup-python: 'false'
cache: true
- name: dependency by pip
run: |
sudo pip3 install setuptools
sudo pip3 install numpy pytest flake8 jsonschema
sudo pip3 install pyside6==$(qmake6 -query QT_VERSION)
- name: dependency by manual script
run: sudo ${GITHUB_WORKSPACE}/contrib/dependency/install.sh pybind11
- name: show dependency
# Copy the commands from contrib/dependency/showdep.sh
run: |
echo "gcc path: $(which gcc)"
echo "gcc version: $(gcc --version)"
echo "cmake path: $(which cmake)"
echo "cmake version: $(cmake --version)"
echo "python3 path: $(which python3)"
echo "python3 version: $(python3 --version)"
echo "python3-config --prefix: $(python3-config --prefix)"
echo "python3-config --exec-prefix: $(python3-config --exec-prefix)"
echo "python3-config --includes: $(python3-config --includes)"
echo "python3-config --libs: $(python3-config --libs)"
echo "python3-config --cflags: $(python3-config --cflags)"
echo "python3-config --ldflags: $(python3-config --ldflags)"
echo "pip3 path: $(which pip3)"
python3 -c 'import numpy as np; print("np.__version__:", np.__version__, np.get_include())'
echo "pytest path: $(which pytest)"
echo "pytest version: $(pytest --version)"
echo "clang-tidy path: $(which clang-tidy)"
echo "clang-tidy version: $(clang-tidy -version)"
echo "flake8 path: $(which flake8)"
echo "flake8 version: $(flake8 --version)"
- name: ccache
uses: hendrikmuhs/[email protected]
with:
key: ${{ runner.os }}-${{ matrix.cmake_build_type }}
restore-keys: ${{ runner.os }}-${{ matrix.cmake_build_type }}
create-symlink: true
- name: make gtest BUILD_QT=OFF
run: |
make gtest \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=OFF
- name: make buildext BUILD_QT=OFF
run: |
rm -f build/*/Makefile
make cmake \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=OFF \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_PYTEST_HELPER_BINDING=ON"
make buildext VERBOSE=1
- name: make pytest BUILD_QT=OFF
run: |
python3 -c "import modmesh; assert modmesh.HAS_VIEW == False"
make pytest VERBOSE=1
- name: make buildext BUILD_QT=ON USE_PYTEST_HELPER_BINDING=OFF
run: |
rm -f build/*/Makefile
make cmake \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=ON \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3)"
make buildext VERBOSE=1
# build with pytest helper binding for testing
- name: make buildext BUILD_QT=ON USE_PYTEST_HELPER_BINDING=ON
run: |
rm -f build/*/Makefile
make cmake \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=ON \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_PYTEST_HELPER_BINDING=ON"
make buildext VERBOSE=1
- name: make pytest BUILD_QT=ON USE_PYTEST_HELPER_BINDING=ON
run: |
python3 -c "import modmesh; assert modmesh.HAS_VIEW == True"
make pytest VERBOSE=1
- name: make viewer
run: |
rm -f build/*/Makefile
make viewer \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=ON \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_PYTEST_HELPER_BINDING=ON"
- name: make run_viewer_pytest
run: |
export LD_LIBRARY_PATH=$(python3 -c "import sys, os, shiboken6; sys.stdout.write(os.path.dirname(shiboken6.__file__))")
make run_viewer_pytest VERBOSE=0
# FIXME: turn off until all issues resolved
- name: make cmake USE_SANITIZER=ON & make pytest
run: |
export ASAN_OPTIONS=verify_asan_link_order=0
rm -f build/*/Makefile
make cmake \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=OFF \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_SANITIZER=OFF -DUSE_PYTEST_HELPER_BINDING=ON"
make buildext VERBOSE=1
make pytest VERBOSE=1
build_macos:
if: ${{ github.event_name != 'schedule' || (github.event_name == 'schedule' && vars.MMGH_NIGHTLY == 'enable') }}
name: build_${{ matrix.os }}_${{ matrix.cmake_build_type }}
runs-on: ${{ matrix.os }}
env:
QT_DEBUG_PLUGINS: 1
PIP_BREAK_SYSTEM_PACKAGES: 1 # disabling PEP668
# Fix issue: https://github.com/solvcon/modmesh/issues/366
# Use custom config for jurplel/install-qt-action@v4
AQT_CONFIG: "thirdparty/aqt_settings.ini"
strategy:
matrix:
# https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md
# https://github.com/actions/runner-images/blob/main/images/macos/macos-14-Readme.md
os: [macos-13, macos-14]
cmake_build_type: [Release]
fail-fast: false
steps:
- uses: actions/checkout@v1
with:
fetch-depth: 1
- name: event name
run: |
echo "github.event_name: ${{ github.event_name }}"
# Some mac runner does not have /usr/local/include and cmake sometimes crashes
sudo mkdir -p /usr/local/include
- name: dependency by homebrew
run: |
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
# This has been replaced by the 'install qt' section below to manage
# qt6 versioning independently from the OS.
# brew install qt6
- name: install qt
uses: jurplel/install-qt-action@v4
with:
aqtversion: '==3.1.*'
version: '6.6.3'
host: 'mac'
target: 'desktop'
arch: 'clang_64'
modules: 'qt3d'
setup-python: 'false'
cache: true
- name: dependency by pip
run: |
echo "which python3: $(which python3)"
ls -al $(which python3)
# suppress the warning of pip because brew forces PEP668 since python3.12
python3 -m pip -v install --upgrade setuptools
python3 -m pip -v install --upgrade pip
python3 -m pip -v install --upgrade numpy pytest flake8 jsonschema
# For now (2024/10/22), pyside6 6.6.3 does not support Python 3.13.
# Use --ignore-requires-python to force installation.
python3 -m pip -v install --upgrade pyside6==$(qmake -query QT_VERSION) --ignore-requires-python
- name: dependency by manual script
run: |
sudo NO_INSTALL_PREFIX=1 ${GITHUB_WORKSPACE}/contrib/dependency/install.sh pybind11
thirdparty/metal-cpp.sh
- name: show dependency
# Copy the commands from contrib/dependency/showdep.sh
run: |
echo "gcc path: $(which gcc)"
echo "gcc version: $(gcc --version)"
echo "cmake path: $(which cmake)"
echo "cmake version: $(cmake --version)"
echo "python3 path: $(which python3)"
echo "python3 version: $(python3 --version)"
echo "python3-config --prefix: $(python3-config --prefix)"
echo "python3-config --exec-prefix: $(python3-config --exec-prefix)"
echo "python3-config --includes: $(python3-config --includes)"
echo "python3-config --libs: $(python3-config --libs)"
echo "python3-config --cflags: $(python3-config --cflags)"
echo "python3-config --ldflags: $(python3-config --ldflags)"
echo "pip3 path: $(which pip3)"
python3 -c 'import numpy as np; print("np.__version__:", np.__version__, np.get_include())'
echo "pytest path: $(which pytest)"
echo "pytest version: $(pytest --version)"
echo "clang-tidy path: $(which clang-tidy)"
echo "clang-tidy version: $(clang-tidy -version)"
echo "flake8 path: $(which flake8)"
echo "flake8 version: $(flake8 --version)"
- name: ccache
uses: hendrikmuhs/[email protected]
with:
key: ${{ runner.os }}-${{ matrix.cmake_build_type }}
restore-keys: ${{ runner.os }}-${{ matrix.cmake_build_type }}
create-symlink: true
- name: make gtest BUILD_QT=OFF
run: |
make gtest \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=OFF
- name: make buildext BUILD_QT=OFF
run: |
rm -f build/*/Makefile
make cmake \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=OFF \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_PYTEST_HELPER_BINDING=ON"
make buildext VERBOSE=1
- name: make pytest BUILD_QT=OFF
run: |
JOB_MAKE_ARGS="VERBOSE=1"
if [ "${{ matrix.os }}" == "macos-13" ] || [ "${{ matrix.os }}" == "macos-14" ] ; then \
JOB_MAKE_ARGS="${JOB_MAKE_ARGS} BUILD_METAL=ON" ; \
fi
make pytest ${JOB_MAKE_ARGS}
- name: make buildext BUILD_QT=ON USE_PYTEST_HELPER_BINDING=OFF
run: |
rm -f build/*/Makefile
make cmake \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=ON \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3)"
make buildext VERBOSE=1
# build with pytest helper binding for testing
- name: make buildext BUILD_QT=ON USE_PYTEST_HELPER_BINDING=ON
run: |
rm -f build/*/Makefile
make cmake \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=ON \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_PYTEST_HELPER_BINDING=ON"
make buildext VERBOSE=1
- name: make pytest BUILD_QT=ON USE_PYTEST_HELPER_BINDING=ON
run: |
# PySide6 installed by pip will bundle with a prebuilt Qt,
# this will cause duplicated symbol.
# Solve this issue by removed PySide6 prebuilt Qt library
PYSIDE6_PATH=$(python3 -c "import sys, os, PySide6; sys.stdout.write(os.path.dirname(PySide6.__file__))")
echo "pyside6 path: ${PYSIDE6_PATH}"
rm -rf ${PYSIDE6_PATH}/Qt/lib/*.framework
# maunally add homebrew's Qt rpath to PySide6
install_name_tool -add_rpath $(qtpaths --install-prefix)/lib ${PYSIDE6_PATH}/QtWidgets.abi3.so
install_name_tool -add_rpath $(qtpaths --install-prefix)/lib ${PYSIDE6_PATH}/QtGui.abi3.so
install_name_tool -add_rpath $(qtpaths --install-prefix)/lib ${PYSIDE6_PATH}/QtCore.abi3.so
JOB_MAKE_ARGS="VERBOSE=1"
if [ "${{ matrix.os }}" == "macos-13" ] || [ "${{ matrix.os }}" == "macos-14" ] ; then \
JOB_MAKE_ARGS="${JOB_MAKE_ARGS} BUILD_METAL=ON" ; \
fi
make pytest ${JOB_MAKE_ARGS}
- name: make viewer
run: |
rm -f build/*/Makefile
make viewer \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=ON \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_PYTEST_HELPER_BINDING=ON"
- name: make run_viewer_pytest
run: |
make run_viewer_pytest VERBOSE=1
# FIXME: turn off until all issues resolved
- name: make cmake USE_SANITIZER=ON & make pytest
run: |
export ASAN_OPTIONS=verify_asan_link_order=0
rm -f build/*/Makefile
make cmake \
VERBOSE=1 USE_CLANG_TIDY=OFF \
BUILD_QT=OFF \
CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_SANITIZER=OFF -DUSE_PYTEST_HELPER_BINDING=ON"
make buildext VERBOSE=1
make pytest VERBOSE=1
build_windows:
if: ${{ github.event_name != 'schedule' || (github.event_name == 'schedule' && vars.MMGH_NIGHTLY == 'enable') }}
name: build_${{ matrix.os }}_${{ matrix.cmake_build_type }}
runs-on: ${{ matrix.os }}
env:
QT_DEBUG_PLUGINS: 1
# Fix issue: https://github.com/solvcon/modmesh/issues/366
# Use custom config for jurplel/install-qt-action@v4
AQT_CONFIG: "thirdparty/aqt_settings.ini"
strategy:
matrix:
os: [windows-2022]
# Build Debug because there is not a job for windows in lint.yml (which uses the Debug build type)
cmake_build_type: [Release, Debug]
fail-fast: false
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 1
- uses: ilammy/msvc-dev-cmd@v1
- name: event name
run: |
echo "github.event_name: ${{ github.event_name }}"
- name: install qt
uses: jurplel/install-qt-action@v4
with:
aqtversion: '==3.1.*'
version: '6.6.3'
host: 'windows'
target: 'desktop'
arch: 'win64_msvc2019_64'
modules: 'qt3d'
cache: true
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: dependency by pip
run: |
pip3 install -U numpy pytest jsonschema flake8 pybind11 pyside6==$(qmake -query QT_VERSION)
# Add PySide6 and Shiboken6 path into system path, that allow exe file can find
# dll during runtime
# If user needs to modified system path in github actions container
# user should use GITHUB_PATH
# ref: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#adding-a-system-path
# But the way of update GITHUB_PATH in github action document does not work, there is a other way to update it.
# ref: https://stackoverflow.com/questions/60169752/how-to-update-the-path-in-a-github-action-workflow-file-for-a-windows-latest-hos
$pyside6_path = $(python3 -c "import sys, os, PySide6; sys.stdout.write(os.path.dirname(PySide6.__file__))")
$shiboken6_path = $(python3 -c "import sys, os, shiboken6; sys.stdout.write(os.path.dirname(shiboken6.__file__))")
echo "$pyside6_path;$shiboken6_path" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: show dependency
run: |
Get-Command cl
Get-Command cmake
Get-Command python3
Get-Command pip3
python3 -c 'import numpy as np; print("np.__version__:", np.__version__, np.get_include())'
python3 -c "import pybind11 ; print('pybind11.__version__:', pybind11.__version__)"
pybind11-config --cmakedir
Get-Command pytest
Get-Command clang-tidy
Get-Command flake8
- name: cmake ALL_BUILD USE_PYTEST_HELPER_BINDING=OFF
run: |
cmake `
-DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} `
-Dpybind11_DIR="$(pybind11-config --cmakedir)" `
-S${{ github.workspace }} `
-B${{ github.workspace }}/build
cmake --build ${{ github.workspace }}/build `
--config ${{ matrix.cmake_build_type }} `
--target ALL_BUILD
- name: cmake ALL_BUILD USE_PYTEST_HELPER_BINDING=ON
run: |
Remove-Item -Path ${{ github.workspace }}/build -Recurse -Force
cmake `
-DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} `
-Dpybind11_DIR="$(pybind11-config --cmakedir)" `
-DUSE_PYTEST_HELPER_BINDING=ON `
-S${{ github.workspace }} `
-B${{ github.workspace }}/build
cmake --build ${{ github.workspace }}/build `
--config ${{ matrix.cmake_build_type }} `
--target ALL_BUILD
- name: cmake run_gtest
run: |
cmake --build ${{ github.workspace }}/build `
--config ${{ matrix.cmake_build_type }} `
--target run_gtest
- name: cmake run_viewer_pytest
run: |
cmake --build ${{ github.workspace }}/build `
--config ${{ matrix.cmake_build_type }} `
--target run_viewer_pytest
- name: generate portable
if: ${{ matrix.cmake_build_type == 'Release' }}
run: |
# Get the Python version installed and extract the major+minor version components
$py_ver=$(python3 -V | awk '{print $2}')
$py_main_ver=$(echo $py_ver | awk -F. '{print $1$2}')
$destination=".\modmesh-viewer-win64\modmesh-viewer-win64"
$py_exec="$destination\python.exe"
# Create the destination directory
New-Item -ItemType Directory -Path $destination
# Download and extract the Python embeddable package
$pyembed_url="https://www.python.org/ftp/python/$py_ver/python-$py_ver-embed-amd64.zip"
$pyembed_dl="python-$py_ver-embed-amd64.zip"
Invoke-WebRequest -Uri $pyembed_url -OutFile $pyembed_dl
Expand-Archive -Path $pyembed_dl -DestinationPath $destination
# Patch the .pth file to enable 'site' package (required for using pip)
$pth_file="$destination\python$py_main_ver._pth"
(Get-Content $pth_file) -replace '#import site', 'import site' | Set-Content $pth_file
# Download and setup pip installation script
$get_pip_url="https://bootstrap.pypa.io/get-pip.py"
$get_pip_script="$destination\get-pip.py"
Invoke-WebRequest -Uri $get_pip_url -OutFile $get_pip_script
& $py_exec $get_pip_script
# Install necessary packages for the viewer
$qt_ver=$(qmake -query QT_VERSION)
& $py_exec -m pip install numpy matplotlib PySide6==$qt_ver shiboken6-generator==$qt_ver
# Copy pyside6 and shiboken6 DLLs alongside the viewer executable
$pyside6_path=$(& $py_exec -c "import sys, os, PySide6; sys.stdout.write(os.path.dirname(PySide6.__file__))")
$shiboken6_path=$(& $py_exec -c "import sys, os, shiboken6; sys.stdout.write(os.path.dirname(shiboken6.__file__))")
copy "$pyside6_path\pyside6.abi3.dll" $destination
copy "$shiboken6_path\shiboken6.abi3.dll" $destination
# Remove redundant Qt DLLs from PySide6
Remove-Item -Path $pyside6_path\Qt*.dll
# Configure and build the viewer
cmake -Dpybind11_DIR="$(pybind11-config --cmakedir)" -S . -B build
cmake --build build --config Release --target viewer
# Deploy the Qt environment for the viewer executable and copy necessary files
Copy-Item -Path ".\build\cpp\binary\viewer\Release\viewer.exe" -Destination $destination
windeployqt --release "$destination\viewer.exe"
Copy-Item -Path ".\modmesh" -Destination $destination -Recurse
# PUI is necessary
Copy-Item -Path ".\thirdparty" -Destination $destination -Recurse
- name: archive portable artifacts
if: ${{ matrix.cmake_build_type == 'Release' }}
uses: actions/upload-artifact@v4
with:
name: modmesh-viewer-win64
path: modmesh-viewer-win64/