File darktable.spec of Package darktable

#
# spec file for package darktable
#
# Copyright (c) 2023 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via https://bugs.opensuse.org/
#

%global        optimization_architecture @BUILD_FLAVOR@%{nil}
%global        desktop_filename          org.darktable.darktable

%bcond_with clang
%if 0%{?suse_version}
%bcond_with    use_ninja
%else
%bcond_with    use_ninja
%endif

%if %{with use_ninja}
%define __builder %{__ninja}
%endif

%if 0%{?fedora} || 0%{?suse_version} >= 1590
%bcond_with    use_intree_lua
%else
%bcond_without use_intree_lua
%endif

%if %{with use_intree_lua}
%define _dont_use_intree_lua OFF
%else
%define _dont_use_intree_lua ON
%endif

%if 0%{?suse_version} || 0%{?fedora}
%bcond_without cmake_macros
%else
%bcond_with    cmake_macros
%endif

%if 0%{?is_opensuse} || 0%{?fedora}
%bcond_without osmgpsmap
%bcond_without flickcurl
%bcond_without translated_manpages
%else
%bcond_with    osmgpsmap
%bcond_with    flickcurl
%bcond_with    translated_manpages
%endif

%if 0%{?suse_version} >= 1550 || 0%{?fedora}
%bcond_without avif
%else
%bcond_with    avif
%endif

%if 0%{?suse_version} >= 1550 || 0%{?fedora} >= 37
%bcond_without jxl
%else
%bcond_with    jxl
%endif

%if 0%{?suse_version} >= 1550
%bcond_without gmic
%else
%bcond_with    gmic
%endif

%if 0%{?suse_version}
%bcond_without libheif
%else
%bcond_with    libheif
%endif

%if 0%{?suse_version} >= 1550 || 0%{?fedora} >= 38
%bcond_without libraw
%global _use_system_libraw "ON"
%else
%bcond_with libraw
%global _use_system_libraw "ON"
%endif

%ifarch ppc64le
# The OpenCL kernels don't compile on ppc64le and if you get
# them compiled there are funny runtime issues.
%bcond_with     opencl
%else
%bcond_without  opencl
%endif

%bcond_without  openmp

%if %{with openmp}
%global _use_openmp "ON"
%else
%global _use_openmp "OFF"
%endif

%if %{with opencl}
%global _use_opencl "ON"
%else
%global _use_opencl "OFF"
%endif

%if %{with gmic}
%global _use_gmic "ON"
%else
%global _use_gmic "OFF"
%endif

%if %{with avif}
%global _use_avif "ON"
%else
%global _use_avif "OFF"
%endif

%if 0%{?suse_version} && 0%{?suse_version} < 1550
%global force_gcc_version 12
%endif

%if "%{optimization_architecture}" == "znver2" && ((0%{?suse_version} && 0%{?suse_version} < 1550) || (0%{?fedora} && 0%{?fedora} < 30))
ExclusiveArch:  do_not_build
%endif

%if "%{optimization_architecture}" != ""
Name:           darktable-%{optimization_architecture}
%else
Name:           darktable
%endif
Version:        0

Release:        0
%global pkg_name darktable
%global pkg_version %{version}
URL:            http://www.darktable.org/
Source0:        _service
Source1:        %{pkg_name}-rpmlintrc
#
Source95:       series
Source97:       darktable.dsc
Source98:       debian.tar.xz
Source99:       README.openSUSE
#
Patch0:         darktable-rawspeed-build-type-override.patch
#
Conflicts:      otherproviders(darktable)
%if "%{optimization_architecture}" != ""
Provides:       darktable = %{version}-%{release}
%if "%{optimization_architecture}" != "asan"
ExcludeArch:    aarch64 ppc64le
# /"%%{optimization_architecture}" != "asan"
%endif
%else
ExclusiveArch:  x86_64 aarch64 ppc64le riscv64
# /"%%{optimization_architecture}" != ""
%endif
# build time tools
%if %{with use_ninja}
BuildRequires:  ninja
%endif
BuildRequires:  clang >= 13
BuildRequires:  cmake >= 3.18
%if 0%{?fedora}
BuildRequires:  ninja-build
%else
BuildRequires:  ninja
%endif
BuildRequires:  fdupes
BuildRequires:  llvm-devel
%if 0%{?fedora}
BuildRequires:  libasan
BuildRequires:  llvm-static
%endif
%if %{without clang}
BuildRequires:  gcc%{?force_gcc_version}-c++ >= 12
%if 0%{?force_gcc_version}
#!BuildIgnore:  libgcc_s1
%endif
%else
BuildRequires:  lld
%endif
BuildRequires:  intltool
BuildRequires:  libxslt
%if %{with translated_manpages}
BuildRequires:  po4a
%endif
%if 0%{?suse_version}
BuildRequires:  update-desktop-files
%endif
BuildRequires:  desktop-file-utils
BuildRequires:  hicolor-icon-theme
BuildRequires:  xz
# libraries deps
BuildRequires:  cups-devel
BuildRequires:  libjpeg-devel
BuildRequires:  pkgconfig(libtiff-4)
BuildRequires:  pkgconfig(libxml-2.0)
#
%if 0%{?suse_version} >= 1550
BuildRequires:  pkgconfig(lua5.4)
%else
BuildRequires:  pkgconfig(lua)
%endif
BuildRequires:  pkgconfig(pugixml)
#
BuildRequires:  pkgconfig
BuildRequires:  pkgconfig(ImageMagick)
BuildRequires:  (pkgconfig(OpenEXR) if pkgconfig(OpenEXR) >= 3.0)
BuildRequires:  pkgconfig(atk)
BuildRequires:  pkgconfig(colord)
BuildRequires:  pkgconfig(colord-gtk)
BuildRequires:  pkgconfig(exiv2)
BuildRequires:  pkgconfig(libopenjp2)
%if %{with flickcurl}
BuildRequires:  pkgconfig(flickcurl)
%endif
BuildRequires:  pkgconfig(gdk-pixbuf-2.0)
BuildRequires:  pkgconfig(gio-2.0)
BuildRequires:  pkgconfig(glib-2.0)
BuildRequires:  pkgconfig(gtk+-3.0) >= 3.24.5
BuildRequires:  pkgconfig(iso-codes)
BuildRequires:  pkgconfig(json-glib-1.0)
BuildRequires:  pkgconfig(lcms2)
BuildRequires:  pkgconfig(lensfun) >= 0.3.2
BuildRequires:  pkgconfig(libcurl)
BuildRequires:  pkgconfig(libgphoto2)
%if %{with libheif}
BuildRequires:  pkgconfig(libheif)
%endif
%if %{with jxl}
BuildRequires:  pkgconfig(libjxl) >= 0.7.0
%endif
%if %{with libraw}
BuildRequires:  pkgconfig(libraw) >= 0.21
%endif
BuildRequires:  pkgconfig(librsvg-2.0)
BuildRequires:  pkgconfig(libsecret-1)
BuildRequires:  pkgconfig(libwebp)
%if %{with osmgpsmap}
BuildRequires:  pkgconfig(osmgpsmap-1.0)
%endif
BuildRequires:  pkgconfig(pango)
BuildRequires:  pkgconfig(sdl2)
BuildRequires:  pkgconfig(sqlite3)
BuildRequires:  pkgconfig(tinfo)
%if %{with opencl}
BuildRequires:  opencl-headers
%endif
%if %{with gmic}
%if 0%{?is_opensuse}
BuildRequires:  libgmic-devel
%else
BuildRequires:  gmic-devel
%endif
# /gmic
%endif
%if %{with avif}
BuildRequires:  libavif-devel >= 0.9.0
%endif
BuildRequires:  portmidi-devel

# for the sake of simplicity we do not enforce the version here
# the package is small enough that installing it doesnt hurt
Requires:       iso-codes
#
# Some CSS themes suggest to use the the Roboto font family
# https://github.com/darktable-org/darktable/releases/tag/release-3.0.0
%if 0%{?fedora}
Recommends:     roboto-fontface-fonts
%else
Recommends:     google-roboto-fonts
%endif
#
Summary:        A virtual Lighttable and Darkroom
License:        GPL-3.0-or-later
Group:          Productivity/Graphics/Viewers
Obsoletes:      darktable-docs < %{version}-%{release}
Provides:       darktable-docs = %{version}-%{release}

%description
darktable is a virtual lighttable and darkroom for photographers: it manages
digital negatives in a database and can show them through a zoomable
lighttable. It also enables developing raw images and enhance them.

%package tools-basecurve
Summary:        The basecurve tool from tools/basecurve/
Group:          Productivity/Graphics/Viewers
Requires:       /usr/bin/convert
Requires:       dcraw
Requires:       exiftool
Conflicts:      otherproviders(darktable-tools-basecurve)
%if "%{optimization_architecture}" != ""
Provides:       darktable-tools-basecurve = %{version}-%{release}
%endif

%description tools-basecurve
darktable is a virtual lighttable and darkroom for photographers: it manages
digital negatives in a database and can show them through a zoomable
lighttable. It also enables developing raw images and enhance them.

This package provides the basecurve tool from tools/basecurve/.
Another option to solve the same problem might be the darktable-chart module
from the darktable package.

%package tools-noise
Summary:        Noise profiling tools to support new cameras
Group:          Productivity/Graphics/Viewers
Requires:       /usr/bin/convert
Requires:       ghostscript
Requires:       gnuplot
Conflicts:      otherproviders(darktable-tools-noise)
%if "%{optimization_architecture}" != ""
Provides:       darktable-tools-noise = %{version}-%{release}
%endif

%description tools-noise
darktable is a virtual lighttable and darkroom for photographers: it manages
digital negatives in a database and can show them through a zoomable
lighttable. It also enables developing raw images and enhance them.

This package provides the noise profiling tools to add support for new cameras.

%prep
mv %{_sourcedir}/%{pkg_name}-%{version} %{_builddir}/%{pkg_name}-%{version}
%autosetup -p1 -D -T 0 -n %{pkg_name}-%{version}

cp %{SOURCE99} .

# Remove bundled OpenCL headers.
rm -rf src/external/CL src/external/OpenCL
sed -i -e 's, \"external/CL/\*\.h\" , ,' src/CMakeLists.txt

%if %{without use_intree_lua}
# Remove bundled lua
rm -rf src/external/lua/
%endif

%build
%define __builder ninja
%global cmake_options \\\
   -DCMAKE_INSTALL_LIBDIR=%{_lib} \\\
   -DCMAKE_SKIP_RPATH:BOOL=OFF -DCMAKE_SKIP_INSTALL_RPATH:BOOL=OFF \\\
   -DCMAKE_INSTALL_DATAROOTDIR="share" \\\
   -DCMAKE_INSTALL_LIBEXECDIR="%{_libexecdir}" \\\
   -DCMAKE_INSTALL_DOCDIR="%{_defaultdocdir}/%{pkg_name}" \\\
   -DCOMPILER_SUPPORTS_SPLIT_DEBUG_INFO=OFF \\\
   -DBINARY_PACKAGE_BUILD=1 \\\
   -DRAWSPEED_ENABLE_LTO=ON \\\
   -DUSE_OPENCL="%{_use_opencl}" \\\
   -DUSE_OPENMP="%{_use_openmp}" \\\
   -DUSE_GMIC="%{_use_gmic}" \\\
   -DUSE_AVIF="%{_use_avif}" \\\
   -DDONT_USE_INTERNAL_LIBRAW="%{_use_system_libraw}" \\\
   -DBUILD_NOISE_TOOLS=ON \\\
   -DBUILD_CURVE_TOOLS=ON

%if 0%{?force_gcc_version}
export CC="gcc-%{?force_gcc_version}"
export CXX="g++-%{?force_gcc_version}"
%endif
./tools/create_version_c.sh src/version_gen.c "%{version}-%{release}%{?optimization_architecture}"
%if %{with clang}
export CC="/usr/bin/clang"
export CXX="/usr/bin/clang++"
%define _lto_cflags -flto
%endif
%if "%{optimization_architecture}" != ""
%if "%{optimization_architecture}" == "asan"
export CFLAGS="$(echo '%{optflags}' | perl -p -e 's|-fstack-\S+ ||g') -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls"
export CXXFLAGS="${CFLAGS}"
export LDFLAGS="-fsanitize=address"
%else
export CFLAGS="%{optflags} -march=%{optimization_architecture}"
export CXXFLAGS="${CFLAGS}"
%endif
%endif
export _OPENCL_INCLUDE_DIR=$(clang -print-search-dirs | awk -F= '/^libra/ {print $2}' | awk -F: '{print $1 "/include"}')

%if %{with cmake_macros}
#suse branch
%cmake \
  -DCLANG_OPENCL_INCLUDE_DIR=${_OPENCL_INCLUDE_DIR} \
  -DDONT_USE_INTERNAL_LUA=%{_dont_use_intree_lua} \
  %ifarch aarch64
  -DTESTBUILD_OPENCL_PROGRAMS=OFF \
  %endif
  %{cmake_options} \
%if "%{optimization_architecture}" == "asan"
  -DCMAKE_EXE_LINKER_FLAGS="" -DCMAKE_MODULE_LINKER_FLAGS="" -DCMAKE_SHARED_LINKER_FLAGS="" -DCMAKE_BUILD_TYPE=RELWITHDEBINFO \
%endif
   || cat CMakeFiles/CMakeError.log
%cmake_build
#/ suse branch
%else
#fedora branch
mkdir %{_target_platform}
pushd %{_target_platform}
%cmake \
  -DDONT_USE_INTERNAL_LUA=%{_dont_use_intree_lua} \
  %ifarch aarch64
  -DTESTBUILD_OPENCL_PROGRAMS=OFF \
  %endif
  %{cmake_options} ..
make %{_smp_mflags} VERBOSE=1

#/ with cmake_macros
%endif

%install
%define __builder ninja
%if "%{optimization_architecture}" == "asan"
# Do not strip asan binaries
export NO_BRP_STRIP_DEBUG="true"
export NO_DEBUGINFO_STRIP_DEBUG="true"
# Do not create debuginfo package
%define debug_package %{nil}
%define __debug_install_post %{nil}
: >debugfiles.list
%if 0%{?suse_version} >= 1500 || 0%{?fedora} > 27
: >debugsourcefiles.list
%else
: >debugsources.list
%endif
%endif
%if %{with cmake_macros}
%cmake_install

%if 0%{?suse_version}
%suse_update_desktop_file %{desktop_filename}
%endif
#/ cmake macros branch
%else
# fedora branch
%make_install -C %{_target_platform}
#/ fedora branch
%endif

%find_lang darktable

rm %{buildroot}%{_defaultdocdir}/%{pkg_name}/LICENSE

%fdupes %{buildroot}/%{_prefix}

%if ! 0%{?suse_version}
%post
touch --no-create %{_datadir}/icons/hicolor >/dev/null 2>/dev/null || :

%postun
update-desktop-database >/dev/null 2>/dev/null || :
if [ $1 -eq 0 ] ; then
    touch --no-create %{_datadir}/icons/hicolor >/dev/null 2>/dev/null
    gtk-update-icon-cache %{_datadir}/icons/hicolor >/dev/null 2>/dev/null || :
fi

%posttrans
gtk-update-icon-cache %{_datadir}/icons/hicolor >/dev/null 2>/dev/null || :
%endif

%files -f darktable.lang
%doc %{_defaultdocdir}/%{pkg_name}
%license LICENSE
%exclude %{_defaultdocdir}/%{pkg_name}/README.tools.basecurve.md
%{_bindir}/darktable
%if %{with opencl}
%{_bindir}/darktable-cltest
%endif
%{_bindir}/darktable-cli
%{_bindir}/darktable-generate-cache
%{_bindir}/darktable-chart
%{_bindir}/darktable-cmstest
%{_bindir}/darktable-rs-identify
%{_libdir}/darktable
%{_datadir}/applications/%{desktop_filename}.desktop
%{_datadir}/darktable
%exclude %{_datadir}/%{pkg_name}/tools/basecurve/
%dir %{_datadir}/metainfo
%{_datadir}/metainfo/%{desktop_filename}.appdata.xml
%{_datadir}/icons/hicolor/*/apps/darktable*
%{_mandir}/man1/darktable*.1*
%if %{with translated_manpages}
%{_mandir}/*/man1/darktable*.1*
%endif
%dir %{_libexecdir}/darktable
%dir %{_libexecdir}/darktable/tools

%files tools-basecurve
%{_libexecdir}/darktable/tools/darktable-curve-tool
%{_libexecdir}/darktable/tools/darktable-curve-tool-helper
%{_datadir}/%{pkg_name}/tools/basecurve/
%doc %{_defaultdocdir}/%{pkg_name}/README.tools.basecurve.md

%files tools-noise
%{_libexecdir}/darktable/tools/darktable-gen-noiseprofile
%{_libexecdir}/darktable/tools/darktable-noiseprofile
%{_libexecdir}/darktable/tools/profiling-shot.xmp
%{_libexecdir}/darktable/tools/subr.sh

%changelog
openSUSE Build Service is sponsored by