From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id iEU/AgvZ3GACZgEAgWs5BA (envelope-from ) for ; Wed, 30 Jun 2021 22:50:19 +0200 Received: from aspmx1.migadu.com ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id iHmNOQrZ3GBsLAAA1q6Kng (envelope-from ) for ; Wed, 30 Jun 2021 20:50:18 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id B12A0221DA for ; Wed, 30 Jun 2021 22:50:18 +0200 (CEST) Received: from localhost ([::1]:53270 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lyhA1-0000ul-Oz for larch@yhetil.org; Wed, 30 Jun 2021 16:50:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45912) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lyh9p-0000rp-3N for guix-patches@gnu.org; Wed, 30 Jun 2021 16:50:05 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:47411) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lyh9o-0001iK-R0 for guix-patches@gnu.org; Wed, 30 Jun 2021 16:50:04 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lyh9o-0005CJ-Oo for guix-patches@gnu.org; Wed, 30 Jun 2021 16:50:04 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#49169] [PATCH v2 05/16] packages: Add 'modify-inputs'. Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 30 Jun 2021 20:50:04 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 49169 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 49169@debbugs.gnu.org Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= Received: via spool by 49169-submit@debbugs.gnu.org id=B49169.162508615319809 (code B ref 49169); Wed, 30 Jun 2021 20:50:04 +0000 Received: (at 49169) by debbugs.gnu.org; 30 Jun 2021 20:49:13 +0000 Received: from localhost ([127.0.0.1]:58932 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lyh8z-00059K-2e for submit@debbugs.gnu.org; Wed, 30 Jun 2021 16:49:13 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47872) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lyh8l-00055m-6S for 49169@debbugs.gnu.org; Wed, 30 Jun 2021 16:48:59 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:53128) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lyh8f-0000xO-V4; Wed, 30 Jun 2021 16:48:53 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=42586 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lyh8f-0001jQ-NA; Wed, 30 Jun 2021 16:48:53 -0400 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Date: Wed, 30 Jun 2021 22:48:21 +0200 Message-Id: <20210630204832.25753-6-ludo@gnu.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210630204832.25753-1-ludo@gnu.org> References: <20210622090221.15182-1-ludo@gnu.org> <20210630204832.25753-1-ludo@gnu.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Migadu-Flow: FLOW_IN ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1625086218; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post; bh=nTF23BFQviEnK71vd8dNNPFW0SVZZS4oSLki25FoRmw=; b=IVE1uEhBOcT4AWSKAqup/28a4ccDm/Ozexr3cARbQdzUtH0EKpmZTpVIplpn3Lqlc6ZLg6 +klbXNP+x/ufbMXJnaSolXlm1mLdiAtAAlDY4dHTcFboIMfQrLh4K+gyLkA/MY/e1GjXBg i8+GqabufrE4As75CcWIjS08r+EC4COROjCGc7hTEIQGEHcKWPSZa6LAi9y49RmXiJoULG ziTlkskUM0sJ8ZAxLPdODbg7Lur1REizarSCGcPyQHi6F4aC5ksDs/LIRqa5PdnCUrGiKz /xB1ezLSelNqlTFxE8bSoJu1JSno+FjgNTpeC5Uv63Pgmbsm3HOK878xoLVJ5g== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1625086218; a=rsa-sha256; cv=none; b=pnF/aKK/mv7qiOVuRf7fFjht4TMeWta3P/PMcdwBH4OzwlAPK3OAXMszTb6VFgIVUkIC1Y MRvCgX8wJFS6sBIpQWu3lt29WY9/84QrrsOKPtWa4l7Kl4xjjFH5K7kZcRms36voDf6VbW jfgo/ucR1QhR18I6VnPK0zfny9MxTpIxJZwk2fnbErtxwFq4WEUJA+V+R0xyis9PjwvakY hlfemJSCIaiWQNFw+qqOFQA4fMcDUGftYSdOplEe/fSBHzLLDwOmpcJ+OgN/fzoXr4xgAt KVghGWllPy3ur3NVEEG/Tl6j135VBrjJAZQRbAJh21FaNs/kaJpcV8IBKGzfqA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Migadu-Spam-Score: 3.58 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Migadu-Queue-Id: B12A0221DA X-Spam-Score: 3.58 X-Migadu-Scanner: scn1.migadu.com X-TUID: c4u2RmT/fYfv * guix/packages.scm (inputs-sans-labels, replace-input): New procedures. (prepend, replace, modify-inputs): New macros. * doc/guix.texi (Defining Package Variants): Document 'modify-inputs'. * dir-locals.el: Add 'modify-inputs' and its keywords. --- .dir-locals.el | 6 +++++ doc/guix.texi | 38 ++++++++++++++++++++------ guix/packages.scm | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 8 deletions(-) diff --git a/.dir-locals.el b/.dir-locals.el index 378071ea67..8cddfd7952 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -57,6 +57,12 @@ (eval . (put 'substitute* 'scheme-indent-function 1)) (eval . (put 'match-record 'scheme-indent-function 2)) + ;; 'modify-inputs' and its keywords. + (eval . (put 'modify-inputs 'scheme-indent-function 1)) + (eval . (put 'replace 'scheme-indent-function 1)) + (eval . (put 'prepend 'scheme-indent-function 2)) + (eval . (put 'append 'scheme-indent-function 2)) + ;; 'modify-phases' and its keywords. (eval . (put 'modify-phases 'scheme-indent-function 1)) (eval . (put 'replace 'scheme-indent-function 1)) diff --git a/doc/guix.texi b/doc/guix.texi index d88f857c3a..939b092a55 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -7120,20 +7120,42 @@ optional dependency, you can define a variant that removes that dependency like so: @lisp -(use-modules (gnu packages gdb) ;for 'gdb' - (srfi srfi-1)) ;for 'alist-delete' +(use-modules (gnu packages gdb)) ;for 'gdb' (define gdb-sans-guile (package (inherit gdb) - (inputs (alist-delete "guile" - (package-inputs gdb))))) + (inputs (modify-inputs (package-inputs gdb) + (delete "guile"))))) @end lisp -The @code{alist-delete} call above removes the tuple from the -@code{inputs} field that has @code{"guile"} as its first element -(@pxref{SRFI-1 Association Lists,,, guile, GNU Guile Reference -Manual}). +The @code{modify-inputs} form above removes the @code{"guile"} package +from the @code{inputs} field of @code{gdb}. The @code{modify-inputs} +macro is a helper that can prove useful anytime you want to remove, add, +or replace package inputs. + +@deffn {Scheme Syntax} modify-inputs @var{inputs} @var{clauses} +Modify the given package inputs, as returned by @code{package-inputs} & co., +according to the given clauses. The example below removes the GMP and ACL +inputs of Coreutils and adds libcap to the back of the input list: + +@lisp +(modify-inputs (package-inputs coreutils) + (delete "gmp" "acl") + (append libcap)) +@end lisp + +The example below replaces the @code{guile} package from the inputs of +@code{guile-redis} with @code{guile-2.2}: + +@lisp +(modify-inputs (package-inputs guile-redis) + (replace "guile" guile-2.2)) +@end lisp + +The last type of clause is @code{prepend}, to add inputs to the front of +the list. +@end deffn In some cases, you may find it useful to write functions (``procedures'', in Scheme parlance) that return a package based on some diff --git a/guix/packages.scm b/guix/packages.scm index c845026827..4ac1624ce2 100644 --- a/guix/packages.scm +++ b/guix/packages.scm @@ -55,6 +55,7 @@ #:re-export (%current-system %current-target-system search-path-specification) ;for convenience + #:re-export-and-replace (delete) ;used as syntactic keyword #:export (content-hash content-hash? content-hash-algorithm @@ -113,6 +114,10 @@ lookup-package-propagated-input lookup-package-direct-input + prepend ;syntactic keyword + replace ;syntactic keyword + modify-inputs + package-direct-sources package-transitive-sources package-direct-inputs @@ -923,6 +928,69 @@ otherwise." otherwise." (lookup-input (package-direct-inputs package) name)) +(define (inputs-sans-labels inputs) + "Return INPUTS stripped of any input labels." + (map (match-lambda + ((label obj) obj) + ((label obj output) `(,obj ,output))) + inputs)) + +(define (replace-input name replacement inputs) + "Replace input NAME by REPLACEMENT within INPUTS." + (map (lambda (input) + (match input + (((? string? label) . _) + (if (string=? label name) + (match replacement ;does REPLACEMENT specify an output? + ((_ _) (cons label replacement)) + (_ (list label replacement))) + input)))) + inputs)) + +(define-syntax prepend + (lambda (s) + (syntax-violation 'prepend + "'prepend' may only be used within 'modify-inputs'" + s))) + +(define-syntax replace + (lambda (s) + (syntax-violation 'replace + "'replace' may only be used within 'modify-inputs'" + s))) + +(define-syntax modify-inputs + (syntax-rules (delete prepend append replace) + "Modify the given package inputs, as returned by 'package-inputs' & co., +according to the given clauses. The example below removes the GMP and ACL +inputs of Coreutils and adds libcap: + + (modify-inputs (package-inputs coreutils) + (delete \"gmp\" \"acl\") + (append libcap)) + +Other types of clauses include 'prepend' and 'replace'." + ;; Note: This macro hides the fact that INPUTS, as returned by + ;; 'package-inputs' & co., is actually an alist with labels. Eventually, + ;; it will operate on list of inputs without labels. + ((_ inputs (delete name) clauses ...) + (modify-inputs (alist-delete name inputs) + clauses ...)) + ((_ inputs (delete names ...) clauses ...) + (modify-inputs (fold alist-delete inputs (list names ...)) + clauses ...)) + ((_ inputs (prepend lst ...) clauses ...) + (modify-inputs (append (list lst ...) (inputs-sans-labels inputs)) + clauses ...)) + ((_ inputs (append lst ...) clauses ...) + (modify-inputs (append (inputs-sans-labels inputs) (list lst ...)) + clauses ...)) + ((_ inputs (replace name replacement) clauses ...) + (modify-inputs (replace-input name replacement inputs) + clauses ...)) + ((_ inputs) + inputs))) + (define (package-direct-sources package) "Return all source origins associated with PACKAGE; including origins in PACKAGE's inputs." -- 2.32.0