From patchwork Sun Nov 7 10:55:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Xinglu Chen X-Patchwork-Id: 34289 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 411FF27BBE4; Sun, 7 Nov 2021 10:56:18 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,T_DKIM_INVALID, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id C3C2C27BBE3 for ; Sun, 7 Nov 2021 10:56:16 +0000 (GMT) Received: from localhost ([::1]:44084 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mjfqR-0004Wx-TS for patchwork@mira.cbaines.net; Sun, 07 Nov 2021 05:56:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:51154) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mjfqE-0004Tc-VZ for guix-patches@gnu.org; Sun, 07 Nov 2021 05:56:02 -0500 Received: from debbugs.gnu.org ([209.51.188.43]:40320) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mjfqE-0006B4-GY for guix-patches@gnu.org; Sun, 07 Nov 2021 05:56:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mjfqD-0003JS-UG; Sun, 07 Nov 2021 05:56:01 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#51655] [PATCH] build-system: haskell: Add =?utf-8?q?=E2=80=98p?= =?utf-8?q?ackage-with-explicit-haskell=E2=80=99?= procedure. Resent-From: Xinglu Chen Original-Sender: "Debbugs-submit" Resent-CC: lars@6xq.net, guix-patches@gnu.org Resent-Date: Sun, 07 Nov 2021 10:56:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 51655 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 51655@debbugs.gnu.org Cc: Lars-Dominik Braun X-Debbugs-Original-To: guix-patches@gnu.org X-Debbugs-Original-Xcc: Lars-Dominik Braun Received: via spool by submit@debbugs.gnu.org id=B.163628254212702 (code B ref -1); Sun, 07 Nov 2021 10:56:01 +0000 Received: (at submit) by debbugs.gnu.org; 7 Nov 2021 10:55:42 +0000 Received: from localhost ([127.0.0.1]:51864 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mjfpt-0003In-Dn for submit@debbugs.gnu.org; Sun, 07 Nov 2021 05:55:41 -0500 Received: from lists.gnu.org ([209.51.188.17]:45730) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mjfpp-0003Ie-PR for submit@debbugs.gnu.org; Sun, 07 Nov 2021 05:55:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:51102) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mjfpp-0004Q8-IS for guix-patches@gnu.org; Sun, 07 Nov 2021 05:55:37 -0500 Received: from h87-96-130-155.cust.a3fiber.se ([87.96.130.155]:34970 helo=mail.yoctocell.xyz) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mjfpm-00062X-OO for guix-patches@gnu.org; Sun, 07 Nov 2021 05:55:37 -0500 From: Xinglu Chen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yoctocell.xyz; s=mail; t=1636282526; bh=1AbHFgRMuasz+k+7TOSLmKejvj3I1cIXwV211QsB9AU=; h=From:To:Subject:Date; b=iaVKIOYn8sKqEHueXmyuDIRkdS/ORoVjRgvYtpSgT5yTs9BP8qroPb323k6elvNDd yf5SshEXFZJkKe2kdoMiNCeMia4+smkYXDa/1DV6JAf11HlDB8aGia2QmPqvrav5yD 4smeRO3kjyMnHV2dgif0QXBbbCHWTdod4VSsmbs4= Message-Id: <7f7b889aebed4c17e3a021883bfed1d67c564109.1636216701.git.public@yoctocell.xyz> Date: Sun, 07 Nov 2021 11:55:25 +0100 MIME-Version: 1.0 Received-SPF: pass client-ip=87.96.130.155; envelope-from=public@yoctocell.xyz; helo=mail.yoctocell.xyz X-Spam_score_int: 11 X-Spam_score: 1.1 X-Spam_bar: + X-Spam_report: (1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.001, FROM_SUSPICIOUS_NTLD_FP=1.997, PDS_OTHER_BAD_TLD=0.001, PDS_RDNS_DYNAMIC_FP=0.001, RDNS_DYNAMIC=0.982, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, TO_NO_BRKTS_DYNIP=0.252 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: "Guix-patches" X-getmail-retrieved-from-mailbox: Patches * guix/packages.scm (package-with-explicit-compiler): New procedure; factorized from ‘package-with-explicit-python’. * guix/build-system/python.scm (package-with-explicit-python): Use ‘package-with-explicit-compiler’. * guix/build-system/haskell.scm (package-with-explicit-haskell): New procedure. * doc/guix.texi (Defining Package Variants): Document it. --- doc/guix.texi | 37 ++++++++++++++++++ guix/build-system/haskell.scm | 8 ++++ guix/build-system/python.scm | 71 +++++++---------------------------- guix/packages.scm | 55 +++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 58 deletions(-) base-commit: 1ffc0a6be3c1613b2d99ceea098174d1f11f6f3f diff --git a/doc/guix.texi b/doc/guix.texi index ea1973f02c..95fa5ab103 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -7717,6 +7717,43 @@ applied to implicit inputs as well. @end deffn +@deffn {Scheme Procedure} package-with-explicit-compiler @var{compiler} @ +@var{keyword} @var{build-system} @var{old-prefix} @var{new-prefix} @ +[#:variant-property #f] +Return a procedure of one argument, @var{p}. The procedure creates a +package with the same fields as @var{p}, which is assumed to use +@var{build-system}, such that it is compiled with @var{compiler} +instead. @var{keyword} is a symbol whose name is the name of the +keyword for explicitly specifying a compiler, e.g., @code{python} for +@code{python-build-system}. The inputs are changed recursively +accordingly. If the name of @var{p} starts with @var{old-prefix}, this +is replaced by @var{new-prefix}; otherwise, @var{new-prefix} is +prepended to the name. + +When @var{variant-property} is present, it is used as a key to search +for pre-defined variants of this transformation recorded in the +@code{properties} field of packages. The property value must be the +promise of a package. This is a convenient way for package writers to +force the transformation to use pre-defined variants. + +You can for example define a procedure which given a Haskell package, +builds it and all of its recursive dependencies with GHC 8.8. + +@lisp +(use-modules (guix build-system haskell)) + +(define (default-haskell-8.8) + ;; Lazily resolve the binding to avoid a circular dependency. + (let ((haskell (resolve-interface '(gnu packages haskell)))) + (module-ref haskell 'ghc-8.8))) + +(define package-with-haskell-8.8 + (package-with-explicit-haskell (delay (default-haskell-8.8)) + "ghc-" "ghc-8.8-" + #:variant-property 'ghc-8.8-variant)) +@end lisp +@end deffn + @node Build Systems @section Build Systems diff --git a/guix/build-system/haskell.scm b/guix/build-system/haskell.scm index 18a584f782..8656e5f318 100644 --- a/guix/build-system/haskell.scm +++ b/guix/build-system/haskell.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Timothy Sample ;;; Copyright © 2020 Simon Tournier +;;; Copyright © 2021 Xinglu Chen ;;; ;;; This file is part of GNU Guix. ;;; @@ -31,6 +32,7 @@ (define-module (guix build-system haskell) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (%haskell-build-system-modules + package-with-explicit-haskell haskell-build haskell-build-system)) @@ -190,4 +192,10 @@ (define haskell-build-system (description "The standard Haskell build system") (lower lower))) +(define* (package-with-explicit-haskell haskell old-prefix new-prefix + #:key variant-property) + (package-with-explicit-compiler haskell 'haskell haskell-build-system + old-prefix new-prefix + #:variant-property variant-property)) + ;;; haskell.scm ends here diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm index 80895162f8..3d8b437d11 100644 --- a/guix/build-system/python.scm +++ b/guix/build-system/python.scm @@ -70,64 +70,6 @@ (define (default-python2) (let ((python (resolve-interface '(gnu packages python)))) (module-ref python 'python-2))) -(define* (package-with-explicit-python python old-prefix new-prefix - #:key variant-property) - "Return a procedure of one argument, P. The procedure creates a package with -the same fields as P, which is assumed to use PYTHON-BUILD-SYSTEM, such that -it is compiled with PYTHON instead. The inputs are changed recursively -accordingly. If the name of P starts with OLD-PREFIX, this is replaced by -NEW-PREFIX; otherwise, NEW-PREFIX is prepended to the name. - -When VARIANT-PROPERTY is present, it is used as a key to search for -pre-defined variants of this transformation recorded in the 'properties' field -of packages. The property value must be the promise of a package. This is a -convenient way for package writers to force the transformation to use -pre-defined variants." - (define package-variant - (if variant-property - (lambda (package) - (assq-ref (package-properties package) - variant-property)) - (const #f))) - - (define (transform p) - (cond - ;; If VARIANT-PROPERTY is present, use that. - ((package-variant p) - => force) - - ;; Otherwise build the new package object graph. - ((eq? (package-build-system p) python-build-system) - (package/inherit p - (location (package-location p)) - (name (let ((name (package-name p))) - (string-append new-prefix - (if (string-prefix? old-prefix name) - (substring name - (string-length old-prefix)) - name)))) - (arguments - (let ((python (if (promise? python) - (force python) - python))) - (ensure-keyword-arguments (package-arguments p) - `(#:python ,python)))))) - (else p))) - - (define (cut? p) - (or (not (eq? (package-build-system p) python-build-system)) - (package-variant p))) - - (package-mapping transform cut?)) - -(define package-with-python2 - ;; Note: delay call to 'default-python2' until after the 'arguments' field - ;; of packages is accessed to avoid a circular dependency when evaluating - ;; the top-level of (gnu packages python). - (package-with-explicit-python (delay (default-python2)) - "python-" "python2-" - #:variant-property 'python2-variant)) - (define (strip-python2-variant p) "Remove the 'python2-variant' property from P." (package/inherit p @@ -220,4 +162,17 @@ (define python-build-system (description "The standard Python build system") (lower lower))) +(define* (package-with-explicit-python python old-prefix new-prefix + #:key variant-property) + (package-with-explicit-compiler python 'python python-build-system + old-prefix new-prefix + #:variant-property variant-property)) +(define package-with-python2 + ;; Note: delay call to 'default-python2' until after the 'arguments' field + ;; of packages is accessed to avoid a circular dependency when evaluating + ;; the top-level of (gnu packages python). + (package-with-explicit-python (delay (default-python2)) + "python-" "python2-" + #:variant-property 'python2-variant)) + ;;; python.scm ends here diff --git a/guix/packages.scm b/guix/packages.scm index 4b6098bb8d..81c5701886 100644 --- a/guix/packages.scm +++ b/guix/packages.scm @@ -130,6 +130,7 @@ (define-module (guix packages) package-with-extra-patches package-with-c-toolchain package/inherit + package-with-explicit-compiler transitive-input-references @@ -951,6 +952,60 @@ (define (package-with-c-toolchain package toolchain) (package/inherit package (build-system (build-system-with-c-toolchain bs toolchain))))) +(define* (package-with-explicit-compiler compiler keyword build-system + old-prefix new-prefix + #:key variant-property) + "Return a procedure of one argument, P. The procedure creates a package with +the same fields as P, which is assumed to use BUILD-SYSTEM, such that it is +compiled with COMPILER instead. KEYWORD is a symbol whose name is the name of +the keyword for explicitly specifying a compiler, e.g., 'python' for +'python-build-system'. The inputs are changed recursively accordingly. If +the name of P starts with OLD-PREFIX, this is replaced by NEW-PREFIX; +otherwise, NEW-PREFIX is prepended to the name. + +When VARIANT-PROPERTY is present, it is used as a key to search for +pre-defined variants of this transformation recorded in the 'properties' field +of packages. The property value must be the promise of a package. This is a +convenient way for package writers to force the transformation to use +pre-defined variants." + (define package-variant + (if variant-property + (lambda (package) + (assq-ref (package-properties package) + variant-property)) + (const #f))) + + (define (transform p) + (cond + ;; If VARIANT-PROPERTY is present, use that. + ((package-variant p) + => force) + + ;; Otherwise build the new package object graph. + ((eq? (package-build-system p) build-system) + (package/inherit p + (location (package-location p)) + (name (let ((name (package-name p))) + (string-append new-prefix + (if (string-prefix? old-prefix name) + (substring name + (string-length old-prefix)) + name)))) + (arguments + (let ((compiler (if (promise? compiler) + (force compiler) + compiler))) + (ensure-keyword-arguments (package-arguments p) + `(,(symbol->keyword keyword) + ,compiler)))))) + (else p))) + + (define (cut? p) + (or (not (eq? (package-build-system p) build-system)) + (package-variant p))) + + (package-mapping transform cut?)) + (define (transitive-inputs inputs) "Return the closure of INPUTS when considering the 'propagated-inputs' edges. Omit duplicate inputs, except for those already present in INPUTS