;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2021 Vinicius Monego ;;; ;;; 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 (guix build godot-build-system) #:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module (guix build utils) #:use-module (ice-9 match) #:use-module (ice-9 format) #:use-module (ice-9 ftw) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (%standard-phases godot-build)) (define* (configure #:key project-directory #:allow-other-keys) ;; Projects may have the 'project.godot' file in different directories. The ;; project-directory key contains the path string to the directory where it ;; is located. (chdir project-directory) (setenv "HOME" (getcwd)) ;; Not all projects ship with export_presets.cfg because it may contain ;; confidential information such as CI keys. In that case, we check if ;; this file exists, and if it doesn't we use this generic template below. ;; There is ongoing effort to separate the keys from that file. See: ;; https://github.com/godotengine/godot-demo-projects/issues/329 and ;; https://github.com/godotengine/godot/pull/35930. Until that is fixed and ;; developers start to provide the file, we have to use our own template. (let ((export-presets "export_presets.cfg")) (when (not (file-exists? export-presets)) (with-output-to-file export-presets (lambda () (display "[preset.0] name=\"Guix\" platform=\"Linux/X11\" runnable=true custom_features=\"\" export_filter=\"all_resources\" include_filter=\"\" exclude_filter=\"\" export_path=\"\" patch_list=PoolStringArray( ) script_export_mode=1 script_encryption_key=\"\" [preset.0.options] texture_format/bptc=false texture_format/s3tc=true texture_format/etc=false texture_format/etc2=false texture_format/no_bptc_fallbacks=true binary_format/64_bits=false binary_format/embed_pck=false custom_template/release=\"\" custom_template/debug=\"\"")))))) (define* (build #:key inputs game export-name #:allow-other-keys) (let ((godot (assoc-ref inputs "godot-headless"))) (invoke (string-append godot "/bin/godot_server") "--export-pack" export-name (string-append game ".pck") "project.godot"))) (define* (install #:key inputs outputs game #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (bin (string-append out "/bin")) (share (string-append out "/share")) (data (string-append share "/" game)) (icons (string-append share "/icons/hicolor/256x256/apps"))) (install-file (string-append game ".pck") data) (mkdir-p bin) (call-with-output-file (string-append bin "/" game) (lambda (port) (format port "#!/bin/sh~@ exec ~a/bin/godot --main-pack ~a/~a.pck~%" (assoc-ref inputs "godot") data game) (chmod port #o755))) (mkdir-p icons) (copy-file "icon.png" (string-append icons "/" game ".png")))) (define %standard-phases (modify-phases gnu:%standard-phases (delete 'bootstrap) (replace 'configure configure) (replace 'build build) (delete 'check) (replace 'install install))) (define* (godot-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) "Build the given Godot package, applying all of PHASES in order." (apply gnu:gnu-build #:inputs inputs #:phases phases args))