summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorLars Ingebrigtsen <larsi@gnus.org>2022-06-05 16:36:25 +0200
committerLars Ingebrigtsen <larsi@gnus.org>2022-06-05 16:36:34 +0200
commit9d2f4a8d5a92fdfab80ce9faf0dcfa159189916b (patch)
treee594acec129ce3637dd49e22ad8f771e3b247fd7 /lisp/emacs-lisp
parentac6660a2d026e89214814768990d0d232f0a9d06 (diff)
downloademacs-9d2f4a8d5a92fdfab80ce9faf0dcfa159189916b.tar.gz
emacs-9d2f4a8d5a92fdfab80ce9faf0dcfa159189916b.tar.bz2
emacs-9d2f4a8d5a92fdfab80ce9faf0dcfa159189916b.zip
Add convenience functions for generating Emacs Lisp files
* lisp/url/url-cookie.el (url-cookie-write-file): * lisp/international/titdic-cnv.el (tit-process-header): * lisp/international/ja-dic-cnv.el (skkdic-convert): * lisp/international/emoji.el (emoji--generate-file): * lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--rubric) * admin/unidata/unidata-gen.el (unidata-gen-file) (unidata-gen-charprop): Use the new functions. * lisp/emacs-lisp/generate-file.el: New file to provide convenience functions for generated files. It's not always trivial to know which parts of the trailer that has to be obfuscated to avoid not getting byte-compiled etc, and some parts of the headers/trailers are usually forgotten when hand-coding these.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/generate-file.el111
-rw-r--r--lisp/emacs-lisp/loaddefs-gen.el41
2 files changed, 126 insertions, 26 deletions
diff --git a/lisp/emacs-lisp/generate-file.el b/lisp/emacs-lisp/generate-file.el
new file mode 100644
index 00000000000..456503df6a3
--- /dev/null
+++ b/lisp/emacs-lisp/generate-file.el
@@ -0,0 +1,111 @@
+;;; generate-file.el --- utility functions for generated files -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Keywords: maint
+;; Package: emacs
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl-lib))
+
+(cl-defun generate-file-heading (file &key description text (code t))
+ "Insert a standard header for FILE.
+This header will specify that this is a generated file that
+should not be edited.
+
+If `standard-output' is bound to a buffer, insert in that buffer.
+If no, insert at point in the current buffer.
+
+DESCRIPTION (if any) will be used in the first line.
+
+TEXT (if given) will be inserted as a comment.
+
+If CODE is non-nil (which is the default), a Code: line is
+inserted."
+ (with-current-buffer (if (bufferp standard-output)
+ standard-output
+ (current-buffer))
+ (insert ";;; " (file-name-nondirectory file)
+ " --- "
+ (or description "automatically generated")
+ " (do not edit) "
+ " -*- lexical-binding: t -*-\n\n"
+ ";; This file is part of GNU Emacs.\n\n")
+ (when text
+ (insert ";;; Commentary:\n\n")
+ (let ((start (point))
+ (fill-prefix ";; "))
+ (insert ";; " text)
+ (fill-region start (point))))
+ (ensure-empty-lines 1)
+ (when code
+ (insert ";;; Code:\n\n"))))
+
+(cl-defun generate-file-trailer (file &key version inhibit-provide
+ (coding 'utf-8-emacs-unix) autoloads
+ compile provide)
+ "Insert a standard trailer for FILE.
+By default, this trailer inhibits version control, byte
+compilation, updating autoloads, and uses a `utf-8-emacs-unix'
+coding system. These can be inhibited by providing non-nil
+values to the VERSION, NO-PROVIDE, AUTOLOADS and COMPILE
+keyword arguments.
+
+CODING defaults to `utf-8-emacs-unix'. Use a nil value to
+inhibit generating this setting, or a coding system value to use
+that.
+
+If PROVIDE is non-nil, use that in the `provide' statement
+instead of using FILE as the basis.
+
+If `standard-output' is bound to a buffer, insert in that buffer.
+If no, insert at point in the current buffer."
+ (with-current-buffer (if (bufferp standard-output)
+ standard-output
+ (current-buffer))
+ (ensure-empty-lines 1)
+ (unless inhibit-provide
+ (insert (format "(provide '%s)\n\n"
+ (or provide
+ (file-name-sans-extension
+ (file-name-nondirectory file))))))
+ ;; Some of the strings below are chopped into bits to inhibit
+ ;; automatic scanning tools from thinking that they are actual
+ ;; directives.
+ (insert ";; Local " "Variables:\n")
+ (unless version
+ (insert ";; version-control: never\n"))
+ (unless compile
+ (insert ";; no-byte-" "compile: t\n")) ;; #$ is byte-compiled into nil.
+ (unless autoloads
+ (insert ";; no-update-autoloads: t\n"))
+ (when coding
+ (insert (format ";; coding: %s\n"
+ (if (eq coding t)
+ 'utf-8-emacs-unix
+ coding))))
+ (insert
+ ";; End:\n\n"
+ ";;; " (file-name-nondirectory file) " ends here\n")))
+
+(provide 'generate-file)
+
+;;; generate-file.el ends here
diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el
index dce5466be2d..9aa2967d7b3 100644
--- a/lisp/emacs-lisp/loaddefs-gen.el
+++ b/lisp/emacs-lisp/loaddefs-gen.el
@@ -40,6 +40,7 @@
(require 'radix-tree)
(require 'lisp-mnt)
+(require 'generate-file)
(defvar autoload-compute-prefixes t
"If non-nil, autoload will add code to register the prefixes used in a file.
@@ -437,32 +438,20 @@ but adds an extra line to the output to modify `load-path'.
If FEATURE is non-nil, FILE will provide a feature. FEATURE may
be a string naming the feature, otherwise it will be based on
FILE's name."
- (let ((basename (file-name-nondirectory file))
- (lp (if (equal type "package") (setq type "autoloads"))))
- (concat ";;; " basename
- " --- automatically extracted " (or type "autoloads")
- " -*- lexical-binding: t -*-\n"
- (when (string-match "/lisp/loaddefs\\.el\\'" file)
- ";; This file will be copied to ldefs-boot.el and checked in periodically.\n")
- ";;\n"
- ";;; Code:\n\n"
- (if lp
- "(add-to-list 'load-path (directory-file-name
- (or (file-name-directory #$) (car load-path))))\n\n")
- " \n;;; End of scraped data\n\n"
- ;; This is used outside of autoload.el, eg cus-dep, finder.
- (if feature
- (format "(provide '%s)\n"
- (if (stringp feature) feature
- (file-name-sans-extension basename))))
- ";; Local Variables:\n"
- ";; version-control: never\n"
- ";; no-byte-compile: t\n" ;; #$ is byte-compiled into nil.
- ";; no-update-autoloads: t\n"
- ";; coding: utf-8-emacs-unix\n"
- ";; End:\n"
- ";;; " basename
- " ends here\n")))
+ (let ((lp (and (equal type "package") (setq type "autoloads"))))
+ (with-temp-buffer
+ (generate-file-heading
+ file
+ :description (concat "automatically extracted " (or type "autoloads"))
+ :text (and (string-match "/lisp/loaddefs\\.el\\'" file)
+ "This file will be copied to ldefs-boot.el and checked in periodically."))
+ (when lp
+ (insert "(add-to-list 'load-path (directory-file-name
+ (or (file-name-directory #$) (car load-path))))\n\n"))
+ (insert " \n;;; End of scraped data\n\n")
+ (generate-file-trailer file :provide (and (stringp feature) feature)
+ :inhibit-provide (not feature))
+ (buffer-string))))
(defun loaddefs-generate--insert-section-header (outbuf autoloads
load-name file time)