all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Ricardo Wurmus <rekado@elephly.net>
To: guix-devel@gnu.org
Subject: [PATCH] Add 'waf-build-system'.
Date: Wed, 28 Jan 2015 22:48:05 +0100	[thread overview]
Message-ID: <87pp9yvap6.fsf@mango.localdomain> (raw)

[-- Attachment #1: Type: text/plain, Size: 650 bytes --]

Hi Guix,

attached is a patch to add the waf build system.  Although waf is called
a meta build system, most applications that I've encountered so far (all
related to audio) have the standard build phases as the GNU build
system.

The waf build system is embarrassingly similar to the Python build
system.  Essentially, the phases are run by executing

    python waf $PHASE

instead of

    python setup.py $PHASE

Unlike the Python build system, however, there is a configure phase, and
not everything important happens during the install phase.

I'm using the waf-build-system for packaging LV2, Ardour, JACK2, and
related libraries.

~~ Ricardo


[-- Attachment #2: 0001-Add-waf-build-system.patch --]
[-- Type: text/x-patch, Size: 9869 bytes --]

From adc52a74fb12943fd77c97bf75a2092e839f9024 Mon Sep 17 00:00:00 2001
From: Ricardo Wurmus <rekado@elephly.net>
Date: Wed, 28 Jan 2015 22:39:03 +0100
Subject: [PATCH] Add 'waf-build-system'.

* guix/build-system/waf.scm, guix/build/waf-build-system.scm: New files.
* Makefile.am (MODULES): Add them.
---
 Makefile.am                     |   2 +
 guix/build-system/waf.scm       | 128 ++++++++++++++++++++++++++++++++++++++++
 guix/build/waf-build-system.scm |  86 +++++++++++++++++++++++++++
 3 files changed, 216 insertions(+)
 create mode 100644 guix/build-system/waf.scm
 create mode 100644 guix/build/waf-build-system.scm

diff --git a/Makefile.am b/Makefile.am
index 67367d6..6a4a09b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -53,6 +53,7 @@ MODULES =					\
   guix/build-system/gnu.scm			\
   guix/build-system/perl.scm			\
   guix/build-system/python.scm			\
+  guix/build-system/waf.scm			\
   guix/build-system/ruby.scm			\
   guix/build-system/trivial.scm			\
   guix/ftp-client.scm				\
@@ -71,6 +72,7 @@ MODULES =					\
   guix/build/perl-build-system.scm		\
   guix/build/python-build-system.scm		\
   guix/build/ruby-build-system.scm		\
+  guix/build/waf-build-system.scm		\
   guix/build/store-copy.scm			\
   guix/build/utils.scm				\
   guix/build/union.scm				\
diff --git a/guix/build-system/waf.scm b/guix/build-system/waf.scm
new file mode 100644
index 0000000..494cb95
--- /dev/null
+++ b/guix/build-system/waf.scm
@@ -0,0 +1,128 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; 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 waf)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix packages)
+  #:use-module (guix derivations)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module ((guix build-system python)
+                #:select (default-python default-python2))
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-26)
+  #:export (waf-build
+            waf-build-system))
+
+;; Commentary:
+;;
+;; Standard build procedure for applications using 'waf'.  This is very
+;; similar to the 'python-build-system' and is implemented as an extension of
+;; 'gnu-build-system'.
+;;
+;; Code:
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (python (default-python))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME."
+  (define private-keywords
+    '(#:source #:target #:python #: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 `(("python" ,python)
+                         ,@native-inputs))
+         (outputs outputs)
+         (build waf-build) ; only change compared to 'lower' in python.scm
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define* (waf-build store name inputs
+                       #:key
+                       (tests? #t)
+                       (test-target "check")
+                       (configure-flags ''())
+                       (phases '(@ (guix build waf-build-system)
+                                   %standard-phases))
+                       (outputs '("out"))
+                       (search-paths '())
+                       (system (%current-system))
+                       (guile #f)
+                       (imported-modules '((guix build waf-build-system)
+                                           (guix build gnu-build-system)
+                                           (guix build utils)))
+                       (modules '((guix build waf-build-system)
+                                  (guix build utils))))
+  "Build SOURCE with INPUTS.  This assumes that SOURCE provides a 'waf' file
+as its build system."
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (waf-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
+                  #:test-target ,test-target
+                  #:tests? ,tests?
+                  #:phases ,phases
+                  #:outputs %outputs
+                  #: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 waf-build-system
+  (build-system
+    (name 'waf)
+    (description "The standard waf build system")
+    (lower lower)))
+
+;;; waf.scm ends here
diff --git a/guix/build/waf-build-system.scm b/guix/build/waf-build-system.scm
new file mode 100644
index 0000000..e64b51a
--- /dev/null
+++ b/guix/build/waf-build-system.scm
@@ -0,0 +1,86 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; 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 waf-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 ftw)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (%standard-phases
+            waf-build))
+
+;; Commentary:
+;;
+;; Builder-side code of the standard waf build procedure.
+;;
+;; Code:
+
+
+(define (call-waf command params)
+  (if (file-exists? "waf")
+      (begin
+         (format #t "running \"python waf\" with command ~s and parameters ~s~%"
+                command params)
+         (zero? (apply system* "python" "waf" command params)))
+      (error "no waf found")))
+
+(define* (configure #:key target native-inputs inputs outputs
+                    (configure-flags '())
+                    #:allow-other-keys)
+  "Build a given waf application."
+  (let* ((prefix (assoc-ref outputs "out"))
+         (flags  `(,(string-append "--prefix=" prefix)
+                   ,@configure-flags)))
+    (call-waf "configure" flags)))
+
+(define* (build #:rest empty)
+  "Build a given waf application."
+  (call-waf "build" '()))
+
+(define* (check #:key tests? test-target #:allow-other-keys)
+  "Run the test suite of a given waf application."
+  (if tests?
+    (call-waf test-target '())
+    #t))
+
+(define* (install #:key outputs inputs (configure-flags '())
+                  #:allow-other-keys)
+  "Install a given waf application."
+  (let* ((out (assoc-ref outputs "out"))
+         (params (append (list (string-append "--prefix=" out))
+                         configure-flags)))
+        (call-waf "install" params)))
+
+(define %standard-phases
+  (alist-replace
+   'configure configure
+   (alist-replace
+    'build build
+    (alist-replace
+     'check check
+     (alist-replace 'install install
+                    gnu:%standard-phases)))))
+
+(define* (waf-build #:key inputs (phases %standard-phases)
+                       #:allow-other-keys #:rest args)
+  "Build the given waf application, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
+
+;;; waf-build-system.scm ends here
-- 
2.1.0


             reply	other threads:[~2015-01-28 21:48 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-28 21:48 Ricardo Wurmus [this message]
2015-02-01 21:08 ` [PATCH] Add 'waf-build-system' Ludovic Courtès
2015-02-03 22:46   ` rekado
2015-02-04 22:04     ` Ludovic Courtès
2015-02-05 21:53     ` Ricardo Wurmus
2015-02-07 23:26       ` Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87pp9yvap6.fsf@mango.localdomain \
    --to=rekado@elephly.net \
    --cc=guix-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.