File dwarfs.spec of Package dwarfs

#
# spec file for package dwarfs (openSUSE Tumbleweed / OBS)
#

%global __builder ninja

# openSUSE shlib policy wants suffix 0_14_1 for SONAMEs like *.so.0.14.1
%global shlibsuffix 0_14_1

Name:           dwarfs
Version:        0.14.1
Release:        0
Summary:        Deduplicating compressed read-only file system
License:        GPL-3.0-or-later AND MIT
URL:            https://github.com/mhx/dwarfs
Source0:        %{name}-%{version}.tar.xz

BuildRequires:  bison
BuildRequires:  c++_compiler
BuildRequires:  cmake
BuildRequires:  flex
BuildRequires:  ninja
BuildRequires:  parallel-hashmap-devel
BuildRequires:  pkgconfig

# Boost bits (match Factory split devel packages)
BuildRequires:  libboost_chrono-devel
BuildRequires:  libboost_context-devel
BuildRequires:  libboost_filesystem-devel
BuildRequires:  libboost_iostreams-devel
BuildRequires:  libboost_process-devel
BuildRequires:  libboost_program_options-devel
BuildRequires:  libboost_regex-devel
BuildRequires:  libboost_thread-devel

# CMake/pkg-config deps
BuildRequires:  cmake(double-conversion)
BuildRequires:  cmake(range-v3)
BuildRequires:  cmake(utf8cpp)
BuildRequires:  pkgconfig(benchmark)
BuildRequires:  pkgconfig(flac++)
BuildRequires:  pkgconfig(fmt)
BuildRequires:  pkgconfig(fuse3)
BuildRequires:  pkgconfig(jemalloc)
BuildRequires:  pkgconfig(libacl)
BuildRequires:  pkgconfig(libarchive)
BuildRequires:  pkgconfig(libbrotlicommon)
BuildRequires:  pkgconfig(libdwarf)
BuildRequires:  pkgconfig(libelf)
BuildRequires:  pkgconfig(libevent)
BuildRequires:  pkgconfig(libglog)
BuildRequires:  pkgconfig(liblz4)
BuildRequires:  pkgconfig(liblzma)
BuildRequires:  pkgconfig(libmagic)
BuildRequires:  pkgconfig(libssl)
BuildRequires:  pkgconfig(libunwind)
BuildRequires:  pkgconfig(libxxhash)
BuildRequires:  pkgconfig(libzstd)
BuildRequires:  pkgconfig(nlohmann_json)

# tests
BuildRequires:  pkgconfig(gtest)
BuildRequires:  pkgconfig(gmock)

%description
The Deduplicating Warp-speed Advanced Read-only File System.

DwarFS is a deduplicating compressed read-only file system
particularly suited for very redundant data.
Compared to SquashFS, it is typically more efficient.

%package -n libdwarfs%{shlibsuffix}
Summary:        DwarFS shared libraries

%description -n libdwarfs%{shlibsuffix}
This package contains the DwarFS shared libraries.

%package devel
Summary:        DwarFS development files
Requires:       libdwarfs%{shlibsuffix} = %{version}

%description devel
This package contains the development files for DwarFS.

%ldconfig_scriptlets -n libdwarfs%{shlibsuffix}

%prep
%autosetup -p1 -n %{name}-%{version}

# Remove HowardHinnant/date usage (use C++20 chrono); safe no-op if already changed upstream
if [ -f src/util.cpp ]; then
  grep -q '<date/date.h>' src/util.cpp && \
    sed -i -e '/^[[:space:]]*#include[[:space:]]*<date\/date\.h>[[:space:]]*$/d' src/util.cpp || :
  grep -q 'date::from_stream' src/util.cpp && \
    sed -i -e 's/\bdate::from_stream\b/std::chrono::from_stream/g' src/util.cpp || :
fi

# If bundled folly lists Boost "system" component, drop it (safe if absent)
if [ -f folly/CMake/folly-deps.cmake ]; then
  sed -i -e '/^[[:space:]]*system[[:space:]]*$/d' folly/CMake/folly-deps.cmake || :
fi
if [ -f folly/CMake/folly-config.cmake.in ]; then
  sed -i -e 's/[[:space:]]Boost::system//g' -e 's/Boost::system[[:space:]]//g' folly/CMake/folly-config.cmake.in || :
fi

%build
%cmake \
  -DCMAKE_CXX_STANDARD=20 \
  -DCMAKE_EXE_LINKER_FLAGS:STRING="%{build_ldflags} -lboost_filesystem -lboost_process" \
  -DWITH_TESTS=ON \
  -DPREFER_SYSTEM_GTEST=ON
%cmake_build

%install
%cmake_install

# Keep dwarfs in _bindir, provide mount helper in _sbindir
if [ -f "%{buildroot}%{_sbindir}/dwarfs" ]; then
  mv "%{buildroot}%{_sbindir}/dwarfs" "%{buildroot}%{_bindir}/dwarfs"
fi
install -d "%{buildroot}%{_sbindir}"
ln -sf "%{_bindir}/dwarfs" "%{buildroot}%{_sbindir}/mount.dwarfs"

# Remove invalid desktop file before generating extra file list
rm -f "%{buildroot}%{_datadir}/applications/dwarfs-mount-handler.desktop"

# Collect optional integration files without using find -printf
extra=%{name}.extra.files
: > "$extra"
for d in \
  %{_datadir}/applications \
  %{_datadir}/mime/packages \
  %{_datadir}/bash-completion/completions \
  %{_datadir}/zsh/site-functions \
  %{_datadir}/fish/vendor_completions.d \
  %{_datadir}/icons \
  %{_datadir}/metainfo \
; do
  if [ -d "%{buildroot}$d" ]; then
    find "%{buildroot}$d" -type f -print | sed "s|^%{buildroot}||" >> "$extra"
  fi
done
LC_ALL=C sort -u -o "$extra" "$extra"

%check
%ctest

%files -f %{name}.extra.files
%license LICENSE
%doc README.md
%{_mandir}/*/*dwarfs*
%{_bindir}/*dwarfs*
%{_sbindir}/mount.dwarfs

%files -n libdwarfs%{shlibsuffix}
%{_libdir}/libdwarfs*.so.*

%files devel
%{_includedir}/dwarfs
%{_libdir}/cmake/dwarfs
%{_libdir}/libdwarfs*.so

%changelog
openSUSE Build Service is sponsored by