diff --git a/.gitignore b/.gitignore index 80b3eba..dd0cfcc 100644 --- a/.gitignore +++ b/.gitignore @@ -31,9 +31,3 @@ /testsuite-12.0.0.tar.gz /dyninst-12.1.0.tar.gz /testsuite-12.1.0.tar.gz -/dyninst-12.2.0.tar.gz -/testsuite-12.2.0.tar.gz -/dyninst-12.3.0.tar.gz -/testsuite-12.3.0.tar.gz -/dyninst-13.snap.20250123.g80e1adaf.tar.gz -/dyninst-13.0.0.tar.gz diff --git a/cmdline.patch b/cmdline.patch new file mode 100644 index 0000000..5286c2a --- /dev/null +++ b/cmdline.patch @@ -0,0 +1,12 @@ +# c++/12/bits/basic_string.h in libstdc++-devel-12.1.1-3 no longer includes +# atomicity.h includes gthr -> gthr-default -> pthread .h -> time.h -> struct-tm.h +# so explicitly include time.h + +--- testsuite-12.1.0/src/CmdLine.C ++++ testsuite-12.1.0/src/CmdLine.C +@@ -38,5 +38,3 @@ + +-#if defined(os_windows_test) + #include +-#endif + diff --git a/dwarf-error.patch b/dwarf-error.patch new file mode 100644 index 0000000..9efff30 --- /dev/null +++ b/dwarf-error.patch @@ -0,0 +1,11 @@ +Remove extraneous error messages of the form: + err message: .debug_loclists section missing + err message: invalid DWARF +which are repeated in some circumstances without adding useful context + +--- dyninst-12.1.0/symtabAPI/src/dwarfWalker.C ++++ dyninst-12.1.0/symtabAPI/src/dwarfWalker.C +@@ -1858,1 +1858,1 @@ +- cerr << "err message: " << dwarf_errmsg(dwarf_errno()) << endl; ++ dwarf_printf("(0x%lx) Error while decoding location: %s\n", id(), dwarf_errmsg(dwarf_errno())); + diff --git a/dyninst.spec b/dyninst.spec index 833197a..6502f06 100644 --- a/dyninst.spec +++ b/dyninst.spec @@ -1,19 +1,21 @@ Summary: An API for Run-time Code Generation -License: LGPL-2.1-or-later AND GPL-3.0-or-later WITH Bison-exception-2.2 AND LicenseRef-Fedora-Public-Domain AND BSD-3-Clause +License: LGPLv2+ Name: dyninst Group: Development/Libraries -Release: 8%{?dist} -URL: https://www.paradyn.org -Version: 13.0.0 -ExclusiveArch: x86_64 ppc64le aarch64 +Release: 4%{?dist} +URL: http://www.dyninst.org +Version: 12.1.0 +ExclusiveArch: %{ix86} x86_64 ppc64le aarch64 -Source0: dyninst-13.0.0.tar.gz -Patch1: github-pr1721.patch -Patch2: github-pr1880.patch -Patch3: github-pr1880-ish.patch -Patch4: github-pr1730.patch +%define __testsuite_version 12.1.0 +Source0: https://github.com/dyninst/dyninst/archive/v%{version}/dyninst-%{version}.tar.gz +Source1: https://github.com/dyninst/testsuite/archive/%{__testsuite_version}/testsuite-%{__testsuite_version}.tar.gz + +Patch1: dwarf-error.patch +Patch2: cmdline.patch %global dyninst_base dyninst-%{version} +%global testsuite_base testsuite-%{__testsuite_version} BuildRequires: gcc-c++ BuildRequires: elfutils-devel @@ -25,11 +27,17 @@ BuildRequires: cmake BuildRequires: libtirpc-devel BuildRequires: tbb tbb-devel BuildRequires: tex-latex + +# Extra requires just for the testsuite +BuildRequires: gcc-gfortran libxml2-devel BuildRequires: make -# https://fedoraproject.org/wiki/Changes/Linker_Error_On_Security_Issues -# may impact the RT library -%undefine _hardened_linker_errors +# Testsuite files should not provide/require anything +%{?filter_setup: +%filter_provides_in %{_libdir}/dyninst/testsuite/ +%filter_requires_in %{_libdir}/dyninst/testsuite/ +%filter_setup +} %description @@ -46,7 +54,6 @@ Summary: Documentation for using the Dyninst API Group: Documentation %description doc dyninst-doc contains API documentation for the Dyninst libraries. -License: LGPL-2.1-or-later %package devel Summary: Header files for compiling programs with Dyninst @@ -54,29 +61,37 @@ Group: Development/System Requires: dyninst = %{version}-%{release} Requires: boost-devel Requires: tbb-devel -License: LGPL-2.1-or-later AND BSD-3-Clause AND MIT -# FindTBB.cmake: presumed MIT, removed in next version of dyninst %description devel dyninst-devel includes the C header files that specify the Dyninst user-space libraries and interfaces. This is required for rebuilding any program that uses Dyninst. +%package testsuite +Summary: Programs for testing Dyninst +Group: Development/System +Requires: dyninst = %{version}-%{release} +Requires: dyninst-devel = %{version}-%{release} +%description testsuite +dyninst-testsuite includes the test harness and target programs for +making sure that dyninst works properly. + %prep %setup -q -n %{name}-%{version} -c -# %setup -q -T -D -a 1 +%setup -q -T -D -a 1 pushd %{dyninst_base} -%patch -P1 -p1 -%patch -P2 -p1 -%patch -P3 -p1 -%patch -P4 -p1 +%patch1 -p1 -b .dwerr +popd + +pushd %{testsuite_base} +%patch2 -p1 -b .cmdline popd # cotire seems to cause non-deterministic gcc errors # https://bugzilla.redhat.com/show_bug.cgi?id=1420551 -# sed -i.cotire -e 's/USE_COTIRE true/USE_COTIRE false/' \ -# %{dyninst_base}/cmake/shared.cmake +sed -i.cotire -e 's/USE_COTIRE true/USE_COTIRE false/' \ + %{dyninst_base}/cmake/shared.cmake %build @@ -91,31 +106,54 @@ LDFLAGS="$LDFLAGS $RPM_LD_FLAGS" CXXFLAGS="$CFLAGS" export CFLAGS CXXFLAGS LDFLAGS -%cmake --log-level=DEBUG \ +%cmake \ -DENABLE_DEBUGINFOD=1 \ + -DINSTALL_LIB_DIR:PATH=%{_libdir}/dyninst \ + -DINSTALL_INCLUDE_DIR:PATH=%{_includedir}/dyninst \ + -DINSTALL_CMAKE_DIR:PATH=%{_libdir}/cmake/Dyninst \ -DCMAKE_BUILD_TYPE=None \ - -DCMAKE_SKIP_RPATH:BOOL=YES \ - -DINSTALL_CMAKE_DIR:PATH=/usr/lib64/cmake/Dyninst \ - -DCMAKE_INSTALL_PREFIX:PATH=/usr \ - -DCMAKE_INSTALL_INCLUDEDIR:PATH=/usr/include/dyninst \ - -DCMAKE_INSTALL_LIBDIR:PATH=/usr/lib64/dyninst -%cmake_build -v -v -v + -DCMAKE_SKIP_RPATH:BOOL=YES +%cmake_build + +# Hack to install dyninst nearby, so the testsuite can use it +DESTDIR="../install" %__cmake --install "%{__cmake_builddir}" +find ../install -name '*.cmake' -execdir \ + sed -i -e "s!%{_prefix}!$PWD/../install&!" '{}' '+' +# cmake mistakenly looks for libtbb.so in the dyninst install dir +sed -i '/libtbb.so/ s/".*usr/"\/usr/' $PWD/../install%{_libdir}/cmake/Dyninst/commonTargets.cmake + +cd ../%{testsuite_base} +# testsuite build sometimes encounters dependency issues with -jN +%define _smp_mflags -j1 +%cmake \ + -DDyninst_DIR:PATH=$PWD/../install%{_libdir}/cmake/Dyninst \ + -DINSTALL_DIR:PATH=%{_libdir}/dyninst/testsuite \ + -DCMAKE_BUILD_TYPE:STRING=Debug \ + -DCMAKE_SKIP_RPATH:BOOL=YES +%cmake_build %install cd %{dyninst_base} -%cmake_install -v -v -v +%cmake_install -# move /usr/lib64//dyninst/cmake/Dyninst to /usr/lib64/cmake/Dyninst -mkdir -p %{buildroot}/%{_libdir}/cmake -mv %{buildroot}/%{_libdir}/dyninst/cmake/Dyninst %{buildroot}/%{_libdir}/cmake/Dyninst +# It doesn't install docs the way we want, so remove them. +# We'll just grab the pdfs later, directly from the build dir. +rm -v %{buildroot}%{_docdir}/*-%{version}.pdf -# this is a testsuite-like binary, not needed in main package -rm -f "%{buildroot}%{_bindir}/parseThat" +cd ../%{testsuite_base} +%cmake_install mkdir -p %{buildroot}/etc/ld.so.conf.d echo "%{_libdir}/dyninst" > %{buildroot}/etc/ld.so.conf.d/%{name}-%{_arch}.conf +# Ugly hack to mask testsuite files from debuginfo extraction. Running the +# testsuite requires debuginfo, so extraction is useless. However, debuginfo +# extraction is still nice for the main libraries, so we don't want to disable +# it package-wide. The permissions are restored by attr(755,-,-) in files. +find %{buildroot}%{_libdir}/dyninst/testsuite/ \ + -type f '!' -name '*.a' -execdir chmod 644 '{}' '+' + %post -p /sbin/ldconfig %postun -p /sbin/ldconfig @@ -147,65 +185,13 @@ echo "%{_libdir}/dyninst" > %{buildroot}/etc/ld.so.conf.d/%{name}-%{_arch}.conf %{_libdir}/dyninst/*.so %{_libdir}/cmake/Dyninst +%files testsuite +%{_bindir}/parseThat +%dir %{_libdir}/dyninst/testsuite/ +%attr(755,root,root) %{_libdir}/dyninst/testsuite/*[!a] +%attr(644,root,root) %{_libdir}/dyninst/testsuite/*.a + %changelog -* Mon Jan 12 2026 Jonathan Wakely - 13.0.0-8 -- Rebuilt for Boost 1.90 - -* Wed Aug 20 2025 Jerry James - 13.0.0-7 -- Rebuild for tbb 2022.2.0 - -* Wed Jul 23 2025 Fedora Release Engineering - 13.0.0-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Thu Feb 06 2025 Frank Ch. Eigler - 13.0.0-5 -- Backported github PR/1370 for constructor ordering. - -* Thu Jan 23 2025 Frank Ch. Eigler - 13.0.0-4 -- Rebuilt for F42 FTBFS with 13.0.0 + backported fixes + sans i686 - -* Thu Jan 16 2025 Fedora Release Engineering - 12.3.0-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Wed Jul 17 2024 Fedora Release Engineering - 12.3.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Wed Jan 24 2024 Fedora Release Engineering - 12.3.0-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Fri Jan 19 2024 Fedora Release Engineering - 12.3.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Wed Jan 17 2024 Jonathan Wakely - 12.3.0-4 -- Rebuilt for Boost 1.83 - -* Wed Jul 19 2023 Fedora Release Engineering - 12.3.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Tue Jul 11 2023 Frank Ch. Eigler - 12.3.0-2 -- side-tag respin - -* Tue Jul 04 2023 Frank Ch. Eigler - 12.3.0-1 -- migrated to SPDX license - -* Tue Jul 04 2023 Orion Poplawski - 12.3.0-1 -- Update to 12.3.0 -- Add patch for cmake 3.27 support - -* Tue Jun 27 2023 Jonathan Wakely - 12.2.0-5 -- Patch for oneTBB (#2036372) - -* Thu Feb 23 2023 Frank Ch. Eigler - 12.2.0-4 -- rhbz2173030: ftbfs with gcc 13 - -* Mon Feb 20 2023 Jonathan Wakely - 12.2.0-3 -- Rebuilt for Boost 1.81 - -* Thu Jan 19 2023 Fedora Release Engineering - 12.2.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Tue Oct 4 2022 William Cohen - 12.2.0-1 -- Update to 12.2.0 - * Wed Aug 03 2022 Stan Cox - 12.1.0-4 - Explicitly include time.h as no longer pulls it in diff --git a/github-pr1721.patch b/github-pr1721.patch deleted file mode 100644 index 3fde0c9..0000000 --- a/github-pr1721.patch +++ /dev/null @@ -1,55 +0,0 @@ -commit e70b1001eb5082bb0204b602e3ca1cfccd67fc94 -gpg: Signature made Tue 09 Apr 2024 11:21:17 AM EDT -gpg: using RSA key B5690EEEBB952194 -gpg: Can't check signature: No public key -Author: kupsch -Date: Tue Apr 9 10:21:17 2024 -0500 - - improve cmake install dirs (#1721) - - * Use cmake's GNUInstallDirs to get the lib, bin and include directory - names instead of always using 'lib', 'bin', and 'include'. This - results in two changes to the installation: - - - lib directory becomes 'lib64' on platforms where this is the - convention - - - the lib, bin and include may be overwritten using the cmake - variables CMAKE_INSTALL_BINDIR, CMAKE_INSTALL_LIBDIR and - CMAKE_INSTALL_INCLUDEDIR respectively - - * Update github workflows to handle the lib install dir lib64: - - - use Dyninst_ROOT instead of Dyninst_DIR as it searches for the - directory used - - - for non-cmake uses search for lib* to find either lib or lib64 - -diff --git a/cmake/DyninstLibrarySettings.cmake b/cmake/DyninstLibrarySettings.cmake -index d3627f8789f2..e8cb26b95c39 100644 ---- a/cmake/DyninstLibrarySettings.cmake -+++ b/cmake/DyninstLibrarySettings.cmake -@@ -25,9 +25,10 @@ else() - set(CMAKE_VISIBILITY_INLINES_HIDDEN ON) - endif() - --set(DYNINST_INSTALL_BINDIR "bin") --set(DYNINST_INSTALL_LIBDIR "lib") --set(DYNINST_INSTALL_INCLUDEDIR "include") -+include(GNUInstallDirs) -+set(DYNINST_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}") -+set(DYNINST_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}") -+set(DYNINST_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}") - set(DYNINST_INSTALL_CMAKEDIR "${DYNINST_INSTALL_LIBDIR}/cmake/Dyninst") - - # -- Set up the RPATH --- -diff --git a/parseThat/CMakeLists.txt b/parseThat/CMakeLists.txt -index ffe4b7aea29c..d4697a8a1d99 100644 ---- a/parseThat/CMakeLists.txt -+++ b/parseThat/CMakeLists.txt -@@ -29,4 +29,4 @@ target_link_libraries(parseThat PRIVATE dyninstAPI) - target_include_directories(parseThat BEFORE - PRIVATE "$") - --install(TARGETS parseThat RUNTIME DESTINATION bin) -+install(TARGETS parseThat RUNTIME DESTINATION "${DYNINST_INSTALL_BINDIR}") diff --git a/github-pr1730.patch b/github-pr1730.patch deleted file mode 100644 index 72c667e..0000000 --- a/github-pr1730.patch +++ /dev/null @@ -1,151 +0,0 @@ -commit eae798d4e5f938cb85758571dbab9afbbea7b5d2 (HEAD -> v13.0.0) -Author: Frank Ch. Eigler -Date: Thu Feb 6 08:35:33 2025 -0500 - - MachRegister: fix initialization order bug (#1731) - - Backported upstream commit to 13.0.0 base. - - commit a29f32ac87c4483b97a2c5cb9beed5642124ae8f - Author: Tim Haines - Date: Mon Apr 22 15:32:12 2024 -0500 - - MachRegister: fix initialization order bug (#1731) - - This fixes the static initialization ordering issue reported in https://github.com/dyninst/dyninst/issues/1730. - -diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt -index 669659e44c76..b6507772858c 100644 ---- a/common/CMakeLists.txt -+++ b/common/CMakeLists.txt -@@ -39,7 +39,6 @@ set(_public_headers - h/registers/AMDGPU/amdgpu_gfx90a_regs.h - h/registers/AMDGPU/amdgpu_gfx940_regs.h - h/registers/cuda_regs.h -- h/registers/MachRegister.h - h/registers/ppc32_regs.h - h/registers/ppc64_regs.h - h/registers/reg_def.h -@@ -72,12 +71,12 @@ set(_private_headers - src/lprintf.h - src/lru_cache.h - src/MappedFile.h -+ src/registers/MachRegisterCache.h - src/NodeIterator.h - src/ntHeaders.h - src/parseauxv.h - src/pathName.h - src/pool_allocators.h -- src/registers/MachRegister.C - src/sha1.h - src/singleton_object_pool.h - src/stats.h -@@ -111,6 +110,7 @@ set(_sources - src/debug_common.C - src/VariableLocation.C - src/Buffer.C -+ src/registers/MachRegister.C - src/MachSyscall.C) - - if(DYNINST_OS_UNIX) -diff --git a/common/src/dyn_regs.C b/common/src/dyn_regs.C -index 3fcd194a71dd..7951dbe753bc 100644 ---- a/common/src/dyn_regs.C -+++ b/common/src/dyn_regs.C -@@ -28,8 +28,16 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -+#include "registers/MachRegisterCache.h" -+ -+namespace Dyninst { namespace registers { -+ // These are used in MachRegister.C -+ name_cache names; -+}} -+ - //clang-format: off - #define DYN_DEFINE_REGS - #include "dyn_regs.h" - #undef DYN_DEFINE_REGS - //clang-format: on -+ -diff --git a/common/src/registers/MachRegister.C b/common/src/registers/MachRegister.C -index ccd01abc1811..93c020c04415 100644 ---- a/common/src/registers/MachRegister.C -+++ b/common/src/registers/MachRegister.C -@@ -1,4 +1,5 @@ - #include "common/h/registers/MachRegister.h" -+#include "registers/MachRegisterCache.h" - #include "debug_common.h" - #include "dyn_regs.h" - #include "external/rose/amdgpuInstructionEnum.h" -@@ -10,17 +11,24 @@ - #include - - namespace { -- std::unordered_map names; - const std::string invalid_reg_name{""}; - } - -+namespace Dyninst { namespace registers { -+ // These are defined in dyn_regs.C to ensure global constructor initialization ordering -+ extern name_cache names; -+ } -+} -+ -+ - namespace Dyninst { - - MachRegister::MachRegister() : reg(0) {} - - MachRegister::MachRegister(signed int r) : reg(r) {} - -- MachRegister::MachRegister(signed int r, std::string n) : reg(r) { names.emplace(r, std::move(n)); } -+ MachRegister::MachRegister(signed int r, std::string n) : reg(r) { -+ registers::names.emplace(r, std::move(n)); } - - unsigned int MachRegister::regClass() const { return reg & 0x00ff0000; } - -@@ -106,8 +114,8 @@ namespace Dyninst { - bool MachRegister::isValid() const { return (reg != InvalidReg.reg); } - - std::string const& MachRegister::name() const { -- auto iter = names.find(reg); -- if(iter != names.end()) { -+ auto iter = registers::names.find(reg); -+ if(iter != registers::names.end()) { - return iter->second; - } - common_parsing_printf("No MachRegister found with value %x\n", static_cast(reg)); -diff --git a/common/src/dyn_regs.C b/common/src/registers/MachRegisterCache.h -similarity index 80% -copy from common/src/dyn_regs.C -copy to common/src/registers/MachRegisterCache.h -index 3fcd194a71dd..2a74bbde821a 100644 ---- a/common/src/dyn_regs.C -+++ b/common/src/registers/MachRegisterCache.h -@@ -28,8 +28,19 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - --//clang-format: off --#define DYN_DEFINE_REGS --#include "dyn_regs.h" --#undef DYN_DEFINE_REGS --//clang-format: on -+#ifndef DYNINST_COMMON_REGISTERS_MACHREGISTERCACHE_H -+#define DYNINST_COMMON_REGISTERS_MACHREGISTERCACHE_H -+ -+#include "registers/MachRegister.h" -+ -+#include -+#include -+#include -+#include -+ -+namespace Dyninst { namespace registers { -+ typedef std::unordered_map name_cache; -+}} -+ -+ -+#endif diff --git a/github-pr1880-ish.patch b/github-pr1880-ish.patch deleted file mode 100644 index 77e763f..0000000 --- a/github-pr1880-ish.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff --git a/common/h/Annotatable.h b/common/h/Annotatable.h -index 6588e3dd36da..262a193ffbb8 100644 ---- a/common/h/Annotatable.h -+++ b/common/h/Annotatable.h -@@ -44,6 +44,7 @@ - #include - #include - #include -+#include - #include "util.h" - #include "compiler_annotations.h" - -diff --git a/instructionAPI/h/ArchSpecificFormatters.h b/instructionAPI/h/ArchSpecificFormatters.h -index b32d4cc14e03..145c604f9619 100644 ---- a/instructionAPI/h/ArchSpecificFormatters.h -+++ b/instructionAPI/h/ArchSpecificFormatters.h -@@ -34,6 +34,7 @@ - #include - #include - #include -+#include - #include "Architecture.h" - #include "registers/MachRegister.h" - -diff --git a/common/src/arch-x86.h b/common/src/arch-x86.h -index ecdc3dc13..7745306d3 100644 ---- a/common/src/arch-x86.h -+++ b/common/src/arch-x86.h -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - #include "entryIDs.h" - #include "registers/MachRegister.h" - #include "common/src/ia32_locations.h" diff --git a/github-pr1880.patch b/github-pr1880.patch deleted file mode 100644 index c8f8795..0000000 --- a/github-pr1880.patch +++ /dev/null @@ -1,23 +0,0 @@ -commit 165402aa1640afb394b11a096b38c6bc3a5bf9d0 (github-fche/patch-1) -gpg: Signature made Wed 22 Jan 2025 03:35:55 PM EST -gpg: using RSA key B5690EEEBB952194 -gpg: Can't check signature: No public key -Author: Frank Ch. Eigler -Date: Wed Jan 22 15:35:55 2025 -0500 - - Update sha1.C: #include - - Subject header is needed on gcc15 to compile sha1.C, supplying declaration of types like uint32_t. - -diff --git a/common/src/sha1.C b/common/src/sha1.C -index 91e9ad291561..d6e76c5727ac 100644 ---- a/common/src/sha1.C -+++ b/common/src/sha1.C -@@ -102,6 +102,7 @@ A million repetitions of "a" - - #include - #include -+#include - - #include "dyntypes.h" - #include "common/src/sha1.h" diff --git a/plans/ci.fmf b/plans/ci.fmf index 3fd3ab7..1ad2c12 100644 --- a/plans/ci.fmf +++ b/plans/ci.fmf @@ -1,5 +1,6 @@ summary: CI Gating Plan discover: how: fmf + directory: tests execute: - how: tmt + how: beakerlib diff --git a/sources b/sources index 5cadd84..bc3a810 100644 --- a/sources +++ b/sources @@ -1 +1,2 @@ -SHA512 (dyninst-13.0.0.tar.gz) = efa09018c411f6138e6e2cf6510007b29b00ed9e0d643df702303ee0ccb39b1ea1640bba18555f4cb0a7dbab677362c88ffe0eccace62b57860daee9350a4eee +SHA512 (dyninst-12.1.0.tar.gz) = ec09b83f288afefd6a30a3253c91554d421305a43c2f2384435207dcabf523d5498d64873f876817c3108c3fc0a43fd4c48ce2c1ca873c73fb98a2d823446549 +SHA512 (testsuite-12.1.0.tar.gz) = 884a33c5b912249166acc0c52bd0ab02b578dcea2a24fbfa2abc7887b6a9c4f3a113934b96079653d60d9dba34c8870eff7d08388c906111a024ec92e629798a