unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#46053] [PATCH 0/2] Add Ren'py build system
@ 2021-01-23 13:40 Leo Prikler
  2021-01-23 13:46 ` [bug#46053] [PATCH 1/2] build-system: Add renpy-build-system Leo Prikler
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Leo Prikler @ 2021-01-23 13:40 UTC (permalink / raw)
  To: 46053

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





^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#46053] [PATCH 1/2] build-system: Add renpy-build-system.
  2021-01-23 13:40 [bug#46053] [PATCH 0/2] Add Ren'py build system Leo Prikler
@ 2021-01-23 13:46 ` Leo Prikler
  2021-01-23 13:46   ` [bug#46053] [PATCH 2/2] gnu: Add the-question Leo Prikler
  2021-01-24  8:49 ` [bug#46053] [PATCH 0/2] Add Ren'py build system Nicolas Goaziou
  2021-01-24 10:51 ` [bug#46053] [PATCH v2] build-system: Add renpy-build-system Leo Prikler
  2 siblings, 1 reply; 6+ messages in thread
From: Leo Prikler @ 2021-01-23 13:46 UTC (permalink / raw)
  To: 46053

* 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@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@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





^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [bug#46053] [PATCH 2/2] gnu: Add the-question.
  2021-01-23 13:46 ` [bug#46053] [PATCH 1/2] build-system: Add renpy-build-system Leo Prikler
@ 2021-01-23 13:46   ` Leo Prikler
  0 siblings, 0 replies; 6+ messages in thread
From: Leo Prikler @ 2021-01-23 13:46 UTC (permalink / raw)
  To: 46053

* 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





^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [bug#46053] [PATCH 0/2] Add Ren'py build system
  2021-01-23 13:40 [bug#46053] [PATCH 0/2] Add Ren'py build system Leo Prikler
  2021-01-23 13:46 ` [bug#46053] [PATCH 1/2] build-system: Add renpy-build-system Leo Prikler
@ 2021-01-24  8:49 ` Nicolas Goaziou
  2021-02-07 14:29   ` bug#46053: " Leo Prikler
  2021-01-24 10:51 ` [bug#46053] [PATCH v2] build-system: Add renpy-build-system Leo Prikler
  2 siblings, 1 reply; 6+ messages in thread
From: Nicolas Goaziou @ 2021-01-24  8:49 UTC (permalink / raw)
  To: Leo Prikler; +Cc: 46053

Hello,

Leo Prikler <leo.prikler@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




^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#46053] [PATCH v2] build-system: Add renpy-build-system.
  2021-01-23 13:40 [bug#46053] [PATCH 0/2] Add Ren'py build system Leo Prikler
  2021-01-23 13:46 ` [bug#46053] [PATCH 1/2] build-system: Add renpy-build-system Leo Prikler
  2021-01-24  8:49 ` [bug#46053] [PATCH 0/2] Add Ren'py build system Nicolas Goaziou
@ 2021-01-24 10:51 ` Leo Prikler
  2 siblings, 0 replies; 6+ messages in thread
From: Leo Prikler @ 2021-01-24 10:51 UTC (permalink / raw)
  To: 46053

* 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@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@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





^ permalink raw reply related	[flat|nested] 6+ messages in thread

* bug#46053: [PATCH 0/2] Add Ren'py build system
  2021-01-24  8:49 ` [bug#46053] [PATCH 0/2] Add Ren'py build system Nicolas Goaziou
@ 2021-02-07 14:29   ` Leo Prikler
  0 siblings, 0 replies; 6+ messages in thread
From: Leo Prikler @ 2021-02-07 14:29 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: 46053-done, 45736-done

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.





^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-02-07 14:30 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-01-23 13:40 [bug#46053] [PATCH 0/2] Add Ren'py build system Leo Prikler
2021-01-23 13:46 ` [bug#46053] [PATCH 1/2] build-system: Add renpy-build-system Leo Prikler
2021-01-23 13:46   ` [bug#46053] [PATCH 2/2] gnu: Add the-question Leo Prikler
2021-01-24  8:49 ` [bug#46053] [PATCH 0/2] Add Ren'py build system Nicolas Goaziou
2021-02-07 14:29   ` bug#46053: " Leo Prikler
2021-01-24 10:51 ` [bug#46053] [PATCH v2] build-system: Add renpy-build-system Leo Prikler

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).