[project @ 2000-11-06 13:13:17 by simonmar]
authorsimonmar <unknown>
Mon, 6 Nov 2000 13:13:17 +0000 (13:13 +0000)
committersimonmar <unknown>
Mon, 6 Nov 2000 13:13:17 +0000 (13:13 +0000)
Change the way source distributions are built.

Now we do a 'make boot', 'make distclean', build a link tree to filter
some files out (eg. .cvsignore), and finally tar up the result.  The
process isn't bulletproof, so it makes sense to compare the manifest
against previous versions.

Now you don't have to be in a linked build tree to make a source
distribution.

Makefile
mk/target.mk

index 9de6247..413a260 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,6 @@
 
 TOP=.
 include $(TOP)/mk/boilerplate.mk
-SRC_DIST_DIR=$(shell pwd)/$(SRC_DIST_NAME)
 
 #
 # Totally evil hack to make the setting of SUBDIRS be dependent
@@ -21,11 +20,12 @@ ifneq "$(Project)" ""
    include $(shell echo $(Project) | tr A-Z a-z)/mk/config.mk
 endif
 
-#
-# Files to include in fptools source distribution
-#
-SRC_DIST_DIRS += mk docs distrib $(ProjectsToBuild)
-SRC_DIST_FILES += configure.in config.guess config.sub configure aclocal.m4 acconfig.h README INSTALL Makefile install-sh
+project-check :
+       @if [ "$(Project)" = "" ]; then \
+               echo "  You need to set \"Project\" in order to make $(CURRENT_TARGET)"; \
+               echo "  eg. make $(CURRENT_TARGET) Project=Ghc"; \
+               exit 1; \
+       fi
 
 # -----------------------------------------------------------------------------
 # Make sure configure is up-to-date
@@ -41,7 +41,29 @@ configure :: configure.in
 # Making a binary distribution
 #
 # To make a particular binary distribution: 
-# set $(Project) to the name of the project (currently Ghc or Happy).
+# set $(Project) to the name of the project, capitalised (eg. Ghc or Happy).
+
+# `dist' `binary-dist'
+#      Create a distribution tar file for this program. The tar file
+#      should be set up so that the file names in the tar file start with
+#      a subdirectory name which is the name of the package it is a
+#      distribution for. This name can include the version number.
+#
+#      For example, the distribution tar file of GCC version 1.40 unpacks
+#      into a subdirectory named `gcc-1.40'.
+# 
+#      The easiest way to do this is to create a subdirectory
+#      appropriately named, use ln or cp to install the proper files in
+#      it, and then tar that subdirectory.
+# 
+#      The dist target should explicitly depend on all non-source files
+#      that are in the distribution, to make sure they are up to date in
+#      the distribution. See Making Releases.
+#
+#      binary-dist is an FPtools addition for binary distributions
+# 
+
+binary-dist :: project-check
 
 BIN_DIST_TMPDIR=$(FPTOOLS_TOP_ABS)
 BIN_DIST_NAME=$(ProjectNameShort)-$(ProjectVersion)
@@ -201,8 +223,64 @@ binary-dist::
        @echo "Mechanical and super-natty! Inspect the result and *if* happy; freeze, sell and get some sleep!"
 
 # -----------------------------------------------------------------------------
+# Building source distributions
+#
+# Do it like this: 
+#
+#      $ make boot
+#      $ make dist Project=Ghc
+
+.PHONY: dist
+
+#
+# Directory in which we're going to build the src dist
+#
+SRC_DIST_DIR=$(shell pwd)/$(SRC_DIST_NAME)
+
+#
+# Files to include in source distributions
+#
+SRC_DIST_DIRS += docs distrib $(ProjectsToBuild)
+SRC_DIST_FILES += \
+       configure.in config.guess config.sub configure \
+       aclocal.m4 acconfig.h README Makefile install-sh \
+       mk/boilerplate.mk mk/config.h.in mk/config.mk.in mk/opts.mk \
+       mk/paths.mk mk/suffix.mk mk/target.mk
+
+dist dist-manifest dist-package :: project-check
+
+# clean the tree first, leaving certain extra files in place (eg. configure)
+dist :: distclean
+
+dist ::
+       -rm -rf $(SRC_DIST_DIR)
+       -rm -f $(SRC_DIST_NAME).tar.gz
+       mkdir $(SRC_DIST_DIR)
+       mkdir $(SRC_DIST_DIR)/mk
+       ( cd $(FPTOOLS_TOP_ABS); $(FIND) $(SRC_DIST_DIRS) -type d \( -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -exec mkdir $(SRC_DIST_DIR)/{} \; \) ; )
+       ( cd $(FPTOOLS_TOP_ABS); $(FIND) $(SRC_DIST_DIRS) $(SRC_DIST_FILES) -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -name "*~" -prune -o -name ".cvsignore" -prune -o -name "\#*" -prune -o -name ".\#*" -prune -o -name "log" -prune -o -name "*-SAVE" -prune -o -name "*.orig" -prune -o -name "*.rej" -prune -o ! -type d -exec $(LN_S) $(FPTOOLS_TOP_ABS)/{} $(SRC_DIST_DIR)/{} \; )
+
+# Automatic generation of a MANIFEST file for a source distribution
+# tree that is ready to go.
+dist-manifest ::
+       cd $(SRC_DIST_DIR); $(FIND) . \( -type l -o -type f \) -exec ls -lLG {} \; | sed -e 's/\.\///' > /tmp/MANIFEST ; mv /tmp/MANIFEST MANIFEST
+
+dist-package :: dist-package-tar-gz
+
+SRC_DIST_PATHS = $(patsubst %, $(SRC_DIST_NAME)/%, $(SRC_DIST_FILES) $(SRC_DIST_DIRS))
+
+dist-package-tar-gz ::
+       $(TAR) chzf $(SRC_DIST_NAME)-src.tar.gz $(SRC_DIST_NAME)
+
+dist-package-zip ::
+       cd ..; $(LN_S) $(FPTOOLS_TOP_ABS) $(SRC_DIST_NAME) && \
+              $(ZIP) $(ZIP_OPTS) -r $(SRC_DIST_NAME)-src.zip $(SRC_DIST_PATHS)
+
+# -----------------------------------------------------------------------------
+
+DIST_CLEAN_FILES += config.cache config.status
+
+MAINTAINER_CLEAN_FILES += configure
 
-dist :: dist-pre
 include $(TOP)/mk/target.mk
-dist :: dist-post
 
index 49f5d32..45ee5dd 100644 (file)
@@ -19,7 +19,6 @@
 #      clean* distclean* mostlyclean* maintainer-clean*
 #      tags*
 #      dvi ps (no info) FPTOOLS adds: pdf rtf html
-#      dist binary-dist
 #      check
 #
 # 3. Some of the above targets have a version that
@@ -100,40 +99,8 @@ all docs runtests boot TAGS clean distclean mostlyclean maintainer-clean install
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
 
-dist ::
-# Don't rely on -e working, instead we check exit return codes from sub-makes.
-       @case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
-       for i in $(SUBDIRS) ; do \
-         $(MKDIRHIER_PREFIX)mkdirhier $(SRC_DIST_DIR)/$$i; \
-         $(MAKE) -C $$i $(MFLAGS) $@ SRC_DIST_DIR=$(SRC_DIST_DIR)/$$i; \
-         if [ $$? -eq 0 ] ;  then true; else exit $$x_on_err; fi; \
-       done
-endif
-
-# The default dist rule:
-#
-# copy/link the contents of $(SRC_DIST_FILES) into the
-# shadow distribution tree. SRC_DIST_FILES contain the
-# build-generated files that you want to include in
-# a source distribution.
-#
-#
-ifneq "$(SRC_DIST_FILES)" ""
-dist::
-       @for i in $(SRC_DIST_FILES); do                  \
-         if ( echo "$$i" | grep "~" >/dev/null 2>&1 ); then     \
-           echo $(LN_S) `pwd`/`echo $$i | sed -e "s/^\([^~]*\)~.*/\1/g"` $(SRC_DIST_DIR)/`echo $$i | sed -e "s/.*~\(.*\)/\1/g"` ; \
-           $(LN_S) `pwd`/`echo $$i | sed -e "s/^\([^~]*\)~.*/\1/g"` $(SRC_DIST_DIR)/`echo $$i | sed -e "s/.*~\(.*\)/\1/g"` ; \
-         else \
-           if (test -f "$$i"); then                       \
-             echo $(LN_S) `pwd`/$$i $(SRC_DIST_DIR)/$$i ; \
-             $(LN_S) `pwd`/$$i $(SRC_DIST_DIR)/$$i ;      \
-            fi;                                           \
-         fi; \
-       done;
 endif
 
-
 #
 # Selectively building subdirectories.
 #
@@ -269,25 +236,6 @@ boot :: depend
 #      supported everywhere, but the intention is to standardise on DocBook
 #      producing all formats.
 #
-# `dist' `binary-dist'
-#      Create a distribution tar file for this program. The tar file
-#      should be set up so that the file names in the tar file start with
-#      a subdirectory name which is the name of the package it is a
-#      distribution for. This name can include the version number.
-#
-#      For example, the distribution tar file of GCC version 1.40 unpacks
-#      into a subdirectory named `gcc-1.40'.
-# 
-#      The easiest way to do this is to create a subdirectory
-#      appropriately named, use ln or cp to install the proper files in
-#      it, and then tar that subdirectory.
-# 
-#      The dist target should explicitly depend on all non-source files
-#      that are in the distribution, to make sure they are up to date in
-#      the distribution. See Making Releases.
-#
-#      binary-dist is an FPtools addition for binary distributions
-# 
 # `check'
 #      Perform self-tests (if any). The user must build the program
 #      before running the tests, but need not install the program; you
@@ -827,85 +775,6 @@ endif
 
 ###########################################
 #
-#      Targets: dist binary-dist
-#
-###########################################
-
-
-#
-# dist-pre is a canned rule the toplevel of your source tree
-# would use as follows, 
-#
-#  dist :: dist-pre
-#
-# it performs two tasks, first creating the distribution directory
-# tree and it then decorates the new tree with symbolic links pointing
-# to the symbolic links in the build tree.
-#
-# The dist-pre relies on (at least) the `find' in GNU findutils
-# (only tested with version 4.1). All non-GNU `find's I have
-# laid on my hands locally, has a restrictive treatment of {} in
-# -exec commands, i.e.,
-#
-#   find . -print echo a{} \;
-#   
-# does not expand the {}, it has to be a separate argument (i.e. `a {}').
-# GNU find is (IMHO) more sensible here, expanding any {} it comes across
-# inside an -exec, whether it is a separate arg or part of a word:
-#
-#  $ touch yes
-#  $ find --version
-#    GNU find version 4.1
-#  $ find yes -exec echo oh,{}! \;
-#    oh,yes!
-#
-# Of course, the above is not impossible to achieve with other finds,
-# just that GNU find does the Patently Right Thing here :)
-#
-# ====> if you're using these dist rules, get hold of GNU findutils.
-#
-#  --SOF 2/97
-#
-.PHONY: dist dist-pre dist-post
-
-#
-# The dist rules leaves out CVS, SRC (from mkshadowdir) and tests
-# directories when creating shadow source distrib tree
-#
-dist-pre::
-       -rm -rf $(SRC_DIST_DIR)
-       -rm -f $(SRC_DIST_NAME).tar.gz
-       (cd $(FPTOOLS_TOP_ABS); $(FIND) $(SRC_DIST_DIRS) -type d \( -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -exec $(MKDIRHIER) $(SRC_DIST_DIR)/{} \; \) ; )
-       (cd $(FPTOOLS_TOP_ABS); $(FIND) $(SRC_DIST_DIRS) -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -name "*~" -prune -o -name ".cvsignore" -prune -o -name "\#*" -prune -o -name ".\#*" -prune -o -type l -exec $(LN_S) $(FPTOOLS_TOP_ABS)/{} $(SRC_DIST_DIR)/{} \; )
-
-#
-# After having created a shadow distribution tree and copied/linked
-# all the necessary files to it, `dist-post' makes sure the permissions
-# are set right and then package up the tree. Empty directories are also removed.
-#
-# For now, we make the packaging a separate rule, so as to allow
-# the inspection of the dist tree before eventually packaging it up.
-#
-dist-post::
-       @echo Deleting the following empty directories..
-       ( cd $(SRC_DIST_DIR) ; cd .. ; $(FIND) $(SRC_DIST_NAME) -type d -exec sh -c 'test x`ls $$0 | wc -l | sed -e "s/ //g"` = x0' {} \; -print -exec rm -rf {} \; -prune )
-       ( cd $(SRC_DIST_DIR) ; cd .. ; chmod -R a+rw $(SRC_DIST_NAME) ) 
-
-# Automatic generation of a MANIFEST file for a source distribution
-# tree that is ready to go.
-dist-manifest ::
-       cd $(SRC_DIST_DIR); $(FIND) . \( -type l -o -type f \) -exec ls -lLG {} \; | sed -e 's/\.\///' > /tmp/MANIFEST ; mv /tmp/MANIFEST MANIFEST
-
-dist-package:: dist-package-tar-gz
-
-dist-package-tar-gz ::
-       cd $(SRC_DIST_DIR); cd ..; $(TAR) chzf $(SRC_DIST_NAME).tar.gz $(SRC_DIST_NAME)
-
-dist-package-zip ::
-       cd $(SRC_DIST_DIR); cd ..; $(ZIP) $(ZIP_OPTS) -r $(SRC_DIST_NAME).zip $(SRC_DIST_NAME)
-
-###########################################
-#
 #      Targets: check tags show
 #
 ###########################################