diff --git a/root-32bit-tests.patch b/root-32bit-tests.patch index ae15a5d..ea926b4 100644 --- a/root-32bit-tests.patch +++ b/root-32bit-tests.patch @@ -1,7 +1,7 @@ -From 55446dcd6eabc1fff218f266c11f31697fe99f09 Mon Sep 17 00:00:00 2001 +From 70d941cd6ebbc3726e08ef7f52d0135453f0b840 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Fri, 13 Mar 2020 16:21:55 +0100 -Subject: [PATCH] Run tests on 32 bit +Subject: [PATCH 2/3] Run tests on 32 bit --- test/stressGeometry.cxx | 8 -------- @@ -9,7 +9,7 @@ Subject: [PATCH] Run tests on 32 bit 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/test/stressGeometry.cxx b/test/stressGeometry.cxx -index f8d78f4f54..617b9e1644 100644 +index 5e81f5f2ca..18e41a6f45 100644 --- a/test/stressGeometry.cxx +++ b/test/stressGeometry.cxx @@ -257,14 +257,6 @@ void stressGeometry(const char *exp="*", Bool_t generate_ref=kFALSE, Bool_t vecg @@ -28,26 +28,26 @@ index f8d78f4f54..617b9e1644 100644 TString fname; for (i=0; i -Date: Tue, 2 Dec 2025 05:33:31 +0100 -Subject: [PATCH] Adjust test/stressGraphics.ref - ---- - test/stressGraphics.ref | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/test/stressGraphics.ref b/test/stressGraphics.ref -index 2498ec6d755..4520a5ab113 100644 ---- a/test/stressGraphics.ref -+++ b/test/stressGraphics.ref -@@ -10,11 +10,11 @@ Test# PS1Ref# PS1Err# PDFRef# PDFErr# JPGRef# JPGErr# PNGRef# PN - 9 9253 100 14377 150 19851 2400 12199 900 9283 100 - 10 8863 70 13645 100 24343 1100 23278 1700 8894 70 - 11 12971 100 14750 50 34063 2000 32033 1200 13070 150 -- 12 7674 100 13533 50 83557 3000 38505 4000 7720 150 -- 13 5600 400 13242 300 16881 400 15063 800 5638 400 -+ 12 7674 100 13533 100 83557 3000 38505 4000 7720 150 -+ 13 5600 400 13242 400 16881 400 15063 800 5638 400 - 14 14190539 4000000 12926 100 23076 9500 25987 3000 14190704 4000000 - 15 15690 5000 17179 200 23076 9500 14232 1500 10437 5000 -- 16 28072 400 23520 200 44462 11000 30062 5000 38007 400 -+ 16 28072 400 23520 250 44462 11000 30062 5000 38007 400 - 17 20444 400 21520 150 27511 11000 16867 600 20721 400 - 18 15894 100 19305 200 27187 10300 15925 350 15925 100 - 19 22521 300 42926 250 43868 17000 19232 11000 22729 300 -@@ -44,7 +44,7 @@ Test# PS1Ref# PS1Err# PDFRef# PDFErr# JPGRef# JPGErr# PNGRef# PN - 43 207729 750 87126 750 76094 38000 54717 11000 210497 800 - 44 401670 6500 156361 2000 62719 34100 45592 14000 410114 6500 - 45 566142 5000 225206 2000 65828 31800 53934 6500 573396 5000 -- 46 3738751 35000 1292739 12000 60580 9900 133547 3500 3783013 35000 -+ 46 3738751 35000 1292739 13000 60580 9900 133547 3500 3783013 35000 - 47 1466028 9000 853193 50000 38425 13500 91242 18100 1463263 7500 - 48 38312 200 56877 750 36524 11800 119641 8000 38121 200 - 49 19556 1000 31967 1000 36859 10000 37602 8000 19900 3000 -@@ -53,7 +53,7 @@ Test# PS1Ref# PS1Err# PDFRef# PDFErr# JPGRef# JPGErr# PNGRef# PN - 52 270825 10000 115500 1000 45496 11000 34685 5000 272950 10000 - 53 15025 3000 29289 500 42525 11300 33336 3900 14787 4000 - 54 254604 5000 383258 7000 55666 30400 46534 6500 259594 7000 -- 55 4846 150 14075 150 33239 600 25303 500 4877 150 -+ 55 4846 150 14075 200 33239 600 25303 500 4877 150 - 56 1435879 150000 12837 100 25830 100 365000 15000 1085792 250000 - 57 5884 500 16577 200 40706 14000 30026 4000 5884 500 - 58 5723 700 15720 200 32236 11000 16916 3200 5670 800 --- -2.52.0 - diff --git a/root-Fix-a-numpy-test-for-32-bit-archs.patch b/root-Fix-a-numpy-test-for-32-bit-archs.patch deleted file mode 100644 index 5e095f3..0000000 --- a/root-Fix-a-numpy-test-for-32-bit-archs.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 40f8cd0adeb7257778c789e1ae639f260780402b Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Sun, 7 Dec 2025 19:30:55 +0100 -Subject: [PATCH] Fix a numpy test for 32 bit archs - -The default dtype used in numpy array is "int". This type has -different sizes on 32 and 64 bit architectures. The test tries to use -the numpy array as a Long64_t dataframe. On 32 bit architectures this -results in an error. - -This commit explicitly changes the numpy array's dtype to "int64" to -match the Long64_t dataframe type on all architectyres. ---- - bindings/pyroot/pythonizations/test/rdataframe_misc.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/bindings/pyroot/pythonizations/test/rdataframe_misc.py b/bindings/pyroot/pythonizations/test/rdataframe_misc.py -index 1a1efd21b3e..150828613b3 100644 ---- a/bindings/pyroot/pythonizations/test/rdataframe_misc.py -+++ b/bindings/pyroot/pythonizations/test/rdataframe_misc.py -@@ -132,7 +132,7 @@ class RDataFrameMisc(unittest.TestCase): - return - out_path = "dataframe_misc_regression_gh20291.root" - try: -- x, y = numpy.array([1, 2, 3]), numpy.array([4, 5, 6]) -+ x, y = numpy.array([1, 2, 3], dtype='int64'), numpy.array([4, 5, 6], dtype='int64') - df = ROOT.RDF.FromNumpy({"x": x, "y": y}) - - df.Snapshot("tree", out_path) --- -2.52.0 - diff --git a/root-Geom-Add-missing-includes-of-TMath.h.patch b/root-Geom-Add-missing-includes-of-TMath.h.patch deleted file mode 100644 index 966d8da..0000000 --- a/root-Geom-Add-missing-includes-of-TMath.h.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 0e1e1f0ba1908ae1020337ed7ec0565bf979b92c Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Tue, 2 Dec 2025 04:57:30 +0100 -Subject: [PATCH] [Geom] Add missing includes of TMath.h - ---- - geom/geombuilder/src/TGeoParaEditor.cxx | 1 + - geom/geombuilder/src/TGeoPconEditor.cxx | 1 + - geom/geombuilder/src/TGeoPgonEditor.cxx | 1 + - geom/geombuilder/src/TGeoTrapEditor.cxx | 1 + - 4 files changed, 4 insertions(+) - -diff --git a/geom/geombuilder/src/TGeoParaEditor.cxx b/geom/geombuilder/src/TGeoParaEditor.cxx -index fdc344ba4d2..bd173607d2c 100644 ---- a/geom/geombuilder/src/TGeoParaEditor.cxx -+++ b/geom/geombuilder/src/TGeoParaEditor.cxx -@@ -27,6 +27,7 @@ Editor for a TGeoPara. - #include "TVirtualGeoPainter.h" - #include "TVirtualPad.h" - #include "TView.h" -+#include "TMath.h" - #include "TGButton.h" - #include "TGTextEntry.h" - #include "TGNumberEntry.h" -diff --git a/geom/geombuilder/src/TGeoPconEditor.cxx b/geom/geombuilder/src/TGeoPconEditor.cxx -index a66359853be..50598d2cb90 100644 ---- a/geom/geombuilder/src/TGeoPconEditor.cxx -+++ b/geom/geombuilder/src/TGeoPconEditor.cxx -@@ -27,6 +27,7 @@ Editor for a TGeoPcon. - #include "TVirtualGeoPainter.h" - #include "TVirtualPad.h" - #include "TView.h" -+#include "TMath.h" - #include "TGCanvas.h" - #include "TGButton.h" - #include "TGTextEntry.h" -diff --git a/geom/geombuilder/src/TGeoPgonEditor.cxx b/geom/geombuilder/src/TGeoPgonEditor.cxx -index 949d0045a66..33638d66b2b 100644 ---- a/geom/geombuilder/src/TGeoPgonEditor.cxx -+++ b/geom/geombuilder/src/TGeoPgonEditor.cxx -@@ -27,6 +27,7 @@ Editor for a TGeoPgon. - #include "TVirtualGeoPainter.h" - #include "TVirtualPad.h" - #include "TView.h" -+#include "TMath.h" - #include "TGTextEntry.h" - #include "TGNumberEntry.h" - #include "TGLabel.h" -diff --git a/geom/geombuilder/src/TGeoTrapEditor.cxx b/geom/geombuilder/src/TGeoTrapEditor.cxx -index d9c2916d075..459e0191117 100644 ---- a/geom/geombuilder/src/TGeoTrapEditor.cxx -+++ b/geom/geombuilder/src/TGeoTrapEditor.cxx -@@ -27,6 +27,7 @@ Editor for a TGeoTrap. - #include "TVirtualGeoPainter.h" - #include "TVirtualPad.h" - #include "TView.h" -+#include "TMath.h" - #include "TGButton.h" - #include "TGTextEntry.h" - #include "TGNumberEntry.h" --- -2.52.0 - diff --git a/root-PyROOT-Don-t-install-the-python-modules-twice.patch b/root-PyROOT-Don-t-install-the-python-modules-twice.patch deleted file mode 100644 index 608765d..0000000 --- a/root-PyROOT-Don-t-install-the-python-modules-twice.patch +++ /dev/null @@ -1,70 +0,0 @@ -From f09b4ce027b31dcd19ea8a398c35c5dfbcc0507f Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Thu, 18 Dec 2025 11:49:12 +0100 -Subject: [PATCH] [PyROOT] Don't install the python modules twice - -The binary python modules were moved one directory level down into the -ROOT and cppyy directories, so that they reside alongside the python -files in the same directories. The install rule for the python files -must therefore be extended to exclude the binary modules (PATTERN *.so -EXCLUDE) so that these are not installed a second time overwriting the -files installed by the install rule for the binary modules with another -copy with the wrong file permissions. - -Also use the no-version option for the cppyy binary module as is -already done for the pythonization binary module, since it is now -installed in the python directory. Before it was installed in the -library directory with an unversioned symlink in the python directory. ---- - bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt | 2 +- - bindings/pyroot/cppyy/cppyy/CMakeLists.txt | 5 +++-- - bindings/pyroot/pythonizations/CMakeLists.txt | 3 ++- - 3 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt b/bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt -index bb48c032974..065a89348ff 100644 ---- a/bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt -+++ b/bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt -@@ -73,7 +73,7 @@ endif() - add_library(cppyy SHARED src/CPyCppyyPyModule.cxx) - - # Set the suffix to '.so' and the prefix to 'lib' --set_target_properties(cppyy PROPERTIES ${ROOT_LIBRARY_PROPERTIES} -+set_target_properties(cppyy PROPERTIES ${ROOT_LIBRARY_PROPERTIES_NO_VERSION} - LIBRARY_OUTPUT_DIRECTORY ${localruntimedir}/cppyy) - if(MSVC) - target_link_libraries(cppyy PRIVATE CPyCppyy) -diff --git a/bindings/pyroot/cppyy/cppyy/CMakeLists.txt b/bindings/pyroot/cppyy/cppyy/CMakeLists.txt -index 3a29b4525f7..842ad12df97 100644 ---- a/bindings/pyroot/cppyy/cppyy/CMakeLists.txt -+++ b/bindings/pyroot/cppyy/cppyy/CMakeLists.txt -@@ -31,8 +31,9 @@ endforeach() - # Install Python sources and bytecode - install(DIRECTORY ${localruntimedir}/cppyy - DESTINATION ${CMAKE_INSTALL_PYTHONDIR} -- COMPONENT libraries) -+ COMPONENT libraries -+ PATTERN *.so EXCLUDE) - - if(NOT MSVC) - ROOT_ADD_TEST_SUBDIRECTORY(test) --endif() -\ No newline at end of file -+endif() -diff --git a/bindings/pyroot/pythonizations/CMakeLists.txt b/bindings/pyroot/pythonizations/CMakeLists.txt -index 1230f18ca47..b415ba13697 100644 ---- a/bindings/pyroot/pythonizations/CMakeLists.txt -+++ b/bindings/pyroot/pythonizations/CMakeLists.txt -@@ -239,7 +239,8 @@ install(TARGETS ${libname} EXPORT ${CMAKE_PROJECT_NAME}Exports - # Install Python sources and bytecode - install(DIRECTORY ${localruntimedir}/ROOT - DESTINATION ${CMAKE_INSTALL_PYTHONDIR} -- COMPONENT libraries) -+ COMPONENT libraries -+ PATTERN *.so EXCLUDE) - - # Install headers required by pythonizations - install(FILES ${PYROOT_EXTRA_HEADERS} --- -2.52.0 - diff --git a/root-Python-Fix-TF1-Pythonization-test-for-NumPy-2.4.0.patch b/root-Python-Fix-TF1-Pythonization-test-for-NumPy-2.4.0.patch deleted file mode 100644 index 2bc2576..0000000 --- a/root-Python-Fix-TF1-Pythonization-test-for-NumPy-2.4.0.patch +++ /dev/null @@ -1,82 +0,0 @@ -From d5135f7869406396b3ba8e944c71dbdd67d3ea01 Mon Sep 17 00:00:00 2001 -From: Jonas Rembser -Date: Tue, 23 Dec 2025 19:04:45 +0100 -Subject: [PATCH] [Python] Fix TF1 Pythonization test for NumPy 2.4.0 - -The new NumPy 2.4.0 is more strict when implicitly converting 1-element -arrays to scalars. It doesn't do that anymore, causing the TF1 -Pythonization tests to fail (see log below). - -This actually pointed to a real mistake in setting up the test, where a -2D array was used to define the TFormula parameters while it should be a -1D array. - -```txt - 962/3718 Test #93: pyunittests-bindings-pyroot-pythonizations-pyroot-pyz-tf-pycallables ..............................***Failed 3.05 sec -test_callable (tf_pycallables.TF1.test_callable) -Test function provided as callable ... ok -test_evalpar (tf_pycallables.TF1.test_evalpar) -Test the 2D Numpy array pythonizations for TF1::EvalPar ... ERROR -test_evalpar_dynamic (tf_pycallables.TF1.test_evalpar_dynamic) -Test the 2D NumPy pythonizations with dynamic TF1 data dimensions ... ok -test_fitgauss (tf_pycallables.TF1.test_fitgauss) -Test fitting a histogram to a Python function ... ok -test_identity (tf_pycallables.TF1.test_identity) -Test simple function without parameters ... ok -test_params (tf_pycallables.TF1.test_params) -Test function with parameters ... ok -test_params (tf_pycallables.TF2.test_params) -Test function with parameters ... ok -test_params (tf_pycallables.TF3.test_params) -Test function with parameters ... ok - -====================================================================== -ERROR: test_evalpar (tf_pycallables.TF1.test_evalpar) -Test the 2D Numpy array pythonizations for TF1::EvalPar ----------------------------------------------------------------------- -Traceback (most recent call last): - File "/github/home/ROOT-CI/src/bindings/pyroot/pythonizations/test/tf_pycallables.py", line 129, in test_evalpar - expected_value = pyf_tf1_coulomb(x[i, ::2], params) - File "/github/home/ROOT-CI/src/bindings/pyroot/pythonizations/test/tf_pycallables.py", line 33, in pyf_tf1_coulomb - return p[1] * x[0] * x[1] / (p[0]**2) * math.exp(-p[2] / p[0]) - ~~~~~~~~^^^^^^^^^^^^^^ -TypeError: only 0-dimensional arrays can be converted to Python scalars - ----------------------------------------------------------------------- -Ran 8 tests in 1.469s - -FAILED (errors=1) -CMake Error at /github/home/ROOT-CI/src/cmake/modules/RootTestDriver.cmake:232 (message): - error code: 1 - -``` ---- - .../pyroot/pythonizations/test/tf_pycallables.py | 12 +++++++----- - 1 file changed, 7 insertions(+), 5 deletions(-) - -diff --git a/bindings/pyroot/pythonizations/test/tf_pycallables.py b/bindings/pyroot/pythonizations/test/tf_pycallables.py -index 2a7d6b72462..5a223030ec9 100644 ---- a/bindings/pyroot/pythonizations/test/tf_pycallables.py -+++ b/bindings/pyroot/pythonizations/test/tf_pycallables.py -@@ -116,11 +116,13 @@ class TF1(unittest.TestCase): - [3.0, 10, 4.0] - ]) - -- params = np.array([ -- [1.0], # Distance between charges r -- [8.99e9], # Coulomb constant k (in N·m²/C²) -- [0.1] # Additional factor for modulation -- ]) -+ params = np.array( -+ [ -+ 1.0, # Distance between charges r -+ 8.99e9, # Coulomb constant k (in N·m²/C²) -+ 0.1, # Additional factor for modulation -+ ] -+ ) - - # Slice to avoid the dummy column of 10's - res = rtf1_coulomb.EvalPar(x[:, ::2], params) --- -2.52.0 - diff --git a/root-RF-Use-TRandom3-in-test-RooFuncWrapper.patch b/root-RF-Use-TRandom3-in-test-RooFuncWrapper.patch deleted file mode 100644 index 34bdebc..0000000 --- a/root-RF-Use-TRandom3-in-test-RooFuncWrapper.patch +++ /dev/null @@ -1,50 +0,0 @@ -From e1f42658629ad67ce7cb224a1379d133f61f2e35 Mon Sep 17 00:00:00 2001 -From: Jonas Rembser -Date: Sun, 11 Jan 2026 10:25:51 +0100 -Subject: [PATCH] [RF] Use TRandom3 in test RooFuncWrapper - -Use TRandom3 instead of the `` to get compiler-independent, -reproducible behavior. ---- - roofit/roofitcore/test/testRooFuncWrapper.cxx | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/roofit/roofitcore/test/testRooFuncWrapper.cxx b/roofit/roofitcore/test/testRooFuncWrapper.cxx -index 2ebdf95333f..189e8f2e266 100644 ---- a/roofit/roofitcore/test/testRooFuncWrapper.cxx -+++ b/roofit/roofitcore/test/testRooFuncWrapper.cxx -@@ -34,12 +34,12 @@ - #include - - #include -+#include - #include -+#include - #include --#include - - #include --#include - - #include "gtest_wrapper.h" - -@@ -66,13 +66,13 @@ double getNumDerivative(const RooAbsReal &pdf, RooRealVar &var, const RooArgSet - - void randomizeParameters(const RooArgSet ¶meters) - { -+ TRandom3 rng(1337); -+ - double lowerBound = -0.1; - double upperBound = 0.1; -- std::uniform_real_distribution unif(lowerBound, upperBound); -- std::default_random_engine re; - - for (auto *param : parameters) { -- double mul = unif(re); -+ double mul = rng.Uniform(lowerBound, upperBound); - - auto par = dynamic_cast(param); - if (!par) --- -2.52.0 - diff --git a/root-Revert-test-Fetch-the-geometries-from-EOS-and-not-fr.patch b/root-Revert-test-Fetch-the-geometries-from-EOS-and-not-fr.patch deleted file mode 100644 index a45ae41..0000000 --- a/root-Revert-test-Fetch-the-geometries-from-EOS-and-not-fr.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 4da50ef374cd231163dff77493f9367cd62583d9 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Sun, 30 Mar 2025 21:23:14 +0200 -Subject: [PATCH] Revert "[test] Fetch the geometries from EOS and not from the - website" - -This reverts commit a8a879ce252e45405452db38d9178c7883582a7d. ---- - test/stressGeometry.cxx | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/test/stressGeometry.cxx b/test/stressGeometry.cxx -index 7fb6bf97e7..f8d78f4f54 100644 ---- a/test/stressGeometry.cxx -+++ b/test/stressGeometry.cxx -@@ -1,6 +1,6 @@ - // Program to check a TGeo geometry - // The first time you run this program, the geometry files will be taken --// from /eos/root-eos/testfiles/ (previously from http://root.cern/files) -+// from http://root.cern/files - // - // How the program works - // If the file _ref.root does not exist, it is generated. The file -@@ -274,13 +274,13 @@ void stressGeometry(const char *exp="*", Bool_t generate_ref=kFALSE, Bool_t vecg - delete gGeoManager; - gGeoManager = 0; - } -- TGeoManager::Import(Form("root://eospublic.cern.ch//eos/root-eos/testfiles/%s",fname.Data())); -+ TGeoManager::Import(Form("http://root.cern/files/%s",fname.Data())); - if (!gGeoManager) return; - if (vecgeom) TVirtualGeoConverter::Instance()->ConvertGeometry(); - - fname = TString::Format("files/%s_ref_%d.root", exps[i],versions[i]); - -- if (gen_ref || !TFile::Open(Form("root://eospublic.cern.ch//eos/root-eos/testfiles//%s_ref_%d.root",exps[i],versions[i]),"CACHEREAD")) { -+ if (gen_ref || !TFile::Open(Form("http://root.cern/files/%s_ref_%d.root",exps[i],versions[i]),"CACHEREAD")) { - if (!gen_ref) fprintf(stderr,"File: %s does not exist, generating it\n", fname.Data()); - else fprintf(stderr,"Generating reference file %s\n", fname.Data()); - WriteRef(i); -@@ -320,7 +320,7 @@ void ReadRef(Int_t kexp) { - TFile *f = 0; - //use ref_[version[i]] files - if (!gen_ref) -- fname = TString::Format("root://eospublic.cern.ch//eos/root-eos/testfiles//%s_ref_%d.root", exps[kexp],versions[kexp]); -+ fname = TString::Format("http://root.cern/files/%s_ref_%d.root", exps[kexp],versions[kexp]); - else - fname.Format("files/%s_ref_%d.root", exps[kexp],versions[kexp]); - -@@ -546,7 +546,7 @@ void InspectDiff(const char* exp="alice",Long64_t ientry=-1) { - Float_t rad = 0.; - TString fname(TString::Format("%s.root",exp)); - if (gSystem->AccessPathName(fname)) { -- TGeoManager::Import(Form("root://eospublic.cern.ch//eos/root-eos/testfiles//%s",fname.Data())); -+ TGeoManager::Import(Form("http://root.cern/files/%s",fname.Data())); - } else { - TGeoManager::Import(fname); - } --- -2.49.0 - diff --git a/root-Save-memory-Do-not-link-to-LLVM-libraries-in-parallel.patch b/root-Save-memory-Do-not-link-to-LLVM-libraries-in-parallel.patch deleted file mode 100644 index 4d5587f..0000000 --- a/root-Save-memory-Do-not-link-to-LLVM-libraries-in-parallel.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 98a5042a02dd7c1aaa9fbd5e54c8620c6b72484f Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Mon, 2 Jun 2025 21:22:39 +0200 -Subject: [PATCH] Save memory. Do not link to LLVM libraries in parallel - ---- - core/clingutils/test/CMakeLists.txt | 3 +++ - interpreter/CppInterOp/unittests/CppInterOp/CMakeLists.txt | 6 ++++++ - 2 files changed, 9 insertions(+) - -diff --git a/core/clingutils/test/CMakeLists.txt b/core/clingutils/test/CMakeLists.txt -index a6c7aedac99..90ac0139c24 100644 ---- a/core/clingutils/test/CMakeLists.txt -+++ b/core/clingutils/test/CMakeLists.txt -@@ -36,3 +36,6 @@ if(NOT builtin_clang) - endif() - - ROOT_ADD_UNITTEST_DIR(Core ${CLING_LIBRARIES} $) -+ -+# Save memory. Do not link to LLVM libraries in parallel -+add_dependencies(coreclingutilstestUnit CppInterOpTests) -diff --git a/interpreter/CppInterOp/unittests/CppInterOp/CMakeLists.txt b/interpreter/CppInterOp/unittests/CppInterOp/CMakeLists.txt -index 4b4b43bdd29..a028802fedc 100644 ---- a/interpreter/CppInterOp/unittests/CppInterOp/CMakeLists.txt -+++ b/interpreter/CppInterOp/unittests/CppInterOp/CMakeLists.txt -@@ -66,6 +66,9 @@ target_link_libraries(CppInterOpTests - clangCppInterOp - ) - -+# Save memory. Do not link to LLVM libraries in parallel -+add_dependencies(CppInterOpTests DynamicLibraryManagerTests) -+ - set_output_directory(CppInterOpTests - BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${EXTRA_PATH_TEST_BINARIES} - LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${EXTRA_PATH_TEST_BINARIES} -@@ -129,5 +132,8 @@ set_output_directory(DynamicLibraryManagerTests - - add_dependencies(DynamicLibraryManagerTests TestSharedLib) - -+# Save memory. Do not link to LLVM libraries in parallel -+add_dependencies(DynamicLibraryManagerTests Cling) -+ - #export_executable_symbols_for_plugins(TestSharedLib) - add_subdirectory(TestSharedLib) --- -2.52.0 - diff --git a/root-VecOps-Remove-outdated-IsSmall-helper-function-in-te.patch b/root-VecOps-Remove-outdated-IsSmall-helper-function-in-te.patch deleted file mode 100644 index 58ba414..0000000 --- a/root-VecOps-Remove-outdated-IsSmall-helper-function-in-te.patch +++ /dev/null @@ -1,34 +0,0 @@ -From fd18e83ae79760f7e8cca6f28b6d0f89d912b152 Mon Sep 17 00:00:00 2001 -From: Jonas Rembser -Date: Wed, 26 Nov 2025 12:40:03 +0100 -Subject: [PATCH] [VecOps] Remove outdated `IsSmall` helper function in tests - -The commit 2605710bea7b1 changed from using the `ROOT::Detail::VecOps::` -namespace explicitly for `IsSmall` to a `using` statement. However, -there was also a remnant `IsSmall` function with an outdated -implementation in the test file itself, which we can now remove. ---- - math/vecops/test/vecops_rvec.cxx | 7 ------- - 1 file changed, 7 deletions(-) - -diff --git a/math/vecops/test/vecops_rvec.cxx b/math/vecops/test/vecops_rvec.cxx -index 034f06ca211..432c673a553 100644 ---- a/math/vecops/test/vecops_rvec.cxx -+++ b/math/vecops/test/vecops_rvec.cxx -@@ -1493,13 +1493,6 @@ TEST(VecOps, Construct) - EXPECT_TRUE(fourVects[2] == ref2); - } - --bool IsSmall(const RVec &v) --{ -- // the first array element is right after the 3 data members of SmallVectorBase -- return reinterpret_cast(v.begin()) - reinterpret_cast(&v) == -- sizeof(void *) + 2 * sizeof(int); --} -- - // this is a regression test for https://github.com/root-project/root/issues/6796 - TEST(VecOps, MemoryAdoptionAndClear) - { --- -2.52.0 - diff --git a/root-big-endian-byte-swap.patch b/root-big-endian-byte-swap.patch new file mode 100644 index 0000000..caa3076 --- /dev/null +++ b/root-big-endian-byte-swap.patch @@ -0,0 +1,58 @@ +From b32c7a1b080cb5d14f242070bf906ea6929d604d Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Fri, 25 Mar 2022 11:13:12 +0100 +Subject: [PATCH] Byte swap values read from the protobuf raw data stream on + big endian + +--- + tmva/sofie_parsers/src/RModelParser_ONNX.cxx | 23 +++++++++++++++----- + 1 file changed, 17 insertions(+), 6 deletions(-) + +diff --git a/tmva/sofie_parsers/src/RModelParser_ONNX.cxx b/tmva/sofie_parsers/src/RModelParser_ONNX.cxx +index ab457dcddc..d701fb3299 100644 +--- a/tmva/sofie_parsers/src/RModelParser_ONNX.cxx ++++ b/tmva/sofie_parsers/src/RModelParser_ONNX.cxx +@@ -1,3 +1,4 @@ ++#include "Byteswap.h" + #include "TMVA/RModelParser_ONNX.hxx" + #include "onnx_proto3.pb.h" + +@@ -335,9 +336,14 @@ RModel RModelParser_ONNX::Parse(std::string filename, bool verbose) + case ETensorType::FLOAT: { + std::shared_ptr data(malloc(fLength * sizeof(float)), free); + +- if (tensorproto->raw_data().empty() == false) { +- auto raw_data_ptr = reinterpret_cast(const_cast(tensorproto->raw_data().c_str())); +- std::memcpy(data.get(), raw_data_ptr, fLength * sizeof(float)); ++ if (!tensorproto->raw_data().empty()) { ++#ifdef R__BYTESWAP ++ std::memcpy(data.get(), tensorproto->raw_data().c_str(), fLength * sizeof(float)); ++#else ++ for (std::size_t k = 0; k < fLength; ++k) ++ (reinterpret_cast(data.get()))[k] = ++ Rbswap_32((reinterpret_cast(tensorproto->raw_data().c_str()))[k]); ++#endif + } else { + tensorproto->mutable_float_data()->ExtractSubrange(0, tensorproto->float_data_size(), + static_cast(data.get())); +@@ -350,9 +356,14 @@ RModel RModelParser_ONNX::Parse(std::string filename, bool verbose) + case ETensorType::INT64: { + std::shared_ptr data(malloc(fLength * sizeof(int64_t)), free); + +- if (tensorproto->raw_data().empty() == false) { +- auto raw_data_ptr = reinterpret_cast(const_cast(tensorproto->raw_data().c_str())); +- std::memcpy(data.get(), raw_data_ptr, fLength * sizeof(int64_t)); ++ if (!tensorproto->raw_data().empty()) { ++#ifdef R__BYTESWAP ++ std::memcpy(data.get(), tensorproto->raw_data().c_str(), fLength * sizeof(int64_t)); ++#else ++ for (std::size_t k = 0; k < fLength; ++k) ++ (reinterpret_cast(data.get()))[k] = ++ Rbswap_64((reinterpret_cast(tensorproto->raw_data().c_str()))[k]); ++#endif + } else { + tensorproto->mutable_int64_data()->ExtractSubrange(0, tensorproto->int64_data_size(), + static_cast(data.get())); +-- +2.39.2 + diff --git a/root-boolean-numpy-array.patch b/root-boolean-numpy-array.patch new file mode 100644 index 0000000..e5d6482 --- /dev/null +++ b/root-boolean-numpy-array.patch @@ -0,0 +1,45 @@ +From 2b3dd4f1bfecea5b1b936d5507f8b0c664322a19 Mon Sep 17 00:00:00 2001 +From: Jonas Rembser +Date: Wed, 6 Sep 2023 02:16:33 +0200 +Subject: [PATCH] [RF][PyROOT] Avoid boolean operators on numpy arrays in unit + test + +The `n_in_range` reference value in the unit test +`roodataset_numpy.TestRooDataSetNumpy.test_ignoring_out_of_range` +apparently doesn't get computed right on some 32 platforms. + +I can't reproduce the problem, but I'm sure it will be fixed by avoiding +the use of the operators `&` and `|` with numpy arrays. Just doing a +manual loop in Python should be more platform independent. + +Closes #12162. +--- + .../pythonizations/test/roofit/roodataset_numpy.py | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/bindings/pyroot/pythonizations/test/roofit/roodataset_numpy.py b/bindings/pyroot/pythonizations/test/roofit/roodataset_numpy.py +index 79259af321..5587677c45 100644 +--- a/bindings/pyroot/pythonizations/test/roofit/roodataset_numpy.py ++++ b/bindings/pyroot/pythonizations/test/roofit/roodataset_numpy.py +@@ -135,9 +135,15 @@ class TestRooDataSetNumpy(unittest.TestCase): + cat.defineType("minus", -1) + cat.defineType("plus", +1) + +- in_x_range = (data["x"] <= x.getMax()) & (data["x"] >= x.getMin()) +- in_cat_range = (data["cat"] == -1) | (data["cat"] == +1) +- n_in_range = np.sum(in_x_range & in_cat_range) ++ # Use manual loop because we had some problems with numpys boolean ++ # comparisions in the past (see GitHub issue #12162). ++ n_in_range = 0 ++ for i in range(n_events): ++ in_x_range = data["x"][i] <= x.getMax() and data["x"][i] >= x.getMin() ++ in_cat_range = (data["cat"][i] == -1) or (data["cat"][i] == +1) ++ is_in_range = in_x_range and in_cat_range ++ if is_in_range: ++ n_in_range = n_in_range + 1 + + dataset_numpy = ROOT.RooDataSet.from_numpy(data, {x, cat}, name="dataSetNumpy") + +-- +2.41.0 + diff --git a/root-cppyy-Remove-code-related-to-finding-CPyCppyy-API-he.patch b/root-cppyy-Remove-code-related-to-finding-CPyCppyy-API-he.patch deleted file mode 100644 index 882247f..0000000 --- a/root-cppyy-Remove-code-related-to-finding-CPyCppyy-API-he.patch +++ /dev/null @@ -1,109 +0,0 @@ -From 251de0f8b237ce041df4960f831fe4a1fade6d92 Mon Sep 17 00:00:00 2001 -From: Jonas Rembser -Date: Sat, 6 Dec 2025 17:39:40 +0100 -Subject: [PATCH] [cppyy] Remove code related to finding CPyCppyy API header - path - -This is not needed for ROOT, because the CPyCppyy API headers are -installed with the other ROOT headers anyway, and ROOT knows where to -find them already. ---- - .../cppyy/cppyy/python/cppyy/__init__.py | 82 ------------------- - 1 file changed, 82 deletions(-) - -diff --git a/bindings/pyroot/cppyy/cppyy/python/cppyy/__init__.py b/bindings/pyroot/cppyy/cppyy/python/cppyy/__init__.py -index 68e3c49e5fe..c8dd458bfdd 100644 ---- a/bindings/pyroot/cppyy/cppyy/python/cppyy/__init__.py -+++ b/bindings/pyroot/cppyy/cppyy/python/cppyy/__init__.py -@@ -297,88 +297,6 @@ elif ispypy: - if os.path.exists(apipath) and os.path.exists(os.path.join(apipath, 'Python.h')): - add_include_path(apipath) - --# add access to extra headers for dispatcher (CPyCppyy only (?)) --if not ispypy: -- try: -- apipath_extra = os.environ['CPPYY_API_PATH'] -- if os.path.basename(apipath_extra) == 'CPyCppyy': -- apipath_extra = os.path.dirname(apipath_extra) -- except KeyError: -- apipath_extra = None -- -- if apipath_extra is None: -- try: -- if 0x30a0000 <= sys.hexversion: -- import importlib.metadata as m -- -- for p in m.files('CPyCppyy'): -- if p.match('API.h'): -- ape = p.locate() -- break -- del p, m -- else: -- import pkg_resources as pr -- -- d = pr.get_distribution('CPyCppyy') -- for line in d.get_metadata_lines('RECORD'): -- if 'API.h' in line: -- ape = os.path.join(d.location, line[0:line.find(',')]) -- break -- del line, d, pr -- -- if os.path.exists(ape): -- apipath_extra = os.path.dirname(os.path.dirname(ape)) -- del ape -- except Exception: -- pass -- -- if apipath_extra is None: -- ldversion = sysconfig.get_config_var('LDVERSION') -- if not ldversion: -- ldversion = sys.version[:3] -- -- apipath_extra = os.path.join(os.path.dirname(apipath), 'site', 'python'+ldversion) -- if not os.path.exists(os.path.join(apipath_extra, 'CPyCppyy')): -- import glob -- import platform -- -- if platform.system() == "Windows": -- # Install locations are handled differently on Windows -- import libcppyy -- -- ape = os.path.dirname(libcppyy.__file__) -- else: -- import cppyy.libcppyy as libcppyy -- -- ape = os.path.dirname(libcppyy.__file__) -- # a "normal" structure finds the include directory up to 3 levels up, -- # ie. dropping lib/pythonx.y[md]/site-packages -- for i in range(3): -- if os.path.exists(os.path.join(ape, 'include')): -- break -- ape = os.path.dirname(ape) -- -- ape = os.path.join(ape, 'include') -- if os.path.exists(os.path.join(ape, 'CPyCppyy')): -- apipath_extra = ape -- else: -- # add back pythonx.y or site/pythonx.y if present -- for p in glob.glob(os.path.join(ape, 'python'+sys.version[:3]+'*'))+\ -- glob.glob(os.path.join(ape, '*', 'python'+sys.version[:3]+'*')): -- if os.path.exists(os.path.join(p, 'CPyCppyy')): -- apipath_extra = p -- break -- -- if apipath_extra.lower() != 'none': -- if not os.path.exists(os.path.join(apipath_extra, 'CPyCppyy')): -- warnings.warn("CPyCppyy API not found (tried: %s); " -- "set CPPYY_API_PATH envar to the 'CPyCppyy' API directory to fix" -- % apipath_extra) -- else: -- add_include_path(apipath_extra) -- -- del apipath_extra -- - if os.getenv('CONDA_PREFIX'): - # MacOS, Linux - include_path = os.path.join(os.getenv('CONDA_PREFIX'), 'include') --- -2.52.0 - diff --git a/root-cppyy-Remove-now-irrelevant-load_cpp_backend-call.patch b/root-cppyy-Remove-now-irrelevant-load_cpp_backend-call.patch deleted file mode 100644 index a79c861..0000000 --- a/root-cppyy-Remove-now-irrelevant-load_cpp_backend-call.patch +++ /dev/null @@ -1,46 +0,0 @@ -From f4577e76a5dc23842d6be0a82df804f71fc820ef Mon Sep 17 00:00:00 2001 -From: Jonas Rembser -Date: Mon, 1 Dec 2025 16:51:36 +0100 -Subject: [PATCH] [cppyy] Remove now irrelevant `load_cpp_backend()` call - -As we don't have a separate `cppyy_backend` anymore (neither as a Python -package, nor as a shared library), trying to load the backend library -will always give an exception that will be caught as an `ImportError`. - -It would be cleaner if this code branch is not even taken. ---- - .../cppyy/cppyy/python/cppyy/_cpython_cppyy.py | 12 ------------ - 1 file changed, 12 deletions(-) - -diff --git a/bindings/pyroot/cppyy/cppyy/python/cppyy/_cpython_cppyy.py b/bindings/pyroot/cppyy/cppyy/python/cppyy/_cpython_cppyy.py -index bac078ea7c9..f98a34a697c 100644 ---- a/bindings/pyroot/cppyy/cppyy/python/cppyy/_cpython_cppyy.py -+++ b/bindings/pyroot/cppyy/cppyy/python/cppyy/_cpython_cppyy.py -@@ -19,24 +19,12 @@ __all__ = [ - '_end_capture_stderr' - ] - --# First load the dependency libraries of the backend, then pull in the libcppyy --# extension module. If the backed can't be loaded, it was probably linked --# statically into the extension module, so we don't error out at this point. --try: -- from cppyy_backend import loader -- c = loader.load_cpp_backend() --except ImportError: -- c = None -- - if platform.system() == "Windows": - # On Windows, the library has to be searched without prefix - import libcppyy as _backend - else: - import cppyy.libcppyy as _backend - --if c is not None: -- _backend._cpp_backend = c -- - # explicitly expose APIs from libcppyy - _w = ctypes.CDLL(_backend.__file__, ctypes.RTLD_GLOBAL) - --- -2.52.0 - diff --git a/root-do-not-remove-Wp-before-D-and-U.patch b/root-do-not-remove-Wp-before-D-and-U.patch new file mode 100644 index 0000000..820b7af --- /dev/null +++ b/root-do-not-remove-Wp-before-D-and-U.patch @@ -0,0 +1,44 @@ +From 0191a987b7583c2aa84b1293105db353fee40b1d Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Fri, 10 Mar 2023 20:49:02 +0100 +Subject: [PATCH] Do not remove -Wp, before -D and -U when recording used + compiler flags + +This breaks the pattern used when undefining and then defining a +variable in the same flag: + +$ echo | g++ -Wp,-UVAR,-DVAR=1 -c -x c++ - + +Here -Wp,-UVAR,-DVAR=1 will first undefine VAR and then define it to 1 + +If the -Wp, is dropped, this fails: +$ echo | g++ -UVAR,-DVAR=1 -c -x c++ - +: warning: extra tokens at end of #undef directive + +Now it will only undefine VAR, but not defin it. I.e. + +insted of + +you get + +which explains the rather cryptic warning about extra token after #undef. +--- + cmake/modules/RootConfiguration.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/cmake/modules/RootConfiguration.cmake b/cmake/modules/RootConfiguration.cmake +index 3d1ae9be53..042b43f039 100644 +--- a/cmake/modules/RootConfiguration.cmake ++++ b/cmake/modules/RootConfiguration.cmake +@@ -729,7 +729,7 @@ if (cxxmodules) + endif() + + string(REGEX REPLACE "(^|[ ]*)-W[^ ]*" "" __fflags "${CMAKE_Fortran_FLAGS}") +-string(REGEX MATCHALL "-(D|U)[^ ]*" __defs "${CMAKE_CXX_FLAGS}") ++string(REGEX MATCHALL "(-Wp,)?-(D|U)[^ ]*" __defs "${CMAKE_CXX_FLAGS}") + set(ROOT_COMPILER_FLAG_HINTS "# + set(ROOT_DEFINITIONS \"${__defs}\") + set(ROOT_CXX_FLAGS \"${__cxxflags}\") +-- +2.39.2 + diff --git a/root-dont-install-roofit-files-fix.patch b/root-dont-install-roofit-files-fix.patch new file mode 100644 index 0000000..295a4b7 --- /dev/null +++ b/root-dont-install-roofit-files-fix.patch @@ -0,0 +1,26 @@ +From 74aaf99530443a712f9b0577d8edde615ea8902d Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Sat, 4 Mar 2023 21:27:35 +0100 +Subject: [PATCH] Use FILTER instead of REMOVE_ITEM since GLOB returns absolute + paths + +--- + build/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt +index e964b5e255..2b24b1d6e6 100644 +--- a/build/CMakeLists.txt ++++ b/build/CMakeLists.txt +@@ -30,7 +30,7 @@ ROOT_EXECUTABLE(rmkdepend + if(NOT MSVC AND _BUILD_TYPE_UPPER MATCHES "DEBUG|RELWITHDEBINFO") + file(GLOB PRETTY_PRINTERS "gdbPrinters/*.so-gdb.py") + if(NOT roofit) +- list(REMOVE_ITEM PRETTY_PRINTERS gdbPrinters/libRooFitCore.so-gdb.py) ++ list(FILTER PRETTY_PRINTERS EXCLUDE REGEX libRooFitCore.so-gdb.py) + endif() + set(PRETTY_PRINTER_DESTS) + foreach(PRETTY_PRINTER ${PRETTY_PRINTERS}) +-- +2.39.2 + diff --git a/root-fix-test-failure-on-ppc64le-and-aarch64-with-gcc-12.patch b/root-fix-test-failure-on-ppc64le-and-aarch64-with-gcc-12.patch new file mode 100644 index 0000000..274aa66 --- /dev/null +++ b/root-fix-test-failure-on-ppc64le-and-aarch64-with-gcc-12.patch @@ -0,0 +1,44 @@ +From 15f50c71b4d89bfbf06ce817dee38e843f0f55cd Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 17 Jan 2022 23:50:47 +0100 +Subject: [PATCH] Fix test failure on ppc64le and aarch64 with gcc 12 + +.../hist/hist/test/test_tprofile2poly.cxx:61: Failure +The difference between cont1 and cont2 is 1.4551915228366852e-11, which exceeds delta, where +cont1 evaluates to 54886.064319363642, +cont2 evaluates to 54886.064319363628, and +delta evaluates to 9.999999960041972e-12. +.../hist/hist/test/test_tprofile2poly.cxx:61: Failure +The difference between cont1 and cont2 is 1.4551915228366852e-11, where +cont1 evaluates to 109868.61342004745, +cont2 evaluates to 109868.61342004743. +The abs_error parameter delta evaluates to 9.999999960041972e-12 which is smaller than the minimum distance between doubles for numbers of this magnitude which is 1.4551915228366852e-11, thus making this EXPECT_NEAR check equivalent to EXPECT_EQUAL. Consider using EXPECT_DOUBLE_EQ instead. +--- + hist/hist/test/test_tprofile2poly.cxx | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/hist/hist/test/test_tprofile2poly.cxx b/hist/hist/test/test_tprofile2poly.cxx +index 40cb3052a2..ecf559a4b3 100644 +--- a/hist/hist/test/test_tprofile2poly.cxx ++++ b/hist/hist/test/test_tprofile2poly.cxx +@@ -58,15 +58,14 @@ void binEntriesCompare(TProfile2D* tp2d, TProfile2Poly* tpp) { + for(Double_t x=0.5; x<10; x+=2.0) { + cont1 = tp2d->GetBinEffectiveEntries(tp2d->FindBin(x,y)); + cont2 = tpp->GetBinEffectiveEntries(tpp->FindBin(x,y)); +- ASSERT_NEAR(cont1, cont2, delta); ++ ASSERT_NEAR(cont1, cont2, 2 * delta); + } + + } + // test overflow + cont1 = tp2d->GetBinEffectiveEntries(tp2d->FindBin(11,11)); + cont2 = tpp->GetBinEffectiveEntries(tpp->FindBin(11,11)); +- ASSERT_NEAR(cont1, cont2, delta); +- ++ ASSERT_NEAR(cont1, cont2, 2 * delta); + } + + void binErrorCompare(TProfile2D* tp2d, TProfile2Poly* tpp) { +-- +2.39.2 + diff --git a/root-fixes-for-32bit-builds.patch b/root-fixes-for-32bit-builds.patch new file mode 100644 index 0000000..bcff78d --- /dev/null +++ b/root-fixes-for-32bit-builds.patch @@ -0,0 +1,185 @@ +From 6f69a59010a60c949b1955e52275137e39a85b82 Mon Sep 17 00:00:00 2001 +From: Jakob Blomer +Date: Thu, 9 Mar 2023 15:14:22 +0100 +Subject: [PATCH] [ntuple] fixes for 32bit / non-x86_64 builds + +--- + tree/dataframe/src/RNTupleDS.cxx | 1 + + tree/ntuple/v7/inc/ROOT/RField.hxx | 21 +++++++++++++++++++-- + tree/ntuple/v7/test/ntuple_extended.cxx | 8 ++++---- + 3 files changed, 24 insertions(+), 6 deletions(-) + +diff --git a/tree/dataframe/src/RNTupleDS.cxx b/tree/dataframe/src/RNTupleDS.cxx +index f7eb0ab5f284..aaea6df81622 100644 +--- a/tree/dataframe/src/RNTupleDS.cxx ++++ b/tree/dataframe/src/RNTupleDS.cxx +@@ -94,6 +94,7 @@ class RRDFCardinalityField : public ROOT::Experimental::Detail::RFieldBase { + return ROOT::Experimental::Detail::RFieldValue(true /* captureFlag */, this, where); + } + size_t GetValueSize() const final { return sizeof(std::size_t); } ++ size_t GetAlignment() const final { return alignof(std::size_t); } + + /// Get the number of elements of the collection identified by globalIndex + void +diff --git a/tree/ntuple/v7/inc/ROOT/RField.hxx b/tree/ntuple/v7/inc/ROOT/RField.hxx +index b05267d16030..9a85368a94e3 100644 +--- a/tree/ntuple/v7/inc/ROOT/RField.hxx ++++ b/tree/ntuple/v7/inc/ROOT/RField.hxx +@@ -270,8 +270,9 @@ public: + virtual std::vector SplitValue(const RFieldValue &value) const; + /// The number of bytes taken by a value of the appropriate type + virtual size_t GetValueSize() const = 0; +- /// For many types, the alignment requirement is equal to the size; otherwise override. +- virtual size_t GetAlignment() const { return GetValueSize(); } ++ /// As a rule of thumb, the alignment is equal to the size of the type. There are, however, various exceptions ++ /// to this rule depending on OS and CPU architecture. So enforce the alignment to be explicitly spelled out. ++ virtual size_t GetAlignment() const = 0; + int GetTraits() const { return fTraits; } + bool HasReadCallbacks() const { return !fReadCallbacks.empty(); } + +@@ -383,6 +384,7 @@ public: + Detail::RFieldValue GenerateValue(void*) override { return Detail::RFieldValue(); } + Detail::RFieldValue CaptureValue(void*) final { return Detail::RFieldValue(); } + size_t GetValueSize() const final { return 0; } ++ size_t GetAlignment() const final { return 0; } + + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; +@@ -889,6 +891,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(ClusterSize_t); } ++ size_t GetAlignment() const final { return alignof(ClusterSize_t); } + void CommitCluster() final; + }; + +@@ -990,6 +993,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(ClusterSize_t); } ++ size_t GetAlignment() const final { return alignof(ClusterSize_t); } + + /// Special help for offset fields + void GetCollectionInfo(NTupleSize_t globalIndex, RClusterIndex *collectionStart, ClusterSize_t *size) { +@@ -1110,6 +1115,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(bool); } ++ size_t GetAlignment() const final { return alignof(bool); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1162,6 +1168,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(float); } ++ size_t GetAlignment() const final { return alignof(float); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1215,6 +1222,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(double); } ++ size_t GetAlignment() const final { return alignof(double); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1267,6 +1275,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(char); } ++ size_t GetAlignment() const final { return alignof(char); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1319,6 +1328,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(std::int8_t); } ++ size_t GetAlignment() const final { return alignof(std::int8_t); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1371,6 +1381,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(std::uint8_t); } ++ size_t GetAlignment() const final { return alignof(std::uint8_t); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1423,6 +1434,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(std::int16_t); } ++ size_t GetAlignment() const final { return alignof(std::int16_t); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1475,6 +1487,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(std::uint16_t); } ++ size_t GetAlignment() const final { return alignof(std::uint16_t); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1527,6 +1540,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(std::int32_t); } ++ size_t GetAlignment() const final { return alignof(std::int32_t); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1579,6 +1593,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(std::uint32_t); } ++ size_t GetAlignment() const final { return alignof(std::uint32_t); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1631,6 +1646,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(std::uint64_t); } ++ size_t GetAlignment() const final { return alignof(std::uint64_t); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +@@ -1683,6 +1699,7 @@ public: + Detail::RColumnElement(static_cast(where)), this, where); + } + size_t GetValueSize() const final { return sizeof(std::int64_t); } ++ size_t GetAlignment() const final { return alignof(std::int64_t); } + void AcceptVisitor(Detail::RFieldVisitor &visitor) const final; + }; + +diff --git a/tree/ntuple/v7/test/ntuple_extended.cxx b/tree/ntuple/v7/test/ntuple_extended.cxx +index 91871e288e98..d3b6ee466359 100644 +--- a/tree/ntuple/v7/test/ntuple_extended.cxx ++++ b/tree/ntuple/v7/test/ntuple_extended.cxx +@@ -123,8 +123,8 @@ TEST(RNTuple, LargeFile1) + RNTupleWriteOptions options; + options.SetCompression(0); + auto ntuple = RNTupleWriter::Recreate(std::move(modelWrite), "myNTuple", fileGuard.GetPath(), options); +- constexpr unsigned long nEvents = 1024 * 1024 * 256; // Exceed 2GB file size +- for (unsigned int i = 0; i < nEvents; ++i) { ++ constexpr std::uint64_t nEvents = 1024 * 1024 * 256; // Exceed 2GB file size ++ for (std::uint64_t i = 0; i < nEvents; ++i) { + wrEnergy = rnd.Rndm(); + chksumWrite += wrEnergy; + ntuple->Fill(); +@@ -195,8 +195,8 @@ TEST(RNTuple, LargeFile2) + + TRandom3 rnd(42); + double chksumWrite = 0.0; +- constexpr unsigned long nEvents = 1024 * 1024 * 256; // Exceed 2GB file size +- for (unsigned int i = 0; i < nEvents; ++i) { ++ constexpr std::uint64_t nEvents = 1024 * 1024 * 256; // Exceed 2GB file size ++ for (std::uint64_t i = 0; i < nEvents; ++i) { + *E = rnd.Rndm(); + chksumWrite += *E; + writer->Fill(); diff --git a/root-fontconfig.patch b/root-fontconfig.patch index 4e5e607..e19c4b4 100644 --- a/root-fontconfig.patch +++ b/root-fontconfig.patch @@ -1,27 +1,7 @@ -From 4d450f306a8ab8220f43675c70f399d89e5a4a03 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Sat, 11 May 2024 20:09:47 +0200 -Subject: [PATCH] Use system fonts via fontconfig - ---- - core/base/src/TApplication.cxx | 11 +- - graf2d/asimage/CMakeLists.txt | 1 + - graf2d/asimage/src/TASImage.cxx | 91 +++++++- - graf2d/graf/CMakeLists.txt | 1 + - graf2d/graf/inc/TTF.h | 3 +- - graf2d/graf/src/TTF.cxx | 295 +++++++++++++++++--------- - graf2d/postscript/CMakeLists.txt | 1 + - graf2d/postscript/src/TPostScript.cxx | 106 ++++----- - graf3d/gl/CMakeLists.txt | 1 + - graf3d/gl/src/TGLFontManager.cxx | 123 ++++++++++- - graf3d/gl/src/TGLText.cxx | 56 +++-- - 11 files changed, 495 insertions(+), 194 deletions(-) - -diff --git a/core/base/src/TApplication.cxx b/core/base/src/TApplication.cxx -index f0d2124a8f6..41ad4c73020 100644 ---- a/core/base/src/TApplication.cxx -+++ b/core/base/src/TApplication.cxx -@@ -253,18 +253,12 @@ void TApplication::InitializeGraphics(Bool_t only_web) +diff -ur root-6.28.00.orig/core/base/src/TApplication.cxx root-6.28.00/core/base/src/TApplication.cxx +--- root-6.28.00.orig/core/base/src/TApplication.cxx 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/core/base/src/TApplication.cxx 2023-02-04 12:47:19.757759982 +0100 +@@ -251,18 +251,11 @@ LoadGraphicsLibs(); // Try to load TrueType font renderer. Only try to load if not in batch @@ -34,7 +14,7 @@ index f0d2124a8f6..41ad4c73020 100644 - // Check for use of DFSG - fonts - if (!ttfont) - ttfont = gSystem->Which(ttpath, "FreeSansBold.ttf", kReadPermission); - +- #if !defined(R__WIN32) if (!gROOT->IsBatch() && !strcmp(gVirtualX->GetName(), "X11") && - ttfont && gEnv->GetValue("Root.UseTTFonts", 1)) { @@ -42,7 +22,7 @@ index f0d2124a8f6..41ad4c73020 100644 if (gClassTable->GetDict("TGX11TTF")) { // in principle we should not have linked anything against libGX11TTF // but with ACLiC this can happen, initialize TGX11TTF by hand -@@ -278,7 +272,6 @@ void TApplication::InitializeGraphics(Bool_t only_web) +@@ -276,7 +269,6 @@ } } #endif @@ -50,11 +30,10 @@ index f0d2124a8f6..41ad4c73020 100644 } if (!only_web || !fAppImp) { -diff --git a/graf2d/asimage/CMakeLists.txt b/graf2d/asimage/CMakeLists.txt -index b5ccf983473..8ee57c1fac0 100644 ---- a/graf2d/asimage/CMakeLists.txt -+++ b/graf2d/asimage/CMakeLists.txt -@@ -28,6 +28,7 @@ ROOT_STANDARD_LIBRARY_PACKAGE(ASImage +diff -ur root-6.28.00.orig/graf2d/asimage/CMakeLists.txt root-6.28.00/graf2d/asimage/CMakeLists.txt +--- root-6.28.00.orig/graf2d/asimage/CMakeLists.txt 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf2d/asimage/CMakeLists.txt 2023-02-04 12:47:19.757759982 +0100 +@@ -30,6 +30,7 @@ ${FREETYPE_LIBRARIES} ${X11_LIBRARIES} ZLIB::ZLIB @@ -62,11 +41,10 @@ index b5ccf983473..8ee57c1fac0 100644 DEPENDENCIES Core Graf -diff --git a/graf2d/asimage/src/TASImage.cxx b/graf2d/asimage/src/TASImage.cxx -index 6ea60a78801..e85d804b7ec 100644 ---- a/graf2d/asimage/src/TASImage.cxx -+++ b/graf2d/asimage/src/TASImage.cxx -@@ -117,6 +117,8 @@ extern "C" { +diff -ur root-6.28.00.orig/graf2d/asimage/src/TASImage.cxx root-6.28.00/graf2d/asimage/src/TASImage.cxx +--- root-6.28.00.orig/graf2d/asimage/src/TASImage.cxx 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf2d/asimage/src/TASImage.cxx 2023-02-04 12:47:19.760759989 +0100 +@@ -115,6 +115,8 @@ # include } @@ -75,101 +53,135 @@ index 6ea60a78801..e85d804b7ec 100644 // auxiliary functions for general polygon filling #include "TASPolyUtils.c" -@@ -2620,11 +2622,88 @@ void TASImage::DrawText(Int_t x, Int_t y, const char *text, Int_t size, - // This is for backward compatibility... - if (fn.Last('/') == 0) fn = fn(1, fn.Length() - 1); +@@ -2590,14 +2592,120 @@ + TString fn = font_name; + fn.Strip(); + +- // This is for backward compatibility... +- if (fn.Last('/') == 0) fn = fn(1, fn.Length() - 1); ++ const char *basename = gSystem->BaseName(fn); ++ ++ char *ttfnt = NULL; ++ int ttindex = 0; ++ ++ FcPattern *pat, *match; ++ FcResult result; ++ ++ pat = FcPatternCreate (); ++ ++ if (strcmp(basename, "timesi.ttf") == 0 || ++ strcmp(basename, "FreeSerifItalic.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ } ++ else if (strcmp(basename, "timesbd.ttf") == 0 || ++ strcmp(basename, "FreeSerifBold.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ else if (strcmp(basename, "timesbi.ttf") == 0 || ++ strcmp(basename, "FreeSerifBoldItalic.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ } ++ else if (strcmp(basename, "arial.ttf") == 0 || ++ strcmp(basename, "FreeSans.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ else if (strcmp(basename, "ariali.ttf") == 0 || ++ strcmp(basename, "FreeSansOblique.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ } ++ else if (strcmp(basename, "arialbd.ttf") == 0 || ++ strcmp(basename, "FreeSansBold.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ else if (strcmp(basename, "arialbi.ttf") == 0 || ++ strcmp(basename, "FreeSansBoldOblique.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ } ++ else if (strcmp(basename, "cour.ttf") == 0 || ++ strcmp(basename, "FreeMono.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ else if (strcmp(basename, "couri.ttf") == 0 || ++ strcmp(basename, "FreeMonoOblique.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ } ++ else if (strcmp(basename, "courbd.ttf") == 0 || ++ strcmp(basename, "FreeMonoBold.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ else if (strcmp(basename, "courbi.ttf") == 0 || ++ strcmp(basename, "FreeMonoBoldOblique.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ } ++ else if (strcmp(basename, "symbol.ttf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ else if (strcmp(basename, "times.ttf") == 0 || ++ strcmp(basename, "FreeSerif.otf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ else if (strcmp(basename, "wingding.ttf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ else if (strcmp(basename, "BlackChancery.ttf") == 0) { ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"urwchanceryl"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ } ++ else { ++ Warning("DrawText", "cannot find a font %s", font_name); ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ } ++ ++ FcConfigSubstitute (NULL, pat, FcMatchPattern); ++ FcDefaultSubstitute (pat); ++ match = FcFontMatch (NULL, pat, &result); ++ FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt); ++ FcPatternGetInteger (match, FC_INDEX, 0, &ttindex); - const char *ttpath = gEnv->GetValue("Root.TTFontPath", - TROOT::GetTTFFontDir()); - char *tmpstr = gSystem->Which(ttpath, fn, kReadPermission); - fn = tmpstr; - delete [] tmpstr; -+ const char *basename = gSystem->BaseName(fn); ++ fn = ttfnt; + -+ int ttindex = 0; -+ -+ FcPattern *pat = nullptr, *match; -+ FcResult result; -+ -+ if (strcmp(basename, "timesi.ttf") == 0 || -+ strcmp(basename, "FreeSerifItalic.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:italic"); -+ } -+ else if (strcmp(basename, "timesbd.ttf") == 0 || -+ strcmp(basename, "FreeSerifBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:bold"); -+ } -+ else if (strcmp(basename, "timesbi.ttf") == 0 || -+ strcmp(basename, "FreeSerifBoldItalic.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:bold:italic"); -+ } -+ else if (strcmp(basename, "arial.ttf") == 0 || -+ strcmp(basename, "FreeSans.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans"); -+ } -+ else if (strcmp(basename, "ariali.ttf") == 0 || -+ strcmp(basename, "FreeSansOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:italic"); -+ } -+ else if (strcmp(basename, "arialbd.ttf") == 0 || -+ strcmp(basename, "FreeSansBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:bold"); -+ } -+ else if (strcmp(basename, "arialbi.ttf") == 0 || -+ strcmp(basename, "FreeSansBoldOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:bold:italic"); -+ } -+ else if (strcmp(basename, "cour.ttf") == 0 || -+ strcmp(basename, "FreeMono.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono"); -+ } -+ else if (strcmp(basename, "couri.ttf") == 0 || -+ strcmp(basename, "FreeMonoOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:italic"); -+ } -+ else if (strcmp(basename, "courbd.ttf") == 0 || -+ strcmp(basename, "FreeMonoBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:bold"); -+ } -+ else if (strcmp(basename, "courbi.ttf") == 0 || -+ strcmp(basename, "FreeMonoBoldOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:bold:italic"); -+ } -+ else if (strcmp(basename, "symbol.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "standardsymbolsps"); -+ } -+ else if (strcmp(basename, "times.ttf") == 0 || -+ strcmp(basename, "FreeSerif.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif"); -+ } -+ else if (strcmp(basename, "wingding.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "dingbats"); -+ } -+ else if (strcmp(basename, "BlackChancery.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "urwchanceryl"); -+ } -+ else if (gSystem->AccessPathName(fn, kReadPermission) != 0) { -+ // Font name is not a file - usae as pattern -+ pat = FcNameParse ((const FcChar8*) fn.Data()); -+ } -+ -+ if (pat) { -+ FcConfigSubstitute (nullptr, pat, FcMatchPattern); -+ FcDefaultSubstitute (pat); -+ match = FcFontMatch (nullptr, pat, &result); -+ if (match) { -+ char *ttfnt; -+ FcPatternGetString (match, FC_FILE, 0, (FcChar8**) &ttfnt); -+ fn = ttfnt; -+ FcPatternGetInteger (match, FC_INDEX, 0, &ttindex); -+ FcPatternDestroy (match); -+ } -+ FcPatternDestroy (pat); -+ } ++ FcPatternDestroy (match); ++ FcPatternDestroy (pat); if (fn.EndsWith(".pfa") || fn.EndsWith(".PFA") || fn.EndsWith(".pfb") || fn.EndsWith(".PFB") || fn.EndsWith(".ttf") || fn.EndsWith(".TTF") || fn.EndsWith(".otf") || fn.EndsWith(".OTF")) { ttfont = kTRUE; -@@ -2648,7 +2727,7 @@ void TASImage::DrawText(Int_t x, Int_t y, const char *text, Int_t size, +@@ -2621,14 +2729,11 @@ return; } @@ -177,12 +189,20 @@ index 6ea60a78801..e85d804b7ec 100644 + ASFont *font = get_asfont(gFontManager, fn.Data(), ttindex, size, ASF_GuessWho); if (!font) { - font = get_asfont(gFontManager, "fixed", 0, size, ASF_GuessWho); -diff --git a/graf2d/graf/CMakeLists.txt b/graf2d/graf/CMakeLists.txt -index d7d1b77c21a..c4ebb994a4a 100644 ---- a/graf2d/graf/CMakeLists.txt -+++ b/graf2d/graf/CMakeLists.txt -@@ -91,6 +91,7 @@ ROOT_STANDARD_LIBRARY_PACKAGE(Graf +- font = get_asfont(gFontManager, "fixed", 0, size, ASF_GuessWho); +- if (!font) { +- Warning("DrawText", "cannot find a font %s", font_name); +- return; +- } ++ Warning("DrawText", "cannot find a font %s", font_name); ++ return; + } + + get_text_size(text, font, (ASText3DType)type, &width, &height); +diff -ur root-6.28.00.orig/graf2d/graf/CMakeLists.txt root-6.28.00/graf2d/graf/CMakeLists.txt +--- root-6.28.00.orig/graf2d/graf/CMakeLists.txt 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf2d/graf/CMakeLists.txt 2023-02-04 12:47:19.861760233 +0100 +@@ -91,6 +91,7 @@ ${FREETYPE_LIBRARIES} ZLIB::ZLIB mathtext @@ -190,27 +210,24 @@ index d7d1b77c21a..c4ebb994a4a 100644 DEPENDENCIES Hist Matrix -diff --git a/graf2d/graf/inc/TTF.h b/graf2d/graf/inc/TTF.h -index 864ce06b4f0..050796d1ded 100644 ---- a/graf2d/graf/inc/TTF.h -+++ b/graf2d/graf/inc/TTF.h -@@ -76,9 +76,10 @@ protected: +diff -ur root-6.28.00.orig/graf2d/graf/inc/TTF.h root-6.28.00/graf2d/graf/inc/TTF.h +--- root-6.28.00.orig/graf2d/graf/inc/TTF.h 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf2d/graf/inc/TTF.h 2023-02-04 12:47:19.862760235 +0100 +@@ -76,9 +76,8 @@ static FT_BBox fgCBox; ///< string control box static FT_CharMap fgCharMap[kTTMaxFonts]; ///< font character map static Int_t fgCurFontIdx; ///< current font index - static Int_t fgSymbItaFontIdx; ///< Symbol italic font index static Int_t fgFontCount; ///< number of fonts loaded - static char *fgFontName[kTTMaxFonts]; ///< font name -+ static Int_t fgFontIdx[kTTMaxFonts]; ///< font index in font file -+ static Int_t fgFontIta[kTTMaxFonts]; ///< font slanted using transform +- static char *fgFontName[kTTMaxFonts]; ///< font name ++ static Int_t fgFontID[kTTMaxFonts]; ///< font ID static FT_Face fgFace[kTTMaxFonts]; ///< font face static TTF::TTGlyph fgGlyphs[kMaxGlyphs]; ///< glyphs static Bool_t fgHinting; ///< use hinting (true by default) -diff --git a/graf2d/graf/src/TTF.cxx b/graf2d/graf/src/TTF.cxx -index 758bb98c192..c90d0ac70a9 100644 ---- a/graf2d/graf/src/TTF.cxx -+++ b/graf2d/graf/src/TTF.cxx -@@ -25,6 +25,8 @@ Interface to the freetype 2 library. +diff -ur root-6.28.00.orig/graf2d/graf/src/TTF.cxx root-6.28.00/graf2d/graf/src/TTF.cxx +--- root-6.28.00.orig/graf2d/graf/src/TTF.cxx 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf2d/graf/src/TTF.cxx 2023-02-04 12:47:19.863760238 +0100 +@@ -25,6 +25,8 @@ #include "TMath.h" #include "TError.h" @@ -219,184 +236,201 @@ index 758bb98c192..c90d0ac70a9 100644 // to scale fonts to the same size as the old TT version const Float_t kScale = 0.93376068; -@@ -38,10 +40,11 @@ Int_t TTF::fgTBlankW = 0; +@@ -38,10 +40,9 @@ Int_t TTF::fgWidth = 0; Int_t TTF::fgAscent = 0; Int_t TTF::fgCurFontIdx = -1; -Int_t TTF::fgSymbItaFontIdx = -1; Int_t TTF::fgFontCount = 0; Int_t TTF::fgNumGlyphs = 0; - char *TTF::fgFontName[kTTMaxFonts]; -+Int_t TTF::fgFontIdx[kTTMaxFonts]; -+Int_t TTF::fgFontIta[kTTMaxFonts]; +-char *TTF::fgFontName[kTTMaxFonts]; ++Int_t TTF::fgFontID[kTTMaxFonts]; FT_Matrix *TTF::fgRotMatrix = nullptr; FT_Library TTF::fgLibrary; FT_BBox TTF::fgCBox; -@@ -71,6 +74,11 @@ void TTF::Init() +@@ -72,6 +73,11 @@ return; } + // Add root's font directory + const char *ttpath = gEnv->GetValue("Root.TTFontPath", + TROOT::GetTTFFontDir()); -+ FcConfigAppFontAddDir (nullptr, (const FcChar8*)ttpath); ++ FcConfigAppFontAddDir (NULL, (const FcChar8*)ttpath); + // load default font (arialbd) SetTextFont(62); } -@@ -108,12 +116,15 @@ Short_t TTF::CharToUnicode(UInt_t code) +@@ -84,7 +90,6 @@ + if (!fgInit) return; + + for (int i = 0; i < fgFontCount; i++) { +- delete [] fgFontName[i]; + FT_Done_Face(fgFace[i]); + } + if (fgRotMatrix) delete fgRotMatrix; +@@ -109,12 +114,19 @@ charmap = fgFace[fgCurFontIdx]->charmaps[i]; platform = charmap->platform_id; encoding = charmap->encoding_id; - if ((platform == 3 && encoding == 1) || + if ((platform == 3 && encoding == 1 && -+ (fgFontIta[fgCurFontIdx] & 2) == 0) || ++ (fgFontID[fgCurFontIdx] != 12 && ++ fgFontID[fgCurFontIdx] != 14 && ++ fgFontID[fgCurFontIdx] != 15)) || (platform == 0 && encoding == 0) || + (platform == 7 && encoding == 2 && -+ (fgFontIta[fgCurFontIdx] & 2) != 0) || -+ (platform == 0 && encoding == 3 && -+ (fgFontIta[fgCurFontIdx] & 2) != 0) || ++ (fgFontID[fgCurFontIdx] == 12 || ++ fgFontID[fgCurFontIdx] == 14 || ++ fgFontID[fgCurFontIdx] == 15)) || (platform == 1 && encoding == 0 && - !strcmp(fgFontName[fgCurFontIdx], "wingding.ttf")) || - (platform == 1 && encoding == 0 && - !strcmp(fgFontName[fgCurFontIdx], "symbol.ttf"))) -+ (fgFontIta[fgCurFontIdx] & 2) != 0)) ++ (fgFontID[fgCurFontIdx] == 12 || ++ fgFontID[fgCurFontIdx] == 14 || ++ fgFontID[fgCurFontIdx] == 15))) { fgCharMap[fgCurFontIdx] = charmap; if (FT_Set_Charmap(fgFace[fgCurFontIdx], fgCharMap[fgCurFontIdx])) -@@ -392,21 +403,145 @@ Int_t TTF::SetTextFont(const char *fontname, Int_t italic) +@@ -381,27 +393,147 @@ + + if (!fontname || !fontname[0]) { + Warning("TTF::SetTextFont", +- "no font name specified, using default font %s", fgFontName[0]); ++ "no font name specified, using default font"); + fgCurFontIdx = 0; + return 0; } const char *basename = gSystem->BaseName(fontname); -+ char *ttfont = nullptr; -+ int ttindex = 0; -+ -+ FcPattern *pat = nullptr, *match; -+ FcResult result; -+ + if (strcmp(basename, "timesi.ttf") == 0 || + strcmp(basename, "FreeSerifItalic.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:italic"); ++ SetTextFont(12); + } + else if (strcmp(basename, "timesbd.ttf") == 0 || + strcmp(basename, "FreeSerifBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:bold"); ++ SetTextFont(22); + } + else if (strcmp(basename, "timesbi.ttf") == 0 || + strcmp(basename, "FreeSerifBoldItalic.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:bold:italic"); ++ SetTextFont(32); + } + else if (strcmp(basename, "arial.ttf") == 0 || + strcmp(basename, "FreeSans.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans"); ++ SetTextFont(42); + } + else if (strcmp(basename, "ariali.ttf") == 0 || + strcmp(basename, "FreeSansOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:italic"); ++ SetTextFont(52); + } + else if (strcmp(basename, "arialbd.ttf") == 0 || + strcmp(basename, "FreeSansBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:bold"); ++ SetTextFont(62); + } + else if (strcmp(basename, "arialbi.ttf") == 0 || + strcmp(basename, "FreeSansBoldOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:bold:italic"); ++ SetTextFont(72); + } + else if (strcmp(basename, "cour.ttf") == 0 || + strcmp(basename, "FreeMono.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono"); ++ SetTextFont(82); + } + else if (strcmp(basename, "couri.ttf") == 0 || + strcmp(basename, "FreeMonoOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:italic"); ++ SetTextFont(92); + } + else if (strcmp(basename, "courbd.ttf") == 0 || + strcmp(basename, "FreeMonoBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:bold"); ++ SetTextFont(102); + } + else if (strcmp(basename, "courbi.ttf") == 0 || + strcmp(basename, "FreeMonoBoldOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:bold:italic"); ++ SetTextFont(112); + } + else if (strcmp(basename, "symbol.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "standardsymbolsps"); -+ italic &= 2; ++ if (italic) ++ SetTextFont(152); ++ else ++ SetTextFont(122); + } + else if (strcmp(basename, "times.ttf") == 0 || + strcmp(basename, "FreeSerif.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif"); ++ SetTextFont(132); + } + else if (strcmp(basename, "wingding.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "dingbats"); -+ italic &= 2; ++ SetTextFont(142); + } + else if (strcmp(basename, "STIXGeneral.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixgeneral"); ++ SetTextFont(162); + } + else if (strcmp(basename, "STIXGeneralItalic.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixgeneral:italic"); ++ SetTextFont(172); + } + else if (strcmp(basename, "STIXGeneralBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixgeneral:bold"); ++ SetTextFont(182); + } + else if (strcmp(basename, "STIXGeneralBolIta.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixgeneral:bold:italic"); ++ SetTextFont(192); + } + else if (strcmp(basename, "STIXSiz1Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize1"); ++ SetTextFont(202); + } + else if (strcmp(basename, "STIXSiz1SymBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize1:bold"); ++ SetTextFont(212); + } + else if (strcmp(basename, "STIXSiz2Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize2"); ++ SetTextFont(222); + } + else if (strcmp(basename, "STIXSiz2SymBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize2:bold"); ++ SetTextFont(232); + } + else if (strcmp(basename, "STIXSiz3Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize3"); ++ SetTextFont(242); + } + else if (strcmp(basename, "STIXSiz3SymBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize3:bold"); ++ SetTextFont(252); + } + else if (strcmp(basename, "STIXSiz4Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize4"); ++ SetTextFont(262); + } + else if (strcmp(basename, "STIXSiz4SymBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize4:bold"); ++ SetTextFont(272); + } + else if (strcmp(basename, "STIXSiz5Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize5"); ++ SetTextFont(282); + } + else if (strcmp(basename, "DroidSansFallback.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "droidsansfallback:charset=4e00 0410"); ++ SetTextFont(292); + } -+ else if (strcmp(basename, "BlackChancery.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "urwchanceryl"); -+ } -+ else if (gSystem->AccessPathName(fontname, kReadPermission) != 0) { -+ // Font name is not a file - usae as pattern -+ pat = FcNameParse ((const FcChar8*) fontname); -+ } -+ -+ if (pat) { -+ FcConfigSubstitute (nullptr, pat, FcMatchPattern); -+ FcDefaultSubstitute (pat); -+ match = FcFontMatch (nullptr, pat, &result); -+ if (match) { -+ const char *ttfnt; -+ FcPatternGetString (match, FC_FILE, 0, (FcChar8**) &ttfnt); -+ ttfont = StrDup(ttfnt); -+ FcPatternGetInteger (match, FC_INDEX, 0, &ttindex); -+ FcPatternDestroy (match); ++ else { ++ Error("TTF::SetTextFont", "font %s not known to ROOT", basename); ++ if (fgFontCount) { ++ Warning("TTF::SetTextFont", "using default font"); ++ fgCurFontIdx = 0; // use font 0 (default font, set in ctor) ++ return 0; ++ } else { ++ return 1; + } -+ FcPatternDestroy (pat); + } + -+ if (!ttfont) ttfont = StrDup(fontname); ++ return 0; ++} + -+ basename = gSystem->BaseName(ttfont); ++//______________________________________________________________________________ ++void TTF::SetTextFont(Font_t fontnumber) ++{ ++ int fontid = fontnumber / 10; ++ if (fontid < 0 || fontid > 31) fontid = 0; ++ ++ Int_t italic = 0; ++ if (fontid==15) italic = 1; ++ ++ if (!fgInit) Init(); ++ ++ if (fontid == 0) { ++ fgCurFontIdx = 0; // use font 0 (default font, set in ctor) ++ return; ++ } + // check if font is in cache int i; @@ -413,30 +447,32 @@ index 758bb98c192..c90d0ac70a9 100644 - return 0; - } - } -+ if (!strcmp(fgFontName[i], basename) && -+ (fgFontIdx[i] == ttindex) && -+ (fgFontIta[i] == italic)) { ++ if (fgFontID[i] == fontid) { + fgCurFontIdx = i; -+ delete [] ttfont; -+ return 0; ++ return; } } -@@ -416,28 +551,13 @@ Int_t TTF::SetTextFont(const char *fontname, Int_t italic) +@@ -409,151 +541,215 @@ + if (fgFontCount >= kTTMaxFonts) { + Error("TTF::SetTextFont", "too many fonts opened (increase kTTMaxFont = %d)", kTTMaxFonts); - Warning("TTF::SetTextFont", "using default font %s", fgFontName[0]); +- Warning("TTF::SetTextFont", "using default font %s", fgFontName[0]); ++ Warning("TTF::SetTextFont", "using default font"); fgCurFontIdx = 0; // use font 0 (default font, set in ctor) -+ delete [] ttfont; - return 0; +- return 0; ++ return; } - // try to load font (font must be in Root.TTFontPath resource) - const char *ttpath = gEnv->GetValue("Root.TTFontPath", - TROOT::GetTTFFontDir()); - char *ttfont = gSystem->Which(ttpath, fontname, kReadPermission); -- ++ char *ttfont = NULL; ++ int ttindex = 0; + - if (!ttfont) { -- Error("TTF::SetTextFont", "font file %s not found in path %s", fontname, ttpath); +- Error("TTF::SetTextFont", "font file %s not found in path", fontname); - if (fgFontCount) { - Warning("TTF::SetTextFont", "using default font %s", fgFontName[0]); - fgCurFontIdx = 0; // use font 0 (default font, set in ctor) @@ -444,8 +480,180 @@ index 758bb98c192..c90d0ac70a9 100644 - } else { - return 1; - } -- } -- ++ FcPattern *pat, *match; ++ FcCharSet *set = NULL; ++ FcResult result; ++ ++ pat = FcPatternCreate (); ++ ++ switch (fontid) { ++ case 1: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 2: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 3: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 4: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 5: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 6: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 7: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 8: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 9: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 10: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 11: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 12: ++ case 15: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 13: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 14: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 16: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 17: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 18: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 19: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 20: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 21: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 22: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 23: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 24: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 25: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 26: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 27: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 28: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize5"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 29: ++ case 30: ++ case 31: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"droidsansfallback"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ set = FcCharSetCreate (); ++ FcCharSetAddChar (set, 0x0410); // Cyrillic ++ FcCharSetAddChar (set, 0x4e00); // CJK ++ FcPatternAddCharSet (pat, FC_CHARSET, set); ++ break; ++ default: ++ Error("TTF::SetTextFont", "font %i not known to ROOT", fontid); ++ FcPatternDestroy (pat); ++ Warning("TTF::SetTextFont", "using default font"); ++ fgCurFontIdx = 0; // use font 0 (default font, set in ctor) ++ return; ++ break; + } + ++ FcConfigSubstitute (NULL, pat, FcMatchPattern); ++ FcDefaultSubstitute (pat); ++ match = FcFontMatch (NULL, pat, &result); ++ char *ttfnt; ++ FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt); ++ ttfont = StrDup (ttfnt); ++ FcPatternGetInteger (match, FC_INDEX, 0, &ttindex); ++ FcPatternDestroy (match); ++ FcPatternDestroy (pat); ++ if (set) FcCharSetDestroy (set); ++ FT_Face tface = (FT_Face) 0; - if (FT_New_Face(fgLibrary, ttfont, 0, &tface)) { @@ -453,41 +661,64 @@ index 758bb98c192..c90d0ac70a9 100644 Error("TTF::SetTextFont", "error loading font %s", ttfont); delete [] ttfont; if (tface) FT_Done_Face(tface); -@@ -450,24 +570,25 @@ Int_t TTF::SetTextFont(const char *fontname, Int_t italic) - } +- if (fgFontCount) { +- Warning("TTF::SetTextFont", "using default font %s", fgFontName[0]); +- fgCurFontIdx = 0; +- return 0; +- } else { +- return 1; +- } ++ Warning("TTF::SetTextFont", "using default font"); ++ fgCurFontIdx = 0; ++ return; } -- delete [] ttfont; -- - fgFontName[fgFontCount] = StrDup(basename); -+ fgFontIdx[fgFontCount] = ttindex; -+ fgFontIta[fgFontCount] = italic; + delete [] ttfont; + +- fgFontName[fgFontCount] = StrDup(basename); ++ fgFontID[fgFontCount] = fontid; fgCurFontIdx = fgFontCount; fgFace[fgCurFontIdx] = tface; fgCharMap[fgCurFontIdx] = (FT_CharMap) 0; fgFontCount++; -- if (italic) { + if (italic) { - fgSymbItaFontIdx = fgCurFontIdx; -+ if ((italic & 1) != 0) { FT_Matrix slantMat; slantMat.xx = (1 << 16); slantMat.xy = ((1 << 16) >> 2); slantMat.yx = 0; slantMat.yy = (1 << 16); - FT_Set_Transform( fgFace[fgSymbItaFontIdx], &slantMat, NULL ); -+ FT_Set_Transform( fgFace[fgCurFontIdx], &slantMat, nullptr ); - } - -+ delete [] ttfont; -+ - return 0; - } - -@@ -494,70 +615,50 @@ Int_t TTF::SetTextFont(const char *fontname, Int_t italic) - - void TTF::SetTextFont(Font_t fontnumber) - { +- } +- +- return 0; +-} +- +-//////////////////////////////////////////////////////////////////////////////// +-/// Set specified font. +-/// List of the currently supported fonts (screen and PostScript) +-/// +-/// | Font ID | X11 | TTF | +-/// |---------|---------------------------|------------------| +-/// | 1 | times-medium-i-normal | timesi.ttf | +-/// | 2 | times-bold-r-normal | timesbd.ttf | +-/// | 3 | times-bold-i-normal | timesbi.ttf | +-/// | 4 | helvetica-medium-r-normal | arial.ttf | +-/// | 5 | helvetica-medium-o-normal | ariali.ttf | +-/// | 6 | helvetica-bold-r-normal | arialbd.ttf | +-/// | 7 | helvetica-bold-o-normal | arialbi.ttf | +-/// | 8 | courier-medium-r-normal | cour.ttf | +-/// | 9 | courier-medium-o-normal | couri.ttf | +-/// | 10 | courier-bold-r-normal | courbd.ttf | +-/// | 11 | courier-bold-o-normal | courbi.ttf | +-/// | 12 | symbol-medium-r-normal | symbol.ttf | +-/// | 13 | times-medium-r-normal | times.ttf | +-/// | 14 | | wingding.ttf | +-/// | 15 | symbol oblique is emulated from symbol.ttf | | +- +-void TTF::SetTextFont(Font_t fontnumber) +-{ - // Added by cholm for use of DFSG - fonts - based on Kevins fix. - // Table of Microsoft and (for non-MSFT operating systems) backup - // FreeFont TTF fonts. @@ -496,10 +727,10 @@ index 758bb98c192..c90d0ac70a9 100644 - { "Root.TTFont.1", "FreeSerifItalic.otf" }, - { "Root.TTFont.2", "FreeSerifBold.otf" }, - { "Root.TTFont.3", "FreeSerifBoldItalic.otf" }, -- { "Root.TTFont.4", "texgyreheros-regular.otf" }, -- { "Root.TTFont.5", "texgyreheros-italic.otf" }, -- { "Root.TTFont.6", "texgyreheros-bold.otf" }, -- { "Root.TTFont.7", "texgyreheros-bolditalic.otf" }, +- { "Root.TTFont.4", "FreeSans.otf" }, +- { "Root.TTFont.5", "FreeSansOblique.otf" }, +- { "Root.TTFont.6", "FreeSansBold.otf" }, +- { "Root.TTFont.7", "FreeSansBoldOblique.otf" }, - { "Root.TTFont.8", "FreeMono.otf" }, - { "Root.TTFont.9", "FreeMonoOblique.otf" }, - { "Root.TTFont.10", "FreeMonoBold.otf" }, @@ -524,47 +755,14 @@ index 758bb98c192..c90d0ac70a9 100644 - { "Root.TTFont.ME", "DroidSansFallback.ttf" }, - { "Root.TTFont.CJKMing", "DroidSansFallback.ttf" }, - { "Root.TTFont.CJKGothic", "DroidSansFallback.ttf" } -+ static const char *fonttable[] = { -+ "freesans:bold", -+ "freeserif:italic", -+ "freeserif:bold", -+ "freeserif:bold:italic", -+ "freesans", -+ "freesans:italic", -+ "freesans:bold", -+ "freesans:bold:italic", -+ "freemono", -+ "freemono:italic", -+ "freemono:bold", -+ "freemono:bold:italic", -+ "standardsymbolsps", -+ "freeserif", -+ "dingbats", -+ "standardsymbolsps", -+ "stixgeneral", -+ "stixgeneral:italic", -+ "stixgeneral:bold", -+ "stixgeneral:bold:italic", -+ "stixsize1", -+ "stixsize1:bold", -+ "stixsize2", -+ "stixsize2:bold", -+ "stixsize3", -+ "stixsize3:bold", -+ "stixsize4", -+ "stixsize4:bold", -+ "stixsize5", -+ "droidsansfallback:charset=4e00 0410", -+ "droidsansfallback:charset=4e00 0410", -+ "droidsansfallback:charset=4e00 0410" - }; - +- }; +- - static int fontset = -1; - int thisset = fontset; - - int fontid = fontnumber / 10; - if (fontid < 0 || fontid > 31) fontid = 0; - +- int fontid = fontnumber / 10; +- if (fontid < 0 || fontid > 31) fontid = 0; +- - if (thisset == -1) { - // try to load font (font must be in Root.TTFontPath resource) - // to see which fontset we have available @@ -578,26 +776,21 @@ index 758bb98c192..c90d0ac70a9 100644 - // try backup free font - thisset = 1; - } -- } - Int_t italic = 0; ++ FT_Set_Transform( fgFace[fgCurFontIdx], &slantMat, NULL ); + } +- Int_t italic = 0; - if (fontid==15) italic = 1; - int ret = SetTextFont(gEnv->GetValue(fonttable[fontid][thisset], fonttable[fontid][1]), italic); - // Do not define font set is we're loading the symbol.ttf - it's - // the same in both cases. - if (ret == 0 && fontid != 12) fontset = thisset; -+ if (fontid==12) italic = 2; -+ if (fontid==14) italic = 2; -+ if (fontid==15) italic = 3; -+ -+ SetTextFont(fonttable[fontid], italic); } //////////////////////////////////////////////////////////////////////////////// -diff --git a/graf2d/postscript/CMakeLists.txt b/graf2d/postscript/CMakeLists.txt -index eb091bbb396..a05023a3f41 100644 ---- a/graf2d/postscript/CMakeLists.txt -+++ b/graf2d/postscript/CMakeLists.txt -@@ -27,6 +27,7 @@ ROOT_STANDARD_LIBRARY_PACKAGE(Postscript +diff -ur root-6.28.00.orig/graf2d/postscript/CMakeLists.txt root-6.28.00/graf2d/postscript/CMakeLists.txt +--- root-6.28.00.orig/graf2d/postscript/CMakeLists.txt 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf2d/postscript/CMakeLists.txt 2023-02-04 12:47:19.863760238 +0100 +@@ -27,6 +27,7 @@ LIBRARIES ZLIB::ZLIB mathtext @@ -605,11 +798,10 @@ index eb091bbb396..a05023a3f41 100644 DEPENDENCIES Graf ) -diff --git a/graf2d/postscript/src/TPostScript.cxx b/graf2d/postscript/src/TPostScript.cxx -index df9e3ae16ea..1e353e1ca53 100644 ---- a/graf2d/postscript/src/TPostScript.cxx -+++ b/graf2d/postscript/src/TPostScript.cxx -@@ -234,6 +234,7 @@ To change the color model use `gStyle->SetColorModelPS(c)`. +diff -ur root-6.28.00.orig/graf2d/postscript/src/TPostScript.cxx root-6.28.00/graf2d/postscript/src/TPostScript.cxx +--- root-6.28.00.orig/graf2d/postscript/src/TPostScript.cxx 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf2d/postscript/src/TPostScript.cxx 2023-02-04 12:47:19.864760240 +0100 +@@ -234,6 +234,7 @@ #include #include #include @@ -617,7 +809,7 @@ index df9e3ae16ea..1e353e1ca53 100644 #include "strlcpy.h" #include "snprintf.h" -@@ -1584,56 +1585,60 @@ Bool_t TPostScript::FontEmbedType42(const char *filename) +@@ -1585,56 +1586,179 @@ void TPostScript::FontEmbed(void) { @@ -654,41 +846,8 @@ index df9e3ae16ea..1e353e1ca53 100644 - { "Root.TTFont.ME", "DroidSansFallback.ttf" }, - { "Root.TTFont.CJKMing", "DroidSansFallback.ttf" }, - { "Root.TTFont.CJKCothic", "DroidSansFallback.ttf" } -+ static const char *fonttable[] = { -+ "freesans:bold", -+ "freeserif:italic", -+ "freeserif:bold", -+ "freeserif:bold:italic", -+ "freesans", -+ "freesans:italic", -+ "freesans:bold", -+ "freesans:bold:italic", -+ "freemono", -+ "freemono:italic", -+ "freemono:bold", -+ "freemono:bold:italic", -+ "standardsymbolsps", -+ "freeserif", -+ "dingbats", -+ "standardsymbolsps", -+ "stixgeneral", -+ "stixgeneral:italic", -+ "stixgeneral:bold", -+ "stixgeneral:bold:italic", -+ "stixsize1", -+ "stixsize1:bold", -+ "stixsize2", -+ "stixsize2:bold", -+ "stixsize3", -+ "stixsize3:bold", -+ "stixsize4", -+ "stixsize4:bold", -+ "stixsize5", -+ "droidsansfallback:charset=4e00 0410", -+ "droidsansfallback:charset=4e00 0410", -+ "droidsansfallback:charset=4e00 0410" - }; - +- }; +- PrintStr("%%IncludeResource: ProcSet (FontSetInit)@"); - // try to load font (font must be in Root.TTFontPath resource) @@ -700,28 +859,182 @@ index df9e3ae16ea..1e353e1ca53 100644 - const char *filename = gEnv->GetValue( - fonttable[fontid][0], fonttable[fontid][1]); - char *ttfont = gSystem->Which(ttpath, filename, kReadPermission); -+ char *ttfont = nullptr; ++ ++ char *ttfont = NULL; + + FcPattern *pat, *match; ++ FcCharSet *set = NULL; + FcResult result; + -+ pat = FcNameParse ((const FcChar8*) fonttable[fontid]); ++ pat = FcPatternCreate (); + -+ FcConfigSubstitute (nullptr, pat, FcMatchPattern); ++ switch (fontid) { ++ case 1: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 2: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 3: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 4: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 5: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 6: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 7: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 8: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 9: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 10: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 11: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 12: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 13: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 14: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 16: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 17: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 18: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 19: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 20: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 21: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 22: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 23: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 24: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 25: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 26: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 27: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 28: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize5"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 29: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"droidsansfallback"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ set = FcCharSetCreate (); ++ FcCharSetAddChar (set, 0x0410); // Cyrillic ++ FcCharSetAddChar (set, 0x4e00); // CJK ++ FcPatternAddCharSet (pat, FC_CHARSET, set); ++ break; ++ } ++ ++ FcConfigSubstitute (NULL, pat, FcMatchPattern); + FcDefaultSubstitute (pat); -+ match = FcFontMatch (nullptr, pat, &result); -+ FcPatternGetString (match, FC_FILE, 0, (FcChar8**) &ttfont); ++ match = FcFontMatch (NULL, pat, &result); ++ char *ttfnt; ++ FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt); ++ ttfont = StrDup(ttfnt); ++ FcPatternDestroy (match); ++ FcPatternDestroy (pat); ++ if (set) FcCharSetDestroy (set); + if (!ttfont) { - Error("TPostScript::FontEmbed", - "font %d (filename `%s') not found in path", - fontid, filename); -+ Error("TPostScript::FontEmbed", "font %d not found", ++ Error("TPostScript::FontEmbed", "font %d not found in path", + fontid); } else { if (FontEmbedType2(ttfont)) { // nothing -@@ -1642,12 +1647,13 @@ void TPostScript::FontEmbed(void) +@@ -1643,9 +1767,8 @@ } else if(FontEmbedType42(ttfont)) { // nothing } else { @@ -731,15 +1044,9 @@ index df9e3ae16ea..1e353e1ca53 100644 + Error("TPostScript::FontEmbed", "failed to embed font %d)", + fontid); } -- delete [] ttfont; + delete [] ttfont; } -+ -+ FcPatternDestroy (match); -+ FcPatternDestroy (pat); - } - } - PrintStr("%%IncludeResource: font Times-Roman@"); -@@ -2836,10 +2842,10 @@ void TPostScript::Text(Double_t xx, Double_t yy, const wchar_t *chars) +@@ -2837,10 +2960,10 @@ { "Root.PSFont.9", "/FreeMonoOblique" }, { "Root.PSFont.10", "/FreeMonoBold" }, { "Root.PSFont.11", "/FreeMonoBoldOblique" }, @@ -753,11 +1060,10 @@ index df9e3ae16ea..1e353e1ca53 100644 { "Root.PSFont.STIXGen", "/STIXGeneral" }, { "Root.PSFont.STIXGenIt", "/STIXGeneral-Italic" }, { "Root.PSFont.STIXGenBd", "/STIXGeneral-Bold" }, -diff --git a/graf3d/gl/CMakeLists.txt b/graf3d/gl/CMakeLists.txt -index e759473ca0f..c453397fc52 100644 ---- a/graf3d/gl/CMakeLists.txt -+++ b/graf3d/gl/CMakeLists.txt -@@ -211,6 +211,7 @@ ROOT_STANDARD_LIBRARY_PACKAGE(RGL +diff -ur root-6.28.00.orig/graf3d/gl/CMakeLists.txt root-6.28.00/graf3d/gl/CMakeLists.txt +--- root-6.28.00.orig/graf3d/gl/CMakeLists.txt 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf3d/gl/CMakeLists.txt 2023-02-04 12:47:19.867760247 +0100 +@@ -208,6 +208,7 @@ ${GL2PS_LIBRARIES} ${X11_LIBRARIES} RGlew @@ -765,10 +1071,9 @@ index e759473ca0f..c453397fc52 100644 DEPENDENCIES Hist Gui -diff --git a/graf3d/gl/src/TGLFontManager.cxx b/graf3d/gl/src/TGLFontManager.cxx -index 58ea1188d59..647642de615 100644 ---- a/graf3d/gl/src/TGLFontManager.cxx -+++ b/graf3d/gl/src/TGLFontManager.cxx +diff -ur root-6.28.00.orig/graf3d/gl/src/TGLFontManager.cxx root-6.28.00/graf3d/gl/src/TGLFontManager.cxx +--- root-6.28.00.orig/graf3d/gl/src/TGLFontManager.cxx 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf3d/gl/src/TGLFontManager.cxx 2023-02-04 12:47:19.867760247 +0100 @@ -36,6 +36,7 @@ # include "FTGLBitmapFont.h" #endif @@ -777,7 +1082,16 @@ index 58ea1188d59..647642de615 100644 /** \class TGLFont \ingroup opengl -@@ -448,16 +449,120 @@ void TGLFontManager::RegisterFont(Int_t sizeIn, Int_t fileID, TGLFont::EMode mod +@@ -419,7 +420,7 @@ + ClassImp(TGLFontManager); + + TObjArray TGLFontManager::fgFontFileArray; +-Int_t TGLFontManager::fgExtendedFontStart; ++Int_t TGLFontManager::fgExtendedFontStart = 0; + TGLFontManager::FontSizeVec_t TGLFontManager::fgFontSizeArray; + Bool_t TGLFontManager::fgStaticInitDone = kFALSE; + +@@ -450,17 +451,175 @@ FontMap_i it = fFontMap.find(TGLFont(size, fileID, mode)); if (it == fFontMap.end()) { @@ -790,127 +1104,234 @@ index 58ea1188d59..647642de615 100644 - ((TObjString*)fgFontFileArray[fileID])->String()); - file = fp; - delete [] fp; -+ TString file; ++ char *file = NULL; ++ int ttindex = 0; + -+ TString fontname = fileID < fgExtendedFontStart ? -+ ((TObjString*)fgFontFileArray[fileID])->String() + ".ttf" : -+ ((TObjString*)fgFontFileArray[fileID])->String(); -+ -+ FcPattern *pat = nullptr, *match; ++ FcPattern *pat, *match; ++ FcCharSet *set = NULL; + FcResult result; + -+ if (strcmp(fontname, "timesi.ttf") == 0 || -+ strcmp(fontname, "FreeSerifItalic.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:italic"); -+ } -+ else if (strcmp(fontname, "timesbd.ttf") == 0 || -+ strcmp(fontname, "FreeSerifBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:bold"); -+ } -+ else if (strcmp(fontname, "timesbi.ttf") == 0 || -+ strcmp(fontname, "FreeSerifBoldItalic.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif:bold:italic"); -+ } -+ else if (strcmp(fontname, "arial.ttf") == 0 || -+ strcmp(fontname, "FreeSans.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans"); -+ } -+ else if (strcmp(fontname, "ariali.ttf") == 0 || -+ strcmp(fontname, "FreeSansOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:italic"); -+ } -+ else if (strcmp(fontname, "arialbd.ttf") == 0 || -+ strcmp(fontname, "FreeSansBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:bold"); -+ } -+ else if (strcmp(fontname, "arialbi.ttf") == 0 || -+ strcmp(fontname, "FreeSansBoldOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freesans:bold:italic"); -+ } -+ else if (strcmp(fontname, "cour.ttf") == 0 || -+ strcmp(fontname, "FreeMono.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono"); -+ } -+ else if (strcmp(fontname, "couri.ttf") == 0 || -+ strcmp(fontname, "FreeMonoOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:italic"); -+ } -+ else if (strcmp(fontname, "courbd.ttf") == 0 || -+ strcmp(fontname, "FreeMonoBold.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:bold"); -+ } -+ else if (strcmp(fontname, "courbi.ttf") == 0 || -+ strcmp(fontname, "FreeMonoBoldOblique.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freemono:bold:italic"); -+ } -+ else if (strcmp(fontname, "symbol.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "standardsymbolsps"); -+ } -+ else if (strcmp(fontname, "times.ttf") == 0 || -+ strcmp(fontname, "FreeSerif.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "freeserif"); - } -+ else if (strcmp(fontname, "wingding.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "dingbats"); -+ } -+ else if (strcmp(fontname, "STIXGeneral.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixgeneral"); -+ } -+ else if (strcmp(fontname, "STIXGeneralItalic.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixgeneral:italic"); -+ } -+ else if (strcmp(fontname, "STIXGeneralBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixgeneral:bold"); -+ } -+ else if (strcmp(fontname, "STIXGeneralBolIta.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixgeneral:bold:italic"); -+ } -+ else if (strcmp(fontname, "STIXSiz1Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize1"); -+ } -+ else if (strcmp(fontname, "STIXSiz1SymBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize1:bold"); -+ } -+ else if (strcmp(fontname, "STIXSiz2Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize2"); -+ } -+ else if (strcmp(fontname, "STIXSiz2SymBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize2:bold"); -+ } -+ else if (strcmp(fontname, "STIXSiz3Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize3"); -+ } -+ else if (strcmp(fontname, "STIXSiz3SymBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize3:bold"); -+ } -+ else if (strcmp(fontname, "STIXSiz4Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize4"); -+ } -+ else if (strcmp(fontname, "STIXSiz4SymBol.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize4:bold"); -+ } -+ else if (strcmp(fontname, "STIXSiz5Sym.otf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "stixsize5"); -+ } -+ else if (strcmp(fontname, "DroidSansFallback.ttf") == 0) { -+ pat = FcNameParse ((const FcChar8*) "droidsansfallback:charset=4e00 0410"); -+ } ++ pat = FcPatternCreate (); + -+ FcConfigSubstitute (nullptr, pat, FcMatchPattern); ++ switch (fileID) { ++ case 0: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 1: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 2: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 3: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 4: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 5: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 6: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 7: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 8: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 9: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 10: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 11: ++ case 14: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 12: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 13: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 15: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 16: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 17: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 18: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 19: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 20: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 21: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 22: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 23: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 24: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 25: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 26: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 27: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize5"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 28: ++ case 29: ++ case 30: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"droidsansfallback"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ set = FcCharSetCreate (); ++ FcCharSetAddChar (set, 0x0410); // Cyrillic ++ FcCharSetAddChar (set, 0x4e00); // CJK ++ FcPatternAddCharSet (pat, FC_CHARSET, set); + } + ++ FcConfigSubstitute (NULL, pat, FcMatchPattern); + FcDefaultSubstitute (pat); -+ match = FcFontMatch (nullptr, pat, &result); ++ match = FcFontMatch (NULL, pat, &result); + char *ttfnt; -+ FcPatternGetString (match, FC_FILE, 0, (FcChar8**) &ttfnt); -+ file = ttfnt; ++ FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt); ++ file = StrDup (ttfnt); ++ FcPatternGetInteger (match, FC_INDEX, 0, &ttindex); + FcPatternDestroy (match); + FcPatternDestroy (pat); - ++ if (set) FcCharSetDestroy (set); ++ FTFont* ftfont = 0; switch (mode) -diff --git a/graf3d/gl/src/TGLText.cxx b/graf3d/gl/src/TGLText.cxx -index 2ed3ee0917a..03feb0ee0a4 100644 ---- a/graf3d/gl/src/TGLText.cxx -+++ b/graf3d/gl/src/TGLText.cxx + { +@@ -484,10 +643,14 @@ + ftfont = new FTGLTextureFont(file); + break; + default: ++ delete [] file; + Error("TGLFontManager::RegisterFont", "invalid FTGL type"); + return; + break; + } ++ ++ delete [] file; ++ + ftfont->FaceSize(size); + const TGLFont &mf = fFontMap.insert(std::make_pair(TGLFont(size, fileID, mode, ftfont, 0), 1)).first->first; + out.CopyAttributes(mf); +@@ -570,8 +733,6 @@ + { + if (fgStaticInitDone == kFALSE) InitStatics(); + +- assert(fgExtendedFontStart > 0 && "GetExtendedFontStartIndex, invalid index"); +- + return fgExtendedFontStart; + } + +@@ -641,28 +802,6 @@ + fgFontFileArray.Add(new TObjString("wingding")); // 140 + fgFontFileArray.Add(new TObjString("symbol")); // 150 + +- fgExtendedFontStart = fgFontFileArray.GetEntries(); +- //"Extended" fonts for gl-pad. +- //fgPadFontStart + ... +- fgFontFileArray.Add(new TObjString("FreeSerifItalic.otf")); // 10 (160) +- fgFontFileArray.Add(new TObjString("FreeSerifBold.otf")); // 20 (170) +- fgFontFileArray.Add(new TObjString("FreeSerifBoldItalic.otf")); // 30 +- +- fgFontFileArray.Add(new TObjString("FreeSans.otf")); // 40 +- fgFontFileArray.Add(new TObjString("FreeSansOblique.otf")); // 50 +- fgFontFileArray.Add(new TObjString("FreeSansBold.otf")); // 60 +- fgFontFileArray.Add(new TObjString("FreeSansBoldOblique.otf")); // 70 +- +- fgFontFileArray.Add(new TObjString("FreeMono.otf")); // 80 +- fgFontFileArray.Add(new TObjString("FreeMonoOblique.otf")); // 90 +- fgFontFileArray.Add(new TObjString("FreeMonoBold.otf")); // 100 +- fgFontFileArray.Add(new TObjString("FreeMonoBoldOblique.otf")); // 110 +- +- fgFontFileArray.Add(new TObjString("symbol.ttf")); // 120 +- fgFontFileArray.Add(new TObjString("FreeSerif.otf")); // 130 +- fgFontFileArray.Add(new TObjString("wingding.ttf")); // 140 +- fgFontFileArray.Add(new TObjString("symbol.ttf")); // 150 +- + fgFontFileArray.Add(new TObjString("STIXGeneral.otf")); // 200 + fgFontFileArray.Add(new TObjString("STIXGeneralItalic.otf")); // 210 + fgFontFileArray.Add(new TObjString("STIXGeneralBol.otf")); // 220 +diff -ur root-6.28.00.orig/graf3d/gl/src/TGLText.cxx root-6.28.00/graf3d/gl/src/TGLText.cxx +--- root-6.28.00.orig/graf3d/gl/src/TGLText.cxx 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/graf3d/gl/src/TGLText.cxx 2023-02-04 12:47:19.868760250 +0100 @@ -32,6 +32,8 @@ # include "FTGLBitmapFont.h" #endif @@ -920,7 +1341,7 @@ index 2ed3ee0917a..03feb0ee0a4 100644 #define FTGL_BITMAP 0 #define FTGL_PIXMAP 1 #define FTGL_OUTLINE 2 -@@ -175,27 +177,35 @@ void TGLText::SetGLTextFont(Font_t fontnumber) +@@ -176,27 +178,92 @@ { int fontid = fontnumber / 10; @@ -945,39 +1366,96 @@ index 2ed3ee0917a..03feb0ee0a4 100644 - const char *ttpath = gEnv->GetValue("Root.TTFontPath", - TROOT::GetTTFFontDir()); - char *ttfont = gSystem->Which(ttpath, fontname, kReadPermission); -+ static const char *fonttable[] = { -+ "freesans:bold", -+ "freeserif:italic", -+ "freeserif:bold", -+ "freeserif:bold:italic", -+ "freesans", -+ "freesans:italic", -+ "freesans:bold", -+ "freesans:bold:italic", -+ "freemono", -+ "freemono:italic", -+ "freemono:bold", -+ "freemono:bold:italic", -+ "standardsymbolsps", -+ "freeserif", -+ "dingbats", -+ }; -+ -+ char *ttfont; -+ + FcPattern *pat, *match; + FcResult result; ++ char *ttfont; ++ int ttindex; + -+ pat = FcNameParse ((const FcChar8*) fonttable[fontid]); ++ pat = FcPatternCreate (); + -+ FcConfigSubstitute (nullptr, pat, FcMatchPattern); ++ switch (fontid) { ++ case 1: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 2: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 3: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 4: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 5: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 0: ++ case 6: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 7: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 8: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 9: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 10: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 11: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC); ++ break; ++ case 12: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 13: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ case 14: ++ FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats"); ++ FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR); ++ FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN); ++ break; ++ } ++ ++ FcConfigSubstitute (NULL, pat, FcMatchPattern); + FcDefaultSubstitute (pat); -+ match = FcFontMatch (nullptr, pat, &result); -+ FcPatternGetString (match, FC_FILE, 0, (FcChar8**) &ttfont); ++ match = FcFontMatch (NULL, pat, &result); ++ FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfont); ++ FcPatternGetInteger (match, FC_INDEX, 0, &ttindex); if (fGLTextFont) delete fGLTextFont; -@@ -203,7 +213,9 @@ void TGLText::SetGLTextFont(Font_t fontnumber) +@@ -204,7 +271,9 @@ fGLTextFont = new FTGLPolygonFont(ttfont); @@ -988,6 +1466,28 @@ index 2ed3ee0917a..03feb0ee0a4 100644 Error("SetGLTextFont","Cannot set FTGL::FaceSize"); - delete [] ttfont; } --- -2.52.0 - +diff -ur root-6.28.00.orig/gui/gui/src/TGApplication.cxx root-6.28.00/gui/gui/src/TGApplication.cxx +--- root-6.28.00.orig/gui/gui/src/TGApplication.cxx 2023-02-03 15:34:27.000000000 +0100 ++++ root-6.28.00/gui/gui/src/TGApplication.cxx 2023-02-04 12:47:19.868760250 +0100 +@@ -81,20 +81,12 @@ + gROOT->SetBatch(kFALSE); + + if (strcmp(appClassName, "proofserv")) { +- const char *ttpath = gEnv->GetValue("Root.TTFontPath", +- TROOT::GetTTFFontDir()); +- char *ttfont = gSystem->Which(ttpath, "arialbd.ttf", kReadPermission); +- // Added by cholm for use of DFSG - fonts - based on fix by Kevin +- if (!ttfont) +- ttfont = gSystem->Which(ttpath, "FreeSansBold.ttf", kReadPermission); +- if (ttfont && gEnv->GetValue("Root.UseTTFonts", 1)) { ++ if (gEnv->GetValue("Root.UseTTFonts", 1)) { + TPluginHandler *h; + if ((h = gROOT->GetPluginManager()->FindHandler("TVirtualX", "x11ttf"))) + if (h->LoadPlugin() == -1) + Info("TGApplication", "no TTF support"); + } +- +- delete [] ttfont; + } + + // Create the canvas colors early so they are allocated before diff --git a/root-gcc-16-libstdc-links-to-libatomic.patch b/root-gcc-16-libstdc-links-to-libatomic.patch deleted file mode 100644 index 776fff3..0000000 --- a/root-gcc-16-libstdc-links-to-libatomic.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 7b1632f5602a1bb6e6278d66c25640349c852ab1 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Fri, 9 Jan 2026 00:32:27 +0100 -Subject: [PATCH] Starting with gcc 16, libstdc++ links to libatomic. Add to - whitelist. - -$ ldd /lib64/libstdc++.so.6 - linux-vdso.so.1 (0x00007f3cb4c13000) - libm.so.6 => /lib64/libm.so.6 (0x00007f3cb4afc000) - libatomic.so.1 => /lib64/libatomic.so.1 (0x00007f3cb4af1000) - libc.so.6 => /lib64/libc.so.6 (0x00007f3cb460d000) - libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f3cb4ac5000) - /lib64/ld-linux-x86-64.so.2 (0x00007f3cb4c15000) ---- - bindings/pyroot/pythonizations/test/import_load_libs.py | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/bindings/pyroot/pythonizations/test/import_load_libs.py b/bindings/pyroot/pythonizations/test/import_load_libs.py -index 63feeca89ba..18906ff921e 100644 ---- a/bindings/pyroot/pythonizations/test/import_load_libs.py -+++ b/bindings/pyroot/pythonizations/test/import_load_libs.py -@@ -77,6 +77,7 @@ class ImportLoadLibs(unittest.TestCase): - "ld.*", - "libffi", - "libgcc_s", -+ "libatomic", - # AddressSanitizer runtime and ROOT configuration - "libclang_rt.asan-.*", - "libROOTSanitizerConfig", --- -2.52.0 - diff --git a/root-jsmva-static.patch b/root-jsmva-static.patch new file mode 100644 index 0000000..2550f4d --- /dev/null +++ b/root-jsmva-static.patch @@ -0,0 +1,36 @@ +diff -ur root-6.24.02.orig/bindings/jsmva/python/JsMVA/JPyInterface.py root-6.24.02/bindings/jsmva/python/JsMVA/JPyInterface.py +--- root-6.24.02.orig/bindings/jsmva/python/JsMVA/JPyInterface.py 2021-06-28 11:17:14.000000000 +0200 ++++ root-6.24.02/bindings/jsmva/python/JsMVA/JPyInterface.py 2021-08-11 09:06:21.894746090 +0200 +@@ -188,7 +188,7 @@ + ## Class for creating the output scripts and inserting them to cell output + class JsDraw: + ## Base repository +- __jsMVARepo = "https://root.cern.ch/js/jsmva/latest" ++ __jsMVARepo = "/static/JsMVA" + + ## String containing the link to JavaScript files + __jsMVASourceDir = __jsMVARepo + "/js" +diff -ur root-6.24.02.orig/bindings/pyroot_legacy/JsMVA/JPyInterface.py root-6.24.02/bindings/pyroot_legacy/JsMVA/JPyInterface.py +--- root-6.24.02.orig/bindings/pyroot_legacy/JsMVA/JPyInterface.py 2021-06-28 11:17:14.000000000 +0200 ++++ root-6.24.02/bindings/pyroot_legacy/JsMVA/JPyInterface.py 2021-08-11 09:06:21.925746168 +0200 +@@ -188,7 +188,7 @@ + ## Class for creating the output scripts and inserting them to cell output + class JsDraw: + ## Base repository +- __jsMVARepo = "https://root.cern.ch/js/jsmva/latest" ++ __jsMVARepo = "/static/JsMVA" + + ## String containing the link to JavaScript files + __jsMVASourceDir = __jsMVARepo + "/js" +diff -ur root-6.24.02.orig/etc/notebook/JsMVA/js/JsMVA.js root-6.24.02/etc/notebook/JsMVA/js/JsMVA.js +--- root-6.24.02.orig/etc/notebook/JsMVA/js/JsMVA.js 2021-06-28 11:17:14.000000000 +0200 ++++ root-6.24.02/etc/notebook/JsMVA/js/JsMVA.js 2021-08-11 09:10:45.638410266 +0200 +@@ -16,7 +16,7 @@ + + (function(factory){ + +- var JSROOT_source_dir = "https://root.cern/js/5.9.1/scripts/"; ++ var JSROOT_source_dir = "/static/scripts/"; + + var url = ""; + if (requirejs.s.contexts.hasOwnProperty("_")) { diff --git a/root-no-export-python-modules.patch b/root-no-export-python-modules.patch index d3fa4bc..aa7604d 100644 --- a/root-no-export-python-modules.patch +++ b/root-no-export-python-modules.patch @@ -1,53 +1,30 @@ -From b4e57c8ccd59d69fe61fa5f6470b3a99ba52aeeb Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Thu, 4 Dec 2025 23:13:28 +0100 -Subject: [PATCH] Dont export Python modules - ---- - bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt | 3 +-- - bindings/pyroot/pythonizations/CMakeLists.txt | 8 +------- - 2 files changed, 2 insertions(+), 9 deletions(-) - -diff --git a/bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt b/bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt -index bb48c032974..c34069855b2 100644 ---- a/bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt -+++ b/bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt -@@ -119,8 +119,7 @@ install(TARGETS CPyCppyy EXPORT ${CMAKE_PROJECT_NAME}Exports - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries) +diff -ur root-6.24.02.orig/bindings/jupyroot/CMakeLists.txt root-6.24.02/bindings/jupyroot/CMakeLists.txt +--- root-6.24.02.orig/bindings/jupyroot/CMakeLists.txt 2021-06-28 11:17:14.000000000 +0200 ++++ root-6.24.02/bindings/jupyroot/CMakeLists.txt 2021-08-11 10:53:03.272202496 +0200 +@@ -70,8 +70,7 @@ + endforeach() --install(TARGETS cppyy EXPORT ${CMAKE_PROJECT_NAME}Exports -- RUNTIME DESTINATION ${CMAKE_INSTALL_PYTHONDIR}/cppyy COMPONENT libraries # Windows -+install(TARGETS cppyy RUNTIME DESTINATION ${CMAKE_INSTALL_PYTHONDIR}/cppyy COMPONENT libraries # Windows - LIBRARY DESTINATION ${CMAKE_INSTALL_PYTHONDIR}/cppyy COMPONENT libraries - ARCHIVE DESTINATION ${CMAKE_INSTALL_PYTHONDIR}/cppyy COMPONENT libraries) + # Install library +- install(TARGETS ${libname} EXPORT ${CMAKE_PROJECT_NAME}Exports +- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries ++ install(TARGETS ${libname} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries + LIBRARY DESTINATION ${CMAKE_INSTALL_PYTHONDIR} COMPONENT libraries + ARCHIVE DESTINATION ${CMAKE_INSTALL_PYTHONDIR} COMPONENT libraries) -diff --git a/bindings/pyroot/pythonizations/CMakeLists.txt b/bindings/pyroot/pythonizations/CMakeLists.txt -index 1230f18ca47..2df4b733320 100644 ---- a/bindings/pyroot/pythonizations/CMakeLists.txt -+++ b/bindings/pyroot/pythonizations/CMakeLists.txt -@@ -202,11 +202,6 @@ foreach(py_source ${py_sources}) - COMMENT "Compiling PyROOT source ${py_source} for Python ${Python3_VERSION}") - endforeach() +diff -ur root-6.24.02.orig/bindings/pyroot/pythonizations/CMakeLists.txt root-6.24.02/bindings/pyroot/pythonizations/CMakeLists.txt +--- root-6.24.02.orig/bindings/pyroot/pythonizations/CMakeLists.txt 2021-06-28 11:17:14.000000000 +0200 ++++ root-6.24.02/bindings/pyroot/pythonizations/CMakeLists.txt 2021-08-11 10:53:03.272202496 +0200 +@@ -137,11 +137,10 @@ + # Create meta-target PyROOT2 and PyROOT3 (INTERFACE library) + # Export of targets are not supported for custom targets(add_custom_targets()) + add_library(PyROOT${python_major_version_string} INTERFACE) +- target_link_libraries(PyROOT${python_major_version_string} INTERFACE cppyy_backend${python_under_version_string} cppyy${python_under_version_string} ROOTPythonizations${python_under_version_string}) ++ target_link_libraries(PyROOT${python_major_version_string} INTERFACE cppyy_backend${python_under_version_string} cppyy${python_under_version_string}) --# Create meta-target PyROOT3 (INTERFACE library) --# Export of targets are not supported for custom targets(add_custom_targets()) --add_library(PyROOT INTERFACE) --target_link_libraries(PyROOT INTERFACE cppyy_backend cppyy ROOTPythonizations) -- - # Define library output directories for build and install trees - set(pymoduledir_build "${localruntimedir}/ROOT") - set(pymoduledir_install "${CMAKE_INSTALL_PYTHONDIR}/ROOT") -@@ -231,8 +226,7 @@ if(NOT MSVC) - endif() + # Install library +- install(TARGETS ${libname} EXPORT ${CMAKE_PROJECT_NAME}Exports +- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries ++ install(TARGETS ${libname} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries + LIBRARY DESTINATION ${CMAKE_INSTALL_PYTHONDIR} COMPONENT libraries + ARCHIVE DESTINATION ${CMAKE_INSTALL_PYTHONDIR} COMPONENT libraries) - # Install library --install(TARGETS ${libname} EXPORT ${CMAKE_PROJECT_NAME}Exports -- RUNTIME DESTINATION ${pymoduledir_install} COMPONENT libraries -+install(TARGETS ${libname} RUNTIME DESTINATION ${pymoduledir_install} COMPONENT libraries - LIBRARY DESTINATION ${pymoduledir_install} COMPONENT libraries - ARCHIVE DESTINATION ${pymoduledir_install} COMPONENT libraries) - --- -2.52.0 - diff --git a/root-pcre2-6.28.patch b/root-pcre2-6.28.patch new file mode 100644 index 0000000..db907b5 --- /dev/null +++ b/root-pcre2-6.28.patch @@ -0,0 +1,52 @@ +diff -ur root-6.28.06.orig/core/base/CMakeLists.txt root-6.28.06/core/base/CMakeLists.txt +--- root-6.28.06.orig/core/base/CMakeLists.txt 2023-08-28 13:26:43.000000000 +0200 ++++ root-6.28.06/core/base/CMakeLists.txt 2023-10-02 01:53:35.956143717 +0200 +@@ -212,9 +212,15 @@ + + ROOT_OBJECT_LIBRARY(Base ${BASE_SOURCES}) + ++if (PCRE2_FOUND) ++ set(PCRE_INCDIR ${PCRE2_INCLUDE_DIR}) ++else() ++ set(PCRE_INCDIR ${PCRE_INCLUDE_DIR}) ++endif() ++ + target_include_directories(Base PRIVATE + ${BASE_V7_INC} +- ${PCRE_INCLUDE_DIR} ++ ${PCRE_INCDIR} + res + ${CMAKE_SOURCE_DIR}/core/foundation/res + ${CMAKE_SOURCE_DIR}/core/clib/inc +@@ -237,6 +243,11 @@ + ${CMAKE_BINARY_DIR}/ginclude/TApplicationCommandLineOptionsHelp.h + ) + ++if(PCRE2_FOUND) ++ set_source_files_properties(src/TPRegexp.cxx ++ PROPERTIES COMPILE_DEFINITIONS USE_PCRE2) ++endif() ++ + ROOT_INSTALL_HEADERS(${BASE_HEADER_DIRS}) + + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/man) +diff -ur root-6.28.06.orig/core/CMakeLists.txt root-6.28.06/core/CMakeLists.txt +--- root-6.28.06.orig/core/CMakeLists.txt 2023-08-28 13:26:43.000000000 +0200 ++++ root-6.28.06/core/CMakeLists.txt 2023-10-02 01:47:00.134174041 +0200 +@@ -261,9 +261,15 @@ + + target_include_directories(G__Core PRIVATE ${CMAKE_SOURCE_DIR}/core/clingutils/inc) + ++if (PCRE2_FOUND) ++ set (PCRE_TGT PCRE2::PCRE2) ++else() ++ set (PCRE_TGT PCRE::PCRE) ++endif() ++ + target_link_libraries(Core + PRIVATE +- PCRE::PCRE ++ ${PCRE_TGT} + ${LIBLZMA_LIBRARIES} + xxHash::xxHash + LZ4::LZ4 diff --git a/root-pcre2.patch b/root-pcre2.patch new file mode 100644 index 0000000..8d1adee --- /dev/null +++ b/root-pcre2.patch @@ -0,0 +1,436 @@ +From f89fc640f9ca1b2cccf0dc496b0b7ea434b53fad Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 2 Oct 2023 09:25:13 +0200 +Subject: [PATCH] Support PCRE2 + +--- + .../pythonizations/test/import_load_libs.py | 1 + + cmake/modules/FindPCRE2.cmake | 106 ++++++++++++++++++ + cmake/modules/SearchInstalledSoftware.cmake | 17 +-- + core/base/CMakeLists.txt | 9 +- + core/base/src/TPRegexp.cxx | 99 +++++++++++++++- + tutorials/legacy/regexp/regexp.C | 6 +- + 6 files changed, 223 insertions(+), 15 deletions(-) + create mode 100644 cmake/modules/FindPCRE2.cmake + +diff --git a/bindings/pyroot/pythonizations/test/import_load_libs.py b/bindings/pyroot/pythonizations/test/import_load_libs.py +index 087db7da5c..179c76f6fd 100644 +--- a/bindings/pyroot/pythonizations/test/import_load_libs.py ++++ b/bindings/pyroot/pythonizations/test/import_load_libs.py +@@ -23,6 +23,7 @@ class ImportLoadLibs(unittest.TestCase): + 'libc', + 'libdl', + 'libpcre', ++ 'libpcre2-8', + # libCling and dependencies + 'libCling.*', + 'librt', +diff --git a/cmake/modules/FindPCRE2.cmake b/cmake/modules/FindPCRE2.cmake +new file mode 100644 +index 0000000000..2417453e8b +--- /dev/null ++++ b/cmake/modules/FindPCRE2.cmake +@@ -0,0 +1,106 @@ ++# Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. ++# All rights reserved. ++# ++# For the licensing terms see $ROOTSYS/LICENSE. ++# For the list of contributors see $ROOTSYS/README/CREDITS. ++ ++#.rst: ++# FindPCRE2 ++# -------- ++# ++# Find PCRE2 library ++# ++# Imported Targets ++# ^^^^^^^^^^^^^^^^ ++# ++# This module defines :prop_tgt:`IMPORTED` target: ++# ++# ``PCRE2::PCRE2`` ++# The pcre2 library, if found. ++# ++# Result Variables ++# ^^^^^^^^^^^^^^^^ ++# This module will set the following variables in your project: ++# ++# ``PCRE2_FOUND`` ++# True if PCRE2 has been found. ++# ``PCRE2_INCLUDE_DIRS`` ++# Where to find pcre2.h ++# ``PCRE2_LIBRARIES`` ++# The libraries to link against to use PCRE2. ++# ``PCRE2_VERSION`` ++# The version of the PCRE2 found (e.g. 10.42) ++# ++# Obsolete variables ++# ^^^^^^^^^^^^^^^^^^ ++# ++# The following variables may also be set, for backwards compatibility: ++# ++# ``PCRE2_PCRE2_LIBRARY`` ++# where to find the PCRE2_PCRE2 library. ++# ``PCRE2_INCLUDE_DIR`` ++# where to find the pcre2.h header (same as PCRE2_INCLUDE_DIRS) ++# ++ ++foreach(var PCRE2_FOUND PCRE2_INCLUDE_DIR PCRE2_PCRE2_LIBRARY PCRE2_LIBRARIES) ++ unset(${var} CACHE) ++endforeach() ++ ++find_path(PCRE2_INCLUDE_DIR NAMES pcre2.h PATH_SUFFIXES include) ++mark_as_advanced(PCRE2_INCLUDE_DIR) ++ ++if (PCRE2_INCLUDE_DIR AND EXISTS "${PCRE2_INCLUDE_DIR}/pcre2.h") ++ file(STRINGS "${PCRE2_INCLUDE_DIR}/pcre2.h" PCRE2_H REGEX "^#define PCRE2_(MAJOR|MINOR).*$") ++ string(REGEX REPLACE "^.*PCRE2_MAJOR[ ]+([0-9]+).*$" "\\1" PCRE2_VERSION_MAJOR "${PCRE2_H}") ++ string(REGEX REPLACE "^.*PCRE2_MINOR[ ]+([0-9]+).*$" "\\1" PCRE2_VERSION_MINOR "${PCRE2_H}") ++ set(PCRE2_VERSION "${PCRE2_VERSION_MAJOR}.${PCRE2_VERSION_MINOR}") ++endif() ++ ++if(NOT PCRE2_PCRE2_LIBRARY) ++ find_library(PCRE2_PCRE2_LIBRARY_RELEASE NAMES pcre2-8) ++ find_library(PCRE2_PCRE2_LIBRARY_DEBUG NAMES pcre2-8${CMAKE_DEBUG_POSTFIX} pcre2-8d) ++ include(SelectLibraryConfigurations) ++ select_library_configurations(PCRE2_PCRE2) ++endif() ++ ++include(FindPackageHandleStandardArgs) ++find_package_handle_standard_args(PCRE2 ++ REQUIRED_VARS ++ PCRE2_INCLUDE_DIR ++ PCRE2_PCRE2_LIBRARY ++ VERSION_VAR ++ PCRE2_VERSION ++) ++ ++if(PCRE2_FOUND) ++ set(PCRE2_INCLUDE_DIRS "${PCRE2_INCLUDE_DIR}") ++ ++ if (NOT PCRE2_LIBRARIES) ++ set(PCRE2_LIBRARIES "${PCRE2_PCRE2_LIBRARY}") ++ endif() ++ ++ if(NOT TARGET PCRE2::PCRE2) ++ add_library(PCRE2::PCRE2 UNKNOWN IMPORTED) ++ set_target_properties(PCRE2::PCRE2 PROPERTIES ++ INTERFACE_INCLUDE_DIRECTORIES "${PCRE2_INCLUDE_DIRS}") ++ ++ if(PCRE2_PCRE2_LIBRARY_DEBUG) ++ set_property(TARGET PCRE2::PCRE2 APPEND PROPERTY ++ IMPORTED_CONFIGURATIONS DEBUG) ++ set_target_properties(PCRE2::PCRE2 PROPERTIES ++ IMPORTED_LOCATION_DEBUG "${PCRE2_PCRE2_LIBRARY_DEBUG}") ++ endif() ++ ++ if(PCRE2_PCRE2_LIBRARY_RELEASE) ++ set_property(TARGET PCRE2::PCRE2 APPEND PROPERTY ++ IMPORTED_CONFIGURATIONS RELEASE) ++ set_target_properties(PCRE2::PCRE2 PROPERTIES ++ IMPORTED_LOCATION_RELEASE "${PCRE2_PCRE2_LIBRARY_RELEASE}") ++ endif() ++ ++ if(NOT PCRE2_PCRE2_LIBRARY_DEBUG AND NOT PCRE2_PCRE2_LIBRARY_RELEASE) ++ set_property(TARGET PCRE2::PCRE2 APPEND PROPERTY ++ IMPORTED_LOCATION "${PCRE2_PCRE2_LIBRARY}") ++ endif() ++ endif() ++endif() +diff --git a/cmake/modules/SearchInstalledSoftware.cmake b/cmake/modules/SearchInstalledSoftware.cmake +index 464155fd50..252aa56737 100644 +--- a/cmake/modules/SearchInstalledSoftware.cmake ++++ b/cmake/modules/SearchInstalledSoftware.cmake +@@ -204,13 +204,16 @@ if(NOT builtin_pcre) + foreach(suffix FOUND INCLUDE_DIR PCRE_LIBRARY) + unset(PCRE_${suffix} CACHE) + endforeach() +- if(fail-on-missing) +- find_package(PCRE REQUIRED) +- else() +- find_package(PCRE) +- if(NOT PCRE_FOUND) +- message(STATUS "PCRE not found. Switching on builtin_pcre option") +- set(builtin_pcre ON CACHE BOOL "Enabled because PCRE not found (${builtin_pcre_description})" FORCE) ++ find_package(PCRE2) ++ if(NOT PCRE2_FOUND) ++ if(fail-on-missing) ++ find_package(PCRE REQUIRED) ++ else() ++ find_package(PCRE) ++ if(NOT PCRE_FOUND) ++ message(STATUS "PCRE not found. Switching on builtin_pcre option") ++ set(builtin_pcre ON CACHE BOOL "Enabled because PCRE not found (${builtin_pcre_description})" FORCE) ++ endif() + endif() + endif() + endif() +diff --git a/core/base/src/TPRegexp.cxx b/core/base/src/TPRegexp.cxx +index 949b8cc8e9..d70f3e5b8b 100644 +--- a/core/base/src/TPRegexp.cxx ++++ b/core/base/src/TPRegexp.cxx +@@ -25,19 +25,36 @@ found at : http://perldoc.perl.org/perlre.html + #include "TObjString.h" + #include "TError.h" + ++#ifdef USE_PCRE2 ++#ifdef R__WIN32 ++#define PCRE2_STATIC ++#endif ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include ++#define PCRE_CASELESS PCRE2_CASELESS ++#define PCRE_MULTILINE PCRE2_MULTILINE ++#define PCRE_DOTALL PCRE2_DOTALL ++#define PCRE_EXTENDED PCRE2_EXTENDED ++#define PCRE_ERROR_NOMATCH PCRE2_ERROR_NOMATCH ++#else + #ifdef R__WIN32 + #define PCRE_STATIC + #endif + #include ++#endif + + #include + #include + + struct PCREPriv_t { ++#ifdef USE_PCRE2 ++ pcre2_code *fPCRE; ++ PCREPriv_t() { fPCRE = nullptr; } ++#else + pcre *fPCRE; + pcre_extra *fPCREExtra; +- + PCREPriv_t() { fPCRE = nullptr; fPCREExtra = nullptr; } ++#endif + }; + + +@@ -79,10 +96,15 @@ TPRegexp::TPRegexp(const TPRegexp &p) + + TPRegexp::~TPRegexp() + { ++#ifdef USE_PCRE2 ++ if (fPriv->fPCRE) ++ pcre2_code_free(fPriv->fPCRE); ++#else + if (fPriv->fPCRE) + pcre_free(fPriv->fPCRE); + if (fPriv->fPCREExtra) + pcre_free(fPriv->fPCREExtra); ++#endif + delete fPriv; + } + +@@ -93,12 +115,18 @@ TPRegexp &TPRegexp::operator=(const TPRegexp &p) + { + if (this != &p) { + fPattern = p.fPattern; ++#ifdef USE_PCRE2 ++ if (fPriv->fPCRE) ++ pcre2_code_free(fPriv->fPCRE); ++ fPriv->fPCRE = nullptr; ++#else + if (fPriv->fPCRE) + pcre_free(fPriv->fPCRE); + fPriv->fPCRE = nullptr; + if (fPriv->fPCREExtra) + pcre_free(fPriv->fPCREExtra); + fPriv->fPCREExtra = nullptr; ++#endif + fPCREOpts = p.fPCREOpts; + } + return *this; +@@ -197,31 +225,50 @@ TString TPRegexp::GetModifiers() const + + void TPRegexp::Compile() + { ++#ifdef USE_PCRE2 ++ if (fPriv->fPCRE) ++ pcre2_code_free(fPriv->fPCRE); ++#else + if (fPriv->fPCRE) + pcre_free(fPriv->fPCRE); ++#endif + + if (fPCREOpts & kPCRE_DEBUG_MSGS) + Info("Compile", "PREGEX compiling %s", fPattern.Data()); + ++#ifdef USE_PCRE2 ++ int errcode; ++ PCRE2_SIZE patIndex; ++ fPriv->fPCRE = pcre2_compile((PCRE2_SPTR)fPattern.Data(), fPattern.Length(), ++ fPCREOpts & kPCRE_INTMASK, ++ &errcode, &patIndex, nullptr); ++#else + const char *errstr; + Int_t patIndex; + fPriv->fPCRE = pcre_compile(fPattern.Data(), fPCREOpts & kPCRE_INTMASK, + &errstr, &patIndex, nullptr); ++#endif + + if (!fPriv->fPCRE) { ++#ifdef USE_PCRE2 ++ PCRE2_UCHAR errstr[256]; ++ pcre2_get_error_message(errcode, errstr, 256); ++#endif + if (fgThrowAtCompileError) { + throw std::runtime_error + (TString::Format("TPRegexp::Compile() compilation of TPRegexp(%s) failed at: %d because %s", +- fPattern.Data(), patIndex, errstr).Data()); ++ fPattern.Data(), (int)patIndex, errstr).Data()); + } else { + Error("Compile", "compilation of TPRegexp(%s) failed at: %d because %s", +- fPattern.Data(), patIndex, errstr); ++ fPattern.Data(), (int)patIndex, errstr); + return; + } + } + ++#ifndef USE_PCRE2 + if (fPriv->fPCREExtra || (fPCREOpts & kPCRE_OPTIMIZE)) + Optimize(); ++#endif + } + + //////////////////////////////////////////////////////////////////////////////// +@@ -229,6 +276,7 @@ void TPRegexp::Compile() + + void TPRegexp::Optimize() + { ++#ifndef USE_PCRE2 + if (fPriv->fPCREExtra) + pcre_free(fPriv->fPCREExtra); + +@@ -243,6 +291,7 @@ void TPRegexp::Optimize() + Error("Optimize", "Optimization of TPRegexp(%s) failed: %s", + fPattern.Data(), errstr); + } ++#endif + } + + //////////////////////////////////////////////////////////////////////////////// +@@ -308,21 +357,43 @@ Int_t TPRegexp::MatchInternal(const TString &s, Int_t start, + Int_t nMaxMatch, TArrayI *pos) const + { + Int_t *offVec = new Int_t[3*nMaxMatch]; ++ ++#ifdef USE_PCRE2 ++ pcre2_match_data *match_data; ++ match_data = pcre2_match_data_create_from_pattern(fPriv->fPCRE, nullptr); ++ Int_t nrMatch = pcre2_match(fPriv->fPCRE, (PCRE2_SPTR8)s.Data(), ++ s.Length(), start, 0, ++ match_data, nullptr); ++#else + // pcre_exec allows less options - see pcre_internal.h PUBLIC_EXEC_OPTIONS. + Int_t nrMatch = pcre_exec(fPriv->fPCRE, fPriv->fPCREExtra, s.Data(), + s.Length(), start, 0, + offVec, 3*nMaxMatch); ++#endif + + if (nrMatch == PCRE_ERROR_NOMATCH) + nrMatch = 0; + else if (nrMatch <= 0) { + Error("Match","pcre_exec error = %d", nrMatch); ++#ifdef USE_PCRE2 ++ pcre2_match_data_free(match_data); ++#endif + delete [] offVec; + return 0; + } + +- if (pos) ++ if (pos) { ++#ifdef USE_PCRE2 ++ PCRE2_SIZE *oVec = pcre2_get_ovector_pointer(match_data); ++ for (int i = 0; i < 2 * nrMatch; ++i) ++ offVec[i] = oVec[i]; ++#endif + pos->Set(2*nrMatch, offVec); ++ } ++ ++#ifdef USE_PCRE2 ++ pcre2_match_data_free(match_data); ++#endif + delete [] offVec; + + return nrMatch; +@@ -404,13 +475,24 @@ Int_t TPRegexp::SubstituteInternal(TString &s, const TString &replacePattern, + Int_t offset = start; + Int_t last = 0; + ++#ifdef USE_PCRE2 ++ pcre2_match_data *match_data; ++ match_data = pcre2_match_data_create_from_pattern(fPriv->fPCRE, nullptr); ++#endif ++ + while (kTRUE) { + + // find next matching subs + // pcre_exec allows less options - see pcre_internal.h PUBLIC_EXEC_OPTIONS. ++#ifdef USE_PCRE2 ++ Int_t nrMatch = pcre2_match(fPriv->fPCRE, (PCRE2_SPTR)s.Data(), ++ s.Length(), offset, 0, ++ match_data, nullptr); ++#else + Int_t nrMatch = pcre_exec(fPriv->fPCRE, fPriv->fPCREExtra, s.Data(), + s.Length(), offset, 0, + offVec, 3*nMaxMatch); ++#endif + + if (nrMatch == PCRE_ERROR_NOMATCH) { + break; +@@ -419,6 +501,12 @@ Int_t TPRegexp::SubstituteInternal(TString &s, const TString &replacePattern, + break; + } + ++#ifdef USE_PCRE2 ++ PCRE2_SIZE *oVec = pcre2_get_ovector_pointer(match_data); ++ for (int i = 0; i < 2 * nrMatch; ++i) ++ offVec[i] = oVec[i]; ++#endif ++ + // append anything previously unmatched, but not substituted + if (last <= offVec[0]) { + fin += s(last,offVec[0]-last); +@@ -446,6 +534,9 @@ Int_t TPRegexp::SubstituteInternal(TString &s, const TString &replacePattern, + } + } + ++#ifdef USE_PCRE2 ++ pcre2_match_data_free(match_data); ++#endif + delete [] offVec; + + fin += s(last,s.Length()-last); +diff --git a/tutorials/legacy/regexp/regexp.C b/tutorials/legacy/regexp/regexp.C +index 995b823bce..f38ed6799e 100644 +--- a/tutorials/legacy/regexp/regexp.C ++++ b/tutorials/legacy/regexp/regexp.C +@@ -94,11 +94,11 @@ void regexp() + // criteria: + // 1) It should be of the form string1@string2 . The "^" and "$" ensure that we compare the complete + // email string +- // 2) ([\\w-\\.]+) : ++ // 2) ([\\w\\-\\.]+) : + // string1 is only allowed to be composed out of the alphanumeric characters, "-" and "." . + // The "+" ensures that string1 can not be empty . + // 3) string2 is matched against three different parts : +- // a. ((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+)) : ++ // a. ((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w\\-]+\\.)+)) : + // This regular expression ensures that EITHER the string starts with "[" followed by three groups + // of numbers, separated by "." , where each group has 1 to 3 numbers, OR alphanumeric strings, + // possibly containing "-" characters, separated by "." . +@@ -108,7 +108,7 @@ void regexp() + // At most one "]" character . + + TString s5("fons.rademakers@cern.ch"); +- TPRegexp r5("^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); ++ TPRegexp r5("^([\\w\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); + cout << "Check if the email address \"" << s5 << "\" is valid: " << (r5.MatchB(s5) ? "TRUE" : "FALSE") << endl; + + // Substitute Example with pattern modifier : +-- +2.41.0 + diff --git a/root-stressvector-test-fails-on-ix86.patch b/root-stressvector-test-fails-on-ix86.patch new file mode 100644 index 0000000..fa519f2 --- /dev/null +++ b/root-stressvector-test-fails-on-ix86.patch @@ -0,0 +1,37 @@ +From aae37d7eceeb25e4a09e8504275083e6830832d6 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Tue, 28 Feb 2023 11:33:28 +0100 +Subject: [PATCH] The stressVector test fails on ix86 due to too strict check: + +DeltaR TLorentzVector time = 0.2610929 (sec) +DeltaR XYZTVector time = 0.22973299 (sec) +DeltaR PtEtaPhiEVector time = 0.0016570091 (sec) +-12823.3585955796 -12823.35859557827 -12823.35859557827 +Test DeltaR failed !! + +The new value for the scale parameter (50) was calculated from the +above values: + +root [2] (-12823.3585955796 - (-12823.35859557827)) / -12823.3585955796 / std::numeric_limits::epsilon() / 10 +(double) 46.762663 +--- + test/stressVector.cxx | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/test/stressVector.cxx b/test/stressVector.cxx +index b0ba21e845..18dc97d421 100644 +--- a/test/stressVector.cxx ++++ b/test/stressVector.cxx +@@ -540,8 +540,7 @@ int main(int argc,const char *argv[]) { + s1=a.testDeltaR (v1, t, t1, "DeltaR TLorentzVector " ); + s2=a.testDeltaR (v2, t, t2, "DeltaR XYZTVector " ); + s3=a.testDeltaR (v3, t, t3, "DeltaR PtEtaPhiEVector " ); +- a.check("DeltaR",s1,s2,s3,20); +- ++ a.check("DeltaR", s1, s2, s3, 50); + + int n1, n2, n3; + n1 = a.testAnalysis (v1, t, t1, "Analysis1 TLorentzVector " ); +-- +2.40.1 + diff --git a/root-testfiles.sh b/root-testfiles.sh index c2451e9..db4d721 100755 --- a/root-testfiles.sh +++ b/root-testfiles.sh @@ -72,7 +72,14 @@ wget -N ${SITE}/tesla.root wget -N ${SITE}/wa91_ref_3.root wget -N ${SITE}/wa91.root +wget -N ${SITE}/AtlasGraphs.root wget -N ${SITE}/europe.root +wget -N ${SITE}/Higgs_data.root +wget -N ${SITE}/linearIO.root +wget -N ${SITE}/stressHistogram.5.18.00.root +wget -N ${SITE}/tmva_class_example.root +wget -N ${SITE}/tmva_multiclass_example.root +wget -N ${SITE}/tmva_reg_example.root wget -N ${SITE}/usa.root for f in *.root ; do ln -s $f $f.ROOT.cachefile ; done diff --git a/root-tmva-rbdt.patch b/root-tmva-rbdt.patch new file mode 100644 index 0000000..b7afb2d --- /dev/null +++ b/root-tmva-rbdt.patch @@ -0,0 +1,40 @@ +From c3eb92abb450aee2e3a798218ca2d309524dab11 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Sat, 14 Oct 2023 15:51:16 +0200 +Subject: [PATCH] src/RBDT.cxx is a source file of libTMVAUtils and should not + also be a source file of libTMVA. Remove it. Adjust test using symbols + defined in this source file to link to libTMVAUtils instead of libTMVA. + +--- + tmva/tmva/CMakeLists.txt | 1 - + tmva/tmva/test/CMakeLists.txt | 2 +- + 2 files changed, 1 insertion(+), 2 deletions(-) + +diff --git a/tmva/tmva/CMakeLists.txt b/tmva/tmva/CMakeLists.txt +index 84efce9d59..109f4c1021 100644 +--- a/tmva/tmva/CMakeLists.txt ++++ b/tmva/tmva/CMakeLists.txt +@@ -334,7 +334,6 @@ ROOT_STANDARD_LIBRARY_PACKAGE(TMVA + src/PDEFoamVect.cxx + src/PDF.cxx + src/QuickMVAProbEstimator.cxx +- src/RBDT.cxx + src/Ranking.cxx + src/Reader.cxx + src/RegressionVariance.cxx +diff --git a/tmva/tmva/test/CMakeLists.txt b/tmva/tmva/test/CMakeLists.txt +index ebe1be187b..5dcf5175f2 100644 +--- a/tmva/tmva/test/CMakeLists.txt ++++ b/tmva/tmva/test/CMakeLists.txt +@@ -29,7 +29,7 @@ if(dataframe) + # Tree inference system and user interface + if(NOT MSVC OR ${LLVM_VERSION} VERSION_LESS 13.0.0 OR llvm13_broken_tests) + ROOT_ADD_GTEST(branchlessForest branchlessForest.cxx LIBRARIES TMVA) +- ROOT_ADD_GTEST(rbdt rbdt.cxx LIBRARIES ROOTVecOps TMVA) ++ ROOT_ADD_GTEST(rbdt rbdt.cxx LIBRARIES ROOTVecOps TMVAUtils) + endif() + endif() + +-- +2.41.0 + diff --git a/root-use-consistent-wording-in-tmva-test-comments.patch b/root-use-consistent-wording-in-tmva-test-comments.patch new file mode 100644 index 0000000..1d3e52a --- /dev/null +++ b/root-use-consistent-wording-in-tmva-test-comments.patch @@ -0,0 +1,86 @@ +From e6928c405fe1647a0ee6ea32543b18ebc3828227 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Thu, 23 Feb 2023 22:10:46 +0100 +Subject: [PATCH] Use consistent wording of the comments in the different TMVA + classification tests to avoid confusion. + +--- + tutorials/tmva/TMVA_CNN_Classification.C | 2 +- + tutorials/tmva/TMVA_CNN_Classification.py | 4 ++-- + tutorials/tmva/TMVA_RNN_Classification.C | 6 ++++-- + tutorials/tmva/TMVA_RNN_Classification.py | 5 +++-- + 4 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/tutorials/tmva/TMVA_CNN_Classification.C b/tutorials/tmva/TMVA_CNN_Classification.C +index cc6829a24d..db5af784d4 100644 +--- a/tutorials/tmva/TMVA_CNN_Classification.C ++++ b/tutorials/tmva/TMVA_CNN_Classification.C +@@ -134,7 +134,7 @@ void TMVA_CNN_Classification(int nevts = 1000, std::vector opt = {1, 1, 1, + + bool writeOutputFile = true; + +- int num_threads = 4; // use by default 4 threads if value is not set before ++ int num_threads = 4; // use max 4 threads + // switch off MT in OpenBLAS to avoid conflict with tbb + gSystem->Setenv("OMP_NUM_THREADS", "1"); + +diff --git a/tutorials/tmva/TMVA_CNN_Classification.py b/tutorials/tmva/TMVA_CNN_Classification.py +index 85fde20763..5d3c6e7220 100644 +--- a/tutorials/tmva/TMVA_CNN_Classification.py ++++ b/tutorials/tmva/TMVA_CNN_Classification.py +@@ -25,7 +25,7 @@ + + import ROOT + +-#switch off MT in OpenMP (BLAS) ++# switch off MT in OpenBLAS to avoid conflict with tbb + ROOT.gSystem.Setenv("OMP_NUM_THREADS", "1") + + TMVA = ROOT.TMVA +@@ -145,7 +145,7 @@ if not useTMVACNN: + + writeOutputFile = True + +-num_threads = 4 # use default threads ++num_threads = 4 # use max 4 threads + max_epochs = 10 # maximum number of epochs used for training + + +diff --git a/tutorials/tmva/TMVA_RNN_Classification.C b/tutorials/tmva/TMVA_RNN_Classification.C +index 8701ba6c19..d4bb7a4e4a 100644 +--- a/tutorials/tmva/TMVA_RNN_Classification.C ++++ b/tutorials/tmva/TMVA_RNN_Classification.C +@@ -191,8 +191,10 @@ void TMVA_RNN_Classification(int nevts = 2000, int use_type = 1) + useKeras = false; + #endif + +- int num_threads = 4; // use by default all threads +- gSystem->Setenv("OMP_NUM_THREADS", "1"); // switch off MT in OpenBLAS ++ int num_threads = 4; // use max 4 threads ++ // switch off MT in OpenBLAS to avoid conflict with tbb ++ gSystem->Setenv("OMP_NUM_THREADS", "1"); ++ + // do enable MT running + if (num_threads >= 0) { + ROOT::EnableImplicitMT(num_threads); +diff --git a/tutorials/tmva/TMVA_RNN_Classification.py b/tutorials/tmva/TMVA_RNN_Classification.py +index 625a120b3d..65aa83c070 100644 +--- a/tutorials/tmva/TMVA_RNN_Classification.py ++++ b/tutorials/tmva/TMVA_RNN_Classification.py +@@ -26,10 +26,11 @@ num_threads = 4 # use max 4 threads + # do enable MT running + if ROOT.gSystem.GetFromPipe("root-config --has-imt") == "yes": + ROOT.EnableImplicitMT(num_threads) +- ROOT.gSystem.Setenv("OMP_NUM_THREADS", "1") # switch OFF MT in OpenBLAS ++ # switch off MT in OpenBLAS to avoid conflict with tbb ++ ROOT.gSystem.Setenv("OMP_NUM_THREADS", "1") + print("Running with nthreads = {}".format(ROOT.GetThreadPoolSize())) + else: +- print("Running in serail mode since ROOT does not support MT") ++ print("Running in serial mode since ROOT does not support MT") + + + TMVA = ROOT.TMVA +-- +2.39.2 + diff --git a/root-vecops-Adaptive-size-of-long-RVec-instances-in-RVec-.patch b/root-vecops-Adaptive-size-of-long-RVec-instances-in-RVec-.patch deleted file mode 100644 index 369ce3e..0000000 --- a/root-vecops-Adaptive-size-of-long-RVec-instances-in-RVec-.patch +++ /dev/null @@ -1,135 +0,0 @@ -From 44c501ac9fdb9049783d9738a9603eec572f52f0 Mon Sep 17 00:00:00 2001 -From: Jonas Rembser -Date: Wed, 26 Nov 2025 18:11:25 +0100 -Subject: [PATCH] [vecops] Adaptive size of long RVec instances in RVec test - -For the tests to make sense, some vectors need to be longer than the -maximum small vector size. This maximum size is compiler and -architecture dependent. For `RVec` on ARM64 with gcc 14, the -small vector capacity turns out to be 60, which is larger than the -current test vector size of 18. - -Therefore, the test is refactored to adapt the large vector size -automatically, according to the maximum small vector size. ---- - math/vecops/test/vecops_rvec.cxx | 81 +++++++++++++++++++++++++------- - 1 file changed, 63 insertions(+), 18 deletions(-) - -diff --git a/math/vecops/test/vecops_rvec.cxx b/math/vecops/test/vecops_rvec.cxx -index 432c673a553..8cbe36ee6d8 100644 ---- a/math/vecops/test/vecops_rvec.cxx -+++ b/math/vecops/test/vecops_rvec.cxx -@@ -1672,15 +1672,35 @@ TEST_P(VecOpsSwap, BothSmallVectors) - - TEST_P(VecOpsSwap, BothRegularVectors) - { -- RVec fixed_vreg1{1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3}; -- RVec fixed_vreg2{4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}; -- RVec fixed_vreg3{7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9, 7}; -+ constexpr std::size_t smallVecSize = ROOT::Internal::VecOps::RVecInlineStorageSize::value; -+ -+ // The number of elemens in the large RVecs will be the smallest multiple of -+ // three that larger than smallVecSize. -+ constexpr int nCycle = 3; -+ constexpr std::size_t nElems = ((smallVecSize / nCycle) + 1) * nCycle; -+ -+ RVec fixed_vreg1(nElems); -+ RVec fixed_vreg2(nElems); -+ RVec fixed_vreg3(nElems + 1); - RVec fixed_vmocksmall{0, 7}; - -- RVec vreg1{1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3}; -- RVec vreg2{4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}; -- RVec vreg3{7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9, 7}; -- RVec vmocksmall{0, 7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 7, 8, 9, 7, 8, 9}; -+ RVec vreg1(nElems); -+ RVec vreg2(nElems); -+ RVec vreg3(nElems + 1); -+ RVec vmocksmall(nElems + 1); -+ -+ for (std::size_t i = 0; i < nElems; ++i) { -+ vreg1[i] = (i % nCycle) + 1; -+ vreg2[i] = vreg1[i] + nCycle; -+ vreg3[i] = vreg2[i] + nCycle; -+ fixed_vreg1[i] = vreg1[i]; -+ fixed_vreg2[i] = vreg2[i]; -+ fixed_vreg3[i] = vreg3[i]; -+ vmocksmall[i + 1] = vreg3[i]; -+ } -+ fixed_vreg3[nElems] = fixed_vreg3[0]; -+ vreg3[nElems] = vreg3[0]; -+ - vmocksmall.erase(vmocksmall.begin() + 2, vmocksmall.end()); - // vmocksmall is a regular vector of size 2 - -@@ -1798,11 +1818,22 @@ TEST_P(VecOpsSwap, BothAdoptingVectors) - // in cases where ROOT::VecOps::swap produces 1 regular and 1 adopting vector - TEST_P(VecOpsSwap, SmallRegularVectors) - { -+ constexpr std::size_t smallVecSize = ROOT::Internal::VecOps::RVecInlineStorageSize::value; -+ -+ // The number of elemens in the large RVecs will be the smallest multiple of -+ // three that larger than smallVecSize. -+ constexpr int nCycle = 3; -+ constexpr std::size_t nElems1 = ((smallVecSize / nCycle) + 1) * nCycle; -+ constexpr std::size_t nElems2 = nElems1 + nCycle; // some vectors should be larger than others -+ - RVec fixed_vsmall{1, 2, 3}; - RVec fixed_vreg1{4, 5, 6}; - RVec fixed_vreg2{7, 8}; - RVec fixed_vreg3{9, 10, 11, 12, 13, 14}; -- RVec fixed_vreg4{15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}; -+ RVec fixed_vreg4(nElems1); -+ for (std::size_t i = 0; i < nElems1; ++i) { -+ fixed_vreg4[i] = i + 15; -+ } - - // need multiple hard copies since after swap of a small and a regular, - // there is no fixed policy whether 2 regular vectors are produced or 1 small and 1 regular -@@ -1815,19 +1846,33 @@ TEST_P(VecOpsSwap, SmallRegularVectors) - RVec vsmall7{1, 2, 3}; - RVec vsmall8{1, 2, 3}; - -- RVec vreg1{4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}; -- vreg1.erase(vreg1.begin() + 3, vreg1.end()); // regular vector of size 3 -- RVec vreg10{4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}; -+ RVec vreg1; -+ RVec vreg10; -+ RVec vreg2{7, 8}; -+ RVec vreg20{7, 8}; -+ RVec vreg3{9, 10, 11, 12, 13, 14}; -+ RVec vreg30{9, 10, 11, 12, 13, 14}; -+ RVec vreg4(nElems1); -+ -+ for (std::size_t i = 0; i < nElems2; ++i) { -+ double val = (i % nCycle) + 4; -+ vreg1.push_back(val); -+ vreg10.push_back(vreg1.back()); -+ vreg2.push_back(val); -+ vreg20.push_back(vreg2.back()); -+ vreg3.push_back(val); -+ vreg30.push_back(vreg3.back()); -+ } -+ for (std::size_t i = 0; i < nElems1; ++i) { -+ vreg4[i] = i + 15; -+ } -+ -+ vreg1.erase(vreg1.begin() + 3, vreg1.end()); // regular vector of size 3 - vreg10.erase(vreg10.begin() + 3, vreg10.end()); // regular vector of size 3 -- RVec vreg2{7, 8, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}; -- vreg2.erase(vreg2.begin() + 2, vreg2.end()); // regular vector of size 2 -- RVec vreg20{7, 8, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}; -+ vreg2.erase(vreg2.begin() + 2, vreg2.end()); // regular vector of size 2 - vreg20.erase(vreg20.begin() + 2, vreg20.end()); // regular vector of size 2 -- RVec vreg3{9, 10, 11, 12, 13, 14, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}; -- vreg3.erase(vreg3.begin() + 6, vreg3.end()); // regular vector of size 6 -- RVec vreg30{9, 10, 11, 12, 13, 14, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}; -+ vreg3.erase(vreg3.begin() + 6, vreg3.end()); // regular vector of size 6 - vreg30.erase(vreg30.begin() + 6, vreg30.end()); // regular vector of size 6 -- RVec vreg4{15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}; - // vreg4 is a regular vector that cannot "fit" to small vector - - // verify that initially vectors are not small --- -2.52.0 - diff --git a/root.spec b/root.spec index 4cd9565..b880090 100644 --- a/root.spec +++ b/root.spec @@ -1,45 +1,61 @@ +# Needed for EPEL 8 +%undefine __cmake_in_source_build + # Disable package note flags, since root saves the compiler/linker flags # used during the build %undefine _package_note_flags +%global python3_version_uscore %(tr . _ <<< "%{python3_version}") + +%if %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} >= 9 +# Building the experimental ROOT 7 classes requires c++-17. +# This is the default for gcc 11 and later. %global root7 1 +%else +%global root7 0 +%endif + +%if %{?rhel}%{!?rhel:0} == 8 +%ifarch %{power64} +# These modules cause "pure virtual method called" errors +# https://github.com/root-project/root/issues/12372 +%global dataframe 0 +%global roofit 0 +%global tmvasofieparser 0 +%else %global dataframe 1 %global roofit 1 %global tmvasofieparser 1 +%endif +%else +%global dataframe 1 +%global roofit 1 +%global tmvasofieparser 1 +%endif + +%if %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} >= 9 +# DistRDF requires Python 3.8+ %global distrdf %{dataframe} - -%global bundlejson 0 - -%if %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} >= 10 -%ifarch %{ix86} %{arm} -%global pandas 0 %else -%global pandas 1 -%endif -%else -%global pandas 0 +%global distrdf 0 %endif -%if "%{?dist}" == ".el10_0" -# R not available in EPEL 10.0 -%global rrr 0 -%else -%global rrr 1 -%endif - -%if %{?fedora}%{!?fedora:0} >= 40 || %{?rhel}%{!?rhel:0} >= 10 -%global roofitmp 1 -%else -%global roofitmp 0 +# qt6-srpm-macros not in buildroot for Fedora 37/38 or EPEL 9 +# https://bugzilla.redhat.com/show_bug.cgi?id=2220859 +# https://bugzilla.redhat.com/show_bug.cgi?id=2220860 +# Definition of qt6_qtwebengine_arches incorrect in qt6-srpm-macros +# https://bugzilla.redhat.com/show_bug.cgi?id=2215703 +%if %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} >= 9 +%global qt6_qtwebengine_arches aarch64 x86_64 %endif # Do not generate autoprovides for Python modules -%global __provides_exclude_from ^%{python3_sitearch}/.*/lib.*\\.so$ +%global __provides_exclude_from ^%{python3_sitearch}/lib.*\\.so$ Name: root -Version: 6.38.00 +Version: 6.28.08 %global libversion %(cut -d. -f 1-2 <<< %{version}) -Release: 6%{?dist} +Release: 1%{?dist} Summary: Numerical data analysis framework License: LGPL-2.1-or-later @@ -62,9 +78,6 @@ Source6: application-x-root.png Source7: JupyROOT-on-EPEL # Script to generate Source0 Source8: %{name}-get-src.sh -# Clad is a source-transformation automatic differentiation (AD) -# library for C++, implemented as a plugin for the Clang compiler -Source9: https://github.com/vgvassilev/clad/archive/v2.2/clad-2.2.tar.gz # Use system fonts Patch0: %{name}-fontconfig.patch # Reduce memory usage during linking on ARM and x86 by generating @@ -77,44 +90,43 @@ Patch2: %{name}-dont-install-minicern.patch Patch3: %{name}-no-export-python-modules.patch # Run some test on 32 bit that upstream has disabled Patch4: %{name}-32bit-tests.patch -# Adjust test/stressGraphics.ref -# https://github.com/root-project/root/pull/30667 -Patch5: %{name}-Adjust-test-stressGraphics.ref.patch -# Revert test change that breaks the test -Patch6: %{name}-Revert-test-Fetch-the-geometries-from-EOS-and-not-fr.patch -# Preserve memory during parallel build -# https://github.com/root-project/root/pull/18991 -Patch7: %{name}-Save-memory-Do-not-link-to-LLVM-libraries-in-parallel.patch -# Add missing includes of TMath.h -# https://github.com/root-project/root/pull/20601 -Patch8: %{name}-Geom-Add-missing-includes-of-TMath.h.patch -# Fix numpy vs dataframe type mismatch om ix86 -# https://github.com/root-project/root/pull/20668 -Patch9: %{name}-Fix-a-numpy-test-for-32-bit-archs.patch -# Backport a test fix from upstream -Patch10: %{name}-VecOps-Remove-outdated-IsSmall-helper-function-in-te.patch -Patch11: %{name}-vecops-Adaptive-size-of-long-RVec-instances-in-RVec-.patch -# Backport fixes to python module -Patch12: %{name}-cppyy-Remove-now-irrelevant-load_cpp_backend-call.patch -Patch13: %{name}-cppyy-Remove-code-related-to-finding-CPyCppyy-API-he.patch -# Don't install the python modules twice -# https://github.com/root-project/root/pull/20753 -Patch14: %{name}-PyROOT-Don-t-install-the-python-modules-twice.patch -# Fix test for stricter syntax in numpy 2.4.0 (backport) -# https://github.com/root-project/root/pull/20775 -Patch15: %{name}-Python-Fix-TF1-Pythonization-test-for-NumPy-2.4.0.patch -# Starting with gcc 16, libstdc++ links to libatomic -# https://github.com/root-project/root/pull/20826 -Patch16: %{name}-gcc-16-libstdc-links-to-libatomic.patch -# Test fails with gcc 16 (which uses c++20 as default) -# https://github.com/root-project/root/issues/20831 -# https://github.com/root-project/root/pull/20841 -Patch17: %{name}-RF-Use-TRandom3-in-test-RooFuncWrapper.patch +# Use local static script and style files for JsMVA +Patch5: %{name}-jsmva-static.patch +# Fix test failure on ppc64le and aarch64 with gcc 12 +# https://github.com/root-project/root/pull/9601 +Patch6: %{name}-fix-test-failure-on-ppc64le-and-aarch64-with-gcc-12.patch +# Byte swap values read from the protobuf raw data stream on +# big endian architectures +# https://github.com/root-project/root/pull/10308 +Patch7: %{name}-big-endian-byte-swap.patch +# https://github.com/root-project/root/pull/12375 +Patch8: %{name}-use-consistent-wording-in-tmva-test-comments.patch +# https://github.com/root-project/root/pull/12390 +Patch9: %{name}-stressvector-test-fails-on-ix86.patch +# https://github.com/root-project/root/pull/12423 +Patch10: %{name}-dont-install-roofit-files-fix.patch +# https://github.com/root-project/root/issues/12427 +# https://github.com/root-project/root/pull/12468 +Patch11: %{name}-fixes-for-32bit-builds.patch +# https://github.com/root-project/root/pull/12476 +Patch12: %{name}-do-not-remove-Wp-before-D-and-U.patch +# Avoid boolean operators on numpy arrays in unit test +# https://github.com/root-project/root/issues/12162 +# https://github.com/root-project/root/pull/13612 +Patch13: root-boolean-numpy-array.patch +# Port to pcre2 +# https://github.com/root-project/root/issues/11395 +# https://github.com/root-project/root/pull/13771 +Patch14: root-pcre2.patch +Patch15: root-pcre2-6.28.patch +# src/RBDT.cxx is a source file of both libTMVA and libTMVAUtils +# https://github.com/root-project/root/pull/13863 +Patch16: root-tmva-rbdt.patch BuildRequires: gcc-c++ BuildRequires: gcc-gfortran BuildRequires: make -BuildRequires: cmake >= 3.20 +BuildRequires: cmake >= 3.16 BuildRequires: libX11-devel BuildRequires: libXpm-devel BuildRequires: libXft-devel @@ -131,22 +143,27 @@ BuildRequires: xz-devel BuildRequires: lz4-devel BuildRequires: xxhash-devel BuildRequires: libzstd-devel -BuildRequires: libtiff-devel -BuildRequires: libpng-devel -BuildRequires: giflib-devel -BuildRequires: libjpeg-devel +# Require a version of libAfterImage that is properly linked to +# its dependencies +BuildRequires: libAfterImage-devel >= 1.20-21 BuildRequires: ncurses-devel BuildRequires: libxml2-devel BuildRequires: fftw-devel BuildRequires: gsl-devel BuildRequires: unuran-devel +BuildRequires: mariadb-connector-c-devel BuildRequires: sqlite-devel +BuildRequires: unixODBC-devel BuildRequires: libGL-devel BuildRequires: libGLU-devel -BuildRequires: libxcrypt-devel -BuildRequires: python%{python3_pkgversion}-devel >= 3.7 +BuildRequires: libpq-devel +BuildRequires: python%{python3_pkgversion}-devel BuildRequires: python%{python3_pkgversion}-setuptools BuildRequires: python%{python3_pkgversion}-numpy +%ifarch %{qt5_qtwebengine_arches} +BuildRequires: qt5-qtbase-devel +BuildRequires: qt5-qtwebengine-devel +%endif %ifarch %{qt6_qtwebengine_arches} BuildRequires: qt6-qtbase-devel BuildRequires: qt6-qtwebengine-devel @@ -157,40 +174,41 @@ BuildRequires: desktop-file-utils BuildRequires: dcap-devel BuildRequires: xrootd-client-devel >= 1:5.0.0 BuildRequires: cfitsio-devel -# Davix version >= 0.6.4, but not between 0.6.8 and 0.7.0 -BuildRequires: davix-devel >= 0.7.1 -%if %{rrr} +BuildRequires: davix-devel >= 0.6.4 +BuildRequires: gfal2-devel BuildRequires: R-Rcpp-devel BuildRequires: R-RInside-devel -%endif BuildRequires: readline-devel -BuildRequires: tbb-devel >= 2020 +BuildRequires: tbb-devel >= 2018 BuildRequires: libuuid-devel BuildRequires: graphviz-devel BuildRequires: expat-devel BuildRequires: pythia8-devel >= 8.1.80 +%if %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} >= 9 BuildRequires: flexiblas-devel -%if ! %{bundlejson} -BuildRequires: json-devel >= 3.9 +# Required for FlexiBLAS support in FindBLAS.cmake +# (in cmake 3.19.0, backported to cmake 3.18.3-1 in Fedora) +BuildRequires: cmake-data >= 3.18.3-1 +%else +BuildRequires: openblas-devel %endif +BuildRequires: json-devel +%if %{?fedora}%{!?fedora:0} +# Disable uring in EPEL 8 and 9 (liburing is available, +# but uring not supported by the kernel) BuildRequires: liburing-devel +%endif %if %{tmvasofieparser} BuildRequires: protobuf-devel >= 3.0 %endif %ifnarch %{ix86} %{arm} BuildRequires: libarrow-devel %endif -%if %{roofit} -%if %{roofitmp} -# Required for roofit-multiprocess -# Requires new zeromq with zmq_ppoll -BuildRequires: zeromq-devel >= 4.3.5 -BuildRequires: cppzmq-devel -%endif -%endif -%if %{pandas} +%if %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} == 8 BuildRequires: python%{python3_pkgversion}-pandas %endif +BuildRequires: python3-rcssmin +BuildRequires: uglify-js3 BuildRequires: perl-generators BuildRequires: gtest-devel BuildRequires: gmock-devel @@ -212,7 +230,6 @@ Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} Requires: %{name}-multiproc%{?_isa} = %{version}-%{release} Requires: %{name}-net%{?_isa} = %{version}-%{release} Requires: %{name}-tree%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} Requires: %{name}-tree-player%{?_isa} = %{version}-%{release} Requires: hicolor-icon-theme Obsoletes: emacs-%{name} < 5.34.28 @@ -228,7 +245,9 @@ the bulk of the data. Included are histogramming methods in an arbitrary number of dimensions, curve fitting, function evaluation, minimization, graphics and visualization classes to allow the easy setup of an analysis system that can query and process the data -interactively or in batch mode. +interactively or in batch mode, as well as a general parallel +processing framework, PROOF, that can considerably speed up an +analysis. Thanks to the built-in C++ interpreter cling, the command, the scripting and the programming language are all C++. The interpreter @@ -252,17 +271,14 @@ Requires: %{name}-core = %{version}-%{release} %description icons This package contains icons used by the ROOT GUI. -%package font-files +%package fonts Summary: ROOT font collection BuildArch: noarch # STIX version 0.9 only License: OFL-1.1 Requires: %{name}-core = %{version}-%{release} -# Package renamed -Provides: %{name}-fonts = %{version}-%{release} -Obsoletes: %{name}-fonts < 6.36.00-2 -%description font-files +%description fonts This package contains fonts used by ROOT that are not available in Fedora. In particular it contains STIX version 0.9 that is used by TMathText. @@ -277,7 +293,7 @@ This package contains the tutorial scripts and test suite for ROOT. %package core Summary: ROOT core libraries License: LGPL-2.1-or-later AND LGPL-2.0-or-later AND ISC AND MIT AND NCSA -Requires: %{name}-font-files = %{version}-%{release} +Requires: %{name}-fonts = %{version}-%{release} Requires: %{name}-icons = %{version}-%{release} # Dynamic dependencies Requires: %{name}-cling%{?_isa} = %{version}-%{release} @@ -301,16 +317,10 @@ Requires: %{name}-tree%{?_isa} = %{version}-%{release} %if %{dataframe} Requires: %{name}-tree-dataframe%{?_isa} = %{version}-%{release} %endif -Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple-utils%{?_isa} = %{version}-%{release} Requires: %{name}-tree-player%{?_isa} = %{version}-%{release} Requires: %{name}-vecops%{?_isa} = %{version}-%{release} # To resolve dependency in installed ROOTConfig.cmake -%if %{bundlejson} -Provides: bundled(json-devel) = 3.10.5 -%else -Requires: json-devel >= 3.9 -%endif +Requires: json-devel # Fonts Requires: xorg-x11-fonts-ISO8859-1-75dpi Requires: font(freesans) @@ -323,7 +333,6 @@ Requires: font(droidsansfallback) Obsoletes: %{name}-ruby < 6.00.00 Obsoletes: %{name}-vdt < 6.10.00 Obsoletes: %{name}-proof-pq2 < 6.16.00 -Obsoletes: %{name}-proofd < 6.16.00 Obsoletes: %{name}-rootd < 6.16.00 Obsoletes: %{name}-geocad < 6.18.00 Obsoletes: %{name}-graf-qt < 6.18.00 @@ -336,22 +345,41 @@ Obsoletes: %{name}-net-globus < 6.18.00 Obsoletes: %{name}-net-ldap < 6.18.00 Obsoletes: %{name}-net-krb5 < 6.18.00 Obsoletes: %{name}-table < 6.18.00 -Obsoletes: %{name}-xproof < 6.22.08-2 Obsoletes: %{name}-memstat < 6.26.00 Obsoletes: %{name}-montecarlo-vmc < 6.26.00 Obsoletes: %{name}-doc < 6.26.00 -Obsoletes: %{name}-io-gfal < 6.30.00 -Obsoletes: %{name}-roofit-common < 6.30.00 -Obsoletes: %{name}-gui-qt5webdisplay < 6.36.00 -Obsoletes: %{name}-hist-draw < 6.36.00 -Obsoletes: %{name}-html < 6.36.00 -Obsoletes: %{name}-proof < 6.38.00 -Obsoletes: %{name}-proof-bench < 6.38.00 -Obsoletes: %{name}-proof-player < 6.38.00 -Obsoletes: %{name}-proof-sessionviewer < 6.38.00 -Obsoletes: %{name}-sql-mysql < 6.38.00 -Obsoletes: %{name}-sql-odbc < 6.38.00 -Obsoletes: %{name}-sql-pgsql < 6.38.00 +%if %{?rhel}%{!?rhel:0} == 8 +# Obsolete the ROOT 7 packages in EPEL 8 +# Minimum C++ version changed from 14 to 17 +Obsoletes: %{name}-graf-gpadv7 < 6.26.00 +Obsoletes: %{name}-graf-primitives < 6.26.00 +Obsoletes: %{name}-graf3d-eve7 < 6.26.00 +Obsoletes: %{name}-gui-browsable < 6.26.00 +Obsoletes: %{name}-gui-browserv7 < 6.26.00 +Obsoletes: %{name}-gui-canvaspainter < 6.26.00 +Obsoletes: %{name}-gui-fitpanelv7 < 6.26.00 +Obsoletes: %{name}-histv7 < 6.26.00 +Obsoletes: %{name}-hist-draw < 6.26.00 +Obsoletes: %{name}-tree-ntuple < 6.26.00 +# Obsolete the DistRDF package in EPEL 8 +# Minimum Python version requirement introduced +Obsoletes: python%{python3_pkgversion}-distrdf < 6.26.00 +%ifarch %{power64} +# Obsolete for ppc64le in EPEL 8 +# These modules cause "pure virtual method called" errors +Obsoletes: %{name}-tree-dataframe < 6.28.00 +Obsoletes: %{name}-roofit < 6.28.00 +Obsoletes: %{name}-roofit-common < 6.28.00 +Obsoletes: %{name}-roofit-core < 6.28.00 +Obsoletes: %{name}-roofit-more < 6.28.00 +Obsoletes: %{name}-roofit-batchcompute < 6.28.00 +Obsoletes: %{name}-roofit-dataframe-helpers < 6.28.00 +Obsoletes: %{name}-roofit-hs3 < 6.28.00 +Obsoletes: %{name}-roostats < 6.28.00 +Obsoletes: %{name}-hist-factory < 6.28.00 +Obsoletes: %{name}-tmva-sofie-parser < 6.28.00 +%endif +%endif %description core This package contains the core libraries used by ROOT: libCore, libNew, @@ -417,7 +445,6 @@ Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-tree%{?_isa} = %{version}-%{release} # Package split (tpython from Python bindings) Obsoletes: python%{python3_pkgversion}-%{name} < 6.22.00 -Obsoletes: python%{python3_pkgversion}-jsmva < 6.32.00 %description -n python%{python3_pkgversion}-%{name} This package contains the Python extension for ROOT. It makes it @@ -425,18 +452,12 @@ possible to use ROOT classes in Python. %package -n python%{python3_pkgversion}-jupyroot Summary: ROOT Jupyter kernel -BuildArch: noarch %py_provides python%{python3_pkgversion}-jupyroot -Requires: python%{python3_pkgversion}-%{name} = %{version}-%{release} -Requires: %{name}-core = %{version}-%{release} -# notebook package was merged with JupyROOT package -Provides: %{name}-notebook = %{version}-%{release} -Obsoletes: %{name}-notebook < 6.32.00 -Requires: js-jsroot >= 7.10 -%if %{?fedora}%{!?fedora:0} || ( %{?rhel}%{!?rhel:0} >= 10 && "%{?dist}" != ".el10_0" ) -# jupyter-notebook not available in RHEL/EPEL -# some functionality missing -Requires: jupyter-notebook +Requires: python%{python3_pkgversion}-%{name}%{?_isa} = %{version}-%{release} +Requires: python%{python3_pkgversion}-jsmva = %{version}-%{release} +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-notebook = %{version}-%{release} +%if %{?fedora}%{!?fedora:0} # python-metakernel not available in RHEL/EPEL # some functionality missing Requires: python%{python3_pkgversion}-ipython @@ -447,6 +468,15 @@ Requires: python-jupyter-filesystem %description -n python%{python3_pkgversion}-jupyroot The Jupyter kernel for the ROOT notebook. +%package -n python%{python3_pkgversion}-jsmva +Summary: TMVA interface used by JupyROOT +BuildArch: noarch +%py_provides python%{python3_pkgversion}-jsmva +Requires: %{name}-tmva = %{version}-%{release} + +%description -n python%{python3_pkgversion}-jsmva +TMVA interface used by JupyROOT. + %if %{distrdf} %package -n python%{python3_pkgversion}-distrdf Summary: Distributed RDataFrame @@ -460,7 +490,6 @@ A layer on top of RDataFrame to enable distributed computations. It is a port of the previously known PyRDF python package. %endif -%if %{rrr} %package r Summary: R interface for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} @@ -487,7 +516,6 @@ Requires: %{name}-r%{?_isa} = %{version}-%{release} %description r-tools This package contains a minimizer module for ROOT that uses the ROOT R interface. -%endif %package genetic Summary: Genetic algorithms for ROOT @@ -513,7 +541,6 @@ This package contains a library for defining geometries in ROOT. Summary: Geometry builder library for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-geom%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} Requires: %{name}-gui%{?_isa} = %{version}-%{release} Requires: %{name}-gui-ged%{?_isa} = %{version}-%{release} # Package split (geom-builder and geom-painter from geom) @@ -522,8 +549,8 @@ Obsoletes: %{name}-geom < 6.28.00 %description geom-builder This package contains a library for building geometries in ROOT. -%package geom-checker -Summary: Geometry checker library for ROOT +%package geom-painter +Summary: Geometry painter library for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-geom%{?_isa} = %{version}-%{release} Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} @@ -532,17 +559,6 @@ Requires: %{name}-hist%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} Requires: %{name}-tree%{?_isa} = %{version}-%{release} - -%description geom-checker -This package contains a library for checking geometries in ROOT. - -%package geom-painter -Summary: Geometry painter library for ROOT -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-geom%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} -Requires: %{name}-graf3d%{?_isa} = %{version}-%{release} -Requires: %{name}-hist%{?_isa} = %{version}-%{release} # Package split (geom-builder and geom-painter from geom) Obsoletes: %{name}-geom < 6.28.00 @@ -573,12 +589,13 @@ This package contains the 2-dimensional graphics library for ROOT. Summary: AfterImage graphics renderer for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-graf%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-postscript%{?_isa} = %{version}-%{release} Requires: %{name}-gui%{?_isa} = %{version}-%{release} Requires: %{name}-hist%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} +# Require a version of libAfterImage that is properly linked to +# its dependencies +Requires: libAfterImage >= 1.20-21 %description graf-asimage This package contains the AfterImage renderer for ROOT, which allows @@ -681,7 +698,6 @@ This package contains a library for defining event displays in ROOT. Summary: GL renderer for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-graf%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-asimage%{?_isa} = %{version}-%{release} Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} Requires: %{name}-graf3d%{?_isa} = %{version}-%{release} Requires: %{name}-graf3d-csg%{?_isa} = %{version}-%{release} @@ -728,8 +744,6 @@ Requires: %{name}-graf%{?_isa} = %{version}-%{release} Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple-browse%{?_isa} = %{version}-%{release} # Dynamic dependencies Requires: %{name}-graf-x11%{?_isa} = %{version}-%{release} Requires: %{name}-gui-ged%{?_isa} = %{version}-%{release} @@ -811,14 +825,6 @@ Recorded events are: All the recorded events from one session are stored in one TFile and can be replayed again anytime. -%package gui-treemap -Summary: GUI element for tree maps in ROOT -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-graf%{?_isa} = %{version}-%{release} - -%description gui-treemap -This package contains a library to show tree maps in the ROOT GUI. - %package hbook Summary: Hbook library for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} @@ -871,10 +877,19 @@ Requires: %{name}-hist%{?_isa} = %{version}-%{release} %description spectrum-painter This package contains a painter of spectra for ROOT. +%package html +Summary: HTML documentation generator for ROOT +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-graf%{?_isa} = %{version}-%{release} +Requires: graphviz + +%description html +This package contains classes to automatically extract documentation +from marked up sources. + %package io Summary: Input/output of ROOT objects Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: liburing-devel %description io This package provides I/O routines for ROOT objects. @@ -887,6 +902,14 @@ Requires: %{name}-io%{?_isa} = %{version}-%{release} %description io-dcache This package contains the dCache extension for ROOT. +%package io-gfal +Summary: Grid File Access Library input/output library for ROOT +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} + +%description io-gfal +This package contains the Grid File Access Library extension for ROOT. + %package io-sql Summary: SQL input/output library for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} @@ -962,7 +985,7 @@ Summary: Core mathematics library for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} # Dynamic dependencies Requires: %{name}-mathmore%{?_isa} = %{version}-%{release} -Requires: %{name}-minuit2%{?_isa} = %{version}-%{release} +Requires: %{name}-minuit%{?_isa} = %{version}-%{release} %description mathcore This package contains the MathCore library for ROOT. @@ -1135,7 +1158,7 @@ Requires: %{name}-montecarlo-eg%{?_isa} = %{version}-%{release} %description montecarlo-pythia8 This package contains the Pythia version 8 plug-in for ROOT. This -package provides the ROOT user with transparent interface to the Pythia +package provide the ROOT user with transparent interface to the Pythia (version 8) event generators for hadronic interactions. If the term "hadronic" does not ring any bells, this package is not for you. @@ -1148,16 +1171,16 @@ Requires: %{name}-io%{?_isa} = %{version}-%{release} This package contains the ROOT networking library. %package net-rpdutils -Summary: Authentication utilities used by rootd +Summary: Authentication utilities used by xproofd Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-net%{?_isa} = %{version}-%{release} %description net-rpdutils -This package contains authentication utilities used by rootd. +This package contains authentication utilities used by xproofd. %package net-auth Summary: Authentication extension for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-net%{?_isa} = %{version}-%{release} %description net-auth @@ -1175,11 +1198,9 @@ access to http based storage such as webdav and S3. %package net-http Summary: HTTP server extension for ROOT -# The system civetweb is not compiled with websocket support -Provides: bundled(civetweb) Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} -Requires: js-jsroot >= 7.10 +Requires: js-jsroot >= 7 # Library split (net-httpsniff from net-http) Obsoletes: %{name}-net-http < 6.14.00 @@ -1213,6 +1234,70 @@ Requires: %{name}-net%{?_isa} = %{version}-%{release} This package contains the NetX extension for ROOT, i.e. a client for the xrootd server. Only the new (NetXNG) version is provided. +%package proof +Summary: PROOF extension for ROOT +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} +Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} +Requires: %{name}-net%{?_isa} = %{version}-%{release} +Requires: %{name}-tree%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-clarens < 5.34.01 +Obsoletes: %{name}-peac < 5.34.01 +# Package split (proof-player from proof) +Obsoletes: %{name}-proof < 6.14.00 +Obsoletes: %{name}-proofd < 6.16.00 +Obsoletes: %{name}-xproof < 6.22.08-2 + +%description proof +This package contains the proof extension for ROOT. This provides a +client to use in a PROOF environment. + +%package proof-bench +Summary: PROOF benchmarking +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-graf%{?_isa} = %{version}-%{release} +Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} +Requires: %{name}-hist%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} +Requires: %{name}-proof%{?_isa} = %{version}-%{release} +Requires: %{name}-proof-player%{?_isa} = %{version}-%{release} +Requires: %{name}-tree%{?_isa} = %{version}-%{release} + +%description proof-bench +This package contains the steering class for PROOF benchmarks. + +%package proof-player +Summary: PROOF player extension for ROOT +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} +Requires: %{name}-graf3d%{?_isa} = %{version}-%{release} +Requires: %{name}-hist%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} +Requires: %{name}-net%{?_isa} = %{version}-%{release} +Requires: %{name}-proof%{?_isa} = %{version}-%{release} +Requires: %{name}-tree%{?_isa} = %{version}-%{release} +Requires: %{name}-tree-player%{?_isa} = %{version}-%{release} +# Package split (proof-player from proof) +Obsoletes: %{name}-proof < 6.14.00 + +%description proof-player +This package contains the proof player extension for ROOT. + +%package proof-sessionviewer +Summary: GUI to browse an interactive PROOF session +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-graf%{?_isa} = %{version}-%{release} +Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} +Requires: %{name}-gui%{?_isa} = %{version}-%{release} +Requires: %{name}-hist%{?_isa} = %{version}-%{release} +Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} +Requires: %{name}-proof%{?_isa} = %{version}-%{release} +Requires: %{name}-tree%{?_isa} = %{version}-%{release} + +%description proof-sessionviewer +This package contains a library for browsing an interactive PROOF +session in ROOT. + %if %{roofit} %package roofit Summary: ROOT extension for modeling expected distributions - toolkit @@ -1243,6 +1328,26 @@ suitable for adoption in different disciplines as well. This package contains the RooFit toolkit classes. +%package roofit-common +Summary: ROOT extension for modeling expected distributions - common +License: BSD-2-Clause +Requires: %{name}-core%{?_isa} = %{version}-%{release} + +%description roofit-common +The RooFit packages provide a toolkit for modeling the expected +distribution of events in a physics analysis. Models can be used to +perform likelihood fits, produce plots, and generate "toy Monte +Carlo" samples for various studies. The RooFit tools are integrated +with the object-oriented and interactive ROOT graphical environment. + +RooFit has been developed for the BaBar collaboration, a high energy +physics experiment at the Stanford Linear Accelerator Center, and is +primarily targeted to the high-energy physicists using the ROOT +analysis environment, but the general nature of the package make it +suitable for adoption in different disciplines as well. + +This package contains the RooFit common classes. + %package roofit-core Summary: ROOT extension for modeling expected distributions - core License: BSD-2-Clause @@ -1253,17 +1358,12 @@ Requires: %{name}-hist%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} Requires: %{name}-matrix%{?_isa} = %{version}-%{release} -Requires: %{name}-minuit2%{?_isa} = %{version}-%{release} +Requires: %{name}-minuit%{?_isa} = %{version}-%{release} Requires: %{name}-roofit-batchcompute%{?_isa} = %{version}-%{release} -%if %{roofitmp} -Requires: %{name}-roofit-multiprocess%{?_isa} = %{version}-%{release} -Requires: %{name}-roofit-zmq%{?_isa} = %{version}-%{release} -%endif +Requires: %{name}-roofit-common%{?_isa} = %{version}-%{release} Requires: %{name}-tree%{?_isa} = %{version}-%{release} # Package split / Library split (from roofit) Obsoletes: %{name}-roofit < 6.20.00 -# Dataframe helpers are now part of core -Obsoletes: %{name}-roofit-dataframe-helpers < 6.34.00 %description roofit-core The RooFit packages provide a toolkit for modeling the expected @@ -1309,6 +1409,9 @@ This package contains RooFit classes that use the mathmore library. Summary: Optimized computation functions for PDFs License: BSD-2-Clause Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} +Requires: %{name}-multiproc%{?_isa} = %{version}-%{release} +Requires: %{name}-net%{?_isa} = %{version}-%{release} %description roofit-batchcompute While fitting, a significant amount of time and processing power is @@ -1323,6 +1426,28 @@ multiple times for different vector instuction set architectures and the optimal code is executed during runtime, as a result of an automatic hardware detection mechanism that this library contains. +%if %{dataframe} +%package roofit-dataframe-helpers +Summary: RooFit DaraFrame helpers +License: BSD-2-Clause +Requires: %{name}-core%{?_isa} = %{version}-%{release} + +%description roofit-dataframe-helpers +The RooFit packages provide a toolkit for modeling the expected +distribution of events in a physics analysis. Models can be used to +perform likelihood fits, produce plots, and generate "toy Monte +Carlo" samples for various studies. The RooFit tools are integrated +with the object-oriented and interactive ROOT graphical environment. + +RooFit has been developed for the BaBar collaboration, a high energy +physics experiment at the Stanford Linear Accelerator Center, and is +primarily targeted to the high-energy physicists using the ROOT +analysis environment, but the general nature of the package make it +suitable for adoption in different disciplines as well. + +This package contains DaraFrame helper classes for RooFit +%endif + %package roofit-hs3 Summary: RooFit HS3 License: BSD-2-Clause @@ -1333,6 +1458,7 @@ Requires: %{name}-matrix%{?_isa} = %{version}-%{release} Requires: %{name}-roofit%{?_isa} = %{version}-%{release} Requires: %{name}-roofit-core%{?_isa} = %{version}-%{release} Requires: %{name}-roofit-jsoninterface%{?_isa} = %{version}-%{release} +Requires: %{name}-roostats%{?_isa} = %{version}-%{release} %description roofit-hs3 When using RooFit, statistical models can be conveniently handled and @@ -1362,39 +1488,6 @@ suitable for adoption in different disciplines as well. This package contains the JSON interface to RooFit. -%package roofit-codegen -Summary: Code generation support for RooFit -License: BSD-2-Clause -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-hist-factory%{?_isa} = %{version}-%{release} -Requires: %{name}-roofit%{?_isa} = %{version}-%{release} -Requires: %{name}-roofit-core%{?_isa} = %{version}-%{release} - -%description roofit-codegen -This package contains a library providing classes that implement -code generation support for RooFit. - -%if %{roofitmp} -%package roofit-multiprocess -Summary: Multi-process support for RooFit -License: BSD-2-Clause -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-hist%{?_isa} = %{version}-%{release} -Requires: %{name}-roofit-zmq%{?_isa} = %{version}-%{release} - -%description roofit-multiprocess -This package contains a library providing classes that implement -mult-process support for RooFit. - -%package roofit-zmq -Summary: ZeroMQ interface library for RooFit -License: BSD-2-Clause - -%description roofit-zmq -This package contains a helper library used by RooFit::MultiProcess to -interface to the ZeroMQ library. -%endif - %package roostats Summary: Statistical tools built on top of RooFit Requires: %{name}-core%{?_isa} = %{version}-%{release} @@ -1418,6 +1511,8 @@ RooFit. %package hist-factory Summary: RooFit PDFs from ROOT histograms Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-graf%{?_isa} = %{version}-%{release} +Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} Requires: %{name}-hist%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-io-xmlparser%{?_isa} = %{version}-%{release} @@ -1427,43 +1522,29 @@ Requires: %{name}-roostats%{?_isa} = %{version}-%{release} %description hist-factory Create RooFit probability density functions from ROOT histograms. - -%package xroofit -Summary: Extra tools for RooFit projects -License: BSD-2-Clause -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-graf%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} -Requires: %{name}-gui%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-fitpanel%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-ged%{?_isa} = %{version}-%{release} -Requires: %{name}-hist%{?_isa} = %{version}-%{release} -Requires: %{name}-hist-factory%{?_isa} = %{version}-%{release} -Requires: %{name}-io%{?_isa} = %{version}-%{release} -Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} -Requires: %{name}-matrix%{?_isa} = %{version}-%{release} -Requires: %{name}-roofit%{?_isa} = %{version}-%{release} -Requires: %{name}-roofit-core%{?_isa} = %{version}-%{release} -Requires: %{name}-roofit-hs3%{?_isa} = %{version}-%{release} -Requires: %{name}-roostats%{?_isa} = %{version}-%{release} -Requires: %{name}-tree%{?_isa} = %{version}-%{release} - -%description xroofit -The RooFit packages provide a toolkit for modeling the expected -distribution of events in a physics analysis. Models can be used to -perform likelihood fits, produce plots, and generate "toy Monte -Carlo" samples for various studies. The RooFit tools are integrated -with the object-oriented and interactive ROOT graphical environment. - -RooFit has been developed for the BaBar collaboration, a high energy -physics experiment at the Stanford Linear Accelerator Center, and is -primarily targeted to the high-energy physicists using the ROOT -analysis environment, but the general nature of the package make it -suitable for adoption in different disciplines as well. - -This package contains extra tools for RooFit projects. %endif +%package sql-mysql +Summary: MySQL client plugin for ROOT +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-net%{?_isa} = %{version}-%{release} + +%description sql-mysql +This package contains the MySQL plugin for ROOT. This plugin +provides a thin client (interface) to MySQL servers. Using this +client, one can obtain information from a MySQL database into the +ROOT environment. + +%package sql-odbc +Summary: ODBC plugin for ROOT +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-net%{?_isa} = %{version}-%{release} + +%description sql-odbc +This package contains the ODBC (Open DataBase Connectivity) plugin +for ROOT, that allows transparent access to any kind of database that +supports the ODBC protocol. + %package sql-sqlite Summary: Sqlite client plugin for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} @@ -1475,6 +1556,17 @@ provides a thin client (interface) to sqlite servers. Using this client, one can obtain information from a sqlite database into the ROOT environment. +%package sql-pgsql +Summary: PostgreSQL client plugin for ROOT +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-net%{?_isa} = %{version}-%{release} + +%description sql-pgsql +This package contains the PostGreSQL plugin for ROOT. This plugin +provides a thin client (interface) to PostGreSQL servers. Using this +client, one can obtain information from a PostGreSQL database into the +ROOT environment. + %package tmva Summary: Toolkit for multivariate data analysis License: BSD-3-Clause @@ -1534,13 +1626,11 @@ License: BSD-3-Clause Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-tmva%{?_isa} = %{version}-%{release} Requires: %{name}-tmva-sofie%{?_isa} = %{version}-%{release} -Requires: %{name}-tree%{?_isa} = %{version}-%{release} Requires: python%{python3_pkgversion}-numpy %description tmva-python Python integration with TMVA. -%if %{rrr} %package tmva-r Summary: Toolkit for multivariate data analysis (R) License: BSD-3-Clause @@ -1551,13 +1641,11 @@ Requires: %{name}-tmva%{?_isa} = %{version}-%{release} %description tmva-r R integration with TMVA. -%endif %package tmva-sofie Summary: ROOT/TMVA SOFIE (System for Optimized Fast Inference code Emit) License: BSD-3-Clause Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-io%{?_isa} = %{version}-%{release} %description tmva-sofie ROOT/TMVA SOFIE (System for Optimized Fast Inference code Emit) @@ -1589,7 +1677,6 @@ Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-io-xml%{?_isa} = %{version}-%{release} Requires: %{name}-matrix%{?_isa} = %{version}-%{release} Requires: %{name}-tmva%{?_isa} = %{version}-%{release} -Requires: %{name}-tree%{?_isa} = %{version}-%{release} Requires: %{name}-tree-viewer%{?_isa} = %{version}-%{release} %description tmva-gui @@ -1612,7 +1699,9 @@ Requires: %{name}-hist%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} Requires: %{name}-tree%{?_isa} = %{version}-%{release} +%if %{root7} Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} +%endif Requires: %{name}-tree-player%{?_isa} = %{version}-%{release} Requires: %{name}-vecops%{?_isa} = %{version}-%{release} # Library split (tree-dataframe and vecops from tree-player) @@ -1686,10 +1775,23 @@ Requires: python%{python3_pkgversion}-%{name} = %{version}-%{release} The ROOT command line utilities is a set of scripts for common tasks written in python. +%package notebook +Summary: Static files for the Jupyter ROOT Notebook +BuildArch: noarch +Requires: %{name}-core = %{version}-%{release} +Requires: js-jsroot >= 7 +%if %{?fedora}%{!?fedora:0} +# jupyter-notebook not available in RHEL/EPEL +# some functionality missing +Requires: jupyter-notebook +%endif + +%description notebook +Javascript and style files for the Jupyter ROOT Notebook. + %package gui-webdisplay Summary: Web display for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} Requires: %{name}-net%{?_isa} = %{version}-%{release} Requires: %{name}-net-http%{?_isa} = %{version}-%{release} @@ -1697,6 +1799,17 @@ Requires: %{name}-net-http%{?_isa} = %{version}-%{release} %description gui-webdisplay This package contains a web display extension for ROOT. +%ifarch %{qt5_qtwebengine_arches} +%package gui-qt5webdisplay +Summary: Qt5 Web display +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-gui-webdisplay%{?_isa} = %{version}-%{release} +Requires: %{name}-net-http%{?_isa} = %{version}-%{release} + +%description gui-qt5webdisplay +This package contains a Qt5 web display extension for ROOT. +%endif + %ifarch %{qt6_qtwebengine_arches} %package gui-qt6webdisplay Summary: Qt6 Web display @@ -1716,50 +1829,15 @@ Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} Requires: %{name}-gui-webdisplay%{?_isa} = %{version}-%{release} Requires: %{name}-hist%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} -Requires: %{name}-net-http%{?_isa} = %{version}-%{release} %description gui-webgui6 This package provides a Web based GUI for ROOT. -%package gui-browsable -Summary: ROOT GUI browsable providers -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-geom%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-treemap%{?_isa} = %{version}-%{release} -Requires: %{name}-hist%{?_isa} = %{version}-%{release} -Requires: %{name}-io%{?_isa} = %{version}-%{release} -Requires: %{name}-tree%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple-browse%{?_isa} = %{version}-%{release} -# Package split (gui-browsable-v7 from gui-browsable) -Obsoletes: %{name}-gui-browsable < 6.32.06 - -%description gui-browsable -This package contains ROOT GUI browsable providers. - -%package gui-browserv7 -Summary: ROOT file browser and browser widgets -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-geom%{?_isa} = %{version}-%{release} -Requires: %{name}-geom-webviewer%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-browsable%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-webdisplay%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-webgui6%{?_isa} = %{version}-%{release} -Requires: %{name}-io%{?_isa} = %{version}-%{release} -Requires: %{name}-tree%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-webviewer%{?_isa} = %{version}-%{release} -# Package split (gui-browserv7-v7 from gui-browserv7) -Obsoletes: %{name}-gui-browserv7 < 6.32.06 - -%description gui-browserv7 -This package contains the ROOT file browser (RBrowser) and browser widgets. - +%if %{root7} %package geom-webviewer Summary: Geometry web viewer library for ROOT Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-geom%{?_isa} = %{version}-%{release} -Requires: %{name}-geom-painter%{?_isa} = %{version}-%{release} Requires: %{name}-graf3d-csg%{?_isa} = %{version}-%{release} Requires: %{name}-gui-webdisplay%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} @@ -1767,40 +1845,6 @@ Requires: %{name}-io%{?_isa} = %{version}-%{release} %description geom-webviewer This package contains a library for viewing geometries in a web GUI. -%package tree-ntuple -Summary: The new ROOT n-tuple class -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-io%{?_isa} = %{version}-%{release} - -%description tree-ntuple -This package contains the new ROOT n-tuple class (RNTuple). - -%package tree-ntuple-browse -Summary: N-Tuple browsing library for ROOT -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-graf%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-treemap%{?_isa} = %{version}-%{release} -Requires: %{name}-hist%{?_isa} = %{version}-%{release} -Requires: %{name}-io%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple-utils%{?_isa} = %{version}-%{release} - -%description tree-ntuple-browse -This package contains a library for browsing n-tuples. - -%package tree-ntuple-utils -Summary: Ntuple utility library -Requires: %{name}-core%{?_isa} = %{version}-%{release} -Requires: %{name}-hist%{?_isa} = %{version}-%{release} -Requires: %{name}-io%{?_isa} = %{version}-%{release} -Requires: %{name}-tree%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} - -%description tree-ntuple-utils -This package contains utility functions for ntuples. - -%if %{root7} %package graf-gpadv7 Summary: Canvas and pad library for ROOT (ROOT 7) Requires: %{name}-core%{?_isa} = %{version}-%{release} @@ -1820,10 +1864,9 @@ This package contains graphics primitives for ROOT 7 Summary: Event display library for ROOT (ROOT 7) Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-geom%{?_isa} = %{version}-%{release} -Requires: %{name}-geom-webviewer%{?_isa} = %{version}-%{release} Requires: %{name}-graf%{?_isa} = %{version}-%{release} -Requires: %{name}-graf3d%{?_isa} = %{version}-%{release} Requires: %{name}-graf3d-csg%{?_isa} = %{version}-%{release} +Requires: %{name}-gui-browserv7%{?_isa} = %{version}-%{release} Requires: %{name}-gui-webdisplay%{?_isa} = %{version}-%{release} Requires: %{name}-hist%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} @@ -1837,33 +1880,35 @@ Requires: %{name}-tree-player%{?_isa} = %{version}-%{release} %description graf3d-eve7 This package contains a library for defining event displays in ROOT 7. -%package gui-browsable-v7 -Summary: Additional ROOT GUI browsable providers (ROOT 7) +%package gui-browsable +Summary: GUI browsable (ROOT 7) Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-graf-gpadv7%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-browsable%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-treemap%{?_isa} = %{version}-%{release} Requires: %{name}-hist%{?_isa} = %{version}-%{release} +Requires: %{name}-hist-draw%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} Requires: %{name}-tree%{?_isa} = %{version}-%{release} Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} -Requires: %{name}-tree-ntuple-browse%{?_isa} = %{version}-%{release} -# Package split (gui-browsable-v7 from gui-browsable) -Obsoletes: %{name}-gui-browsable < 6.32.06 -%description gui-browsable-v7 -This package contains additional ROOT GUI browsable providers for ROOT 7. +%description gui-browsable +This package contains GUI browsable components for ROOT 7. -%package gui-browserv7-v7 -Summary: Additional ROOT browser widgets (ROOT 7) +%package gui-browserv7 +Summary: Browser (ROOT 7) Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-geom%{?_isa} = %{version}-%{release} +Requires: %{name}-geom-webviewer%{?_isa} = %{version}-%{release} +Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} Requires: %{name}-graf-gpadv7%{?_isa} = %{version}-%{release} Requires: %{name}-gui-browsable%{?_isa} = %{version}-%{release} -Requires: %{name}-gui-browserv7%{?_isa} = %{version}-%{release} -# Package split (gui-browserv7-v7 from gui-browserv7) -Obsoletes: %{name}-gui-browserv7 < 6.32.06 +Requires: %{name}-gui-webdisplay%{?_isa} = %{version}-%{release} +Requires: %{name}-gui-webgui6%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} +Requires: %{name}-tree%{?_isa} = %{version}-%{release} +Requires: %{name}-tree-webviewer%{?_isa} = %{version}-%{release} -%description gui-browserv7-v7 -This package contains additional ROOT browser widgets for ROOT 7. +%description gui-browserv7 +This package contains a file browser for ROOT 7. %package gui-canvaspainter Summary: Canvas painter (ROOT 7) @@ -1879,7 +1924,6 @@ This package contains a canvas painter extension for ROOT 7 Summary: GUI element for fits in ROOT (ROOT 7) Requires: %{name}-core%{?_isa} = %{version}-%{release} Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} -Requires: %{name}-graf-gpadv7%{?_isa} = %{version}-%{release} Requires: %{name}-gui-webdisplay%{?_isa} = %{version}-%{release} Requires: %{name}-hist%{?_isa} = %{version}-%{release} Requires: %{name}-io%{?_isa} = %{version}-%{release} @@ -1890,89 +1934,169 @@ This package contains a library to show a pop-up dialog when fitting various kinds of data. %package histv7 -Summary: Histogram library for ROOT 7 +Summary: Histogram library for ROOT (ROOT 7) Requires: %{name}-core%{?_isa} = %{version}-%{release} %description histv7 This package contains a library for histogramming in ROOT 7. + +%package hist-draw +Summary: Histogram drawing (ROOT 7) +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-graf-gpadv7%{?_isa} = %{version}-%{release} + +%description hist-draw +This package contains an histogram drawing extension for ROOT 7. + +%package tree-ntuple +Summary: Ntuple (ROOT 7) +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} + +%description tree-ntuple +This package contains an ntuple extension for ROOT 7. + +%package tree-ntuple-utils +Summary: Ntuple utility library (ROOT 7) +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-tree-ntuple%{?_isa} = %{version}-%{release} + +%description tree-ntuple-utils +This package contains utility functions for ntuples. + +%if %{roofit} +%package xroofit +Summary: Extra tools for RooFit projects +License: BSD-2-Clause +Requires: %{name}-core%{?_isa} = %{version}-%{release} +Requires: %{name}-graf%{?_isa} = %{version}-%{release} +Requires: %{name}-graf-gpad%{?_isa} = %{version}-%{release} +Requires: %{name}-gui%{?_isa} = %{version}-%{release} +Requires: %{name}-gui-ged%{?_isa} = %{version}-%{release} +Requires: %{name}-hist%{?_isa} = %{version}-%{release} +Requires: %{name}-hist-factory%{?_isa} = %{version}-%{release} +Requires: %{name}-io%{?_isa} = %{version}-%{release} +Requires: %{name}-mathcore%{?_isa} = %{version}-%{release} +Requires: %{name}-matrix%{?_isa} = %{version}-%{release} +Requires: %{name}-roofit%{?_isa} = %{version}-%{release} +Requires: %{name}-roofit-core%{?_isa} = %{version}-%{release} +Requires: %{name}-roofit-hs3%{?_isa} = %{version}-%{release} +Requires: %{name}-roostats%{?_isa} = %{version}-%{release} + +%description xroofit +The RooFit packages provide a toolkit for modeling the expected +distribution of events in a physics analysis. Models can be used to +perform likelihood fits, produce plots, and generate "toy Monte +Carlo" samples for various studies. The RooFit tools are integrated +with the object-oriented and interactive ROOT graphical environment. + +RooFit has been developed for the BaBar collaboration, a high energy +physics experiment at the Stanford Linear Accelerator Center, and is +primarily targeted to the high-energy physicists using the ROOT +analysis environment, but the general nature of the package make it +suitable for adoption in different disciplines as well. + +This package contains extra tools for RooFit projects. +%endif %endif %prep -%setup -q -a 1 -a 9 +%setup -q -a 1 -%patch -P0 -p1 -%patch -P1 -p1 -%patch -P2 -p1 -%patch -P3 -p1 -%patch -P4 -p1 -%patch -P5 -p1 -%patch -P6 -p1 -%patch -P7 -p1 -%patch -P8 -p1 -%patch -P9 -p1 -%patch -P10 -p1 -%patch -P11 -p1 -%patch -P12 -p1 -%patch -P13 -p1 -%patch -P14 -p1 -%patch -P15 -p1 -%patch -P16 -p1 -%patch -P17 -p1 +%patch -P 0 -p1 +%patch -P 1 -p1 +%patch -P 2 -p1 +%patch -P 3 -p1 +%patch -P 4 -p1 +%patch -P 5 -p1 +%patch -P 6 -p1 +%patch -P 7 -p1 +%patch -P 8 -p1 +%patch -P 9 -p1 +%patch -P 10 -p1 +%patch -P 11 -p1 +%patch -P 12 -p1 +%patch -P 13 -p1 +%patch -P 14 -p1 +%patch -P 15 -p1 +%patch -P 16 -p1 # Remove bundled sources in order to be sure they are not used # * afterimage -rm -rf graf2d/asimage/src/libAfterImage/{libjpeg,libpng,libungif,zlib} -sed '/zlib\/zlib.h/d' -i graf2d/asimage/src/libAfterImage/.depend +rm -rf graf2d/asimage/src/libAfterImage # * ftgl rm -rf graf3d/ftgl/src graf3d/ftgl/inc # * freetype rm -rf graf2d/freetype/src -# * glew, lz4, nlohmann, pcre, xxhash, zlib, zstd +# * davix, glew, lz4, nlohmann, openssl, pcre, tbb, xxhash, zlib, zstd +rm -rf builtins/davix rm -rf builtins/glew rm -rf builtins/lz4 -%if ! %{bundlejson} rm -rf builtins/nlohmann -%endif +rm -rf builtins/openssl rm -rf builtins/pcre +rm -rf builtins/tbb +rm -rf builtins/xrootd rm -rf builtins/xxhash +rm -rf builtins/zeromq rm -rf builtins/zlib rm -rf builtins/zstd # * lzma -rm core/lzma/src/*.tar.gz +rm -rf core/lzma/src/*.tar.gz # * gl2ps rm graf3d/gl/src/gl2ps.cxx graf3d/gl/src/gl2ps/gl2ps.h # * unuran -rm math/unuran/src/*.tar.gz +rm -rf math/unuran/src/*.tar.gz +# * xrootd-private-devel headers +rm -rf proof/xrdinc/* # * x11 extension headers rm -rf graf2d/x11/inc/X11 +# * mathjax +rm -rf documentation/doxygen/mathjax.tar.gz # * jsroot rm -rf js/[^f]* js/files/draw.htm js/files/online.htm -# Additional documentation -install -p -m 644 %{SOURCE7} bindings/jupyroot +# Remove pre-minified script and style files +rm etc/notebook/JsMVA/js/*.min.js +rm etc/notebook/JsMVA/css/*.min.css + +%if %{?rhel}%{!?rhel:0} == 8 +# Allow older json on EPEL 8 +sed 's!nlohmann_json 3.9!nlohmann_json 3.6!' \ + -i cmake/modules/SearchInstalledSoftware.cmake +%endif %build -%if %{?rhel}%{!?rhel:0} == 10 # This package triggers a fault in LLVM when LTO is enabled. Until LLVM # is analyzed and fixed, disable LTO %define _lto_cflags %{nil} -%endif unset QTDIR unset QTLIB unset QTINC +# Minify script and style files +for s in etc/notebook/JsMVA/js/*.js ; do + uglifyjs-3 ${s} -c -m -o ${s%.js}.min.js +done +for s in etc/notebook/JsMVA/css/*.css ; do + python3 -m rcssmin < ${s} > ${s%.css}.min.css +done + +# Avoid overlinking (this is the default on Fedora and EPEL 9) +%if %{?rhel}%{!?rhel:0} == 8 +LDFLAGS="-Wl,--as-needed %{?__global_ldflags}" +%endif + %cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \ -DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir}/%{name} \ -DCMAKE_INSTALL_PYTHONDIR:PATH=%{python3_sitearch} \ -DCMAKE_INSTALL_SYSCONFDIR:PATH=%{_datadir}/%{name} \ -DCMAKE_INSTALL_DOCDIR:PATH=%{_pkgdocdir} \ - -DCMAKE_SKIP_INSTALL_RPATH:BOOL=ON \ - -DPython3_EXECUTABLE:PATH=%{__python3} \ -Dgnuinstall:BOOL=ON \ + -Dbuiltin_afterimage:BOOL=OFF \ -Dbuiltin_cfitsio:BOOL=OFF \ - -Dbuiltin_civetweb:BOOL=ON \ -Dbuiltin_clang:BOOL=ON \ -Dbuiltin_cling:BOOL=ON \ -Dbuiltin_cppzmq:BOOL=OFF \ @@ -1980,24 +2104,17 @@ unset QTINC -Dbuiltin_fftw3:BOOL=OFF \ -Dbuiltin_freetype:BOOL=OFF \ -Dbuiltin_ftgl:BOOL=OFF \ - -Dbuiltin_gif:BOOL=OFF \ -Dbuiltin_gl2ps:BOOL=OFF \ -Dbuiltin_glew:BOOL=OFF \ -Dbuiltin_gsl:BOOL=OFF \ -Dbuiltin_gtest:BOOL=OFF \ - -Dbuiltin_jpeg:BOOL=OFF \ -Dbuiltin_llvm:BOOL=ON \ -Dbuiltin_lz4:BOOL=OFF \ -Dbuiltin_lzma:BOOL=OFF \ -%if %{bundlejson} - -Dbuiltin_nlohmannjson:BOOL=ON \ -%else -Dbuiltin_nlohmannjson:BOOL=OFF \ -%endif -Dbuiltin_openssl:BOOL=OFF \ -Dbuiltin_openui5:BOOL=ON \ -Dbuiltin_pcre:BOOL=OFF \ - -Dbuiltin_png:BOOL=OFF \ -Dbuiltin_tbb:BOOL=OFF \ -Dbuiltin_unuran:BOOL=OFF \ -Dbuiltin_vc:BOOL=OFF \ @@ -2008,21 +2125,20 @@ unset QTINC -Dbuiltin_zeromq:BOOL=OFF \ -Dbuiltin_zlib:BOOL=OFF \ -Dbuiltin_zstd:BOOL=OFF \ + -Dalien:BOOL=OFF \ %ifnarch %{ix86} %{arm} -Darrow:BOOL=ON \ %else -Darrow:BOOL=OFF \ %endif -Dasimage:BOOL=ON \ - -Dasimage_tiff:BOOL=ON \ -Dccache:BOOL=OFF \ -Ddistcc:BOOL=OFF \ -Dcefweb:BOOL=OFF \ - -Dcheck_connection:BOOL=OFF \ - -Dclad:BOOL=ON \ - -DCLAD_SOURCE_DIR:PATH=${PWD}/clad-2.2 \ + -Dclad:BOOL=OFF \ -Dcocoa:BOOL=OFF \ -Dcuda:BOOL=OFF \ + -Dcxxmodules:BOOL=OFF \ -Ddaos:BOOL=OFF \ %if %{dataframe} -Ddataframe:BOOL=ON \ @@ -2032,55 +2148,61 @@ unset QTINC -Ddavix:BOOL=ON \ -Ddcache:BOOL=ON \ -Ddev:BOOL=OFF \ - -Dexperimental_adaptivecpp=OFF \ - -Dexperimental_genvectorx=OFF \ + -Dexceptions:BOOL=ON \ -Dfcgi:BOOL=ON \ -Dfftw3:BOOL=ON \ -DFIREFOX_EXECUTABLE:PATH=/usr/bin/firefox \ -Dfitsio:BOOL=ON \ -Dfortran:BOOL=ON \ -Dgdml:BOOL=ON \ - -Dgeom:BOOL=ON \ - -Dgeombuilder:BOOL=ON \ + -Dgfal:BOOL=ON \ + -Dgsl_shared:BOOL=ON \ -Dgviz:BOOL=ON \ -Dhttp:BOOL=ON \ -Dimt:BOOL=ON \ + -Djemalloc:BOOL=OFF \ -Dlibcxx:BOOL=OFF \ -Dmathmore:BOOL=ON \ -Dmemory_termination:BOOL=OFF \ + -Dminuit2:BOOL=ON \ -Dminuit2_mpi:BOOL=OFF \ - -Dminuit2_omp:BOOL=ON \ + -Dminuit2_omp:BOOL=OFF \ + -Dmlp:BOOL=ON \ + -Dmonalisa:BOOL=OFF \ -Dmpi:BOOL=OFF \ + -Dmysql:BOOL=ON \ + -Dodbc:BOOL=ON \ -Dopengl:BOOL=ON \ - -Dpyroot:BOOL=ON \ + -Doracle:BOOL=OFF \ + -Dpgsql:BOOL=ON \ + -Dpythia6:BOOL=OFF \ -Dpythia8:BOOL=ON \ + -Dpyroot:BOOL=ON \ + -Dpyroot_legacy:BOOL=OFF \ +%ifarch %{qt5_qtwebengine_arches} + -Dqt5web:BOOL=ON \ +%else + -Dqt5web:BOOL=OFF \ +%endif %ifarch %{qt6_qtwebengine_arches} -Dqt6web:BOOL=ON \ %else -Dqt6web:BOOL=OFF \ %endif -%if %{rrr} -Dr:BOOL=ON \ -%else - -Dr:BOOL=OFF \ -%endif %if %{roofit} -Droofit:BOOL=ON \ -%if %{roofitmp} - -Droofit_multiprocess:BOOL=ON \ -%else - -Droofit_multiprocess:BOOL=OFF \ -%endif %else -Droofit:BOOL=OFF \ - -Droofit_multiprocess:BOOL=OFF \ %endif + -Droofit_multiprocess:BOOL=OFF \ -Droofit_hs3_ryml:BOOL=OFF \ %if %{root7} -Droot7:BOOL=ON \ %else -Droot7:BOOL=OFF \ %endif + -Drpath:BOOL=OFF \ -Druby:BOOL=OFF \ -Druntime_cxxmodules:BOOL=OFF \ -Dshadowpw:BOOL=ON \ @@ -2089,26 +2211,23 @@ unset QTINC -Dspectrum:BOOL=ON \ -Dsqlite:BOOL=ON \ -Dssl:BOOL=ON \ - -Dthisroot_scripts:BOOL=OFF \ + -Dtcmalloc:BOOL=OFF \ -Dtmva:BOOL=ON \ -Dtmva-cpu:BOOL=ON \ - -Dtmva-cudnn:BOOL=OFF \ -Dtmva-gpu:BOOL=OFF \ -Dtmva-pymva:BOOL=ON \ -%if %{rrr} -Dtmva-rmva:BOOL=ON \ -%else - -Dtmva-rmva:BOOL=OFF \ -%endif %if %{tmvasofieparser} -Dtmva-sofie:BOOL=ON \ %else -Dtmva-sofie:BOOL=OFF \ %endif - -Dtpython:BOOL=ON \ - -Dunfold:BOOL=ON \ -Dunuran:BOOL=ON \ +%if %{?fedora}%{!?fedora:0} -During:BOOL=ON \ +%else + -During:BOOL=OFF \ +%endif -Dvc:BOOL=OFF \ -Dvdt:BOOL=OFF \ -Dveccore:BOOL=OFF \ @@ -2117,9 +2236,9 @@ unset QTINC -Dx11:BOOL=ON \ -Dxml:BOOL=ON \ -Dxrootd:BOOL=ON \ + -Dxproofd:BOOL=OFF \ -Dfail-on-missing:BOOL=ON \ -Dtesting:BOOL=ON \ - -Dtestsupport:BOOL=ON \ -Dtest_distrdf_pyspark:BOOL=OFF \ -Dtest_distrdf_dask:BOOL=OFF \ -Dclingtest:BOOL=OFF \ @@ -2148,6 +2267,9 @@ install -p -m 644 %{SOURCE5} %{buildroot}%{_datadir}/mime/packages install -p -m 644 %{SOURCE6} \ %{buildroot}%{_datadir}/icons/hicolor/48x48/mimetypes +# Additional documentation +install -p -m 644 %{SOURCE7} %{buildroot}%{_pkgdocdir} + # Move python cli helper to its own directory mkdir -p %{buildroot}%{_datadir}/%{name}/cli mv %{buildroot}%{python3_sitearch}/cmdLineUtils.py \ @@ -2160,37 +2282,43 @@ mv %{buildroot}%{_libdir}/%{name}/*-gdb.py \ %{buildroot}%{_datadir}/gdb/auto-load%{_libdir}/%{name} # Fix python extension suffix -mv %{buildroot}%{python3_sitearch}/ROOT/libROOTPythonizations.so \ - %{buildroot}%{python3_sitearch}/ROOT/libROOTPythonizations%{python3_ext_suffix} -mv %{buildroot}%{python3_sitearch}/cppyy/libcppyy.so \ - %{buildroot}%{python3_sitearch}/cppyy/libcppyy%{python3_ext_suffix} +mv %{buildroot}%{python3_sitearch}/libROOTPythonizations%{python3_version_uscore}.so.%{version} \ + %{buildroot}%{python3_sitearch}/libROOTPythonizations%{python3_version_uscore}%{python3_ext_suffix} +rm %{buildroot}%{python3_sitearch}/libROOTPythonizations%{python3_version_uscore}.so.%{libversion} +rm %{buildroot}%{python3_sitearch}/libROOTPythonizations%{python3_version_uscore}.so + +mv %{buildroot}%{python3_sitearch}/libJupyROOT%{python3_version_uscore}.so.%{version} \ + %{buildroot}%{python3_sitearch}/libJupyROOT%{python3_version_uscore}%{python3_ext_suffix} +rm %{buildroot}%{python3_sitearch}/libJupyROOT%{python3_version_uscore}.so.%{libversion} +rm %{buildroot}%{python3_sitearch}/libJupyROOT%{python3_version_uscore}.so # Move noarch python modules to sitelib if [ "%{python3_sitelib}" != "%{python3_sitearch}" ] ; then mkdir -p %{buildroot}%{python3_sitelib} -mv %{buildroot}%{python3_sitearch}/JupyROOT %{buildroot}%{python3_sitelib} +mv %{buildroot}%{python3_sitearch}/JsMVA %{buildroot}%{python3_sitelib} %if %{distrdf} mv %{buildroot}%{python3_sitearch}/DistRDF %{buildroot}%{python3_sitelib} %endif fi -# Create .dist-info files so that rpm auto-generates provides -mkdir %{buildroot}%{python3_sitearch}/ROOT-%{version}.dist-info +# Create .egg-info files so that rpm auto-generates provides echo 'Name: ROOT' > \ - %{buildroot}%{python3_sitearch}/ROOT-%{version}.dist-info/METADATA + %{buildroot}%{python3_sitearch}/ROOT-%{version}.egg-info echo 'Version: %{version}' >> \ - %{buildroot}%{python3_sitearch}/ROOT-%{version}.dist-info/METADATA -mkdir %{buildroot}%{python3_sitelib}/JupyROOT-%{version}.dist-info + %{buildroot}%{python3_sitearch}/ROOT-%{version}.egg-info echo 'Name: JupyROOT' > \ - %{buildroot}%{python3_sitelib}/JupyROOT-%{version}.dist-info/METADATA + %{buildroot}%{python3_sitearch}/JupyROOT-%{version}.egg-info echo 'Version: %{version}' >> \ - %{buildroot}%{python3_sitelib}/JupyROOT-%{version}.dist-info/METADATA + %{buildroot}%{python3_sitearch}/JupyROOT-%{version}.egg-info +echo 'Name: JsMVA' > \ + %{buildroot}%{python3_sitelib}/JsMVA-%{version}.egg-info +echo 'Version: %{version}' >> \ + %{buildroot}%{python3_sitelib}/JsMVA-%{version}.egg-info %if %{distrdf} -mkdir %{buildroot}%{python3_sitelib}/DistRDF-%{version}.dist-info echo 'Name: DistRDF' > \ - %{buildroot}%{python3_sitelib}/DistRDF-%{version}.dist-info/METADATA + %{buildroot}%{python3_sitelib}/DistRDF-%{version}.egg-info echo 'Version: %{version}' >> \ - %{buildroot}%{python3_sitelib}/DistRDF-%{version}.dist-info/METADATA + %{buildroot}%{python3_sitelib}/DistRDF-%{version}.egg-info %endif # Put jupyter stuff in the right places @@ -2202,13 +2330,12 @@ sed -e 's/ROOT C++/& (Python 3)/' \ -e 's!python[0-9]*\.[0-9]*!%{__python3}!' \ -i %{buildroot}%{_datadir}/jupyter/kernels/python%{python3_pkgversion}-jupyroot/kernel.json sed -e '/^\#!/d' \ - -i %{buildroot}%{python3_sitelib}/JupyROOT/kernel/rootkernel.py + -i %{buildroot}%{python3_sitearch}/JupyROOT/kernel/rootkernel.py rm -rf %{buildroot}%{_datadir}/%{name}/notebook/custom rm -rf %{buildroot}%{_datadir}/%{name}/notebook/html rm -rf %{buildroot}%{_datadir}/%{name}/notebook/kernels rm %{buildroot}%{_datadir}/%{name}/notebook/jupyter_notebook_config.py -rmdir %{buildroot}%{_datadir}/%{name}/notebook # Replace the rootnb.exe wrapper with a simpler one cat > %{buildroot}%{_bindir}/rootnb.exe << EOF @@ -2225,10 +2352,8 @@ jupyter notebook "\$@" EOF # Avoid /usr/bin/env shebangs (and adapt cli to cmdLineUtils location) -sed -e 's!/usr/bin/env bash!/bin/bash!' \ - -i %{buildroot}%{_bindir}/root-config \ - %{buildroot}%{_bindir}/rootssh -sed -e 's!/usr/bin/env python3!%{__python3}!' \ +sed -e 's!/usr/bin/env bash!/bin/bash!' -i %{buildroot}%{_bindir}/root-config +sed -e 's!/usr/bin/env /usr/bin/python.*!%{__python3}!' \ -e '/import sys/d' \ -e '/import cmdLineUtils/iimport sys' \ -e '/import cmdLineUtils/isys.path.insert(0, "%{_datadir}/%{name}/cli")' \ @@ -2241,38 +2366,65 @@ sed -e 's!/usr/bin/env python3!%{__python3}!' \ %{buildroot}%{_bindir}/rootprint \ %{buildroot}%{_bindir}/rootrm \ %{buildroot}%{_bindir}/rootslimtree -sed -e 's!/usr/bin/env python3!%{__python3}!' \ +sed -e 's!/usr/bin/env /usr/bin/python.*!%{__python3}!' \ -i %{buildroot}%{_bindir}/rootdrawtree sed -e 's!/usr/bin/env python!%{__python3}!' \ - -i %{buildroot}%{_datadir}/%{name}/dictpch/makepch.py -sed -e 's!/usr/bin/python!%{__python3}!' \ - -i %{buildroot}%{_datadir}/%{name}/pdg_table_update.py + -i %{buildroot}%{_datadir}/%{name}/dictpch/makepch.py \ + %{buildroot}%{_pkgdocdir}/tutorials/histfactory/example.py \ + %{buildroot}%{_pkgdocdir}/tutorials/histfactory/makeQuickModel.py \ + %{buildroot}%{_pkgdocdir}/tutorials/tmva/keras/ApplicationClassificationKeras.py \ + %{buildroot}%{_pkgdocdir}/tutorials/tmva/keras/ApplicationRegressionKeras.py \ + %{buildroot}%{_pkgdocdir}/tutorials/tmva/keras/ClassificationKeras.py \ + %{buildroot}%{_pkgdocdir}/tutorials/tmva/keras/GenerateModel.py \ + %{buildroot}%{_pkgdocdir}/tutorials/tmva/keras/MulticlassKeras.py \ + %{buildroot}%{_pkgdocdir}/tutorials/tmva/keras/RegressionKeras.py # Remove some junk +rm %{buildroot}%{_datadir}/%{name}/proof/*.sample +rm -rf %{buildroot}%{_datadir}/%{name}/proof/utils rm %{buildroot}%{_datadir}/%{name}/root.desktop +rm %{buildroot}%{_bindir}/setxrd* +rm %{buildroot}%{_bindir}/thisroot* rm %{buildroot}%{_pkgdocdir}/INSTALL +rm %{buildroot}%{_pkgdocdir}/README.ALIEN rm %{buildroot}%{_pkgdocdir}/README.CXXMODULES.md -rm -rf %{buildroot}%{_datadir}/%{name}/html +rm %{buildroot}%{_pkgdocdir}/README.MONALISA # Only used on Windows rm %{buildroot}%{_datadir}/%{name}/macros/fileopen.C # Remove plugin definitions for non-built and obsolete plugins pushd %{buildroot}%{_datadir}/%{name}/plugins -%if ! %{rrr} -rm ROOT@@Math@@Minimizer/P090_RMinimizer.C +%if ! %{root7} +rm TBrowserImp/P030_RWebBrowserImp.C %endif +rm TDataSetManager/P020_TDataSetManagerAliEn.C +rm TFile/P070_TAlienFile.C rm TGLManager/P020_TGWin32GLManager.C rm TGLManager/P030_TGOSXGLManager.C +rm TGrid/P010_TAlien.C +rm TProofMgr/P010_TXProofMgr.C +rm TProofServ/P010_TXProofServ.C +rm TSlave/P010_TXSlave.C +rm TSQLServer/P040_TOracleServer.C +rm TSystem/P030_TAlienSystem.C rm TVirtualGeoConverter/P010_TGeoVGConverter.C +%if ! %{root7} +rm TVirtualGeoPainter/P020_RGeoPainter.C +%endif rm TVirtualGLImp/P020_TGWin32GL.C +rm TVirtualMonitoringWriter/P010_TMonaLisaWriter.C rm TVirtualX/P030_TGWin32.C rm TVirtualX/P050_TGQuartz.C +rmdir TGrid +rmdir TProofMgr +rmdir TProofServ +rmdir TSlave rmdir TVirtualGeoConverter popd # Replace bundled jsroot with symlinks to system version -for x in build img mathjax modules scripts files/draw.htm files/online.htm ; do +for x in build img modules scripts files/draw.htm files/online.htm ; do ln -nrs %{buildroot}%{_jsdir}/jsroot/$x \ %{buildroot}%{_datadir}/%{name}/js/$x done @@ -2293,8 +2445,13 @@ If this target is not used this warning can be ignored.")' \ -e '/Possible reasons include/,/)/d' \ -i %{buildroot}%{_datadir}/%{name}/cmake/ROOTConfig-targets.cmake +# Rename to avoid name clashes +cp -p interpreter/llvm/src/CREDITS.TXT interpreter/llvm/src/llvm-CREDITS.TXT +cp -p interpreter/llvm/src/LICENSE.TXT interpreter/llvm/src/llvm-LICENSE.TXT +cp -p interpreter/llvm/src/README.txt interpreter/llvm/src/llvm-README.txt + # Create includelist files ... -for f in `find %{_vpath_builddir} -name cmake_install.cmake -a '!' -path '*/llvm-project/*'` ; do +for f in `find %{_vpath_builddir} -name cmake_install.cmake -a '!' -path '*/llvm/*'` ; do l=`sed 's!%{_vpath_builddir}/\(.*\)/cmake_install.cmake!includelist-\1!' <<< $f` l=`tr / - <<< $l` tmpdir=`mktemp -d` @@ -2319,9 +2476,17 @@ ln -s ../../files files popd pushd runtutorials ln -s ../../files files -ln -s ../../files/tutorials/df014_CsvDataSource_MuRun2010B.csv CsvDataSource_MuRun2010B.csv -ln -s ../../files/usa.root usa.root +for x in df014_CsvDataSource_MuRun2010B_cpp.csv \ + df014_CsvDataSource_MuRun2010B_py.csv \ + df015_CsvDataSource_MuRun2010B.csv ; do + ln -sf ../../files/tutorials/df014_CsvDataSource_MuRun2010B.csv $x +done popd +pushd tmva/tmva/test/DNN +ln -s ../../../../../files files +popd +pushd tmva/tmva/test/envelope +ln -s ../../../../../files files popd # Exclude some tests that can not be run @@ -2329,317 +2494,261 @@ popd # - test-stressIOPlugins-* # requires network access (by design since they test the remote file IO) # -# - tutorial-analysis-dataframe-df101_h1Analysis -# - tutorial-analysis-tree-run_h1analysis -# - tutorial-legacy-multicore-mp104_processH1 +# - tutorial-dataframe-df101_h1Analysis +# - tutorial-tree-run_h1analysis +# - tutorial-multicore-imt001_parBranchProcessing +# - tutorial-multicore-mp103_processSelector +# - tutorial-multicore-mp104_processH1 +# - tutorial-multicore-mp105_processEntryList # requires network access: http://root.cern.ch/files/h1/ # -# - tutorial-io-tree-imt_parTreeProcessing +# - tutorial-multicore-imt101_parTreeProcessing # requires input data: http://root.cern.ch/files/tp_process_imt.root (707 MB) # -# - tutorial-analysis-dataframe-df###_SQlite* +# - tutorial-dataframe-df###_SQlite* # reads sqlite data over network: # http://root.cern.ch/files/root_download_stats.sqlite # -# - tutorial-analysis-dataframe-df033_Describe-py -# - tutorial-analysis-dataframe-df102_NanoAODDimuonAnalysis(-py)? +# - tutorial-dataframe-df033_Describe-py +# - tutorial-dataframe-df102_NanoAODDimuonAnalysis(-py)? # reads input data over network: # root://eospublic.cern.ch//eos/opendata/cms/derived-data/ # AOD2NanoAODOutreachTool/Run2012BC_DoubleMuParked_Muons.root # -# - gtest-tree-treeplayer-treeprocessormt-remotefiles -# - tutorial-analysis-dataframe-df103_NanoAODHiggsAnalysis(-py)? +# - gtest-tree-treeplayer-test-treeprocessormt-remotefiles +# - tutorial-dataframe-df103_NanoAODHiggsAnalysis(-py)? # reads input data over network: # root://eospublic.cern.ch//eos/root-eos/cms_opendata_2012_nanoaod/ # -# - tutorial-analysis-dataframe-df104_HiggsToTwoPhotons-py -# - tutorial-analysis-dataframe-df105_WBosonAnalysis-py -# - tutorial-analysis-dataframe-df106_HiggsToFourLeptons(-py) -# - tutorial-analysis-dataframe-df107_SingleTopAnalysis-py -# - tutorial-visualisation-rcanvas-df104-py -# - tutorial-visualisation-rcanvas-df105-py +# - tutorial-dataframe-df104_HiggsToTwoPhotons-py +# - tutorial-dataframe-df105_WBosonAnalysis-py +# - tutorial-dataframe-df106_HiggsToFourLeptons-py +# - tutorial-dataframe-df107_SingleTopAnalysis-py +# - tutorial-rcanvas-df104-py +# - tutorial-rcanvas-df105-py # reads input data over network: # root://eospublic.cern.ch//eos/opendata/atlas/OutreachDatasets/2020-01-22/ # -# - tutorial-io-ntuple-ntpl004_dimuon -# reads input data over network -# http://root.cern.ch/files/NanoAOD_DoubleMuon_CMS2011OpenData.root (1.5 GB) -# -# - tutorial-io-ntuple-ntpl008_import -# reads input data over network -# http://root.cern.ch/files/HiggsTauTauReduced/GluGluToHToTauTau.root (20 MB) -# -# - tutorial-io-ntuple-ntpl011_global_temperatures +# - tutorial-v7-global_temperatures.cxx # reads input data over network # http://root.cern.ch/files/tutorials/GlobalLandTemperaturesByCity.csv # -# - gtest-net-davix-RRawFileDavix +# - tutorial-v7-ntuple-ntpl003_lhcbOpenData +# reads input data over network +# http://root.cern.ch/files/LHCb/lhcb_B2HHH_MagnetUp.root (425 MB) +# +# - tutorial-v7-ntuple-ntpl004_dimuon +# reads input data over network +# http://root.cern.ch/files/NanoAOD_DoubleMuon_CMS2011OpenData.root (1.5 GB) +# +# - gtest-net-davix-test-RRawFileDavix # reads input file over network # http://root.cern.ch/files/davix.test # -# - gtest-net-netxng-RRawFileNetXNG +# - gtest-net-netxng-test-RRawFileNetXNG # reads input file over network # root://eospublic.cern.ch/eos/root-eos/xrootd.test # -# - gtest-net-netxng-TNetXNGFileTest -# - tutorial-analysis-parallel-mp_processSelector -# reads input file over network -# root://eospublic.cern.ch/eos/root-eos/h1/dstarmb.root -# -# - tutorial-machine_learning-tmva100_DataPreparation-py +# - gtest-tmva-tmva-test-rreader +# - gtest-tmva-tmva-test-rstandardscaler +# - tutorial-tmva-tmva003_RReader +# - tutorial-tmva-tmva004_RStandardScaler # reads input data over network -# root://eospublic.cern.ch/eos/root-eos/cms_opendata_2012_nanoaod/SMHiggsToZZTo4L.root +# http://root.cern.ch/files/tmva_class_example.root +# +# - tutorial-tmva-tmva103_Application +# reads input data over network +# http://root.cern/files/tmva101.root +# +# - test-import-numba +# - tutorial-pyroot-pyroot004_NumbaDeclare-py +# these tests require the numba python module which is not available # # - test-webgui-ping # error: Cannot display window in native -# -# - test-stressgraphics-firefox-skip3d: -# requires firefox... -# -# - test-stressgraphics-svg -# Font metric differences -# -# - tutorial-visualisation-webcanv-fonts_ttf.cxx: -# Requires web graphics excluded="\ test-stressIOPlugins|\ -tutorial-analysis-dataframe-df101_h1Analysis|\ -tutorial-analysis-tree-run_h1analysis|\ -tutorial-legacy-multicore-mp104_processH1|\ -tutorial-io-tree-imt_parTreeProcessing|\ -tutorial-analysis-dataframe-df..._SQlite|\ -tutorial-analysis-dataframe-df033_Describe-py|\ -tutorial-analysis-dataframe-df102_NanoAODDimuonAnalysis|\ -gtest-tree-treeplayer-treeprocessormt-remotefiles|\ -tutorial-analysis-dataframe-df103_NanoAODHiggsAnalysis|\ -tutorial-analysis-dataframe-df104_HiggsToTwoPhotons-py|\ -tutorial-analysis-dataframe-df105_WBosonAnalysis-py|\ -tutorial-analysis-dataframe-df106_HiggsToFourLeptons|\ -tutorial-analysis-dataframe-df107_SingleTopAnalysis-py|\ -tutorial-visualisation-rcanvas-df104-py|\ -tutorial-visualisation-rcanvas-df105-py|\ -tutorial-io-ntuple-ntpl004_dimuon|\ -tutorial-io-ntuple-ntpl008_import|\ -tutorial-io-ntuple-ntpl011_global_temperatures|\ -gtest-net-davix-RRawFileDavix|\ -gtest-net-netxng-RRawFileNetXNG|\ -gtest-net-netxng-TNetXNGFileTest|\ -tutorial-analysis-parallel-mp_processSelector|\ -tutorial-machine_learning-tmva100_DataPreparation-py|\ -test-webgui-ping|\ -test-stressgraphics-firefox-skip3d|\ -test-stressgraphics-svg|\ -tutorial-visualisation-webcanv-fonts_ttf.cxx" +tutorial-dataframe-df101_h1Analysis|\ +tutorial-tree-run_h1analysis|\ +tutorial-multicore-imt001_parBranchProcessing|\ +tutorial-multicore-mp103_processSelector|\ +tutorial-multicore-mp104_processH1|\ +tutorial-multicore-mp105_processEntryList|\ +tutorial-multicore-imt101_parTreeProcessing|\ +tutorial-dataframe-df..._SQlite|\ +tutorial-dataframe-df033_Describe-py|\ +tutorial-dataframe-df102_NanoAODDimuonAnalysis|\ +gtest-tree-treeplayer-test-treeprocessormt-remotefiles|\ +tutorial-dataframe-df103_NanoAODHiggsAnalysis|\ +tutorial-dataframe-df104_HiggsToTwoPhotons-py|\ +tutorial-dataframe-df105_WBosonAnalysis-py|\ +tutorial-dataframe-df106_HiggsToFourLeptons-py|\ +tutorial-dataframe-df107_SingleTopAnalysis-py|\ +tutorial-rcanvas-df104-py|\ +tutorial-rcanvas-df105-py|\ +tutorial-v7-global_temperatures.cxx|\ +tutorial-v7-ntuple-ntpl003_lhcbOpenData|\ +tutorial-v7-ntuple-ntpl004_dimuon|\ +gtest-net-davix-test-RRawFileDavix|\ +gtest-net-netxng-test-RRawFileNetXNG|\ +gtest-tmva-tmva-test-rreader|\ +gtest-tmva-tmva-test-rstandardscaler|\ +tutorial-tmva-tmva003_RReader|\ +tutorial-tmva-tmva004_RStandardScaler|\ +tutorial-tmva-tmva103_Application|\ +test-import-numba|\ +tutorial-pyroot-pyroot004_NumbaDeclare-py|\ +test-webgui-ping" -%ifarch %{ix86} -# - gtest-hist-hist-TFormulaGradientTests -# out of memory -# -# - pyunittests-bindings-pyroot-pythonizations-pyroot-array-numpy-views -# ValueError: buffer is smaller than requested size -# -# - tmva-sofie-test-TestCustomModelsFromONNX -# Expected equality of these values: -# output.size() -# Which is: 1000 -# sizeof(Slice_Neg::output) / sizeof(float) -# Which is: 900 +%if ! ( %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} == 8 ) +# - test-import-pandas +# - tutorial-dataframe-df026_AsNumpyArrays-py +# - tutorial-roofit-rf409_NumPyPandasToRooFit-py +# Requires the pandas python module not (yet) available in RHEL/EPEL 9 excluded="${excluded}|\ -gtest-hist-hist-TFormulaGradientTests|\ -pyunittests-bindings-pyroot-pythonizations-pyroot-array-numpy-views|\ -tmva-sofie-test-TestCustomModelsFromONNX\$\$" +test-import-pandas|\ +tutorial-dataframe-df026_AsNumpyArrays-py|\ +tutorial-roofit-rf409_NumPyPandasToRooFit-py" %endif %ifarch %{power64} -%if %{?fedora}%{!?fedora:0} >= 42 -# - gtest-tree-ntuple-ntuple-emulated -# - gtest-tree-ntuple-ntuple-evolution-shape -# waitpid() failed +# PPC64LE specific failures +# - test-stresshistofit-interpreted +# - test-stresshistogram-interpreted +# - test-stressmathcore-interpreted +# - test-stressroostats-interpreted +# +# Always timeout (hang?) +# - test-stressinterpreter +# - tutorial-unuran-unuranFoamTest excluded="${excluded}|\ -gtest-tree-ntuple-ntuple-emulated|\ -gtest-tree-ntuple-ntuple-evolution-shape" +test-stresshistofit-interpreted|\ +test-stresshistogram-interpreted|\ +test-stressmathcore-interpreted|\ +test-stressroostats-interpreted|\ +test-stressinterpreter|\ +tutorial-unuran-unuranFoamTest" + +%if %{?rhel}%{!?rhel:0} == 8 +# Fails on ppc64le since RHEL 8.5 update +# Exception: Found not whitelisted libraries after importing ROOT: +# - libpthread-2.28 +# - libm-2.28 +# - libc-2.28 +# - librt-2.28 +# - pyunittests-pyroot-import-load-libs +# +# - tutorial-fit-combinedFit(-py) +# - tutorial-fit-exampleFit3D +# - tutorial-fit-fit2dHist +# - tutorial-fit-fitCircle +# - tutorial-fit-line3Dfit +# - tutorial-math-exampleFunction-py +# - tutorial-multicore-mt103_fillNtupleFromMultipleThreads +# - tutorial-multicore-mt201_parallelHistoFill +# - tutorial-multicore-mt304_fillHistos +# - tutorial-multicore-mtbb001_fillHistos +# - tutorial-multicore-mtbb101_fillNtuples +# - tutorial-multicore-mtbb201_parallelHistoFill +excluded="${excluded}|\ +pyunittests-pyroot-import-load-libs|\ +tutorial-fit-combinedFit|\ +tutorial-fit-exampleFit3D|\ +tutorial-fit-fit2dHist|\ +tutorial-fit-fitCircle|\ +tutorial-fit-line3Dfit|\ +tutorial-math-exampleFunction-py|\ +tutorial-multicore-mt103_fillNtupleFromMultipleThreads|\ +tutorial-multicore-mt201_parallelHistoFill|\ +tutorial-multicore-mt304_fillHistos|\ +tutorial-multicore-mtbb001_fillHistos|\ +tutorial-multicore-mtbb101_fillNtuples|\ +tutorial-multicore-mtbb201_parallelHistoFill" %endif %endif %ifarch s390x -# - gtest-roofit-roofitcore-testNaNPacker -# - gtest-roofit-roofitcore-testLikelihoodGradientJob +# - gtest-roofit-roofitcore-test-testNaNPacker +# - tutorial-roofit-rf612_recoverFromInvalidParameters # Uses "Packed NaN" feature, not implemented for big endian. excluded="${excluded}|\ -gtest-roofit-roofitcore-testNaNPacker|\ -gtest-roofit-roofitcore-testLikelihoodGradientJob" +gtest-roofit-roofitcore-test-testNaNPacker|\ +tutorial-roofit-rf612_recoverFromInvalidParameters" -# - gtest-core-dictgen-dictgen-base -# - gtest-tree-dataframe-dataframe-concurrency -# - gtest-tree-dataframe-dataframe-snapshot-ntuple -# - gtest-tree-dataframe-dataframe-unified-constructor -# - gtest-tree-dataframe-dataframe-vary -# - gtest-tree-dataframe-datasource-ntuple -# - gtest-tree-ntuple-ntuple-basics -# - gtest-tree-ntuple-ntuple-bulk -# - gtest-tree-ntuple-ntuple-cast -# - gtest-tree-ntuple-ntuple-compat -# - gtest-tree-ntuple-ntuple-evolution-type -# - gtest-tree-ntuple-ntuple-extended -# - gtest-tree-ntuple-ntuple-join-table -# - gtest-tree-ntuple-ntuple-largefile2 -# - gtest-tree-ntuple-ntuple-merger -# - gtest-tree-ntuple-ntuple-metrics -# - gtest-tree-ntuple-ntuple-model -# - gtest-tree-ntuple-ntuple-modelext -# - gtest-tree-ntuple-ntuple-multi-column -# - gtest-tree-ntuple-ntuple-packing -# - gtest-tree-ntuple-ntuple-parallel-writer -# - gtest-tree-ntuple-ntuple-processor -# - gtest-tree-ntuple-ntuple-processor-chain -# - gtest-tree-ntuple-ntuple-processor-join -# - gtest-tree-ntuple-ntuple-project -# - gtest-tree-ntuple-ntuple-show -# - gtest-tree-ntuple-ntuple-storage -# - gtest-tree-ntuple-ntuple-storage-daos -# - gtest-tree-ntuple-ntuple-types -# - gtest-tree-ntuple-ntuple-view -# - gtest-tree-ntuple-rfield-class -# - gtest-tree-ntuple-rfield-streamer -# - gtest-tree-ntuple-rfield-variant -# - gtest-tree-ntuple-rfield-vector -# - gtest-tree-ntupleutil-ntuple-importer -# - gtest-tree-ntupleutil-ntuple-inspector -# - gtest-tree-tree-testTTreeRegressions +# - gtest-tree-ntuple-v7-test-ntuple-basics +# - gtest-tree-ntuple-v7-test-ntuple-endian +# - gtest-tree-ntuple-v7-test-ntuple-extended +# - gtest-tree-ntuple-v7-test-ntuple-minifile +# - gtest-tree-ntuple-v7-test-ntuple-rdf +# - gtest-tree-ntuple-v7-test-ntuple-serialize +# - gtest-tree-ntuple-v7-test-ntuple-types # https://github.com/root-project/root/issues/12426 # -# - pyunittests-bindings-distrdf-backend-distrdf-unit-backend-graph-caching -# - pyunittests-bindings-pyroot-pythonizations-pyroot-pyz-rtensor -# - pyunittests-bindings-pyroot-pythonizations-pyroot-pyz-stl-vector -# - pyunittests-io-io-rfile-py -# - tmva-sofie-test-TestCustomModelsFromONNX -# - tutorial-analysis-dataframe-df006_ranges-py -# - tutorial-hist-hist007_TH1_liveupdate-py +# - pyunittests-pyroot-pyz-rtensor +# - pyunittests-pyroot-pyz-stl-vector +# - tutorial-dataframe-df006_ranges-py +# - tutorial-fit-combinedFit-py # - tutorial-math-exampleFunction-py -# - tutorial-math-fit-combinedFit-py -# - tutorial-math-fit-NumericalMinimization-py -# - tutorial-visualisation-rcanvas-rbox-py +# - tutorial-tmva-TMVA_CNN_Classification-py +# - tutorial-tmva-TMVA_Higgs_Classification-py +# - tutorial-tmva-TMVA_RNN_Classification-py # https://github.com/root-project/root/issues/12429 # +# - tutorial-tree-drawsparse +# https://github.com/root-project/root/issues/12431 +# # - test-stresshistofit # - test-stresshistofit-interpreted # - test-stresshistogram # - test-stresshistogram-interpreted excluded="${excluded}|\ -gtest-core-dictgen-dictgen-base|\ -gtest-tree-dataframe-dataframe-concurrency|\ -gtest-tree-dataframe-dataframe-snapshot-ntuple|\ -gtest-tree-dataframe-dataframe-unified-constructor|\ -gtest-tree-dataframe-dataframe-vary|\ -gtest-tree-dataframe-datasource-ntuple|\ -gtest-tree-ntuple-ntuple-basics|\ -gtest-tree-ntuple-ntuple-bulk|\ -gtest-tree-ntuple-ntuple-cast|\ -gtest-tree-ntuple-ntuple-compat|\ -gtest-tree-ntuple-ntuple-evolution-type|\ -gtest-tree-ntuple-ntuple-extended|\ -gtest-tree-ntuple-ntuple-join-table|\ -gtest-tree-ntuple-ntuple-largefile2|\ -gtest-tree-ntuple-ntuple-merger|\ -gtest-tree-ntuple-ntuple-metrics|\ -gtest-tree-ntuple-ntuple-model\$\$|\ -gtest-tree-ntuple-ntuple-modelext|\ -gtest-tree-ntuple-ntuple-multi-column|\ -gtest-tree-ntuple-ntuple-packing|\ -gtest-tree-ntuple-ntuple-parallel-writer|\ -gtest-tree-ntuple-ntuple-processor\$\$|\ -gtest-tree-ntuple-ntuple-processor-chain|\ -gtest-tree-ntuple-ntuple-processor-join|\ -gtest-tree-ntuple-ntuple-project|\ -gtest-tree-ntuple-ntuple-show|\ -gtest-tree-ntuple-ntuple-storage\$\$|\ -gtest-tree-ntuple-ntuple-storage-daos|\ -gtest-tree-ntuple-ntuple-types|\ -gtest-tree-ntuple-ntuple-view|\ -gtest-tree-ntuple-rfield-class|\ -gtest-tree-ntuple-rfield-streamer|\ -gtest-tree-ntuple-rfield-variant|\ -gtest-tree-ntuple-rfield-vector|\ -gtest-tree-ntupleutil-ntuple-importer|\ -gtest-tree-ntupleutil-ntuple-inspector|\ -gtest-tree-tree-testTTreeRegressions|\ -pyunittests-bindings-distrdf-backend-distrdf-unit-backend-graph-caching|\ -pyunittests-bindings-pyroot-pythonizations-pyroot-pyz-rtensor|\ -pyunittests-bindings-pyroot-pythonizations-pyroot-pyz-stl-vector|\ -pyunittests-io-io-rfile-py|\ -tmva-sofie-test-TestCustomModelsFromONNX|\ -tutorial-analysis-dataframe-df006_ranges-py|\ -tutorial-hist-hist007_TH1_liveupdate-py|\ +gtest-tree-ntuple-v7-test-ntuple-basics|\ +gtest-tree-ntuple-v7-test-ntuple-endian|\ +gtest-tree-ntuple-v7-test-ntuple-extended|\ +gtest-tree-ntuple-v7-test-ntuple-minifile|\ +gtest-tree-ntuple-v7-test-ntuple-rdf|\ +gtest-tree-ntuple-v7-test-ntuple-serialize|\ +gtest-tree-ntuple-v7-test-ntuple-types|\ +pyunittests-pyroot-pyz-rtensor|\ +pyunittests-pyroot-pyz-stl-vector|\ +tutorial-dataframe-df006_ranges-py|\ +tutorial-fit-combinedFit-py|\ tutorial-math-exampleFunction-py|\ -tutorial-math-fit-combinedFit-py|\ -tutorial-math-fit-NumericalMinimization-py|\ -tutorial-visualisation-rcanvas-rbox-py|\ +tutorial-tmva-TMVA_CNN_Classification-py|\ +tutorial-tmva-TMVA_Higgs_Classification-py|\ +tutorial-tmva-TMVA_RNN_Classification-py|\ +tutorial-tree-drawsparse|\ test-stresshistofit\$\$|\ test-stresshistofit-interpreted|\ test-stresshistogram\$\$|\ test-stresshistogram-interpreted" -# The zlib-ng library is compiled with hardware acceleration support on s390x -# in Fedora 43 and later. -# This means that some tests that compare the size of compressed data fail. +%if %{?rhel}%{!?rhel:0} == 8 +# Issues with file sizes on EPEL 8 s390x +# - gtest-tree-readspeed-test-readspeed-general +# - gtest-tree-tree-test-testTBranch # - test-stress -# - gtest-tree-readspeed-readspeed-general -# - gtest-tree-tree-testTBranch -%if %{?fedora}%{!?fedora:0} >= 43 +# - test-stressgraphics(-interpreted) excluded="${excluded}|\ +gtest-tree-readspeed-test-readspeed-general|\ +gtest-tree-tree-test-testTBranch|\ test-stress\$\$|\ -gtest-tree-readspeed-readspeed-general|\ -gtest-tree-tree-testTBranch" +test-stressgraphics" %endif %endif -# Fails with gcc 14 on aarch64, ppc64le and s390x (on EPEL 10 also x86_64) -# https://github.com/root-project/root/issues/14446 -# - gtest-math-matrix-testMatrixTSparse -%if %{?fedora}%{!?fedora:0} >= 40 -%ifarch aarch64 %{power64} s390x -excluded="${excluded}|\ -gtest-math-matrix-testMatrixTSparse" -%endif -%endif -%if %{?rhel}%{!?rhel:0} >= 10 -excluded="${excluded}|\ -gtest-math-matrix-testMatrixTSparse" -%endif - # Filter out parts of tests that require remote network access -# RNTuple.StdAtomic fails on ix86 (different alignment 64 bit (non)atomic) -# TH3D.FillThreadSafe and RDFHelpers.Histo3DThreadSafe fail on ix86 -# due to alignment issues with std::atomic_ref -# https://github.com/root-project/root/issues/20834 -# InterpreterTest.Evaluate fails on s390x -# TClingDataMemberInfo.Offset fails on s390x -# https://github.com/root-project/root/issues/14512 -# TTreeRegressions.PrintClustersRounding -# relies on specific versions of compression libraries -# https://github.com/root-project/root/issues/18995 -export GTEST_FILTER=-\ -%ifarch %{ix86} -RNTuple.StdAtomic:\ -TH3D.FillThreadSafe:\ -RDFHelpers.Histo3DThreadSafe:\ +# RNTuple.TClassEBO seg fault +# https://github.com/root-project/root/issues/12428 +GTEST_FILTER=-RCsvDS.Remote:RRawFile.Remote:RSqliteDS.Davix:TFile.ReadWithoutGlobalRegistrationWeb:TFile.ReadWithoutGlobalRegistrationNet:RNTuple.TClassEBO \ +%if ! ( %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} == 8 ) +ROOTTEST_IGNORE_PANDAS_PY3=1 \ %endif -%ifarch s390x -InterpreterTest.Evaluate:\ -TClingDataMemberInfo.Offset:\ -TTreeReaderBasic.LorentzVector32:\ -%endif -RCsvDS.Remote:\ -RFile.RemoteRead:\ -RNTuple.OpenHTTP:\ -RRawFile.Remote:\ -RSqliteDS.Davix:\ -TChainParsing.DoubleSlash:\ -TChainParsing.RemoteGlob:\ -TFile.ReadWithoutGlobalRegistrationNet:\ -TFile.ReadWithoutGlobalRegistrationWeb:\ -TTreeRegressions.PrintClustersRounding -%ctest -- -E "${excluded}" +ROOTTEST_IGNORE_NUMBA_PY3=1 \ +ROOTTEST_IGNORE_JUPYTER_PY3=1 \ +make test ARGS="%{?_smp_mflags} --output-on-failure -E \"${excluded}\"" + +popd %pretrans net-http -p path = "%{_datadir}/%{name}/js" @@ -2650,9 +2759,12 @@ end %post net-http # Replace bundled jsroot with symlinks to system version -for x in build img mathjax modules scripts files/draw.htm files/online.htm ; do +for x in build img modules scripts files/draw.htm files/online.htm ; do ln -fnrs %{_jsdir}/jsroot/$x %{_datadir}/%{name}/js/$x done +%{?ldconfig} + +%ldconfig_postun net-http %pre -n python%{python3_pkgversion}-%{name} if [ -r /var/lib/alternatives/libPyROOT.so ] ; then @@ -2661,36 +2773,38 @@ if [ -r /var/lib/alternatives/libPyROOT.so ] ; then done fi -%post -n python%{python3_pkgversion}-jupyroot +%post notebook mkdir -p /etc/jupyter if [ -e /etc/jupyter/jupyter_notebook_config.py ] ; then - sed '/Extra static paths for JupyROOT - start/','/Extra static paths for JupyROOT - end/'d -i /etc/jupyter/jupyter_notebook_config.py + sed '/Extra static path for JupyROOT - start/','/Extra static path for JupyROOT - end/'d -i /etc/jupyter/jupyter_notebook_config.py fi cat << EOF >> /etc/jupyter/jupyter_notebook_config.py -# Extra static paths for JupyROOT - start - do not remove this line +# Extra static path for JupyROOT - start - do not remove this line c.NotebookApp.extra_static_paths.append('%{_jsdir}/jsroot') -# Extra static paths for JupyROOT - end - do not remove this line +c.NotebookApp.extra_static_paths.append('%{_datadir}/%{name}/notebook') +# Extra static path for JupyROOT - end - do not remove this line EOF if [ -e /etc/jupyter/jupyter_server_config.py ] ; then - sed '/Extra static paths for JupyROOT - start/','/Extra static paths for JupyROOT - end/'d -i /etc/jupyter/jupyter_server_config.py + sed '/Extra static path for JupyROOT - start/','/Extra static path for JupyROOT - end/'d -i /etc/jupyter/jupyter_server_config.py fi cat << EOF >> /etc/jupyter/jupyter_server_config.py -# Extra static paths for JupyROOT - start - do not remove this line +# Extra static path for JupyROOT - start - do not remove this line c.ServerApp.extra_static_paths.append('%{_jsdir}/jsroot') -# Extra static paths for JupyROOT - end - do not remove this line +c.ServerApp.extra_static_paths.append('%{_datadir}/%{name}/notebook') +# Extra static path for JupyROOT - end - do not remove this line EOF -%postun -n python%{python3_pkgversion}-jupyroot +%postun notebook if [ $1 -eq 0 ] ; then if [ -e /etc/jupyter/jupyter_notebook_config.py ] ; then - sed '/Extra static paths for JupyROOT - start/','/Extra static paths for JupyROOT - end/'d -i /etc/jupyter/jupyter_notebook_config.py + sed '/Extra static path for JupyROOT - start/','/Extra static path for JupyROOT - end/'d -i /etc/jupyter/jupyter_notebook_config.py if [ ! -s /etc/jupyter/jupyter_notebook_config.py ] ; then rm /etc/jupyter/jupyter_notebook_config.py rmdir /etc/jupyter 2>/dev/null || : fi fi if [ -e /etc/jupyter/jupyter_server_config.py ] ; then - sed '/Extra static paths for JupyROOT - start/','/Extra static paths for JupyROOT - end/'d -i /etc/jupyter/jupyter_server_config.py + sed '/Extra static path for JupyROOT - start/','/Extra static path for JupyROOT - end/'d -i /etc/jupyter/jupyter_server_config.py if [ ! -s /etc/jupyter/jupyter_server_config.py ] ; then rm /etc/jupyter/jupyter_server_config.py rmdir /etc/jupyter 2>/dev/null || : @@ -2701,12 +2815,143 @@ fi %post core -p /sbin/ldconfig %postun core -p /sbin/ldconfig +%ldconfig_scriptlets multiproc +%ldconfig_scriptlets cling +%ldconfig_scriptlets tpython +%ldconfig_scriptlets -n python%{python3_pkgversion}-%{name} +%ldconfig_scriptlets r +%ldconfig_scriptlets r-tools +%ldconfig_scriptlets genetic +%ldconfig_scriptlets geom +%ldconfig_scriptlets geom-builder +%ldconfig_scriptlets geom-painter +%ldconfig_scriptlets gdml +%ldconfig_scriptlets graf +%ldconfig_scriptlets graf-asimage +%ldconfig_scriptlets graf-fitsio +%ldconfig_scriptlets graf-gpad +%ldconfig_scriptlets graf-gviz +%ldconfig_scriptlets graf-postscript +%ldconfig_scriptlets graf-x11 +%ldconfig_scriptlets graf3d +%ldconfig_scriptlets graf3d-csg +%ldconfig_scriptlets graf3d-eve +%ldconfig_scriptlets graf3d-gl +%ldconfig_scriptlets graf3d-gviz3d +%ldconfig_scriptlets graf3d-x3d +%ldconfig_scriptlets gui +%ldconfig_scriptlets gui-html +%ldconfig_scriptlets gui-fitpanel +%ldconfig_scriptlets gui-ged +%ldconfig_scriptlets gui-builder +%ldconfig_scriptlets gui-recorder +%ldconfig_scriptlets hbook +%ldconfig_scriptlets hist +%ldconfig_scriptlets hist-painter +%ldconfig_scriptlets spectrum +%ldconfig_scriptlets spectrum-painter +%ldconfig_scriptlets html +%ldconfig_scriptlets io +%ldconfig_scriptlets io-dcache +%ldconfig_scriptlets io-gfal +%ldconfig_scriptlets io-sql +%ldconfig_scriptlets io-xml +%ldconfig_scriptlets io-xmlparser +%ldconfig_scriptlets foam +%ldconfig_scriptlets fftw +%ldconfig_scriptlets fumili +%ldconfig_scriptlets genvector +%ldconfig_scriptlets mathcore +%ldconfig_scriptlets mathmore +%ldconfig_scriptlets matrix +%ldconfig_scriptlets minuit +%ldconfig_scriptlets minuit2 +%ldconfig_scriptlets mlp +%ldconfig_scriptlets physics +%ldconfig_scriptlets quadp +%ldconfig_scriptlets smatrix +%ldconfig_scriptlets splot +%ldconfig_scriptlets unuran +%ldconfig_scriptlets vecops +%ldconfig_scriptlets montecarlo-eg +%ldconfig_scriptlets montecarlo-pythia8 +%ldconfig_scriptlets net +%ldconfig_scriptlets net-rpdutils +%ldconfig_scriptlets net-auth +%ldconfig_scriptlets net-davix +%ldconfig_scriptlets net-httpsniff +%ldconfig_scriptlets netx +%ldconfig_scriptlets proof +%ldconfig_scriptlets proof-bench +%ldconfig_scriptlets proof-player +%ldconfig_scriptlets proof-sessionviewer +%if %{roofit} +%ldconfig_scriptlets roofit +%ldconfig_scriptlets roofit-common +%ldconfig_scriptlets roofit-core +%ldconfig_scriptlets roofit-more +%ldconfig_scriptlets roofit-batchcompute +%if %{dataframe} +%ldconfig_scriptlets roofit-dataframe-helpers +%endif +%ldconfig_scriptlets roofit-jsoninterface +%ldconfig_scriptlets roofit-hs3 +%ldconfig_scriptlets roostats +%ldconfig_scriptlets hist-factory +%endif +%ldconfig_scriptlets sql-mysql +%ldconfig_scriptlets sql-odbc +%ldconfig_scriptlets sql-sqlite +%ldconfig_scriptlets sql-pgsql +%ldconfig_scriptlets tmva +%if %{dataframe} +%ldconfig_scriptlets tmva-utils +%endif +%ldconfig_scriptlets tmva-python +%ldconfig_scriptlets tmva-r +%ldconfig_scriptlets tmva-sofie +%if %{tmvasofieparser} +%ldconfig_scriptlets tmva-sofie-parser +%endif +%ldconfig_scriptlets tmva-gui +%ldconfig_scriptlets tree +%if %{dataframe} +%ldconfig_scriptlets tree-dataframe +%endif +%ldconfig_scriptlets tree-player +%ldconfig_scriptlets tree-viewer +%ldconfig_scriptlets tree-webviewer +%ldconfig_scriptlets unfold +%ldconfig_scriptlets gui-webdisplay +%ifarch %{qt5_qtwebengine_arches} +%ldconfig_scriptlets gui-qt5webdisplay +%endif +%ifarch %{qt6_qtwebengine_arches} +%ldconfig_scriptlets gui-qt6webdisplay +%endif +%ldconfig_scriptlets gui-webgui6 +%if %{root7} +%ldconfig_scriptlets geom-webviewer +%ldconfig_scriptlets graf-gpadv7 +%ldconfig_scriptlets graf-primitives +%ldconfig_scriptlets graf3d-eve7 +%ldconfig_scriptlets gui-browsable +%ldconfig_scriptlets gui-browserv7 +%ldconfig_scriptlets gui-canvaspainter +%ldconfig_scriptlets gui-fitpanelv7 +%ldconfig_scriptlets histv7 +%ldconfig_scriptlets hist-draw +%ldconfig_scriptlets tree-ntuple +%ldconfig_scriptlets tree-ntuple-utils +%if %{roofit} +%ldconfig_scriptlets xroofit +%endif +%endif + %files %{_bindir}/hadd %{_bindir}/root %{_bindir}/root.exe -%{_bindir}/rootbrowse -%{_bindir}/rootls %{_bindir}/rootn.exe %{_bindir}/rootreadspeed %{_bindir}/roots @@ -2725,7 +2970,7 @@ fi %files icons %{_datadir}/%{name}/icons -%files font-files +%files fonts %{_datadir}/%{name}/fonts %files tutorial @@ -2759,7 +3004,6 @@ fi %{_datadir}/%{name}/system.rootauthrc %{_datadir}/%{name}/system.rootdaemonrc %{_datadir}/%{name}/system.rootrc -%{_datadir}/%{name}/valgrind-root.supp %{_datadir}/%{name}/valgrind-root-python.supp %{_mandir}/man1/system.rootdaemonrc.1* %dir %{_datadir}/%{name}/cmake @@ -2771,14 +3015,11 @@ fi %dir %{_datadir}/%{name}/plugins %dir %{_datadir}/%{name}/plugins/* %dir %{_includedir}/%{name} -%if %{bundlejson} -%dir %{_includedir}/%{name}/nlohmann -%{_includedir}/%{name}/nlohmann/json.hpp -%endif %{_includedir}/%{name}/RConfigOptions.h %{_includedir}/%{name}/RConfigure.h -%{_includedir}/%{name}/ROOT.modulemap +%{_includedir}/%{name}/RGitCommit.h %{_includedir}/%{name}/compiledata.h +%{_includedir}/%{name}/module.modulemap %dir %{_includedir}/%{name}/Math %dir %{_includedir}/%{name}/ROOT %config(noreplace) %{_sysconfdir}/ld.so.conf.d/%{name}-%{_arch}.conf @@ -2789,7 +3030,6 @@ fi %{_pkgdocdir}/LICENSE %doc %{_pkgdocdir}/DEVELOPMENT.md %doc %{_pkgdocdir}/ReleaseNotes -%doc %{_pkgdocdir}/root_citation.bib %license LICENSE LGPL2_1.txt %files multiproc -f includelist-core-multiproc @@ -2806,10 +3046,13 @@ fi %doc interpreter/cling/CREDITS.txt %doc interpreter/cling/README.md %license interpreter/cling/LICENSE.TXT +%doc interpreter/llvm/src/llvm-CREDITS.TXT +%doc interpreter/llvm/src/llvm-README.txt +%license interpreter/llvm/src/llvm-LICENSE.TXT %files testsupport %{_includedir}/%{name}/ROOT/TestSupport.hxx -%{_libdir}/%{name}/TestSupport +%{_libdir}/%{name}/libTestSupport.a %doc core/testsupport/README.md %files tpython -f includelist-bindings-tpython @@ -2818,26 +3061,33 @@ fi %files -n python%{python3_pkgversion}-%{name} -f includelist-bindings-pyroot %{python3_sitearch}/cppyy +%{python3_sitearch}/cppyy_backend %{python3_sitearch}/ROOT -%{python3_sitearch}/ROOT-*.dist-info -%{_libdir}/%{name}/libCPyCppyy.* +%{python3_sitearch}/ROOT-*.egg-info +%{python3_sitearch}/libcppyy%{python3_version_uscore}.so +%{python3_sitearch}/libcppyy_backend%{python3_version_uscore}.so +%{python3_sitearch}/libROOTPythonizations%{python3_version_uscore}%{python3_ext_suffix} +%{_libdir}/%{name}/libcppyy%{python3_version_uscore}.* +%{_libdir}/%{name}/libcppyy_backend%{python3_version_uscore}.* %dir %{_includedir}/%{name}/CPyCppyy %files -n python%{python3_pkgversion}-jupyroot -%{python3_sitelib}/JupyROOT -%{python3_sitelib}/JupyROOT-*.dist-info +%{python3_sitearch}/JupyROOT +%{python3_sitearch}/JupyROOT-*.egg-info +%{python3_sitearch}/libJupyROOT%{python3_version_uscore}%{python3_ext_suffix} %{_datadir}/jupyter/kernels/python%{python3_pkgversion}-jupyroot -%{_bindir}/rootnb.exe %doc bindings/jupyroot/README.md -%doc bindings/jupyroot/JupyROOT-on-EPEL + +%files -n python%{python3_pkgversion}-jsmva +%{python3_sitelib}/JsMVA +%{python3_sitelib}/JsMVA-*.egg-info %if %{distrdf} %files -n python%{python3_pkgversion}-distrdf %{python3_sitelib}/DistRDF -%{python3_sitelib}/DistRDF-*.dist-info +%{python3_sitelib}/DistRDF-*.egg-info %endif -%if %{rrr} %files r -f includelist-bindings-r %{_libdir}/%{name}/libRInterface.* %{_libdir}/%{name}/libRInterface_rdict.pcm @@ -2847,7 +3097,6 @@ fi %{_libdir}/%{name}/libRtools.* %{_libdir}/%{name}/libRtools_rdict.pcm %{_datadir}/%{name}/plugins/ROOT@@Math@@Minimizer/P090_RMinimizer.C -%endif %files genetic -f includelist-math-genetic %{_libdir}/%{name}/libGenetic.* @@ -2982,10 +3231,6 @@ fi %{_libdir}/%{name}/libRecorder.* %{_libdir}/%{name}/libRecorder_rdict.pcm -%files gui-treemap -f includelist-gui-treemap -%{_libdir}/%{name}/libROOTTreeMap.* -%{_libdir}/%{name}/libROOTTreeMap_rdict.pcm - %files hbook -f includelist-hist-hbook %{_bindir}/g2root %{_bindir}/h2root @@ -3013,6 +3258,11 @@ fi %{_libdir}/%{name}/libSpectrumPainter.* %{_libdir}/%{name}/libSpectrumPainter_rdict.pcm +%files html -f includelist-html +%{_libdir}/%{name}/libHtml.* +%{_libdir}/%{name}/libHtml_rdict.pcm +%{_datadir}/%{name}/html + %files io -f includelist-io-io %{_libdir}/%{name}/libRIO.* %{_datadir}/%{name}/plugins/TArchiveFile/P010_TZIPFile.C @@ -3024,9 +3274,15 @@ fi %{_datadir}/%{name}/plugins/TFile/P040_TDCacheFile.C %{_datadir}/%{name}/plugins/TSystem/P020_TDCacheSystem.C +%files io-gfal -f includelist-io-gfal +%{_libdir}/%{name}/libGFAL.* +%{_libdir}/%{name}/libGFAL_rdict.pcm +%{_datadir}/%{name}/plugins/TFile/P050_TGFALFile.C + %files io-sql -f includelist-io-sql %{_libdir}/%{name}/libSQLIO.* %{_libdir}/%{name}/libSQLIO_rdict.pcm +%{_datadir}/%{name}/plugins/TFile/P090_TSQLFile.C %files io-xml -f includelist-io-xml %{_libdir}/%{name}/libXMLIO.* @@ -3099,6 +3355,8 @@ fi %{_libdir}/%{name}/libMinuit2_rdict.pcm %dir %{_includedir}/%{name}/Minuit2 %{_datadir}/%{name}/plugins/ROOT@@Math@@Minimizer/P010_Minuit2Minimizer.C +%{_datadir}/%{name}/plugins/TVirtualFitter/P030_TFitterMinuit.C +%{_datadir}/%{name}/plugins/TVirtualFitter/P040_TFitterFumili.C %files mlp -f includelist-math-mlp %{_libdir}/%{name}/libMLP.* @@ -3135,7 +3393,6 @@ fi %{_libdir}/%{name}/libEG.* %{_libdir}/%{name}/libEG_rdict.pcm %{_datadir}/%{name}/pdg_table.txt -%{_datadir}/%{name}/pdg_table_update.py %doc %{_pkgdocdir}/cfortran.doc %files montecarlo-pythia8 -f includelist-montecarlo-pythia8 @@ -3182,7 +3439,6 @@ fi %{_datadir}/%{name}/js/files/wslist.htm %ghost %{_datadir}/%{name}/js/build %ghost %{_datadir}/%{name}/js/img -%ghost %{_datadir}/%{name}/js/mathjax %ghost %{_datadir}/%{name}/js/modules %ghost %{_datadir}/%{name}/js/scripts %ghost %{_datadir}/%{name}/js/files/draw.htm @@ -3201,18 +3457,59 @@ fi %{_datadir}/%{name}/plugins/TSystem/P040_TXNetSystem.C %{_datadir}/%{name}/plugins/ROOT@@Internal@@RRawFile/P020_RRawFileNetXNG.C +%files proof -f includelist-proof-proof +%{_bindir}/proofserv +%{_bindir}/proofserv.exe +%{_bindir}/xpdtest +%{_mandir}/man1/proofserv.1* +%{_mandir}/man1/xpdtest.1* +%{_libdir}/%{name}/libProof.* +%{_libdir}/%{name}/libProof_rdict.pcm +%{_datadir}/%{name}/plugins/TChain/P010_TProofChain.C +%{_datadir}/%{name}/plugins/TDataSetManager/P010_TDataSetManagerFile.C +%{_datadir}/%{name}/plugins/TProof/P010_TProofCondor.C +%{_datadir}/%{name}/plugins/TProof/P020_TProofSuperMaster.C +%{_datadir}/%{name}/plugins/TProof/P030_TProofLite.C +%{_datadir}/%{name}/plugins/TProof/P040_TProof.C +%{_datadir}/%{name}/valgrind-root.supp + +%files proof-bench -f includelist-proof-proofbench +%{_libdir}/%{name}/libProofBench.* +%{_libdir}/%{name}/libProofBench_rdict.pcm +%{_datadir}/%{name}/proof + +%files proof-player -f includelist-proof-proofplayer +%{_libdir}/%{name}/libProofDraw.* +%{_libdir}/%{name}/libProofDraw_rdict.pcm +%{_libdir}/%{name}/libProofPlayer.* +%{_libdir}/%{name}/libProofPlayer_rdict.pcm +%{_datadir}/%{name}/plugins/TProofMonSender/P010_TProofMonSenderML.C +%{_datadir}/%{name}/plugins/TProofMonSender/P020_TProofMonSenderSQL.C +%{_datadir}/%{name}/plugins/TVirtualProofPlayer/P010_TProofPlayer.C +%{_datadir}/%{name}/plugins/TVirtualProofPlayer/P020_TProofPlayerRemote.C +%{_datadir}/%{name}/plugins/TVirtualProofPlayer/P030_TProofPlayerLocal.C +%{_datadir}/%{name}/plugins/TVirtualProofPlayer/P040_TProofPlayerSlave.C +%{_datadir}/%{name}/plugins/TVirtualProofPlayer/P050_TProofPlayerSuperMaster.C +%{_datadir}/%{name}/plugins/TVirtualProofPlayer/P060_TProofPlayerLite.C + +%files proof-sessionviewer -f includelist-gui-sessionviewer +%{_libdir}/%{name}/libSessionViewer.* +%{_libdir}/%{name}/libSessionViewer_rdict.pcm +%{_datadir}/%{name}/plugins/TProofProgressDialog/P010_TProofProgressDialog.C +%{_datadir}/%{name}/plugins/TProofProgressLog/P010_TProofProgressLog.C +%{_datadir}/%{name}/plugins/TSessionViewer/P010_TSessionViewer.C + %if %{roofit} %files roofit -f includelist-roofit-roofit %{_libdir}/%{name}/libRooFit.* %{_libdir}/%{name}/libRooFit_rdict.pcm +%files roofit-common +%{_libdir}/%{name}/libRooFitCommon.* + %files roofit-core -f includelist-roofit-roofitcore %{_libdir}/%{name}/libRooFitCore.* %{_libdir}/%{name}/libRooFitCore_rdict.pcm -%dir %{_includedir}/%{name}/RooFit -%dir %{_includedir}/%{name}/RooFit/Detail -%dir %{_includedir}/%{name}/RooFit/TestStatistics -%dir %{_includedir}/%{name}/RooFitLegacy %{_datadir}/gdb/auto-load%{_libdir}/%{name}/libRooFitCore.* %{_datadir}/gdb/auto-load%{_libdir}/%{name}/__pycache__/libRooFitCore.* @@ -3220,33 +3517,27 @@ fi %{_libdir}/%{name}/libRooFitMore.* %{_libdir}/%{name}/libRooFitMore_rdict.pcm -%files roofit-batchcompute +%files roofit-batchcompute -f includelist-roofit-batchcompute %{_libdir}/%{name}/libRooBatchCompute.* %{_libdir}/%{name}/libRooBatchCompute_* +%doc roofit/batchcompute/README.md + +%if %{dataframe} +%files roofit-dataframe-helpers -f includelist-roofit-RDataFrameHelpers +%{_libdir}/%{name}/libRooFitRDataFrameHelpers.* +%{_libdir}/%{name}/libRooFitRDataFrameHelpers_rdict.pcm +%endif %files roofit-hs3 -f includelist-roofit-hs3 %{_libdir}/%{name}/libRooFitHS3.* %{_libdir}/%{name}/libRooFitHS3_rdict.pcm -%dir %{_includedir}/%{name}/RooFitHS3 +%{_datadir}/%{name}/RooFitHS3_wsexportkeys.json +%{_datadir}/%{name}/RooFitHS3_wsfactoryexpressions.json +%doc roofit/hs3/README.md %files roofit-jsoninterface -f includelist-roofit-jsoninterface %{_libdir}/%{name}/libRooFitJSONInterface.* %{_libdir}/%{name}/libRooFitJSONInterface_rdict.pcm -%dir %{_includedir}/%{name}/RooFit - -%files roofit-codegen -f includelist-roofit-codegen -%{_libdir}/%{name}/libRooFitCodegen.* -%{_libdir}/%{name}/libRooFitCodegen_rdict.pcm - -%if %{roofitmp} -%files roofit-multiprocess -f includelist-roofit-multiprocess -%{_libdir}/%{name}/libRooFitMultiProcess.* -%dir %{_includedir}/%{name}/RooFit -%dir %{_includedir}/%{name}/RooFit/MultiProcess - -%files roofit-zmq -%{_libdir}/%{name}/libRooFitZMQ.* -%endif %files roostats -f includelist-roofit-roostats %{_libdir}/%{name}/libRooStats.* @@ -3262,20 +3553,29 @@ fi %{_libdir}/%{name}/libHistFactory_rdict.pcm %{_datadir}/%{name}/HistFactorySchema.dtd %dir %{_includedir}/%{name}/RooStats/HistFactory -%dir %{_includedir}/%{name}/RooStats/HistFactory/Detail %doc roofit/histfactory/doc/README - -%files xroofit -f includelist-roofit-xroofit -%{_libdir}/%{name}/libRooFitXRooFit.* -%{_libdir}/%{name}/libRooFitXRooFit_rdict.pcm -%dir %{_includedir}/%{name}/RooFit/xRooFit %endif +%files sql-mysql -f includelist-sql-mysql +%{_libdir}/%{name}/libRMySQL.* +%{_libdir}/%{name}/libRMySQL_rdict.pcm +%{_datadir}/%{name}/plugins/TSQLServer/P010_TMySQLServer.C + +%files sql-odbc -f includelist-sql-odbc +%{_libdir}/%{name}/libRODBC.* +%{_libdir}/%{name}/libRODBC_rdict.pcm +%{_datadir}/%{name}/plugins/TSQLServer/P050_TODBCServer.C + %files sql-sqlite -f includelist-sql-sqlite %{_libdir}/%{name}/libRSQLite.* %{_libdir}/%{name}/libRSQLite_rdict.pcm %{_datadir}/%{name}/plugins/TSQLServer/P060_TSQLiteServer.C +%files sql-pgsql -f includelist-sql-pgsql +%{_libdir}/%{name}/libPgSQL.* +%{_libdir}/%{name}/libPgSQL_rdict.pcm +%{_datadir}/%{name}/plugins/TSQLServer/P020_TPgSQLServer.C + %files tmva -f includelist-tmva-tmva %{_libdir}/%{name}/libTMVA.* %{_libdir}/%{name}/libTMVA_rdict.pcm @@ -3284,8 +3584,6 @@ fi %dir %{_includedir}/%{name}/TMVA/DNN/Architectures %dir %{_includedir}/%{name}/TMVA/DNN/Architectures/Cpu %dir %{_includedir}/%{name}/TMVA/DNN/Architectures/Reference -%dir %{_includedir}/%{name}/TMVA/DNN/CNN -%dir %{_includedir}/%{name}/TMVA/DNN/RNN %license tmva/doc/LICENSE %exclude %{_includedir}/%{name}/TMVA/RBDT.hxx %exclude %{_includedir}/%{name}/TMVA/RInferenceUtils.hxx @@ -3293,38 +3591,36 @@ fi %exclude %{_includedir}/%{name}/TMVA/RSofieReader.hxx %exclude %{_includedir}/%{name}/TMVA/RStandardScaler.hxx %exclude %{_includedir}/%{name}/TMVA/RTensorUtils.hxx -%exclude %{_includedir}/%{name}/TMVA/BatchGenerator/RBatchGenerator.hxx -%exclude %{_includedir}/%{name}/TMVA/BatchGenerator/RBatchLoader.hxx -%exclude %{_includedir}/%{name}/TMVA/BatchGenerator/RChunkConstructor.hxx -%exclude %{_includedir}/%{name}/TMVA/BatchGenerator/RChunkLoader.hxx +%exclude %{_includedir}/%{name}/TMVA/TreeInference/BranchlessTree.hxx +%exclude %{_includedir}/%{name}/TMVA/TreeInference/Forest.hxx +%exclude %{_includedir}/%{name}/TMVA/TreeInference/Objectives.hxx +%exclude %{_includedir}/%{name}/TMVA/TreeInference/PythonHelpers.hxx %if %{dataframe} %files tmva-utils %{_libdir}/%{name}/libTMVAUtils.* %{_libdir}/%{name}/libTMVAUtils_rdict.pcm %dir %{_includedir}/%{name}/TMVA +%dir %{_includedir}/%{name}/TMVA/TreeInference %{_includedir}/%{name}/TMVA/RBDT.hxx %{_includedir}/%{name}/TMVA/RInferenceUtils.hxx %{_includedir}/%{name}/TMVA/RReader.hxx %{_includedir}/%{name}/TMVA/RSofieReader.hxx %{_includedir}/%{name}/TMVA/RStandardScaler.hxx %{_includedir}/%{name}/TMVA/RTensorUtils.hxx -%dir %{_includedir}/%{name}/TMVA/BatchGenerator -%{_includedir}/%{name}/TMVA/BatchGenerator/RBatchGenerator.hxx -%{_includedir}/%{name}/TMVA/BatchGenerator/RBatchLoader.hxx -%{_includedir}/%{name}/TMVA/BatchGenerator/RChunkConstructor.hxx -%{_includedir}/%{name}/TMVA/BatchGenerator/RChunkLoader.hxx +%{_includedir}/%{name}/TMVA/TreeInference/BranchlessTree.hxx +%{_includedir}/%{name}/TMVA/TreeInference/Forest.hxx +%{_includedir}/%{name}/TMVA/TreeInference/Objectives.hxx +%{_includedir}/%{name}/TMVA/TreeInference/PythonHelpers.hxx %endif %files tmva-python -f includelist-tmva-pymva %{_libdir}/%{name}/libPyMVA.* %{_libdir}/%{name}/libPyMVA_rdict.pcm -%if %{rrr} %files tmva-r -f includelist-tmva-rmva %{_libdir}/%{name}/libRMVA.* %{_libdir}/%{name}/libRMVA_rdict.pcm -%endif %files tmva-sofie -f includelist-tmva-sofie %{_libdir}/%{name}/libROOTTMVASofie.* @@ -3373,9 +3669,11 @@ fi %{_libdir}/%{name}/libUnfold_rdict.pcm %files cli +%{_bindir}/rootbrowse %{_bindir}/rootcp %{_bindir}/rootdrawtree %{_bindir}/rooteventselector +%{_bindir}/rootls %{_bindir}/rootmkdir %{_bindir}/rootmv %{_bindir}/rootprint @@ -3383,12 +3681,21 @@ fi %{_bindir}/rootslimtree %{_datadir}/%{name}/cli +%files notebook +%{_bindir}/rootnb.exe +%{_datadir}/%{name}/notebook +%doc %{_pkgdocdir}/JupyROOT-on-EPEL + %files gui-webdisplay -f includelist-gui-webdisplay %{_libdir}/%{name}/libROOTWebDisplay.* %{_libdir}/%{name}/libROOTWebDisplay_rdict.pcm -%{_datadir}/%{name}/runfirefox.sh %{_datadir}/%{name}/ui5 +%ifarch %{qt5_qtwebengine_arches} +%files gui-qt5webdisplay +%{_libdir}/%{name}/libROOTQt5WebDisplay.* +%endif + %ifarch %{qt6_qtwebengine_arches} %files gui-qt6webdisplay %{_libdir}/%{name}/libROOTQt6WebDisplay.* @@ -3400,49 +3707,12 @@ fi %{_datadir}/%{name}/plugins/TCanvasImp/P010_TWebCanvas.C %{_datadir}/%{name}/plugins/TControlBarImp/P010_TWebControlBar.C -%files gui-browsable -f includelist-gui-browsable -%{_libdir}/%{name}/libROOTBrowsable.* -%{_libdir}/%{name}/libROOTBrowsable_rdict.pcm -%{_libdir}/%{name}/libROOTBranchBrowseProvider.* -%{_libdir}/%{name}/libROOTGeoBrowseProvider.* -%{_libdir}/%{name}/libROOTLeafDraw6Provider.* -%{_libdir}/%{name}/libROOTNTupleBrowseProvider.* -%{_libdir}/%{name}/libROOTNTupleDraw6Provider.* -%{_libdir}/%{name}/libROOTObjectDraw6Provider.* - -%files gui-browserv7 -f includelist-gui-browserv7 -%{_libdir}/%{name}/libROOTBrowserv7.* -%{_libdir}/%{name}/libROOTBrowserv7_rdict.pcm -%{_libdir}/%{name}/libROOTBrowserGeomWidget.* -%{_libdir}/%{name}/libROOTBrowserTCanvasWidget.* -%{_libdir}/%{name}/libROOTBrowserTreeWidget.* -%{_libdir}/%{name}/libROOTBrowserWidgets.* -%{_datadir}/%{name}/plugins/TBrowserImp/P030_RWebBrowserImp.C - -%files geom-checker -f includelist-geom-geomchecker -%{_libdir}/%{name}/libGeomChecker.* -%{_libdir}/%{name}/libGeomChecker_rdict.pcm -%{_datadir}/%{name}/plugins/TVirtualGeoChecker/P010_TGeoChecker.C - +%if %{root7} %files geom-webviewer -f includelist-geom-webviewer %{_libdir}/%{name}/libROOTGeomViewer.* %{_libdir}/%{name}/libROOTGeomViewer_rdict.pcm %{_datadir}/%{name}/plugins/TVirtualGeoPainter/P020_RGeoPainter.C -%files tree-ntuple -f includelist-tree-ntuple -%{_libdir}/%{name}/libROOTNTuple.* -%{_libdir}/%{name}/libROOTNTuple_rdict.pcm -%dir %{_includedir}/%{name}/ROOT/libdaos_mock - -%files tree-ntuple-browse -f includelist-tree-ntuplebrowse -%{_libdir}/%{name}/libROOTNTupleBrowse.* -%{_libdir}/%{name}/libROOTNTupleBrowse_rdict.pcm - -%files tree-ntuple-utils -f includelist-tree-ntupleutil -%{_libdir}/%{name}/libROOTNTupleUtil.* -%{_libdir}/%{name}/libROOTNTupleUtil_rdict.pcm - -%if %{root7} %files graf-gpadv7 -f includelist-graf2d-gpadv7 %{_libdir}/%{name}/libROOTGpadv7.* %{_libdir}/%{name}/libROOTGpadv7_rdict.pcm @@ -3455,13 +3725,28 @@ fi %{_libdir}/%{name}/libROOTEve.* %{_libdir}/%{name}/libROOTEve_rdict.pcm -%files gui-browsable-v7 +%files gui-browsable -f includelist-gui-browsable +%{_libdir}/%{name}/libROOTBrowsable.* +%{_libdir}/%{name}/libROOTBrowsable_rdict.pcm +%{_libdir}/%{name}/libROOTBranchBrowseProvider.* +%{_libdir}/%{name}/libROOTHistDrawProvider.* +%{_libdir}/%{name}/libROOTLeafDraw6Provider.* %{_libdir}/%{name}/libROOTLeafDraw7Provider.* +%{_libdir}/%{name}/libROOTNTupleBrowseProvider.* +%{_libdir}/%{name}/libROOTNTupleDraw6Provider.* %{_libdir}/%{name}/libROOTNTupleDraw7Provider.* +%{_libdir}/%{name}/libROOTObjectDraw6Provider.* %{_libdir}/%{name}/libROOTObjectDraw7Provider.* -%files gui-browserv7-v7 +%files gui-browserv7 -f includelist-gui-browserv7 +%{_libdir}/%{name}/libROOTBrowserv7.* +%{_libdir}/%{name}/libROOTBrowserv7_rdict.pcm +%{_libdir}/%{name}/libROOTBrowserGeomWidget.* %{_libdir}/%{name}/libROOTBrowserRCanvasWidget.* +%{_libdir}/%{name}/libROOTBrowserTCanvasWidget.* +%{_libdir}/%{name}/libROOTBrowserTreeWidget.* +%{_libdir}/%{name}/libROOTBrowserWidgets.* +%{_datadir}/%{name}/plugins/TBrowserImp/P030_RWebBrowserImp.C %files gui-canvaspainter %{_libdir}/%{name}/libROOTCanvasPainter.* @@ -3473,270 +3758,27 @@ fi %files histv7 -f includelist-hist-histv7 %{_libdir}/%{name}/libROOTHist.* %{_libdir}/%{name}/libROOTHist_rdict.pcm + +%files hist-draw -f includelist-hist-histdrawv7 +%{_libdir}/%{name}/libROOTHistDraw.* +%{_libdir}/%{name}/libROOTHistDraw_rdict.pcm + +%files tree-ntuple -f includelist-tree-ntuple +%{_libdir}/%{name}/libROOTNTuple.* +%{_libdir}/%{name}/libROOTNTuple_rdict.pcm + +%files tree-ntuple-utils -f includelist-tree-ntupleutil +%{_libdir}/%{name}/libROOTNTupleUtil.* +%{_libdir}/%{name}/libROOTNTupleUtil_rdict.pcm + +%if %{roofit} +%files xroofit -f includelist-roofit-xroofit +%{_libdir}/%{name}/libRooFitXRooFit.* +%{_libdir}/%{name}/libRooFitXRooFit_rdict.pcm +%endif %endif %changelog -* Mon Jan 12 2026 Mattias Ellert - 6.38.00-6 -- Fixes for gcc 16 - -* Thu Dec 25 2025 Mattias Ellert - 6.38.00-5 -- Fix test for stricter syntax in numpy 2.4.0 (backport) - -* Fri Dec 19 2025 Mattias Ellert - 6.38.00-4 -- Exclude tests for Fedora 43+ on s390x that fail due to hardware - acceleration in the zlib-ng library. - -* Thu Dec 18 2025 Mattias Ellert - 6.38.00-3 -- Don't install the python modules twice -- Fix Requires and Provides in the python3-root rpm - -* Thu Dec 11 2025 Mattias Ellert - 6.38.00-2 -- Skip RPATH using -DCMAKE_SKIP_INSTALL_RPATH:BOOL=ON (replaces - previously used root specific -Drpath:BOOL=OFF no longer available) -- Backport fixes to python module -- Rebuild for pythia8 8.3.16 - -* Tue Dec 09 2025 Mattias Ellert - 6.38.00-1 -- Update to 6.38.00 -- Removed subpackages: root-proof, root-proof-bench, root-proof-player, - root-proof-sessionviewer, root-sql-mysql, root-sql-odbc, root-sql-pgsql -- New subpackages: root-geom-checker, root-gui-treemap, - root-tree-ntuple-browse, root-histv7 -- JsMVA python (sub)module dropped from python3-root package -- Compile minuit2 with Open MP support -- Dropped patches: 7 -- New patches: 4 - -* Wed Oct 29 2025 Stephen Gallagher - 6.36.04-4 -- Rebuild for libarrow 22 - -* Thu Oct 09 2025 Jaroslav Škarvada - 6.36.04-3 -- Rebuilt for new graphviz - -* Fri Sep 19 2025 Python Maint - 6.36.04-2 -- Rebuilt for Python 3.14.0rc3 bytecode - -* Mon Aug 25 2025 Mattias Ellert - 6.36.04-1 -- Update to 6.36.04 - -* Wed Aug 20 2025 Jerry James - 6.36.02-7 -- Rebuild for tbb 2022.2.0 - -* Tue Aug 19 2025 Mattias Ellert - 6.36.02-6 -- Support libarrow 21 - -* Mon Aug 18 2025 Orion Poplawski - 6.36.02-5 -- Rebuild for libarrow 21 - -* Fri Aug 15 2025 Python Maint - 6.36.02-4 -- Rebuilt for Python 3.14.0rc2 bytecode - -* Wed Aug 13 2025 Orion Poplawski - 6.36.02-3 -- Rebuild for libarrow 21 - -* Fri Jul 25 2025 Fedora Release Engineering - 6.36.02-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Sun Jul 13 2025 Mattias Ellert - 6.36.02-1 -- Update to 6.36.02 - -* Thu Jul 10 2025 Stephen Gallagher - 6.36.00-3 -- Rebuilt for libarrow 20 - -* Sat Jun 21 2025 Mattias Ellert - 6.36.00-2 -- Add root-tree-ntuple and root-tree-ntuple-utils dependensies to root-core - (listed in root-config --libs) -- Rename root-fonts package to root-font-files -- Add optional test dependency python3-pandas now available in EPEL 10 -- Add dependency jupyter-notebook to root-jupyroot for EPEL 10.1 and later -- Fix Python 3.14 refcount issues in tests - -* Sat Jun 07 2025 Mattias Ellert - 6.36.00-1 -- Update to 6.36.00 -- Enable the R interface for EPEL 10.1 -- Removed subpackages: root-gui-qt5webdisplay, -hist-draw, -histv7 and -html -- New subpackage: root-roofit-codegen - -* Tue Jun 03 2025 Python Maint - 6.34.08-5 -- Rebuilt for Python 3.14 - -* Fri Apr 18 2025 Iñaki Úcar - 6.34.08-4 -- R-maint-sig mass rebuild - -* Fri Apr 18 2025 Iñaki Úcar - 6.34.08-3 -- R-maint-sig mass rebuild - -* Fri Apr 18 2025 Iñaki Úcar - 6.34.08-2 -- R-maint-sig mass rebuild - -* Thu Apr 17 2025 Mattias Ellert - 6.34.08-1 -- Update to 6.34.08 - -* Fri Mar 28 2025 Mattias Ellert - 6.34.06-1 -- Update to 6.34.06 -- Drop patches accepted upstream or previously backported - -* Wed Feb 19 2025 Mattias Ellert - 6.34.04-2 -- Fix roofit/roostats test failures with gcc 15 - -* Fri Feb 14 2025 Mattias Ellert - 6.34.04-1 -- Update to 6.34.04 -- Drop patches accepted upstream or previously backported - -* Fri Feb 14 2025 Benjamin A. Beasley - 6.34.02-8 -- Rebuilt for libarrow 19 - -* Sun Feb 02 2025 Orion Poplawski - 6.34.02-7 -- Rebuild with gsl 2.8 - -* Sat Feb 01 2025 Björn Esser - 6.34.02-6 -- Add explicit BR: libxcrypt-devel - -* Fri Jan 31 2025 Mattias Ellert - 6.34.02-5 -- Apply patches to fix build with gcc 15 -- Enable roofit-multiprocess for EPEL 10 (dependencies available) -- Rebuild for pythia8 8.3.13 - -* Sat Jan 18 2025 Fedora Release Engineering - 6.34.02-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Wed Jan 15 2025 Mattias Ellert - 6.34.02-3 -- Don't add dependencies on root-roofit-multiprocess and root-roofit-zmq - to root-roofit-core for EPEL builds - -* Sun Jan 12 2025 Mattias Ellert - 6.34.02-2 -- Adjust stressGraphics.ref -- Build for EPEL 10 -- Disable the R interface for EPEL 10 (R not yet abailable) -- Enable uring support for EPEL 9 (supported in kernel since RHEL 9.3) - -* Wed Dec 25 2024 Mattias Ellert - 6.34.02-1 -- Update to 6.34.02 -- Build CLAD plugin -- Removed package: root-roofit-dataframe-helpers - -* Wed Nov 27 2024 Richard W.M. Jones - 6.32.08-2 -- Rebuild for libarrow 18 - -* Thu Nov 14 2024 Mattias Ellert - 6.32.08-1 -- Update to 6.32.08 - -* Mon Sep 23 2024 Mattias Ellert - 6.32.06-1 -- Update to 6.32.06 -- Split out ROOT 7 dependent parts of root-browsable to a separate package -- Split out ROOT 7 dependent parts of root-browserv7 to a separate package - -* Wed Aug 21 2024 Mattias Ellert - 6.32.04-2 -- Re-enable Qt5 Web display for Fedora 41+ (qt5-qtwebengine fixed) - -* Wed Aug 14 2024 Mattias Ellert - 6.32.04-1 -- Update to 6.32.04 -- Drop patches accepted upstream -- Disable Qt5 Web display for Fedora 41+ (broken qt5-qtwebengine package) - -* Sun Jul 21 2024 Mattias Ellert - 6.32.02-4 -- Update ROOT's R interface for Rcpp 1.0.13 - -* Fri Jul 19 2024 Fedora Release Engineering - 6.32.02-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Thu Jul 11 2024 Mattias Ellert - 6.32.02-2 -- Add openssl-devel-engine build requirement on Fedora 41+ -- Fixes for TUri class (PCRE2 compatibility) -- Fix test failure with tbb 2021.13.0 - -* Tue Jun 18 2024 Mattias Ellert - 6.32.02-1 -- Update to 6.32.02 -- Drop patches accepted upstream - -* Mon Jun 17 2024 Mattias Ellert - 6.32.00-5 -- Add dependency on liburing-devel to root-io -- Exclude failing tutorial-tmva-RBatchGenerator_filters_vectors-py test - on aarch64 (Fedora 40+) - -* Mon Jun 10 2024 Mattias Ellert - 6.32.00-4 -- Backport fix for failing test with Python 3.13 - -* Sun Jun 09 2024 Python Maint - 6.32.00-3 -- Rebuilt for Python 3.13 - -* Sat Jun 08 2024 Mattias Ellert - 6.32.00-2 -- Python 3.13 compatibility - -* Mon Jun 03 2024 Mattias Ellert - 6.32.00-1 -- Update to 6.32.00 -- Drop EPEL 8 build (now requires Python >= 3.7 and tbb >= 2020) -- Dropped patches: 12 -- New patches: 6 -- The JsMVA python module is now a submodule of the ROOT python module -- The notebook package was merged with the JupyROOT package - -* Wed May 15 2024 Mattias Ellert - 6.30.06-5 -- Rebuilt for libarrow.so.1601 -- Improved fontconfig support - -* Sun Apr 28 2024 Benjamin A. Beasley - 6.30.06-4 -- Do not test with Pandas on 32-bit architectures - -* Thu Apr 25 2024 Iñaki Úcar - 6.30.06-3 -- R-maint-sig mass rebuild - -* Tue Apr 23 2024 Mattias Ellert - 6.30.06-2 -- Rebuilt for libarrow.so.1600 - -* Fri Apr 05 2024 Mattias Ellert - 6.30.06-1 -- Update to 6.30.06 - -* Mon Mar 25 2024 Mattias Ellert - 6.30.04-2 -- Support StandardSymbolsPS.otf - -* Wed Jan 31 2024 Mattias Ellert - 6.30.04-1 -- Update to 6.30.04 -- Drop patch root-adjust-test-for-failures-on-aarch64-ppc64le-s390x.patch - (accepted upstrem) -- Exclude failing TClingDataMemberInfo.Offset test on s390x - -* Fri Jan 26 2024 Mattias Ellert - 6.30.02-9 -- Rebuilt for libarrow.so.1500 - -* Fri Jan 26 2024 Mattias Ellert - 6.30.02-8 -- Exclude failing gtest-math-matrix-test-testMatrixTSparse on Fedora 40 - (aarch64, ppc64le and s390x) - -* Mon Jan 22 2024 Fedora Release Engineering - 6.30.02-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Wed Jan 17 2024 Jonathan Wakely - 6.30.02-6 -- Rebuilt for TBB 2021.11 - -* Fri Jan 12 2024 Mattias Ellert - 6.30.02-5 -- Define PYTHON_EXECUTABLE when calling cmake (Fixes EPEL 8 build) - -* Thu Dec 21 2023 Mattias Ellert - 6.30.02-4 -- Adjust tests for zlib-ng - -* Mon Dec 18 2023 Mattias Ellert - 6.30.02-3 -- Use "standardsymbolsps" instead of "symbol" when searching for the - Symbols font in order to not find Noto Symbols instead - -* Fri Dec 15 2023 Mattias Ellert - 6.30.02-2 -- Exclude pyunittests-pyroot-numbadeclare test - -* Sat Dec 02 2023 Mattias Ellert - 6.30.02-1 -- Update to 6.30.02 - -* Sat Nov 25 2023 Mattias Ellert - 6.30.00-1 -- Update to 6.30.00 -- Removed subpackages: root-io-gfal and root-roofit-common -- Dropped patches: 6 -- New patches: 6 - -* Thu Nov 02 2023 Mattias Ellert - 6.28.08-3 -- Rebuilt for libarrow.so.1400 - -* Wed Nov 01 2023 Mattias Ellert - 6.28.08-2 -- Enable RooFit::MultiProcess on Fedora 40+ - * Sat Oct 14 2023 Mattias Ellert - 6.28.08-1 - Update to 6.28.08 - New subpackage root-tmva-utils (split off from root-tmva) diff --git a/sources b/sources index 98e90e5..abdf4dd 100644 --- a/sources +++ b/sources @@ -1,3 +1,2 @@ -SHA512 (root-6.38.00.tar.xz) = 7c452b509e8171a0cbb7c102a3d4c07333fc8535f1b2c2ab0b9f7434604f098989a78bb71c41039dd41dbbd3438ea8703939826092f075d9d730b6b53c84ac55 -SHA512 (root-testfiles.tar.xz) = 4bb7f8ca00b1427ba49f6428e9cfe5908a2ffdd2ce4134d3bc169a0629198352b5500fe0cf92c121d148e5af41f7016c96038a77794a4d37d94e6ec0a9d75670 -SHA512 (clad-2.2.tar.gz) = 6f76d706a829901fc0fcdb38b5ddad6ea8ad9186ea48a4b6b585fc62974a2cda11b96a448c25daaba0586962d6428773e7ab751236c6afa72a91d12f30f2d05e +SHA512 (root-6.28.08.tar.xz) = 868d770a05372677da84e4456023c1b2b575ff1eac8b6b841ed45dd1e0fd0c6c7aede533271b986404f2a55c91ea196ac2d8c81b3b4d1edfae159c0b665c415e +SHA512 (root-testfiles.tar.xz) = 945aef1a0cf5af672d4ab84b0ac00b76118e93008ff72447658ee82d9e955a1540af3ff7126e701418872f1d91b92ee96d4985840a519036c42732023a13f00f