GNU bug report logs - #46053
[PATCH 0/2] Add Ren'py build system

Previous Next

Package: guix-patches;

Reported by: Leo Prikler <leo.prikler <at> student.tugraz.at>

Date: Sat, 23 Jan 2021 13:41:02 UTC

Severity: normal

Tags: patch

Done: Leo Prikler <leo.prikler <at> student.tugraz.at>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 46053 in the body.
You can then email your comments to 46053 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#46053; Package guix-patches. (Sat, 23 Jan 2021 13:41:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Leo Prikler <leo.prikler <at> student.tugraz.at>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Sat, 23 Jan 2021 13:41:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Leo Prikler <leo.prikler <at> student.tugraz.at>
To: guix-patches <at> gnu.org
Subject: [PATCH 0/2] Add Ren'py build system
Date: Sat, 23 Jan 2021 14:40:18 +0100
Hi Guix,

a proper Ren'py build system had been on my TODO list ever since I've
packaged it back in 2019, but I've so far been too lazy to actually
create one.  While I'm happy to announce, that this is no longer the
case, there are still a number of things, that can be improved in our
Ren'py package and build system.

This series contains two patches.  The first adds the build system, the
second a package example for "The Question".  Since "The Question" is
already an output of Ren'py, I don't see much value in this patch other
than for explanatory purposes, so I don't think I'll commit that one. 
Instead, I'll probably redefine Ren'py once the first patch is merged.
I'm building this series on top of #45736, so things might be a bit
different on master, but I hope it works out regardless.

Regards,
Leo





Information forwarded to guix-patches <at> gnu.org:
bug#46053; Package guix-patches. (Sat, 23 Jan 2021 13:48:01 GMT) Full text and rfc822 format available.

Message #8 received at 46053 <at> debbugs.gnu.org (full text, mbox):

From: Leo Prikler <leo.prikler <at> student.tugraz.at>
To: 46053 <at> debbugs.gnu.org
Subject: [PATCH 1/2] build-system: Add renpy-build-system.
Date: Sat, 23 Jan 2021 14:46:55 +0100
* guix/build/renpy-build-system.scm: New file.
* guix/build-system/renpy.scm: New file.
* Makefile.am (MODULES): Add them here.
---
 Makefile.am                       |   2 +
 guix/build-system/renpy.scm       | 131 ++++++++++++++++++++++++++++++
 guix/build/renpy-build-system.scm |  99 ++++++++++++++++++++++
 3 files changed, 232 insertions(+)
 create mode 100644 guix/build-system/renpy.scm
 create mode 100644 guix/build/renpy-build-system.scm

diff --git a/Makefile.am b/Makefile.am
index 8a8133d669..c2d71ca5be 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -150,6 +150,7 @@ MODULES =					\
   guix/build-system/node.scm			\
   guix/build-system/perl.scm			\
   guix/build-system/python.scm			\
+  guix/build-system/renpy.scm			\
   guix/build-system/ocaml.scm			\
   guix/build-system/qt.scm			\
   guix/build-system/waf.scm			\
@@ -205,6 +206,7 @@ MODULES =					\
   guix/build/ocaml-build-system.scm		\
   guix/build/qt-build-system.scm		\
   guix/build/r-build-system.scm			\
+  guix/build/renpy-build-system.scm			\
   guix/build/rakudo-build-system.scm		\
   guix/build/ruby-build-system.scm		\
   guix/build/scons-build-system.scm		\
diff --git a/guix/build-system/renpy.scm b/guix/build-system/renpy.scm
new file mode 100644
index 0000000000..35edc0056d
--- /dev/null
+++ b/guix/build-system/renpy.scm
@@ -0,0 +1,131 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Leo Prikler <leo.prikler <at> student.tugraz.at>
+;;;
+;;; 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 (guix build-system renpy)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix memoization)
+  #:use-module (guix packages)
+  #:use-module (guix derivations)
+  #:use-module (guix search-paths)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (%renpy-build-system-modules
+            default-renpy
+            renpy-build
+            renpy-build-system))
+
+(define (default-renpy)
+  "Return the default Ren'py package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((module (resolve-interface '(gnu packages game-development))))
+    (module-ref module 'renpy)))
+
+(define %renpy-build-system-modules
+  ;; Build-side modules imported by default.
+  `((guix build renpy-build-system)
+    (guix build json)
+    (guix build python-build-system)
+    ,@%gnu-build-system-modules))
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (renpy (default-renpy))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME."
+  (define private-keywords
+    '(#:source #:target #:renpy #:inputs #:native-inputs))
+
+  (and (not target)                               ;XXX: no cross-compilation
+       (bag
+         (name name)
+         (system system)
+         (host-inputs `(,@(if source
+                              `(("source" ,source))
+                              '())
+                        ,@inputs
+
+                        ;; Keep the standard inputs of 'gnu-build-system'.
+                        ,@(standard-packages)))
+         (build-inputs `(("renpy" ,renpy)
+                         ,@native-inputs))
+         (outputs outputs)
+         (build renpy-build)
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define* (renpy-build store name inputs
+                       #:key
+                       (phases '(@ (guix build renpy-build-system)
+                                   %standard-phases))
+                       (configure-flags ''())
+                       (outputs '("out"))
+                       (output "out")
+                       (game "game")
+                       (search-paths '())
+                       (system (%current-system))
+                       (guile #f)
+                       (imported-modules %renpy-build-system-modules)
+                       (modules '((guix build renpy-build-system)
+                                  (guix build utils))))
+  "Build SOURCE using RENPY, and with INPUTS."
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (renpy-build #:name ,name
+                    #:source ,(match (assoc-ref inputs "source")
+                                (((? derivation? source))
+                                 (derivation->output-path source))
+                                ((source)
+                                 source)
+                                (source
+                                 source))
+                     #:configure-flags ,configure-flags
+                     #:system ,system
+                     #:phases ,phases
+                     #:outputs %outputs
+                     #:output ,output
+                     #:game ,game
+                     #:search-paths ',(map search-path-specification->sexp
+                                           search-paths)
+                     #:inputs %build-inputs)))
+
+  (define guile-for-build
+    (match guile
+      ((? package?)
+       (package-derivation store guile system #:graft? #f))
+      (#f                                         ; the default
+       (let* ((distro (resolve-interface '(gnu packages commencement)))
+              (guile  (module-ref distro 'guile-final)))
+         (package-derivation store guile system #:graft? #f)))))
+
+  (build-expression->derivation store name builder
+                                #:inputs inputs
+                                #:system system
+                                #:modules imported-modules
+                                #:outputs outputs
+                                #:guile-for-build guile-for-build))
+
+(define renpy-build-system
+  (build-system
+    (name 'renpy)
+    (description "The Ren'py build system")
+    (lower lower)))
diff --git a/guix/build/renpy-build-system.scm b/guix/build/renpy-build-system.scm
new file mode 100644
index 0000000000..464fc97b13
--- /dev/null
+++ b/guix/build/renpy-build-system.scm
@@ -0,0 +1,99 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Leo Prikler <leo.prikler <at> student.tugraz.at>
+;;;
+;;; 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 (guix build renpy-build-system)
+  #:use-module ((guix build gnu-build-system) #:prefix gnu:)
+  #:use-module ((guix build python-build-system) #:prefix python:)
+  #:use-module (guix build json)
+  #:use-module (guix build utils)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 ftw)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (%standard-phases
+            renpy-build))
+
+(define* (build #:key game #:allow-other-keys)
+  (for-each make-file-writable
+            (find-files game (lambda (pred stat)
+                               (eq? (stat:type stat) 'directory))))
+  (invoke "renpy"
+          "--json-dump" (string-append game "/renpy-build.json")
+          game
+          ;; should be "compile", but renpy wants to compile itself really
+          ;; badly if we do
+          "quit")
+  #t)
+
+(define* (install #:key outputs game (output "out") #:allow-other-keys)
+  (let* ((out (assoc-ref outputs output))
+         (json-dump (call-with-input-file (string-append game
+                                                         "/renpy-build.json")
+                      read-json))
+         (build (assoc-ref json-dump "build"))
+         (executable-name (assoc-ref build "executable_name"))
+         (directory-name (assoc-ref build "directory_name")))
+    (let ((launcher (string-append out "/bin/" executable-name))
+          (data (string-append out "/share/renpy/" directory-name)))
+      (mkdir-p (string-append out "/bin"))
+      (copy-recursively game data)
+      ;; We don't actually want the metadata to be dumped in the output
+      ;; directory
+      (delete-file (string-append data "/renpy-build.json"))
+      (call-with-output-file launcher
+        (lambda (port)
+          (format port "#!~a~%~a ~a \"$@\""
+                  (which "bash")
+                  (which "renpy")
+                  data)))
+      (chmod launcher #o755)))
+  #t)
+
+(define* (install-desktop-file #:key outputs game (output "out")
+                               #:allow-other-keys)
+  (let* ((out (assoc-ref outputs output))
+         (json-dump (call-with-input-file (string-append game
+                                                         "/renpy-build.json")
+                      read-json))
+         (build (assoc-ref json-dump "build"))
+         (directory-name (assoc-ref build "directory_name"))
+         (executable-name (assoc-ref build "executable_name")))
+    (make-desktop-entry-file
+     (string-append out "/share/applications/" executable-name ".desktop")
+     #:name (assoc-ref json-dump "name")
+     #:generic-name (assoc-ref build "display_name")
+     #:exec (string-append (which "renpy") " "
+                           out "/share/renpy/" directory-name)
+     #:categories '("Game" "Visual Novel")))
+  #t)
+
+(define %standard-phases
+  (modify-phases gnu:%standard-phases
+    (add-after 'unpack 'enable-bytecode-determinism
+      (assoc-ref python:%standard-phases 'enable-bytecode-determinism))
+    (delete 'bootstrap)
+    (delete 'configure)
+    (replace 'build build)
+    (delete 'check)
+    (replace 'install install)
+    (add-after 'install 'install-desktop-file install-desktop-file)))
+
+(define* (renpy-build #:key inputs (phases %standard-phases)
+                       #:allow-other-keys #:rest args)
+  "Build the given Ren'py package, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
-- 
2.30.0





Information forwarded to guix-patches <at> gnu.org:
bug#46053; Package guix-patches. (Sat, 23 Jan 2021 13:48:02 GMT) Full text and rfc822 format available.

Message #11 received at 46053 <at> debbugs.gnu.org (full text, mbox):

From: Leo Prikler <leo.prikler <at> student.tugraz.at>
To: 46053 <at> debbugs.gnu.org
Subject: [PATCH 2/2] gnu: Add the-question.
Date: Sat, 23 Jan 2021 14:46:56 +0100
* gnu/packages/games.scm (the-question): New variable.
---
 gnu/packages/games.scm | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index ee1571e624..8b3a617d0a 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -196,6 +196,7 @@
   #:use-module (guix build-system meson)
   #:use-module (guix build-system perl)
   #:use-module (guix build-system python)
+  #:use-module (guix build-system renpy)
   #:use-module (guix build-system qt)
   #:use-module (guix build-system scons)
   #:use-module (guix build-system trivial)
@@ -12136,3 +12137,17 @@ game FPS.")
 implemented using ncurses user interface.  An SDL graphical version is also
 available.")
     (license license:gpl3+)))
+
+(define-public the-question
+  (package
+    (name "the-question")
+    (version (package-version renpy))
+    (source (package-source renpy))
+    (build-system renpy-build-system)
+    (arguments
+     '(#:game "the_question/game"))
+    (synopsis "Ren'py example game")
+    (description "The Question is a short game demonstrating the capabilities
+of Ren'py.")
+    (home-page (package-home-page renpy))
+    (license (package-license renpy))))
-- 
2.30.0





Information forwarded to guix-patches <at> gnu.org:
bug#46053; Package guix-patches. (Sun, 24 Jan 2021 08:50:01 GMT) Full text and rfc822 format available.

Message #14 received at 46053 <at> debbugs.gnu.org (full text, mbox):

From: Nicolas Goaziou <mail <at> nicolasgoaziou.fr>
To: Leo Prikler <leo.prikler <at> student.tugraz.at>
Cc: 46053 <at> debbugs.gnu.org
Subject: Re: [bug#46053] [PATCH 0/2] Add Ren'py build system
Date: Sun, 24 Jan 2021 09:49:36 +0100
Hello,

Leo Prikler <leo.prikler <at> student.tugraz.at> writes:

> a proper Ren'py build system had been on my TODO list ever since I've
> packaged it back in 2019, but I've so far been too lazy to actually
> create one.  While I'm happy to announce, that this is no longer the
> case, there are still a number of things, that can be improved in our
> Ren'py package and build system.

That's nice. It should also be documented in the manual.

It would be nice to have a "write a build system" in the cookbook (or
the manual?) at some point.

> This series contains two patches.  The first adds the build system, the
> second a package example for "The Question".  Since "The Question" is
> already an output of Ren'py, I don't see much value in this patch other
> than for explanatory purposes, so I don't think I'll commit that one. 
> Instead, I'll probably redefine Ren'py once the first patch is merged.
> I'm building this series on top of #45736, so things might be a bit
> different on master, but I hope it works out regardless.

LGTM, in addition to #45736.

Regards,
-- 
Nicolas Goaziou




Information forwarded to guix-patches <at> gnu.org:
bug#46053; Package guix-patches. (Sun, 24 Jan 2021 10:53:02 GMT) Full text and rfc822 format available.

Message #17 received at 46053 <at> debbugs.gnu.org (full text, mbox):

From: Leo Prikler <leo.prikler <at> student.tugraz.at>
To: 46053 <at> debbugs.gnu.org
Cc: mail <at> nicolasgoaziou.fr
Subject: [PATCH v2] build-system: Add renpy-build-system.
Date: Sun, 24 Jan 2021 11:51:23 +0100
* guix/build/renpy-build-system.scm: New file.
* guix/build-system/renpy.scm: New file.
* Makefile.am (MODULES): Add them here.
* doc/guix.texi (Build Systems): Document renpy-build-system.
---
 Makefile.am                       |   2 +
 doc/guix.texi                     |  13 +++
 guix/build-system/renpy.scm       | 131 ++++++++++++++++++++++++++++++
 guix/build/renpy-build-system.scm |  99 ++++++++++++++++++++++
 4 files changed, 245 insertions(+)
 create mode 100644 guix/build-system/renpy.scm
 create mode 100644 guix/build/renpy-build-system.scm

diff --git a/Makefile.am b/Makefile.am
index 8a8133d669..c2d71ca5be 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -150,6 +150,7 @@ MODULES =					\
   guix/build-system/node.scm			\
   guix/build-system/perl.scm			\
   guix/build-system/python.scm			\
+  guix/build-system/renpy.scm			\
   guix/build-system/ocaml.scm			\
   guix/build-system/qt.scm			\
   guix/build-system/waf.scm			\
@@ -205,6 +206,7 @@ MODULES =					\
   guix/build/ocaml-build-system.scm		\
   guix/build/qt-build-system.scm		\
   guix/build/r-build-system.scm			\
+  guix/build/renpy-build-system.scm			\
   guix/build/rakudo-build-system.scm		\
   guix/build/ruby-build-system.scm		\
   guix/build/scons-build-system.scm		\
diff --git a/doc/guix.texi b/doc/guix.texi
index 4a20b3b902..f44bf29963 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -7779,6 +7779,19 @@ passes flags specified by the @code{#:make-maker-flags} or
 Which Perl package is used can be specified with @code{#:perl}.
 @end defvr
 
+@defvr {Scheme Variable} renpy-build-system
+This variable is exported by @code{(guix build-system renpy)}.  It implements
+the more or less standard build procedure used by Ren'py games, which consists
+of loading @code{#:game} once, thereby creating bytecode for it.
+
+It further creates a wrapper script in @code{bin/} and a desktop entry in
+@code{share/applications}, both of which can be used to launch the game.
+
+Which Ren'py package is used can be specified with @code{#:renpy}.
+Games can also be installed in outputs other than ``out'' by using
+@code{#:output}.
+@end defvr
+
 @defvr {Scheme Variable} qt-build-system
 This variable is exported by @code{(guix build-system qt)}.  It
 is intended for use with applications using Qt or KDE.
diff --git a/guix/build-system/renpy.scm b/guix/build-system/renpy.scm
new file mode 100644
index 0000000000..35edc0056d
--- /dev/null
+++ b/guix/build-system/renpy.scm
@@ -0,0 +1,131 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Leo Prikler <leo.prikler <at> student.tugraz.at>
+;;;
+;;; 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 (guix build-system renpy)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix memoization)
+  #:use-module (guix packages)
+  #:use-module (guix derivations)
+  #:use-module (guix search-paths)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (%renpy-build-system-modules
+            default-renpy
+            renpy-build
+            renpy-build-system))
+
+(define (default-renpy)
+  "Return the default Ren'py package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((module (resolve-interface '(gnu packages game-development))))
+    (module-ref module 'renpy)))
+
+(define %renpy-build-system-modules
+  ;; Build-side modules imported by default.
+  `((guix build renpy-build-system)
+    (guix build json)
+    (guix build python-build-system)
+    ,@%gnu-build-system-modules))
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (renpy (default-renpy))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME."
+  (define private-keywords
+    '(#:source #:target #:renpy #:inputs #:native-inputs))
+
+  (and (not target)                               ;XXX: no cross-compilation
+       (bag
+         (name name)
+         (system system)
+         (host-inputs `(,@(if source
+                              `(("source" ,source))
+                              '())
+                        ,@inputs
+
+                        ;; Keep the standard inputs of 'gnu-build-system'.
+                        ,@(standard-packages)))
+         (build-inputs `(("renpy" ,renpy)
+                         ,@native-inputs))
+         (outputs outputs)
+         (build renpy-build)
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define* (renpy-build store name inputs
+                       #:key
+                       (phases '(@ (guix build renpy-build-system)
+                                   %standard-phases))
+                       (configure-flags ''())
+                       (outputs '("out"))
+                       (output "out")
+                       (game "game")
+                       (search-paths '())
+                       (system (%current-system))
+                       (guile #f)
+                       (imported-modules %renpy-build-system-modules)
+                       (modules '((guix build renpy-build-system)
+                                  (guix build utils))))
+  "Build SOURCE using RENPY, and with INPUTS."
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (renpy-build #:name ,name
+                    #:source ,(match (assoc-ref inputs "source")
+                                (((? derivation? source))
+                                 (derivation->output-path source))
+                                ((source)
+                                 source)
+                                (source
+                                 source))
+                     #:configure-flags ,configure-flags
+                     #:system ,system
+                     #:phases ,phases
+                     #:outputs %outputs
+                     #:output ,output
+                     #:game ,game
+                     #:search-paths ',(map search-path-specification->sexp
+                                           search-paths)
+                     #:inputs %build-inputs)))
+
+  (define guile-for-build
+    (match guile
+      ((? package?)
+       (package-derivation store guile system #:graft? #f))
+      (#f                                         ; the default
+       (let* ((distro (resolve-interface '(gnu packages commencement)))
+              (guile  (module-ref distro 'guile-final)))
+         (package-derivation store guile system #:graft? #f)))))
+
+  (build-expression->derivation store name builder
+                                #:inputs inputs
+                                #:system system
+                                #:modules imported-modules
+                                #:outputs outputs
+                                #:guile-for-build guile-for-build))
+
+(define renpy-build-system
+  (build-system
+    (name 'renpy)
+    (description "The Ren'py build system")
+    (lower lower)))
diff --git a/guix/build/renpy-build-system.scm b/guix/build/renpy-build-system.scm
new file mode 100644
index 0000000000..464fc97b13
--- /dev/null
+++ b/guix/build/renpy-build-system.scm
@@ -0,0 +1,99 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Leo Prikler <leo.prikler <at> student.tugraz.at>
+;;;
+;;; 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 (guix build renpy-build-system)
+  #:use-module ((guix build gnu-build-system) #:prefix gnu:)
+  #:use-module ((guix build python-build-system) #:prefix python:)
+  #:use-module (guix build json)
+  #:use-module (guix build utils)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 ftw)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (%standard-phases
+            renpy-build))
+
+(define* (build #:key game #:allow-other-keys)
+  (for-each make-file-writable
+            (find-files game (lambda (pred stat)
+                               (eq? (stat:type stat) 'directory))))
+  (invoke "renpy"
+          "--json-dump" (string-append game "/renpy-build.json")
+          game
+          ;; should be "compile", but renpy wants to compile itself really
+          ;; badly if we do
+          "quit")
+  #t)
+
+(define* (install #:key outputs game (output "out") #:allow-other-keys)
+  (let* ((out (assoc-ref outputs output))
+         (json-dump (call-with-input-file (string-append game
+                                                         "/renpy-build.json")
+                      read-json))
+         (build (assoc-ref json-dump "build"))
+         (executable-name (assoc-ref build "executable_name"))
+         (directory-name (assoc-ref build "directory_name")))
+    (let ((launcher (string-append out "/bin/" executable-name))
+          (data (string-append out "/share/renpy/" directory-name)))
+      (mkdir-p (string-append out "/bin"))
+      (copy-recursively game data)
+      ;; We don't actually want the metadata to be dumped in the output
+      ;; directory
+      (delete-file (string-append data "/renpy-build.json"))
+      (call-with-output-file launcher
+        (lambda (port)
+          (format port "#!~a~%~a ~a \"$@\""
+                  (which "bash")
+                  (which "renpy")
+                  data)))
+      (chmod launcher #o755)))
+  #t)
+
+(define* (install-desktop-file #:key outputs game (output "out")
+                               #:allow-other-keys)
+  (let* ((out (assoc-ref outputs output))
+         (json-dump (call-with-input-file (string-append game
+                                                         "/renpy-build.json")
+                      read-json))
+         (build (assoc-ref json-dump "build"))
+         (directory-name (assoc-ref build "directory_name"))
+         (executable-name (assoc-ref build "executable_name")))
+    (make-desktop-entry-file
+     (string-append out "/share/applications/" executable-name ".desktop")
+     #:name (assoc-ref json-dump "name")
+     #:generic-name (assoc-ref build "display_name")
+     #:exec (string-append (which "renpy") " "
+                           out "/share/renpy/" directory-name)
+     #:categories '("Game" "Visual Novel")))
+  #t)
+
+(define %standard-phases
+  (modify-phases gnu:%standard-phases
+    (add-after 'unpack 'enable-bytecode-determinism
+      (assoc-ref python:%standard-phases 'enable-bytecode-determinism))
+    (delete 'bootstrap)
+    (delete 'configure)
+    (replace 'build build)
+    (delete 'check)
+    (replace 'install install)
+    (add-after 'install 'install-desktop-file install-desktop-file)))
+
+(define* (renpy-build #:key inputs (phases %standard-phases)
+                       #:allow-other-keys #:rest args)
+  "Build the given Ren'py package, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
-- 
2.30.0





Reply sent to Leo Prikler <leo.prikler <at> student.tugraz.at>:
You have taken responsibility. (Sun, 07 Feb 2021 14:30:03 GMT) Full text and rfc822 format available.

Notification sent to Leo Prikler <leo.prikler <at> student.tugraz.at>:
bug acknowledged by developer. (Sun, 07 Feb 2021 14:30:03 GMT) Full text and rfc822 format available.

Message #22 received at 46053-done <at> debbugs.gnu.org (full text, mbox):

From: Leo Prikler <leo.prikler <at> student.tugraz.at>
To: Nicolas Goaziou <mail <at> nicolasgoaziou.fr>
Cc: 46053-done <at> debbugs.gnu.org, 45736-done <at> debbugs.gnu.org
Subject: Re: [bug#46053] [PATCH 0/2] Add Ren'py build system
Date: Sun, 07 Feb 2021 15:29:09 +0100
Hello,

Am Sonntag, den 24.01.2021, 09:49 +0100 schrieb Nicolas Goaziou:
> LGTM, in addition to #45736.
I've now pushed both this (well, v2 of it) and #45736.

> It should also be documented in the manual.
Documentation is present in v2, which I've pushed.  I hope it's
sufficient.

Regards,
Leo.





bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Mon, 08 Mar 2021 12:24:08 GMT) Full text and rfc822 format available.

This bug report was last modified 3 years and 21 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.