gnu: kdbusaddons: Embed kinit store dir, avoid dependency cycles.

kdbusaddons needs to know the location of the kdeinit5 executable,
provided by kinit. kinit depends on kdbusaddons, so we add bootstrap
versions of all packages in the dependency chain from kinit to
kdbusaddons to avoid cyclic dependencies.

* gnu/packages/kde-frameworks.scm (kinit-bootstrap,
  kdbusaddons-bootstrap): New variables.
  (kdbusaddons)[inputs]: Add kinit-bootstrap.
  [source,arguments]: Add patch and substitution to embed
  kinit-bootstrap's store directory in the code.
* gnu/packages/patches/kdbusaddons-kinit-file-name.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Thomas Danckaert 2016-12-06 14:55:39 +01:00 committed by Ludovic Courtès
parent d343a60f93
commit 834d12226b
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
3 changed files with 49 additions and 3 deletions

View file

@ -639,6 +639,7 @@ dist_patch_DATA = \
%D%/packages/patches/isl-0.11.1-aarch64-support.patch \
%D%/packages/patches/jbig2dec-ignore-testtest.patch \
%D%/packages/patches/jq-CVE-2015-8863.patch \
%D%/packages/patches/kdbusaddons-kinit-file-name.patch \
%D%/packages/patches/khmer-use-libraries.patch \
%D%/packages/patches/kmod-module-directory.patch \
%D%/packages/patches/kobodeluxe-paths.patch \

View file

@ -25,6 +25,7 @@ (define-module (gnu packages kde-frameworks)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (gnu packages)
#:use-module (gnu packages acl)
#:use-module (gnu packages admin)
#:use-module (gnu packages attr)
@ -50,7 +51,8 @@ (define-module (gnu packages kde-frameworks)
#:use-module (gnu packages version-control)
#:use-module (gnu packages web)
#:use-module (gnu packages xml)
#:use-module (gnu packages xorg))
#:use-module (gnu packages xorg)
#:use-module (srfi srfi-1))
(define-public extra-cmake-modules
(package
@ -516,7 +518,8 @@ (define-public kdbusaddons
name "-" version ".tar.xz"))
(sha256
(base32
"07mzb1xr8wyiid25p8kg6mjp6vq8ngvv1ikhq75zvd2cbax530c8"))))
"07mzb1xr8wyiid25p8kg6mjp6vq8ngvv1ikhq75zvd2cbax530c8"))
(patches (search-patches "kdbusaddons-kinit-file-name.patch"))))
(build-system cmake-build-system)
(native-inputs
`(("extra-cmake-modules" ,extra-cmake-modules)
@ -524,10 +527,18 @@ (define-public kdbusaddons
("qttools" ,qttools)))
(inputs
`(("qtbase" ,qtbase)
("qtx11extras" ,qtx11extras)))
("qtx11extras" ,qtx11extras)
("kinit" ,kinit-bootstrap))) ;; kinit-bootstrap: kinit package which does not depend on kdbusaddons.
(arguments
`(#:phases
(modify-phases %standard-phases
(add-before
'configure 'patch-source
(lambda* (#:key inputs #:allow-other-keys)
;; look for the kdeinit5 executable in kinit's store directory,
;; instead of the current application's directory:
(substitute* "src/kdeinitinterface.cpp"
(("@SUBSTITUTEME@") (assoc-ref inputs "kinit")))))
(replace 'check
(lambda _
(setenv "DBUS_FATAL_WARNINGS" "0")
@ -2866,3 +2877,22 @@ (define-public plasma-framework
script engines.")
;; dual licensed
(license (list license:gpl2+ license:lgpl2.1+))))
;; This version of kdbusaddons does not use kinit as an input, and is used to
;; build kinit-bootstrap, as well as bootstrap versions of all kinit
;; dependencies which also rely on kdbusaddons.
(define kdbusaddons-bootstrap
(package
(inherit kdbusaddons)
(source (origin
(inherit (package-source kdbusaddons))
(patches '())))
(inputs (alist-delete "kinit" (package-inputs kdbusaddons)))
(arguments
(substitute-keyword-arguments (package-arguments kdbusaddons)
((#:phases phases)
`(modify-phases ,phases
(delete 'patch-source)))))))
(define kinit-bootstrap
((package-input-rewriting `((,kdbusaddons . ,kdbusaddons-bootstrap))) kinit))

View file

@ -0,0 +1,15 @@
Add placeholder for kinit's store file name.
diff --git a/src/kdeinitinterface.cpp b/src/kdeinitinterface.cpp
index 22fa5e5..3d40937 100644
--- a/src/kdeinitinterface.cpp
+++ b/src/kdeinitinterface.cpp
@@ -52,7 +52,7 @@ void KDEInitInterface::ensureKdeinitRunning()
// If not found in system paths, search other paths
if (srv.isEmpty()) {
const QStringList searchPaths = QStringList()
- << QCoreApplication::applicationDirPath() // then look where our application binary is located
+ << QString::fromUtf8("@SUBSTITUTEME@/bin") // using QStringLiteral would be more efficient, but breaks guix store reference detection.
<< QLibraryInfo::location(QLibraryInfo::BinariesPath); // look where exec path is (can be set in qt.conf)
srv = QStandardPaths::findExecutable(QStringLiteral("kdeinit5"), searchPaths);
if (srv.isEmpty()) {