summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu/packages/game-development.scm293
1 files changed, 146 insertions, 147 deletions
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 4377654f8f..04f2b061fc 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -48,6 +48,7 @@
   #:use-module (ice-9 match)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
+  #:use-module (guix gexp)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix svn-download)
@@ -1352,156 +1353,154 @@ are only used to bootstrap it.")
     (name "renpy")
     (build-system python-build-system)
     (arguments
-     `(#:tests? #f ; see python-renpy
-       #:modules ((srfi srfi-1)
+     (list
+      #:tests? #f ; see python-renpy
+      #:modules '((srfi srfi-1)
                   (guix build python-build-system)
                   (guix build utils))
-       #:imported-modules ((srfi srfi-1) ,@%python-build-system-modules)
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-commands
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (substitute* "launcher/game/choose_directory.rpy"
-               (("/usr/bin/python")
-                (search-input-file inputs "/bin/python3")))
-             (substitute* "launcher/game/front_page.rpy"
-               (("xdg-open")
-                (search-input-file inputs "/bin/xdg-open")))
-             (substitute* "launcher/game/project.rpy"
-               (("cmd = \\[ executable, \"-EO\", sys.argv\\[0\\] \\]")
-                (string-append "cmd = [ \"" (assoc-ref outputs "out")
-                               "/bin/renpy\" ]"))
-               ;; Projects are still created in the usual style, so we need
-               ;; to adjust the path.
-               (("cmd.append\\(self.path\\)")
-                "cmd.append(self.path + \"/game\")"))))
-         (add-after 'unpack 'drop-game-from-paths
-           (lambda _
-             (substitute* (list "launcher/game/gui7.rpy"
-                                "launcher/game/gui7/images.py")
-               ((", \"game\",") ","))
-             #t))
-         (add-before 'build 'start-xserver
-           (lambda* (#:key inputs native-inputs #:allow-other-keys)
-             (let ((Xvfb (search-input-file (or native-inputs inputs)
-                                            "/bin/Xvfb")))
-               (setenv "HOME" (getcwd))
-               (system (format #f "~a :1 &" Xvfb))
-               (setenv "DISPLAY" ":1"))))
-         (replace 'build
-           (lambda _
-             (invoke "python" "renpy.py" "launcher" "quit")
-             (invoke "python" "renpy.py" "the_question" "quit")
-             (invoke "python" "renpy.py" "tutorial" "quit")))
-         (replace 'install
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             ;; Here we install our custom renpy program.
-             ;; After finishing this step, "out" will have the following:
-             ;; |-- bin/renpy
-             ;; `-- share/renpy ; i.e. path_to_renpy_base()
-             ;;     |-- common
-             ;;     `-- gui
-             ;;
-             ;; Note that common shares the source files that would be installed
-             ;; by python-renpy (which are instead deleted from that package),
-             ;; but also contains their byte-compiled versions.
-             ;; On other systems, renpy_base would point to site-packages or
-             ;; even somewhere in /opt.
-             ;; The former approach is not as straightforward as it seems
-             ;; -- it causes renpy to load files twice for some weird reason --
-             ;; and the latter is impossible on Guix. Hence the detour through
-             ;; share/renpy and the custom renpy program.
-             ;;
-             ;; As a convention, other games should be installed as
-             ;; subdirectories of share/renpy in their respective outputs as
-             ;; well. This differs from the traditional layout, which is
-             ;; roughly the following:
-             ;; `-- Super Awesome Game
-             ;;     |-- game       ; <- the folder we actually want
-             ;;     |-- lib        ; compiled renpy module and dependencies
-             ;;     |-- renpy      ; yet another copy of Ren'py's code
-             ;;     |   |-- common ; the common folder from above
-             ;;     |   `-- ...    ; Python code (source + compiled)
-             ;;     |-- Super Awesome Game.py
-             ;;     `-- Super Awesome Game.sh
-             (let* ((out (assoc-ref outputs "out"))
-                    (bin/renpy (string-append out "/bin/renpy")))
-               (copy-recursively "renpy/common"
-                                 (string-append out "/share/renpy/common"))
-               (copy-recursively "gui"
-                                 (string-append out "/share/renpy/gui"))
-
-               (mkdir-p (string-append out "/bin"))
-               (copy-file (assoc-ref inputs "renpy.in") bin/renpy)
-               (substitute* bin/renpy
-                 (("@PYTHON@") (search-input-file inputs "bin/python3"))
-                 (("@RENPY_BASE@") (string-append out "/share/renpy")))
-               (chmod bin/renpy #o755))))
-
-         (add-after 'install 'install-games
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (define renpy (assoc-ref outputs "out"))
-             ;; TODO: We should offer a renpy-build-system to make the
-             ;; installation of Ren'py games easier.
-             (define* (install-renpy-game #:key output game name (renpy renpy)
-                                          #:allow-other-keys)
-               (let* ((name (or name (basename game)))
-                      (launcher (string-append output "/bin/renpy-" name))
-                      (share (string-append output "/share/renpy/" name)))
-                 (copy-recursively (string-append game "/game") share)
-                 (mkdir-p (string-append output "/bin"))
-                 (with-output-to-file launcher
-                   (lambda ()
-                     (format #t
-                             "#!~a~%~a ~a \"$@\""
-                             (search-input-file inputs "/bin/bash")
-                             (string-append renpy "/bin/renpy")
-                             share)))
-                 (chmod launcher #o755)))
-
-             (install-renpy-game #:output (assoc-ref outputs "out")
-                                 #:game "launcher")
-
-             (install-renpy-game #:output (assoc-ref outputs "the-question")
-                                 #:game "the_question"
-                                 #:name "the-question")
-
-             (install-renpy-game #:output (assoc-ref outputs "tutorial")
-                                 #:game "tutorial")))
-         (replace 'wrap
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out"))
-                   (site (string-append "/lib/python"
-                                        (python-version
-                                         (assoc-ref inputs "python"))
-                                        "/site-packages")))
-               (wrap-program (string-append out "/bin/renpy")
-                 `("GUIX_PYTHONPATH" =
-                   (,@(delete-duplicates
-                       (map
-                        (lambda (store-path)
-                          (string-append store-path site))
-                        (cons (assoc-ref outputs "out")
-                              (map cdr
-                                   (filter
-                                    (lambda (input)
-                                      (string-prefix? "python" (car input)))
-                                    inputs))))))))))))))
-    (inputs
-     `(("bash-minimal" ,bash-minimal)
-       ("renpy.in" ,(search-auxiliary-file "renpy/renpy.in"))
-       ("python-pefile" ,python-pefile)
-       ("python-requests" ,python-requests)
-       ("python-renpy" ,python-renpy)
-       ("python:tk" ,python "tk")
-       ("python-six" ,python-six)
-       ("python" ,python) ; for ‘fix-commands’ and ‘wrap’
-       ("xdg-utils" ,xdg-utils)))
+      #:imported-modules `((srfi srfi-1) ,@%python-build-system-modules)
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'fix-commands
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (substitute* "launcher/game/choose_directory.rpy"
+                (("/usr/bin/python")
+                 (search-input-file inputs "/bin/python3")))
+              (substitute* "launcher/game/front_page.rpy"
+                (("xdg-open")
+                 (search-input-file inputs "/bin/xdg-open")))
+              (substitute* "launcher/game/project.rpy"
+                (("cmd = \\[ executable, \"-EO\", sys.argv\\[0\\] \\]")
+                 (string-append "cmd = [ \"" (assoc-ref outputs "out")
+                                "/bin/renpy\" ]"))
+                ;; Projects are still created in the usual style, so we need
+                ;; to adjust the path.
+                (("cmd.append\\(self.path\\)")
+                 "cmd.append(self.path + \"/game\")"))))
+          (add-after 'unpack 'drop-game-from-paths
+            (lambda _
+              (substitute* (list "launcher/game/gui7.rpy"
+                                 "launcher/game/gui7/images.py")
+                ((", \"game\",") ","))
+              #t))
+          (add-before 'build 'start-xserver
+            (lambda* (#:key inputs native-inputs #:allow-other-keys)
+              (let ((Xvfb (search-input-file (or native-inputs inputs)
+                                             "/bin/Xvfb")))
+                (setenv "HOME" (getcwd))
+                (system (format #f "~a :1 &" Xvfb))
+                (setenv "DISPLAY" ":1"))))
+          (replace 'build
+            (lambda _
+              (invoke "python" "renpy.py" "launcher" "quit")
+              (invoke "python" "renpy.py" "the_question" "quit")
+              (invoke "python" "renpy.py" "tutorial" "quit")))
+          (replace 'install
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              ;; Here we install our custom renpy program.
+              ;; After finishing this step, "out" will have the following:
+              ;; |-- bin/renpy
+              ;; `-- share/renpy ; i.e. path_to_renpy_base()
+              ;;     |-- common
+              ;;     `-- gui
+              ;;
+              ;; Note that common shares the source files that would be installed
+              ;; by python2-renpy (which are instead deleted from that package),
+              ;; but also contains their byte-compiled versions.
+              ;; On other systems, renpy_base would point to site-packages or
+              ;; even somewhere in /opt.
+              ;; The former approach is not as straightforward as it seems
+              ;; -- it causes renpy to load files twice for some weird reason --
+              ;; and the latter is impossible on Guix. Hence the detour through
+              ;; share/renpy and the custom renpy program.
+              ;;
+              ;; As a convention, other games should be installed as
+              ;; subdirectories of share/renpy in their respective outputs as
+              ;; well. This differs from the traditional layout, which is
+              ;; roughly the following:
+              ;; `-- Super Awesome Game
+              ;;     |-- game       ; <- the folder we actually want
+              ;;     |-- lib        ; compiled renpy module and dependencies
+              ;;     |-- renpy      ; yet another copy of Ren'py's code
+              ;;     |   |-- common ; the common folder from above
+              ;;     |   `-- ...    ; Python code (source + compiled)
+              ;;     |-- Super Awesome Game.py
+              ;;     `-- Super Awesome Game.sh
+              (let* ((out (assoc-ref outputs "out"))
+                     (bin/renpy (string-append out "/bin/renpy")))
+                (copy-recursively "renpy/common"
+                                  (string-append out "/share/renpy/common"))
+                (copy-recursively "gui"
+                                  (string-append out "/share/renpy/gui"))
+
+                (mkdir-p (string-append out "/bin"))
+                (copy-file #$(local-file (search-auxiliary-file "renpy/renpy.in"))
+                           bin/renpy)
+                (substitute* bin/renpy
+                  (("@PYTHON@") (search-input-file inputs "bin/python3"))
+                  (("@RENPY_BASE@") (string-append out "/share/renpy")))
+                (chmod bin/renpy #o755))))
+
+          (add-after 'install 'install-games
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (define renpy (assoc-ref outputs "out"))
+              ;; TODO: We should offer a renpy-build-system to make the
+              ;; installation of Ren'py games easier.
+              (define* (install-renpy-game #:key output game name (renpy renpy)
+                                           #:allow-other-keys)
+                (let* ((name (or name (basename game)))
+                       (launcher (string-append output "/bin/renpy-" name))
+                       (share (string-append output "/share/renpy/" name)))
+                  (copy-recursively (string-append game "/game") share)
+                  (mkdir-p (string-append output "/bin"))
+                  (with-output-to-file launcher
+                    (lambda ()
+                      (format #t
+                              "#!~a~%~a ~a \"$@\""
+                              (search-input-file inputs "/bin/bash")
+                              (string-append renpy "/bin/renpy")
+                              share)))
+                  (chmod launcher #o755)))
+
+              (install-renpy-game #:output (assoc-ref outputs "out")
+                                  #:game "launcher")
+
+              (install-renpy-game #:output (assoc-ref outputs "the-question")
+                                  #:game "the_question"
+                                  #:name "the-question")
+
+              (install-renpy-game #:output (assoc-ref outputs "tutorial")
+                                  #:game "tutorial")))
+          (replace 'wrap
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (let ((out (assoc-ref outputs "out"))
+                    (site (string-append "/lib/python"
+                                         (python-version
+                                          (assoc-ref inputs "python"))
+                                         "/site-packages")))
+                (wrap-program (string-append out "/bin/renpy")
+                  `("GUIX_PYTHONPATH" =
+                    (,@(delete-duplicates
+                        (map
+                         (lambda (store-path)
+                           (string-append store-path site))
+                         (cons (assoc-ref outputs "out")
+                               (map cdr
+                                    (filter
+                                     (lambda (input)
+                                       (string-prefix? "python" (car input)))
+                                     inputs))))))))))))))
+    (inputs (list bash-minimal
+                  python
+                  python-pefile
+                  python-requests
+                  python-renpy
+                  python-six
+                  `(,python "tk")
+                  xdg-utils))
     (propagated-inputs '())
-    (native-inputs
-     (list xorg-server-for-tests))
-    (outputs
-     (list "out" "tutorial" "the-question"))
+    (native-inputs (list xorg-server-for-tests))
+    (outputs (list "out" "tutorial" "the-question"))
     (home-page "https://www.renpy.org/")
     (synopsis "Visual Novel Engine")
     (description "Ren'Py is a visual novel engine that helps you use words,