mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-08-19 20:18:32 +00:00
* UTILITIES/org-fixup.el (org-make-org-version): Provide feature 'org-version. * lisp/org-compat.el (org-check-version): New macro. Check if org-version.el exists and provide autoloads to that. Otherwise check if org-fixup.el exists and use it to provide definitions. Finally if nothing worked, complain about a botched installation and provide fallback definitions. * lisp/org.el: Use org-check-version. This should finally provide the correct behaviour in all supported use-cases as well as a few corner scenarios that were reported on the mailing list and allow to always build on Git, ELPA and Emacs Bzr correctly. The file org-version.el must be added to the Emacs sources and should be re-generated each time orgmode Git is synced to Emacs Bzr (it would be best to automate this). Note that the internal functions (org-release) and (org-git-release) are not autoloaded when org-version is not present and become only available when org.el is loaded. This should pose no problem since they are only used by (org-version), which is autoloaded from org.el.
200 lines
7.1 KiB
EmacsLisp
200 lines
7.1 KiB
EmacsLisp
;;; org-fixup.el --- make life easier for folks without GNU make
|
||
;;
|
||
;; Author: Achim Gratz
|
||
;; Keywords: orgmode
|
||
;; Homepage: http://orgmode.org
|
||
;;
|
||
;; This file is not 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, 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; see the file COPYING. If not, write to the
|
||
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
;; Boston, MA 02110-1301, USA.
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
;;
|
||
;;; Commentary:
|
||
|
||
(require 'autoload)
|
||
(require 'org-compat "org-compat.el")
|
||
|
||
(defun org-make-org-version (org-release org-git-version odt-dir)
|
||
"Make the file org-version.el in the current directory.
|
||
This function is internally used by the build system and should
|
||
be used by foreign build systems or installers to produce this
|
||
file in the installation directory of org-mode. Org will not
|
||
work correctly if this file is not present (except directly from
|
||
the Git work tree)."
|
||
(with-temp-buffer
|
||
(insert "\
|
||
;;; org-version.el --- autogenerated file, do not edit
|
||
;;
|
||
;;; Code:
|
||
;;;\#\#\#autoload
|
||
\(defun org-release ()
|
||
\"The release version of org-mode.
|
||
Inserted by installing org-mode or when a release is made.\"
|
||
(let ((org-release \"" org-release "\"))
|
||
org-release))
|
||
;;;\#\#\#autoload
|
||
\(defun org-git-version ()
|
||
\"The Git version of org-mode.
|
||
Inserted by installing org-mode or when a release is made.\"
|
||
(let ((org-git-version \"" org-git-version "\"))
|
||
org-git-version))
|
||
;;;\#\#\#autoload
|
||
\(defconst org-odt-data-dir \"" odt-dir "\"
|
||
\"The location of ODT styles.\")
|
||
\f\n\(provide 'org-version\)
|
||
\f\n;; Local Variables:\n;; version-control: never
|
||
;; no-byte-compile: t
|
||
;; coding: utf-8\n;; End:\n;;; org-version.el ends here\n")
|
||
(toggle-read-only 0)
|
||
(write-file "org-version.el")))
|
||
|
||
(defun org-make-org-install ()
|
||
"Make the file org-install.el in the current directory.
|
||
This function is internally used by the build system and should
|
||
be used by foreign build systems or installers to produce this
|
||
file in the installation directory of org-mode. Org will not
|
||
work correctly if this file is not up-to-date."
|
||
(with-temp-buffer
|
||
(set-visited-file-name "org-install.el")
|
||
(insert ";;; org-install.el --- autogenerated file, do not edit\n;;\n;;; Code:\n")
|
||
(let ((files (directory-files default-directory nil "^\\(org\\|ob\\)\\(-.*\\)?\\.el$")))
|
||
(mapc (lambda (f) (generate-file-autoloads f)) files))
|
||
(insert "\f\n(provide 'org-install)\n")
|
||
(insert "\f\n;; Local Variables:\n;; version-control: never\n")
|
||
(insert ";; no-byte-compile: t\n;; no-update-autoloads: t\n")
|
||
(insert ";; coding: utf-8\n;; End:\n;;; org-install.el ends here\n")
|
||
(toggle-read-only 0)
|
||
(save-buffer)))
|
||
|
||
(defun org-make-autoloads (&optional compile force)
|
||
"Make the files org-install and org-version.el in the install directory.
|
||
Finds the install directory by looking for library \"org\".
|
||
Optionally byte-compile lisp files in the install directory or
|
||
force re-compilation. This function is provided for easier
|
||
manual install when the build system can't be used."
|
||
(let* ((origin default-directory)
|
||
(dirlisp (org-find-library-dir "org"))
|
||
(dirorg (concat dirlisp "../" ))
|
||
(dirodt (if (boundp 'org-odt-data-dir)
|
||
org-odt-data-dir
|
||
(concat dirorg "etc/"))))
|
||
(unwind-protect
|
||
(progn
|
||
(cd dirlisp)
|
||
(org-fixup)
|
||
(org-make-org-version (org-release) (org-git-version) dirodt)
|
||
(org-make-org-install)
|
||
(when compile (byte-recompile-directory dirlisp 0 force)))
|
||
(cd origin))))
|
||
|
||
(defun org-make-autoloads-compile ()
|
||
"Call org-make-autoloads with compile argument.
|
||
Convenience function for easier invocation from command line."
|
||
(org-make-autoloads 'compile nil))
|
||
|
||
(defun org-make-autoloads-compile-force ()
|
||
"Call org-make-autoloads with compile force arguments.
|
||
Convenience function for easier invocation from command line."
|
||
(org-make-autoloads 'compile 'force))
|
||
|
||
;; Internal functions
|
||
|
||
(defun org-make-local-mk ()
|
||
"Internal function for the build system."
|
||
(let ((default "default.mk")
|
||
(local "local.mk"))
|
||
(unwind-protect
|
||
(with-temp-buffer
|
||
(insert-file-contents default)
|
||
(goto-char (point-min))
|
||
(when (search-forward "-8<-" nil t)
|
||
(forward-line 1)
|
||
(delete-region (point-min) (point)))
|
||
(when (search-forward "->8-" nil t)
|
||
(forward-line 0)
|
||
(delete-region (point) (point-max)))
|
||
(goto-char (point-min))
|
||
(insert "
|
||
# Remove \"oldorg:\" to switch to \"all\" as the default target.
|
||
# Change \"oldorg:\" to an existing target to make that target the default,
|
||
# or define your own target here to become the default target.
|
||
oldorg: # do what the old Makfile did by default
|
||
|
||
##----------------------------------------------------------------------
|
||
")
|
||
(goto-char (point-max))
|
||
(insert "\
|
||
# See default.mk for further configuration options.
|
||
")
|
||
(toggle-read-only 0)
|
||
(write-file local))
|
||
nil)))
|
||
|
||
(defun org-make-letterformat (a4name lettername)
|
||
"Internal function for the build system."
|
||
(unwind-protect
|
||
(with-temp-buffer
|
||
(insert-file-contents a4name)
|
||
(goto-char (point-min))
|
||
(while (search-forward "\\pdflayout=(0l)" nil t)
|
||
(replace-match "\\pdflayout=(1l)" nil t))
|
||
(toggle-read-only 0)
|
||
(write-file lettername))
|
||
nil))
|
||
|
||
;; redefine version functions
|
||
|
||
(defmacro org-fixup ()
|
||
(let* ((origin default-directory)
|
||
(dirlisp (org-find-library-dir "org"))
|
||
(dirorg (concat dirlisp "../" ))
|
||
(dirgit (concat dirorg ".git/" ))
|
||
(org-version "N/A-fixup")
|
||
(org-git-version "N/A-fixup !!check installation!!"))
|
||
(if (and (boundp 'org-fake-release) (stringp org-fake-release)
|
||
(boundp 'org-fake-git-version) (stringp org-fake-git-version))
|
||
(setq org-version org-fake-release
|
||
org-git-version org-fake-git-version)
|
||
(if (load (concat dirlisp "org-version.el") 'noerror 'nomessage 'nosuffix)
|
||
(setq org-version (org-release)
|
||
org-git-version (org-git-version))
|
||
(when (and (file-exists-p dirgit)
|
||
(executable-find "git"))
|
||
(unwind-protect
|
||
(progn
|
||
(cd dirorg)
|
||
(let ((git6 (substring (shell-command-to-string "git describe --abbrev=6 HEAD") 0 -1))
|
||
(git0 (substring (shell-command-to-string "git describe --abbrev=0 HEAD") 0 -1))
|
||
(gitd (string-match "\\S-"
|
||
(shell-command-to-string "git status -uno --porcelain"))))
|
||
(setq org-git-version (concat git6 (when gitd ".dirty") "-git"))
|
||
(if (string-match "^release_" git0)
|
||
(setq org-version (substring git0 8))
|
||
(setq org-version git0))))
|
||
(cd origin)))))
|
||
(message "org-fixup.el: redefined org version.")
|
||
`(progn
|
||
(defun org-release () ,org-version)
|
||
(defun org-git-version () ,org-git-version))))
|
||
|
||
(provide 'org-fixup)
|
||
|
||
;; Local Variables:
|
||
;; no-byte-compile: t
|
||
;; coding: utf-8
|
||
;; End:
|
||
;;; org-fixup.el ends here
|