summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2021-09-06 18:00:51 +0200
committerLudovic Courtès <ludo@gnu.org>2021-09-06 22:02:11 +0200
commitf8ae824cadb97a5c0b70e69fd44c1d97c46be820 (patch)
tree076298e74e9a8f2f1f4a8c9dc87524a39a0f6c2e
parent78dab5a6c4979a62c3ff3df977d895a840c7ef20 (diff)
downloadguix-f8ae824cadb97a5c0b70e69fd44c1d97c46be820.tar.gz
deprecation: Add 'define-deprecated/public'.
* guix/deprecation.scm (public): New macro.
(define-deprecated): Add (_ visibility variable replacement exp) clause.
Honor VISIBILITY.
(define-deprecated/public): New macro.
-rw-r--r--guix/deprecation.scm22
1 files changed, 20 insertions, 2 deletions
diff --git a/guix/deprecation.scm b/guix/deprecation.scm
index 04d4d4a337..c66c9367f6 100644
--- a/guix/deprecation.scm
+++ b/guix/deprecation.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2019, 2020 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +21,8 @@
   #:use-module (guix diagnostics)
   #:autoload   (guix utils) (source-properties->location)
   #:export (define-deprecated
+
+            define-deprecated/public
             define-deprecated/alias
             warn-about-deprecation))
 
@@ -39,6 +41,8 @@
         (warning location (G_ "'~a' is deprecated~%")
                  variable))))
 
+(define-syntax public (syntax-rules ()))          ;private syntactic keyword
+
 (define-syntax define-deprecated
   (lambda (s)
     "Define a deprecated variable or procedure, along these lines:
@@ -53,6 +57,8 @@ This will write a deprecation warning to GUIX-WARNING-PORT."
        #'(define-deprecated proc replacement
            (lambda* (formals ...) body ...)))
       ((_ variable replacement exp)
+       #'(define-deprecated private variable replacement exp))
+      ((_ visibility variable replacement exp)
        (identifier? #'variable)
        (with-syntax ((real (datum->syntax
                             #'variable
@@ -74,11 +80,23 @@ This will write a deprecation warning to GUIX-WARNING-PORT."
                     #'(real args (... ...)))
                    (id
                     (identifier? #'id)
-                    #'real)))))))
+                    #'real))))
+
+             ;; When asking for public visibility, export both REAL and
+             ;; VARIABLE.  Exporting REAL is useful when defining deprecated
+             ;; packages: there must be a public variable bound to a package
+             ;; so that the (guix discover) machinery finds it.
+             #,(if (free-identifier=? #'visibility #'public)
+                   #'(export real variable)
+                   #'(begin)))))
       ((_ variable alias)
        (identifier? #'alias)
        #'(define-deprecated variable alias alias)))))
 
+(define-syntax-rule (define-deprecated/public body ...)
+  "Like 'define/deprecated', but export all the newly introduced bindings."
+  (define-deprecated public body ...))
+
 (define-syntax-rule (define-deprecated/alias deprecated replacement)
   "Define as an alias a deprecated variable, procedure, or macro, along
 these lines: