From 5e62ed4457c9e28ae6ec8e7b073ca83aa27fc2af Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Mon, 15 Dec 2025 07:21:12 +0000 Subject: [PATCH 1/9] Upgrade suitesparse to 7.11.0 --- .../suitesparse/suitesparse.signatures.json | 4 +- SPECS-EXTENDED/suitesparse/suitesparse.spec | 505 +++++++++--------- cgmanifest.json | 4 +- 3 files changed, 264 insertions(+), 249 deletions(-) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.signatures.json b/SPECS-EXTENDED/suitesparse/suitesparse.signatures.json index 1fab5c4eeb4..2f949f40150 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.signatures.json +++ b/SPECS-EXTENDED/suitesparse/suitesparse.signatures.json @@ -1,5 +1,5 @@ { "Signatures": { - "SuiteSparse-5.4.0.tar.gz": "374dd136696c653e34ef3212dc8ab5b61d9a67a6791d5ec4841efb838e94dbd1" + "suitesparse-7.11.0.tar.gz": "93ed4c4e546a49fc75884c3a8b807d5af4a91e39d191fbbc60a07380b12a35d1" } -} +} \ No newline at end of file diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index 2588b412dfe..53e1f46e735 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -1,38 +1,112 @@ -%global amd_version_major 2 -%global btf_version_major 1 -%global camd_version_major 2 -%global ccolamd_version_major 2 -%global cholmod_version_major 3 -%global colamd_version_major 2 -%global csparse_version_major 3 -%global cxsparse_version_major 3 -%global klu_version_major 1 -%global ldl_version_major 2 -%global rbio_version_major 2 -%global spqr_version_major 2 -%global SuiteSparse_config_major 5 -%global umfpack_version_major 5 +%global amd_version_major 3 +%global btf_version_major 2 +%global camd_version_major 3 +%global ccolamd_version_major 3 +%global cholmod_version_major 5 +%global colamd_version_major 3 +%global csparse_version_major 4 +%global cxsparse_version_major 4 +%global gpuqrengine_version_major 3 +%global graphblas_version_major 10 +%global klu_cholmod_version_major 2 +%global klu_version_major 2 +%global lagraph_version_major 1 +%global lagraphx_version_major 1 +%global ldl_version_major 3 +%global paru_version_major 1 +%global rbio_version_major 4 +%global spex_version_major 3 +%global spqr_version_major 4 +%global SuiteSparse_config_major 7 +%global SuiteSparse_gpuruntime_major 3 +%global SuiteSparse_metis_major 5 +%global umfpack_version_major 6 + ### CXSparse is a superset of CSparse, and the two share common header ### names, so it does not make sense to build both. CXSparse is built ### by default, but CSparse can be built instead by defining ### enable_csparse as 1 below. %global enable_csparse 0 -Summary: A collection of sparse matrix libraries +# Whether to build a separate version of libraries linked against an ILP64 BLAS +%if 0%{?__isa_bits} == 64 +%global build64 1 +%endif + +%global suitesparse_builds SuiteSparse %{?build64:SuiteSparse64 SuiteSparse64_} + +%global blaslib openblas + +# SuiteSparse uses a modified version of metis, so use it +%bcond_with system_metis + +%global commit 6ab1e9eb9e67264218ffbdfc25010650da449a39 + Name: suitesparse -Version: 5.4.0 -Release: 5%{?dist} -License: (LGPLv2+ OR BSD) AND LGPLv2+ AND GPLv2+ +Version: 7.11.0 +Release: 1%{?dist} +Summary: A collection of sparse matrix libraries Vendor: Microsoft Corporation Distribution: Azure Linux -URL: https://faculty.cse.tamu.edu/davis/suitesparse.html -Source0: https://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-%{version}.tar.gz + +# See LICENSE.txt for a breakdown of all licenses: +# Shipped modules licenses: +# * AMD - BSD-3-Clause +# * BTF - LGPL-2.1-or-later +# * CAMD - BSD-3-Clause +# * COLAMD - BSD-3-Clause +# * CCOLAMD - BSD-3-Clause +# * CHOLMOD - LGPL-2.1-or-later AND GPL-2.0-or-later +# * CSparse - LGPL-2.1-or-later AND BSD-3-Clause +# * CXSparse - LGPL-2.1-or-later AND BSD-3-Clause +# * KLU - LGPL-2.1-or-later +# * LDL - LGPL-2.1-or-later +# * RBio - GPL-2.0-or-later +# * SPQR - GPL-2.0-or-later +# * UMFPACK - GPL-2.0-or-later +# +# Not shipped modules licenses: +# * GPUQREngine - GPL-2.0-or-later +# * GraphBLAS - Apache-2.0 AND GPL-3.0-or-later +# * SLIP_LU - LGPL-3.0-or-later OR GPL-2.0-or-later OR (LGPL-3.0-or-later AND GPL-2.0-or-later) +# * MATLAB_Tools - BSD-3-Clause AND GPL-2.0-or-later +# * Mongoose - GPL-3.0-only +# * ssget - BSD-3-Clause +# * SuiteSparse_GPURuntime - GPL-2.0-or-later + +License: BSD-3-Clause AND LGPL-2.1-or-later AND GPL-2.0-or-later +URL: http://faculty.cse.tamu.edu/davis/suitesparse.html +Source0: https://github.com/DrTimothyAldenDavis/SuiteSparse/archive/v%{version}/%{name}-%{version}.tar.gz + +BuildRequires: cmake BuildRequires: gcc BuildRequires: gcc-c++ -BuildRequires: hardlink +BuildRequires: gcc-gfortran +BuildRequires: make + +BuildRequires: gmp-devel +%if %{with system_metis} BuildRequires: metis-devel +%else +Provides: bundled(metis) = 5.1.0 +%endif +BuildRequires: %{blaslib}-devel +BuildRequires: mpfr-devel +# openblas is still required for 64-bit suffixed versions BuildRequires: openblas-devel +BuildRequires: lapack-devel +BuildRequires: mpfr-devel BuildRequires: tbb-devel +BuildRequires: hardlink + +# Not packaged in Fedora +Provides: bundled(cpu_features) = 0.6.0 +# GraphBLAS redefines malloc() so must use bundled versions +Provides: bundled(lz4) = 1.9.3 +Provides: bundled(zstd) = 1.5.5 + +Obsoletes: umfpack <= 5.0.1 +Obsoletes: ufsparse <= 2.1.1 Provides: ufsparse = %{version}-%{release} %description @@ -54,15 +128,19 @@ matrices. The package includes the following libraries: SuiteSparse_config configuration file for all the above packages. RBio read/write files in Rutherford/Boeing format + %package devel Summary: Development headers for SuiteSparse Requires: %{name} = %{version}-%{release} +Obsoletes: umfpack-devel <= 5.0.1 +Obsoletes: ufsparse-devel <= 2.1.1 Provides: ufsparse-devel = %{version}-%{release} %description devel The suitesparse-devel package contains files needed for developing applications which use the suitesparse libraries. + %package static Summary: Static version of SuiteSparse libraries Requires: %{name}-devel = %{version}-%{release} @@ -72,12 +150,15 @@ Provides: ufsparse-static = %{version}-%{release} The suitesparse-static package contains the statically linkable version of the suitesparse libraries. + +%if 0%{?build64} %package -n %{name}64 Summary: A collection of sparse matrix libraries (ILP64 version) %description -n %{name}64 The suitesparse collection compiled against an ILP64 BLAS library. + %package -n %{name}64-devel Summary: Development headers for SuiteSparse (ILP64 version) Requires: %{name}-devel = %{version}-%{release} @@ -87,6 +168,7 @@ Requires: %{name}64 = %{version}-%{release} The suitesparse64-devel package contains files needed for developing applications which use the suitesparse libraries (ILP64 version). + %package -n %{name}64-static Summary: Static version of SuiteSparse libraries (ILP64 version) Requires: %{name}-devel = %{version}-%{release} @@ -95,12 +177,14 @@ Requires: %{name}-devel = %{version}-%{release} The suitesparse64-static package contains the statically linkable version of the suitesparse libraries (ILP64 version). + %package -n %{name}64_ Summary: A collection of sparse matrix libraries (ILP64 version) %description -n %{name}64_ The suitesparse collection compiled against an ILP64 BLAS library. + %package -n %{name}64_-devel Summary: Development headers for SuiteSparse (ILP64 version) Requires: %{name}-devel = %{version}-%{release} @@ -112,6 +196,7 @@ applications which use the suitesparse libraries (ILP64 version) compiled against a BLAS library with the "64_" symbol name suffix (see openblas-*64_ packages). + %package -n %{name}64_-static Summary: Static version of SuiteSparse libraries (ILP64 version) Requires: %{name}-devel = %{version}-%{release} @@ -120,22 +205,34 @@ Requires: %{name}-devel = %{version}-%{release} The suitesparse64_-static package contains the statically linkable version of the suitesparse libraries (ILP64 version) compiled against a BLAS library with the "64_" symbol name suffix (see openblas-*64_ packages). +%endif + %package doc Summary: Documentation files for SuiteSparse -Requires: %{name} = %{version}-%{release} BuildArch: noarch +Requires: %{name} = %{version}-%{release} %description doc This package contains documentation files for %{name}. + %prep -%setup -q -c -pushd SuiteSparse +%setup -c -q +mkdir Doc Licenses +pushd SuiteSparse-%{version} +#patch 0 -p1 -b .postfix +%if !0%{?enable_csparse} + sed -i -e /CSparse/d Makefile +%endif + # Build fails + sed -i -e /Mongoose/d Makefile +%if %{with system_metis} # Remove bundled metis - rm -r metis* - # Makefiles look for metis.h specifically - ln -s %{_includedir}/metis/*.h include/ + rm -r SuiteSparse_metis + # SuiteSparse looks for SuiteSparse_metis.h specifically + ln -s %{_includedir}/metis/metis.h include/SuiteSparse_metis.h +%endif # Fix pragma ivdep so gcc understands it. for fil in $(grep -Frl 'pragma ivdep' .); do @@ -144,239 +241,82 @@ pushd SuiteSparse rm -f ${fil}.orig done - # drop non-standard -O3 and duplicate -fexceptions from default CFLAGS - sed -i -e '/^ CF =/ s/ -O3 -fexceptions//' SuiteSparse_config/SuiteSparse_config.mk + # drop non-standard -O3 + sed -i -e '/OPTS.*-O3/d' CHOLMOD/SuiteSparse_metis/GKlib/GKlibSystem.cmake + + # collect docs and licenses in one place to ship + find -iname lesser.txt -o -iname lesserv3.txt -o -iname license.txt -o \ + -iname gpl.txt -o -iname GPLv2.txt -o -iname license \ + -a -not -type d | while read f; do + b="${f%%/*}" + r="${f#$b}" + x="$(echo "$r" | sed 's|/doc/|/|gi')" + install -m0644 -D "$f" "../Licenses/$b/$x" + done - # Allow adding a suffix to the library name - sed -i -e '/SO.*=/s/$(LIBRARY).so/$(LIBRARY)$(LIBRARY_SUFFIX).so/' \ - -e '/AR_TARGET *=/s/$(LIBRARY).a/$(LIBRARY)$(LIBRARY_SUFFIX).a/' SuiteSparse_config/SuiteSparse_config.mk - sed -i -e 's/-l\(amd\|btf\|camd\|ccolamd\|cholmod\|colamd\|csparse\|cxsparse\|klu\|ldl\|rbio\|spqr\|suitesparseconfig\|umfpack\)/-l\1$(LIBRARY_SUFFIX)/g' \ - $(find -name Makefile\* -o -name \*.mk) + find -type f -a \( -iname \*.pdf -o -iname ChangeLog -o -iname README\* -o -iname \*.txt \) | + while read f; do + b="${f%%/*}" + r="${f#$b}" + x="$(echo "$r" | sed 's|/doc/|/|gi')" + install -m0644 -D "$f" "../Doc/$b/$x" + done popd -cp -a SuiteSparse SuiteSparse64 -cp -a SuiteSparse SuiteSparse64_ +%if 0%{?build64} +cp -al SuiteSparse-%{version} SuiteSparse64-%{version} +cp -al SuiteSparse-%{version} SuiteSparse64_-%{version} +%endif -%build -export AUTOCC=no -export CC=gcc +# hardlink duplicate documentation files +hardlink -cv Licenses/ -for build in SuiteSparse SuiteSparse64 SuiteSparse64_ +%build +# FindSuiteSparse_config looks for "build" +%global _vpath_builddir build +for build in %{suitesparse_builds} do - pushd $build - - # TODO - Try to use upstream makefile - will build more components - mkdir -p Doc/{AMD,BTF,CAMD,CCOLAMD,CHOLMOD,COLAMD,KLU,LDL,UMFPACK,SPQR,RBio} Include - - export CFLAGS="%{optflags} -I%{_includedir}/metis" - export LAPACK="" - # Set flags for ILP64 build - if [ $build = SuiteSparse64 ] - then - export CFLAGS="$CFLAGS -DBLAS64" - export BLAS=-lopenblas64 - export LIBRARY_SUFFIX=64 - elif [ $build = SuiteSparse64_ ] - then - export CFLAGS="$CFLAGS -DBLAS64 -DSUN64" - export BLAS=-lopenblas64_ - export LIBRARY_SUFFIX=64_ - else - export BLAS=-lopenblas - fi - - # SuiteSparse_config needs to come first - pushd SuiteSparse_config - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - cp -p *.h ../Include - popd - - pushd AMD - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/License.txt Doc/lesser.txt Doc/ChangeLog Doc/*.pdf ../Doc/AMD - popd - - pushd BTF - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/* ../Doc/BTF - popd - - pushd CAMD - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/ChangeLog Doc/License.txt Doc/*.pdf ../Doc/CAMD - popd - - pushd CCOLAMD - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/* ../Doc/CCOLAMD - popd - - pushd COLAMD - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/* ../Doc/COLAMD - popd - - pushd CHOLMOD - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/*.pdf ../Doc/CHOLMOD - cp -p Cholesky/lesser.txt ../Doc/CHOLMOD/Cholesky_License.txt - cp -p Core/lesser.txt ../Doc/CHOLMOD/Core_License.txt - cp -p MatrixOps/gpl.txt ../Doc/CHOLMOD/MatrixOps_License.txt - cp -p Partition/lesser.txt ../Doc/CHOLMOD/Partition_License.txt - cp -p Supernodal/gpl.txt ../Doc/CHOLMOD/Supernodal_License.txt - popd - - %if "%{?enable_csparse}" == "1" - pushd CSparse - pushd Source - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - cp -p cs.h ../../Include - popd - mkdir ../Doc/CSparse/ - cp -p Doc/* ../Doc/CSparse - popd - - %else - pushd CXSparse - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/cs.h ../Include - mkdir ../Doc/CXSparse/ - cp -p Doc/* ../Doc/CXSparse - popd - %endif - - pushd KLU - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/lesser.txt ../Doc/KLU - popd - - pushd LDL - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/ChangeLog Doc/lesser.txt Doc/*.pdf ../Doc/LDL - popd - - pushd UMFPACK - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/License.txt Doc/ChangeLog Doc/gpl.txt Doc/*.pdf ../Doc/UMFPACK - popd - - pushd SPQR - pushd Lib - %make_build CFLAGS="$CFLAGS -DHAVE_TBB -DNPARTITION" TBB=-ltbb BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h* ../Include - cp -p README{,_SPQR}.txt - cp -p README_SPQR.txt Doc/* ../Doc/SPQR - popd - - pushd RBio - pushd Lib - %make_build CFLAGS="$CFLAGS" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" - popd - cp -p Include/*.h ../Include - cp -p README.txt Doc/ChangeLog Doc/License.txt ../Doc/RBio - popd - + pushd $build-%{version} + %set_build_flags + CMAKE_OPTIONS="-DCMAKE_C_FLAGS_RELEASE:STRING=-DNDEBUG -DCMAKE_CXX_FLAGS_RELEASE:STRING=-DNDEBUG -DCMAKE_Fortran_FLAGS_RELEASE:STRING=-DNDEBUG -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCMAKE_INSTALL_DO_STRIP:BOOL=OFF \ + -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} -DCMAKE_INSTALL_LIBDIR=%{_libdir} -DCOMPACT=ON" +%if %{with system_metis} + CMAKE_OPTIONS="$CMAKE_OPTIONS -DSUITESPARSE_METIS_FOUND=true -DSUITESPARSE_METIS_INCLUDE_DIR=%{_includedir}/metis -DSUITESPARSE_METIS_LIBRARIES=%{_libdir}/libmetis.so" +%endif + # Set flags for ILP64 build + if [ $build = SuiteSparse64 ] + then + CMAKE_OPTIONS="$CMAKE_OPTIONS -DSUITESPARSE_INCLUDEDIR_POSTFIX=$build -DSUITESPARSE_PKGFILEDIR=%{_libdir}/$build -DCMAKE_RELEASE_POSTFIX=64 -DBLA_VENDOR=OpenBLAS -DALLOW_64BIT_BLAS=yes" + export CFLAGS="$CFLAGS -DBLAS_OPENBLAS_64" + elif [ $build = SuiteSparse64_ ] + then + CMAKE_OPTIONS="$CMAKE_OPTIONS -DSUITESPARSE_INCLUDEDIR_POSTFIX=$build -DSUITESPARSE_PKGFILEDIR=%{_libdir}/$build -DCMAKE_RELEASE_POSTFIX=64_ -DBLA_VENDOR=OpenBLAS -DALLOW_64BIT_BLAS=yes -DBLAS_LIBRARIES=%{_libdir}/libopenblas64_.so" + export CFLAGS="$CFLAGS -DBLAS_OPENBLAS_64" + else + CMAKE_OPTIONS="$CMAKE_OPTIONS -DSUITESPARSE_INCLUDEDIR_POSTFIX=suitesparse -DBLA_VENDOR=OpenBLAS" + fi + %make_build CMAKE_OPTIONS="$CMAKE_OPTIONS" JOBS=%{_smp_build_ncpus} popd done %install -mkdir -p %{buildroot}%{_libdir} -mkdir -p %{buildroot}%{_includedir}/%{name} -cp -a SuiteSparse/Include/*.{h,hpp} %{buildroot}%{_includedir}/%{name}/ -for build in SuiteSparse SuiteSparse64 SuiteSparse64_ +for build in %{suitesparse_builds} do - pushd $build - cp -a */Lib/*.a lib/*.so* %{buildroot}%{_libdir}/ - chmod 755 %{buildroot}%{_libdir}/*.so.* - - # collect licenses in one place to ship as base package documentation - rm -rf Licenses - mkdir Licenses - find */ -iname lesser.txt -o -iname license.txt -o -iname gpl.txt -o \ - -iname license | while read f; do - b="${f%%/*}" - r="${f#$b}" - x="$(echo "$r" | sed 's|/doc/|/|gi')" - install -m0644 -D "$f" "./Licenses/$b/$x" - done - - # hardlink duplicate documentation files - hardlink -cv Docs/ Licenses/ + pushd $build-%{version} + %make_install popd done - %check -check_status=0 -export AUTOCC=no -export CC=gcc -TESTDIRS="AMD CAMD CCOLAMD CHOLMOD COLAMD KLU LDL SPQR RBio UMFPACK" -%if "%{?enable_csparse}" == "1" -TESTDIRS="$TESTDIRS CSparse" -%else -TESTDIRS="$TESTDIRS CXSparse" -%endif -for build in SuiteSparse SuiteSparse64 SuiteSparse64_ +# Build demos as a check +for build in %{suitesparse_builds} do - pushd $build - export CFLAGS="%{optflags} -I%{_includedir}/metis" - export LAPACK="" - # Set flags for ILP64 build - if [ $build = SuiteSparse64 ] - then - export CFLAGS="$CFLAGS -DBLAS64" - export BLAS=-lopenblas64 - export LIBRARY_SUFFIX=64 - elif [ $build = SuiteSparse64_ ] - then - export CFLAGS="$CFLAGS -DBLAS64 -DSUN64" - export BLAS=-lopenblas64_ - export LIBRARY_SUFFIX=64_ - else - export BLAS=-lopenblas - fi - - for d in $TESTDIRS ; do - %make_build -C $d/Demo CFLAGS="$CFLAGS" LIB="%{?__global_ldflags} -lm -lrt" BLAS="$BLAS" LIBRARY_SUFFIX="$LIBRARY_SUFFIX" SPQR_CONFIG=-DHAVE_TBB TBB=-ltbb - if [[ $? -ne 0 ]]; then - check_status=1 - fi - done + pushd $build-%{version} + make install DESTDIR=%{buildroot} popd done -[[ $check_status -eq 0 ]] %files -%license SuiteSparse/Licenses +%license Licenses %{_libdir}/libamd.so.%{amd_version_major}* %{_libdir}/libbtf.so.%{btf_version_major}* %{_libdir}/libcamd.so.%{camd_version_major}* @@ -387,24 +327,76 @@ done %{_libdir}/libcsparse.so.%{csparse_version_major}* %endif %{_libdir}/libcxsparse.so.%{cxsparse_version_major}* +%{_libdir}/libgraphblas.so.%{graphblas_version_major}* +%{_libdir}/libklu_cholmod.so.%{klu_cholmod_version_major}* %{_libdir}/libklu.so.%{klu_version_major}* +%{_libdir}/liblagraph.so.%{lagraph_version_major}* +%{_libdir}/liblagraphx.so.%{lagraphx_version_major}* %{_libdir}/libldl.so.%{ldl_version_major}* +%{_libdir}/libparu.so.%{paru_version_major}* %{_libdir}/librbio.so.%{rbio_version_major}* +%{_libdir}/libspex.so.%{spex_version_major}* +%{_libdir}/libspexpython.so.%{spex_version_major}* %{_libdir}/libspqr.so.%{spqr_version_major}* %{_libdir}/libsuitesparseconfig.so.%{SuiteSparse_config_major}* %{_libdir}/libumfpack.so.%{umfpack_version_major}* +%{_libdir}/libumfpack.so.* %files devel -%{_includedir}/%{name} +%{_includedir}/%{name}/ +%{_libdir}/cmake/AMD/ +%{_libdir}/cmake/BTF/ +%{_libdir}/cmake/CAMD/ +%{_libdir}/cmake/CCOLAMD/ +%{_libdir}/cmake/CHOLMOD/ +%{_libdir}/cmake/COLAMD/ +%{_libdir}/cmake/CXSparse/ +%{_libdir}/cmake/GraphBLAS/ +%{_libdir}/cmake/KLU/ +%{_libdir}/cmake/KLU_CHOLMOD/ +%{_libdir}/cmake/LAGraph/ +%{_libdir}/cmake/LDL/ +%{_libdir}/cmake/ParU/ +%{_libdir}/cmake/RBio/ +%{_libdir}/cmake/SPEX/ +%{_libdir}/cmake/SPQR/ +%{_libdir}/cmake/SuiteSparse_config/ +%{_libdir}/cmake/SuiteSparse/ +%{_libdir}/cmake/UMFPACK/ +%exclude %{_libdir}/cmake/*/*_static*.cmake +%{_libdir}/pkgconfig/AMD.pc +%{_libdir}/pkgconfig/BTF.pc +%{_libdir}/pkgconfig/CAMD.pc +%{_libdir}/pkgconfig/CCOLAMD.pc +%{_libdir}/pkgconfig/CHOLMOD.pc +%{_libdir}/pkgconfig/COLAMD.pc +%{_libdir}/pkgconfig/CXSparse.pc +%{_libdir}/pkgconfig/GraphBLAS.pc +%{_libdir}/pkgconfig/KLU.pc +%{_libdir}/pkgconfig/KLU_CHOLMOD.pc +%{_libdir}/pkgconfig/LAGraph.pc +%{_libdir}/pkgconfig/LDL.pc +%{_libdir}/pkgconfig/ParU.pc +%{_libdir}/pkgconfig/RBio.pc +%{_libdir}/pkgconfig/SPEX.pc +%{_libdir}/pkgconfig/SPQR.pc +%{_libdir}/pkgconfig/SuiteSparse_config.pc +%{_libdir}/pkgconfig/UMFPACK.pc %{_libdir}/lib*.so +%if 0%{?build64} %exclude %{_libdir}/lib*64*.so +%endif %files static +%{_libdir}/cmake/*/*_static*.cmake %{_libdir}/lib*.a +%if 0%{?build64} %exclude %{_libdir}/lib*64*.a +%endif +%if 0%{?build64} %files -n %{name}64 -%license SuiteSparse64/Licenses +%license Licenses %{_libdir}/libamd64.so.%{amd_version_major}* %{_libdir}/libbtf64.so.%{btf_version_major}* %{_libdir}/libcamd64.so.%{camd_version_major}* @@ -415,21 +407,30 @@ done %{_libdir}/libcsparse64.so.%{csparse_version_major}* %endif %{_libdir}/libcxsparse64.so.%{cxsparse_version_major}* +%{_libdir}/libgraphblas64.so.%{graphblas_version_major}* +%{_libdir}/libklu_cholmod64.so.%{klu_cholmod_version_major}* %{_libdir}/libklu64.so.%{klu_version_major}* +%{_libdir}/liblagraph64.so.%{lagraph_version_major}* +%{_libdir}/liblagraphx64.so.%{lagraphx_version_major}* %{_libdir}/libldl64.so.%{ldl_version_major}* +%{_libdir}/libparu64.so.%{paru_version_major}* %{_libdir}/librbio64.so.%{rbio_version_major}* +%{_libdir}/libspex64.so.%{spex_version_major}* +%{_libdir}/libspexpython64.so.%{spex_version_major}* %{_libdir}/libspqr64.so.%{spqr_version_major}* %{_libdir}/libsuitesparseconfig64.so.%{SuiteSparse_config_major}* %{_libdir}/libumfpack64.so.%{umfpack_version_major}* %files -n %{name}64-devel +%{_includedir}/SuiteSparse64/ %{_libdir}/lib*64.so +%{_libdir}/SuiteSparse64 %files -n %{name}64-static %{_libdir}/lib*64.a %files -n %{name}64_ -%license SuiteSparse64_/Licenses +%license Licenses %{_libdir}/libamd64_.so.%{amd_version_major}* %{_libdir}/libbtf64_.so.%{btf_version_major}* %{_libdir}/libcamd64_.so.%{camd_version_major}* @@ -440,23 +441,37 @@ done %{_libdir}/libcsparse64_.so.%{csparse_version_major}* %endif %{_libdir}/libcxsparse64_.so.%{cxsparse_version_major}* +%{_libdir}/libgraphblas64_.so.%{graphblas_version_major}* +%{_libdir}/libklu_cholmod64_.so.%{klu_cholmod_version_major}* %{_libdir}/libklu64_.so.%{klu_version_major}* +%{_libdir}/liblagraph64_.so.%{lagraph_version_major}* +%{_libdir}/liblagraphx64_.so.%{lagraphx_version_major}* %{_libdir}/libldl64_.so.%{ldl_version_major}* +%{_libdir}/libparu64_.so.%{paru_version_major}* %{_libdir}/librbio64_.so.%{rbio_version_major}* +%{_libdir}/libspex64_.so.%{spex_version_major}* +%{_libdir}/libspexpython64_.so.%{spex_version_major}* %{_libdir}/libspqr64_.so.%{spqr_version_major}* %{_libdir}/libsuitesparseconfig64_.so.%{SuiteSparse_config_major}* %{_libdir}/libumfpack64_.so.%{umfpack_version_major}* %files -n %{name}64_-devel +%{_includedir}/SuiteSparse64_/ %{_libdir}/lib*64_.so +%{_libdir}/SuiteSparse64_ %files -n %{name}64_-static %{_libdir}/lib*64_.a +%endif %files doc -%doc SuiteSparse/Doc/* +%doc Doc/* %changelog +* Mon Dec 15 2025 Durga Jagadeesh Palli - 7.11.0-1 +- Upgrade to 7.11.0 +- License verified + * Mon Nov 28 2022 Muhammad Falak - 5.4.0-5 - License verified - Lint spec diff --git a/cgmanifest.json b/cgmanifest.json index 193fc5209d8..519a178d20a 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -28616,8 +28616,8 @@ "type": "other", "other": { "name": "suitesparse", - "version": "5.4.0", - "downloadUrl": "https://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-5.4.0.tar.gz" + "version": "7.11.0", + "downloadUrl": "https://github.com/DrTimothyAldenDavis/SuiteSparse/archive/v7.11.0/suitesparse-7.11.0.tar.gz" } } }, From 34e015c692674b4c1c2d54aa94b9150bc916ea71 Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Wed, 17 Dec 2025 06:10:59 +0000 Subject: [PATCH 2/9] add F42 to chngelog --- SPECS-EXTENDED/suitesparse/suitesparse.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index 53e1f46e735..505f147f4fc 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -469,7 +469,7 @@ done %changelog * Mon Dec 15 2025 Durga Jagadeesh Palli - 7.11.0-1 -- Upgrade to 7.11.0 +- Upgrade to 7.11.0 (Reference: Fedora 42) - License verified * Mon Nov 28 2022 Muhammad Falak - 5.4.0-5 From 38eb75bf8cea3a81c38a431078afd4f959c89f4e Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Fri, 19 Dec 2025 06:47:49 +0000 Subject: [PATCH 3/9] address the 55 License warnings in %doc section --- SPECS-EXTENDED/suitesparse/suitesparse.spec | 68 ++++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index 505f147f4fc..d50a9dacbf8 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -316,7 +316,71 @@ do done %files -%license Licenses +%license Licenses/AMD/Doc/License.txt +%license Licenses/BTF/Doc/License.txt +%license Licenses/CAMD/Doc/License.txt +%license Licenses/CCOLAMD/Doc/License.txt +%license Licenses/COLAMD/Doc/License.txt +%license Licenses/CSparse/Doc/License.txt +%license Licenses/CSparse/MATLAB/ssget/Doc/License.txt +%license Licenses/CXSparse/Doc/License.txt +%license Licenses/Example/License.txt +%license Licenses/GraphBLAS/CUDA/License.txt +%license Licenses/KLU/Doc/License.txt +%license Licenses/LDL/Doc/License.txt +%license Licenses/LICENSE.txt +%license Licenses/MATLAB_Tools/Doc/License.txt +%license Licenses/Mongoose/Doc/License.txt +%license Licenses/ParU/LICENSE.txt +%license Licenses/RBio/Doc/License.txt +%license Licenses/SPEX/LICENSE.txt + +# SPEX Backslash +%license Licenses/SPEX/SPEX_Backslash/CONTRIBUTOR-LICENSE.txt +%license Licenses/SPEX/SPEX_Backslash/GPLv2.txt +%license Licenses/SPEX/SPEX_Backslash/lesserv3.txt + +# SPEX Cholesky +%license Licenses/SPEX/SPEX_Cholesky/CONTRIBUTOR-LICENSE.txt +%license Licenses/SPEX/SPEX_Cholesky/GPLv2.txt +%license Licenses/SPEX/SPEX_Cholesky/lesserv3.txt + +# SPEX LU +%license Licenses/SPEX/SPEX_LU/CONTRIBUTOR-LICENSE.txt +%license Licenses/SPEX/SPEX_LU/GPLv2.txt +%license Licenses/SPEX/SPEX_LU/lesserv3.txt + +# SPEX Utilities +%license Licenses/SPEX/SPEX_Utilities/CONTRIBUTOR-LICENSE.txt +%license Licenses/SPEX/SPEX_Utilities/GPLv2.txt +%license Licenses/SPEX/SPEX_Utilities/lesserv3.txt + +# SPQR +%license Licenses/SPQR/Doc/License.txt +%license Licenses/SPQR/GPUQREngine/Doc/License.txt +%license Licenses/SPQR/GPURuntime/Doc/License.txt +%license Licenses/SPQR/Doc/gpl.txt +%license Licenses/SPQR/GPUQREngine/Doc/gpl.txt +%license Licenses/SPQR/GPURuntime/Doc/gpl.txt + +# CHOLMOD GPL files +%license Licenses/CHOLMOD/Demo/gpl.txt +%license Licenses/CHOLMOD/MATLAB/gpl.txt +%license Licenses/CHOLMOD/MatrixOps/gpl.txt +%license Licenses/CHOLMOD/Modify/gpl.txt +%license Licenses/CHOLMOD/Supernodal/gpl.txt +%license Licenses/CHOLMOD/Tcov/gpl.txt + +# RBio GPL +%license Licenses/RBio/Doc/gpl.txt + +# UMFPACK GPL +%license Licenses/UMFPACK/Doc/gpl.txt + +# Contributor PDFs +%license Licenses/Contributor_License/SuiteSparse_Individual_Contributor_License_Agreement_20241011.pdf +%license Licenses/GraphBLAS_Contributor_License/SuiteSparse_Individual_Contributor_License_Agreement_20241011.pdf + %{_libdir}/libamd.so.%{amd_version_major}* %{_libdir}/libbtf.so.%{btf_version_major}* %{_libdir}/libcamd.so.%{camd_version_major}* @@ -465,7 +529,7 @@ done %endif %files doc -%doc Doc/* +%doc Doc/ %changelog * Mon Dec 15 2025 Durga Jagadeesh Palli - 7.11.0-1 From b4a22a2074f41121f611342c53a5da6c8255c280 Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Fri, 19 Dec 2025 14:49:06 +0000 Subject: [PATCH 4/9] exclude license files from %doc and fix %prep find loop --- SPECS-EXTENDED/suitesparse/suitesparse.spec | 92 +++++---------------- 1 file changed, 19 insertions(+), 73 deletions(-) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index d50a9dacbf8..a0272261a45 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -254,13 +254,23 @@ pushd SuiteSparse-%{version} install -m0644 -D "$f" "../Licenses/$b/$x" done - find -type f -a \( -iname \*.pdf -o -iname ChangeLog -o -iname README\* -o -iname \*.txt \) | - while read f; do - b="${f%%/*}" - r="${f#$b}" - x="$(echo "$r" | sed 's|/doc/|/|gi')" - install -m0644 -D "$f" "../Doc/$b/$x" - done + # Copy documentation files but EXCLUDE License.txt, gpl.txt, GPLv2.txt, lesserv3.txt + find . -type f \( \ + -iname "*.pdf" -o \ + -iname "ChangeLog" -o \ + -iname "README*" -o \ + -iname "*.txt" \ + \) \ + ! -iname "License.txt" \ + ! -iname "gpl.txt" \ + ! -iname "GPLv2.txt" \ + ! -iname "lesserv3.txt" \ + | while read f; do + b="${f%%/*}" + r="${f#$b}" + x="$(echo "$r" | sed 's|/doc/|/|gi')" + install -m0644 -D "$f" "../Doc/$b/$x" + done popd %if 0%{?build64} cp -al SuiteSparse-%{version} SuiteSparse64-%{version} @@ -316,71 +326,7 @@ do done %files -%license Licenses/AMD/Doc/License.txt -%license Licenses/BTF/Doc/License.txt -%license Licenses/CAMD/Doc/License.txt -%license Licenses/CCOLAMD/Doc/License.txt -%license Licenses/COLAMD/Doc/License.txt -%license Licenses/CSparse/Doc/License.txt -%license Licenses/CSparse/MATLAB/ssget/Doc/License.txt -%license Licenses/CXSparse/Doc/License.txt -%license Licenses/Example/License.txt -%license Licenses/GraphBLAS/CUDA/License.txt -%license Licenses/KLU/Doc/License.txt -%license Licenses/LDL/Doc/License.txt -%license Licenses/LICENSE.txt -%license Licenses/MATLAB_Tools/Doc/License.txt -%license Licenses/Mongoose/Doc/License.txt -%license Licenses/ParU/LICENSE.txt -%license Licenses/RBio/Doc/License.txt -%license Licenses/SPEX/LICENSE.txt - -# SPEX Backslash -%license Licenses/SPEX/SPEX_Backslash/CONTRIBUTOR-LICENSE.txt -%license Licenses/SPEX/SPEX_Backslash/GPLv2.txt -%license Licenses/SPEX/SPEX_Backslash/lesserv3.txt - -# SPEX Cholesky -%license Licenses/SPEX/SPEX_Cholesky/CONTRIBUTOR-LICENSE.txt -%license Licenses/SPEX/SPEX_Cholesky/GPLv2.txt -%license Licenses/SPEX/SPEX_Cholesky/lesserv3.txt - -# SPEX LU -%license Licenses/SPEX/SPEX_LU/CONTRIBUTOR-LICENSE.txt -%license Licenses/SPEX/SPEX_LU/GPLv2.txt -%license Licenses/SPEX/SPEX_LU/lesserv3.txt - -# SPEX Utilities -%license Licenses/SPEX/SPEX_Utilities/CONTRIBUTOR-LICENSE.txt -%license Licenses/SPEX/SPEX_Utilities/GPLv2.txt -%license Licenses/SPEX/SPEX_Utilities/lesserv3.txt - -# SPQR -%license Licenses/SPQR/Doc/License.txt -%license Licenses/SPQR/GPUQREngine/Doc/License.txt -%license Licenses/SPQR/GPURuntime/Doc/License.txt -%license Licenses/SPQR/Doc/gpl.txt -%license Licenses/SPQR/GPUQREngine/Doc/gpl.txt -%license Licenses/SPQR/GPURuntime/Doc/gpl.txt - -# CHOLMOD GPL files -%license Licenses/CHOLMOD/Demo/gpl.txt -%license Licenses/CHOLMOD/MATLAB/gpl.txt -%license Licenses/CHOLMOD/MatrixOps/gpl.txt -%license Licenses/CHOLMOD/Modify/gpl.txt -%license Licenses/CHOLMOD/Supernodal/gpl.txt -%license Licenses/CHOLMOD/Tcov/gpl.txt - -# RBio GPL -%license Licenses/RBio/Doc/gpl.txt - -# UMFPACK GPL -%license Licenses/UMFPACK/Doc/gpl.txt - -# Contributor PDFs -%license Licenses/Contributor_License/SuiteSparse_Individual_Contributor_License_Agreement_20241011.pdf -%license Licenses/GraphBLAS_Contributor_License/SuiteSparse_Individual_Contributor_License_Agreement_20241011.pdf - +%license Licenses %{_libdir}/libamd.so.%{amd_version_major}* %{_libdir}/libbtf.so.%{btf_version_major}* %{_libdir}/libcamd.so.%{camd_version_major}* @@ -529,7 +475,7 @@ done %endif %files doc -%doc Doc/ +%doc Doc/* %changelog * Mon Dec 15 2025 Durga Jagadeesh Palli - 7.11.0-1 From 72a31efc3136cca40cb0f933f319a5803768bed7 Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Tue, 23 Dec 2025 06:38:26 +0000 Subject: [PATCH 5/9] address pdf license warning --- SPECS-EXTENDED/suitesparse/suitesparse.spec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index a0272261a45..3dd10433501 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -265,6 +265,8 @@ pushd SuiteSparse-%{version} ! -iname "gpl.txt" \ ! -iname "GPLv2.txt" \ ! -iname "lesserv3.txt" \ + ! -iname "SuiteSparse Individual Contributor License Agreement (20241011).pdf" + ! -iname "CONTRIBUTOR-LICENSE.txt" \ | while read f; do b="${f%%/*}" r="${f#$b}" From 899cfa70d8009a695d472a28a4748a5be079e038 Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Tue, 23 Dec 2025 10:44:00 +0000 Subject: [PATCH 6/9] address contribution-license warning --- SPECS-EXTENDED/suitesparse/suitesparse.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index 3dd10433501..237349238d3 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -265,8 +265,8 @@ pushd SuiteSparse-%{version} ! -iname "gpl.txt" \ ! -iname "GPLv2.txt" \ ! -iname "lesserv3.txt" \ - ! -iname "SuiteSparse Individual Contributor License Agreement (20241011).pdf" ! -iname "CONTRIBUTOR-LICENSE.txt" \ + ! -iname "SuiteSparse Individual Contributor License Agreement (20241011).pdf" \ | while read f; do b="${f%%/*}" r="${f#$b}" From b8538d723b0bd193b4e30086421025cf48d2c796 Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Thu, 25 Dec 2025 04:57:40 +0000 Subject: [PATCH 7/9] address libumfpack.so rpm build warnings --- SPECS-EXTENDED/suitesparse/suitesparse.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index 237349238d3..5da318a1fce 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -352,7 +352,6 @@ done %{_libdir}/libspqr.so.%{spqr_version_major}* %{_libdir}/libsuitesparseconfig.so.%{SuiteSparse_config_major}* %{_libdir}/libumfpack.so.%{umfpack_version_major}* -%{_libdir}/libumfpack.so.* %files devel %{_includedir}/%{name}/ From bacbf2a3b7705c6903e666870ab9ce5d8cbdd8e5 Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Mon, 5 Jan 2026 13:19:02 +0000 Subject: [PATCH 8/9] fix CONTRIBUTOR-LICENSE.txt warning --- SPECS-EXTENDED/suitesparse/suitesparse.spec | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index 5da318a1fce..e9a174483f3 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -246,7 +246,9 @@ pushd SuiteSparse-%{version} # collect docs and licenses in one place to ship find -iname lesser.txt -o -iname lesserv3.txt -o -iname license.txt -o \ - -iname gpl.txt -o -iname GPLv2.txt -o -iname license \ + -iname gpl.txt -o -iname GPLv2.txt -o -iname license -o \ + -iname "CONTRIBUTOR-LICENSE.txt" -o \ + -iname "SuiteSparse Individual Contributor License Agreement (20241011).pdf" \ -a -not -type d | while read f; do b="${f%%/*}" r="${f#$b}" From 13aa99878ae8059bca12677033ac51f6a45fd73a Mon Sep 17 00:00:00 2001 From: Durga Jagadeesh Palli Date: Mon, 5 Jan 2026 16:51:17 +0000 Subject: [PATCH 9/9] update prep section --- SPECS-EXTENDED/suitesparse/suitesparse.spec | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SPECS-EXTENDED/suitesparse/suitesparse.spec b/SPECS-EXTENDED/suitesparse/suitesparse.spec index e9a174483f3..3cd09a49578 100644 --- a/SPECS-EXTENDED/suitesparse/suitesparse.spec +++ b/SPECS-EXTENDED/suitesparse/suitesparse.spec @@ -246,9 +246,7 @@ pushd SuiteSparse-%{version} # collect docs and licenses in one place to ship find -iname lesser.txt -o -iname lesserv3.txt -o -iname license.txt -o \ - -iname gpl.txt -o -iname GPLv2.txt -o -iname license -o \ - -iname "CONTRIBUTOR-LICENSE.txt" -o \ - -iname "SuiteSparse Individual Contributor License Agreement (20241011).pdf" \ + -iname gpl.txt -o -iname GPLv2.txt -o -iname CONTRIBUTOR-LICENSE.txt -o -iname "SuiteSparse Individual Contributor License Agreement (20241011).pdf" -o -iname license \ -a -not -type d | while read f; do b="${f%%/*}" r="${f#$b}"