]> code.delx.au - gnu-emacs-elpa/blobdiff - GNUmakefile
Merge branch 'master' of git://bzr.sv.gnu.org/emacs/elpa
[gnu-emacs-elpa] / GNUmakefile
index 7f2061d12f3323302c16d1314ccfa7a31f4a7804..e35b82d6699c11c3d48fd4844735655cfebe84db 100644 (file)
@@ -1,6 +1,6 @@
 # Makefile for GNU Emacs Lisp Package Archive.
 
-EMACS=emacs
+EMACS=emacs --batch
 
 ARCHIVE_TMP=archive-tmp
 SITE_DIR=site
@@ -9,46 +9,55 @@ SITE_DIR=site
 
 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 \"$@\"))"
+CR_EXCEPTIONS=copyright_exceptions
+.PHONY: check_copyrights
+check_copyrights:
+       @echo "Compute exceptions >$(CR_EXCEPTIONS)~"
+       @export LANG=C;                                                 \
+       (cd packages;                                                   \
+       find . -name '.git' -prune -o -name '*.el' -print0 |            \
+           xargs -0 grep -L 'Free Software Foundation, Inc' |          \
+           grep -v '\(\.dir-locals\|.-\(pkg\|autoloads\)\)\.el$$';     \
+       find . -name '.git' -prune -o -name '*.el' -print |             \
+           while read f; do                                            \
+               fquoted="$$(echo $$f|tr '|' '_')";                      \
+               sed -n -e '/[Cc]opyright.*, *[1-9][-0-9]*,\?$$/N'       \
+                   -e '/Free Software Foundation/d'                    \
+                   -e "s|^\\(.*[Cc]opyright\\)|$$fquoted:\\1|p"        \
+                  "$$f";                                               \
+           done) | sort >$(CR_EXCEPTIONS)~
+       diff -u "$(CR_EXCEPTIONS)" "$(CR_EXCEPTIONS)~"
 
 ## Deploy the package archive to archive/, with packages in
 ## archive/packages/:
 archive: archive-tmp
        $(MAKE) $(MFLAGS) process-archive
 
-archive-tmp: packages changelogs
+archive-tmp: packages
        -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
+       cd $(ARCHIVE_TMP)/packages;                             \
+         $(EMACS) -l $(CURDIR)/admin/archive-contents.el       \
+                  -f batch-make-archive
+       @cd $(ARCHIVE_TMP)/packages;                            \
+         for pt in *; do                                       \
+             if [ -f "$${pt}/.elpaignore" ]; then              \
+                 ignore="$${pt}/.elpaignore";                  \
+             else                                              \
+                 ignore="/dev/null";                           \
+             fi;                                               \
+             if [ -d $$pt ]; then                              \
+                 echo "Creating tarball $${pt}.tar" &&         \
+                 tar -cf $${pt}.tar $$pt --exclude-vcs -X "$$ignore";  \
+                 rm -rf $${pt};                                \
+             fi;                                               \
+         done
        mkdir -p archive/packages
        mv archive/packages archive/packages-old
        mv $(ARCHIVE_TMP)/packages archive/packages
@@ -62,6 +71,8 @@ archive-full: archive-tmp org-fetch
        #mkdir -p archive/admin
        #cp admin/* archive/admin/
 
+# FIXME: Turn it into an `external', which will require adding the notion of
+# "snapshot" packages.
 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"}'`; \
@@ -75,7 +86,7 @@ org-fetch: archive-tmp
 clean:
        rm -rf archive $(ARCHIVE_TMP) $(SITE_DIR)
 
-########## Rules for in-place installation ##########
+########## Rules for in-place installation ####################################
 pkgs := $(foreach pkg, $(wildcard packages/*), \
           $(if $(shell [ -d "$(pkg)" ] && echo true), $(pkg)))
 
@@ -94,16 +105,28 @@ endef
 # Compute the set of autolods files and their dependencies.
 autoloads := $(foreach pkg, $(pkgs), $(pkg)/$(notdir $(pkg))-autoloads.el)
 
+# FIXME: In 99% of the cases, autoloads can be generated in any order.
+# But the `names' package is an exception because it sets up an advice that
+# changes the way autload.el operates, and that advice is needed when creating
+# the autoloads file of packages that use `names', such as `aggressive-indent'.
+# The right solution is to check the Package-Requires and create the autoloads
+# files in topological order, but for now we'll just do it the ad-hoc way
+# add hand-made dependencies between autoloads files, and explicitly
+# load the names-autoloads file when building autoloads files.
+
+packages/aggressive-indent/aggressive-indent-autoloads.el: \
+    packages/names/names-autoloads.el
+
 $(foreach al, $(autoloads), $(eval $(call RULE-srcdeps, $(al))))
 %-autoloads.el:
-       @echo 'EMACS -f package-generate-autoloads $@'
+       @echo 'Generating autoloads for $@'
        @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)\")"
+         $(EMACS) -l $(CURDIR)/admin/archive-contents.el \
+             --eval "(archive--refresh-pkg-file)" \
+             --eval "(require 'package)" \
+             --eval "(load (expand-file-name \"../names/names-autoloads.el\") t t)" \
+             --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
@@ -119,10 +142,10 @@ 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
-       @echo 'EMACS -f batch-byte-compile $<'
-       @$(EMACS) --batch \
-           --eval "(setq package-directory-list '(\"$(abspath packages)\"))" \
-           --eval '(package-initialize)' \
+       @echo 'Byte compiling $<'
+       @$(EMACS) \
+           --eval "(setq package-directory-list nil package-user-dir \"$(abspath packages)\")" \
+           -f package-initialize \
            -L $(dir $@) -f batch-byte-compile $<
 
 .PHONY: elcs
@@ -135,20 +158,25 @@ $(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 $@)")'
+pkg_descs:=$(foreach pkg, $(pkgs), $(pkg)/$(notdir $(pkg))-pkg.el)
+#$(foreach al, $(single_pkgs), $(eval $(call RULE-srcdeps, $(al))))
+%-pkg.el: %.el
+       @echo 'Generating description file $@'
+       @$(EMACS) \
+           --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 "$@")'
 
 .PHONY: all-in-place
-all-in-place: $(extra_elcs) $(autoloads) # $(single_pkgs)
+all-in-place: $(extra_elcs) $(autoloads) $(pkg_descs)
        # Do them in a sub-make, so that autoloads are done first.
        $(MAKE) elcs
+
+
+############### Rules to prepare the externals ################################
+
+.PHONY:
+externals:
+       $(EMACS) -l admin/archive-contents.el \
+           -f archive-add/remove/update-externals