permit multiline comments and strings in macros
[bpt/coccinelle.git] / Makefile.release
index cd35e58..3b5d8c3 100644 (file)
 PACKAGE=$(PRJNAME)-$(VERSION)
 CCPACKAGE=coccicheck-$(CCVERSION)
 
-EXCLUDE=debian
-
-BINSRC=spatch env.sh env.csh standard.h standard.iso \
-       *.txt \
-       docs/manual/manual.pdf docs/manual/options.pdf docs/manual/main_grammar.pdf docs/spatch.1 \
-       docs/manual/cocci-python.txt \
-       demos/*
+EXCLUDE=$(PACKAGE)/debian .depend
+
+DOC=docs/manual/manual.pdf       \
+    docs/manual/options.pdf      \
+    docs/manual/main_grammar.pdf \
+    docs/html                    \
+    docs/man                     \
+    docs/spatch.1                \
+    docs/manual/cocci-python.txt
+BINSRC=spatch* env.sh env.csh standard.h standard.iso \
+       *.txt $(DOC) demos/* scripts/spatch*
 BINSRC-PY=$(BINSRC) $(PYLIB) python/coccilib/
 
-EXCL=$(EXCLUDE:%=--exclude=$(PACKAGE)/%)
+EXCL=$(EXCLUDE:%=--exclude=%)
 BINSRC2=$(BINSRC:%=$(PACKAGE)/%)
 BINSRC2-PY=$(BINSRC-PY:%=$(PACKAGE)/%)
 
-TMP=/tmp
+# TMP should point to a folder that is private to the release
+# process. In addition, it should not be the direct parent of
+# the directory in which the release is performed, because it
+# creates temporary directories that in this case could have
+# a name clash with the current directory.
+ifndef TMP
+TMP=/var/tmp
+endif
+
+# should be defined by Makefile.config
+ifndef OCAMLVERSION
 OCAMLVERSION=$(shell ocaml -version |perl -p -e 's/.*version (.*)/$$1/;')
+endif
+
+# can be overriden in the environment
+ifndef GIT
+GIT=git
+endif
+
+# the release process rewrites the Makefile.config, so we need
+# to save important configure flags.
+remember_ocamlbuild:=$(FEATURE_OCAMLBUILD)
+
+ifeq ($(remember_ocamlbuild),yes)
+       extra_configure_flags := --enable-ocamlbuild
+else
+       extra_configure_flags :=
+endif
+
+
 
 # Procedure to do first time:
 #  cd ~/release
-#  cvs checkout coccinelle -dP
+#  git clone ... coccinelle
 #  cd coccinelle
 #
 # Procedure to do each time:
 #
 #  1) make prerelease # WARN: These will clean your local rep. of pending modifications
 #
-#  UPDATE VERSION number in globals/config.ml.in
+#  UPDATE VERSION number in ./version
 #  and commit it with
 #
 #  2) make release
 #
 #  The project is then automatically licensified.
 #
-#  Remember to comment the -g -dtypes in this Makefile
-#  You can also remove a few things, for instance I removed in this
-#   Makefile things related to popl/ and popl09/
-#  make sure that ocaml is the distribution ocaml of /usr/bin, not ~pad/...
-#
 #  3) make package
 #
 #  if WEBSITE is set properly, you can also run 'make website'
 # Check that run an ocaml in /usr/bin
 
-# To test you can try compile and run spatch from different instances
-# like my ~/coccinelle, ~/release/coccinelle, and the /tmp/coccinelle-0.X
-# downloaded from the website.
-
-# For 'make srctar' it must done from a clean
-# repo such as ~/release/coccinelle. It must also be a repo where
-# the scripts/licensify has been run at least once.
-# For the 'make bintar' I can do it from my original repo.
+# The 'git rebase' is in there just in case you started with
+# unpushed changes. However, that is probably something you should
+# not do in the first place.
+
+release-help:
+       @echo "To make a release, perform the following steps:"
+       @echo ""
+       @echo "1. Make sure that all changes are committed and pushed."
+       @echo "   (making a release will destroy any uncommitted changes)"
+       @echo "   Preferably, start from a fresh clone of the coccinelle repo."
+       @echo "2. Run 'make prerelease'. It will generate some files that are not"
+       @echo "   in the repository but part of the release tarballs."
+       @echo "3. Edit ./version. It must be a new version."
+       @echo "4. Run 'make release'. It makes changes to the git repository that"
+       @echo "   are not idempotent. Running this step again is likely to result"
+       @echo "   in some git errors. These are not dramatic and are therefore"
+       @echo "   ignored."
+       @echo "5. Run 'make package'. It will build many tarballs."
+       @echo "6. Run 'make website'. Make sure that $(WEBBASE) exists beforehand."
+       @echo "   Hint: run step 5 and 6 directly after each other. The tarballs"
+       @echo "         are stored temporarily in $(TMP)."
+       @echo "7. Updated some webpages and commit them to svn."
 
 prerelease:
-       cvs up -CdP
-       $(MAKE) distclean
-       sed -i "s|^OCAMLCFLAGS=.*$$|OCAMLCFLAGS=|" Makefile
-       @echo "\n\tEdit globals/config.ml.in"
+       @echo "pulling changes from the repository"
+       $(GIT) pull --rebase
+       $(MAKE) fix-expected
+       $(MAKE) distclean KEEP_CONFIG=1
+       @echo "\n\tEdit ./version"
        @echo "\tCommit with 'make release'\n"
+       @echo "\t* set the GIT env variable to 'echo' to skip performing any git commands"
+       @echo "\t* changes to files other than ./version will not be committed automatically."
+
+fix-expected:
+       @echo "going to generate: tests/SCORE_expected_orig.sexp"
+       $(MAKE) distclean
+       ./configure --enable-release --disable-python $(extra_configure_flags)
+       $(MAKE) opt-only
+       yes | ./spatch.opt -testall --iso-file ./standard.iso --macro-file-builtins ./standard.h
+       cp tests/SCORE_actual.sexp tests/SCORE_expected_orig.sexp
+       @echo "generated: test/SCORE_expected_orig.sexp"
 
 release:
-       cvs ci -m "Release $(VERSION)" globals/config.ml.in
+       @echo "Marking version: $(VERSION)"
+       echo -n "$(VERSION)" > ./version
+       $(GIT) add ./version
+       -$(GIT) commit -m "Release $(VERSION)"
+       -$(GIT) tag -a -m "Release $(VERSION)" $(VERSION)
+       $(GIT) push --mirror
        $(MAKE) licensify
+       @echo "\n\tLicensify has run: do not commit any files from now on!"
        @echo "\n\tRun 'make package'\n"
 
 package:
        $(MAKE) package-src
        $(MAKE) package-nopython
        $(MAKE) package-python
+       @echo "\tPut online with 'make website'"
+       @echo "\tThe coccinelle SVN repository must be in $(WEBBASE)\n"
 
 package-src:
-       $(MAKE) distclean       # Clean project
+       ./configure --enable-release --disable-python --disable-pcre-syntax $(extra_configure_flags)
        $(MAKE) srctar
        $(MAKE) coccicheck
 
+# Reconfigures the project without Python support
+# Note: we disable pcre syntax as well to eliminate the dependency
+# on those libraries.
 package-nopython:
-       $(MAKE) distclean       # Clean project
-       ./configure --without-python
-       $(MAKE) docs
+       $(MAKE) distclean
+       ./configure --enable-release --disable-python --disable-pcre-syntax --disable-menhirLib --disable-pycaml  $(extra_configure_flags)
        $(MAKE) bintar
        $(MAKE) bytecodetar
-       $(MAKE) staticbintar
 
+# Reconfigure project with Python support
+# Note: we disable pcre syntax as well to eliminate the dependency
+# on those libraries.
 package-python:
-       $(MAKE) distclean       # Clean project
-       ./configure             # Reconfigure project with Python support
-       $(MAKE) docs
+       $(MAKE) distclean
+       ./configure --enable-release --enable-python --disable-pcre-syntax --disable-menhirLib --disable-pycaml $(extra_configure_flags)
        $(MAKE) bintar-python
        $(MAKE) bytecodetar-python
 
@@ -102,66 +166,91 @@ package-python:
 # update: make docs generates pdf but also some ugly .log files, so
 # make clean is there to remove them while not removing the pdf
 # (only distclean remove the pdfs).
-srctar:
-       $(MAKE) distclean
+srctar: Makefile.config
        $(MAKE) docs
-       $(MAKE) clean
-       cp -a .  $(TMP)/$(PACKAGE)
-       cd $(TMP)/$(PACKAGE); cd parsing_cocci/; $(MAKE) parser_cocci_menhir.ml
+       $(MAKE) -C parsing_cocci parser_cocci_menhir.ml
+       $(MAKE) -C parsing_cocci parser_cocci_menhir.mli
+       $(MAKE) distclean KEEP_GENERATED=1 KEEP_CONFIG=1
+       if test -f "$(TMP)/$(PACKAGE)/"; then rm -f "$(TMP)/$(PACKAGE)/"; fi # remove it if it is a symlink
+       $(MKDIR_P) "$(TMP)/$(PACKAGE)/"
+       cp -rfa ./*  "$(TMP)/$(PACKAGE)/"
+       rm -f $(TMP)/$(PACKAGE)/Makefile.config
        cd $(TMP); tar cvfz $(PACKAGE).tgz --exclude-vcs $(EXCL) $(PACKAGE)
        rm -rf  $(TMP)/$(PACKAGE)
 
-bintar: all
+bintar: all-dev
+       $(MAKE) docs
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
+       @if test -n "${PATCHELF}" -a -f spatch; then \
+          $(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch; fi
+       @if test -n "${PATCHELF}" -a -f spatch.opt; then \
+          $(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch.opt; fi
        cd $(TMP); tar cvfz $(PACKAGE)-bin-x86.tgz --exclude-vcs $(BINSRC2)
        rm -f $(TMP)/$(PACKAGE)
 
-staticbintar: all.opt
+staticbintar: all-release
+       $(MAKE) docs
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
        $(MAKE) static
        cd $(TMP); tar cvfz $(PACKAGE)-bin-x86-static.tgz --exclude-vcs $(BINSRC2)
        rm -f $(TMP)/$(PACKAGE)
 
-# add ocaml version in name ?
-bytecodetar: all
+bytecodetar: all-dev
+       $(MAKE) docs
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
        $(MAKE) purebytecode
-       cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz --exclude-vcs $(BINSRC2)
+       $(MAKE) copy-stubs
+       @if test -n "${PATCHELF}" -a -f dllpycaml_stubs.so; then \
+         $(PATCHELF) --set-rpath "" dllpycaml_stubs.so; fi
+       @if test -n "${PATHCELF}" -a -f dllpcre_stubs.so; then \
+         $(PATCHELF) --set-rpath "" dllpcre_stubs.so; fi
+       cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz --exclude-vcs $(BINSRC2) $$(find -L $(PACKAGE) -maxdepth 1 -name 'dll*.so')
        rm -f $(TMP)/$(PACKAGE)
+       rm -f dllpycaml_stubs.so dllpcre_stubs.so
 
 bintar-python: all
+       $(MAKE) docs
+       @if test -n "${PATCHELF}" -a -f spatch; then \
+          $(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch; fi
+       @if test -n "${PATCHELF}" -a -f spatch.opt; then \
+          $(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch.opt; fi
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
        cd $(TMP); tar cvfz $(PACKAGE)-bin-x86-python.tgz --exclude-vcs $(BINSRC2-PY)
        rm -f $(TMP)/$(PACKAGE)
 
-# add ocaml version in name ?
-bytecodetar-python: all
+bytecodetar-python: all-dev
+       $(MAKE) docs
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
        $(MAKE) purebytecode
-       cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION)-python.tgz --exclude-vcs $(BINSRC2-PY)
+       $(MAKE) copy-stubs
+       @if test -n "${PATCHELF}" -a -f dllpycaml_stubs.so; then \
+          $(PATCHELF) --set-rpath "" dllpycaml_stubs.so; fi
+       @if test -n "${PATHCELF}" -a -f dllpcre_stubs.so; then \
+          $(PATCHELF) --set-rpath "" dllpcre_stubs.so; fi
+       cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION)-python.tgz --exclude-vcs $(BINSRC2-PY) $$(find -L $(PACKAGE) -maxdepth 1 -name 'dll*.so')
        rm -f $(TMP)/$(PACKAGE)
+       rm -f dllpycaml_stubs.so dllpcre_stubs.so
 
 coccicheck:
-       cp -a `pwd`/scripts/coccicheck $(TMP)/$(CCPACKAGE)
+       cp -a ./scripts/coccicheck $(TMP)/$(CCPACKAGE)
        tar cvfz $(TMP)/$(CCPACKAGE).tgz -C $(TMP) --exclude-vcs $(CCPACKAGE)
        rm -rf $(TMP)/$(CCPACKAGE)
 
 clean-packages::
        rm -f $(TMP)/$(PACKAGE).tgz
        rm -f $(TMP)/$(PACKAGE)-bin-x86.tgz
-       rm -f $(TMP)/$(PACKAGE)-bin-x86-static.tgz
        rm -f $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz
        rm -f $(TMP)/$(PACKAGE)-bin-x86-python.tgz
        rm -f $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION)-python.tgz
        rm -f $(TMP)/$(CCPACKAGE).tgz
 
 #
-# No need to licensify 'demos'. Because these is basic building blocks
+# No need to licensify 'demos'. Because these are basic building blocks
 # to use SmPL.
 #
 TOLICENSIFY=ctl engine globals parsing_cocci popl popl09 python scripts tools
@@ -174,10 +263,6 @@ licensify:
 fixdates:
        echo do 'touch **/*.*'
 
-#fixCVS:
-#      cvs update -d -P
-#      echo do 'rm -rf **/CVS'
-
 ocamlversion:
        @echo $(OCAMLVERSION)
 
@@ -202,6 +287,7 @@ ocamlversion:
 EXCL_SYNC=--exclude ".git"          \
        --exclude ".gitignore"      \
        --exclude ".cvsignore"      \
+       --exclude ".svn"            \
        --exclude "tests"           \
        --exclude "TODO"            \
        --cvs-exclude
@@ -209,24 +295,36 @@ EXCL_SYNC=--exclude ".git"          \
 packsrc: prepack
        $(MAKE) -C $(TMP)/$(PACKAGE)/debian lucid
        $(MAKE) -C $(TMP)/$(PACKAGE)/debian karmic
-#      $(MAKE) -C $(TMP)/$(PACKAGE)/debian maverik
+       $(MAKE) -C $(TMP)/$(PACKAGE)/debian maverick
+       $(MAKE) -C $(TMP)/$(PACKAGE)/debian natty
+       $(MAKE) -C $(TMP)/$(PACKAGE)/debian oneiric
        $(MAKE) push
        rm -rf  $(TMP)/$(PACKAGE)/
 
 packbin: prepack
        $(MAKE) -C $(TMP)/$(PACKAGE)/debian binary
        rm -rf  $(TMP)/$(PACKAGE)/
-       rm -rf $(TMP)/$(PRJNAME)_$(VERSION).deb*_source.build
+       rm -rf $(TMP)/$(PACKAGE)_$(VERSION)*_source.build
 
 prepack:
        rsync -a $(EXCL_SYNC) . $(TMP)/$(PACKAGE)
        $(MAKE) -C $(TMP)/$(PACKAGE) licensify
+       sed -i "s|^OCAMLCFLAGS=.*$$|OCAMLCFLAGS=|" $(TMP)/$(PACKAGE)/Makefile
        rm -rf $(TMP)/$(PACKAGE)/tools
 
 push:
-       cd $(TMP)/ && for p in `ls $(PRJNAME)_$(VERSION).deb*_source.changes`; do dput $(PRJNAME) $$p ; done
-       rm -rf $(TMP)/$(PRJNAME)_$(VERSION).deb*_source.changes
-       rm -rf $(TMP)/$(PRJNAME)_$(VERSION).deb*_source.$(PRJNAME).upload
-       rm -rf $(TMP)/$(PRJNAME)_$(VERSION).deb*.dsc
-       rm -rf $(TMP)/$(PRJNAME)_$(VERSION).deb*.tar.gz
-
+       cd $(TMP)/ && for p in `ls $(PRJNAME)_$(VERSION)*_source.changes`; do dput $(PRJNAME) $$p ; done
+       rm -rf $(TMP)/$(PRJNAME)_$(VERSION)*_source.changes
+       rm -rf $(TMP)/$(PRJNAME)_$(VERSION)*_source.$(PRJNAME).upload
+       rm -rf $(TMP)/$(PRJNAME)_$(VERSION)*.dsc
+       rm -rf $(TMP)/$(PRJNAME)_$(VERSION)*.tar.gz
+
+# Produces a source tarball
+# Note: start from a fresh working directory
+# Note: configure first
+dist:
+       $(MAKE) licensify
+       $(MAKE) docs
+       $(MAKE) -C parsing_cocci parser_cocci_menhir.ml
+       $(MAKE) distclean KEEP_CONFIG=1 KEEP_GENERATED=1
+       tar cvfz $(PACKAGE).tar.gz --transform="s,^,$(PACKAGE)/,S" --exclude=$(PACKAGE).tar.gz --exclude-backups --exclude-vcs *