[Bug] Three issues found when building yade 2023.02a on Archlinux with suitesparse 7.0.1 and PyQt5 5.15.8
When I was building yade 2023.02a. I found 3 issues that are worth noting. I wrote patches for them, but these patches may need modifications for backward compatibity.
QtWebkit
QtWebkit got removed in Qt5.6, cref: https://stackoverflow.com/questions/37876987/cannot-import-qtwebkitwidgets-in-pyqt5
We can get PyQt version by from PyQt5.QtCore import PYQT_VERSION_STR
diff --git a/gui/qt5/__init__.py b/gui/qt5/__init__.py
index dc49af3..55ecef0 100644
--- a/gui/qt5/__init__.py
+++ b/gui/qt5/__init__.py
@@ -15,7 +15,7 @@ from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
-from PyQt5 import QtWebKit, QtWebKitWidgets
+from PyQt5 import QtWebEngineWidgets
from yade.qt.ui_controller import Ui_Controller
@@ -63,7 +63,7 @@ def openUrl(url):
pass
if not reuseLast:
if len(webWindows) < maxWebWindows:
- webWindows.append(QtWebKitWidgets.QWebView())
+ webWindows.append(QtWebEngineWidgets.QWebEngineView())
else:
webWindows = webWindows[1:] + [webWindows[0]]
web = webWindows[-1]
Metis
Since suitesparse 6.0.0, cref: https://github.com/DrTimothyAldenDavis/SuiteSparse/releases/tag/v6.0.0
SuiteSparse/metis-5.1.0: now embedded into CHOLMOD
So we can just replace metis
with cholmod
.
It is OK to ignore this since there is still metis in AUR.
The following patch removes metis
. And the patched source got built successfully and passed all tests.
For backward compatibility, more things need to be done.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5b73173..963681d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -985,16 +985,14 @@ IF(ENABLE_PFVFLOW AND ENABLE_LINSOLV)
ENDIF(DEFINED SUITESPARSEPATH)
FIND_PACKAGE(Cholmod)
FIND_PACKAGE(OpenBlas)
- FIND_PACKAGE(Metis)
- IF(CHOLMOD_FOUND AND OPENBLAS_FOUND AND METIS_FOUND AND CGAL_FOUND)
+ IF(CHOLMOD_FOUND AND OPENBLAS_FOUND AND CGAL_FOUND)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CGAL_DEFINITIONS} -DLINSOLV")
- SET(LINKLIBS "${LINKLIBS};${CHOLMOD_LIBRARIES};${AMD_LIBRARY};${CAMD_LIBRARY};${COLAMD_LIBRARY};${CCOLAMD_LIBRARY};${OPENBLAS_LIBRARY};${METIS_LIBRARY};${SUITESPARSE_LIBRARY};${SUITESPARSECONFIG_LIBRARY}")
- INCLUDE_DIRECTORIES(${METIS_INCLUDE_DIR} ${CHOLMOD_INCLUDE_DIR} ${BLAS_INCLUDE_DIR})
+ SET(LINKLIBS "${LINKLIBS};${CHOLMOD_LIBRARIES};${AMD_LIBRARY};${CAMD_LIBRARY};${COLAMD_LIBRARY};${CCOLAMD_LIBRARY};${OPENBLAS_LIBRARY};${SUITESPARSE_LIBRARY};${SUITESPARSECONFIG_LIBRARY}")
+ INCLUDE_DIRECTORIES(${CHOLMOD_INCLUDE_DIR} ${BLAS_INCLUDE_DIR})
MESSAGE(STATUS "Found Cholmod in " ${CHOLMOD_LIBRARIES})
MESSAGE(STATUS "Found OpenBlas in " ${OPENBLAS_LIBRARY})
- MESSAGE(STATUS "Found Metis in " ${METIS_LIBRARY})
SET(CONFIGURED_FEATS "${CONFIGURED_FEATS} LINSOLV")
IF(CHOLMOD_GPU)
@@ -1015,11 +1013,11 @@ IF(ENABLE_PFVFLOW AND ENABLE_LINSOLV)
SET(DISABLED_FEATS "${DISABLED_FEATS} CHOLMOD_GPU")
ENDIF(CHOLMOD_GPU)
- ELSE(CHOLMOD_FOUND AND OPENBLAS_FOUND AND METIS_FOUND AND CGAL_FOUND)
+ ELSE(CHOLMOD_FOUND AND OPENBLAS_FOUND AND CGAL_FOUND)
MESSAGE(STATUS "Missing dependency for LINSOLV, disabled")
SET(DISABLED_FEATS "${DISABLED_FEATS} LINSOLV")
SET(ENABLE_LINSOLV OFF)
- ENDIF(CHOLMOD_FOUND AND OPENBLAS_FOUND AND METIS_FOUND AND CGAL_FOUND)
+ ENDIF(CHOLMOD_FOUND AND OPENBLAS_FOUND AND CGAL_FOUND)
ELSE(ENABLE_PFVFLOW AND ENABLE_LINSOLV)
SET(DISABLED_FEATS "${DISABLED_FEATS} LINSOLV")
IF(ENABLE_TWOPHASEFLOW)
diff --git a/py/_libVersions.cpp b/py/_libVersions.cpp
index e4bb22f..9bff6ae 100644
--- a/py/_libVersions.cpp
+++ b/py/_libVersions.cpp
@@ -243,21 +243,21 @@ py::list openblasVer() { return {}; }
#if defined(LINSOLV) || defined(FLOW_ENGINE)
// 16. metis
-#include <metis.h>
+#include <cholmod.h>
py::list metisVer()
{
py::list ret;
// https://gcc.gnu.org/onlinedocs/cpp/Elif.html
-#if defined(METIS_VER_MAJOR) && defined(METIS_VER_MINOR) && defined(METIS_VER_SUBMINOR)
- ret.append(py::make_tuple(METIS_VER_MAJOR, METIS_VER_MINOR, METIS_VER_SUBMINOR));
+#if defined(CHOLMOD_MAIN_VERSION) && defined(CHOLMOD_SUB_VERSION) && defined(CHOLMOD_SUBSUB_VERSION)
+ ret.append(py::make_tuple(CHOLMOD_MAIN_VERSION, CHOLMOD_SUB_VERSION, CHOLMOD_SUBSUB_VERSION));
ret.append(
- boost::lexical_cast<std::string>(METIS_VER_MAJOR) + "." + boost::lexical_cast<std::string>(METIS_VER_MINOR) + "."
- + boost::lexical_cast<std::string>(METIS_VER_SUBMINOR));
-#elif defined(MTMETIS_VER_MAJOR) && defined(MTMETIS_VER_MINOR) && defined(MTMETIS_VER_SUBMINOR)
- ret.append(py::make_tuple(MTMETIS_VER_MAJOR, MTMETIS_VER_MINOR, MTMETIS_VER_SUBMINOR));
+ boost::lexical_cast<std::string>(CHOLMOD_MAIN_VERSION) + "." + boost::lexical_cast<std::string>(CHOLMOD_SUB_VERSION) + "."
+ + boost::lexical_cast<std::string>(CHOLMOD_SUBSUB_VERSION));
+#elif defined(MTCHOLMOD_MAIN_VERSION) && defined(MTCHOLMOD_SUB_VERSION) && defined(MTCHOLMOD_SUBSUB_VERSION)
+ ret.append(py::make_tuple(MTCHOLMOD_MAIN_VERSION, MTCHOLMOD_SUB_VERSION, MTCHOLMOD_SUBSUB_VERSION));
ret.append(
- "mt:" + boost::lexical_cast<std::string>(MTMETIS_VER_MAJOR) + "." + boost::lexical_cast<std::string>(MTMETIS_VER_MINOR) + "."
- + boost::lexical_cast<std::string>(MTMETIS_VER_SUBMINOR));
+ "mt:" + boost::lexical_cast<std::string>(MTCHOLMOD_MAIN_VERSION) + "." + boost::lexical_cast<std::string>(MTCHOLMOD_SUB_VERSION) + "."
+ + boost::lexical_cast<std::string>(MTCHOLMOD_SUBSUB_VERSION));
#elif defined(PARMETIS_MAJOR_VERSION) && defined(PARMETIS_MINOR_VERSION) && defined(PARMETIS_SUBMINOR_VERSION)
ret.append(py::make_tuple(PARMETIS_MAJOR_VERSION, PARMETIS_MINOR_VERSION, PARMETIS_SUBMINOR_VERSION));
ret.append(
archlinux-current
docker image
The I'm sorry to say that it is badly outdated. It still uses suitesparse
5.10, but the current version is 7.0.1
My current system environment
Obtained on 2023-02-05
In [1]: printAllVersions()
Yade version : 2023.02a
Yade features : LOGGER COMPLEX_MP VECTORIZE VTK OPENMP GTS QT5 CGAL PFVFLOW PFVFLOW LINSOLV CHOLMOD_GPU MPI TWOPHASEFLOW SPH LS_DEM DEFORM FEMLIKE LIQMIGRATION GL2PS LBMFLOW MASK_ARBITRARY PARTIALSAT PROFILING POTENTIAL_PARTICLES POTENTIAL_BLOCKS
Yade config dir: ~/.config/yade
Yade precision : 53 bits, 15 decimal places, with mpmath, PrecisionDouble
Yade RealHP<…> : (15, 33, 45, 60, 120, 150, 300) decimal digits in C++, (15, 33) decimal digits accessible from python
Libraries used :
library | cmake | C++ |
---|---|---|
boost | 108100 | 1.81.0 |
cgal | 5.5.1 | |
clp | 1.17.7 | 1.17.7 |
cmake | 3.25.2 | |
coinutils | 2.11.6 | 2.11.6 |
compiler | /usr/bin/c++ 12.2.1 | gcc 12.2.1 |
eigen | 3.4.0 | 3.4.0 |
gl | 20220530 | |
ipython | 8.9.0 | |
metis | 4.0.3 | |
mpi | 3.1 | ompi:4.1.4 |
mpi4py | 3.1.4 | |
mpmath | 1.2.1 | |
openblas | OpenBLAS 0.3.21 | |
python | 3.10.9 | 3.10.9 |
qglviewer | 2.7.2 | |
qt | 5.15.8 | |
sphinx | 5.3.0-final-0 | |
sqlite | 3.40.1 | |
suitesparse | 7.0.1 | 7.0.1 |
vtk | 9.1.0 | 9.1.0 |
system environment in docker image
This is copied from https://gitlab.com/yade-dev/trunk/-/jobs/3715326502
Yade version : 2023-02-04.git-9db1607
Yade features : LOGGER USEFUL_ERRORS COMPLEX_MP VTK OPENMP GTS QT5 CGAL PFVFLOW PFVFLOW LINSOLV MPI TWOPHASEFLOW LS_DEM FEMLIKE GL2PS LBMFLOW PARTIALSAT POTENTIAL_PARTICLES POTENTIAL_BLOCKS
Yade config dir: ~/.config/yade-ci
Yade precision : 53 bits, 15 decimal places, with mpmath, PrecisionDouble
Yade RealHP<…> : (15, 33, 45, 60, 120, 150, 300) decimal digits in C++, (15, 33) decimal digits accessible from python
Libraries used :
library | cmake | C++ |
---|---|---|
boost | 107800 | 1.78.0 |
cgal | 4.14.3 | |
clp | 1.17.7 | 1.17.7 |
cmake | 3.22.2 | |
coinutils | 2.11.6 | 2.11.6 |
compiler | /usr/sbin/c++ 11.2.0 | gcc 11.2.0 |
eigen | 3.4.0 | 3.4.0 |
freeglut | 3.0.0 | |
gl | 20190805 | |
glut | 3.2.2 | |
ipython | 8.0.1 | |
metis | 5.1.0 | |
mpi | 3.1 | ompi:4.1.2 |
mpi4py | 3.1.3 | |
mpmath | 1.2.1 | |
openblas | OpenBLAS 0.3.19 | |
python | 3.10.2 | 3.10.2 |
qglviewer | 2.7.2 | |
qt | 5.15.2 | |
sphinx | 4.4.0-final-0 | |
sqlite | 3.37.2 | |
suitesparse | 5.10.1 | 5.10.1 |
vtk | 9.1.0 | 9.1.0 |
Suggested solution
As archlinux is a rolling release, we have to perform a system upgrade before each building. (This is the key difference from other distros.)
An alternative way is to rebuild the docker image, maybe twice a month.
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4c1b7223652e62de7881f3efe21441f23329091d..c55a7727b9ea3ae225d746836cccfee77b685786 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -93,6 +93,7 @@ variables:
<<: *gitlab_runner_retry_definition
stage: build
script:
+ - if grep -q "Arch Linux" /etc/issue; then sudo pacman --noconfirm -Syyu; fi
- cd ./data
- git log --oneline -n 5
- cd ..
And packages from aur are also recommended (but not required) to be rebuilt https://gitlab.com/yade-dev/docker-yade/-/blob/allDistrosTogether/archlinux-current/Dockerfile#L82-88