;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2015 Andreas Enge ;;; Copyright © 2013 Joshua Grant ;;; Copyright © 2014 David Thompson ;;; Copyright © 2014, 2015 Mark H Weaver ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu packages gl) #:use-module (ice-9 match) #:use-module (guix build utils) #:use-m
aboutsummaryrefslogtreecommitdiff
blob: 953b132ef7be4fba1c818a8231e904df4f8b924d (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 Jakob L. Kreuze <zerodaysfordays@sdf.org>
;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org>
;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu tests linux-modules)
  #:use-module (gnu packages linux)
  #:use-module (gnu services)
  #:use-module (gnu services linux)
  #:use-module (gnu system)
  #:use-module (gnu system vm)
  #:use-module (gnu tests)
  #:use-module (guix derivations)
  #:use-module (guix gexp)
  #:use-module (guix modules)
  #:use-module (guix packages)
  #:use-module (guix monads)
  #:use-module (guix store)
  #:use-module (guix utils)
  #:export (%test-loadable-kernel-modules-0
            %test-loadable-kernel-modules-1
            %test-loadable-kernel-modules-2))

;;; Commentary:
;;;
;;; Test <operating-system> kernel-loadable-modules.
;;;
;;; Code:

(define* (modules-loaded?-program os modules)
  "Return an executable store item that, upon being evaluated, will verify
that MODULES are actually loaded."
  (program-file
   "verify-kernel-modules-loaded.scm"
   #~(begin
     (use-modules (ice-9 rdelim)
                  (ice-9 popen)
                  (srfi srfi-1)
                  (srfi srfi-13))
     (let* ((port (open-input-pipe (string-append #$kmod "/bin/lsmod")))
            (lines (string-split (read-string port) #\newline))
            (separators (char-set #\space #\tab))
            (modules (map (lambda (line)
                            (string-take line
                                         (or (string-index line separators)
                                             0)))
                          lines))
            (status (close-pipe port)))
       (and (= status 0)
            (and-map (lambda (module)
                       (member module modules string=?))
                     '#$modules))))))

(define* (run-loadable-kernel-modules-test module-packages module-names)
  "Run a test of an OS having MODULE-PACKAGES, and verify that MODULE-NAMES
are loaded in memory."
  (define os
    (marionette-operating-system
     (operating-system
      (inherit (simple-operating-system))
      (services (cons (service kernel-module-loader-service-type module-names)
                      (operating-system-user-services
                       (simple-operating-system))))
      (kernel-loadable-modules module-packages))
     #:imported-modules '((guix combinators))))
  (define vm (virtual-machine os))
  (define (test script)
    (with-imported-modules '((gnu build marionette))
      #~(begin
          (use-modules (gnu build marionette)
                       (srfi srfi-64))
          (define marionette
            (make-marionette (list #$vm)))
          (mkdir #$output)
          (chdir #$output)
          (test-begin "loadable-kernel-modules")
          (test-assert "script successfully evaluated"
            (marionette-eval
             '(primitive-load #$script)
             marionette))
          (test-end)
          (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
  (gexp->derivation "loadable-kernel-modules"
                    (test (modules-loaded?-program os module-names))))

(define %test-loadable-kernel-modules-0
  (system-test
   (name "loadable-kernel-modules-0")
   (description "Tests loadable kernel modules facility of <operating-system>
with no extra modules.")
   (value (run-loadable-kernel-modules-test '() '()))))

(define %test-loadable-kernel-modules-1
  (system-test
   (name "loadable-kernel-modules-1")
   (description "Tests loadable kernel modules facility of <operating-system>
with one extra module.")
   (value (run-loadable-kernel-modules-test
           (list ddcci-driver-linux)
           '("ddcci")))))

(define %test-loadable-kernel-modules-2
  (system-test
   (name "loadable-kernel-modules-2")
   (description "Tests loadable kernel modules facility of <operating-system>
with two extra modules.")
   (value (run-loadable-kernel-modules-test
           (list acpi-call-linux-module
                 (package
                   (inherit ddcci-driver-linux)
                   (arguments
                    `(#:linux #f
                      ,@(strip-keyword-arguments '(#:linux)
                                                 (package-arguments
                                                  ddcci-driver-linux))))))
           '("acpi_call" "ddcci")))))
"/mesa-demos-" version ".tar.bz2")) (sha256 (base32 "14msj0prbl3ljwd24yaqv9pz1xzicdmqgg616xxlppbdh6syrgz4")))) (define-public mesa-utils (package (name "mesa-utils") (version "8.2.0") (source (mesa-demos-source version)) (build-system gnu-build-system) (inputs `(("mesa" ,mesa) ("glut" ,freeglut) ("glew" ,glew))) (native-inputs `(("pkg-config" ,pkg-config))) (arguments '(#:phases (modify-phases %standard-phases (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (mkdir-p (string-append out "/bin")) (for-each (lambda (file) (copy-file file (string-append out "/bin/" (basename file)))) '("src/xdemos/glxdemo" "src/xdemos/glxgears" "src/xdemos/glxinfo" "src/xdemos/glxheads")))))))) (home-page "http://mesa3d.org/") (synopsis "Utility tools for Mesa") (description "The mesa-utils package contains several utility tools for Mesa: glxdemo, glxgears, glxheads, and glxinfo.") ;; glxdemo is public domain; others expat. (license (list l:expat l:public-domain)))) (define-public glew (package (name "glew") (version "1.11.0") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/glew/glew-" version ".tgz")) (sha256 (base32 "1mhkllxz49l1x680dmzrv2i82qjrq017sykah3xc90f2d8qcxfv9")) (modules '((guix build utils))) (snippet '(substitute* "config/Makefile.linux" (("= cc") "= gcc") (("/lib64") "/lib"))))) (build-system gnu-build-system) (arguments '(#:phases (alist-delete 'configure %standard-phases) #:make-flags (list (string-append "GLEW_PREFIX=" (assoc-ref %outputs "out")) (string-append "GLEW_DEST=" (assoc-ref %outputs "out"))) #:tests? #f)) ;no 'check' target (inputs `(("libxi" ,libxi) ("libxmu" ,libxmu) ("libx11" ,libx11) ("mesa" ,mesa))) ;; includes . (propagated-inputs `(("glu" ,glu))) (home-page "http://glew.sourceforge.net/") (synopsis "OpenGL extension loading library for C and C++") (description "The OpenGL Extension Wrangler Library (GLEW) is a C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform. OpenGL core and extension functionality is exposed in a single header file.") (license l:bsd-3))) (define-public guile-opengl (package (name "guile-opengl") (version "0.1.0") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/guile-opengl/guile-opengl-" version ".tar.gz")) (sha256 (base32 "13qfx4xh8baryxqrv986l848ygd0piqwm6s2s90pxk9c0m9vklim")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("guile" ,guile-2.0) ("mesa" ,mesa) ("glu" ,glu) ("freeglut" ,freeglut))) (arguments '(#:phases (alist-cons-before 'build 'patch-dynamic-link (lambda* (#:key inputs outputs #:allow-other-keys) (define (dynamic-link-substitute file lib input) (substitute* file (("dynamic-link \"lib([a-zA-Z]+)\"" _ lib) (string-append "dynamic-link \"" (assoc-ref inputs input) "/lib/lib" lib "\"")))) ;; Replace dynamic-link calls for libGL, libGLU, and ;; libglut with absolute paths to the store. (dynamic-link-substitute "glx/runtime.scm" "GL" "mesa") (dynamic-link-substitute "glu/runtime.scm" "GLU" "glu") (dynamic-link-substitute "glut/runtime.scm" "glut" "freeglut")) %standard-phases))) (home-page "http://gnu.org/s/guile-opengl") (synopsis "Guile binding for the OpenGL graphics API") (description "Guile-OpenGL is a library for Guile that provides bindings to the OpenGL graphics API.") (license l:lgpl3+))) (define-public libepoxy (package (name "libepoxy") (version "1.2") (source (origin (method url-fetch) (uri (string-append "https://github.com/anholt/libepoxy/archive/v" version ".tar.gz")) (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 "1xp8g6b7xlbym2rj4vkbl6xpb7ijq7glpv656mc7k9b01x22ihs2")))) (arguments `(#:phases (alist-cons-after 'unpack 'autoreconf (lambda _ (zero? (system* "autoreconf" "-vif"))) (alist-cons-before 'configure 'patch-paths (lambda* (#:key inputs #:allow-other-keys) (let ((python (assoc-ref inputs "python")) (mesa (assoc-ref inputs "mesa"))) (substitute* "src/gen_dispatch.py" (("/usr/bin/env python") python)) (substitute* (find-files "." "\\.[ch]$") (("libGL.so.1") (string-append mesa "/lib/libGL.so.1")) (("libEGL.so.1") (string-append mesa "/lib/libEGL.so.1"))) ;; XXX On armhf systems, we must add "GLIBC_2.4" to the list of ;; versions in test/dlwrap.c:dlwrap_real_dlsym. It would be ;; better to make this a normal patch, but for now we do it here ;; to prevent rebuilding on other platforms. ,@(if (string-prefix? "arm" (or (%current-target-system) (%current-system))) '((substitute* '"test/dlwrap.c" (("\"GLIBC_2\\.0\"") "\"GLIBC_2.0\", \"GLIBC_2.4\""))) '()) #t)) %standard-phases)))) (build-system gnu-build-system) (native-inputs `(("autoconf" ,autoconf) ("automake" ,automake) ("libtool" ,libtool) ("pkg-config" ,pkg-config) ("python" ,python))) (inputs `(("mesa" ,mesa))) (home-page "http://github.com/anholt/libepoxy/") (synopsis "A library for handling OpenGL function pointer management") (description "A library for handling OpenGL function pointer management.") (license l:x11))) (define-public soil (package (name "soil") (version "1.0.7") (source (origin (method url-fetch) ;; No versioned archive available. (uri "http://www.lonesock.net/files/soil.zip") (sha256 (base32 "00gpwp9dldzhsdhksjvmbhsd2ialraqbv6v6dpikdmpncj6mnc52")))) (build-system gnu-build-system) (arguments '(#:tests? #f ; no tests #:phases (modify-phases %standard-phases (delete 'configure) (add-before 'build 'init-build (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (setenv "CFLAGS" "-fPIC") ; needed for shared library ;; Use alternate Makefile (copy-file "projects/makefile/alternate Makefile.txt" "src/Makefile") (chdir "src") (substitute* '("Makefile") (("INCLUDEDIR = /usr/include/SOIL") (string-append "INCLUDEDIR = " out "/include/SOIL")) (("LIBDIR = /usr/lib") (string-append "LIBDIR = " out "/lib")) ;; Remove these flags from 'install' commands. (("-o root -g root") "")))))))) (native-inputs `(("unzip" ,unzip))) (inputs `(("mesa" ,mesa))) (home-page "http://www.lonesock.net/soil.html") (synopsis "OpenGL texture loading library") (description "SOIL is a tiny C library used primarily for uploading textures into OpenGL.") (license l:public-domain)))