From 9b589ed47b87a84bf507015a53e9577d4fb66c1c Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 27 Jun 2013 00:22:16 -0400 Subject: [PATCH] * GNUmakefile: Rename from Makefile. Add targets for in-place use. (all, all-in-place): New targets. * admin/archive-contents.el (archive--simple-package-p): Ignore autosave files. (archive--refresh-pkg-file): New function. (archive--write-pkg-file): Print with ' and ` shorthands. * packages/company/company-pysmell.el: Don't require pysmell during compile. * packages/muse/htmlize-hack.el: Don't require htmlize during compile. * packages/shen-mode/shen-mode.el (shen-functions): Define during compile. * smart-operator/smart-operator.el (smart-operator-insert-1): Use pcase. --- GNUmakefile | 149 ++++++++++++++++++++++ Makefile | 76 ----------- admin/archive-contents.el | 18 ++- packages/company/company-pysmell.el | 4 +- packages/muse/htmlize-hack.el | 3 +- packages/shen-mode/shen-mode.el | 5 +- packages/smart-operator/smart-operator.el | 12 +- 7 files changed, 177 insertions(+), 90 deletions(-) create mode 100644 GNUmakefile delete mode 100644 Makefile diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 000000000..5d4506518 --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,149 @@ +# Makefile for GNU Emacs Lisp Package Archive. + +EMACS=emacs + +ARCHIVE_TMP=archive-tmp +SITE_DIR=site + +.PHONY: archive-tmp changelogs process-archive archive-full org-fetch clean all do-it + +all: all-in-place + +## Set up the source files for direct usage, by pointing +## `package-directory-list' to the site/ directory. +site: packages + mkdir -p $(SITE_DIR) + $(EMACS) -batch -l $(CURDIR)/admin/archive-contents.el \ + --eval "(batch-make-site-dir \"packages\" \"$(SITE_DIR)\")" + +site/%: do-it + $(EMACS) -batch -l $(CURDIR)/admin/archive-contents.el \ + --eval "(progn (setq debug-on-error t) (batch-make-site-package \"$@\"))" + +## Deploy the package archive to archive/, with packages in +## archive/packages/: +archive: archive-tmp + $(MAKE) $(MFLAGS) process-archive + +archive-tmp: packages changelogs + -rm -r $(ARCHIVE_TMP) + mkdir -p $(ARCHIVE_TMP) + cp -a packages/. $(ARCHIVE_TMP)/packages + +# Refresh the ChangeLog files. This needs to be done in +# the source tree, because it needs the Bzr data! +changelogs: + cd packages; \ + $(EMACS) -batch -l $(CURDIR)/admin/archive-contents.el \ + -f batch-prepare-packages + +process-archive: + # FIXME, we could probably speed this up significantly with + # rules like "%.tar: ../%/ChangeLog" so we only rebuild the packages + # that have indeed changed. + cd $(ARCHIVE_TMP)/packages; $(EMACS) -batch -l $(CURDIR)/admin/archive-contents.el -f batch-make-archive + @cd $(ARCHIVE_TMP)/packages; \ + for pt in *; do \ + if [ -d $$pt ]; then \ + echo "Creating tarball $${pt}.tar" && \ + tar -cf $${pt}.tar $$pt --remove-files; \ + fi; \ + done + mkdir -p archive/packages + mv archive/packages archive/packages-old + mv $(ARCHIVE_TMP)/packages archive/packages + chmod -R a+rX archive/packages + rm -rf archive/packages-old + rm -rf $(ARCHIVE_TMP) + +## Deploy the package archive to archive/ including the Org daily: +archive-full: archive-tmp org-fetch + $(MAKE) $(MFLAGS) process-archive + #mkdir -p archive/admin + #cp admin/* archive/admin/ + +org-fetch: archive-tmp + cd $(ARCHIVE_TMP)/packages; \ + pkgname=`curl -s http://orgmode.org/elpa/|perl -ne 'push @f, $$1 if m/(org-\d{8})\.tar/; END { @f = sort @f; print "$$f[-1]\n"}'`; \ + wget -q http://orgmode.org/elpa/$${pkgname}.tar -O $${pkgname}.tar; \ + if [ -f $${pkgname}.tar ]; then \ + tar xf $${pkgname}.tar; \ + rm -f $${pkgname}.tar; \ + mv $${pkgname} org; \ + fi + +clean: + rm -rf archive $(ARCHIVE_TMP) $(SITE_DIR) + +########## Rules for in-place installation ########## +pkgs := $(foreach pkg, $(wildcard packages/*), \ + $(if $(shell [ -d "$(pkg)" ] && echo true), $(pkg))) + +define SET-diff +$(shell echo "$(1)" "$(2)" "$(2)" | tr ' ' '\n' | sort | uniq -u) +endef + +define FILTER-nonsrc +$(filter-out %-autoloads.el %-pkg.el, $(1)) +endef + +define RULE-srcdeps +$(1): $$(call FILTER-nonsrc, $$(wildcard $$(dir $(1))/*.el)) +endef + +# Compute the set of autolods files and their dependencies. +autoloads := $(foreach pkg, $(pkgs), $(pkg)/$(notdir $(pkg))-autoloads.el) + +$(foreach al, $(autoloads), $(eval $(call RULE-srcdeps, $(al)))) +%-autoloads.el: + @echo 'EMACS -f package-generate-autoloads $@' + @cd $(dir $@); \ + $(EMACS) --batch \ + -l $(CURDIR)/admin/archive-contents.el \ + --eval "(archive--refresh-pkg-file)" \ + --eval "(require 'package)" \ + --eval "(package-generate-autoloads '$$(basename $$(pwd)) \ + \"$$(pwd)\")" + +# Put into elcs the set of elc files we need to keep up-to-date. +# I.e. one for each .el file except for the -pkg.el, the -autoloads.el, and +# the .el files that are marked "no-byte-compile". +els := $(call FILTER-nonsrc, $(wildcard packages/*/*.el)) +naive_elcs := $(patsubst %.el, %.elc, $(els)) +current_elcs := $(wildcard packages/*/*.elc) + +extra_els := $(call SET-diff, $(els), $(patsubst %.elc, %.el, $(current_elcs))) +nbc_els := $(foreach el, $(extra_els), \ + $(if $(shell grep '^;.*no-byte-compile: t' "$(el)"), $(el))) +elcs := $(call SET-diff, $(naive_elcs), $(patsubst %.el, %.elc, $(nbc_els))) + +# '(dolist (al (quote ($(patsubst %, "%", $(autoloads))))) (load (expand-file-name al) nil t))' +%.elc: %.el $(autoloads) + @echo 'EMACS -f batch-byte-compile $<' + @$(EMACS) --batch \ + --eval "(setq package-directory-list '(\"$(abspath packages)\"))" \ + --eval '(package-initialize)' \ + -L $(dir $@) -f batch-byte-compile $< + +# Remove .elc files that don't have a corresponding .el file any more. +extra_elcs := $(call SET-diff, $(current_elcs), $(naive_elcs)) +.PHONY: $(extra_elcs) +$(extra_elcs):; rm $@ + +# # Put into single_pkgs the set of -pkg.el files we need to keep up-to-date. +# # I.e. all the -pkg.el files for the single-file packages. +# single_pkgs:=$(foreach pkg, $(pkgs), \ +# $(word $(words $(call FILTER-nonsrc, \ +# $(wildcard $(pkg)/*.el))), \ +# $(pkg)/$(notdir $(pkg))-pkg.el)) +# #$(foreach al, $(single_pkgs), $(eval $(call RULE-srcdeps, $(al)))) +# %-pkg.el: %.el +# @echo 'EMACS -f package-generate-description-file $@' +# @$(EMACS) --batch \ +# --eval '(require (quote package))' \ +# --eval '(setq b (find-file-noselect "$<"))' \ +# --eval '(setq d (with-current-buffer b (package-buffer-info)))' \ +# --eval '(package-generate-description-file d "$(dir $@)")' + + +all-in-place: $(extra_elcs) $(autoloads) $(elcs) # $(single_pkgs) diff --git a/Makefile b/Makefile deleted file mode 100644 index b9b49fa1a..000000000 --- a/Makefile +++ /dev/null @@ -1,76 +0,0 @@ -# Makefile for GNU Emacs Lisp Package Archive. - -EMACS=emacs - -ARCHIVE_TMP=archive-tmp -SITE_DIR=site - -.PHONY: archive-tmp changelogs process-archive archive-full org-fetch clean all do-it - -## Set up the source files for direct usage, by pointing -## `package-directory-list' to the site/ directory. -site: packages - mkdir -p $(SITE_DIR) - $(EMACS) -batch -l $(CURDIR)/admin/archive-contents.el \ - --eval "(batch-make-site-dir \"packages\" \"$(SITE_DIR)\")" - -site/%: do-it - $(EMACS) -batch -l $(CURDIR)/admin/archive-contents.el \ - --eval "(progn (setq debug-on-error t) (batch-make-site-package \"$@\"))" - -## Deploy the package archive to archive/, with packages in -## archive/packages/: -archive: archive-tmp - $(MAKE) $(MFLAGS) process-archive - -archive-tmp: packages changelogs - -rm -r $(ARCHIVE_TMP) - mkdir -p $(ARCHIVE_TMP) - cp -a packages/. $(ARCHIVE_TMP)/packages - -# Refresh the ChangeLog files. This needs to be done in -# the source tree, because it needs the Bzr data! -changelogs: - cd packages; \ - $(EMACS) -batch -l $(CURDIR)/admin/archive-contents.el \ - -f batch-prepare-packages - -process-archive: - # FIXME, we could probably speed this up significantly with - # rules like "%.tar: ../%/ChangeLog" so we only rebuild the packages - # that have indeed changed. - cd $(ARCHIVE_TMP)/packages; $(EMACS) -batch -l $(CURDIR)/admin/archive-contents.el -f batch-make-archive - @cd $(ARCHIVE_TMP)/packages; \ - for pt in *; do \ - if [ -d $$pt ]; then \ - echo "Creating tarball $${pt}.tar" && \ - tar -cf $${pt}.tar $$pt --remove-files; \ - fi; \ - done - mkdir -p archive/packages - mv archive/packages archive/packages-old - mv $(ARCHIVE_TMP)/packages archive/packages - chmod -R a+rX archive/packages - rm -rf archive/packages-old - rm -rf $(ARCHIVE_TMP) - -## Deploy the package archive to archive/ including the Org daily: -archive-full: archive-tmp org-fetch - $(MAKE) $(MFLAGS) process-archive - #mkdir -p archive/admin - #cp admin/* archive/admin/ - -org-fetch: archive-tmp - cd $(ARCHIVE_TMP)/packages; \ - pkgname=`curl -s http://orgmode.org/elpa/|perl -ne 'push @f, $$1 if m/(org-\d{8})\.tar/; END { @f = sort @f; print "$$f[-1]\n"}'`; \ - wget -q http://orgmode.org/elpa/$${pkgname}.tar -O $${pkgname}.tar; \ - if [ -f $${pkgname}.tar ]; then \ - tar xf $${pkgname}.tar; \ - rm -f $${pkgname}.tar; \ - mv $${pkgname} org; \ - fi - -clean: - rm -rf archive $(ARCHIVE_TMP) $(SITE_DIR) - -all: site diff --git a/admin/archive-contents.el b/admin/archive-contents.el index 28a949d7a..56daa8edb 100644 --- a/admin/archive-contents.el +++ b/admin/archive-contents.el @@ -1,6 +1,6 @@ ;;; archive-contents.el --- Auto-generate an Emacs Lisp package archive. -;; Copyright (C) 2011, 2012 Free Software Foundation, Inc +;; Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc ;; Author: Stefan Monnier @@ -132,7 +132,7 @@ Otherwise, return nil." (files (directory-files dir nil archive-re-no-dot)) version description req commentary) (dolist (file (prog1 files (setq files ()))) - (unless (string-match "\\.elc\\'" file) + (unless (string-match "\\(?:\\.elc\\|~\\)\\'" file) (push file files))) (setq files (delete (concat pkg "-pkg.el") files)) (setq files (delete (concat pkg "-autoloads.el") files)) @@ -242,7 +242,7 @@ PKG-readme.txt. Return the descriptor." (cons (intern pkg) (vector (version-to-list vers) req (nth 3 exp) 'tar)))) (defun archive--multi-file-package-def (dir pkg) - "Reurn the `define-package' form in the file DIR/PKG-pkg.el." + "Return the `define-package' form in the file DIR/PKG-pkg.el." (let ((pkg-file (expand-file-name (concat pkg "-pkg.el") dir))) (with-temp-buffer (unless (file-exists-p pkg-file) @@ -284,6 +284,17 @@ PKG-readme.txt. Return the descriptor." ;; FIXME: Don't compile the -pkg.el files! (byte-recompile-directory dir 0)))))) +(defun archive--refresh-pkg-file () + (let* ((dir (directory-file-name default-directory)) + (pkg (file-name-nondirectory dir)) + (simple-p (archive--simple-package-p dir pkg))) + (if simple-p + (progn + ;; (message "Refreshing pkg description of %s" pkg) + (apply 'archive--write-pkg-file dir pkg simple-p)) + ;; (message "Not refreshing pkg description of %s" pkg) + ))) + (defun batch-make-site-package (sdir) (let* ((dest (car (file-attributes sdir))) (pkg (file-name-nondirectory (directory-file-name (or dest sdir)))) @@ -297,6 +308,7 @@ PKG-readme.txt. Return the descriptor." (defun archive--write-pkg-file (pkg-dir name version desc requires &rest ignored) (let ((pkg-file (expand-file-name (concat name "-pkg.el") pkg-dir)) (print-level nil) + (print-quoted t) (print-length nil)) (write-region (concat (format ";; Generated package description from %s.el\n" diff --git a/packages/company/company-pysmell.el b/packages/company/company-pysmell.el index 063d8eafc..5c44f06aa 100644 --- a/packages/company/company-pysmell.el +++ b/packages/company/company-pysmell.el @@ -1,6 +1,6 @@ ;;; company-pysmell.el --- company-mode completion back-end for pysmell.el -;; Copyright (C) 2009-2011 Free Software Foundation, Inc. +;; Copyright (C) 2009-2011, 2013 Free Software Foundation, Inc. ;; Author: Nikolaj Schumacher @@ -28,7 +28,7 @@ ;;; Code: (eval-when-compile (require 'cl)) -(require 'pysmell) +(if t (require 'pysmell)) ;Don't load during compilation. (defvar company-pysmell--available-p 'unknown) (make-variable-buffer-local 'company-pysmell--available-p) diff --git a/packages/muse/htmlize-hack.el b/packages/muse/htmlize-hack.el index 4c9e5e8f5..e62394646 100644 --- a/packages/muse/htmlize-hack.el +++ b/packages/muse/htmlize-hack.el @@ -2,7 +2,8 @@ ;; To use it, add the path to this directory to your load path and ;; add (require 'htmlize-hack) to your Emacs init file. -(require 'htmlize) +(eval-when-compile (require 'cl)) +(if t (require 'htmlize)) ; Don't load during compilation. (when (equal htmlize-version "1.34") (defun htmlize-face-size (face) diff --git a/packages/shen-mode/shen-mode.el b/packages/shen-mode/shen-mode.el index 45d426233..747679c3a 100644 --- a/packages/shen-mode/shen-mode.el +++ b/packages/shen-mode/shen-mode.el @@ -1,6 +1,6 @@ ;;; shen-mode.el --- A major mode for editing shen source code -;; Copyright (C) 2011 Free Software Foundation, Inc. +;; Copyright (C) 2011, 2013 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Version: 0.1 @@ -44,6 +44,7 @@ map) "Currently just inherits from `lisp-mode-shared-map'.") +(eval-and-compile (defconst shen-functions '((* "number --> number --> number" "Number multiplication.") (+ "number --> number --> number" "Number addition.") @@ -220,7 +221,7 @@ (warn "string --> string" "Prints the string as a warning and returns \"done\". See strong-warning") (write-to-file "string --> A --> string" "Writes the second input into a file named in the first input. If the file does not exist, it is created, else it is overwritten. If the second input is a string then it is written to the file without the enclosing quotes. The first input is returned.") (y-or-n\? "string --> boolean" "Prints the string as a question and returns true for y and false for n.")) - "Shen functions taken largely from the Qi documentation by Dr. Mark Tarver.") + "Shen functions taken largely from the Qi documentation by Dr. Mark Tarver.")) ;;; Fontification diff --git a/packages/smart-operator/smart-operator.el b/packages/smart-operator/smart-operator.el index e707e492c..68332dd44 100644 --- a/packages/smart-operator/smart-operator.el +++ b/packages/smart-operator/smart-operator.el @@ -1,6 +1,6 @@ ;;; smart-operator.el --- Insert operators with surrounding spaces smartly -;; Copyright (C) 2004, 2005, 2007-2012 Free Software Foundation, Inc. +;; Copyright (C) 2004, 2005, 2007-2013 Free Software Foundation, Inc. ;; Author: William Xu ;; Version: 4.0 @@ -106,11 +106,11 @@ e.g., `=' becomes ` = ', `+=' becomes ` += '. When `only-where' is 'after, we will insert space at back only; when `only-where' is 'before, we will insert space at front only; when `only-where' is 'middle, we will not insert space." - (case only-where - ((before) (insert " " op)) - ((middle) (insert op)) - ((after) (insert op " ")) - (t + (pcase only-where + (`before (insert " " op)) + (`middle (insert op)) + (`after (insert op " ")) + (_ (let ((begin? (bolp))) (unless (or (looking-back (regexp-opt smart-operator-list) (line-beginning-position)) -- 2.39.2