build: qt: Add qtbase argument and wrap Qt environment variables exactly.

* guix/build-system/qt.scm (default-qtbase): New variable.
(lower) <#:qtbase>: Add argument...
[build-inputs]: ... and propagate it here.
(qt-build): Add qtbase argument.
(qt-cross-build): Likewise.
* guix/build/qt-utils.scm (%default-qt-major-version): New variable.
(variables-for-wrapping): Add qt-major-version argument, and use it to format
the various path prefixes.  Wrap QT environment variables exactly.
(wrap-qt-program*): Add qt-major-version argument, and pass it to
variables-for-wrapping.
(wrap-qt-program): Add qt-major-version argument, and pass it to
wrap-qt-program*.
(wrap-all-qt-programs): Add qtbase argument, and extract the major version
from it, passing it to wrap-qt-program*.
This commit is contained in:
Maxim Cournoyer 2022-07-19 23:04:25 -04:00
parent a13a687989
commit 1f466ed6be
No known key found for this signature in database
GPG key ID: 1260E46482E63562
2 changed files with 45 additions and 13 deletions

View file

@ -4,6 +4,7 @@
;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2019 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; Copyright © 2019 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net> ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -67,11 +68,19 @@ (define (default-cmake)
(let ((module (resolve-interface '(gnu packages cmake)))) (let ((module (resolve-interface '(gnu packages cmake))))
(module-ref module 'cmake-minimal))) (module-ref module 'cmake-minimal)))
(define (default-qtbase)
"Return the default qtbase package."
;; Do not use `@' to avoid introducing circular dependencies.
(let ((module (resolve-interface '(gnu packages qt))))
(module-ref module 'qtbase-5)))
;; This barely is a copy from (guix build-system cmake), only adjusted to use ;; This barely is a copy from (guix build-system cmake), only adjusted to use
;; the variables defined here. ;; the variables defined here.
(define* (lower name (define* (lower name
#:key source inputs native-inputs outputs system target #:key source inputs native-inputs outputs system target
(cmake (default-cmake)) (cmake (default-cmake))
(qtbase (default-qtbase))
#:allow-other-keys #:allow-other-keys
#:rest arguments) #:rest arguments)
"Return a bag for NAME." "Return a bag for NAME."
@ -87,6 +96,7 @@ (define private-keywords
`(("source" ,source)) `(("source" ,source))
'()) '())
,@`(("cmake" ,cmake)) ,@`(("cmake" ,cmake))
,@`(("qtbase" ,qtbase))
,@native-inputs ,@native-inputs
,@(if target ,@(if target
;; Use the standard cross inputs of ;; Use the standard cross inputs of
@ -112,6 +122,7 @@ (define private-keywords
(define* (qt-build name inputs (define* (qt-build name inputs
#:key #:key
qtbase
source (guile #f) source (guile #f)
(outputs '("out")) (configure-flags ''()) (outputs '("out")) (configure-flags ''())
(search-paths '()) (search-paths '())
@ -150,6 +161,7 @@ (define builder
#:phases #$(if (pair? phases) #:phases #$(if (pair? phases)
(sexp->gexp phases) (sexp->gexp phases)
phases) phases)
#:qtbase #$qtbase
#:qt-wrap-excluded-outputs #$qt-wrap-excluded-outputs #:qt-wrap-excluded-outputs #$qt-wrap-excluded-outputs
#:qt-wrap-excluded-inputs #$qt-wrap-excluded-inputs #:qt-wrap-excluded-inputs #$qt-wrap-excluded-inputs
#:configure-flags #$configure-flags #:configure-flags #$configure-flags
@ -181,6 +193,7 @@ (define* (qt-cross-build name
#:key #:key
source target source target
build-inputs target-inputs host-inputs build-inputs target-inputs host-inputs
qtbase
(guile #f) (guile #f)
(outputs '("out")) (outputs '("out"))
(configure-flags ''()) (configure-flags ''())
@ -237,6 +250,7 @@ (define %outputs
search-path-specification->sexp search-path-specification->sexp
native-search-paths) native-search-paths)
#:phases #$phases #:phases #$phases
#:qtbase #$qtbase
#:configure-flags #$configure-flags #:configure-flags #$configure-flags
#:make-flags #$make-flags #:make-flags #$make-flags
#:out-of-source? #$out-of-source? #:out-of-source? #$out-of-source?

View file

@ -3,7 +3,7 @@
;;; Copyright © 2019, 2020, 2021 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; Copyright © 2019, 2020, 2021 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net> ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
;;; Copyright © 2021 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2021 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; Copyright © 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot> ;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
@ -26,10 +26,13 @@ (define-module (guix build qt-utils)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:use-module (srfi srfi-71)
#:export (wrap-qt-program #:export (wrap-qt-program
wrap-all-qt-programs wrap-all-qt-programs
%qt-wrap-excluded-inputs)) %qt-wrap-excluded-inputs))
(define %default-qt-major-version "5")
(define %qt-wrap-excluded-inputs (define %qt-wrap-excluded-inputs
'(list "cmake" "extra-cmake-modules" "qttools")) '(list "cmake" "extra-cmake-modules" "qttools"))
@ -37,7 +40,9 @@ (define %qt-wrap-excluded-inputs
;; facilities for per-application data directories, such as ;; facilities for per-application data directories, such as
;; /share/quassel. Thus, we include the output directory even if it doesn't ;; /share/quassel. Thus, we include the output directory even if it doesn't
;; contain any of the standard subdirectories. ;; contain any of the standard subdirectories.
(define (variables-for-wrapping base-directories output-directory) (define* (variables-for-wrapping base-directories output-directory
#:key
(qt-major-version %default-qt-major-version))
(define (collect-sub-dirs base-directories file-type subdirectory selectors) (define (collect-sub-dirs base-directories file-type subdirectory selectors)
;; Append SUBDIRECTORY and each of BASE-DIRECTORIES, and return the subset ;; Append SUBDIRECTORY and each of BASE-DIRECTORIES, and return the subset
@ -82,17 +87,20 @@ (define exists? (match file-type
"/applications" "/cursors" "/fonts" "/icons" "/glib-2.0/schemas" "/applications" "/cursors" "/fonts" "/icons" "/glib-2.0/schemas"
"/mime" "/sounds" "/themes" "/wallpapers") "/mime" "/sounds" "/themes" "/wallpapers")
'("XDG_CONFIG_DIRS" suffix directory "/etc/xdg") '("XDG_CONFIG_DIRS" suffix directory "/etc/xdg")
;; The following variables can be extended by the user, but not ;; We wrap exactly to avoid potentially mixing Qt5/Qt6 components, which
;; overridden, to ensure proper operation. ;; would cause warnings, perhaps problems.
'("QT_PLUGIN_PATH" prefix directory "/lib/qt5/plugins") `("QT_PLUGIN_PATH" = directory
'("QML2_IMPORT_PATH" prefix directory "/lib/qt5/qml") ,(format #f "/lib/qt~a/plugins" qt-major-version))
`("QML2_IMPORT_PATH" = directory
,(format #f "/lib/qt~a/qml" qt-major-version))
;; QTWEBENGINEPROCESS_PATH accepts a single value, which makes 'exact the ;; QTWEBENGINEPROCESS_PATH accepts a single value, which makes 'exact the
;; most suitable environment variable type for it. ;; most suitable environment variable type for it.
'("QTWEBENGINEPROCESS_PATH" = regular `("QTWEBENGINEPROCESS_PATH" = regular
"/lib/qt5/libexec/QtWebEngineProcess")))) ,(format #f "/lib/qt~a/libexec/QtWebEngineProcess" qt-major-version)))))
(define* (wrap-qt-program* program #:key inputs output-dir (define* (wrap-qt-program* program #:key inputs output-dir
qt-wrap-excluded-inputs) qt-wrap-excluded-inputs
(qt-major-version %default-qt-major-version))
(define input-directories (define input-directories
(filter-map (filter-map
@ -104,12 +112,14 @@ (define input-directories
(let ((vars-to-wrap (variables-for-wrapping (let ((vars-to-wrap (variables-for-wrapping
(cons output-dir input-directories) (cons output-dir input-directories)
output-dir))) output-dir
#:qt-major-version qt-major-version)))
(when (not (null? vars-to-wrap)) (when (not (null? vars-to-wrap))
(apply wrap-program program vars-to-wrap)))) (apply wrap-program program vars-to-wrap))))
(define* (wrap-qt-program program-name #:key inputs output (define* (wrap-qt-program program-name #:key inputs output
(qt-wrap-excluded-inputs %qt-wrap-excluded-inputs)) (qt-wrap-excluded-inputs %qt-wrap-excluded-inputs)
(qt-major-version %default-qt-major-version))
"Wrap the specified program (which must reside in the OUTPUT's \"/bin\" "Wrap the specified program (which must reside in the OUTPUT's \"/bin\"
directory) with suitably set environment variables. directory) with suitably set environment variables.
@ -117,9 +127,11 @@ (define* (wrap-qt-program program-name #:key inputs output
is wrapped." is wrapped."
(wrap-qt-program* (string-append output "/bin/" program-name) (wrap-qt-program* (string-append output "/bin/" program-name)
#:output-dir output #:inputs inputs #:output-dir output #:inputs inputs
#:qt-wrap-excluded-inputs qt-wrap-excluded-inputs)) #:qt-wrap-excluded-inputs qt-wrap-excluded-inputs
#:qt-major-version qt-major-version))
(define* (wrap-all-qt-programs #:key inputs outputs (define* (wrap-all-qt-programs #:key inputs outputs
qtbase
(qt-wrap-excluded-outputs '()) (qt-wrap-excluded-outputs '())
(qt-wrap-excluded-inputs %qt-wrap-excluded-inputs) (qt-wrap-excluded-inputs %qt-wrap-excluded-inputs)
#:allow-other-keys) #:allow-other-keys)
@ -131,6 +143,11 @@ (define* (wrap-all-qt-programs #:key inputs outputs
QT-WRAP-EXCLUDED-OUTPUTS. This is useful when an output is known not QT-WRAP-EXCLUDED-OUTPUTS. This is useful when an output is known not
to contain any Qt binaries, and where wrapping would gratuitously to contain any Qt binaries, and where wrapping would gratuitously
add a dependency of that output on Qt." add a dependency of that output on Qt."
(define qt-major-version
(let ((_ version (package-name->name+version
(strip-store-file-name qtbase))))
(first (string-split version #\.))))
(define (find-files-to-wrap output-dir) (define (find-files-to-wrap output-dir)
(append-map (append-map
(lambda (dir) (lambda (dir)
@ -149,7 +166,8 @@ (define handle-output
(unless (member output qt-wrap-excluded-outputs) (unless (member output qt-wrap-excluded-outputs)
(for-each (cut wrap-qt-program* <> (for-each (cut wrap-qt-program* <>
#:output-dir output-dir #:inputs inputs #:output-dir output-dir #:inputs inputs
#:qt-wrap-excluded-inputs qt-wrap-excluded-inputs) #:qt-wrap-excluded-inputs qt-wrap-excluded-inputs
#:qt-major-version qt-major-version)
(find-files-to-wrap output-dir)))))) (find-files-to-wrap output-dir))))))
(for-each handle-output outputs)) (for-each handle-output outputs))