From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp11.migadu.com ([2001:41d0:403:4876::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms8.migadu.com with LMTPS id yEtvExfQZGWPUQAA9RJhRA:P1 (envelope-from ) for ; Mon, 27 Nov 2023 18:21:27 +0100 Received: from aspmx1.migadu.com ([2001:41d0:403:4876::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp11.migadu.com with LMTPS id yEtvExfQZGWPUQAA9RJhRA (envelope-from ) for ; Mon, 27 Nov 2023 18:21:27 +0100 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 B11F058A25 for ; Mon, 27 Nov 2023 18:21:26 +0100 (CET) Authentication-Results: aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=gnu.org header.s=fencepost-gnu-org header.b=dq+DbQgM; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=pass (policy=none) header.from=gnu.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1701105687; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:list-id:list-help: list-unsubscribe:list-subscribe:list-post:dkim-signature; bh=YkcElb7QBBLSlfrSe5qrvJlreY1WdpE8TxDTWmH9JzU=; b=S2ul0QEUKcOYYhzEacaCEFmJFlsdxYFOEJXxptsR1sz6YRe2tmdjUxTZ+IfOt00/cEE7eq 6EXAMsuGcN8BtPtrO1qkJplh0/6JsudZWQeWjvxHqL6xDGq0wFtjyhquqwNFbyscDLa0no jqCHLFE8fV1emANm8NooaF8Neg8KNuq+6NarNd8DlEoVESBJ2ZZxM5NOJNi7gHLRx5teCA HVVnK2rO0fFmpJ393w9+Aoxz8agRftuRxYu030PwL19ZWYPqILlu60rJ6MbADorCmorRAS gBLoc2jJsR8v0jl6THyT31ONz8Cc1H0NSOd0I4pPWMGBon1qEjd8bQ9K8LPM0Q== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=gnu.org header.s=fencepost-gnu-org header.b=dq+DbQgM; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=pass (policy=none) header.from=gnu.org ARC-Seal: i=1; s=key1; d=yhetil.org; t=1701105687; a=rsa-sha256; cv=none; b=GXqc5vyKi6eMSq/dffobB6yCcyRe9Me9vY829N8LXndJJVaeTWgmc/UaydBY/AhdXP9sTP 9N/lfbOiMVxjprrU2I1Jo6Ra0fhBt3TLtVf3optvHEzzb5xMfzWw9LdgF2o4exKwy5VaJW Gi6lJhvcsD+yg9JaZlYK7o8VZiytm7SiLU7yjVpFXcy2b7fbR3GD58B7yLD30z4p1TSqwf rrki8LSPTi9BAoAT8eIdczI/kgVDXbAcLiqmLWB9NQ2BHvK08u20x5ENpJbtbAdMsox4yd cMZ2oWDx+FfjCDXacqKgKYKe+ROqodbhNINeudbLWGyor73Z+JoeZ7H5TBF+Xw== Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r7fI6-0007Vi-8O; Mon, 27 Nov 2023 12:21:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r7fI4-0007Sq-MP for guix-patches@gnu.org; Mon, 27 Nov 2023 12:21:00 -0500 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r7fI3-0007CG-Lo; Mon, 27 Nov 2023 12:21:00 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1r7fI6-00061v-Nu; Mon, 27 Nov 2023 12:21:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#67489] [PATCH] monad-repl: Add REPL commands to inspect package arguments. Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: guix@cbaines.net, dev@jpoiret.xyz, ludo@gnu.org, othacehe@gnu.org, rekado@elephly.net, zimon.toutoune@gmail.com, me@tobias.gr, guix-patches@gnu.org Resent-Date: Mon, 27 Nov 2023 17:21:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 67489 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 67489@debbugs.gnu.org Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= , Christopher Baines , Josselin Poiret , Ludovic =?UTF-8?Q?Court=C3=A8s?= , Mathieu Othacehe , Ricardo Wurmus , Simon Tournier , Tobias Geerinckx-Rice X-Debbugs-Original-To: guix-patches@gnu.org X-Debbugs-Original-Xcc: Christopher Baines , Josselin Poiret , Ludovic =?UTF-8?Q?Court=C3=A8s?= , Mathieu Othacehe , Ricardo Wurmus , Simon Tournier , Tobias Geerinckx-Rice Received: via spool by submit@debbugs.gnu.org id=B.170110562323124 (code B ref -1); Mon, 27 Nov 2023 17:21:02 +0000 Received: (at submit) by debbugs.gnu.org; 27 Nov 2023 17:20:23 +0000 Received: from localhost ([127.0.0.1]:44693 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r7fHS-00060t-J9 for submit@debbugs.gnu.org; Mon, 27 Nov 2023 12:20:23 -0500 Received: from lists.gnu.org ([2001:470:142::17]:48982) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r7fHQ-00060Z-9i for submit@debbugs.gnu.org; Mon, 27 Nov 2023 12:20:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r7fHB-0006RY-6U for guix-patches@gnu.org; Mon, 27 Nov 2023 12:20:05 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r7fH8-0006qC-NR; Mon, 27 Nov 2023 12:20:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:Date:Subject:To:From:in-reply-to: references; bh=MCtmqLvTGiCKgptuMwOHGQ6cp49gXT7uflbBblEspIs=; b=dq+DbQgMjPHpRq GWwBQZ+UeF6GGTzcmXAhrupR8lZDRIhjRd9qUembdvjM3OucAxWJO6r3CFZOLbs8jJYmy0CJU9wMY +WFFJqQxozsgweWg/HkgAcR59bqPwgJ2MOH+nbyo7QMyMIlp18I8tlNhEGrkXxl219+heAo2TQUQZ HsXBCI284gHJyg1uH3gWn6GsOn+jtken86LWTsKjyDWVu2AKhPVXbhHj2rR8bk5ozFUsm6sqxMhmF 4aCR3oFA0tn7C6QdjDr4mxXW0AzogedIoGq6ogECw/PLgSQZcpQKLt4jUkJlhT8kmWnEO6DwQZ0sV Ds1dQ5Kn7+Q+TmSr7htQ==; From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Date: Mon, 27 Nov 2023 18:19:43 +0100 Message-ID: <46b62be786928db845547a02f54d16b2635727f9.1701105272.git.ludo@gnu.org> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 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-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Queue-Id: B11F058A25 X-Spam-Score: -4.33 X-Migadu-Scanner: mx10.migadu.com X-Migadu-Spam-Score: -4.33 X-TUID: ywE5Ubdg1+TV From: Ludovic Courtès * guix/monad-repl.scm (keyword-argument-value, package-argument-command): New procedures. (phases, configure-flags, make-flags): New REPL commands. * doc/guix.texi (package Reference): Link to “Using Guix Interactively”. (Defining Package Variants): Add “Tips” quotation. (Build Phases): Add “Tip” quotation. (Using Guix Interactively): Document the new REPL commands. Change-Id: I7049c1d8aa9241e07d7c921aa396e578a1b4ef16 --- doc/guix.texi | 61 +++++++++++++++++++++++++++++++++++++ guix/monad-repl.scm | 74 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 131 insertions(+), 4 deletions(-) Hello! Someone recently suggested we should have better debugging facilities for packagers, in particular when dealing with package variants, inheritance, and so on, which make it harder to understand what’s going on. This change partially addresses that problem: new REPL commands let you inspect the code of #:phases, #:configure-flags, and #:make-flags. --8<---------------cut here---------------start------------->8--- scheme@(guix-user)> ,use(guix) scheme@(guix-user)> ,use(gnu packages mpi) scheme@(guix-user)> ,use(gnu packages guile) scheme@(guix-user)> ,phases guile-3.0 $1 = (modify-phases (modify-phases %standard-phases (add-before 'configure 'pre-configure (lambda* (#:key inputs #:allow-other-keys) (let ((bash (assoc-ref inputs "bash"))) (substitute* "module/ice-9/popen.scm" (("/bin/sh") (string-append bash "/bin/bash"))) #t)))) (add-before 'check 'disable-stack-overflow-test (lambda _ (substitute* "test-suite/standalone/test-stack-overflow" (("!#") "!#\n(exit 77)\n"))))) scheme@(guix-user)> ,configure-flags openmpi $2 = `("--enable-mpi-ext=affinity" "--with-sge" "--enable-memchecker" "--with-valgrind" "--with-hwloc=external" "--with-libevent" "--enable-mpirun-prefix-by-default" "--enable-openib-control-hdr-padding" "--enable-openib-dynamic-sl" "--enable-openib-udcm" "--enable-openib-rdmacm" "--enable-openib-rdmacm-ibaddr" "--with-pmix=internal" ,(string-append "--with-pmi=" "/gnu/store/h3vmqdgfnfqyk84vc1p3z57dqhrccx7b-slurm-23.02.6")) --8<---------------cut here---------------end--------------->8--- Thoughts? Ludo’. diff --git a/doc/guix.texi b/doc/guix.texi index 1fd2e21608..7dde9b727b 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -7975,6 +7975,10 @@ package Reference @code{#:phases}. The @code{#:phases} keyword in particular lets you modify the set of build phases for your package (@pxref{Build Phases}). +The REPL has dedicated commands to interactively inspect values of some +of these arguments, as a convenient debugging aid (@pxref{Using Guix +Interactively}). + @quotation Compatibility Note Until version 1.3.0, the @code{arguments} field would typically use @code{quote} (@code{'}) or @code{quasiquote} (@code{`}) and no @@ -8774,6 +8778,23 @@ Defining Package Variants applied to implicit inputs as well. @end deffn +@quotation Tips +Understanding what a variant really looks like can be difficult as one +starts combining the tools shown above. There are several ways to +inspect a package before attempting to build it that can prove handy: + +@itemize +@item +You can inspect the package interactively at the REPL, for instance to +view its inputs, the code of its build phases, or its configure flags +(@pxref{Using Guix Interactively}). + +@item +When rewriting dependencies, @command{guix graph} can often help +visualize the changes that are made (@pxref{Invoking guix graph}). +@end itemize +@end quotation + @node Writing Manifests @section Writing Manifests @@ -10585,6 +10606,11 @@ Build Phases the helpers used by this phase, and for more examples of @code{modify-phases}. +@quotation Tip +You can inspect the code associated with a package's @code{#:phases} +argument interactively, at the REPL (@pxref{Using Guix Interactively}). +@end quotation + @cindex code staging @cindex staging, of code Keep in mind that build phases are code evaluated at the time the @@ -12763,6 +12789,30 @@ Using Guix Interactively $5 = ("." ".." "egrep" "fgrep" "grep") @end example +As a packager, you may be willing to inspect the build phases or flags +of a given package; this is particularly useful when relying a lot on +inheritance to define package variants (@pxref{Defining Package +Variants}) or when package arguments are a result of some computation, +both of which can make it harder to foresee what ends up in the package +arguments. Additional commands let you inspect those package arguments: + +@example +scheme@@(guix-user)> ,phases grep +$1 = (modify-phases %standard-phases + (add-after 'install 'fix-egrep-and-fgrep + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin"))) + (substitute* (list (string-append bin "/egrep") + (string-append bin "/fgrep")) + (("^exec grep") + (string-append "exec " bin "/grep"))))))) +scheme@@(guix-user)> ,configure-flags findutils +$2 = (list "--localstatedir=/var") +scheme@@(guix-user)> ,make-flags binutils +$3 = '("MAKEINFO=true") +@end example + At a lower-level, a useful command is @code{lower}: it takes a file-like object and ``lowers'' it into a derivation (@pxref{Derivations}) or a store file: @@ -12794,6 +12844,17 @@ Using Guix Interactively shows build events only, and higher levels print build logs. @end deffn +@deffn {REPL command} phases @var{package} +@deffnx {REPL command} configure-flags @var{package} +@deffnx {REPL command} make-flags @var{package} +These REPL commands return the value of one element of the +@code{arguments} field of @var{package} (@pxref{package Reference}): the +first one show the staged code associated with @code{#:phases} +(@pxref{Build Phases}), the second shows the code for +@code{#:configure-flags}, and @code{,make-flags} returns the code for +@code{#:make-flags}. +@end deffn + @deffn {REPL command} run-in-store @var{exp} Run @var{exp}, a monadic expression, through the store monad. @xref{The Store Monad}, for more information. diff --git a/guix/monad-repl.scm b/guix/monad-repl.scm index 8a6053edd5..d6b39112b7 100644 --- a/guix/monad-repl.scm +++ b/guix/monad-repl.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2014, 2015, 2016, 2022 Ludovic Courtès +;;; Copyright © 2014-2016, 2022-2023 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,13 +21,15 @@ (define-module (guix monad-repl) #:use-module (guix monads) #:use-module (guix utils) #:use-module (guix packages) + #:autoload (guix build-system) (bag) #:use-module (guix status) - #:autoload (guix gexp) (lower-object) + #:autoload (guix gexp) (gexp gexp? lower-gexp lowered-gexp-sexp lower-object) #:use-module ((guix derivations) #:select (derivation? derivation->output-paths built-derivations)) + #:autoload (guix read-print) (pretty-print-with-comments) #:use-module (ice-9 match) - #:use-module (ice-9 pretty-print) + #:autoload (ice-9 pretty-print) (pretty-print) #:use-module (system repl repl) #:use-module (system repl common) #:use-module (system repl command) @@ -138,4 +140,68 @@ (define-meta-command ((enter-store-monad guix) repl) (repl-option-set! new 'interp #t) (run-repl new)))) -;;; monad-repl.scm ends here + +;;; +;;; Viewing package arguments. +;;; + +(define (keyword-argument-value args keyword default) + "Return the value associated with KEYWORD in ARGS, a keyword/value sequence, +or DEFAULT if KEYWORD is missing from ARGS." + (let loop ((args args)) + (match args + (() + default) + ((kw value rest ...) + (if (eq? kw keyword) + value + (loop rest)))))) + +(define (package-argument-command repl form keyword default) + "Implement a command that display KEYWORD, a keyword such as #:phases, in +the arguments of the package FORM evaluates to. Return DEFAULT is KEYWORD is +missing from those arguments." + (match (repl-eval repl form) + ((? package? package) + (let* ((bag* (bag + (inherit (package->bag package)) + (build (lambda* (name inputs #:rest args) + (with-monad %store-monad + (return (keyword-argument-value args keyword + default)))))))) + (define phases + (parameterize ((%graft? #f)) + (with-store store + (set-build-options store + #:print-build-trace #t + #:print-extended-build-trace? #t + #:multiplexed-build-output? #t) + (run-with-store store + (mlet %store-monad ((exp (bag->derivation bag*))) + (if (gexp? exp) + (mlet %store-monad ((gexp (lower-gexp exp))) + (return (lowered-gexp-sexp gexp))) + (return exp))))))) + + (run-hook before-print-hook phases) + (let ((column (port-column (current-output-port)))) + (pretty-print-with-comments (current-output-port) phases + #:indent column) + (newline (current-output-port))))) + (_ + (format #t ";; ERROR: This command only accepts package records.~%")))) + +(define-meta-command ((phases guix) repl (form)) + "phases +Return the build phases of the package defined by FORM." + (package-argument-command repl form #:phases #~%standard-phases)) + +(define-meta-command ((configure-flags guix) repl (form)) + "configure-flags +Return the configure flags of the package defined by FORM." + (package-argument-command repl form #:configure-flags #~'())) + +(define-meta-command ((make-flags guix) repl (form)) + "make-flags +Return the make flags of the package defined by FORM." + (package-argument-command repl form #:make-flags #~'())) base-commit: f3173bb901c0eee6c71d066cffab115d27052fc1 -- 2.41.0