
# rpmbuild options:
#   --with | --without ndctl
#   --define _testconfig <path to custom testconfig.sh>
#   --define _skip_check 1

# do not terminate build if files in the $RPM_BUILD_ROOT
# directory are not found in the %files
%define _unpackaged_files_terminate_build 0

# disable 'make check' on suse
%if %{defined suse_version}
	%define _skip_check 1
	%define dist .suse%{suse_version}
%endif

%bcond_without ndctl

%define min_ndctl_ver __NDCTL_MIN_VER__

Name:		pmdk
Version:	__VERSION__
Release:	1%{?dist}
Summary:	__PACKAGE_SUMMARY__
Packager:	__PACKAGE_MAINTAINER__
Group:		__GROUP_SYS_LIBS__
License:	__LICENSE__
URL:		https://pmem.io/pmdk

Source0:	%{name}-%{version}.tar.gz

BuildRequires:	gcc
BuildRequires:	make
BuildRequires:	glibc-devel
BuildRequires:	autoconf
BuildRequires:	automake
BuildRequires:	man
BuildRequires:	pkgconfig
BuildRequires:	gdb

# fdupes package is available only on 'openSUSE Tumbleweed' and 'openSUSE Leap 15.1'
%if (0%{?suse_version} > 1500) || (0%{?sles_version} >= 150100 && 0%{?is_opensuse})
BuildRequires: fdupes
%endif

%if %{with ndctl}
%if %{defined suse_version}
BuildRequires:	libndctl-devel >= %{min_ndctl_ver}
%else
BuildRequires:	ndctl-devel >= %{min_ndctl_ver}
BuildRequires:	daxctl-devel >= %{min_ndctl_ver}
%endif
%endif


# Debug variants of the libraries should be filtered out of the provides.
%global __provides_exclude_from ^%{_libdir}/pmdk_debug/.*\\.so.*$

# By design, PMDK does not support any 32-bit architecture.
# Due to dependency on xmmintrin.h and some inline assembly, it can be
# compiled only for x86_64 at the moment.
# Other 64-bit architectures could also be supported, if only there is
# a request for that, and if somebody provides the arch-specific
# implementation of the low-level routines for flushing to persistent
# memory.

# https://bugzilla.redhat.com/show_bug.cgi?id=1340634
# https://bugzilla.redhat.com/show_bug.cgi?id=1340635
# https://bugzilla.redhat.com/show_bug.cgi?id=1340636
# https://bugzilla.redhat.com/show_bug.cgi?id=1340637

ExclusiveArch: x86_64 ppc64le

%description
The Persistent Memory Development Kit is a collection of libraries for
using memory-mapped persistence, optimized specifically for persistent memory.


%package -n libpmem2__PKG_NAME_SUFFIX__
Summary: Low-level persistent memory support library
Group: __GROUP_SYS_LIBS__
%description -n libpmem2__PKG_NAME_SUFFIX__
The libpmem2 provides low level persistent memory support. In particular,
support for the persistent memory instructions for flushing changes
to pmem is provided.

%files -n libpmem2__PKG_NAME_SUFFIX__
%defattr(-,root,root,-)
%dir %{_datadir}/pmdk
%{_libdir}/libpmem2.so.*
%{_datadir}/pmdk/pmdk.magic
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmem2-devel
Summary: Development files for the low-level persistent memory library
Group: __GROUP_DEV_LIBS__
Requires: libpmem2__PKG_NAME_SUFFIX__ = %{version}-%{release}
%description -n libpmem2-devel
The libpmem2 provides low level persistent memory support. In particular,
support for the persistent memory instructions for flushing changes
to pmem is provided.

This library is provided for software which tracks every store to
pmem and needs to flush those changes to durability. Most developers
will find higher level libraries like libpmemobj to be much more
convenient.

%files -n libpmem2-devel
%defattr(-,root,root,-)
%{_libdir}/libpmem2.so
%{_libdir}/pkgconfig/libpmem2.pc
%{_includedir}/libpmem2.h
%{_includedir}/libpmem2/*.h
%{_mandir}/man7/libpmem2.7.gz
%{_mandir}/man3/pmem2_*.3.gz
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmem2-debug
Summary: Debug variant of the low-level persistent memory library
Group: __GROUP_DEV_LIBS__
Requires: libpmem2__PKG_NAME_SUFFIX__ = %{version}-%{release}
%description -n libpmem2-debug
The libpmem provides low level persistent memory support. In particular,
support for the persistent memory instructions for flushing changes
to pmem is provided.

This sub-package contains debug variant of the library, providing
run-time assertions and trace points. The typical way to access the
debug version is to set the environment variable LD_LIBRARY_PATH to
/usr/lib64/pmdk_debug.

%files -n libpmem2-debug
%defattr(-,root,root,-)
%dir %{_libdir}/pmdk_debug
%{_libdir}/pmdk_debug/libpmem2.so
%{_libdir}/pmdk_debug/libpmem2.so.*
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmem__PKG_NAME_SUFFIX__
Summary: Low-level persistent memory support library
Group: __GROUP_SYS_LIBS__
%description -n libpmem__PKG_NAME_SUFFIX__
The libpmem provides low level persistent memory support. In particular,
support for the persistent memory instructions for flushing changes
to pmem is provided.

%files -n libpmem__PKG_NAME_SUFFIX__
%defattr(-,root,root,-)
%dir %{_datadir}/pmdk
%{_libdir}/libpmem.so.*
%{_datadir}/pmdk/pmdk.magic
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmem-devel
Summary: Development files for the low-level persistent memory library
Group: __GROUP_DEV_LIBS__
Requires: libpmem__PKG_NAME_SUFFIX__ = %{version}-%{release}
%description -n libpmem-devel
The libpmem provides low level persistent memory support. In particular,
support for the persistent memory instructions for flushing changes
to pmem is provided.

This library is provided for software which tracks every store to
pmem and needs to flush those changes to durability. Most developers
will find higher level libraries like libpmemobj to be much more
convenient.

%files -n libpmem-devel
%defattr(-,root,root,-)
%{_libdir}/libpmem.so
%{_libdir}/pkgconfig/libpmem.pc
%{_includedir}/libpmem.h
%{_mandir}/man7/libpmem.7.gz
%{_mandir}/man3/pmem_*.3.gz
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmem-debug
Summary: Debug variant of the low-level persistent memory library
Group: __GROUP_DEV_LIBS__
Requires: libpmem__PKG_NAME_SUFFIX__ = %{version}-%{release}
%description -n libpmem-debug
The libpmem provides low level persistent memory support. In particular,
support for the persistent memory instructions for flushing changes
to pmem is provided.

This sub-package contains debug variant of the library, providing
run-time assertions and trace points. The typical way to access the
debug version is to set the environment variable LD_LIBRARY_PATH to
/usr/lib64/pmdk_debug.

%files -n libpmem-debug
%defattr(-,root,root,-)
%dir %{_libdir}/pmdk_debug
%{_libdir}/pmdk_debug/libpmem.so
%{_libdir}/pmdk_debug/libpmem.so.*
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md



%package -n libpmemobj__PKG_NAME_SUFFIX__
Summary: Persistent Memory Transactional Object Store library
Group: __GROUP_SYS_LIBS__
Requires: libpmem__PKG_NAME_SUFFIX__ >= %{version}-%{release}
%description -n libpmemobj__PKG_NAME_SUFFIX__
The libpmemobj library provides a transactional object store,
providing memory allocation, transactions, and general facilities for
persistent memory programming.

%files -n libpmemobj__PKG_NAME_SUFFIX__
%defattr(-,root,root,-)
%{_libdir}/libpmemobj.so.*
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmemobj-devel
Summary: Development files for the Persistent Memory Transactional Object Store library
Group: __GROUP_DEV_LIBS__
Requires: libpmemobj__PKG_NAME_SUFFIX__ = %{version}-%{release}
Requires: libpmem-devel = %{version}-%{release}
%description -n libpmemobj-devel
The libpmemobj library provides a transactional object store,
providing memory allocation, transactions, and general facilities for
persistent memory programming. Developers new to persistent memory
probably want to start with this library.

%files -n libpmemobj-devel
%defattr(-,root,root,-)
%{_libdir}/libpmemobj.so
%{_libdir}/pkgconfig/libpmemobj.pc
%{_includedir}/libpmemobj.h
%{_includedir}/libpmemobj/*.h
%{_mandir}/man7/libpmemobj.7.gz
%{_mandir}/man5/poolset.5.gz
%{_mandir}/man3/pmemobj_*.3.gz
%{_mandir}/man3/pobj_*.3.gz
%{_mandir}/man3/oid_*.3.gz
%{_mandir}/man3/toid*.3.gz
%{_mandir}/man3/direct_*.3.gz
%{_mandir}/man3/d_r*.3.gz
%{_mandir}/man3/tx_*.3.gz
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmemobj-debug
Summary: Debug variant of the Persistent Memory Transactional Object Store library
Group: __GROUP_DEV_LIBS__
Requires: libpmemobj__PKG_NAME_SUFFIX__ = %{version}-%{release}
%description -n libpmemobj-debug
The libpmemobj library provides a transactional object store,
providing memory allocation, transactions, and general facilities for
persistent memory programming. Developers new to persistent memory
probably want to start with this library.

This sub-package contains debug variant of the library, providing
run-time assertions and trace points. The typical way to access the
debug version is to set the environment variable LD_LIBRARY_PATH to
/usr/lib64/pmdk_debug.

%files -n libpmemobj-debug
%defattr(-,root,root,-)
%dir %{_libdir}/pmdk_debug
%{_libdir}/pmdk_debug/libpmemobj.so
%{_libdir}/pmdk_debug/libpmemobj.so.*
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmempool__PKG_NAME_SUFFIX__
Summary: Persistent Memory pool management library
Group: __GROUP_SYS_LIBS__
Requires: libpmem__PKG_NAME_SUFFIX__ >= %{version}-%{release}
%description -n libpmempool__PKG_NAME_SUFFIX__
The libpmempool library provides a set of utilities for off-line
administration, analysis, diagnostics and repair of persistent memory
pools created by libpmemobj library.

%files -n libpmempool__PKG_NAME_SUFFIX__
%defattr(-,root,root,-)
%{_libdir}/libpmempool.so.*
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmempool-devel
Summary: Development files for Persistent Memory pool management library
Group: __GROUP_DEV_LIBS__
Requires: libpmempool__PKG_NAME_SUFFIX__ = %{version}-%{release}
Requires: libpmem-devel = %{version}-%{release}
%description -n libpmempool-devel
The libpmempool library provides a set of utilities for off-line
administration, analysis, diagnostics and repair of persistent memory
pools created by libpmemobj library.

%files -n libpmempool-devel
%defattr(-,root,root,-)
%{_libdir}/libpmempool.so
%{_libdir}/pkgconfig/libpmempool.pc
%{_includedir}/libpmempool.h
%{_mandir}/man7/libpmempool.7.gz
%{_mandir}/man5/poolset.5.gz
%{_mandir}/man3/pmempool_*.3.gz
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%package -n libpmempool-debug
Summary: Debug variant of the Persistent Memory pool management library
Group: __GROUP_DEV_LIBS__
Requires: libpmempool__PKG_NAME_SUFFIX__ = %{version}-%{release}
%description -n libpmempool-debug
The libpmempool library provides a set of utilities for off-line
administration, analysis, diagnostics and repair of persistent memory
pools created by libpmemobj library.

This sub-package contains debug variant of the library, providing
run-time assertions and trace points. The typical way to access the
debug version is to set the environment variable LD_LIBRARY_PATH to
/usr/lib64/pmdk_debug.

%files -n libpmempool-debug
%defattr(-,root,root,-)
%dir %{_libdir}/pmdk_debug
%{_libdir}/pmdk_debug/libpmempool.so
%{_libdir}/pmdk_debug/libpmempool.so.*
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md

%package -n pmempool
Summary: Utilities for Persistent Memory
Group: __GROUP_SYS_BASE__
Requires: libpmem__PKG_NAME_SUFFIX__ >= %{version}-%{release}
Requires: libpmemobj__PKG_NAME_SUFFIX__ >= %{version}-%{release}
Requires: libpmempool__PKG_NAME_SUFFIX__ >= %{version}-%{release}
Obsoletes: nvml-tools < %{version}-%{release}
%description -n pmempool
The pmempool is a standalone utility for management and off-line analysis
of Persistent Memory pools created by PMDK libraries. It provides a set
of utilities for administration and diagnostics of Persistent Memory pools.
The pmempool may be useful for troubleshooting by system administrators
and users of the applications based on PMDK libraries.

%files -n pmempool
%{_bindir}/pmempool
%{_mandir}/man1/pmempool.1.gz
%{_mandir}/man1/pmempool-*.1.gz
%config(noreplace) %{_sysconfdir}/bash_completion.d/pmempool
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md

%package -n pmreorder
Summary: Consistency Checker for Persistent Memory
Group: __GROUP_SYS_BASE__
%description -n pmreorder
The pmreorder tool is a collection of python scripts designed to parse
and replay operations logged by pmemcheck - a persistent memory checking tool.
Pmreorder performs the store reordering between persistent memory barriers -
a sequence of flush-fence operations. It uses a consistency checking routine
provided in the command line options to check whether files are in a consistent state.

%files -n pmreorder
%{_bindir}/pmreorder
%{_datadir}/pmreorder/*.py
%{_mandir}/man1/pmreorder.1.gz
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md


%if %{with ndctl}

%package -n daxio
Summary: Perform I/O on Device DAX devices or zero a Device DAX device
Group: __GROUP_SYS_BASE__
Requires: libpmem__PKG_NAME_SUFFIX__ >= %{version}-%{release}
%description -n daxio
The daxio utility performs I/O on Device DAX devices or zero
a Device DAX device.  Since the standard I/O APIs (read/write) cannot be used
with Device DAX, data transfer is performed on a memory-mapped device.
The daxio may be used to dump Device DAX data to a file, restore data from
a backup copy, move/copy data to another device or to erase data from
a device.

%files -n daxio
%{_bindir}/daxio
%{_mandir}/man1/daxio.1.gz
%license LICENSE
%doc ChangeLog CONTRIBUTING.md README.md

# end of "if _with_ndctl"
%endif

%prep
%setup -q -n %{name}-%{version}


%build
%define _lto_cflags %{nil}
# For debug build default flags may be overridden to disable compiler
# optimizations.
CFLAGS="%{optflags}" \
LDFLAGS="%{?__global_ldflags}" \
make %{?_smp_mflags} \
%if %{without ndctl}
	NDCTL_ENABLE=n \
%endif
	__MAKE_FLAGS__


# Override LIB_AR with empty string to skip installation of static libraries
%install
make install DESTDIR=%{buildroot} \
%if %{without ndctl}
        NDCTL_ENABLE=n \
%endif
	LIB_AR= \
	prefix=%{_prefix} \
	libdir=%{_libdir} \
	includedir=%{_includedir} \
	mandir=%{_mandir} \
	bindir=%{_bindir} \
	sysconfdir=%{_sysconfdir} \
	docdir=%{_docdir}
mkdir -p %{buildroot}%{_datadir}/pmdk
cp utils/pmdk.magic %{buildroot}%{_datadir}/pmdk/
__MAKE_INSTALL_FDUPES__


%check
%if 0%{?_skip_check} == 1
	echo "Check skipped"
%else
	%if %{defined _testconfig}
		cp %{_testconfig} src/test/testconfig.sh
	%else
		echo "PMEM_FS_DIR=/tmp" > src/test/testconfig.sh
		echo "PMEM_FS_DIR_FORCE_PMEM=1" >> src/test/testconfig.sh
		echo 'TEST_BUILD="debug nondebug"' >> src/test/testconfig.sh
		echo 'TEST_FS="pmem any none"' >> src/test/testconfig.sh
	%endif
	make \
%if %{without ndctl}
        NDCTL_ENABLE=n \
%endif
	check
%endif

%post   -n libpmem__PKG_NAME_SUFFIX__ -p /sbin/ldconfig
%postun -n libpmem__PKG_NAME_SUFFIX__ -p /sbin/ldconfig
%post   -n libpmemobj__PKG_NAME_SUFFIX__ -p /sbin/ldconfig
%postun -n libpmemobj__PKG_NAME_SUFFIX__ -p /sbin/ldconfig
%post   -n libpmempool__PKG_NAME_SUFFIX__ -p /sbin/ldconfig
%postun -n libpmempool__PKG_NAME_SUFFIX__ -p /sbin/ldconfig

%if 0%{?__debug_package} == 0
%debug_package
%endif


%changelog
