From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:bcc0::]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id kAtUMytJY2DiYAAAgWs5BA (envelope-from ) for ; Tue, 30 Mar 2021 17:52:11 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id MChhLStJY2BKFwAAB5/wlQ (envelope-from ) for ; Tue, 30 Mar 2021 15:52:11 +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 9A242209B6 for ; Tue, 30 Mar 2021 17:52:10 +0200 (CEST) Received: from localhost ([::1]:35572 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lRGf3-0006NT-In for larch@yhetil.org; Tue, 30 Mar 2021 11:52:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42580) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRGew-0006N3-0I for guix-patches@gnu.org; Tue, 30 Mar 2021 11:52:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:41162) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lRGev-00089t-Of for guix-patches@gnu.org; Tue, 30 Mar 2021 11:52:01 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lRGev-0005fa-Mg for guix-patches@gnu.org; Tue, 30 Mar 2021 11:52:01 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#43627] [PATCH core-updates v2 1/2] guix: Add an append-separator? field to the record. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Tue, 30 Mar 2021 15:52:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 43627 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 43627@debbugs.gnu.org Cc: ludo@gnu.org, Maxim Cournoyer Received: via spool by 43627-submit@debbugs.gnu.org id=B43627.161711948421741 (code B ref 43627); Tue, 30 Mar 2021 15:52:01 +0000 Received: (at 43627) by debbugs.gnu.org; 30 Mar 2021 15:51:24 +0000 Received: from localhost ([127.0.0.1]:52706 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lRGeJ-0005eZ-Si for submit@debbugs.gnu.org; Tue, 30 Mar 2021 11:51:24 -0400 Received: from mail-qv1-f54.google.com ([209.85.219.54]:39829) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lRGeG-0005eF-T9 for 43627@debbugs.gnu.org; Tue, 30 Mar 2021 11:51:22 -0400 Received: by mail-qv1-f54.google.com with SMTP id q9so8359164qvm.6 for <43627@debbugs.gnu.org>; Tue, 30 Mar 2021 08:51:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CUGpTFIO8NX/rF572Aw7kNol4yrge2C/QwdSDs7cEYE=; b=i+Bph2Z1jUzkkZF033GvODqb7VfK59Qi+e+MshfAgA9plriamhPu55wYQH0Y2v4drr bW0shwVofCZX448m8oUGJiO0GxK6nySuCpuFdbm2ejY+/j6ZnbEXi2/FYaFuIv06gu2y 6lUKswioVPr/jn9i45eZtBp5LU9HzySB42snVCc5ow3o4QctXQ1lUavSQEe+TYWo96Vu 7pvQsND7GzXUbqWwI/Qcd0FyStFwtVXSOXjTVsZgNtwZAtrudQvQQ51/xnBTd3yWcaqp zUp8RwlHN2zKvdJ21fpI+RuQRjAcssIFc2B8oN2nN42Kmo5JdFUTlGF7XPs5AUiYDOwQ Y9rQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CUGpTFIO8NX/rF572Aw7kNol4yrge2C/QwdSDs7cEYE=; b=kz68uDMwVmLD6/EQk3lj9ZYb2ZNA4BRWhxmY15w4MSZt57kzvAaZGdNarpfRKzh1A2 xifBvkPkLjy+0f5EZ8XB3dNOzIQyqMDLgJtuJGrnQZOZWoHaj7ybdEmjUZMv3hzpGahS Tz0JI312h+O5xCT96KLkJ0+xnDVZKVxoxDbAiLl+iTp46QWkN4yL9TTjP63mjvXvTJ/V NH07s7ap+HYs3OTkmGRBuq+0pvLkaYC5h2Eg09enY8orAKEp1vzxtRTTJ1wpTb1ak+wj sJlM1MXaqBWmYZKU2ZtmCjR31a0TlhfH1iB5fHyhGYkb0lOgqcTFXr/Vspx4z+Xx5xgK i2mQ== X-Gm-Message-State: AOAM530Emr+rL6WirWR4tlsKDPF5WRKS2v6KGB6gHZZdTLDSjVn+WgQH gMjxNSYOzbb/b+dcdVDNNg6oIUn+m5UlYA== X-Google-Smtp-Source: ABdhPJzPrxI0ire2jGRRJXoyjdGgieOcZ+/VmDwoEUcLCoBUQ4k3SgawPHfFFLx32cP+Z0eHIWeVYw== X-Received: by 2002:a05:6214:8c4:: with SMTP id da4mr30410145qvb.17.1617119474807; Tue, 30 Mar 2021 08:51:14 -0700 (PDT) Received: from localhost.localdomain ([207.35.95.145]) by smtp.gmail.com with ESMTPSA id e3sm891045qkn.99.2021.03.30.08.51.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Mar 2021 08:51:14 -0700 (PDT) From: Maxim Cournoyer Date: Tue, 30 Mar 2021 11:51:01 -0400 Message-Id: <20210330155102.16610-1-maxim.cournoyer@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <87blhtt6d6.fsf@gmail.com> References: <87blhtt6d6.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=yes 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=1617119530; 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:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=CUGpTFIO8NX/rF572Aw7kNol4yrge2C/QwdSDs7cEYE=; b=at7qvEUSLdgJ/GBsc+I87mr4KP7DbI+iJ2Pmu+fuXC2YcSMxpBGTitnfZRcqVrk0O6jpP5 x6pDwo3jbeVBXUgexdKBlvWeuPXAOCOoO2frdREIuLcasfg+dDkUZX9ikBnZHRZDechIdw KV6ZuPUctREDGKwtrC+8VKKv3ZcrJUeWlIvaiaTLxJVsGUmAsLdsp7phgib9tGohtWHDUm 3Fzyz+jRVU3quml140bHw8DnuyeCpeXUv+kihkZecTLAq35SFhwLn8HLOc7jQyyz1ad3z0 IaYXxQ/O0kIu5XYIySkSErG+lbfiUYY7etv+z13u+S12GkBiFc0uut4LHvjmyQ== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1617119530; a=rsa-sha256; cv=none; b=vAN2MpHEz6O1esfWjo8R9vRsvFw9P/+EsNzzVYk/qiJ1GYB3enR6qUBn3HhSJECx+u46hO srfIBmCtieGsMaUjB4RtUIO0S+2pNRiy5Mv4LHIKIb1+9sf/N1KY4IPeoWS47xXVU9ZEC4 GDUnfSe4nU4r2W5AhXRtgLJ3/VsY/qzNGNy1y6VTKDGRd4xkXNVzv3E4M1vqGKRIIKmGkS HXAf3b2eAyJ84tmwX/7Ym8AI8SLDtN63bF9wJq2/IY8WIoBrZw6sMr+ViLgYvb7ga5anAT GxDdtmxtPTxj/zYueEG2txAGITWOHxOJnUzets8ZVuPqZQzT2YmX1cvngUxNAg== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20161025 header.b=i+Bph2Z1; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none); 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: -1.32 Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20161025 header.b=i+Bph2Z1; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none); 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: 9A242209B6 X-Spam-Score: -1.32 X-Migadu-Scanner: scn0.migadu.com X-TUID: n10nokn8Gi+y This new field allows to specify in a search-path-specification that a trailing separator should be added to the computed value of the environment variable. A trailing separator sometimes has the meaning that the usual builtin locations should be looked up as well as the ones explicitly specified. One use case is to specify the Emacs library paths using EMACSLOADPATH. This allows to not embed the Emacs version in its search path specification, which has been shown to cause issues when upgrading a profile or when defining variant Emacs packages of different versions. * guix/search-paths.scm (searh-path-specification): Add an APPEND-SEPARATOR? field. (search-path-specification->sexp): Adjust accordingly. (sexp->search-path-specification): Likewise. (evaluate-search-paths): Append a separator to the search path value when both `separator' and `append-separator?' are #t. Document the new behavior. * guix/scripts/environment.scm (create-environment): Adjust the logic used to merge search-path values when creating an environment profile. * guix/build/gnu-build-system.scm (set-paths): Adjust accordingly. --- guix/build/gnu-build-system.scm | 12 ++++---- guix/build/profiles.scm | 13 ++++++--- guix/build/utils.scm | 12 ++++++-- guix/scripts/environment.scm | 11 ++++++-- guix/search-paths.scm | 49 +++++++++++++++++++++++---------- 5 files changed, 69 insertions(+), 28 deletions(-) diff --git a/guix/build/gnu-build-system.scm b/guix/build/gnu-build-system.scm index af64b3b61f..1e4d8fecb4 100644 --- a/guix/build/gnu-build-system.scm +++ b/guix/build/gnu-build-system.scm @@ -2,7 +2,7 @@ ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès ;;; Copyright © 2018 Mark H Weaver ;;; Copyright © 2020 Brendan Tildesley -;;; Copyright © 2021 Maxim Cournoyer +;;; Copyright © 2020, 2021 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -100,23 +100,25 @@ there are none." input-directories))) (for-each (match-lambda - ((env-var (files ...) separator type pattern) + ((env-var (files ...) separator type pattern append-sep) (set-path-environment-variable env-var files input-directories #:separator separator #:type type - #:pattern pattern))) + #:pattern pattern + #:append-separator? append-sep))) search-paths) (when native-search-paths ;; Search paths for native inputs, when cross building. (for-each (match-lambda - ((env-var (files ...) separator type pattern) + ((env-var (files ...) separator type pattern append-sep) (set-path-environment-variable env-var files native-input-directories #:separator separator #:type type - #:pattern pattern))) + #:pattern pattern + #:append-separator? append-sep))) native-search-paths))) (define* (install-locale #:key diff --git a/guix/build/profiles.scm b/guix/build/profiles.scm index a40c3f96de..83a4c4dd94 100644 --- a/guix/build/profiles.scm +++ b/guix/build/profiles.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès +;;; Copyright © 2020 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -20,6 +21,7 @@ #:use-module (guix build union) #:use-module (guix build utils) #:use-module (guix search-paths) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (ice-9 ftw) #:use-module (ice-9 match) @@ -51,10 +53,13 @@ user-friendly name of the profile is, for instance ~/.guix-profile rather than ((? string? separator) (let ((items (string-tokenize* value separator))) (cons search-path - (string-join (map (lambda (str) - (string-append replacement (crop str))) - items) - separator))))))))) + (string-join + (map (lambda (str) + (string-append replacement (crop str))) + ;; When APPEND-SEPARATOR? is #t, the trailing + ;; separator causes an empty string item. Remove it. + (remove string-null? items)) + separator))))))))) (define (write-environment-variable-definition port) "Write the given environment variable definition to PORT." diff --git a/guix/build/utils.scm b/guix/build/utils.scm index 6c37021673..354be2e6e3 100644 --- a/guix/build/utils.scm +++ b/guix/build/utils.scm @@ -573,7 +573,8 @@ for under the directories designated by FILES. For example: #:key (separator ":") (type 'directory) - pattern) + pattern + (append-separator? #f)) "Look for each of FILES of the given TYPE (a symbol as returned by 'stat:type') in INPUT-DIRS. Set ENV-VAR to a SEPARATOR-separated path accordingly. Example: @@ -590,11 +591,16 @@ denoting file names to look for under the directories designated by FILES: (list docbook-xml docbook-xsl) #:type 'regular #:pattern \"^catalog\\\\.xml$\") -" + +When both SEPARATOR and APPEND-SEPARATOR? are true, a separator is appended to +the value of the environment variable." (let* ((path (search-path-as-list files input-dirs #:type type #:pattern pattern)) - (value (list->search-path-as-string path separator))) + (value (list->search-path-as-string path separator)) + (value (if append-separator? + (string-append value separator) + value))) (if (string-null? value) (begin ;; Never set ENV-VAR to an empty string because often, the empty diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm index 0360761683..c0e081a4bc 100644 --- a/guix/scripts/environment.scm +++ b/guix/scripts/environment.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014, 2015, 2018 David Thompson ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès ;;; Copyright © 2018 Mike Gerwitz +;;; Copyright © 2020 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -81,12 +82,18 @@ variables with additional search paths." (when pure? (purify-environment white-list)) (for-each (match-lambda - ((($ variable _ separator) . value) + ((($ variable _ separator _ + append-separator?) . value) (let ((current (getenv variable))) (setenv variable (if (and current (not pure?)) (if separator - (string-append value separator current) + (if append-separator? + ;; There is already a trailing separator + ;; at the end of value. + ;; (see: `evaluate-search-paths'). + (string-append value current separator) + (string-append value separator current)) value) value))))) (profile-search-paths profile manifest)) diff --git a/guix/search-paths.scm b/guix/search-paths.scm index 002e6342bb..d783a2815f 100644 --- a/guix/search-paths.scm +++ b/guix/search-paths.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2014, 2015, 2017, 2018 Ludovic Courtès +;;; Copyright © 2020 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -30,6 +31,7 @@ search-path-specification-separator search-path-specification-file-type search-path-specification-file-pattern + search-path-specification-append-separator? $PATH @@ -54,14 +56,16 @@ (define-record-type* search-path-specification make-search-path-specification search-path-specification? - (variable search-path-specification-variable) ;string - (files search-path-specification-files) ;list of strings - (separator search-path-specification-separator ;string | #f - (default ":")) - (file-type search-path-specification-file-type ;symbol - (default 'directory)) - (file-pattern search-path-specification-file-pattern ;#f | string - (default #f))) + (variable search-path-specification-variable) ;string + (files search-path-specification-files) ;list of strings + (separator search-path-specification-separator ;string | #f + (default ":")) + (file-type search-path-specification-file-type ;symbol + (default 'directory)) + (file-pattern search-path-specification-file-pattern ;#f | string + (default #f)) + (append-separator? search-path-specification-append-separator? ;#f | #t + (default #f))) (define $PATH ;; The 'PATH' variable. This variable is a bit special: it is not attached @@ -76,20 +80,32 @@ corresponds to the arguments expected by `set-path-environment-variable'." ;; Note that this sexp format is used both by build systems and in ;; (guix profiles), so think twice before you change it. (match spec - (($ variable files separator type pattern) - `(,variable ,files ,separator ,type ,pattern)))) + (($ variable files separator type pattern + append-separator?) + `(,variable ,files ,separator ,type ,pattern ,append-separator?)))) (define (sexp->search-path-specification sexp) "Convert SEXP, which is as returned by 'search-path-specification->sexp', to a object." (match sexp + ((variable files separator type pattern append-separator?) + (search-path-specification + (variable variable) + (files files) + (separator separator) + (file-type type) + (file-pattern pattern) + (append-separator? append-separator?))) + ;; Previous search-path-specification form (without append-separator? + ;; might still be found in manifest files. ((variable files separator type pattern) (search-path-specification (variable variable) (files files) (separator separator) (file-type type) - (file-pattern pattern))))) + (file-pattern pattern) + (append-separator? #f))))) (define-syntax-rule (with-null-error-port exp) "Evaluate EXP with the error port pointing to the bit bucket." @@ -131,7 +147,9 @@ like `string-tokenize', but SEPARATOR is a string." "Evaluate SEARCH-PATHS, a list of search-path specifications, for DIRECTORIES, a list of directory names, and return a list of specification/value pairs. Use GETENV to determine the current settings and -report only settings not already effective." +report only settings not already effective. When the search path +specification APPEND-SEPARATOR? and SEPARATOR fields are both set to true, a +separator is appended to its computed value." (define (search-path-definition spec) (match spec (($ variable files #f type pattern) @@ -148,7 +166,7 @@ report only settings not already effective." #f ;VARIABLE already set appropriately (cons spec head)))))) (($ variable files separator - type pattern) + type pattern append-separator?) (let* ((values (or (and=> (getenv variable) (cut string-tokenize* <> separator)) '())) @@ -161,7 +179,10 @@ report only settings not already effective." #:pattern pattern)))) (if (every (cut member <> values) path) #f ;VARIABLE is already set appropriately - (cons spec (string-join path separator))))))) + (let ((value (string-join path separator))) + (cons spec (if append-separator? + (string-append value separator) + value)))))))) (filter-map search-path-definition search-paths)) -- 2.31.1