gnu: Add renpy.

* gnu/packages/game-development: (python2-pygame-sdl2): New variable.
(python2-renpy): New variable.
(renpy): New variable.
This commit is contained in:
Comrade Yuri 2019-10-19 17:40:27 +02:00 committed by Nicolas Goaziou
parent 2f490bf3d6
commit 8476e5857a
No known key found for this signature in database
GPG key ID: DA00B4F048E92F2D

View file

@ -15,6 +15,7 @@
;;; Copyright © 2017, 2019 Rutger Helling <rhelling@mykolab.com>
;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com>
;;; Copyright © 2019 Pierre Neidhardt <mail@ambrevar.xyz>
;;; Copyright © 2019 Comrade Yuri <yuri@nijino>
;;;
;;; This file is part of GNU Guix.
;;;
@ -971,6 +972,329 @@ (define-public python-pygame
(define-public python2-pygame
(package-with-python2 python-pygame))
(define-public python2-pygame-sdl2
(let ((real-version "2.1.0")
(renpy-version "7.3.5"))
(package
(inherit python2-pygame)
(name "python2-pygame-sdl2")
(version (string-append real-version "-for-renpy-" renpy-version))
(source
(origin
(method url-fetch)
(uri (string-append "https://www.renpy.org/dl/" renpy-version
"/pygame_sdl2-" version ".tar.gz"))
(sha256 (base32 "1bmr7j9mlsc4czpgw70ld15ymyp4wxrk9hdsqad40wjwdxvvg2dr"))))
(build-system python-build-system)
(arguments
`(#:tests? #f ; tests require pygame to be installed first
#:python ,python-2
#:phases
(modify-phases %standard-phases
(add-after 'set-paths 'set-sdl-vars
(lambda* (#:key inputs #:allow-other-keys)
(setenv "PYGAME_SDL2_CFLAGS"
(string-append "-I"
(assoc-ref inputs "sdl-union")
"/include/SDL2 -D_REENTRANT"))
(setenv "PYGAME_SDL2_LDFLAGS"
(string-append "-L"
(assoc-ref inputs "sdl-union")
"/lib -Wl,-rpath,"
(assoc-ref inputs "sdl-union")
"/lib -Wl,--enable-new-dtags -lSDL2"))
#t))
(add-before 'build 'drop-generated-files
(lambda args
(delete-file-recursively "gen")
(delete-file-recursively "gen3")
#t)))))
(inputs
`(("sdl-union"
,(sdl-union (list sdl2 sdl2-image sdl2-mixer sdl2-ttf)))))
(native-inputs
`(("python2-cython" ,python2-cython)))
(home-page "http://www.renpy.org/")
(synopsis "Reimplementation of the Pygame API using SDL2")
(description "Pygame_SDL2 reimplements the Pygame API using SDL2,
staying close to the original, but also adding some SDL2-specific features.
While it aims to be used as a drop-in replacement, it appears to be
developed mainly for Ren'py.")
(license (list license:lgpl2.1 license:zlib)))))
(define-public python2-renpy
(package
(name "python2-renpy")
(version "7.3.5")
(source
(origin
(method url-fetch)
(uri (string-append "https://www.renpy.org/dl/" version
"/renpy-" version "-source.tar.bz2"))
(sha256 (base32 "1anr5cfbvbsbik4v4rvrkdkciwhg700k4lydfbs4n85raimz9mw4"))))
(build-system python-build-system)
(arguments
`(#:tests? #f ; Ren'py doesn't seem to package tests
#:python ,python-2
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'fix-commands
(lambda _
(substitute* "renpy/editor.py"
(("xdg-open")
(which "xdg-open")))
#t))
(add-after 'set-paths 'set-build-vars
(lambda* (#:key inputs #:allow-other-keys)
(setenv "RENPY_CYTHON"
(string-append (assoc-ref inputs "python2-cython")
"/bin/cython"))
(setenv "RENPY_DEPS_INSTALL" (string-join (map cdr inputs) ":"))
#t))
(replace 'build
(lambda args
(apply
(lambda* (build-root #:key inputs outputs #:allow-other-keys)
;; The "module" subdirectory contains a python (really cython)
;; project, which is built using a script, that is thankfully
;; named "setup.py".
(chdir "module")
(apply (assoc-ref %standard-phases 'build) args)
;; the above causes renpy.__init__ to be compiled but does not
;; compile anything else, hence we do that here
(chdir build-root)
(delete-file "renpy/__init__.pyc")
(invoke "python" "-m" "compileall" "renpy"))
(getcwd) args)
#t))
(replace 'install
(lambda args
(apply
(lambda* (build-root #:key inputs outputs #:allow-other-keys)
;; Again, we have to wrap the module installation.
;; Additionally, we want to install the python code
;; (both source and compiled) in the same directory.
(let* ((out (assoc-ref outputs "out"))
(site (string-append "/lib/python"
,(version-major+minor
(package-version python-2))
"/site-packages")))
(chdir "module")
(apply (assoc-ref %standard-phases 'install) args)
(chdir build-root)
(copy-recursively "renpy"
(string-append out site "/renpy"))))
(getcwd) args)
#t)))))
(inputs
`(("ffmpeg" ,ffmpeg)
("freetype" ,freetype)
("glew" ,glew)
("libpng" ,libpng)
("python2-pygame" ,python2-pygame-sdl2)
("sdl-union"
,(sdl-union (list sdl2 sdl2-image sdl2-mixer sdl2-ttf)))))
(native-inputs
`(("python2-cython" ,python2-cython)
("xdg-utils" ,xdg-utils)))
(home-page "http://www.renpy.org/")
(synopsis "Ren'py python module")
(description "This package contains the shared libraries and Python
modules of Ren'py.")
(license license:expat)))
(define-public renpy
(package
(inherit python2-renpy)
(name "renpy")
(version "7.3.5")
(build-system python-build-system)
(arguments
`(#:tests? #f ; see python2-renpy
#:python ,python-2
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'fix-commands
(lambda* (#:key outputs #:allow-other-keys)
(substitute* "launcher/game/choose_directory.rpy"
(("/usr/bin/python") (which "python2")))
(substitute* "launcher/game/front_page.rpy"
(("xdg-open")
(which "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\")"))
#t))
(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 #:allow-other-keys)
(let ((xorg-server (assoc-ref inputs "xorg-server")))
(setenv "HOME" (getcwd))
(system (format #f "~a/bin/Xvfb :1 &" xorg-server))
(setenv "DISPLAY" ":1")
#t)))
(replace 'build
(lambda _
(invoke "python" "renpy.py" "launcher" "quit")
(invoke "python" "renpy.py" "the_question" "quit")
(invoke "python" "renpy.py" "tutorial" "quit")
#t))
(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
;;
;; Note that common is also a de facto unused directory in
;; python2-renpy. 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 ; Ren'py 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")))
(mkdir-p (string-append out "/bin"))
(copy-recursively "renpy/common"
(string-append out "/share/renpy/common"))
(copy-recursively "gui"
(string-append out "/share/renpy/gui"))
(call-with-output-file bin/renpy
(lambda (port)
(format port "#!~a~%" (which "python2"))
(format port "
from __future__ import print_function
import os
import sys
import warnings
def path_to_common(renpy_base):
return renpy_base + \"/common\"
def path_to_saves(gamedir, save_directory=None):
import renpy # @UnresolvedImport
if save_directory is None:
save_directory = renpy.config.save_directory
save_directory = renpy.exports.fsencode(save_directory)
if not save_directory:
return gamedir + \"/saves\"
return os.path.expanduser(\"~~/.renpy/\" + save_directory)
def path_to_renpy_base():
return \"~a\"
def main():
renpy_base = path_to_renpy_base()
try:
import renpy.bootstrap
import renpy.arguments
except ImportError:
print(\"\"\"Could not import renpy.bootstrap.
Please ensure you decompressed Ren'Py correctly, preserving the directory
structure.\"\"\", file=sys.stderr)
raise
args = renpy.arguments.bootstrap()
if not args.basedir:
print(\"\"\"This Ren'py requires a basedir to launch.
The basedir is the directory, in which .rpy files live -- usually the 'game'
subdirectory of a game packaged by Ren'py.
If you want the Ren'py launcher, use renpy-launcher instead.\"\"\",
file=sys.stderr)
sys.exit()
renpy.bootstrap.bootstrap(renpy_base)
if __name__ == \"__main__\":
main()
"
(string-append out "/share/renpy"))))
(chmod bin/renpy #o755)
#t)))
(add-after 'install 'install-games
(lambda* (#:key 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 \"$@\""
(which "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")
#t))
(replace 'wrap
(lambda* (#:key inputs outputs #:allow-other-keys)
(wrap-program (string-append (assoc-ref outputs "out")
"/bin/renpy")
`("PYTHONPATH" = (,(getenv "PYTHONPATH"))))
#t)))))
(inputs
`(("python2-tkinter" ,python-2 "tk")
("python2-pygame" ,python2-pygame-sdl2)
("python2-renpy" ,python2-renpy)
("xorg-server" ,xorg-server)))
(outputs
(list "out" "tutorial" "the-question"))
(home-page "http://www.renpy.org/")
(synopsis "Visual Novel Engine")
(description "Ren'Py is a visual novel engine that helps you use words,
images, and sounds to tell interactive stories that run on computers and
mobile devices. These can be both visual novels and life simulation games.
The easy to learn script language allows anyone to efficiently write large
visual novels, while its Python scripting is enough for complex simulation
games.")
(license license:expat)))
(define-public grafx2
(package
(name "grafx2")