(define-module (petrsu packages qt) #:use-module (guix build-system gnu) #:use-module (guix build-system trivial) #:use-module (guix download) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) #:use-module (guix search-paths) #:use-module (gnu packages llvm) #:use-module ((gnu packages qt) #:prefix gnu:) #:use-module (gnu packages base) #:use-module (gnu packages commencement) ;; qt #:use-module (gnu packages bison) #:use-module (gnu packages compression) #:use-module (gnu packages cups) #:use-module (gnu packages databases) #:use-module (gnu packages documentation) #:use-module (gnu packages fontutils) #:use-module (gnu packages flex) #:use-module (gnu packages freedesktop) #:use-module (gnu packages gl) #:use-module (gnu packages glib) #:use-module (gnu packages gnuzilla) #:use-module (gnu packages gperf) #:use-module (gnu packages gstreamer) #:use-module (gnu packages gtk) #:use-module (gnu packages icu4c) #:use-module (gnu packages image) #:use-module (gnu packages linux) #:use-module (gnu packages maths) #:use-module (gnu packages pciutils) #:use-module (gnu packages pcre) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) #:use-module (gnu packages pulseaudio) #:use-module (gnu packages python) #:use-module (gnu packages ruby) #:use-module (gnu packages sdl) #:use-module (gnu packages tls) #:use-module (gnu packages xdisorg) #:use-module (gnu packages xorg) #:use-module (gnu packages xml)) ;; Модифицированный пакет из (gnu packages qt) c добавлением clang для ;; сборки qdoc и генерирования документации. Копия кода вместо ;; наследования, т. к. планирую отправить патч. (define-public qt (package (name "qt") (version "5.11.1") (outputs '("out" "examples" "doc")) (source (origin (method url-fetch) (uri (string-append "http://download.qt.io/official_releases/qt/" (version-major+minor version) "/" version "/single/qt-everywhere-src-" version ".tar.xz")) (sha256 (base32 "0azva1wx298jh0xskymz8jic83yhxs1xfxf321wqd5lwiyq2qq1r")) (modules '((guix build utils))) (snippet '(begin ;; Remove qtwebengine, which relies on a bundled copy of ;; chromium. Not only does it fail compilation in qt 5.5: ;; 3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc:362:10: ;; error: cannot convert ‘bool’ to ‘boolean’ in return ;; it might also pose security problems. ;; Alternatively, we could use the "-skip qtwebengine" ;; configuration option. (delete-file-recursively "qtwebengine") ;; The following snippets are copied from their mondular-qt counterparts. (for-each (lambda (dir) (delete-file-recursively (string-append "qtbase/src/3rdparty/" dir))) (list "double-conversion" "freetype" "harfbuzz-ng" "libpng" "libjpeg" "pcre2" "xcb" "xkbcommon" "zlib")) (for-each (lambda (dir) (delete-file-recursively dir)) (list "qtimageformats/src/3rdparty" "qtmultimedia/examples/multimedia/spectrum/3rdparty" "qtwayland/examples" "qtscxml/tests/3rdparty" "qtcanvas3d/examples/canvas3d/3rdparty")) ;; Tests depend on this example, which depends on the 3rd party code. (substitute* "qtmultimedia/examples/multimedia/multimedia.pro" (("spectrum") "#")) (substitute* "qtxmlpatterns/tests/auto/auto.pro" (("qxmlquery") "# qxmlquery") (("xmlpatterns ") "# xmlpatterns")) (substitute* "qtwebglplugin/tests/plugins/platforms/platforms.pro" (("webgl") "# webgl")) (substitute* "qtscxml/tests/auto/auto.pro" (("scion") "#")) (substitute* "qtnetworkauth/tests/auto/auto.pro" (("oauth1 ") "# oauth1 ")) (substitute* "qtremoteobjects/tests/auto/qml/qml.pro" (("integration") "# integration") (("usertypes") "# usertypes")) #t)))) (build-system gnu-build-system) (propagated-inputs `(("mesa" ,mesa))) (inputs `(("alsa-lib" ,alsa-lib) ("bluez" ,bluez) ("cups" ,cups) ("dbus" ,dbus) ("double-conversion" ,double-conversion) ("expat" ,expat) ("fontconfig" ,fontconfig) ("freetype" ,freetype) ("glib" ,glib) ("gstreamer" ,gstreamer) ("gst-plugins-base" ,gst-plugins-base) ("harfbuzz" ,harfbuzz) ("icu4c" ,icu4c) ("jasper" ,jasper) ("libinput" ,libinput-minimal) ("libjpeg" ,libjpeg) ("libmng" ,libmng) ("libpci" ,pciutils) ("libpng" ,libpng) ("libtiff" ,libtiff) ("libwebp" ,libwebp) ("libx11" ,libx11) ("libxcomposite" ,libxcomposite) ("libxcursor" ,libxcursor) ("libxext" ,libxext) ("libxfixes" ,libxfixes) ("libxi" ,libxi) ("libxinerama" ,libxinerama) ("libxkbcommon" ,libxkbcommon) ("libxml2" ,libxml2) ("libxrandr" ,libxrandr) ("libxrender" ,libxrender) ("libxslt" ,libxslt) ("libxtst" ,libxtst) ("mtdev" ,mtdev) ("mariadb" ,mariadb) ("nss" ,nss) ("openssl" ,openssl) ("postgresql" ,postgresql) ("pulseaudio" ,pulseaudio) ("pcre2" ,pcre2) ;("sqlite" ,sqlite) ("udev" ,eudev) ("unixodbc" ,unixodbc) ("wayland" ,wayland) ("xcb-util" ,xcb-util) ("xcb-util-image" ,xcb-util-image) ("xcb-util-keysyms" ,xcb-util-keysyms) ("xcb-util-renderutil" ,xcb-util-renderutil) ("xcb-util-wm" ,xcb-util-wm) ("zlib" ,zlib) ;; Required for QDoc ("clang" ,clang))) (native-inputs `(("bison" ,bison) ("flex" ,flex) ("gperf" ,gperf) ("perl" ,perl) ("pkg-config" ,pkg-config) ("python" ,python-2) ("ruby" ,ruby) ("which" ,(@ (gnu packages base) which)))) (arguments `(;;#:parallel-build? #f ; Triggers race condition in qtbase module on Hydra. #:phases (modify-phases %standard-phases (add-after 'unpack 'set-environment (lambda* (#:key inputs outputs #:allow-other-keys) (let ((clang (assoc-ref inputs "clang"))) (setenv "LLVM_INSTALL_DIR" clang)) #t)) (add-after 'configure 'patch-bin-sh (lambda _ (substitute* '("qtbase/configure" "qtbase/mkspecs/features/qt_functions.prf" "qtbase/qmake/library/qmakebuiltins.cpp") (("/bin/sh") (which "sh"))) #t)) (replace 'configure (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out")) (examples (assoc-ref outputs "examples")) (doc (assoc-ref outputs "doc"))) (substitute* '("configure" "qtbase/configure") (("/bin/pwd") (which "pwd"))) (substitute* "qtbase/src/corelib/global/global.pri" (("/bin/ls") (which "ls"))) ;; do not pass "--enable-fast-install", which makes the ;; configure process fail (zero? (system* "./configure" "-verbose" "-prefix" out "-docdir" (string-append doc "/share/doc/qt5") "-headerdir" (string-append out "/include/qt5") "-archdatadir" (string-append out "/lib/qt5") "-datadir" (string-append out "/share/qt5") "-examplesdir" (string-append examples "/share/doc/qt5/examples") ; 151MiB "-opensource" "-confirm-license" ;; These features require higher versions of Linux than the ;; minimum version of the glibc. See ;; src/corelib/global/minimum-linux_p.h. By disabling these ;; features Qt5 applications can be used on the oldest ;; kernels that the glibc supports, including the RHEL6 ;; (2.6.32) and RHEL7 (3.10) kernels. "-no-feature-getentropy" ; requires Linux 3.17 "-no-feature-renameat2" ; requires Linux 3.16 ;; Do not build examples; for the time being, we ;; prefer to save the space and build time. "-no-compile-examples" ;; Most "-system-..." are automatic, but some use ;; the bundled copy by default. ;"-system-sqlite" "-system-harfbuzz" "-system-pcre" ;; explicitly link with openssl instead of dlopening it "-openssl-linked" ;; explicitly link with dbus instead of dlopening it "-dbus-linked" ;; don't use the precompiled headers "-no-pch" ;; drop special machine instructions not supported ;; on all instances of the target ,@(if (string-prefix? "x86_64" (or (%current-target-system) (%current-system))) '() '("-no-sse2")) "-no-mips_dsp" "-no-mips_dspr2"))))) (add-after 'install 'patch-mkspecs (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (archdata (string-append out "/lib/qt5")) (mkspecs (string-append archdata "/mkspecs")) (qt_config.prf (string-append mkspecs "/features/qt_config.prf"))) ;; For each Qt module, let `qmake' uses search paths in the ;; module directory instead of all in QT_INSTALL_PREFIX. (substitute* qt_config.prf (("\\$\\$\\[QT_INSTALL_HEADERS\\]") "$$clean_path($$replace(dir, mkspecs/modules, ../../include/qt5))") (("\\$\\$\\[QT_INSTALL_LIBS\\]") "$$clean_path($$replace(dir, mkspecs/modules, ../../lib))") (("\\$\\$\\[QT_HOST_LIBS\\]") "$$clean_path($$replace(dir, mkspecs/modules, ../../lib))") (("\\$\\$\\[QT_INSTALL_BINS\\]") "$$clean_path($$replace(dir, mkspecs/modules, ../../bin))")) ;; Searches Qt tools in the current PATH instead of QT_HOST_BINS. (substitute* (string-append mkspecs "/features/qt_functions.prf") (("cmd = \\$\\$\\[QT_HOST_BINS\\]/\\$\\$2") "cmd = $$system(which $${2}.pl 2>/dev/null || which $${2})")) ;; Resolve qmake spec files within qtbase by absolute paths. (substitute* (map (lambda (file) (string-append mkspecs "/features/" file)) '("device_config.prf" "moc.prf" "qt_build_config.prf" "qt_config.prf" "winrt/package_manifest.prf")) (("\\$\\$\\[QT_HOST_DATA/get\\]") archdata) (("\\$\\$\\[QT_HOST_DATA/src\\]") archdata)) #t))) (add-after 'unpack 'patch-paths ;; Use the absolute paths for dynamically loaded libs, otherwise ;; the lib will be searched in LD_LIBRARY_PATH which typically is ;; not set in guix. (lambda* (#:key inputs #:allow-other-keys) ;; libresolve (let ((glibc (assoc-ref inputs ,(if (%current-target-system) "cross-libc" "libc")))) (substitute* '("qtbase/src/network/kernel/qdnslookup_unix.cpp" "qtbase/src/network/kernel/qhostinfo_unix.cpp") (("^\\s*(lib.setFileName\\(QLatin1String\\(\")(resolv\"\\)\\);)" _ a b) (string-append a glibc "/lib/lib" b)))) ;; X11/locale (compose path) (substitute* "qtbase/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp" ;; Don't search in /usr/…/X11/locale, … (("^\\s*m_possibleLocations.append\\(QStringLiteral\\(\"/usr/.*/X11/locale\"\\)\\);" line) (string-append "// " line)) ;; … but use libx11's path (("^\\s*(m_possibleLocations.append\\(QStringLiteral\\()X11_PREFIX \"(/.*/X11/locale\"\\)\\);)" _ a b) (string-append a "\"" (assoc-ref inputs "libx11") b))) ;; libGL (substitute* "qtbase/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp" (("^\\s*(QLibrary lib\\(QLatin1String\\(\")(GL\"\\)\\);)" _ a b) (string-append a (assoc-ref inputs "mesa") "/lib/lib" b))) ;; libXcursor (substitute* "qtbase/src/plugins/platforms/xcb/qxcbcursor.cpp" (("^\\s*(QLibrary xcursorLib\\(QLatin1String\\(\")(Xcursor\"\\), 1\\);)" _ a b) (string-append a (assoc-ref inputs "libxcursor") "/lib/lib" b)) (("^\\s*(xcursorLib.setFileName\\(QLatin1String\\(\")(Xcursor\"\\)\\);)" _ a b) (string-append a (assoc-ref inputs "libxcursor") "/lib/lib" b))) #t)) (add-after 'install 'build-doc (lambda* (#:key inputs outputs make-flags #:allow-other-keys) (let ((out (assoc-ref outputs "out")) (doc (assoc-ref outputs "doc"))) ;; qdoc fails without these, see QTBUG-67925 ;; Can't use absolute path as it causes reference cycle between doc and out. ;; (setenv "QT_INSTALL_HEADERS" (string-append out "/include/qt5")) (setenv "QT_INSTALL_HEADERS" "include/qt5") (setenv "QT_INSTALL_DOCS" (string-append doc "/share/doc/qt5"))) (apply invoke "make" "docs" make-flags))) (add-after 'build-doc 'install-doc (lambda _ (invoke "make" "install_docs")))))) (native-search-paths (list (search-path-specification (variable "QMAKEPATH") (files '("lib/qt5"))) (search-path-specification (variable "QML2_IMPORT_PATH") (files '("lib/qt5/qml"))) (search-path-specification (variable "QT_PLUGIN_PATH") (files '("lib/qt5/plugins"))) (search-path-specification (variable "XDG_DATA_DIRS") (files '("share"))) (search-path-specification (variable "XDG_CONFIG_DIRS") (files '("etc/xdg"))))) (home-page "https://www.qt.io/") (synopsis "Cross-platform GUI library") (description "Qt is a cross-platform application and UI framework for developers using C++ or QML, a CSS & JavaScript like language.") (license (list license:lgpl2.1 license:lgpl3)) ;; Qt 4: 'QBasicAtomicPointer' leads to build failures on MIPS; ;; see . ;; Qt 5: assembler error; see . (supported-systems (delete "mips64el-linux" %supported-systems)))) (define-public qtcreator (package (name "qtcreator") (version "4.7.0") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qtcreator/4.7/" version "/qt-creator-opensource-src-" version ".tar.xz")) (sha256 ;; (base32 "1k23i1qsw6d06sy7g0vd699rbvwv6vbw211fy0nn0705a5zndbxv") ; 4.6.2 (base32 "16vm1gcq5g3zpcq21xdn31drzlar2hm5583kmkg6adnlz05qf6ab")))) ; 4.7.0 (build-system gnu-build-system) (arguments `(#:make-flags (list (string-append "INSTALL_ROOT=" (assoc-ref %outputs "out"))) #:validate-runpath? #f #:phases (modify-phases %standard-phases (replace 'configure (lambda* (#:key inputs outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out")) (clang (assoc-ref inputs "clang")) (llvm (assoc-ref inputs "llvm"))) (substitute* "src/shared/clang/clang_installation.pri" (("\\$\\$system\\(\\$\\$llvm_config --libdir, lines\\)") (string-append clang "/lib")) (("\\$\\$system\\(\\$\\$llvm_config --includedir, lines\\)") (string-append clang "/include"))) (invoke "qmake" (string-append "LLVM_INSTALL_DIR=" llvm))))) (add-after 'install 'build-doc (lambda* (#:key make-flags #:allow-other-keys) (apply invoke "make" "docs" make-flags))) (add-after 'build-doc 'install-doc (lambda* (#:key make-flags #:allow-other-keys) (apply invoke "make" "install_docs" make-flags)))))) (native-inputs `(("which" ,which))) (inputs `(("clang" ,clang) ("llvm" ,llvm) ("qt" ,qt))) (home-page "https://www.qt.io/ide/") (synopsis "Cross-platform IDE for Qt") (description "Qt Creator is a cross-platform IDE (integrated development environment) tailored to the needs of Qt developers.") (license license:gpl3))) ;; Обернуть qtcreator так, чтобы он видел GCC и Qt из Guix. (define-public qtcreator-wrapped (package (inherit qtcreator) (name "qtcreator-wrapped") (inputs `(("gcc-toolchain" ,gcc-toolchain-8) ,@(package-inputs qtcreator))) (arguments (substitute-keyword-arguments (package-arguments qtcreator) ((#:phases phases) `(modify-phases ,phases (add-after 'install 'wrap-program (lambda* (#:key inputs outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (qt (assoc-ref inputs "qt")) (gcc (assoc-ref inputs "gcc-toolchain"))) (wrap-program (string-append out "/bin/qtcreator") `("PATH" ":" prefix (,(string-append qt "/bin") ,(string-append gcc "/bin"))) `("CPATH" ":" prefix (,(string-append gcc "/include"))) `("LIBRARY_PATH" ":" prefix (,(string-append gcc "/lib"))))) #t))))))))