diff --git a/pkgs/applications/graphics/digikam/default.nix b/pkgs/applications/graphics/digikam/default.nix index bdf8077624db..a41e1ad07d3c 100644 --- a/pkgs/applications/graphics/digikam/default.nix +++ b/pkgs/applications/graphics/digikam/default.nix @@ -3,42 +3,222 @@ , libgphoto2, libjpeg, libkdcraw, libkexiv2, libkipi, libpgf, libtiff , libusb1, liblqr1, marble, mysql, opencv, perl, phonon, pkgconfig , qca2, qimageblitz, qjson, qt4, soprano + +# Optional build time dependencies +, baloo, doxygen, kfilemetadata +, lcms2 +, kfaceSupport ? true, libkface ? null +, kgeomapSupport ? true, libkgeomap ? null +, libxslt + +# Plugins optional build time dependencies +, gdk_pixbuf, imagemagick +, libgpod, libksane, libkvkontakte +, qt_gstreamer1 /*qt_soap, herqq -> is missing its av part.*/ + /*qt_koauth */ + +# Supplementary packages required only by the wrapper. +, bash, kde_runtime, kde_baseapps, makeWrapper, oxygen_icons +, phonon_backend_vlc /*phonon_backend_gstreamer,*/ +, ffmpegthumbs /*mplayerthumbs*/ +, runCommand, shared_mime_info, writeScriptBin }: -stdenv.mkDerivation rec { - name = "digikam-4.12.0"; +let + version = "4.12.0"; + pName = "digikam-${version}"; - src = fetchurl { - url = "http://download.kde.org/stable/digikam/${name}.tar.bz2"; - sha256 = "081ldsaf3frf5khznjd3sxkjmi4dyp6w6nqnc2a0agkk0kxkl10m"; + build = stdenv.mkDerivation rec { + name = "digikam-build-${version}"; + + src = fetchurl { + url = "http://download.kde.org/stable/digikam/${pName}.tar.bz2"; + sha256 = "081ldsaf3frf5khznjd3sxkjmi4dyp6w6nqnc2a0agkk0kxkl10m"; + }; + + nativeBuildInputs = [ + automoc4 cmake gettext perl pkgconfig + ] ++ [ + # Optional + doxygen + ]; + + buildInputs = [ + boost eigen jasper kdelibs kdepimlibs lcms lensfun + libgphoto2 libjpeg libkdcraw libkexiv2 libkipi liblqr1 libpgf + libtiff marble mysql.lib opencv phonon qca2 qimageblitz qjson qt4 + shared_desktop_ontologies soprano ] + # Optional build time dependencies + ++ [ + baloo + kfilemetadata + lcms2 ] + ++ stdenv.lib.optional (kfaceSupport && null != libkface) [ libkface ] + ++ stdenv.lib.optional (kgeomapSupport && null != libkgeomap) [ libkgeomap ] ++ + [ libxslt ] + # Plugins optional build time dependencies + ++ [ + gdk_pixbuf imagemagick libgpod libksane + libkvkontakte + qt_gstreamer1 ]; + + # Make digikam find some FindXXXX.cmake + KDEDIRS="${marble}:${qjson}"; + + # Find kdepimlibs's upper case headers under `include/KDE`. + NIX_CFLAGS_COMPILE = "-I${kdepimlibs}/include/KDE"; + + # Help digiKam find libusb, otherwise gphoto2 support is disabled + cmakeFlags = [ + "-DLIBUSB_LIBRARIES=${libusb1}/lib" + "-DLIBUSB_INCLUDE_DIR=${libusb1}/include/libusb-1.0" + "-DENABLE_BALOOSUPPORT=ON" + "-DENABLE_KDEPIMLIBSSUPPORT=ON" + "-DENABLE_LCMS2=ON" ] + ++ stdenv.lib.optional (kfaceSupport && null == libkface) [ "-DDIGIKAMSC_COMPILE_LIBKFACE=ON" ] + ++ stdenv.lib.optional (kgeomapSupport && null == libkgeomap) [ "-DDIGIKAMSC_COMPILE_LIBKGEOMAP=ON" ]; + + enableParallelBuilding = true; + + meta = { + description = "Photo Management Program"; + license = stdenv.lib.licenses.gpl2; + homepage = http://www.digikam.org; + maintainers = with stdenv.lib.maintainers; [ goibhniu viric urkud ]; + inherit (kdelibs.meta) platforms; + }; }; - nativeBuildInputs = [ automoc4 cmake gettext perl pkgconfig ]; - buildInputs = [ - boost eigen jasper kdelibs kdepimlibs lcms lensfun libgphoto2 - libjpeg libkdcraw libkexiv2 libkipi liblqr1 libpgf libtiff marble - mysql.lib opencv phonon qca2 qimageblitz qjson qt4 - shared_desktop_ontologies soprano + kdePkgs = [ + build # digikam's own build + kdelibs kdepimlibs kde_runtime kde_baseapps libkdcraw oxygen_icons + /*phonon_backend_gstreamer*/ phonon_backend_vlc + ffmpegthumbs /*mplayerthumbs*/ shared_mime_info ] + # Optional build time dependencies + ++ [ + + baloo kfilemetadata ] + ++ stdenv.lib.optional (kfaceSupport && null != libkface) [ libkface ] + ++ stdenv.lib.optional (kgeomapSupport && null != libkgeomap) [ libkgeomap ] + ++ [ + libkipi ] + # Plugins optional build time dependencies + ++ [ + libksane libkvkontakte ]; - # Make digikam find some FindXXXX.cmake - KDEDIRS="${marble}:${qjson}"; - # Help digiKam find libusb, otherwise gphoto2 support is disabled - cmakeFlags = [ - "-DLIBUSB_LIBRARIES=${libusb1}/lib" - "-DLIBUSB_INCLUDE_DIR=${libusb1}/include/libusb-1.0" - "-DDIGIKAMSC_COMPILE_LIBKFACE=ON" - ]; + # TODO: It should be the responsability of these packages to add themselves to `KDEDIRS`. See + # for + # a practical example. + # IMPORTANT: Note that using `XDG_DATA_DIRS` here instead of `KDEDIRS` won't work properly. + KDEDIRS = with stdenv.lib; concatStrings (intersperse ":" (map (x: "${x}") kdePkgs)); - enableParallelBuilding = true; + sycocaDirRelPath = "var/lib/kdesycoca"; + sycocaFileRelPath = "${sycocaDirRelPath}/${pName}.sycoca"; + + sycoca = runCommand "${pName}" { + + name = "digikam-sycoca-${version}"; + + nativeBuildInputs = [ kdelibs ]; + + dontPatchELF = true; + dontStrip = true; + + } '' + # Make sure kbuildsycoca4 does not attempt to write to user home directory. + export HOME=$PWD + + export KDESYCOCA="$out/${sycocaFileRelPath}" + + mkdir -p $out/${sycocaDirRelPath} + export XDG_DATA_DIRS="" + export KDEDIRS="${KDEDIRS}" + kbuildsycoca4 --noincremental --nosignal + ''; + + + replaceExeListWithWrapped = + let f = exeName: '' + rm -f "$out/bin/${exeName}" + makeWrapper "${build}/bin/${exeName}" "$out/bin/${exeName}" \ + --set XDG_DATA_DIRS "" \ + --set KDEDIRS "${KDEDIRS}" \ + --set KDESYCOCA "${sycoca}/${sycocaFileRelPath}" + ''; + in + with stdenv.lib; exeNameList: concatStrings (intersperse "\n" (map f exeNameList)); + +in + + +with stdenv.lib; + +/* + Final derivation + ---------------- + + - Create symlinks to our original build derivation items. + - Wrap specific executables so that they know of the appropriate + sycoca database, `KDEDIRS` to use and block any interference + from `XDG_DATA_DIRS` (only `dnginfo` is not wrapped). +*/ +runCommand "${pName}" { + inherit build; + inherit sycoca; + + nativeBuildInputs = [ makeWrapper ]; + + buildInputs = kdePkgs; + + dontPatchELF = true; + dontStrip = true; meta = { description = "Photo Management Program"; license = stdenv.lib.licenses.gpl2; homepage = http://www.digikam.org; - maintainers = with stdenv.lib.maintainers; [ goibhniu viric urkud ]; + maintainers = with stdenv.lib.maintainers; [ /*jraygauthier*/ ]; inherit (kdelibs.meta) platforms; }; -} + +} '' + pushd $build > /dev/null + for d in `find . -maxdepth 1 -name "*" -printf "%f\n" | tail -n+2`; do + mkdir -p $out/$d + for f in `find $d -maxdepth 1 -name "*" -printf "%f\n" | tail -n+2`; do + ln -s "$build/$d/$f" "$out/$d/$f" + done + done + popd > /dev/null + + ${replaceExeListWithWrapped [ "cleanup_digikamdb" "digitaglinktree" "digikam" "dngconverter" + "expoblending" "photolayoutseditor" "scangui" "showfoto" ]} +'' + +/* + +TODO +---- + +### Useful ### + + - Per lib `KDELIBS` environment variable export. See above in-code TODO comment. + - Missing optional `qt_soap` or `herqq` (av + normal package) dependencies. Those are not + yet (or not fully) packaged in nix. Mainly required for upnp export. + - Possibility to use the `phonon_backend_gstreamer` with its own user specified set of backend. + - Allow user to disable optional features or dependencies reacting properly. + - Compile `kipiplugins` as a separate package (so that it can be used by other kde packages + and so that this package's build time is reduced). + +### Not so useful ### + + - Missing optional `qt_koauth` (not packaged in nix). + - Missing optional `libmediawiki` (not packaged in nix).. + - For some reason the cmake build does not detect `libkvkontakte`. Fix this. + - Possibility to use `mplayerthumbs` thumbnail creator backend. In digikam dev docs, + it is however suggested to use `ffmpegthumbs`. Maybe we should stick to it. + +*/