From 46b0e5185234b4e5ed34f5a9147b722c722823db Mon Sep 17 00:00:00 2001
From: Grigori Rybkin <grybkine@cern.ch>
Date: Fri, 8 Aug 2014 15:47:23 +0200
Subject: [PATCH] Implement transformation and relocation of optimised
 environment setup related files (PackDist-00-13-00)

---
 PackDist/cmt/fragments/help2doc              |   17 +
 PackDist/cmt/fragments/help2doc_header       |    5 +
 PackDist/cmt/fragments/help2doc_trailer      |    9 +
 PackDist/cmt/fragments/pack_install          |   56 +
 PackDist/cmt/fragments/pack_install_header   |    8 +
 PackDist/cmt/fragments/pack_run              |   22 +
 PackDist/cmt/fragments/pack_run_header       |    5 +
 PackDist/cmt/requirements                    |   35 +
 PackDist/config/pack-nightly-bugfix.cfg      |   34 +
 PackDist/doc/Makefile                        |   23 +
 PackDist/doc/html/pack-relocate.sh.html      |   67 +
 PackDist/doc/html/proj-run.sh.html           |  117 ++
 PackDist/hscript.py                          |   99 ++
 PackDist/man/man1/pack-relocate.sh.1         |   33 +
 PackDist/man/man1/proj-run.sh.1              |  108 ++
 PackDist/scripts/basic-requirements.template |   13 +
 PackDist/scripts/defaults.cfg                |   40 +
 PackDist/scripts/doc.ptn                     |    9 +
 PackDist/scripts/extern-junk.ptn             |    9 +
 PackDist/scripts/junk.ptn                    |   20 +
 PackDist/scripts/pack-common.sh              |  217 +++
 PackDist/scripts/pack-extern.sh              |  534 ++++++
 PackDist/scripts/pack-find.py                |  195 +++
 PackDist/scripts/pack-proj.sh                | 1606 ++++++++++++++++++
 PackDist/scripts/pack.cfg.example            |  145 ++
 PackDist/scripts/platforms                   |   52 +
 PackDist/scripts/pltfm-junk.ptn              |   10 +
 PackDist/scripts/proj-run.sh                 |  622 +++++++
 PackDist/scripts/relink.py                   |  299 ++++
 PackDist/scripts/requirements.template       |   47 +
 PackDist/scripts/src.ptn                     |   19 +
 PackDist/share/bin/pack-rpm-extern.sh        |    2 +
 PackDist/share/bin/pack-rpm-proj.sh          |   10 +
 PackDist/share/bin/pack-rpm-settings.sh      |    7 +
 PackDist/share/bin/pack-rpm.py               |  396 +++++
 PackDist/share/create-cmthome.sh             |   37 +
 PackDist/share/pack-relocate.sh              |  132 ++
 PackDist/share/pack-standalone.py            |  283 +++
 PackDist/share/python/PackDistCommon.py      |   61 +
 PackDist/share/rpm-erase.sh                  |  239 +++
 PackDist/share/setup-standalone.sh           |   33 +
 PackDist/share/specs/DBRelease.spec          |  123 ++
 PackDist/share/specs/Makefile.cmt            |    4 +
 PackDist/share/specs/proj.spec.in            |   58 +
 44 files changed, 5860 insertions(+)
 create mode 100644 PackDist/cmt/fragments/help2doc
 create mode 100644 PackDist/cmt/fragments/help2doc_header
 create mode 100644 PackDist/cmt/fragments/help2doc_trailer
 create mode 100755 PackDist/cmt/fragments/pack_install
 create mode 100755 PackDist/cmt/fragments/pack_install_header
 create mode 100755 PackDist/cmt/fragments/pack_run
 create mode 100755 PackDist/cmt/fragments/pack_run_header
 create mode 100755 PackDist/cmt/requirements
 create mode 100755 PackDist/config/pack-nightly-bugfix.cfg
 create mode 100755 PackDist/doc/Makefile
 create mode 100644 PackDist/doc/html/pack-relocate.sh.html
 create mode 100755 PackDist/doc/html/proj-run.sh.html
 create mode 100644 PackDist/hscript.py
 create mode 100644 PackDist/man/man1/pack-relocate.sh.1
 create mode 100755 PackDist/man/man1/proj-run.sh.1
 create mode 100644 PackDist/scripts/basic-requirements.template
 create mode 100755 PackDist/scripts/defaults.cfg
 create mode 100755 PackDist/scripts/doc.ptn
 create mode 100755 PackDist/scripts/extern-junk.ptn
 create mode 100755 PackDist/scripts/junk.ptn
 create mode 100755 PackDist/scripts/pack-common.sh
 create mode 100755 PackDist/scripts/pack-extern.sh
 create mode 100755 PackDist/scripts/pack-find.py
 create mode 100755 PackDist/scripts/pack-proj.sh
 create mode 100755 PackDist/scripts/pack.cfg.example
 create mode 100755 PackDist/scripts/platforms
 create mode 100755 PackDist/scripts/pltfm-junk.ptn
 create mode 100755 PackDist/scripts/proj-run.sh
 create mode 100755 PackDist/scripts/relink.py
 create mode 100755 PackDist/scripts/requirements.template
 create mode 100755 PackDist/scripts/src.ptn
 create mode 100644 PackDist/share/bin/pack-rpm-extern.sh
 create mode 100644 PackDist/share/bin/pack-rpm-proj.sh
 create mode 100644 PackDist/share/bin/pack-rpm-settings.sh
 create mode 100755 PackDist/share/bin/pack-rpm.py
 create mode 100755 PackDist/share/create-cmthome.sh
 create mode 100755 PackDist/share/pack-relocate.sh
 create mode 100755 PackDist/share/pack-standalone.py
 create mode 100755 PackDist/share/python/PackDistCommon.py
 create mode 100755 PackDist/share/rpm-erase.sh
 create mode 100644 PackDist/share/setup-standalone.sh
 create mode 100644 PackDist/share/specs/DBRelease.spec
 create mode 100644 PackDist/share/specs/Makefile.cmt
 create mode 100644 PackDist/share/specs/proj.spec.in

diff --git a/PackDist/cmt/fragments/help2doc b/PackDist/cmt/fragments/help2doc
new file mode 100644
index 00000000000..bbcb2d1491d
--- /dev/null
+++ b/PackDist/cmt/fragments/help2doc
@@ -0,0 +1,17 @@
+# File: PackDist/cmt/fragments/help2doc
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>
+
+MAN_${NAME}_${FILEEXTENSION} = ../man/man1/${FILENAME}.1
+HTML_${NAME}_${FILEEXTENSION} = ../doc/html/${FILENAME}.html
+
+$(MAN_${NAME}_${FILEEXTENSION}) : ${FULLNAME}
+	mkdir -p $(@D)
+	help2man -o $@ -n "$(doc_${NAME}_${FILEEXTENSION})" \
+	-m "Packaging and Distribution Tools" -N -h -h -v -v $<
+
+$(HTML_${NAME}_${FILEEXTENSION}) : $(MAN_${NAME}_${FILEEXTENSION})
+	mkdir -p $(@D)
+	man2html $< >|$@
+
+MAN += $(MAN_${NAME}_${FILEEXTENSION})
+HTML += $(HTML_${NAME}_${FILEEXTENSION})
diff --git a/PackDist/cmt/fragments/help2doc_header b/PackDist/cmt/fragments/help2doc_header
new file mode 100644
index 00000000000..93d2ba068c6
--- /dev/null
+++ b/PackDist/cmt/fragments/help2doc_header
@@ -0,0 +1,5 @@
+# File: PackDist/cmt/fragments/help2doc_header
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>
+
+# This file is left empty on purpose
+
diff --git a/PackDist/cmt/fragments/help2doc_trailer b/PackDist/cmt/fragments/help2doc_trailer
new file mode 100644
index 00000000000..1c0a3acf220
--- /dev/null
+++ b/PackDist/cmt/fragments/help2doc_trailer
@@ -0,0 +1,9 @@
+# File: PackDist/cmt/fragments/help2doc_trailer
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>
+
+${CONSTITUENT} :: $(MAN) $(HTML)
+	$(echo) ${CONSTITUENT} done
+
+${CONSTITUENT}clean ::
+	$(cleanup_echo) $(MAN) $(HTML)
+	$(cleanup_silent) \rm -f $(MAN) $(HTML)
diff --git a/PackDist/cmt/fragments/pack_install b/PackDist/cmt/fragments/pack_install
new file mode 100755
index 00000000000..5d66c2ef2ae
--- /dev/null
+++ b/PackDist/cmt/fragments/pack_install
@@ -0,0 +1,56 @@
+# File: PackDist/cmt/fragments/pack_install
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>
+
+# Install the most recently modified (binary, if available) package
+# from repository PACKREPO in directory PACKINSTALL
+
+PKG = $(PACKINSTALL)/pkg
+UNPACK = $(PACKINSTALL)/pacman
+DOWNLOAD = $(PACKINSTALL)/pacman-latest.tar.gz
+URL = http://atlas-computing.web.cern.ch/atlas-computing/links/monolith
+#URL = http://physics.bu.edu/pacman/sample_cache/tarballs
+
+.PHONY: ${CONSTITUENT} ${CONSTITUENT}clean 
+.PHONY: get $(PKG)
+
+${CONSTITUENT} :: get
+
+get : $(PKG) $(UNPACK)
+	cd $(UNPACK); . ./setup.sh; cd -; \
+	cd $(<D); \
+	pacman -allow trust-all-caches tar-overwrite; \
+	pacman -get `cat $(<F)` -ask none; retval=$$?; \
+	rm -f $(<F); exit $$retval
+
+$(PKG) : $(PACKREPO)
+	@find $(<) -type f -name "*.pacman" >$(bin)pkglist
+	@test -s $(bin)pkglist || { echo Empty repository: $<; exit 1; }
+	@rm -f $(bin)pkg
+	@ls -1t `cat $(bin)pkglist` | grep '\(opt\|dbg\)[^/]*\.pacman' | head -n 1 | \
+	sed -e 's!\(.*\)/\([^/]\{1,\}\)!\1:\2!' -e 's!\.pacman!!' >$(bin)pkg
+	@test -s $(bin)pkg || { echo No binary packages in repository: $<; \
+	rm -f $(bin)pkg; \
+	ls -1t `cat $(bin)pkglist` | head -n 1 | \
+	sed -e 's!\(.*\)/\([^/]\{1,\}\)!\1:\2!' -e 's!\.pacman!!' >$(bin)pkg; }
+	@mkdir -p $(@D)
+	@cp -p $(bin)pkg $@
+	@echo Package: `cat $@`
+
+$(PACKREPO) :
+	@echo No such repository: $@; exit 1
+
+$(UNPACK) : $(DOWNLOAD)
+	rm -f $@
+	mkdir -p $(@D)
+	cd $(@D); tar zxf $<
+	@top=`ls -1dt \`find $(@D) -maxdepth 1 -type d -name "pacman-*"\`|head -n 1`; \
+	test -d "$$top" || { echo Cannot find pacman: $(@D); ls -ltr; exit 1; }; \
+	ln -sfnv `basename $$top` $@
+
+$(DOWNLOAD) :
+	mkdir -p $(@D)
+	cd $(@D); $(urlget) $(URL)/$(@F)
+
+${CONSTITUENT}clean ::
+	$(cleanup_echo) $(PACKINSTALL)/*
+	$(cleanup_silent) \rm -rf $(PACKINSTALL)/*
diff --git a/PackDist/cmt/fragments/pack_install_header b/PackDist/cmt/fragments/pack_install_header
new file mode 100755
index 00000000000..20da337252e
--- /dev/null
+++ b/PackDist/cmt/fragments/pack_install_header
@@ -0,0 +1,8 @@
+# File: PackDist/cmt/fragments/pack_install_header
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>
+
+${CONSTITUENT} ::
+	@\printf "\n%s\n\n" \
+	"$(version_info)"
+
+# End of file: PackDist/cmt/fragments/pack_install_header
diff --git a/PackDist/cmt/fragments/pack_run b/PackDist/cmt/fragments/pack_run
new file mode 100755
index 00000000000..07e8fe95612
--- /dev/null
+++ b/PackDist/cmt/fragments/pack_run
@@ -0,0 +1,22 @@
+# File: PackDist/cmt/fragments/pack_run
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>
+
+# Pack...
+
+.PHONY: ${CONSTITUENT} ${CONSTITUENT}clean 
+
+${CONSTITUENT} :: $(PACKREPO)
+	test -d $(PACKREPO) || mkdir $(PACKREPO)
+	if [ -n "`printenv PACKCFG`" ]; then \
+	  $(FULLNAME) $(PACKOPTS) -C $(PACKREPO) -L $(bin) $(PACKEXTRAOPTS);\
+	  else \
+	  $(FULLNAME) -c $(PACKCFG) $(PACKOPTS) -C $(PACKREPO) -L $(bin) $(PACKEXTRAOPTS); fi
+
+$(PACKREPO) :
+	mkdir $(PACKREPO)
+
+${CONSTITUENT}clean ::
+	$(cleanup_echo) $(PACKREPO)/*
+	$(cleanup_silent) \rm -rf $(PACKREPO)/*
+	$(cleanup_echo) ../run
+	$(cleanup_silent) test ! -d ../run || \rm -rf ../run
diff --git a/PackDist/cmt/fragments/pack_run_header b/PackDist/cmt/fragments/pack_run_header
new file mode 100755
index 00000000000..b11690832d0
--- /dev/null
+++ b/PackDist/cmt/fragments/pack_run_header
@@ -0,0 +1,5 @@
+# File: PackDist/cmt/fragments/pack_run_header
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>
+
+# This file is left empty on purpose
+
diff --git a/PackDist/cmt/requirements b/PackDist/cmt/requirements
new file mode 100755
index 00000000000..fca5c4642e3
--- /dev/null
+++ b/PackDist/cmt/requirements
@@ -0,0 +1,35 @@
+package PackDist
+
+author Grigori Rybkine <Grigori.Rybkine@cern.ch>
+author Christian Arnault <arnault@lal.in2p3.fr>
+
+# Tools to Package projects based software
+# and facilitate its Distribution
+
+set PACKCFG "../config/pack-nightly-bugfix.cfg"
+
+set PACKOPTS "${PACKOPTS}"
+set_remove PACKOPTS "-w"
+set_append PACKOPTS " -w "
+
+macro PACKREPO "../run"
+macro PACKINSTALL "../installation"
+
+macro urlget "wget" \
+      Darwin "curl -L -O"
+
+private
+macro main "$(PACKAGE_ROOT)/scripts/proj-run.sh"
+macro version_info "`$(main) -v`"
+macro doc_proj-run_sh "pack project(s), external package(s)"
+macro doc_pack-relocate_sh "relocate or transform distribution kit"
+end_private
+
+make_fragment pack_run -header=pack_run_header
+document pack_run Run -group=run $(main)
+
+make_fragment pack_install -header=pack_install_header
+document pack_install Installation -group=installation -s=. $(PACKREPO)
+
+make_fragment help2doc -header=help2doc_header -trailer=help2doc_trailer
+document help2doc Doc -group=doc $(main) ../share/pack-relocate.sh
diff --git a/PackDist/config/pack-nightly-bugfix.cfg b/PackDist/config/pack-nightly-bugfix.cfg
new file mode 100755
index 00000000000..da342f5da33
--- /dev/null
+++ b/PackDist/config/pack-nightly-bugfix.cfg
@@ -0,0 +1,34 @@
+# This is a configuration file for the pack-run.sh script.
+# 
+# The configuration files read by the script are defaults.cfg,
+# ~/.pack.cfg, the file specified in the environment variable PACKCFG,
+# the file specified with the -c command line option
+# (values from "earlier" files are overridden by "later" files).
+#
+# The format is: option = value # comments
+#            or: option : value # comments
+#
+# (Command line options override values from the configuration files.)
+#
+# Report bugs to <Grigori.Rybkine@cern.ch>.
+#
+
+#cmthome = ${HOME}/cmthome-v1r18p20060301
+cmthome = /afs/cern.ch/user/a/alibrari/cmthome
+#logdir = /afs/cern.ch/atlas/software/builds/kitrel/bugfix/log
+logdir = ../run
+pacmancache= /afs/cern.ch/atlas/software/builds/kitrel/bugfix
+#patchdir = $HOME/Kit/patches3
+patchdir = /afs/cern.ch/user/a/alibrari/Kit/patches3
+
+#overwrite : Nope
+#overwrite : yep
+#upgrade: yeah
+
+projbase=/afs/cern.ch/atlas/software/builds/nightlies/bugfix
+
+release=
+project = AtlasProduction
+builddir = /build/atnight
+#recursive = Yep
+cmtcache = http://cern.ch/atlas-computing/links/kitsDirectory/CMT/pacman/cache
diff --git a/PackDist/doc/Makefile b/PackDist/doc/Makefile
new file mode 100755
index 00000000000..8ab395ce689
--- /dev/null
+++ b/PackDist/doc/Makefile
@@ -0,0 +1,23 @@
+# File: PackDist/doc/Makefile
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>
+
+# Build documentation: man page and in html format
+
+name = proj-run.sh
+script = ../scripts/$(name)
+man = ../man/man1/$(name).1
+html = ../doc/html/$(name).html
+
+.PHONY: all 
+
+all : $(man) $(html)
+
+$(man) : $(script) ../ChangeLog
+	@mkdir -p $(@D)
+	help2man -o $@ -n "pack project(s), external package(s)" \
+	-m "Packaging and Distribution Tools" -N -h -h -v -v $<
+
+$(html) : $(man)
+	@mkdir -p $(@D)
+	@rm -f $@
+	man2html $< >$@
diff --git a/PackDist/doc/html/pack-relocate.sh.html b/PackDist/doc/html/pack-relocate.sh.html
new file mode 100644
index 00000000000..c6f21ba364d
--- /dev/null
+++ b/PackDist/doc/html/pack-relocate.sh.html
@@ -0,0 +1,67 @@
+Content-type: text/html
+
+<HTML><HEAD><TITLE>Manpage of PACK-RELOCATE.SH</TITLE>
+</HEAD><BODY>
+<H1>PACK-RELOCATE.SH</H1>
+Section: Packaging and Distribution Tools (1)<BR>Updated: August 2013<BR><A HREF="#index">Index</A>
+<A HREF="http://localhost/cgi-bin/man/man2html">Return to Main Contents</A><HR>
+
+<A NAME="lbAB">&nbsp;</A>
+<H2>NAME</H2>
+
+pack-relocate.sh - relocate or transform distribution kit
+<A NAME="lbAC">&nbsp;</A>
+<H2>SYNOPSIS</H2>
+
+<B>pack-relocate.sh</B>
+
+[<I>OPTION</I>]... <I>SOURCE DEST</I>
+<BR>
+
+<B>pack-relocate.sh</B>
+
+[<I>OPTION</I>]... <I>-t PATH</I>...
+<A NAME="lbAD">&nbsp;</A>
+<H2>DESCRIPTION</H2>
+
+In first form, relocate the ATLAS distribution kit from SOURCE to DEST.
+In second form, locate the ATLAS distribution kit in PATH and transform
+as described for <B>-t</B> option (implies <B>-i</B> option).
+<DL COMPACT>
+<DT><B>-i</B><DD>
+edit files in-place, without moving them from SOURCE to DEST
+<DT><B>-c</B><DD>
+only relocate files in cmtsite
+<DT><B>-t</B><DD>
+transform setup scripts so that full paths in them may be changed by setting ATLAS_RELEASE_BASE environment variable
+<DT><B>-h</B><DD>
+display this help and exit
+<DT><B>-v</B><DD>
+output version information and exit
+</DL>
+<A NAME="lbAE">&nbsp;</A>
+<H2>AUTHOR</H2>
+
+Written by Grigori Rybkine.
+<A NAME="lbAF">&nbsp;</A>
+<H2>REPORTING BUGS</H2>
+
+Report bugs to &lt;<A HREF="mailto:Grigori.Rybkine@cern.ch">Grigori.Rybkine@cern.ch</A>&gt;.
+<P>
+
+<HR>
+<A NAME="index">&nbsp;</A><H2>Index</H2>
+<DL>
+<DT><A HREF="#lbAB">NAME</A><DD>
+<DT><A HREF="#lbAC">SYNOPSIS</A><DD>
+<DT><A HREF="#lbAD">DESCRIPTION</A><DD>
+<DT><A HREF="#lbAE">AUTHOR</A><DD>
+<DT><A HREF="#lbAF">REPORTING BUGS</A><DD>
+</DL>
+<HR>
+This document was created by
+<A HREF="http://localhost/cgi-bin/man/man2html">man2html</A>,
+using the manual pages.<BR>
+Time: 14:57:23 GMT, August 20, 2013
+</BODY>
+</HTML>
diff --git a/PackDist/doc/html/proj-run.sh.html b/PackDist/doc/html/proj-run.sh.html
new file mode 100755
index 00000000000..074f641189d
--- /dev/null
+++ b/PackDist/doc/html/proj-run.sh.html
@@ -0,0 +1,117 @@
+Content-type: text/html
+
+<HTML><HEAD><TITLE>Manpage of PROJ-RUN.SH</TITLE>
+</HEAD><BODY>
+<H1>PROJ-RUN.SH</H1>
+Section: Packaging and Distribution Tools (1)<BR>Updated: August 2013<BR><A HREF="#index">Index</A>
+<A HREF="http://localhost/cgi-bin/man/man2html">Return to Main Contents</A><HR>
+
+<A NAME="lbAB">&nbsp;</A>
+<H2>NAME</H2>
+
+proj-run.sh - pack project(s), external package(s)
+<A NAME="lbAC">&nbsp;</A>
+<H2>SYNOPSIS</H2>
+
+<B>proj-run.sh</B>
+
+[<I>OPTION</I>]...
+<A NAME="lbAD">&nbsp;</A>
+<H2>DESCRIPTION</H2>
+
+Pack project with external packages it depends upon, or only external package(s).
+<DL COMPACT>
+<DT><B>-L</B> &lt;path&gt;<DD>
+create log file in directory &lt;path&gt;
+<DT><B>-C</B> &lt;path&gt;<DD>
+create packages in directory &lt;path&gt;
+<DT><B>-X</B> &lt;path&gt;<DD>
+create external packages in directory &lt;path&gt;
+(takes precedence over <B>-C</B> value)
+<DT><B>-J</B> &lt;path&gt;<DD>
+create project packages in directory &lt;path&gt;
+(takes precedence over <B>-C</B> value)
+<DT><B>-o</B> &lt;path&gt;<DD>
+create RPMs in directory &lt;path&gt;
+<DT><B>-x</B> &lt;path&gt;<DD>
+create external RPMs in directory &lt;path&gt;
+(takes precedence over <B>-o</B> value)
+<DT><B>-j</B> &lt;path&gt;<DD>
+create project RPMs in directory &lt;path&gt;
+(takes precedence over <B>-o</B> value)
+<DT><B>-b</B> &lt;path&gt;<DD>
+pack project located in project base directory &lt;path&gt;
+<DT><B>-P</B> &lt;project&gt;<DD>
+pack project &lt;project&gt;
+<DT><B>-r</B> &lt;id&gt;<DD>
+pack project release &lt;id&gt;
+<DT><B>-p</B> &lt;package&gt;<DD>
+pack external package &lt;package&gt; (may be multiple)
+<DT><B>-D</B><DD>
+pack debug build
+<DT><B>-I</B><DD>
+create debug information packages (for not debug build)
+<DT><B>-S</B> &lt;suffix&gt;<DD>
+suffix of debug information files (for not debug build)
+<DT><B>-t</B> &lt;tag&gt;[,&lt;tag&gt;...]<DD>
+use additional tag(s) for setup (may be multiple)
+<DT><B>-T</B> &lt;cmtconfig&gt;<DD>
+force CMTCONFIG &lt;cmtconfig&gt; (platform tag) for setup
+<DT><B>-d</B><DD>
+pack documentation files also
+<DT><B>-F</B><DD>
+overwrite existing tarballs of external packages
+<DT><B>-U</B><DD>
+overwrite existing tarballs of project packages
+<DT><B>-k</B><DD>
+keep existing tarballs of settings packages
+(default is overwrite if their versions differ from those in use)
+<DT><B>-R</B><DD>
+recursively pack projects required by the project being packed
+<DT><B>-V</B><DD>
+verify that existing tarballs (of project and/or external packages) are up-to-date
+<DT><B>-w</B><DD>
+wait until packing completion
+<DT><B>-q</B><DD>
+do not write anything to standard output
+<DT><B>-n</B><DD>
+do not execute, only dump configuration
+<DT><B>-B</B> &lt;path&gt;<DD>
+use directory &lt;path&gt; for temporary files
+<DT><B>-c</B> &lt;path&gt;<DD>
+use configuration file &lt;path&gt;
+<DT><B>-h</B><DD>
+display this help and exit
+<DT><B>-v</B><DD>
+output version information and exit
+</DL>
+<P>
+
+The PACKOPTS environment variable specifies a space separated list of default options
+to be placed in front of any explicit options.
+<A NAME="lbAE">&nbsp;</A>
+<H2>AUTHOR</H2>
+
+Written by Grigori Rybkine.
+<A NAME="lbAF">&nbsp;</A>
+<H2>REPORTING BUGS</H2>
+
+Report bugs to &lt;<A HREF="mailto:Grigori.Rybkine@cern.ch">Grigori.Rybkine@cern.ch</A>&gt;.
+<P>
+
+<HR>
+<A NAME="index">&nbsp;</A><H2>Index</H2>
+<DL>
+<DT><A HREF="#lbAB">NAME</A><DD>
+<DT><A HREF="#lbAC">SYNOPSIS</A><DD>
+<DT><A HREF="#lbAD">DESCRIPTION</A><DD>
+<DT><A HREF="#lbAE">AUTHOR</A><DD>
+<DT><A HREF="#lbAF">REPORTING BUGS</A><DD>
+</DL>
+<HR>
+This document was created by
+<A HREF="http://localhost/cgi-bin/man/man2html">man2html</A>,
+using the manual pages.<BR>
+Time: 15:16:06 GMT, August 20, 2013
+</BODY>
+</HTML>
diff --git a/PackDist/hscript.py b/PackDist/hscript.py
new file mode 100644
index 00000000000..3916380c9a6
--- /dev/null
+++ b/PackDist/hscript.py
@@ -0,0 +1,99 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+## -*- python -*-
+## automatically generated from a hscript
+## do NOT edit.
+
+## waf imports
+import waflib.Logs as msg
+
+PACKAGE = {
+    "name":    "PackDist",
+    "authors": ["Grigori Rybkine <Grigori.Rybkine@cern.ch>", "Christian Arnault <arnault@lal.in2p3.fr>"],
+
+
+}
+
+### ---------------------------------------------------------------------------
+def pkg_deps(ctx):
+    
+    ## no public dependencies
+    ## no private dependencies
+    ## no runtime dependencies
+    return # pkg_deps
+
+
+### ---------------------------------------------------------------------------
+def options(ctx):
+    
+    return # options
+
+
+### ---------------------------------------------------------------------------
+def configure(ctx):
+    
+    
+    
+    #### set &{{PACKCFG [{default [../config/pack-nightly-bugfix.cfg]}]}}
+    ctx.hwaf_declare_macro("PACKCFG", (
+      {"default": "../config/pack-nightly-bugfix.cfg"},
+    ))
+    ctx.hwaf_declare_runtime_env("PACKCFG")
+    #### set &{{PACKOPTS [{default [${PACKOPTS}]}]}}
+    ctx.hwaf_declare_macro("PACKOPTS", (
+      {"default": "${PACKOPTS}"},
+    ))
+    ctx.hwaf_declare_runtime_env("PACKOPTS")
+    #### set_remove &{{PACKOPTS [{default [-w]}]}}
+    ctx.hwaf_macro_remove("PACKOPTS", (
+      {"default": "-w"},
+    ))
+    ##### **** statement *hlib.SetAppendStmt (&{{PACKOPTS [{default [-w]}]}})
+    #### macro &{{PACKREPO [{default [../run]}]}}
+    ctx.hwaf_declare_macro("PACKREPO", (
+      {"default": "../run"},
+    ))
+    #### macro &{{PACKINSTALL [{default [../installation]}]}}
+    ctx.hwaf_declare_macro("PACKINSTALL", (
+      {"default": "../installation"},
+    ))
+    #### macro &{{urlget [{default [wget]} {Darwin [curl -L -O]}]}}
+    ctx.hwaf_declare_macro("urlget", (
+      {"default": "wget"},
+      {"Darwin": ["curl", "-L", "-O"]},
+    ))
+    #### macro &{{main [{default [${PACKAGE_ROOT}/scripts/proj-run.sh]}]}}
+    ctx.hwaf_declare_macro("main", (
+      {"default": "${PACKAGE_ROOT}/scripts/proj-run.sh"},
+    ))
+    #### macro &{{version_info [{default [`${main} -v`]}]}}
+    ctx.hwaf_declare_macro("version_info", (
+      {"default": ["`${main}", "-v`"]},
+    ))
+    #### macro &{{doc_proj-run_sh [{default [pack project(s}, external package(s}]}]}}
+    ctx.hwaf_declare_macro("doc_proj-run_sh", (
+      {"default": ["pack", "project(s},", "external", "package(s}"]},
+    ))
+    #### macro &{{doc_pack-relocate_sh [{default [relocate or transform distribution kit]}]}}
+    ctx.hwaf_declare_macro("doc_pack-relocate_sh", (
+      {"default": ["relocate", "or", "transform", "distribution", "kit"]},
+    ))
+    ##### **** statement *hlib.MakeFragmentStmt (&{pack_run})
+    ##### **** statement *hlib.MakeFragmentStmt (&{pack_install})
+    ##### **** statement *hlib.MakeFragmentStmt (&{help2doc})
+    
+    return # configure
+
+
+### ---------------------------------------------------------------------------
+def build(ctx):
+    
+    
+    ##### **** statement *hlib.DocumentStmt (&{pack_run [Run -group=run $(main)]})
+    ##### **** statement *hlib.DocumentStmt (&{pack_install [Installation -group=installation -s=. $(PACKREPO)]})
+    ##### **** statement *hlib.DocumentStmt (&{help2doc [Doc -group=doc $(main) ../share/pack-relocate.sh]})
+    
+    
+    return # build
+
+## EOF ##
diff --git a/PackDist/man/man1/pack-relocate.sh.1 b/PackDist/man/man1/pack-relocate.sh.1
new file mode 100644
index 00000000000..99de09bca58
--- /dev/null
+++ b/PackDist/man/man1/pack-relocate.sh.1
@@ -0,0 +1,33 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.36.
+.TH PACK-RELOCATE.SH "1" "August 2013" "pack-relocate.sh (PackDist) 0.6.1" "Packaging and Distribution Tools"
+.SH NAME
+pack-relocate.sh \- relocate or transform distribution kit
+.SH SYNOPSIS
+.B pack-relocate.sh
+[\fIOPTION\fR]... \fISOURCE DEST\fR
+.br
+.B pack-relocate.sh
+[\fIOPTION\fR]... \fI-t PATH\fR...
+.SH DESCRIPTION
+In first form, relocate the ATLAS distribution kit from SOURCE to DEST.
+In second form, locate the ATLAS distribution kit in PATH and transform
+as described for \fB\-t\fR option (implies \fB\-i\fR option).
+.TP
+\fB\-i\fR
+edit files in\-place, without moving them from SOURCE to DEST
+.TP
+\fB\-c\fR
+only relocate files in cmtsite
+.TP
+\fB\-t\fR
+transform setup scripts so that full paths in them may be changed by setting ATLAS_RELEASE_BASE environment variable
+.TP
+\fB\-h\fR
+display this help and exit
+.TP
+\fB\-v\fR
+output version information and exit
+.SH AUTHOR
+Written by Grigori Rybkine.
+.SH "REPORTING BUGS"
+Report bugs to <Grigori.Rybkine@cern.ch>.
diff --git a/PackDist/man/man1/proj-run.sh.1 b/PackDist/man/man1/proj-run.sh.1
new file mode 100755
index 00000000000..f09233bbcea
--- /dev/null
+++ b/PackDist/man/man1/proj-run.sh.1
@@ -0,0 +1,108 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.36.
+.TH PROJ-RUN.SH "1" "August 2013" "proj-run.sh (PackDist) 00-12-00" "Packaging and Distribution Tools"
+.SH NAME
+proj-run.sh \- pack project(s), external package(s)
+.SH SYNOPSIS
+.B proj-run.sh
+[\fIOPTION\fR]...
+.SH DESCRIPTION
+Pack project with external packages it depends upon, or only external package(s).
+.TP
+\fB\-L\fR <path>
+create log file in directory <path>
+.TP
+\fB\-C\fR <path>
+create packages in directory <path>
+.TP
+\fB\-X\fR <path>
+create external packages in directory <path>
+(takes precedence over \fB\-C\fR value)
+.TP
+\fB\-J\fR <path>
+create project packages in directory <path>
+(takes precedence over \fB\-C\fR value)
+.TP
+\fB\-o\fR <path>
+create RPMs in directory <path>
+.TP
+\fB\-x\fR <path>
+create external RPMs in directory <path>
+(takes precedence over \fB\-o\fR value)
+.TP
+\fB\-j\fR <path>
+create project RPMs in directory <path>
+(takes precedence over \fB\-o\fR value)
+.TP
+\fB\-b\fR <path>
+pack project located in project base directory <path>
+.TP
+\fB\-P\fR <project>
+pack project <project>
+.TP
+\fB\-r\fR <id>
+pack project release <id>
+.TP
+\fB\-p\fR <package>
+pack external package <package> (may be multiple)
+.TP
+\fB\-D\fR
+pack debug build
+.TP
+\fB\-I\fR
+create debug information packages (for not debug build)
+.TP
+\fB\-S\fR <suffix>
+suffix of debug information files (for not debug build)
+.TP
+\fB\-t\fR <tag>[,<tag>...]
+use additional tag(s) for setup (may be multiple)
+.TP
+\fB\-T\fR <cmtconfig>
+force CMTCONFIG <cmtconfig> (platform tag) for setup
+.TP
+\fB\-d\fR
+pack documentation files also
+.TP
+\fB\-F\fR
+overwrite existing tarballs of external packages
+.TP
+\fB\-U\fR
+overwrite existing tarballs of project packages
+.TP
+\fB\-k\fR
+keep existing tarballs of settings packages
+(default is overwrite if their versions differ from those in use)
+.TP
+\fB\-R\fR
+recursively pack projects required by the project being packed
+.TP
+\fB\-V\fR
+verify that existing tarballs (of project and/or external packages) are up\-to\-date
+.TP
+\fB\-w\fR
+wait until packing completion
+.TP
+\fB\-q\fR
+do not write anything to standard output
+.TP
+\fB\-n\fR
+do not execute, only dump configuration
+.TP
+\fB\-B\fR <path>
+use directory <path> for temporary files
+.TP
+\fB\-c\fR <path>
+use configuration file <path>
+.TP
+\fB\-h\fR
+display this help and exit
+.TP
+\fB\-v\fR
+output version information and exit
+.PP
+The PACKOPTS environment variable specifies a space separated list of default options
+to be placed in front of any explicit options.
+.SH AUTHOR
+Written by Grigori Rybkine.
+.SH "REPORTING BUGS"
+Report bugs to <Grigori.Rybkine@cern.ch>.
diff --git a/PackDist/scripts/basic-requirements.template b/PackDist/scripts/basic-requirements.template
new file mode 100644
index 00000000000..a866b8aadc3
--- /dev/null
+++ b/PackDist/scripts/basic-requirements.template
@@ -0,0 +1,13 @@
+#
+# !!! DO NOT EDIT - GENERATED AUTOMATICALLY FOR USE AT KIT INSTALLATION TIME !!!
+#
+
+set CMTSITE STANDALONE
+set SITEROOT @INSTALL_PREFIX@
+
+path_prepend CMTPROJECTPATH ${SITEROOT}
+
+path CMTPATH
+
+set CMTEXTRATAGS ${CMTEXTRATAGS}
+set_prepend CMTEXTRATAGS ATLAS,
diff --git a/PackDist/scripts/defaults.cfg b/PackDist/scripts/defaults.cfg
new file mode 100755
index 00000000000..e2dce8dcf41
--- /dev/null
+++ b/PackDist/scripts/defaults.cfg
@@ -0,0 +1,40 @@
+# File: defaults.cfg
+#
+# This is the configuration file for the pack-run.sh script with default settings.
+# Do not edit!!!
+# To override the settings and/or add those without default values use
+# ~/.pack.cfg, the file specified in the environment variable PACKCFG,
+# the file specified with the -c command line option
+# (values from "earlier" files are overridden by "later" files).
+#
+# The format is: option = value # comments
+#            or: option : value # comments
+#
+# (Command line options override values from the configuration files.)
+#
+# Report bugs to <Grigori.Rybkine@cern.ch>.
+#
+
+cmthome = ${HOME}/cmthome
+logdir = $HOME
+pacmancache= .
+patchdir = ${HOME}
+
+# overwrite (yes) or not (no) existing tarballs of external packages
+overwrite : no
+
+#    projbase=/afs/cern.ch/atlas/software/builds
+#    projbase=/afs/cern.ch/atlas/software/dist
+    mainpkg=AtlasRelease
+
+project = AtlasOffline
+#    release= 10.5.0
+
+mode = opt # opt, dbg
+
+cmtcache: http://www.cmtsite.org/pacman/cache
+
+setuproot = /afs/cern.ch/atlas/software/dist/AtlasSetup
+tags = builds,noruntime
+debuginfo = no
+debuginfosuffix = .debug
diff --git a/PackDist/scripts/doc.ptn b/PackDist/scripts/doc.ptn
new file mode 100755
index 00000000000..e4bcea6b537
--- /dev/null
+++ b/PackDist/scripts/doc.ptn
@@ -0,0 +1,9 @@
+doc
+doc/*
+docs
+docs/*
+doc-files
+doc-files/*
+ChangeLog
+README
+*.doc
diff --git a/PackDist/scripts/extern-junk.ptn b/PackDist/scripts/extern-junk.ptn
new file mode 100755
index 00000000000..40fe6aaec5e
--- /dev/null
+++ b/PackDist/scripts/extern-junk.ptn
@@ -0,0 +1,9 @@
+CVS
+*~
+*.pyc
+*.pyo
+*.stamp
+*.shstamp
+*.cmtref
+.svn
+.__afs*
diff --git a/PackDist/scripts/junk.ptn b/PackDist/scripts/junk.ptn
new file mode 100755
index 00000000000..d857e8ddb0e
--- /dev/null
+++ b/PackDist/scripts/junk.ptn
@@ -0,0 +1,20 @@
+CVS
+CVS/*
+cmt/setup.*
+cmt/cleanup.*
+cmt/*make*
+cmt/*.log
+cmt/.cvsignore
+run/*
+*.BAK
+*~
+src/*.g
+temp
+temp/*
+NICOS_*
+*.cmtref
+*.pyc
+*.pyo
+.svn
+.svn/*
+.__afs*
diff --git a/PackDist/scripts/pack-common.sh b/PackDist/scripts/pack-common.sh
new file mode 100755
index 00000000000..7a7a9044bf7
--- /dev/null
+++ b/PackDist/scripts/pack-common.sh
@@ -0,0 +1,217 @@
+# File: pack-common.sh
+#
+# Functions used by all scripts.
+#
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>.
+#
+
+#
+# Usage: info|warn|error [message [location]]
+#
+info () { echo -e ${scriptname:=`basename $0`}: ${2:+$2:} INFO: "$1" 1>&2; }
+#info () { echo -e "${scriptname:=`basename $0`}: ${2:+$2: }INFO:" "$1" 1>&2; }
+#info () { echo -e "`basename $0`: ${2:+$2: }INFO:" "$1"; }
+warn () { echo -e "${scriptname:=`basename $0`}: ${2:+$2: }WARNING:" "$1" 1>&2; }
+error () { echo -e "${scriptname:=`basename $0`}: ${2:+$2: }ERROR:" "$1" 1>&2; }
+
+abspath ()
+{
+#
+# Usage: abspath FILEPATH
+#
+# if FILEPATH is invalid or empty,
+# the result is an empty string
+#
+[ $# -eq 1 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+if [ -f "$1" ]; then
+    local d=`dirname $1`
+    d=`cd $d || exit; pwd -P` ||
+    { error "Cannot resolve path: $1" $FUNCNAME; return 1; }
+    echo $d/`basename $1`
+elif [ -d "$1" ]; then
+    (cd $1 || exit; pwd -P) ||
+    { error "Cannot resolve path: $1" $FUNCNAME; return 1; }
+#    (cd $1; /bin/pwd)
+else
+    error "No such file or directory: $1" $FUNCNAME; return 1
+fi
+}
+
+duf ()
+{
+#
+# Usage: duf [OPTION]... [FILE]...
+# Show information about the filesystem on which the current directory resides,
+# display the total amount of disk space required for FILEs, or standard input,
+# or the current directory by default.
+#
+#  -p PATH   show information about the filesystem on which PATH resides
+#
+local path
+OPTIND=1
+while getopts "p:" opt; do
+    case $opt in
+	p) path=${OPTARG} ;;
+	\?) error "Invalid usage" $FUNCNAME; return 1 ;;
+    esac
+done
+
+shift $(($OPTIND - 1))
+
+[ "$path" ] || path=$PWD
+
+#local fstype=$(df -P -T $path|tail -n 1|awk '{print $2}')
+# use POSIX output (and options)
+local -a fsinfo=(`df -kP $path|tail -n 1|awk '{print $1, $2, $4}'`) ||
+{ error "awk" $FUNCNAME; return 1; }
+[ "${fsinfo[0]}" ] || { error "Cannot determine filesystem type: $path" $FUNCNAME; return 1; }
+#[ "$fstype" ] || { error "Cannot determine filesystem type: $path" $FUNCNAME; return 1; }
+
+if [[ ${fsinfo[0]} == [Aa][Ff][Ss] ]]; then
+    fsinfo=(`fs lq $path|tail -n 1|awk '{print $1, $2, $2 - $3}'`)
+fi
+# local -a fsinfo=(`
+# case $fstype in
+#     afs) fs lq $path|tail -n 1|awk '{print $1, $2, $2 - $3}' ;;
+#     *) df -P $path|tail -n 1|awk '{print $1, $2, $4}' ;;
+# esac
+# `)
+
+# use POSIX options of du -ksL (c - grand total, not POSIX)
+case $# in
+    0) local reqspace=$(xargs du -k -s -c -L |
+    awk '$2 == "total" { sum += $1 }; END{ print sum }') ;;
+    *) local reqspace=$(du -k -s -c -L "$@" |
+    awk '$2 == "total" { sum += $1 }; END{ print sum }') ;;
+esac
+
+local fmt="%-20s %15s %15s %15s\n"
+printf "$fmt" "Filesystem" "1024-blocks" "Available" "Required"
+printf "$fmt" ${fsinfo[0]} ${fsinfo[1]} ${fsinfo[2]} ${reqspace}
+}
+
+newer ()
+{
+#
+# Usage: newer -p PATH [OPTION]... [FILE]...
+#
+#  -L   dereference all symbolic links
+#
+
+local path follow
+
+OPTIND=1
+while getopts "p:L" opt; do
+    case $opt in
+	p) path=${OPTARG} ;;
+	L) follow=yes ;;
+	\?) error "Invalid usage" $FUNCNAME; return 1 ;;
+    esac
+done
+
+shift $(($OPTIND - 1))
+
+[ "$path" ] || { error "PATH must be supplied with '-p'" $FUNCNAME; return 1; }
+
+local tmpnew=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+
+case $# in
+#    0) xargs findnewer -p $path ${follow:+-L} ;;
+    0) xargs -r sh -c "findnewer -p $path ${follow:+-L} \$0 \$@" >>$tmpnew ;;
+    *) findnewer -p $path ${follow:+-L} "$@" >|$tmpnew ;;
+esac
+
+local retval=$?
+
+[ -s $tmpnew ] && { warn "$path: Newer files available:" $FUNCNAME; cat $tmpnew >&2; }
+rm -f $tmpnew
+
+case $retval in
+    123|124) error "findnewer" $FUNCNAME; return 1 ;;
+    125|126|127|1) error "xargs" $FUNCNAME; return 1 ;;
+    2) error "findnewer" $FUNCNAME; return 2 ;;
+esac
+}
+
+findnewer ()
+{
+#
+# Usage: findnewer -p PATH [OPTION]... [FILE]...
+#
+#  -L   dereference all symbolic links
+#
+
+local path follow
+
+OPTIND=1
+while getopts "p:L" opt; do
+    case $opt in
+	p) path=${OPTARG} ;;
+	L) follow=yes ;;
+	\?) error "Invalid usage" $FUNCNAME; return 2 ;;
+    esac
+done
+
+shift $(($OPTIND - 1))
+
+[ "$path" ] || { error "PATH must be supplied with '-p'" $FUNCNAME; return 2; }
+
+[ ${uname} != Linux ] || noleaf=yes
+find $(echo_F "$@") ${noleaf:+-noleaf} ${follow:+-follow} -newer $path -ls ||
+#find ${follow:+-L} $(echo_F "$@") ${noleaf:+-noleaf} -newer $path -ls ||
+{ error "find" $FUNCNAME; return 2; }
+}
+
+echo_F ()
+{
+#
+# Usage: echo_F [FILE]...
+# Append forward slash (/) to the names of FILEs that are symbolic links to existing directories.
+# Print the names of the other FILEs unchanged.
+#
+local s first=y
+for s; do
+    if [ "$first" ]; then
+	echo -n "$s"; unset first
+    else
+	echo -n " $s"
+    fi
+    if [ -h "$s" -a -d "$s" ]; then
+	[[ $s == ?*/ ]] || echo -n /
+    fi
+done
+}
+
+export -f findnewer error echo_F
+#export scriptname
+
+path_prepend ()
+{
+#
+# Usage: path_prepend PATHVARIABLE PATH
+#
+[ $# -eq 2 ] || return 0
+[ "$1" ] && [ "$2" ] || return 0
+
+local val=$2
+for p in $(eval echo \$$1 | tr -s ':' ' '); do
+    [ $p = $2 ] || val=${val}:$p
+done
+eval $1=$val
+}
+
+path_append ()
+{
+#
+# Usage: path_append PATHVARIABLE PATH
+#
+[ $# -eq 2 ] || return 0
+[ "$1" ] && [ "$2" ] || return 0
+
+local val
+for p in $(eval echo \$$1 | tr -s ':' ' '); do
+    [ $p = $2 ] || if [ -n "${val}" ]; then val=${val}:$p; else val=$p; fi
+done
+if [ -n "${val}" ]; then val=${val}:$2; else val=$2; fi
+eval $1=$val
+}
diff --git a/PackDist/scripts/pack-extern.sh b/PackDist/scripts/pack-extern.sh
new file mode 100755
index 00000000000..1ae2f23e875
--- /dev/null
+++ b/PackDist/scripts/pack-extern.sh
@@ -0,0 +1,534 @@
+#!/bin/bash
+# File: pack-extern.sh
+#
+# Pack external software interfaced to by a cmt package.
+#
+# Author: Christian Arnault <arnault@lal.in2p3.fr>
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>.
+#
+
+[ "$PACKEXTERNDBG" ] && set -x
+
+: ${externcache:?} ${patchdir:?} ${overwrite:?}
+
+: ${scriptdir:?}
+. $scriptdir/pack-common.sh
+
+: ${CMTCONFIG:?}
+: ${SITEROOT:?}
+#: ${tmpdir:?}
+#: ${tmppatch:?}
+
+##################################### functions #####################################
+_patch ()
+{
+#
+# Parameters: 'project' 'release' 'package'
+# Create a patched requirements file, install it
+# in the right place in the directory tree under tmppatch and
+# print its path on the standard output: 'patch-path'
+#
+# Return status: 0 if a patched file is created, 1 otherwise
+#
+[ -d "${patchdir}" ] ||
+{ warn "patchdir=$patchdir: No such directory" $FUNCNAME; return 1; }
+
+# Check for patches
+if [ -f ${patchdir}/${1}/${2}/requirements -o \
+     -f ${patchdir}/${1}/${2}/${3}/requirements ]; then
+
+local projpatch=${patchdir}/${1}/${2}/requirements pkgpatch=${patchdir}/${1}/${2}/${3}/requirements
+local reqpatch=$(mktemp -d -t tmp.XXXXXXXXXX)/requirements || { error "mktemp" $FUNCNAME; return 1; }
+>|${reqpatch}
+
+if [ -f $pkgpatch ]; then
+    if head -n 1 $pkgpatch | grep -q '^#!'; then
+	$pkgpatch <requirements >>${reqpatch}
+    else
+	cat requirements $pkgpatch >>${reqpatch}
+    fi
+    [ $? -eq 0 ] || { error "Cannot apply: $pkgpatch" $FUNCNAME; }
+fi
+
+if [ -f $projpatch ]; then
+#     echo >>${reqpatch}
+    cat $projpatch >>${reqpatch} || { error "Cannot apply: $projpatch" $FUNCNAME; }
+fi
+
+[ -s ${reqpatch} ] || { rm -rf $(dirname $reqpatch)
+warn "Empty patch(es) provided: $1 $2 $3" $FUNCNAME; return 1; }
+
+# if _install_patched $1 $2 $3 ${reqpatch}; then
+#     rm -rf $(dirname $reqpatch) || return 0
+# else echo ${reqpatch}
+# fi
+_install_patched $1 $2 $3 ${reqpatch} >/dev/null
+echo ${reqpatch}
+
+else return 1
+fi
+}
+
+_install_patched ()
+{
+#
+# Parameters: 'project' 'release' 'package' 'patched-path'
+# Install patched requirements file 'patched-path'
+# in the right place in the directory tree under tmppatch and
+# print its path on the standard output: 'installed-path'
+#
+[ $# -eq 4 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+[ -d "${tmppatch}" ] ||
+{ error "tmppatch=$tmppatch: No such directory" $FUNCNAME; return 1; }
+local reqdir=$(pwd | sed -n 's#^.*\('$1/$2'\)#\1#p')
+[ "$reqdir" ] || { error "$(pwd): $1 $2 $3" $FUNCNAME; return 1; }
+mkdir -p ${tmppatch}/$reqdir || { error "mkdir" $FUNCNAME; return 1; }
+info "Writing patched requirements: $1 $2 $3" $FUNCNAME
+[ "$PACKEXTERNDBG" ] && cat $4 >&2
+cp -p $4 ${tmppatch}/$reqdir/requirements ||
+{ error "cp" $FUNCNAME; return 1; }
+echo ${tmppatch}/$reqdir/requirements
+}
+
+_mkname ()
+{
+#
+# Parameters: 'package' 'version' ['platform']
+#
+[ $# -eq 2 -o $# -eq 3 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+
+#if [ "$3" == bin -o -z "$3" ]; then
+
+if [ $# -eq 2 -o "$3" == bin ]; then
+    sed -e 's/[-.]/_/g' -e "s/${1}_${1}/${1}/" <<<${1}_${2}_${CMTCONFIG}
+else
+    sed -e 's/[-.]/_/g' -e "s/${1}_${1}/${1}/" <<<${1}_${2}_${3}
+    #sed 's/[-.]/_/g' <<<${1}_${2}_${3}
+fi
+}
+
+_bad_symlinks ()
+{
+#
+# Parameters: [FILE...]
+# Print on the standard output broken symlinks paths (format: 'path:' 'error message')
+#
+find "$@" -follow 2>&1 >/dev/null | sed 's/^find:[ ]*//'
+# -L option is not supported by GNU find version 4.1.20 (SL4)
+# but supported by GNU find version 4.2.27 (SL5) and find on Mac OS X 10.5, 10.6
+# -follow supported by all (is deprecated on Mac OS X 10.5)
+#find -L "$@" 2>&1 >/dev/null | sed 's/^find:[ ]*//'
+#
+#find "$@" -follow -fprint /dev/null 2>&1 | sed 's/^find:[ ]*//'
+#find $* -follow -fprint /dev/null 2>&1 | sed 's/^find:[ ]*//'
+# 	    [ -d $_s ] && symlinks -rv $_s | grep ^dangling >|$tmperr
+# 	    if [ -s $tmperr ]; then
+# 		[ "$PACKEXTERNDBG" ] && cat $tmperr
+# 		{ error "Symlinks below cannot be followed:" $FUNCNAME; cat $tmperr 1>&2; }
+#                 # does not work - bug in symlinks
+# 		#symlinks -rv $_d | grep ^dangling | cut -d' ' -f2 >|$tmperr
+# 		find $_d/ -noleaf | xargs file | grep broken | cut -d: -f1 >|$tmperr
+# 		[ "$PACKEXTERNDBG" ] && cat $tmperr
+# 	    fi
+}
+
+_chk_links ()
+{
+[ -d "$1" ] || return 0
+local tmperr=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+
+#    /^other_fs|^dangling/ { print >tmperr; next }
+symlinks -rv $1 |
+    awk -v tmperr=$tmperr '
+    /^absolute|^other_fs|^dangling|^messy/ { print >tmperr; next }
+    { print }
+' |
+while read line; do
+
+grep -q $(abspath $1) <<<"$(
+    abspath $(
+    awk '
+    {
+        if (substr($4, 1, 1) == "/") print $4
+        else { n = split($2, a, "/")
+        print substr($2, 1, length($2) - length(a[n])) $4 }
+    }
+    ' <<<$line
+    )
+)" || echo $line >>$tmperr
+
+done
+
+[ -s $tmperr ] && { warn "Symlinks will not be followed:" $FUNCNAME; cat $tmperr >&2; }
+
+rm -f $tmperr || return 0
+}
+
+_tar_extern ()
+{
+#
+# Parameters: 'name'
+#
+
+local n=${#src[*]}
+[ $n -gt 0 ] || return 0
+if [ ${uname} = Linux ]; then
+    local tar_basic_opts="-v --owner=root --group=root --mode=u=rwX,go=rX --no-anchored --wildcards"
+    noleaf=yes
+#    group=yes
+else
+    local tar_basic_opts="-v"
+    unset noleaf
+#    unset group
+fi
+
+local tar_cmd=tar
+#local tar_basic_opts="-v --owner=root ${group:+--group=root} --mode=u=rwX,go=rX --no-anchored --wildcards"
+#local tar_basic_opts="-v --owner=root --group=root --mode=u=rwX,go=rX --no-anchored --wildcards"
+#local tar_basic_opts="-v --owner=root --group=root --mode=u=rwX,go=rX"
+
+local fpath=${externcache}/kits/${1}.tar
+
+# create an empty archive to append to
+${tar_cmd} ${tar_basic_opts} -cf ${fpath} -T /dev/null 1>&2 ||
+{ error "${tar_cmd}" $FUNCNAME; return 1; }
+
+cd ${tempcopydir} || { error "cd" $FUNCNAME; return 1; }
+#local n=${#src[*]}
+
+for (( i=0 ; i!=n ; i++ )) ; do
+    #s=$(echo ${src[$i]} | sed 's#/\+$##')
+    local s=$(sed 's#/\+$##' <<<${src[$i]}) || { error "sed" $FUNCNAME; return 1; }
+    local d=$(sed 's#/\+$##' <<<${dst[$i]}) || { error "sed" $FUNCNAME; return 1; }
+
+	rm -rf ${tempcopydir}/*
+ 	[ -f $s -o -d $s ] || { error "$(stat -L $s 2>&1)" $FUNCNAME; continue; }
+
+ 	if [ "${follow_symlinks}" ]; then
+	    warn "Following symlinks to pack '$s' as '$d'" $FUNCNAME
+	    mkdir -p $(dirname $d) || { error "mkdir" $FUNCNAME; continue; }
+	    ln -sf $s $d || { error "ln" $FUNCNAME; continue; }
+
+	    local tmperr=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; continue; }
+	    _bad_symlinks $s >|$tmperr
+	    if [ -s $tmperr ]; then
+		{ error "Symlinks cannot be followed:" $FUNCNAME; cat $tmperr 1>&2; }
+		_bad_symlinks $d | cut -d: -f1 >|$tmperr
+		[ "$PACKEXTERNDBG" ] && cat $tmperr 1>&2
+	    fi
+
+	    ${tar_cmd} ${tar_basic_opts} -hrf ${fpath} \
+		-X $scriptdir/extern-junk.ptn ${exclude_objfiles:+--exclude='*.o'} -X $tmperr \
+		$d 1>&2 || { error "${tar_cmd}" $FUNCNAME; continue; }
+
+	    rm -f $tmperr
+ 	elif [ . == $(dirname $d) ]; then
+	    [ -f $s ] && \
+	    { error "Cowardly refusing to pack '$s' as '$d' - no top directory" $FUNCNAME; continue; }
+	    ln -sf $s $d || { error "ln" $FUNCNAME; continue; }
+	    ${tar_cmd} ${tar_basic_opts} --no-recursion -hrf ${fpath} \
+		-X $scriptdir/extern-junk.ptn ${exclude_objfiles:+--exclude='*.o'} \
+		$d 1>&2 || { error "${tar_cmd}" $FUNCNAME; continue; }
+	    find $d/ ${noleaf:+-noleaf} -mindepth 1 -maxdepth 1 | \
+		${tar_cmd} ${tar_basic_opts} -rf ${fpath} -T - \
+		-X $scriptdir/extern-junk.ptn ${exclude_objfiles:+--exclude='*.o'} \
+		1>&2 || { error "${tar_cmd}" $FUNCNAME; continue; }
+# 	    find $d/ ${noleaf:+-noleaf} -mindepth 1 -maxdepth 1 | xargs \
+# 		${tar_cmd} ${tar_basic_opts} -rf ${fpath} \
+# 		-X $scriptdir/extern-junk.ptn ${exclude_objfiles:+--exclude='*.o'} \
+# 		1>&2 # || { error "${tar_cmd}" $FUNCNAME; return 1; }
+# 	    case $? in
+# 		123|124) error "${tar_cmd}" $FUNCNAME; continue ;;
+# 		125|126|127|1) error "xargs" $FUNCNAME; continue ;;
+# 	    esac
+	    [ ${uname} != Linux ] || _chk_links $s
+ 	elif [ -f $s ]; then
+	    mkdir -p $(dirname $(dirname $d)) || { error "mkdir" $FUNCNAME; continue; }
+	    ln -sf $(dirname $s) $(dirname $d) || { error "ln" $FUNCNAME; continue; }
+	    ${tar_cmd} ${tar_basic_opts} -rf ${fpath} \
+		-X $scriptdir/extern-junk.ptn ${exclude_objfiles:+--exclude='*.o'} \
+		$d 1>&2 || { error "${tar_cmd}" $FUNCNAME; continue; }
+
+	    [ -h $s ] &&
+	    warn "Symlink $s -> $(readlink $s) packed as '$d'" $FUNCNAME
+ 	else
+#	    [ -h $s ] &&
+            if [ -h $s ]; then
+		warn "Following symlink $s -> $(readlink $s) to pack as '$d'" $FUNCNAME
+		follow=yes
+	    else
+		unset follow
+	    fi
+ 	    mkdir -p $(dirname $d) || { error "mkdir" $FUNCNAME; continue; }
+ 	    ln -sf $s $d || { error "ln" $FUNCNAME; continue; }
+	    ${tar_cmd} ${tar_basic_opts} --no-recursion -hrf ${fpath} \
+		-X $scriptdir/extern-junk.ptn ${exclude_objfiles:+--exclude='*.o'} \
+		$d 1>&2 || { error "${tar_cmd}" $FUNCNAME; continue; }
+	    find $d/ ${noleaf:+-noleaf} ${follow:+-follow} -mindepth 1 -maxdepth 1 | \
+		${tar_cmd} ${tar_basic_opts} -rf ${fpath} -T - \
+		-X $scriptdir/extern-junk.ptn ${exclude_objfiles:+--exclude='*.o'} \
+		1>&2 || { error "${tar_cmd}" $FUNCNAME; continue; }
+# 	    find $d/ ${noleaf:+-noleaf} -mindepth 1 -maxdepth 1 | xargs \
+# 		${tar_cmd} ${tar_basic_opts} -rf ${fpath} \
+# 		-X $scriptdir/extern-junk.ptn ${exclude_objfiles:+--exclude='*.o'} \
+# 		1>&2 #|| { error "${tar_cmd}" $FUNCNAME; return 1; }
+# 	    case $? in
+# 		123|124) error "${tar_cmd}" $FUNCNAME; continue ;;
+# 		125|126|127|1) error "xargs" $FUNCNAME; continue ;;
+# 	    esac
+	    [ ${uname} != Linux ] || _chk_links $s
+#	    _chk_links $s
+ 	fi
+
+done
+cd $OLDPWD
+
+gzip -vf ${fpath} >&2 || {
+rm -f ${fpath}
+error "gzip" $FUNCNAME; return 1; }
+}
+
+_getver ()
+{
+#
+# Determine package version and print on the standard output
+# (empty if cannot be determined )
+#
+# Parameters: 'name'
+#
+local fpath=${externcache}/cache/${1}.pacman
+
+if [ -f $fpath ]; then
+sed -e '/^[ \t]*version(.*)[ \t]*$/!d' -e 's/version(//' -e 's/)[ \t]*$//' -e "s/['\"]//g" ${fpath} || { error "sed" $FUNCNAME; return 1; }
+fi
+}
+
+_pacman ()
+{
+#
+# Write pacman file
+#
+# Parameters: 'name' ['requires-file' ['postinstall-script' ['preinstall-script' ['version']]]]
+#
+local reqs fpath ver _ver
+
+fpath=${externcache}/cache/${1}.pacman
+
+if [ "$5" ]; then
+    ver=$5
+else
+    _ver=$(_getver ${1}) || { _ver=; warn "${fpath}: Version reset" $FUNCNAME; }
+    ver=$(expr ${_ver:-0} + 1) ||
+    { ver=1; warn "${fpath}: Version set to ${ver}" $FUNCNAME; }
+fi
+
+info "Writing ${fpath}, version ${ver}" $FUNCNAME
+
+# add dependencies
+if [ -s "$2" ]; then
+
+while read req rest; do
+    reqs="${reqs}
+package('${req}')"
+done <${2}
+
+fi
+
+# write pacman file
+cat <<EOF >|${fpath}
+
+description('External Package ${1}')
+version('${ver}')
+${reqs}
+
+EOF
+
+# add preinstall-script
+if [ -s "$4" ]; then
+    echo "shell('$(sed s/@INSTALL_PREFIX@/\$PACMAN_INSTALLATION/g $4)')" >>${fpath}
+fi
+
+if [ -f ${externcache}/kits/${1}.tar.gz ]; then
+
+cat <<EOF >>${fpath}
+
+downloadUntar('../kits/${1}.tar.gz')
+
+EOF
+else
+    warn "${externcache}/kits/${1}.tar.gz: No such file" $FUNCNAME
+fi
+
+# add postinstall-script
+if [ -s "$3" ]; then
+    echo "shell(\"$(sed s/@INSTALL_PREFIX@/\$PACMAN_INSTALLATION/g $3)\")" >>${fpath}
+    #echo "shell('$(sed s/@INSTALL_PREFIX@/\$PACMAN_INSTALLATION/g $3)')" >>${fpath}
+fi
+}
+
+_add_opt_dep ()
+{
+#
+# for external dbg package
+# add dependency on opt mode package
+# as the former contains dbg mode ONLY
+# (to aviod files conflicts with the latter)
+#
+# Parameters: 'name' ['requires-file']
+#
+    local name_opt=$(sed "s/dbg/opt/" <<<${1}) || { error "sed" $FUNCNAME; return 1; }
+    if [ ${1} != "${name_opt}" ]; then
+	if [ -f "${2:-}" ] && ! grep -q "${name_opt}" ${2}; then
+	    echo "${name_opt}" >>${2} || { error "echo" $FUNCNAME; return 1; }
+	elif [ ! -f "${2:-}" ]; then
+	    echo "${name_opt}"
+	fi
+	[ -f ${externcache}/cache/${name_opt}.pacman ] &&
+	[ -f ${externcache}/kits/${name_opt}.tar.gz ] ||
+	warn "Not packed: ${name_opt}" $FUNCNAME
+    fi
+}
+
+##################################### main ##########################################
+#info "$(date)" $FUNCNAME
+
+package=`cmt show macro_value package`
+project=`cmt show macro_value ${package}_project`
+release=`cmt show macro_value ${package}_project_release`
+
+if reqpatch=$(_patch ${project} ${release} ${package}); then
+    export CMTUSERCONTEXT=$(dirname $reqpatch)
+else unset reqpatch
+fi
+
+# Check if there are external packages required
+for pkg in `cmt -q -tag=ATLAS show macro_value ${package}_requires`; do
+    [ -f "${tmpreq:-}" ] || tmpreq=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; exit 1; }
+    echo "$pkg" >>$tmpreq || { error "echo" $FUNCNAME; exit 1; }
+done
+
+# Check if there is external software to pack
+export_paths=`cmt -q -tag=ATLAS show macro_value ${package}_export_paths`
+# Remove leading and trailing whitespace (to make the value empty if it was whitespace)
+src=(${export_paths})
+
+[ ${#src[*]} -gt 0 ] || [ -s "${tmpreq:-}" ] || exit 0
+#[ "$export_paths" ] || [ -s "$tmpreq" ] || exit 0
+
+export_paths=${src[*]}
+
+if [ -n "$export_paths" ]; then
+
+dst=($(cmt -q -tag=ATLAS,STANDALONE show macro_value ${package}_export_paths))
+dst=(${dst[*]#${SITEROOT}/})
+
+info "source:\n'${src[*]}'" $FUNCNAME
+info "destination:\n'${dst[*]}'" $FUNCNAME
+
+[ ${#src[*]} -eq ${#dst[*]} ] ||
+{ error "source # ${#src[*]}, destination # ${#dst[*]}" $FUNCNAME; exit 1; }
+
+if [ $# -eq 1 ] && [ -f "${1}" ]; then
+    n=${#src[*]}
+    for (( i=0 ; i!=n ; i++ )) ; do
+	echo ${src[$i]} ${dst[$i]} >>"${1}"
+    done
+fi
+
+fi
+
+if [ -s "${tmpreq:-}" ]; then
+info "requires:\n'$(<$tmpreq)'" $FUNCNAME
+fi
+
+native_version=`cmt -q -tag_add=PACK show macro_value ${package}_native_version`
+#native_version=`cmt -q show macro_value ${package}_native_version`
+version=`cmt show macro_value version`
+[ "${version}" = "v*" ] &&
+{ warn "Invalid CMT package version: $version: $project $release $package" $FUNCNAME;
+version=v1; }
+if [ -n "$native_version" ]; then
+    version=$native_version
+else
+    warn "Macro ${package}_native_version unspecified: $project $release $package $version" $FUNCNAME
+fi
+
+platform=`cmt -q -tag=PACK show macro_value ${package}_platform`
+
+#
+# Need to handle dbg mode
+#
+if [ -n "$export_paths" ] && [[ ${CMTCONFIG} == *dbg* ]] && [[ "${dst[*]}" != *dbg* ]] && [ -z $platform ]; then
+#if [[ ${CMTCONFIG} == *dbg* ]] && [[ "${export_paths}" != *dbg* ]] && [ -z $platform ]; then
+    info "No debug build available, using optimised" $FUNCNAME
+    platform=$(sed 's/dbg/opt/' <<<${CMTCONFIG}) ||
+    { error "sed" $FUNCNAME; exit 1; }
+fi
+
+name=`_mkname $package $version $platform`
+echo $name ${package} ${version}
+
+if [ -n "$export_paths" ] && [[ ${CMTCONFIG} == *dbg* ]] && [ -z ${platform} ]; then
+    n=${#src[*]}
+    for (( i=0 ; i!=n ; i++ )) ; do
+	if [[ ${dst[$i]} != *dbg* ]]; then
+            #
+            # Pack dbg mode ONLY into external dbg tarball
+            #
+	    [ -f "${tmpreq:-}" ] || tmpreq=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; exit 1; }
+	    _add_opt_dep ${name} ${tmpreq} || exit 1
+	    info "Skipped non-debug path: ${dst[$i]}" $FUNCNAME
+	    unset src[$i] dst[$i]
+	fi
+    done
+    # After possibly unsetting some array member(s) with path(s) to skip
+    # still want array members to be indexed contiguously
+    src=(${src[*]})
+    dst=(${dst[*]})
+fi
+
+follow_symlinks=`cmt -q -tag=PACK show macro_value ${package}_follow_symlinks`
+
+# if [ -f ${externcache}/kits/$name.tar.gz -a "${overwrite}" != yes ]; then
+#     info "Existing ${externcache}/kits/$name.tar.gz will not be overwritten" $FUNCNAME
+#fpath=${externcache}/kits/$name.tar.gz
+fpath=${externcache}/cache/$name.pacman
+if [ -f $fpath -a "${overwrite}" != yes ]; then
+
+    info "Existing $fpath will not be overwritten" $FUNCNAME
+
+    if [ "${verify}" = yes ]; then
+	spath=${externcache}/kits/$name.tar.gz
+	if [ -f $spath -a -n "${src[*]}" ]; then
+	    newer ${follow_symlinks:+-L} -p $spath ${src[*]}
+	elif [ -f $spath -a -z "${src[*]}" ]; then
+	    warn "$spath: No 'export_paths' to verify" $FUNCNAME
+	elif [ ! -f $spath -a -n "${src[*]}" ]; then
+	    error "$spath: No such file" $FUNCNAME
+	fi
+    fi
+
+else
+
+#follow_symlinks=`cmt -tag=PACK show macro_value ${package}_follow_symlinks`
+include_objfiles=`cmt -q -tag=PACK show macro_value ${package}_include_objfiles`
+if [ -n "$include_objfiles" ]; then
+    unset exclude_objfiles
+else
+    exclude_objfiles=yes
+fi
+
+tempcopydir=$(mktemp -d -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; exit 1; }
+
+_tar_extern $name || { rm -rf $tempcopydir; exit 1; }
+#_pacman $name
+_pacman ${name} ${tmpreq} || { rm -rf $tempcopydir; exit 1; }
+
+/bin/rm -rf $tempcopydir
+
+fi
+
+#exit 0
+
+#info "$(date)" $FUNCNAME
+[ ! -f $PACKRPM/bin/pack-rpm-extern.sh ] || . $PACKRPM/bin/pack-rpm-extern.sh
diff --git a/PackDist/scripts/pack-find.py b/PackDist/scripts/pack-find.py
new file mode 100755
index 00000000000..adf612ca913
--- /dev/null
+++ b/PackDist/scripts/pack-find.py
@@ -0,0 +1,195 @@
+#!/usr/bin/env python
+
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+"""File: pack-find.py
+
+Usage: pack-find.py [OPTION]... PATH...
+Search directory tree rooted at each filename PATH for ${CMTCONFIG} directories,
+pathnames matching any of shell patterns, supplied in files 'src.ptn', 'doc.ptn'
+in directory ${scriptdir}, excluding any other directories listed in file
+'platforms' or pathnames matching any of shell patterns in file 'junk.ptn' and
+writing pathnames into files specified with relevant options or on standard output,
+followed by a newline.
+
+      --bin-file=BINFILE       file for CMTCONFIG value binary directories pathnames
+      --src-file=SRCFILE       file for source code pathnames matching list of patterns in src.ptn
+      --doc-file=DOCFILE       file for documentation pathnames matching list of patterns in doc.ptn
+      --noarch-file=NOARCHFILE file for any other pathnames except for directories
+      --dirs-file=DIRSFILE     file for any other directories
+  -d, --debug                  print lots of debugging information
+  -h, --help                   display this help and exit
+      --version                output version information and exit
+
+Report bugs to <Grigori.Rybkine@cern.ch>.
+"""
+
+__version__ = '0.1.0'
+__date__ = 'Sat Feb 06 2010'
+__author__ = 'Grigory Rybkin'
+
+import sys, os
+import getopt
+from os.path import join, islink, basename
+from fnmatch import fnmatch
+import logging
+
+class ProjectFiles(object):
+    def __init__(self):
+        self.cmtconfig = os.environ['CMTCONFIG']
+        self.scriptdir = os.environ['scriptdir']
+        self.types = ['bin', 'src', 'doc', 'noarch', 'dirs']
+        for t in self.types:
+            setattr(self, t, list())
+            setattr(self, 'f' + t, None)
+
+    def _init(self):
+        platforms = open(join(self.scriptdir, 'platforms'))
+        # platforms to skip - all but ${CMTCONFIG}
+        self.platforms = [p for p in [p.strip() for p in platforms.readlines()]
+                          if p != self.cmtconfig]
+        platforms.close()
+        logger.debug(self.platforms)
+
+        def gen_expr(s):
+            ptn = []
+            for l in s.splitlines():
+                ptn.append(l)
+                if not l.startswith('*'):
+                    ptn.append(join('*', l))
+            logger.debug(ptn)
+            return ptn
+        def init_ptn(obj, name):
+            f = open(join(obj.scriptdir, name + '.ptn'))
+            setattr(obj, name + '_ptn', gen_expr(f.read()))
+            f.close()
+
+        for name in ['junk', 'src', 'doc']:
+            init_ptn(self, name)
+                
+    def walk(self, top):
+        self._init()
+
+        def onerror(e):
+            logger.error(e)
+            Errno.set(e.errno)
+
+        for root, dirs, files in os.walk(top, onerror = onerror):
+            for n in dirs + files:
+                p = join(root, n)
+                # platforms to skip - all but ${CMTCONFIG}
+                if n in self.platforms:
+                    if n in dirs and not islink(p): dirs.remove(n)
+                    continue
+                # platform to pack - ${CMTCONFIG}
+                if n == self.cmtconfig:
+                    self.bin.append(p)
+                    if n in dirs and not islink(p): dirs.remove(n)
+#                    if n in dirs: dirs.remove(n)
+                    continue
+                # exclude junk (print nothing)
+                m = False
+                for ptn in self.junk_ptn:
+                    if fnmatch(p, ptn):
+                        m = True
+                        break
+                if m: continue
+                if n in files or islink(p):
+                    # source code
+                    for ptn in self.src_ptn:
+                        if fnmatch(p, ptn):
+                            m = True
+                            self.src.append(p)
+                            break
+                    if m: continue
+                    # documentation files
+                    for ptn in self.doc_ptn:
+                        if fnmatch(p, ptn):
+                            m = True
+                            self.doc.append(p)
+                            break
+                    if m: continue
+                    # anything else - noarch files
+                    self.noarch.append(p)
+                else:
+                    # ALL directories
+                    self.dirs.append(p)
+        return Errno.errno
+    
+    def fprint(self):
+        def write(obj, name):
+            try:
+                if getattr(obj, 'f' + name):
+                    f = open(getattr(obj, 'f' + name), 'w')
+                    for line in getattr(obj, name):
+                        f.write(line + '\n')
+                    f.close()
+                else:
+                    for line in getattr(obj, name):
+                        sys.stdout.write(line + '\n')
+            except IOError, e:
+                logger.error(e)
+                Errno.set(e.errno)
+
+        for t in self.types:
+            write(self, t)
+
+class Errno:
+    def set(code):
+        Errno.errno = code
+    set = staticmethod(set)
+    errno = 0
+
+def help():
+    print sys.modules[__name__].__doc__
+
+def main(argv=[__name__]):
+    self = basename(argv[0])
+    try:
+        opts, args = getopt.getopt(argv[1:],
+                                   "hd",
+                                   ["bin-file=", "src-file=", "doc-file=",
+                                    "noarch-file=", "dirs-file=",
+                                    "help", "version", "debug"])
+    except getopt.error, e:
+        print >>sys.stderr, '%s: %s' % (self, str(e))
+        print >>sys.stderr, "Try '%s --help' for more information." % self
+        return 1
+
+    global logger
+    logging.basicConfig()
+    logger = logging.getLogger(self)
+    logger.setLevel(logging.INFO)
+
+    pfs = ProjectFiles()
+
+    for o, v in opts:
+        if o in ("-h", "--help"):
+            print sys.modules[__name__].__doc__
+            return 0
+        elif o in ("--version",):
+            print '%s %s (%s)' % (self, __version__, __date__)
+            print '%sWritten by %s.' % (os.linesep, __author__)
+            return 0
+        elif o in ("-d", "--debug"):
+            logger.setLevel(logging.DEBUG)
+        else:
+            for type in pfs.types:
+                if o == '--' + type + '-file':
+                    setattr(pfs, 'f' + type, v)
+                    logger.debug('set %r to %r' % (o, v))
+
+    if not args:
+        args = [os.curdir]
+#         print >>sys.stderr, '%s: missing path argument' % self
+#         print >>sys.stderr, "Try '%s --help' for more information." % self
+#         return 1
+
+    for arg in args:
+        pfs.walk(arg)
+#    if 0 != Errno.errno: return 1
+    pfs.fprint()
+    if 0 != Errno.errno: return 1
+    else: return 0
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
diff --git a/PackDist/scripts/pack-proj.sh b/PackDist/scripts/pack-proj.sh
new file mode 100755
index 00000000000..74d10ad8909
--- /dev/null
+++ b/PackDist/scripts/pack-proj.sh
@@ -0,0 +1,1606 @@
+#!/bin/bash
+# File: pack-proj.sh
+#
+# Pack project in five parts:
+#                             binary platform - corresponds to CMTCONFIG value
+#                             debuginfo files (for not debug build)
+#                             source code
+#                             documentation files
+#                             other architecture independent files
+#
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>.
+#
+
+[ "$PACKPROJDEBUG" ] && set -x
+
+: ${projbase:?}
+: ${project:?} ${release:?}
+#: ${platform:?}
+: ${projcache:?} # ${upgrade:?} #${patchdir:?} ${overwrite:?}
+
+: ${scriptdir:?}
+. $scriptdir/pack-common.sh
+
+: ${cmthome:?}
+: ${cmtcache:?}
+
+# : ${requires:?}
+#[ -f "$requires" ] || requires=$(mktemp) || return 1
+
+: ${externcache:?} ${patchdir:?} ${overwrite:?}
+
+: ${CMTCONFIG:?}
+
+##################################### functions #####################################
+_mktmpdir ()
+{
+#
+# Make temporary directory, set 'tmpdir' and,
+# if possible, the TMPDIR environment variable to it
+#
+# (the latter allows to call mktemp(1) with specifying no template
+# and have all temporary files rooted in 'tmpdir')
+#
+# Parameters: ['directory' in which to place the temporary directory]
+#
+
+#: ${builddir:?}
+#[ -d "$builddir" ] || builddir=$(mktemp -d) || return 1
+if [ -d "${1}" ]; then
+    tmpdir=$(mktemp -d ${1}/pack.$$.XXXXXXXXXX) || return 1
+else # make temp dir in TMPDIR, if set, or in /tmp
+    tmpdir=$(mktemp -dt pack.$$.XXXXXXXXXX) || return 1
+fi
+
+#trap 'rm -rf $tmpdir; exit 1' 1 2 15
+trap 'rm -rf $tmpdir; exit 1' 2 15
+
+# want all temp files in 'tmpdir'
+export TMPDIR=$tmpdir ||
+warn "Temporary directory may not be cleaned up on completion: $TMPDIR" $FUNCNAME
+tmppatch=$tmpdir/patch
+mkdir $tmppatch || { error "mkdir" $FUNCNAME; return 1; }
+if [ -n "${PACKRPM:-}" ]; then
+    builddir=$tmpdir/BUILD
+    mkdir ${builddir} || { error "mkdir" $FUNCNAME; return 1; }
+    export builddir || { error "export" $FUNCNAME; return 1; }
+    buildrootdir=$tmpdir/BUILDROOT
+    mkdir ${buildrootdir} || { error "mkdir" $FUNCNAME; return 1; }
+    export buildrootdir || { error "export" $FUNCNAME; return 1; }
+    if [ -z "${specdir+T}" ]; then # specdir is unset
+	specdir=$tmpdir/SPECS
+	mkdir ${specdir} || { error "mkdir" $FUNCNAME; return 1; }
+	export specdir || { error "export" $FUNCNAME; return 1; }
+    fi
+fi
+}
+
+_mkname ()
+{
+#
+# Parameters: 'project' 'release' 'platform'
+#                                 (bin src doc noarch debuginfo)
+#
+if [ $3 == bin ]; then
+    sed 's/[-.]/_/g' <<<${1}_${2}_${CMTCONFIG} || { error "sed" $FUNCNAME; return 1; }
+elif [ $3 == debuginfo ]; then
+    sed 's/[-.]/_/g' <<<${1}_${2}_${CMTCONFIG}_debuginfo || { error "sed" $FUNCNAME; return 1; }
+else
+    sed 's/[-.]/_/g' <<<${1}_${2}_${3} || { error "sed" $FUNCNAME; return 1; }
+fi
+}
+
+_mkver ()
+{
+#
+# Make package version and print on the standard output
+#
+# Parameters: ['version']
+#
+local ver
+
+ver=$(awk '
+{ n=split($0, a, /[-vrp.]/)
+for (i=1; i<=n; i++) {
+  if (a[i] ~ /[[:digit:]]+/)
+    if (v != "") v=v"."a[i]
+    else v=a[i]
+}
+print v }
+' <<<"$1")
+echo ${ver:-0}
+}
+
+_getver ()
+{
+#
+# Determine package version and print on the standard output
+# (empty if cannot be determined )
+#
+# Parameters: 'name'
+#
+local fpath
+
+fpath=${projcache}/cache/${1}.pacman
+
+#[ -f $fpath ] || { echo 0; return; }
+[ -f $fpath ] || return 0
+sed -e '/^[ \t]*version(.*)[ \t]*$/!d' -e 's/version(//' -e 's/)[ \t]*$//' -e "s/['\"]//g" $fpath || { error "sed" $FUNCNAME; return 1; }
+# [ "$_ver" ] && { echo $_ver; return; }
+# echo 0
+}
+
+_mkcntnr ()
+{
+#
+# Parameters: 'project'
+# Print on the standard output: 'container' (container-name [access-path])
+#
+[ $# -eq 1 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+case $1 in
+    LCGCMT) echo LCG_Release ;;
+    Gaudi) echo Gaudi ;;
+    Atlas?*) echo ${1}Release ;;
+    tdaq-common) echo TDAQCRelease ;;
+    dqm-common) echo DQMCRelease ;;
+    *) error "Unknown project: $1" $FUNCNAME; return 1 ;;
+esac
+}
+
+_getcntnr ()
+{
+#
+# Parameters: 'project-release-directory' 'project' 'release'
+# Print on the standard output: 'container' (container-name [access-path])
+#
+[ $# -eq 3 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+local -a cntnr
+if [ -f $1/cmt/project.cmt ]; then
+# determine which package is container
+cntnr=($(awk '$1 == "container" && $2 ~ /./ { print $2, $4; exit }' $1/cmt/project.cmt))
+case ${#cntnr[*]} in
+    0) warn "No container specification: $1/cmt/project.cmt" $FUNCNAME; return 1 ;;
+    1) : ;;
+    2) cntnr[1]=$(sed 's#/*$#/#' <<<${cntnr[1]}) ;;
+    *) error "Invalid container specification: ${cntnr[*]}: $1/cmt/project.cmt" $FUNCNAME
+	return 1 ;;
+esac
+echo ${cntnr[*]}
+# case ${#cntnr[*]} in
+#     0) warn "Cannot determine container package of $2 $3 ($1)" $FUNCNAME
+# 	cntnr=($(_mkcntnr $2)) || return 1 ;;
+#     1) : ;;
+# #    1) cntnr[1]=. ;;
+#     2) cntnr[1]=$(sed 's#/*$#/#' <<<${cntnr[1]}) ;;
+#     *) error "Wrong container package specification for $2 $3 ($1): ${cntnr[*]}" $FUNCNAME
+# 	return 1 ;;
+# esac
+local proj=$(awk '$1 == "project" && $2 ~ /./ { print $2; exit }' $1/cmt/project.cmt)
+[ "$proj" ] || warn "No project specification: $1/cmt/project.cmt" $FUNCNAME
+else
+    error "$1/cmt/project.cmt: No such file" $FUNCNAME; return 1
+fi
+}
+
+_gen_expr ()
+{
+#
+# Parameters: 'patterns-file'...
+# Print on the standard output `find' expression which is true for any pathname matching
+# any of the patterns in 'patterns-file'...
+#
+[ $# -ge 1 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+awk '
+BEGIN { expr = " (" }
+{ if (NR != 1) expr = expr " -o"
+  if (substr($1, 1, 1) != "*") expr = expr " -path */"$1
+  else expr = expr " -path "$1
+}
+END { print expr " )" }
+' "$@" || { error "awk" $FUNCNAME; return 1; }
+}
+
+_prep_lists ()
+{
+#
+# Parameters: 'project-release-directory' 'project' 'release'
+#                                    'bin-file' 'src-file' 'doc-file' 'noarch-file' 
+#                                    'dirs-file' 'debuginfo-file'
+#
+[ $# -eq 9 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+
+if [ ${uname} = Linux ]; then
+
+local tmppltfms=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+cp $scriptdir/platforms $tmppltfms || { error "cp" $FUNCNAME; return 1; }
+sed '\%^'${CMTCONFIG}'$%d' ${tmppltfms} >${tmppltfms}.tmp ||
+{ error "sed" $FUNCNAME; return 1; }
+mv -f ${tmppltfms}.tmp ${tmppltfms} || { error "mv" $FUNCNAME; return 1; }
+#sed -i '\%^'${CMTCONFIG}'$%d' ${tmppltfms} || { error "sed" $FUNCNAME; return 1; }
+
+local opts=-noleaf
+local _expr
+
+# platforms to skip - all but ${CMTCONFIG}
+_expr="$opts $(
+awk '
+BEGIN { expr = "(" }
+{ if (NR != 1) expr = expr " -o"
+  expr = expr " -name "$1
+}
+END { print expr " ) -prune" }
+' $tmppltfms
+)" || { error "awk" $FUNCNAME; return 1; }
+
+# platform to pack - ${CMTCONFIG}
+_expr="$_expr -o -name $CMTCONFIG -prune -fprint $4"
+
+# exclude junk (print nothing)
+_expr="$_expr -o $(_gen_expr $scriptdir/junk.ptn)" || return 1
+
+# source code
+_expr="$_expr -o ! -type d $(_gen_expr $scriptdir/src.ptn) -fprint $5" || return 1
+
+# documentation files
+_expr="$_expr -o ! -type d $(_gen_expr $scriptdir/doc.ptn) -fprint $6" || return 1
+
+# anything else - noarch files and ALL directories
+_expr="$_expr -o ! -type d -fprint $7 -o -fprint $8"
+# anything else - after a cleanup - noarch files
+#_expr="$_expr -o ( ! -type d -o -empty ) -fprint $7"
+
+fi # end Linux
+
+cd $(dirname $(dirname $1)) || { error "cd" $FUNCNAME; return 1; }
+
+local projdir
+if [ $2 == AtlasRelease ]; then
+#    projdir=dist
+    projdir=$(basename $(dirname $1))
+else
+    projdir=$2
+fi
+
+if [ ${uname} = Linux ]; then
+
+set -f
+    find ${projdir}/$3/ $_expr || { error "find" $FUNCNAME; return 1; }
+set +f
+
+else
+
+$scriptdir/pack-find.py --bin-file=$4 --src-file=$5 --doc-file=$6 --noarch-file=$7 --dirs-file=$8 ${projdir}/$3/ || return 1
+
+fi # end Linux
+
+if [ -n "${debuginfosuffix:-}" ] && [ "${mode:-}" != dbg ]; then
+    if [ -s $4 ]; then
+        xargs sh -c 'find "$@" -name "*$debuginfosuffix"' find <$4 >>$9
+        #xargs -I % find % -name "*$debuginfosuffix" <$4 >>$9
+        case $? in
+            123|124) error "find" $FUNCNAME; return 1 ;;
+            125|126|127|1) error "xargs" $FUNCNAME; return 1 ;;
+	esac
+    fi
+fi
+
+cd $OLDPWD || { error "cd" $FUNCNAME; return 1; }
+
+[ -s $4 ] || warn "No binaries: $1 $2 $3" $FUNCNAME
+[ -s $5 ] || warn "No source code: $1 $2 $3" $FUNCNAME
+[ -s $6 ] || warn "No documentation: $1 $2 $3" $FUNCNAME
+[ -s $7 ] || warn "No noarch: $1 $2 $3" $FUNCNAME
+[ -s $8 ] || warn "No directories: $1 $2 $3" $FUNCNAME
+if [ "${debuginfo:-}" = yes ] && [ "${mode:-}" != dbg ]; then
+    [ -s $9 ] || warn "No debuginfo: $1 $2 $3" $FUNCNAME
+fi
+
+if [ "$PACKPROJDEBUG" ]; then
+    echo "binaries:" >&2
+    cat $4 >&2
+    echo "source code:" >&2
+    cat $5 >&2
+    echo "documentation:" >&2
+    cat $6 >&2
+    echo "noarch:" >&2
+    cat $7 >&2
+    echo "directories:" >&2
+    cat $8 >&2
+    echo "debuginfo:" >&2
+    cat $9 >&2
+fi
+
+rm -f $tmppltfms || return 0
+}
+
+_prep_lists_ ()
+{
+#
+# Parameters: 'project-release-directory' 'project' 'release'
+#                                    'bin-file' 'src-file' 'doc-file' 'noarch-file' 
+#                                    'dirs-file'
+#
+[ $# -eq 8 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+
+local tmppltfms=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+cp $scriptdir/platforms $tmppltfms || { error "cp" $FUNCNAME; return 1; }
+sed -i '\%^'${CMTCONFIG}'$%d' ${tmppltfms} || { error "sed" $FUNCNAME; return 1; }
+
+local opts=-noleaf
+local _expr
+
+# platforms to skip - all but ${CMTCONFIG}
+_expr="$opts $(
+awk '
+BEGIN { expr = "(" }
+{ if (NR != 1) expr = expr " -o"
+  expr = expr " -name "$1
+}
+END { print expr " ) -prune" }
+' $tmppltfms
+)"
+
+# platform to pack - ${CMTCONFIG}
+_expr="$_expr -o -name $CMTCONFIG -prune -fprint $4"
+
+# exclude junk
+_expr="$_expr -o $(
+awk '
+BEGIN { expr = " (" }
+{ if (NR != 1) expr = expr " -o"
+  if (substr($1, 1, 1) != "*") expr = expr " -path */"$1
+  else expr = expr " -path "$1
+}
+END { print expr " )" }
+' $scriptdir/junk.ptn
+)"
+# print nothing
+
+# source code
+_expr="$_expr -o $(
+awk '
+BEGIN { expr = "! -type d (" }
+{ if (NR != 1) expr = expr " -o"
+  if (substr($1, 1, 1) != "*") expr = expr " -path */"$1
+  else expr = expr " -path "$1
+}
+END { print expr " )" }
+' $scriptdir/src.ptn
+)"
+_expr="$_expr -fprint $5"
+#_expr="$_expr -fprint $5 -fprintf $8 %h\n" # file's directory
+
+# documentation files
+_expr="$_expr -o $(
+awk '
+BEGIN { expr = "! -type d (" }
+{ if (NR != 1) expr = expr " -o"
+  if (substr($1, 1, 1) != "*") expr = expr " -path */"$1
+  else expr = expr " -path "$1
+}
+END { print expr " )" }
+' $scriptdir/doc.ptn
+)"
+_expr="$_expr -fprint $6"
+
+# anything else - after a cleanup - noarch files and ALL directories
+_expr="$_expr -o ! -type d -fprint $7 -o -fprint $8"
+# anything else - after a cleanup - noarch files
+#_expr="$_expr -o ( ! -type d -o -empty ) -fprint $7"
+
+cd $1/../.. || { error "cd" $FUNCNAME; return 1; }
+set -f
+if [ $2 == AtlasRelease ]; then
+#    find dist/$3 $_expr || return 1
+    find $(basename $(dirname $1))/$3 $_expr || { error "find" $FUNCNAME; return 1; }
+else
+    find $2/$3 $_expr || { error "find" $FUNCNAME; return 1; }
+fi
+set +f
+cd $OLDPWD || { error "cd" $FUNCNAME; return 1; }
+
+[ -s $5 ] || warn "No source code: $1 $2 $3" $FUNCNAME
+[ -s $6 ] || warn "No documentation: $1 $2 $3" $FUNCNAME
+
+[ "$PACKPROJDEBUG" ] && cat $8 >&2
+
+rm -f $tmppltfms || return 0
+}
+
+_clean ()
+{
+#
+# Parameters: 'project-release-directory' 'project' 'release'
+#
+[ $# -eq 3 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+local projdir
+
+if [ $2 == AtlasRelease ]; then
+#    projdir=dist
+    projdir=$(basename $(dirname $1))
+else
+    projdir=$2
+fi
+
+rm -rf $tmpdir/${projdir}/$3 || { error "rm" $FUNCNAME; return 1; }
+}
+
+_copy ()
+{
+#
+# Usage: _copy [OPTION]... 'project-release-directory' 'project' 'release' 'names-file'...
+#
+#  -n   do not recursively descend directories
+#  -r   recursively descend directories (the default)
+#  -x PATTERN   exclude files that match PATTERN
+#  -X FILE   exclude files that match any pattern in FILE
+#
+local opts exclude exclude_from
+OPTIND=1
+while getopts "nrx:X:" opt; do
+    case $opt in
+	n) opts=--no-recursion ;;
+	r) opts=--recursion ;;
+	x) exclude="${OPTARG}" ;;
+	X) exclude_from="${OPTARG}" ;;
+	\?) error "Invalid option: -${OPTARG}" $FUNCNAME; return 1 ;;
+	:) error "Argument required for option: -${OPTARG}" $FUNCNAME; return 1 ;;
+    esac
+done
+
+shift $(($OPTIND - 1))
+[ $# -ge 4 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+
+cd $(dirname $(dirname $1)) || { error "cd" $FUNCNAME; return 1; }
+shift 3
+
+#local tmperr=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+
+local list sc
+for list; do
+[ -s $list ] || continue
+
+# want to check exit status of the first tar in the pipe
+exec 3>&1 || { error "exec" $FUNCNAME; return 1; }
+sc=`((tar ${tar_basic_opts} ${opts} -cf - \
+      -X $scriptdir/pltfm-junk.ptn \
+      -X $scriptdir/extern-junk.ptn \
+      ${exclude_from:+-X "${exclude_from}"} \
+      ${exclude:+--exclude="${exclude}"} \
+      -T $list 3>&- 4>&-; echo $? >&4) | \
+      tar ${opts} -C $tmpdir -xf - >&3 3>&- 4>&-) 4>&1 >&-` ||
+{ warn "Disk space on the filesystem of $tmpdir:
+$(cat $list|duf -p $tmpdir)" $FUNCNAME
+exec 3>&-
+error "tar" $FUNCNAME; return 1; }
+exec 3>&-
+[ $sc -eq 0 ] || { error "tar" $FUNCNAME; return 1; }
+
+# BSDTAR issues on stderr
+# tar: getpwuid(XXXXX) failed: No such file or directory
+# if no matching entry for user uid XXXXX is found in password database
+# GNUTAR does NOT
+done
+
+#rm -f $tmperr
+cd $OLDPWD || { error "cd" $FUNCNAME; return 1; }
+}
+
+_copy_ ()
+{
+#
+# Parameters: 'project-release-directory' 'project' 'release' 'names-file'
+#
+[ $# -eq 4 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+
+if [ $2 == AtlasRelease ]; then
+#    rm -rf $tmpdir/dist/$3 || return 1
+    rm -rf $tmpdir/$(basename $(dirname $1))/$3 || return 1
+else
+    rm -rf $tmpdir/$2/$3 || return 1
+fi
+
+cd $1/../.. || { error "cd" $FUNCNAME; return 1; }
+
+local tmperr=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+tar ${tar_basic_opts} -cf - -X $scriptdir/junk.ptn -X $scriptdir/pltfm-junk.ptn \
+    -T $4 2>|$tmperr | (cd $tmpdir; tar -xf -) || {
+
+warn "Disk space on the filesystem of $tmpdir:
+$(cat $4|duf -p $tmpdir)" $FUNCNAME
+
+error "tar" $FUNCNAME; return 1; }
+    
+# cannot check exit status
+[ -s $tmperr ] && { error "\n$(<$tmperr)" $FUNCNAME; return 1; }
+
+rm -f $tmperr
+cd $OLDPWD || { error "cd" $FUNCNAME; return 1; }
+}
+
+_install_dirs ()
+{
+#
+# Parameters: ['directories-file'...]
+#
+cd $tmpdir || { error "cd" $FUNCNAME; return 1; }
+local list
+for list; do
+    [ -s $list ] || continue
+    xargs install -d <$list
+#     xargs mkdir -p <$list
+    case $? in
+	123|124) error "install" $FUNCNAME; return 1 ;;
+# 	123|124) error "mkdir" $FUNCNAME; return 1 ;;
+	125|126|127|1) error "xargs" $FUNCNAME; return 1 ;;
+    esac
+done
+cd $OLDPWD || { error "cd" $FUNCNAME; return 1; }
+}
+
+_symlinks ()
+{
+#
+# Parameters: 'project-release-directory' 'project' 'release' ['exps-file']
+#
+[ $# -eq 3 -o $# -eq 4 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+#[ $# -eq 3 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+local tmperr=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+local projdir
+
+if [ $2 == AtlasRelease ]; then
+#    projdir=dist
+    projdir=$(basename $(dirname $1))
+else
+    projdir=$2
+fi
+
+[ -d $tmpdir/${projdir}/$3 ] || return 0
+
+$scriptdir/relink.py -S $1 -H ${projdir}/$3 ${4:+-X ${4}} $tmpdir/${projdir}/$3 >/dev/null 2>|$tmperr
+#projsrc=$1 projhat=${projdir}/$3 $scriptdir/relink.py $tmpdir/${projdir}/$3 ${4:-} >/dev/null 2>|$tmperr
+#projsrc=$1 projhat=${projdir}/$3 $scriptdir/relink.py $tmpdir/${projdir}/$3 >/dev/null 2>|$tmperr
+#projsrc=$1 projdst=${projdir}/$3 $scriptdir/relink.py $tmpdir/${projdir}/$3 >/dev/null 2>|$tmperr
+[ -s $tmperr ] && warn "\n$(<$tmperr)" $FUNCNAME
+
+if [ -z "${4:-}" ]; then
+# check symlinks left
+symlinks -r $tmpdir/${projdir}/$3 | grep '^absolute\|^other_fs\|^dangling\|^messy' >|$tmperr
+
+# check exit status instead?
+[ -s $tmperr ] && warn "Suspicious symlinks left:\n$(<$tmperr)" $FUNCNAME
+fi
+
+rm -f $tmperr || return 0
+}
+
+_tar ()
+{
+#
+# Parameters: 'project' 'release' 'name'
+#
+[ $# -eq 3 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+#cd $tmpdir || { error "cd" $FUNCNAME; return 1; }
+local reldir
+
+if [ $1 == AtlasRelease ]; then
+#    reldir=dist/$2
+    reldir=$(basename ${projbase})/$2
+else
+    reldir=$1/$2
+fi
+
+local fpath=${projcache}/kits/${3}.tar.gz
+
+rm -f ${fpath} || { error "rm" $FUNCNAME; return 1; }
+
+[ -d $tmpdir/$reldir ] ||
+{ info "Nothing to include: $fpath" $FUNCNAME; return 0; }
+# { install -d $reldir && info "Created directory '$reldir'" $FUNCNAME; } ||
+# { error "install" $FUNCNAME; return 1; }
+
+info "Writing $fpath" $FUNCNAME
+
+#    -z -v --remove-files \
+
+tar ${tar_basic_opts} -C $tmpdir -cf $fpath \
+    -z -v \
+    $reldir >&2 ||
+{ warn "Disk space on the filesystem of `dirname $fpath`:
+$(duf -p `dirname $fpath` $tmpdir/$reldir)" $FUNCNAME
+rm -f $fpath
+error "tar" $FUNCNAME; return 1; }
+
+#cd $OLDPWD
+rm -rf $tmpdir/$reldir || return 0
+}
+
+_patch ()
+{
+#
+# Parameters: 'project' 'release' 'name'
+#
+[ $# -eq 3 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+local reldir=$1/$2
+[ -d "$tmppatch/$reldir" ] || return 0
+
+local tmplist=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+
+cd $tmppatch || { error "cd" $FUNCNAME; return 1; }
+#find $reldir -noleaf -type f -fprint $tmplist ||
+find $reldir ${noleaf:+-noleaf} -type f >>$tmplist ||
+{ error "find" $FUNCNAME; cd $OLDPWD; return 1; }
+cd $OLDPWD
+
+local fpath=${projcache}/kits/${3}.tar
+
+gunzip -t ${fpath}.gz || { error "gunzip" $FUNCNAME; return 1; }
+gunzip -f ${fpath}.gz || { error "gunzip" $FUNCNAME; return 1; }
+
+info "Appending to ${fpath}.gz" $FUNCNAME
+
+#tar -v ${tar_basic_opts} -rf $fpath -C $tmppatch $reldir >&2 ||
+tar -v ${tar_basic_opts} -rf $fpath -C $tmppatch -T $tmplist >&2 ||
+{ rm -rf $fpath; error "tar" $FUNCNAME; return 1; }
+rm -f $tmplist
+gzip -f ${fpath} || { error "gzip" $FUNCNAME; return 1; }
+}
+
+_settings ()
+{
+#
+# Pack AtlasSettings, AtlasLogin packages
+# Pack AtlasSetup package
+# Print on the standard output information on them (format: 'name' 'package' 'version')
+#
+local tmppre=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+local name fpath curver nver
+local -a pkg
+
+cd ${cmthome} || { error "cd" $FUNCNAME; return 1; }
+cmt show uses | awk '
+$1 == "use" && $2 ~ /Atlas(Settings|Login)/ { gsub(/[()]/, "", $4); print $2, $3, $4}
+' |
+while read -a pkg; do
+    #name=$(sed "s/${pkg[0]}-${pkg[0]}/${pkg[0]}/" <<<${pkg[0]}-${pkg[1]})
+    name=${pkg[0]}
+
+#    echo $name ${pkg[0]} ${pkg[1]}
+
+    fpath=${projcache}/kits/$name.tar.gz
+    curver=$(_mkver ${pkg[1]})
+    if [ ${curver} == "$(_getver $name)" ]; then
+	if [ -f ${fpath} ]; then
+	    info "Existing ${fpath} will not be overwritten" $FUNCNAME
+	else
+	    error "${fpath}: No such file" $FUNCNAME
+	fi
+    elif [ -f ${fpath} -a -f ${projcache}/cache/$name.pacman -a "${keep}" == yes ]; then
+	warn "Keeping ${fpath} ($(_getver $name)) while using different version: ${pkg[0]} ${pkg[1]} ${pkg[2]}" $FUNCNAME
+	nver=$(tar -ztf ${fpath}|sed -n 's!^'${pkg[0]}'/\([^/]\+\)/*$!\1!p') ||
+	{ error "sed" $FUNCNAME; }
+	if [ "$nver" ]; then
+	    pkg[1]=$nver
+	else
+	    error "Cannot determine native version: ${fpath}" $FUNCNAME
+	fi
+    else
+	info "Writing ${fpath}" $FUNCNAME
+
+	tar -v ${tar_basic_opts} -cf ${fpath} -z \
+	    -X $scriptdir/junk.ptn \
+	    -C ${pkg[2]} ${pkg[0]}/${pkg[1]} 1>&2 ||
+	{ rm -f ${fpath}; error "tar" $FUNCNAME; }
+	_pre ${pkg[2]}/${pkg[0]}/${pkg[1]} ${pkg[0]} ${pkg[1]} >|${tmppre}
+	_pacman $name "" "" ${tmppre} ${curver}
+    fi
+
+    echo $name ${pkg[0]} ${pkg[1]}
+
+    [ ! -f $PACKRPM/bin/pack-rpm-settings.sh ] || . $PACKRPM/bin/pack-rpm-settings.sh
+
+done # || return 1
+cd $OLDPWD
+
+if [ -d "${setuproot:-}" ]; then
+    cd ${setuproot}/cmt || { error "cd" $FUNCNAME; return 1; }
+    pkg[0]=$(basename ${setuproot})
+    #pkg[0]=$(cmt show macro_value package)
+    pkg[1]=$(cmt show macro_value version)
+    pkg[2]=$(dirname ${setuproot})
+
+    name=${pkg[0]}
+
+    fpath=${projcache}/kits/$name.tar.gz
+    curver=$(_mkver ${pkg[1]})
+    if [ ${curver} == "$(_getver $name)" ]; then
+	if [ -f ${fpath} ]; then
+	    info "Existing ${fpath} will not be overwritten" $FUNCNAME
+	else
+	    error "${fpath}: No such file" $FUNCNAME
+	fi
+    elif [ -f ${fpath} -a -f ${projcache}/cache/$name.pacman -a "${keep}" == yes ]; then
+	warn "Keeping ${fpath} ($(_getver $name)) while using different version: ${pkg[0]} ${pkg[1]} ${pkg[2]}" $FUNCNAME
+        # determine native version in the tarball
+        nver=$(tar -O -zxf ${fpath} ${pkg[0]}/cmt/version.cmt) ||
+        { error "tar" $FUNCNAME; }
+        if [ "$nver" ]; then
+            pkg[1]=$nver
+        else
+            error "Cannot determine native version: ${fpath}" $FUNCNAME
+        fi
+    else
+	info "Writing ${fpath}" $FUNCNAME
+
+	tar -v ${tar_basic_opts} -cf ${fpath} -z \
+	    -X $scriptdir/junk.ptn \
+	    -C ${pkg[2]} ${pkg[0]} 1>&2 ||
+	{ rm -f ${fpath}; error "tar" $FUNCNAME; }
+	_pre ${pkg[2]}/${pkg[0]} ${pkg[0]} ${pkg[1]} >|${tmppre}
+	_pacman $name "" "" ${tmppre} ${curver}
+    fi
+
+    echo $name ${pkg[0]} ${pkg[1]}
+
+    [ ! -f $PACKRPM/bin/pack-rpm-settings.sh ] || . $PACKRPM/bin/pack-rpm-settings.sh
+
+    cd $OLDPWD
+fi
+
+rm -f $tmppre || return 0
+}
+
+_pre ()
+{
+#
+# Print on the standard output pre-install script
+#
+# Parameters: 'project-release-directory' 'project'|'package' 'release'|'version'
+#
+if [ $2 == AtlasSettings ]; then
+awk '
+BEGIN { printf "mkdir -p @INSTALL_PREFIX@/.cmtsite; if [ -f @INSTALL_PREFIX@/.cmtsite/requirements ]; then mv -f @INSTALL_PREFIX@/.cmtsite/requirements @INSTALL_PREFIX@/.cmtsite/requirements.orig; cmtconfig_=`awk \"/^macro cmtconfig_default/{print \\\\\\$3}\" @INSTALL_PREFIX@/.cmtsite/requirements.orig`; fi; printf \""}
+{ gsub(/\$/,"\\$"); printf "%s\\n", $0 }
+END { printf "\" >@INSTALL_PREFIX@/.cmtsite/requirements; if [ \"${cmtconfig_:-}\" ]; then sed \"s/^macro cmtconfig_default.*/macro cmtconfig_default ${cmtconfig_}/g\" @INSTALL_PREFIX@/.cmtsite/requirements >@INSTALL_PREFIX@/.cmtsite/requirements.$$ && mv -f @INSTALL_PREFIX@/.cmtsite/requirements.$$ @INSTALL_PREFIX@/.cmtsite/requirements; fi" }
+' $scriptdir/basic-requirements.template
+
+[ $? -eq 0 ] || { error "awk" $FUNCNAME; return 1; }
+
+elif [ $2 == AtlasLogin ]; then
+awk '
+BEGIN { printf "mkdir -p @INSTALL_PREFIX@/cmtsite; if [ -f @INSTALL_PREFIX@/cmtsite/requirements ]; then mv -f @INSTALL_PREFIX@/cmtsite/requirements @INSTALL_PREFIX@/cmtsite/requirements.orig; cmtconfig_=`awk \"/^macro cmtconfig_default/{print \\\\\\$3}\" @INSTALL_PREFIX@/cmtsite/requirements.orig`; fi; printf \""}
+FILENAME == "'$scriptdir/requirements.template'" { gsub(/\$/,"\\$"); if (NR != 1) printf "\\n%s", $0; else printf "%s", $0 }
+FILENAME == "'$scriptdir/platforms'" { printf "\\t%s %s", $1, $1 }
+END { printf "\\n\" >@INSTALL_PREFIX@/cmtsite/requirements; if [ \"${cmtconfig_:-}\" ]; then sed \"s/^macro cmtconfig_default.*/macro cmtconfig_default ${cmtconfig_}/g\" @INSTALL_PREFIX@/cmtsite/requirements >@INSTALL_PREFIX@/cmtsite/requirements.$$ && mv -f @INSTALL_PREFIX@/cmtsite/requirements.$$ @INSTALL_PREFIX@/cmtsite/requirements; fi" }
+' $scriptdir/requirements.template $scriptdir/platforms
+
+[ $? -eq 0 ] || { error "awk" $FUNCNAME; return 1; }
+
+elif [ $2 == AtlasSetup ]; then
+cat <<\EOF
+mkdir -p @INSTALL_PREFIX@/cmtsite; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.sh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.sh @INSTALL_PREFIX@/cmtsite/asetup.sh.orig; fi; printf "export AtlasSetup=@INSTALL_PREFIX@/AtlasSetup\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh \$*\nalias asetup=\'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.sh; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.csh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.csh @INSTALL_PREFIX@/cmtsite/asetup.csh.orig; fi; printf "setenv AtlasSetup @INSTALL_PREFIX@/AtlasSetup\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh \$*\nalias asetup \'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.csh; asetup_defaults="standalone = True\nreleasesarea = @INSTALL_PREFIX@ `dirname @INSTALL_PREFIX@` $(dirname $(dirname @INSTALL_PREFIX@))/\${CMTCONFIG}\n"; if [ ! -f @INSTALL_PREFIX@/cmtsite/asetup_defaults ]; then  printf "${asetup_defaults}" >@INSTALL_PREFIX@/cmtsite/asetup_defaults; elif ! printf "${asetup_defaults}" | cmp -s @INSTALL_PREFIX@/cmtsite/asetup_defaults -; then printf "${asetup_defaults}" >@INSTALL_PREFIX@/cmtsite/asetup_defaults.new; fi
+EOF
+
+#mkdir -p @INSTALL_PREFIX@/cmtsite; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.sh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.sh @INSTALL_PREFIX@/cmtsite/asetup.sh.orig; fi; printf "export AtlasSetup=@INSTALL_PREFIX@/AtlasSetup\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh \$*\nalias asetup=\'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.sh; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.csh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.csh @INSTALL_PREFIX@/cmtsite/asetup.csh.orig; fi; printf "setenv AtlasSetup @INSTALL_PREFIX@/AtlasSetup\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh \$*\nalias asetup \'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.csh; asetup_defaults="standalone = True\nreleasesarea = @INSTALL_PREFIX@ `dirname @INSTALL_PREFIX@`\n"; if [ ! -f @INSTALL_PREFIX@/cmtsite/asetup_defaults ]; then  printf "${asetup_defaults}" >@INSTALL_PREFIX@/cmtsite/asetup_defaults; elif ! printf "${asetup_defaults}" | cmp -s @INSTALL_PREFIX@/cmtsite/asetup_defaults -; then printf "${asetup_defaults}" >@INSTALL_PREFIX@/cmtsite/asetup_defaults.new; fi
+
+#mkdir -p @INSTALL_PREFIX@/cmtsite; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.sh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.sh @INSTALL_PREFIX@/cmtsite/asetup.sh.orig; fi; printf "export AtlasSetup=@INSTALL_PREFIX@/AtlasSetup\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh \$*\nalias asetup=\'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.sh; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.csh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.csh @INSTALL_PREFIX@/cmtsite/asetup.csh.orig; fi; printf "setenv AtlasSetup @INSTALL_PREFIX@/AtlasSetup\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh \$*\nalias asetup \'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.csh; if [ -f @INSTALL_PREFIX@/cmtsite/asetup_defaults ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup_defaults @INSTALL_PREFIX@/cmtsite/asetup_defaults.orig; fi; printf "standalone = True\nreleasesarea = @INSTALL_PREFIX@ `dirname @INSTALL_PREFIX@`\n" >@INSTALL_PREFIX@/cmtsite/asetup_defaults
+
+#mkdir -p @INSTALL_PREFIX@/cmtsite; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.sh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.sh @INSTALL_PREFIX@/cmtsite/asetup.sh.orig; fi; printf "export AtlasSetup=@INSTALL_PREFIX@/AtlasSetup\nif [ -z \\\"\${AtlasSetupSite:-}\\\" ]; then\n  export AtlasSetupSite=@INSTALL_PREFIX@/cmtsite/defaults\nfi\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh --releasesarea=@INSTALL_PREFIX@ standalone \$*\nalias asetup=\'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh --releasesarea=@INSTALL_PREFIX@ standalone\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.sh; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.csh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.csh @INSTALL_PREFIX@/cmtsite/asetup.csh.orig; fi; printf "setenv AtlasSetup @INSTALL_PREFIX@/AtlasSetup\nif ( \$?AtlasSetupSite == 0 ) then\n  setenv AtlasSetupSite @INSTALL_PREFIX@/cmtsite/defaults\nendif\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh --releasesarea=@INSTALL_PREFIX@ standalone \$*\nalias asetup \'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh --releasesarea=@INSTALL_PREFIX@ standalone\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.csh; if [ -f @INSTALL_PREFIX@/cmtsite/defaults ]; then mv -f @INSTALL_PREFIX@/cmtsite/defaults @INSTALL_PREFIX@/cmtsite/defaults.orig; fi; printf "releasesarea = `dirname @INSTALL_PREFIX@`\n" >@INSTALL_PREFIX@/cmtsite/defaults
+
+#mkdir -p @INSTALL_PREFIX@/cmtsite; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.sh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.sh @INSTALL_PREFIX@/cmtsite/asetup.sh.orig; fi; printf "export AtlasSetup=@INSTALL_PREFIX@/AtlasSetup\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh --input=@INSTALL_PREFIX@/cmtsite/defaults \$*\nalias asetup=\'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.sh --input=@INSTALL_PREFIX@/cmtsite/defaults\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.sh; if [ -f @INSTALL_PREFIX@/cmtsite/asetup.csh ]; then mv -f @INSTALL_PREFIX@/cmtsite/asetup.csh @INSTALL_PREFIX@/cmtsite/asetup.csh.orig; fi; printf "setenv AtlasSetup @INSTALL_PREFIX@/AtlasSetup\nsource @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh --input=@INSTALL_PREFIX@/cmtsite/defaults \$*\nalias asetup \'source @INSTALL_PREFIX@/AtlasSetup/scripts/asetup.csh --input=@INSTALL_PREFIX@/cmtsite/defaults\'\n" >@INSTALL_PREFIX@/cmtsite/asetup.csh; if [ -f @INSTALL_PREFIX@/cmtsite/defaults ]; then mv -f @INSTALL_PREFIX@/cmtsite/defaults @INSTALL_PREFIX@/cmtsite/defaults.orig; fi; printf "standalone = True\nreleasesarea = @INSTALL_PREFIX@ `dirname @INSTALL_PREFIX@`\n" >@INSTALL_PREFIX@/cmtsite/defaults
+[ $? -eq 0 ] || { error "cat" $FUNCNAME; return 1; }
+
+#awk '
+#BEGIN { printf "; printf \""}
+#{ printf "\\t%s \\\"%s\\\"", $1, $1 }
+#END { printf "\" >>@INSTALL_PREFIX@/cmtsite/requirements" }
+#' $scriptdir/platforms
+# awk '
+# BEGIN { printf "PATH=/bin:/usr/bin; mkdir -p @INSTALL_PREFIX@/cmtsite; if [ -f @INSTALL_PREFIX@/cmtsite/requirements ]; then mv -f @INSTALL_PREFIX@/cmtsite/requirements @INSTALL_PREFIX@/cmtsite/requirements.orig; cmtconfig_=`awk \"/^set CMTCONFIG/{print \\$3}\" @INSTALL_PREFIX@/cmtsite/requirements.orig`; fi; printf \""}
+# { gsub(/\$/,"\\$"); printf "%s\\n", $0 }
+# END { printf "\" >@INSTALL_PREFIX@/cmtsite/requirements; if [ \"$cmtconfig_\" ]; then sed -i \"/^set CMTCONFIG/d\" @INSTALL_PREFIX@/cmtsite/requirements; sed -n \"/^set CMTCONFIG/,\\$p\" @INSTALL_PREFIX@/cmtsite/requirements.orig >>@INSTALL_PREFIX@/cmtsite/requirements; fi" }
+# ' $scriptdir/requirements.template
+#[ $? -eq 0 ] || { error "awk" $FUNCNAME; return 1; }
+
+#elif [ $2 == AtlasCore ]; then
+#elif [[ $2 == Atlas?* || $2 == LCGCMT ]]; then
+else
+: ${cmtver:?}
+: ${CMTCONFIG:?}
+if [ "${relocate:-}" = yes ]; then
+cat <<EOF
+sed "s/^macro cmtconfig_default.*$/macro cmtconfig_default $CMTCONFIG/g" @INSTALL_PREFIX@/cmtsite/requirements >@INSTALL_PREFIX@/cmtsite/requirements.\$\$ && mv -f @INSTALL_PREFIX@/cmtsite/requirements.\$\$ @INSTALL_PREFIX@/cmtsite/requirements; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh; cmt config
+EOF
+else
+cat <<EOF
+sed "s/^set CMTCONFIG.*$/set CMTCONFIG $CMTCONFIG/g" @INSTALL_PREFIX@/cmtsite/requirements >@INSTALL_PREFIX@/cmtsite/requirements.\$\$ && mv -f @INSTALL_PREFIX@/cmtsite/requirements.\$\$ @INSTALL_PREFIX@/cmtsite/requirements; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh; cmt config
+EOF
+fi
+#PATH=/bin:/usr/bin; sed -i "s/^set CMTCONFIG.*$/set CMTCONFIG $CMTCONFIG/g" @INSTALL_PREFIX@/cmtsite/requirements; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh; cmt -quiet config
+[ $? -eq 0 ] || { error "cat" $FUNCNAME; return 1; }
+fi
+}
+
+_post ()
+{
+#
+# Print on the standard output post-install script
+#
+# Parameters: 'project-release-directory' 'project'|'package' 'release'|'version'
+#
+: ${cmtver:?}
+: ${CMTCONFIG:?}
+: ${verdir?} ${cntnr[0]:?} #${cntnr[1]:?}
+case ${CMTCONFIG} in
+    *dbg*) local mode=dbg ;;
+    *) local mode=opt ;;
+esac
+
+local cntnrcmt=${cntnr[1]}${cntnr[0]}/${verdir}cmt
+
+cd $1/$cntnrcmt || return 1
+[ -f ${tmppatch}/$2/$3/$cntnrcmt/requirements ] &&
+export CMTUSERCONTEXT=$(echo ${tmppatch}/$2/$3/$cntnrcmt)
+local project_post=$(cmt -q -tag=PACK show macro_value $(sed 's/[-.]/_/g' <<<${2})_post)
+#local project_post=$(cmt -tag=PACK show macro_value ${2}_post)
+unset CMTUSERCONTEXT
+cd $OLDPWD
+
+if [ "${relocate:-}" = yes ]; then
+
+if [ $2 == AtlasRelease ]; then
+: ${CMTCONFIG:?}
+case ${CMTCONFIG} in
+    *dbg*) local mode=dbg ;;
+    *) local mode=opt ;;
+esac
+cat <<EOF
+. @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh; export CMTCONFIG=$CMTCONFIG; cd @INSTALL_PREFIX@/.cmtsite; [ -f ./setup.sh ] || cmt config; . ./setup.sh; cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt; cmt br - cmt -no_cleanup config; ${project_post:+${project_post}; }true
+EOF
+#unset CMTROOT; cd @INSTALL_PREFIX@/.cmtsite; . ./setup.sh; cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt; cmt br - cmt -no_cleanup config; ${project_post:+${project_post}; }true
+else
+cat <<EOF
+. @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh; export CMTCONFIG=$CMTCONFIG; cd @INSTALL_PREFIX@/.cmtsite; [ -f ./setup.sh ] || cmt config; . ./setup.sh; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt br - 'cmt -no_cleanup config'; ${project_post:+${project_post}; }true
+EOF
+#unset CMTROOT; cd @INSTALL_PREFIX@/.cmtsite; . ./setup.sh; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt br - 'cmt -no_cleanup config'; ${project_post:+${project_post}; }true
+fi
+
+else
+
+if [ $2 == AtlasRelease ]; then
+: ${CMTCONFIG:?}
+case ${CMTCONFIG} in
+    *dbg*) local mode=dbg ;;
+    *) local mode=opt ;;
+esac
+cat <<EOF
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${3},${mode},noTest; cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt; cmt br - cmt -no_cleanup config; cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/Control/AthenaRunTime/*/cmt; . ./setup.sh; cmt build library_links; ${project_post:+cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt; ${project_post}; }true
+EOF
+
+#PATH=/bin:/usr/bin; unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${3},${mode},noTest; cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt; cmt -quiet br - cmt -quiet -no_cleanup config; cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/Control/AthenaRunTime/*/cmt; . setup.sh; cmt build library_links; ${project_post:+cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt; ${project_post}; }true
+elif [ $2 == LCGCMT ]; then
+cat <<EOF
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest; unset CMTPATH CMTHOME CMTUSERCONTEXT; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt br - 'cmt -no_cleanup config;cmt build library_links'; ${project_post:+${project_post}; }true
+EOF
+
+#PATH=/bin:/usr/bin; unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest; unset CMTPATH; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt -quiet br - 'cmt -quiet -no_cleanup config;cmt -quiet build library_links'; ${project_post:+${project_post}; }true
+elif [ $2 == Gaudi ]; then
+cat <<EOF
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest; unset CMTPATH CMTHOME CMTUSERCONTEXT; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt br - 'cmt -no_cleanup config;cmt build library_links'; ${project_post:+${project_post}; }true
+EOF
+
+#PATH=/bin:/usr/bin; unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest; unset CMTPATH; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt -quiet br - 'cmt -quiet -no_cleanup config;cmt -quiet build library_links'; ${project_post:+${project_post}; }true
+elif [[ $2 == Atlas?* ]]; then # Atlas projects
+cat <<EOF
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${2},${3},${mode},noTest; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt br - 'cmt -no_cleanup config;cmt build library_links'; ${project_post:+${project_post}; }true
+EOF
+
+#PATH=/bin:/usr/bin; unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${2},${3},${mode},noTest; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt -quiet br - 'cmt -quiet -no_cleanup config;cmt -quiet build library_links'; ${project_post:+${project_post}; }true
+else
+cat <<EOF
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest; unset CMTPATH CMTHOME CMTUSERCONTEXT; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt br - 'cmt -no_cleanup config;cmt build library_links'; ${project_post:+${project_post}; }true
+EOF
+
+#PATH=/bin:/usr/bin; unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest; unset CMTPATH; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt -quiet br - 'cmt -quiet -no_cleanup config;cmt -quiet build library_links'; ${project_post:+${project_post}; }true
+# cat <<EOF
+# PATH=/bin:/usr/bin; unset CMTROOT CMTSITE; . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest; unset CMTPATH; cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt; cmt -quiet br - cmt -quiet -no_cleanup config; ${project_post:+${project_post}; }true
+# EOF
+
+fi
+
+fi
+}
+
+_preun ()
+{
+#
+# Print on the standard output preun-install script
+#
+# Parameters: 'project-release-directory' 'project'|'package' 'release'|'version'
+#
+: ${cmtver:?}
+: ${CMTCONFIG:?}
+: ${verdir?} ${cntnr[0]:?} #${cntnr[1]:?}
+case ${CMTCONFIG} in
+    *dbg*) local mode=dbg ;;
+    *) local mode=opt ;;
+esac
+
+local cntnrcmt=${cntnr[1]}${cntnr[0]}/${verdir}cmt
+
+cd $1/$cntnrcmt || return 1
+[ -f ${tmppatch}/$2/$3/$cntnrcmt/requirements ] &&
+export CMTUSERCONTEXT=$(echo ${tmppatch}/$2/$3/$cntnrcmt)
+local project_preun=$(cmt -q -tag=PACK show macro_value $(sed 's/[-.]/_/g' <<<${2})_preun)
+#local project_preun=$(cmt -tag=PACK show macro_value ${2}_preun)
+local installarea=$(cmt -q show macro_value ${2}_installarea_prefix)
+unset CMTUSERCONTEXT
+cd $OLDPWD
+
+if [ "${relocate:-}" = yes ]; then
+
+: ${cmtver:?}
+: ${CMTCONFIG:?}
+if [ $2 == AtlasRelease ]; then
+case ${CMTCONFIG} in
+    *dbg*) local mode=dbg ;;
+    *) local mode=opt ;;
+esac
+if [ "${project_preun:-}" ]; then
+# sed -i "s/^macro cmtconfig_default.*$/macro cmtconfig_default $CMTCONFIG/g" @INSTALL_PREFIX@/.cmtsite/requirements
+# unset CMTROOT; cd @INSTALL_PREFIX@/.cmtsite;
+# (. @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh; cmt config)
+cat <<EOF
+if [ \$1 -eq 0 ]; then
+shift \$#;
+. @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh
+export CMTCONFIG=$CMTCONFIG
+cd @INSTALL_PREFIX@/.cmtsite;
+[ -f ./setup.sh ] || cmt config
+. ./setup.sh;
+cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt;
+${project_preun}
+cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt;
+true
+fi
+EOF
+fi
+else
+if [ "${project_preun:-}" ]; then
+# sed -i "s/^macro cmtconfig_default.*$/macro cmtconfig_default $CMTCONFIG/g" @INSTALL_PREFIX@/.cmtsite/requirements
+# unset CMTROOT; cd @INSTALL_PREFIX@/.cmtsite;
+# (. @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh; cmt config)
+cat <<EOF
+if [ \$1 -eq 0 ]; then
+shift \$#;
+. @INSTALL_PREFIX@/CMT/${cmtver}/mgr/setup.sh
+export CMTCONFIG=$CMTCONFIG
+cd @INSTALL_PREFIX@/.cmtsite;
+[ -f ./setup.sh ] || cmt config
+. ./setup.sh;
+cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt
+${project_preun}
+cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt;
+true
+fi
+EOF
+fi
+fi
+
+else
+
+if [ $2 == AtlasRelease ]; then
+: ${CMTCONFIG:?}
+case ${CMTCONFIG} in
+    *dbg*) local mode=dbg ;;
+    *) local mode=opt ;;
+esac
+cat <<EOF
+if [ \$1 -eq 0 ]; then
+shift \$#;
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite;
+. @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${3},${mode},noTest;
+${project_preun:+cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt;
+${project_preun}
+}cd @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/AtlasRelease/*/cmt;
+rm -rf @INSTALL_PREFIX@/$(basename $(dirname $1))/$3/$installarea/${CMTCONFIG}/lib;
+true
+fi
+EOF
+
+#PATH=/bin:/usr/bin;
+elif [ $2 == LCGCMT ]; then
+cat <<EOF
+if [ \$1 -eq 0 ]; then
+shift \$#;
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite;
+. @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest;
+unset CMTPATH CMTHOME CMTUSERCONTEXT;
+${project_preun:+cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt
+${project_preun}
+}cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt;
+rm -rf @INSTALL_PREFIX@/$2/$3/$installarea/${CMTCONFIG}/lib;
+true
+fi
+EOF
+
+#PATH=/bin:/usr/bin;
+#cmt -quiet br - 'rm -f Makefile setup.sh setup.csh cleanup.sh cleanup.csh';
+#cmt -quiet br - 'cmt -quiet remove library_links; rm -f Makefile setup.sh setup.csh cleanup.sh cleanup.csh';
+
+elif [ $2 == Gaudi ]; then
+cat <<EOF
+if [ \$1 -eq 0 ]; then
+shift \$#;
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite;
+. @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest;
+unset CMTPATH CMTHOME CMTUSERCONTEXT
+${project_preun:+cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt;
+${project_preun}
+}cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt;
+cmt br - 'cmt remove library_links';
+true
+fi
+EOF
+
+#PATH=/bin:/usr/bin;
+#cmt -quiet br - 'cmt show applied_patterns|grep -q declare_installed_libraries&&cmt -quiet remove library_links; rm -f Makefile setup.sh setup.csh cleanup.sh cleanup.csh';
+
+elif [[ $2 == Atlas?* ]]; then # Atlas projects
+cat <<EOF
+if [ \$1 -eq 0 ]; then
+shift \$#;
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite;
+. @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${2},${3},${mode},noTest;
+${project_preun:+cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt;
+${project_preun}
+}cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt;
+rm -rf @INSTALL_PREFIX@/$2/$3/$installarea/${CMTCONFIG}/lib;
+true
+fi
+EOF
+
+#PATH=/bin:/usr/bin;
+#cmt -quiet br - 'rm -f Makefile setup.sh setup.csh cleanup.sh cleanup.csh';
+
+else
+cat <<EOF
+if [ \$1 -eq 0 ]; then
+shift \$#;
+unset CMTROOT CMTSITE; cd @INSTALL_PREFIX@/cmtsite;
+. @INSTALL_PREFIX@/cmtsite/setup.sh -tag=${mode},noTest;
+unset CMTPATH CMTHOME CMTUSERCONTEXT;
+${project_preun:+cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt;
+${project_preun}
+}cd @INSTALL_PREFIX@/$2/$3/$cntnrcmt;
+cmt br - 'cmt remove library_links';
+true
+fi
+EOF
+
+#PATH=/bin:/usr/bin;
+#cmt -quiet br - 'cmt -quiet remove library_links; rm -f Makefile setup.sh setup.csh cleanup.sh cleanup.csh';
+
+fi
+
+fi
+}
+
+_pacman ()
+{
+#
+# Write pacman file
+#
+# Parameters: 'name' ['requires-file' ['postinstall-script' ['preinstall-script' ['version']]]]
+#
+local reqs fpath ver _ver
+
+fpath=${projcache}/cache/${1}.pacman
+
+if [ "$5" ]; then
+    ver=$5
+else
+#    ver=$(expr $(_getver ${1}) + 1 2>/dev/null) ||
+    _ver=$(_getver ${1}) || { _ver=; warn "${fpath}: Version reset" $FUNCNAME; }
+    ver=$(expr ${_ver:-0} + 1) ||
+    { ver=1; warn "${fpath}: Version set to ${ver}" $FUNCNAME; }
+fi
+
+info "Writing ${fpath}, version ${ver}" $FUNCNAME
+
+# add dependencies
+if [ -s "$2" ]; then
+
+while read req rest; do
+    reqs="${reqs}
+package('${req}')"
+done <${2}
+
+fi
+
+# write pacman file
+cat <<EOF >|${fpath}
+
+description('Package ${1}')
+version('${ver}')
+${reqs}
+
+EOF
+
+# add preinstall-script
+if [ -s "$4" ]; then
+    echo "shell('$(sed s/@INSTALL_PREFIX@/\$PACMAN_INSTALLATION/g $4)')" >>${fpath}
+fi
+
+if [ -f ${projcache}/kits/${1}.tar.gz ]; then
+cat <<EOF >>${fpath}
+
+downloadUntar('../kits/${1}.tar.gz')
+
+EOF
+else
+    warn "${projcache}/kits/${1}.tar.gz: No such file" $FUNCNAME
+fi
+
+# add postinstall-script
+if [ -s "$3" ]; then
+    echo "shell(\"$(sed s/@INSTALL_PREFIX@/\$PACMAN_INSTALLATION/g $3)\")" >>${fpath}
+    #echo "shell('$(sed s/@INSTALL_PREFIX@/\$PACMAN_INSTALLATION/g $3)')" >>${fpath}
+fi
+}
+
+_requires ()
+{
+#
+# Print on the standard output project dependencies (format: 'name' 'project' 'release')
+# (
+#  Atlas proj opt -> externals + CMT + AtlasSettings, AtlasLogin +
+#                    proj dependencies opt +  Atlas proj noarch
+#  Atlas proj src -> Atlas proj noarch
+#  Atlas proj doc, noarch, debuginfo
+#  Atlas proj dbg -> externals + CMT + AtlasSettings, AtlasLogin +
+#                    proj dependencies dbg +  Atlas proj src
+#  Gaudi the same as Atlas proj
+# )
+#
+# Parameters: 'project-release-directory' 'project' 'release' 'platform'
+#                                                             (bin src doc noarch debuginfo)
+#                                                                  'container'
+#                                                             (container-name [access-path])
+#                                                                      ['exps-file']
+#
+[ $# -eq 5 -o $# -eq 6 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+#[ $# -eq 4 -o $# -eq 5 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+local name cmtverfile cmtver
+local -a proj
+
+if [ $4 == bin ]; then
+
+# dependencies on external software
+#_extern $1 $2 $3 ${5:+"$5"} ||
+_extern $1 $2 $3 "${5:-}" ${6:-} ||
+warn "Cannot pack external software: $1 $2 $3" $FUNCNAME
+
+# CMT dependency only
+# first, try to determine which CMT version the project built with
+for f_ in $1/${cntnr[1]}${cntnr[0]}/${verdir}$CMTCONFIG/${cntnr[0]}setup.make \
+$1/${cntnr[1]}${cntnr[0]}/${verdir}$CMTCONFIG/${cntnr[0]}_setup.make \
+$1/${cntnr[1]}${cntnr[0]}/${verdir}$CMTCONFIG/setup.make
+do
+  [ -f "$f_" ] && { cmtverfile=$f_; break; }
+done
+
+if [ -f "${cmtverfile-}" ]; then
+    cmtver=$(awk '$1 == "use" && $2 == "CMT" { print $3; exit }' $cmtverfile) ||
+    { warn "Cannot determine CMT version: $cmtverfile" $FUNCNAME; unset cmtver; }
+elif f_=$1/${cntnr[1]}${cntnr[0]}/${verdir}cmt/setup.sh; [ -f $f_ ]; then
+    cmtver=$(cd $(dirname $f_) && unset CMTROOT && . $f_ 2>/dev/null && cmt version) ||
+    { warn "Cannot determine CMT version: $f_" $FUNCNAME; unset cmtver; }
+fi
+
+if [ -n "${cmtver-}" ]; then
+    case $2 in
+	tdaq-common|dqm-common)
+	    if [ "${cmtver}" != $(cmt version) ]; then
+		warn "Ignore CMT ${cmtver}: $1 $2 $3 (${CMTCONFIG})" $FUNCNAME
+		cmtver=$(cmt version)
+	    fi
+	    ;;
+    esac
+    _extern_proj "" CMT $cmtver
+else
+    warn "Cannot determine CMT version: $1 $2 $3 (${CMTCONFIG})" $FUNCNAME
+    # use currently setup CMT version
+    _extern_proj "" CMT $(cmt version)
+    # use the CMT version from ${cmthome}
+#    _extern_proj $(cd ${cmthome}; cmt show uses | awk '
+#$1 == "use" && $2 == "CMT" { gsub(/[()]/, "", $4); print $4, $2, $3; exit }
+#')
+fi
+
+# dependencies on AtlasSettings, AtlasLogin
+_settings || return 1
+
+if [ -f $1/cmt/project.cmt ]; then
+# direct project dependencies only
+awk '$1 == "use" && $2 ~ /./ { print $2 }' $1/cmt/project.cmt |
+while read projname; do
+    proj=($(cd $1/cmt; cmt show projects | awk '
+$1 == "'${projname}'" && $3 == "(in" { sub(/[)]$/, "", $4); print $1, $2, $4; exit }
+'))
+    case $recursive in
+	no) 
+	    name=$(_mkname ${proj[0]} ${proj[1]} bin)
+	    echo $name ${proj[0]} ${proj[1]}
+	    [ -f ${projcache}/cache/$name.pacman ] ||
+	    warn "Not packed: ${proj[0]} ${proj[1]} ${CMTCONFIG}" $FUNCNAME ;;
+	yes)
+	    if grep "${proj[0]} ${proj[1]}" $tmpdone; then
+		info "Done already: ${proj[0]} ${proj[1]} ${CMTCONFIG}" $FUNCNAME
+	    else
+		case ${proj[0]} in
+		    LCGCMT)
+			_extern_proj ${proj[2]} ${proj[0]} ${proj[1]} >>$tmpdone &&
+			grep "${proj[0]} ${proj[1]}" $tmpdone ;;
+		    *)
+			_proj ${proj[2]} ${proj[0]} ${proj[1]} >>$tmpdone &&
+			grep "${proj[0]} ${proj[1]}" $tmpdone ;;
+		esac
+	    fi ;;
+	*) error "Invalid value: recursive: $recursive" $FUNCNAME; return 1 ;;
+    esac
+done || return 1
+
+else warn "$1/cmt/project.cmt: No such file" $FUNCNAME
+fi
+
+# dependencies on other parts of the project
+    case ${CMTCONFIG} in
+	*dbg*) echo $(_mkname $2 $3 src) $2 $3 ;;
+	*) echo $(_mkname $2 $3 noarch) $2 $3 ;;
+    esac
+
+elif [ $4 == src ]; then
+    echo $(_mkname $2 $3 noarch) $2 $3
+fi
+}
+
+_extern ()
+{
+#
+# Pack external software (Boost, Python, ROOT, ...)
+# accessible via the glue packages in the current project directory ONLY
+# Print on the standard output information on it (format: 'name' 'package' 'version')
+#
+# Parameters: 'project-release-directory' 'project' 'release' 'container'
+#                                                              (container-name [access-path])
+#                                                                      ['exps-file']
+#
+[ $# -eq 4 -o $# -eq 5 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+#[ $# -eq 3 -o $# -eq 4 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+#[ $# -eq 4 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+local cmd
+local tmpout=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+
+#if [ $# -eq 4 ] && [ "$4" ]; then
+if [ $# -ge 4 ] && [ "$4" ]; then
+    cntnr=($4); [ ${#cntnr[*]} -eq 2 ] && cntnr[1]=$(sed 's#/*$#/#' <<<${cntnr[1]})
+else
+    cntnr=($(_getcntnr $1 $2 $3)) || cntnr=($(_mkcntnr $2)) || return 1
+fi
+
+# determine version directory
+# (<version-tag>/ - with_version_directory,  [empty] - without_version_directory)
+# (CMT structure_strategy query not reliable)
+if [ -d $1/${cntnr[1]}${cntnr[0]}/cmt ]; then
+    verdir=
+elif [ -d "$(echo $1/${cntnr[1]}${cntnr[0]}/*/cmt)" ]; then
+    verdir=$(basename $(dirname $1/${cntnr[1]}${cntnr[0]}/*/cmt))/
+    #verdir=*/
+else
+    error "Cannot determine cmt directory: $1/${cntnr[1]}${cntnr[0]}" $FUNCNAME; return 1
+fi
+
+cd $1/${cntnr[1]}${cntnr[0]}/${verdir}cmt || { error "cd" $FUNCNAME; return 1; }
+
+info "`date`\tdirectory:\n`pwd`" $FUNCNAME
+
+#    cmd="externcache=${externcache} patchdir=${patchdir} overwrite=${overwrite} tmppatch=${tmppatch} cmt -quiet broadcast ${selected:+-select='${selected}'} - ${scriptdir}/pack-extern.sh"
+    cmd="externcache=${externcache} patchdir=${patchdir} overwrite=${overwrite} verify=$verify tmppatch=${tmppatch} cmt broadcast ${selected:+-select='${selected}'} - ${scriptdir}/pack-extern.sh"
+    info "$cmd" $FUNCNAME
+#    time eval $cmd | tee -a $tmpout >&2
+
+#if [ $waiting == yes -a $quiet == no ]; then
+    tail -f $tmpout >&2 & local pid=$!
+#fi 
+
+    time eval $cmd ${5:-} >>$tmpout; local retval=$?
+#    time eval $cmd >>$tmpout; local retval=$?
+
+#if [ $waiting == yes -a $quiet == no ]; then
+    kill $pid
+#else cat $tmpout >&2; fi
+
+    [ $retval -eq 0 ] && ! sed '/^#/d' $tmpout && { error "sed" $FUNCNAME; return 1; }
+#     [ $retval -eq 0 ] && cat $tmpout | grep -v '^#'
+
+#info "`date`" $FUNCNAME
+cd $OLDPWD
+rm -f $tmpout
+return $retval
+}
+
+_extern_proj ()
+{
+#
+# Pack external project (Gaudi, LCGCMT, CMT)
+# Print on the standard output information on it (format: 'name' 'project' 'release')
+#
+# Parameters: 'project-release-directory' 'project' 'release' ['container']
+#                                                              (container-name [access-path])
+#
+[ $# -eq 3 -o $# -eq 4 ] || { error "$#: Wrong number of arguments" $FUNCNAME; return 1; }
+#[ $# -eq 4 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+
+local name fpath
+
+if [ $2 == Gaudi -o $2 == LCGCMT ]; then
+#if [ $2 == Gaudi ]; then
+
+    _proj $1 $2 $3 ${4:+"$4"}
+
+elif [ $2 == LCGCMT ]; then
+info "`date`\targuments:\n$*" $FUNCNAME
+
+local tmpreq=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+
+local tmppre=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+local tmppost=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+local tmppreun=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+
+#local cmtver requires
+local cmtver
+local -a cntnr
+local verdir
+
+#if [ -s "$4" ]; then requires=$4; else requires=${tmpreq}; fi
+
+#_settings >>${requires}
+
+name=$(_mkname $2 $3 bin)
+echo $name $2 $3
+_requires ${1} ${2} ${3} bin "${4:-}" >|${tmpreq} || return 1
+#_requires ${1} ${2} ${3} bin ${4:+"$4"} >|${tmpreq} || return 1
+if [ -f ${projcache}/cache/$name.pacman -a "${upgrade}" != yes ]; then
+    info "Existing ${projcache}/cache/$name.pacman will not be overwritten" $FUNCNAME
+else
+#    _requires ${1} ${2} ${3} bin ${4:+"$4"} >|${tmpreq}
+    #_requires ${1} ${2} ${3} bin >>$requires
+    # need assign the right value to cmtver
+    cmtver=$(awk '$2 == "CMT" { print $3; exit }' ${tmpreq}) || return 1
+    #cmtver=$(awk '$2 == "CMT" { print $3; exit }' $requires) || return 1
+    _pre ${1} ${2} ${3} >|${tmppre} || return 1
+    _post ${1} ${2} ${3} >|${tmppost} || return 1
+    _pacman ${name} ${tmpreq} ${tmppost} ${tmppre} || return 1
+    #_pacman ${name} $requires ${tmppost} ${tmppre}
+fi
+[ ! -f $PACKRPM/bin/pack-rpm-LCGCMT-bin.sh ] || . $PACKRPM/bin/pack-rpm-LCGCMT-bin.sh || return 1
+
+name=$(_mkname $2 $3 noarch)
+fpath=${projcache}/kits/$name.tar.gz
+if [ -f $fpath -a "${upgrade}" != yes ]; then
+    info "Existing $fpath will not be overwritten" $FUNCNAME
+else
+    info "Writing $fpath" $FUNCNAME
+    tar -v ${tar_basic_opts} -cf $fpath -z \
+	-X $scriptdir/junk.ptn \
+	-X $scriptdir/pltfm-junk.ptn \
+	--exclude=$(cd $1/${cntnr[1]}${cntnr[0]}/${verdir}cmt; \
+	cmt -q show macro_value LCGCMT_installarea_prefix)/'*' \
+	-C $1/../.. $2/$3 >&2 ||
+{ warn "Disk space on the filesystem of `dirname $fpath`:
+$(duf -p `dirname $fpath` $1)" $FUNCNAME
+rm -f $fpath
+error "tar" $FUNCNAME; return 1; }
+
+    _patch ${2} ${3} ${name} || return 1
+    _pacman $name || return 1
+fi
+[ ! -f $PACKRPM/bin/pack-rpm-LCGCMT-noarch.sh ] || . $PACKRPM/bin/pack-rpm-LCGCMT-noarch.sh || return 1
+
+rm -f ${tmpreq} ${tmppost} ${tmppre} ${tmppreun} || return 0
+
+elif [ $2 == CMT ]; then
+: ${CMTCONFIG:?}
+    # CMTv1r18p20050901Linux-i686.tar.gz from www.cmtsite.org
+    name=${2}${3}${uname}-$(cut -d- -f1 <<<$CMTCONFIG)
+#    name=${2}${3}Linux-$(cut -d- -f1 <<<$CMTCONFIG)
+
+    echo $name $2 $3
+
+    fpath=${projcache}/cache/$name.pacman
+#    if [ -f $fpath ]; then
+    if [ -f $fpath -a "${upgrade}" != yes ]; then
+	info "Existing $fpath will not be overwritten" $FUNCNAME
+    else
+	info "Writing $fpath" $FUNCNAME
+
+cat >|$fpath <<EOF
+#
+# CMT from a CMT cache
+#
+description ('Package $name')
+
+package('${cmtcache}:CMT | version ("${3}")')
+EOF
+
+    fi
+
+else
+    error "Unknown external project: $1 $2 $3" $FUNCNAME; return 1
+fi
+}
+
+_proj ()
+{
+#
+# Pack project in five parts:
+#                             binary platform - corresponds to CMTCONFIG value
+#                             debuginfo files (for not debug build)
+#                             source code
+#                             documentation files
+#                             other architecture independent files
+# Print on the standard output information on it (format: 'name' 'project' 'release')
+#
+# Parameters: 'project-release-directory' 'project' 'release' ['container']
+#                                                              (container-name [access-path])
+#
+### Parameters: 'project-release-directory' 'project' 'release' ['requires-file']
+#
+info "`date`\targuments:\n$*" $FUNCNAME
+[ $# -eq 3 -o $# -eq 4 ] || { error "Wrong number of arguments: $#" $FUNCNAME; return 1; }
+local tmpbin=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+local tmpsrc=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+local tmpdoc=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+local tmpnoarch=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+
+local tmpdirs=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+local tmpdebuginfo=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+
+_prep_lists ${1} ${2} ${3} \
+${tmpbin} ${tmpsrc} ${tmpdoc} ${tmpnoarch} \
+${tmpdirs} ${tmpdebuginfo} || return 1
+
+local tmpreq=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+
+if [ "${relocate:-}" = yes ]; then
+    local tmpexps=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+fi
+
+local tmppre=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+local tmppost=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+local tmppreun=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+
+#local pltfm name cmtver requires
+local pltfm name cmtver
+local -a cntnr
+local verdir
+
+#if [ -s "$4" ]; then requires=$4; else requires=${tmpreq}; fi
+
+for pltfm in bin src doc noarch debuginfo; do
+    [ ${pltfm} == doc -a "${docfiles}" != yes ] && continue
+    [ ${pltfm} = debuginfo ] && [ "${debuginfo}" != yes -o "${mode:-}" = dbg ] && continue
+    name=$(_mkname ${2} ${3} ${pltfm}) || return 1
+    [ ${pltfm} == bin ] && echo $name $2 $3
+
+    _requires ${1} ${2} ${3} ${pltfm} "${4:-}" ${tmpexps:-} >|${tmpreq} || return 1
+#    _requires ${1} ${2} ${3} ${pltfm} ${4:+"$4"} >|${tmpreq} || return 1
+#if [ -f "${tmpexps:-}" ]; then
+#    cat ${tmpexps:-} >&2 || { error "cat" $FUNCNAME; return 1; }
+#fi
+
+#     if [ -f ${projcache}/kits/$name.tar.gz -a "${upgrade}" != yes ]; then
+# 	info "Existing ${projcache}/kits/$name.tar.gz will not be overwritten" $FUNCNAME
+#     else
+    if [ -f ${projcache}/cache/$name.pacman -a "${upgrade}" != yes ]; then
+	info "Existing ${projcache}/cache/$name.pacman will not be overwritten" $FUNCNAME
+	if [ "${verify}" == yes ]; then
+	    local spath=${projcache}/kits/$name.tar.gz
+	    if [ -f $spath ] && eval [ -s \${tmp${pltfm}} ]; then
+		eval sed 's#^'$2/$3'#'$1'#' \${tmp${pltfm}} | newer -p $spath
+	    elif [ -f $spath ] && eval [ ! -s \${tmp${pltfm}} ]; then
+		warn "$spath: Empty file list" $FUNCNAME
+	    elif [ ! -f $spath ] && eval [ -s \${tmp${pltfm}} ]; then
+		error "$spath: No such file" $FUNCNAME
+	    fi
+	fi
+    else
+	_clean ${1} ${2} ${3} || return 1
+	if [ ${pltfm} = bin ]; then
+	    eval _copy -X ${tmpdebuginfo} ${1} ${2} ${3} \${tmp${pltfm}} || return 1
+#	    eval _copy -x \\*${debuginfosuffix} ${1} ${2} ${3} \${tmp${pltfm}} || return 1
+	else
+	    eval _copy ${1} ${2} ${3} \${tmp${pltfm}} || return 1
+	fi
+	if [ ${pltfm} == noarch ]; then
+	    _install_dirs ${tmpdirs} || return 1
+# 	    _copy -n ${1} ${2} ${3} ${tmpdirs} || return 1
+	fi
+	_symlinks  ${1} ${2} ${3} ${tmpexps:-} || return 1
+#	_symlinks  ${1} ${2} ${3} || return 1
+	_tar ${2} ${3} ${name} || return 1
+	if [ ${pltfm} == noarch ]; then
+	    _patch ${2} ${3} ${name} || return 1
+	fi
+#	_requires ${1} ${2} ${3} ${pltfm} ${4:+"$4"} >|${tmpreq}
+	if [ ${pltfm} == bin ]; then
+	    #_requires ${1} ${2} ${3} ${pltfm} >>$requires
+            # need assign the right value to cmtver
+	    cmtver=$(awk '$2 == "CMT" { print $3; exit }' ${tmpreq}) || return 1
+	    #cmtver=$(awk '$2 == "CMT" { print $3; exit }' $requires) || return 1
+	    _pre ${1} ${2} ${3} >|${tmppre} || return 1
+	    _post ${1} ${2} ${3} >|${tmppost} || return 1
+	    _pacman ${name} ${tmpreq} ${tmppost} ${tmppre} || return 1
+	    #_pacman ${name} ${requires} ${tmppost} ${tmppre}
+	else
+	    #_requires ${1} ${2} ${3} ${pltfm} >|${tmpreq}
+	    _pacman ${name} ${tmpreq} || return 1
+	fi
+    fi
+    [ ! -f $PACKRPM/bin/pack-rpm-proj.sh ] || . $PACKRPM/bin/pack-rpm-proj.sh || return 1
+done
+rm -f ${tmpbin} ${tmpsrc} ${tmpdoc} ${tmpnoarch} \
+${tmpdirs} ${tmpdebuginfo} \
+${tmpreq} ${tmpexps:-} ${tmppost} ${tmppre} ${tmppreun} || return 0
+}
+
+##################################### main ##########################################
+_mktmpdir $builddir || exit 1
+
+if [ ${uname} = Linux ]; then
+    tar_basic_opts="--owner=root --group=root --mode=u=rwX,go=rX --no-anchored --wildcards"
+    noleaf=yes
+#    group=yes
+else
+    tar_basic_opts=
+    unset noleaf
+#    unset group
+fi
+#tar_basic_opts="--owner=root ${group:+--group=root} --mode=u=rwX,go=rX --no-anchored --wildcards"
+#tar_basic_opts="--owner=root --group=root --mode=u=rwX,go=rX --no-anchored --wildcards"
+#tar_basic_opts="--owner=root --group=root --mode=u=rwX,go=rX"
+
+tmpdone=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; exit 1; }
+
+if [ "$selected" ]; then
+
+    _extern ${projbase}/${project}/${release} ${project} ${release} "${container:-}" >>$tmpdone
+    #_extern ${projbase}/${project}/${release} ${project} ${release} ${container:+"$container"} >>$tmpdone
+    #_extern ${projbase}/${project}/${release} ${project} ${release} "${container}"
+
+else
+
+#_settings >>${requires}
+if [ $project == AtlasRelease ]; then
+    #_settings >>${requires}
+    _proj ${projbase}/${release} ${project} ${release} ${requires}
+#elif [ $project == LCGCMT ]; then
+elif [ $project == LCGCMT -o $project == CMT ]; then
+    _extern_proj ${projbase}/${project}/${release} ${project} ${release} ${container:+"$container"} >>$tmpdone
+else
+    _proj ${projbase}/${project}/${release} ${project} ${release} ${container:+"$container"} >>$tmpdone
+    #_proj ${projbase}/${project}/${release} ${project} ${release} ${requires}
+fi
+
+fi
+
+retval=$?
+[ $retval -eq 0 ] && [ -s "$tmpdone" ] && cat $tmpdone
+# [ -s "$tmpdone" ] && cat $tmpdone >&2
+[ -f "$tmpdone" ] && rm -rf $tmpdone
+
+rm -rf $tmpdir
+###rm -rf $requires
+exit $retval
+#####################################################################################
diff --git a/PackDist/scripts/pack.cfg.example b/PackDist/scripts/pack.cfg.example
new file mode 100755
index 00000000000..8bdd4fe20a4
--- /dev/null
+++ b/PackDist/scripts/pack.cfg.example
@@ -0,0 +1,145 @@
+# This is an example configuration file for the pack-run.sh and proj-run.sh scripts.
+# 
+# The configuration files read by the scripts are defaults.cfg,
+# ~/.pack.cfg, the file specified in the environment variable PACKCFG,
+# the file specified with the -c command line option
+# (values from "earlier" files are overridden by "later" files).
+#
+# The format is: option = value # comments
+#            or: option : value # comments
+#
+# (Command line options override values from the configuration files.)
+#
+# Report bugs to <Grigori.Rybkine@cern.ch>.
+#
+
+#cmthome: $HOME/cmthome-latest
+
+# AtlasSetup package root
+#setuproot = /afs/cern.ch/atlas/software/dist/AtlasSetup
+
+# (command line option -L)
+#logdir: $HOME/log
+
+# directory to create packages in (command line option -C)
+#pacmancache=/data/pacman
+
+#patchdir: $HOME/patches
+
+# (command line option -b)
+#projbase=/afs/cern.ch/atlas/software/builds
+
+# the release to package
+# (command line option -r)
+#release=10.4.0
+
+# this option is only currently used to pack monolithic releases
+# as 'AtlasRelease' project
+# use the 'container' option for all (other) projects if needed
+#mainpkg=AtlasRelease # this is default
+
+# the packages to pack
+# (command line option -p)
+# (value accumulates over configuration files and -p command line options)
+#packages =    		   AtlasShift      	oracle
+
+#mode = dbg
+
+# overwrite (yes) or not (no) existing tarballs of external packages
+# (command line option -F)
+#overwrite : yes  # (boolean option)
+
+
+# The options ONLY supported by the proj-run.sh script.
+#
+
+# directory to create external packages in, takes precedence over pacmancache value
+# (command line option -X)
+#externcache = /data/Proj/extern
+
+# directory to create project packages in, takes precedence over pacmancache value
+# (command line option -J)
+#projcache = /data/Proj/proj
+
+# directory to create RPMs in (command line option -o)
+#rpmdir=/data/rpms
+
+# directory to create external RPMs in, takes precedence over rpmdir value
+# (command line option -x)
+#externdir = /data/Proj/extern
+
+# directory to create project RPMs in, takes precedence over rpmdir value
+# (command line option -j)
+#projdir = /data/Proj/proj
+
+# the project to pack
+# (command line option -P)
+#project = AtlasSimulation #AtlasCore #AtlasConditions
+
+# container package specification for the project to pack
+# this option is useful if the cmt/project.cmt file
+# does not specify the container package
+#container: container-name [access-path]
+
+# additional tag(s) for setup
+# (command line option -t)
+# the value may be a space or comma separated list
+#tags: 32 # to pack 32-bit build on 64-bit machine
+
+# CMTCONFIG (platform tag) for setup
+# (command line option -T)
+# the value shall be a CMTCONFIG value recognised by the setup procedure/tool
+#cmtconfig: x86_64-slc6-gcc47-opt 
+
+# package (yes) or not (no) documentation files
+# (command line option -d)
+#docfiles: yes # (boolean option)
+
+# overwrite (yes) or not (no) existing tarballs of project packages
+# (command line option -U)
+#upgrade: yes # (boolean option)
+
+# keep (yes) existing tarballs of settings packages or overwrite (no) them
+# if their versions differ from those in use
+# (command line option -k)
+#keep: yes # (boolean option)
+
+# recursively pack projects required by the project being packed
+# (command line option -R)
+# yes if starts with y or Y or is 1, no - otherwise
+# (the same applies to the other boolean options)
+#recursive: Yep # nope # (boolean option)
+
+# verify (yes) or not (no) that existing tarballs are up-to-date
+# (command line option -V)
+#verify: yes # (boolean option)
+
+# wait (yes) or not (no) until packaging completion
+# (command line option -w)
+#waiting: yes # (boolean option)
+
+# do not write anything to standard output
+# (command line option -q)
+#quiet: no # yes # (boolean option)
+
+# do not execute, only dump configuration
+# (command line option -n)
+#configure: no # yes # (boolean option)
+
+# directory to use for temporary files during packaging 
+# (with enough space to copy the project into)
+# defaults to the TMPDIR environment variable if set, or /tmp
+# (command line option -B)
+#builddir = /data/kitbuild
+
+# CMT cache location
+# defaults to the CMT site cache (http://www.cmtsite.org/pacman/cache)
+#cmtcache = http://cern.ch/atlas-computing/links/kitsDirectory/CMT/pacman/cache
+
+# create (yes) or not (no) debug information packages (for not debug build)
+# (command line option -I)
+#debuginfo: no # (boolean option)
+
+# extention of debug information files (for not debug build)
+# (command line option -S)
+#debuginfosuffix = .debug
diff --git a/PackDist/scripts/platforms b/PackDist/scripts/platforms
new file mode 100755
index 00000000000..5b5669b0f7c
--- /dev/null
+++ b/PackDist/scripts/platforms
@@ -0,0 +1,52 @@
+i686-slc4-gcc345-opt
+i686-slc4-gcc345-dbg
+x86_64-slc4-gcc345-opt
+x86_64-slc4-gcc345-dbg
+i686-slc4-gcc34-opt
+i686-slc4-gcc34-dbg
+x86_64-slc4-gcc34-opt
+x86_64-slc4-gcc34-dbg
+i686-slc4-gcc41-opt
+i686-slc4-gcc41-dbg
+x86_64-slc4-gcc41-opt
+x86_64-slc4-gcc41-dbg
+i686-slc4-gcc43-opt
+i686-slc4-gcc43-dbg
+x86_64-slc4-gcc43-opt
+x86_64-slc4-gcc43-dbg
+i686-slc5-gcc34-opt
+i686-slc5-gcc34-dbg
+x86_64-slc5-gcc34-opt
+x86_64-slc5-gcc34-dbg
+i686-slc5-gcc43-opt
+i686-slc5-gcc43-dbg
+x86_64-slc5-gcc43-opt
+x86_64-slc5-gcc43-dbg
+i686-slc5-icc11-opt
+i686-slc5-icc11-dbg
+i686-slc5-gcc46-opt
+i686-slc5-gcc46-dbg
+x86_64-slc5-gcc46-opt
+x86_64-slc5-gcc46-dbg
+i686-slc5-gcc47-dbg
+i686-slc5-gcc47-opt
+x86_64-slc5-gcc47-dbg
+x86_64-slc5-gcc47-opt
+x86_64-slc6-gcc46-opt
+x86_64-slc6-gcc46-dbg
+i686-slc6-gcc47-opt
+i686-slc6-gcc47-dbg
+x86_64-slc6-gcc47-opt
+x86_64-slc6-gcc47-dbg
+x86_64-slc6-gcc48-opt
+x86_64-slc6-gcc48-dbg
+i386-mac104-gcc40-opt
+i386-mac104-gcc40-dbg
+ppc-mac104-gcc40-opt
+ppc-mac104-gcc40-dbg
+i386-mac105-gcc40-opt
+i386-mac105-gcc40-dbg
+i386-mac106-gcc42-opt
+i386-mac106-gcc42-dbg
+x86_64-mac106-gcc42-opt
+x86_64-mac106-gcc42-dbg
diff --git a/PackDist/scripts/pltfm-junk.ptn b/PackDist/scripts/pltfm-junk.ptn
new file mode 100755
index 00000000000..d9bfaca3ae4
--- /dev/null
+++ b/PackDist/scripts/pltfm-junk.ptn
@@ -0,0 +1,10 @@
+*.o
+*.make
+*.stamp
+*.shstamp
+*.cmtref
+*.d
+*.dep
+*.in
+*.makesav
+*.makecmtsave
diff --git a/PackDist/scripts/proj-run.sh b/PackDist/scripts/proj-run.sh
new file mode 100755
index 00000000000..2201f62e9d4
--- /dev/null
+++ b/PackDist/scripts/proj-run.sh
@@ -0,0 +1,622 @@
+#!/bin/bash
+
+[ "$PROJRUNDBG" ] && set -x
+
+scriptdir=$(dirname $0)
+. $scriptdir/pack-common.sh
+scriptdir=$(abspath $scriptdir)
+export scriptdir
+
+help ()
+{
+cat <<EOF
+Usage: `basename $0` [OPTION]...
+Pack project with external packages it depends upon, or only external package(s).
+
+  -L <path>      create log file in directory <path>
+  -C <path>      create packages in directory <path>
+  -X <path>      create external packages in directory <path>
+                 (takes precedence over -C value)
+  -J <path>      create project packages in directory <path>
+                 (takes precedence over -C value)
+  -o <path>      create RPMs in directory <path>
+  -x <path>      create external RPMs in directory <path>
+                 (takes precedence over -o value)
+  -j <path>      create project RPMs in directory <path>
+                 (takes precedence over -o value)
+  -b <path>      pack project located in project base directory <path>
+  -P <project>   pack project <project>
+  -r <id>        pack project release <id>
+  -p <package>   pack external package <package> (may be multiple)
+  -D             pack debug build
+  -I             create debug information packages (for not debug build)
+  -S <suffix>    suffix of debug information files (for not debug build)
+  -t <tag>[,<tag>...]  use additional tag(s) for setup (may be multiple)
+  -T <cmtconfig>  force CMTCONFIG <cmtconfig> (platform tag) for setup
+  -d             pack documentation files also
+  -F             overwrite existing tarballs of external packages
+  -U             overwrite existing tarballs of project packages
+  -k             keep existing tarballs of settings packages
+                 (default is overwrite if their versions differ from those in use)
+  -R             recursively pack projects required by the project being packed
+  -V             verify that existing tarballs (of project and/or external packages) are up-to-date
+  -w             wait until packing completion
+  -q             do not write anything to standard output
+  -n             do not execute, only dump configuration
+  -B <path>      use directory <path> for temporary files
+  -c <path>      use configuration file <path>
+  -h             display this help and exit
+  -v             output version information and exit
+
+The PACKOPTS environment variable specifies a space separated list of default options
+to be placed in front of any explicit options.
+
+Report bugs to <Grigori.Rybkine@cern.ch>.
+EOF
+}
+
+version ()
+{
+if [ -r $scriptdir/../ChangeLog ]; then
+printf "`basename $0` (PackDist) %s\nWritten by Grigori Rybkine.\n" \
+`sed -n '/^[[:blank:]]*PackDist-\([0-9][0-9]\(-[0-9][0-9]\)\{2,3\}\)[[:blank:]]*$/{s//\1/p
+q
+}' $scriptdir/../ChangeLog`
+else
+printf "`basename $0` (PackDist) %s\nWritten by Grigori Rybkine.\n" \
+`cd $scriptdir/../cmt && cmt show version|sed -n '/^[[:blank:]]*PackDist-\([0-9][0-9]\(-[0-9][0-9]\)\{2,3\}\)[[:blank:]]*$/s//\1/p'`
+fi
+}
+
+parse_opts ()
+{
+local msg="Try '`basename $0` -h' for more information."
+
+while getopts ":L:C:X:J:o:x:j:b:P:r:p:DIS:t:T:dFUkRVwqnB:c:hv" opt; do
+    case $opt in
+	L) eval logdir=${OPTARG} ;;
+	C) eval pacmancache=${OPTARG} ;;
+	X) eval externcache=${OPTARG} ;;
+	J) eval projcache=${OPTARG} ;;
+	o) eval rpmdir=${OPTARG} ;;
+	x) eval externdir=${OPTARG} ;;
+	j) eval projdir=${OPTARG} ;;
+	b) eval projbase=${OPTARG} ;;
+	P) project=${OPTARG} ;;
+	r) release=${OPTARG} ;;
+	p) if [ "$packages" ]; then
+	       packages="$packages ${OPTARG}"
+	   else packages=${OPTARG}; fi ;;
+	D) mode=dbg ;; # Debug
+	I) debuginfo=yes ;;
+	S) debuginfosuffix=${OPTARG} ;;
+	t) if [ "$tags" ]; then
+	       tags="$tags ${OPTARG}"
+	   else tags=${OPTARG}; fi ;;
+	T) cmtconfig=${OPTARG} ;;
+	d) docfiles=yes ;;
+	F) overwrite=yes ;; # Fresh
+	U) upgrade=yes ;; # Upgrade
+	k) keep=yes ;;
+	R) recursive=yes ;;
+	V) verify=yes ;;
+	w) waiting=yes ;;
+	q) quiet=yes ;;
+	n) configure=yes ;;
+	B) eval builddir=${OPTARG} ;;
+	c) config_read -e ${OPTARG} || return 1 ;;
+	h) help ; exit 0 ;;
+	v) version ; exit 0 ;;
+	\?) error "Invalid option: -${OPTARG}\n$msg" $FUNCNAME; return 1 ;;
+	:) error "Argument required for option: -${OPTARG}\n$msg" $FUNCNAME; return 1 ;;
+    esac
+done
+
+shift $(($OPTIND - 1))
+
+[ $# -eq 0 ] || { error "Invalid argument(s): $*\n$msg" $FUNCNAME; return 1; }
+}
+
+config_read ()
+{
+_error_level=0
+tmpcfg=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+tmperr=$(mktemp -t tmp.XXXXXXXXXX) || { error "mktemp" $FUNCNAME; return 1; }
+for f; do
+    if [ "X$f" = "X-e" ]; then
+	_error_level=2
+	continue
+    elif [ "X$f" = "X-w" ]; then
+	_error_level=1
+	continue
+    elif [ "X$f" = "X-i" ]; then
+	_error_level=0
+	continue
+    fi
+#     [ -f "$f" ] || continue
+    if [ ! -r "$f" ]; then
+	case ${_error_level} in
+	    2) error "Cannot read file '$f'" $FUNCNAME; return 1 ;;
+	    1) warn "Cannot read file '$f'" $FUNCNAME; continue ;;
+	    0) continue ;;
+	esac
+    fi
+#    awk -v tmperr=$tmperr '
+    awk 'BEGIN { tmperr="'$tmperr'" }
+        NF == 0 || /^#/ { next }
+        { sub(/[ \t]#.*$/, " "); if (NF == 0) next }
+        /^[ \t]*[^ \t=:]+[ \t]*[=:]/ { sub(/[=:]/, " "); print; next }
+        { printf "%s: line %d: %s\n", FILENAME, NR, $0 >> tmperr }
+#        { printf "%s: line %d:\n%s\n", FILENAME, NR, $0 >> tmperr }
+    ' "$f" >>$tmpcfg || { error "awk" $FUNCNAME; return 1; }
+done
+[ -s $tmperr ] &&
+{ error "Invalid syntax:\n$(<$tmperr)" $FUNCNAME; rm -f $tmperr $tmpcfg; return 2; }
+rm -f $tmperr
+while read opt val; do
+    case $opt in
+	cmthome) eval cmthome=${val} ;; # eval ${opt}=${val}
+	setuproot) eval setuproot=${val} ;; # eval ${opt}=${val}
+	logdir) eval logdir=${val} ;;
+	pacmancache) eval pacmancache=${val} ;;
+	externcache) eval externcache=${val} ;;
+	projcache) eval projcache=${val} ;;
+	rpmdir) eval rpmdir=${val} ;;
+	externdir) eval externdir=${val} ;;
+	projdir) eval projdir=${val} ;;
+	patchdir) eval patchdir=${val} ;;
+	projbase) eval projbase=${val} ;;
+	project) project=${val} ;;
+	release) release=${val} ;;
+	mainpkg) mainpkg=${val} ;;
+	container) container="${val}" ;;
+	packages) if [ "$packages" ]; then
+	              packages="$packages ${val}"
+		  else packages=${val}; fi ;;
+	mode) mode=${val} ;;
+	debuginfo) debuginfo=${val} ;;
+	debuginfosuffix) debuginfosuffix=${val} ;;
+	tags) if [ "$tags" ]; then
+	          tags="$tags ${val}"
+	      else tags=${val}; fi ;;
+	cmtconfig) cmtconfig=${val} ;;
+	docfiles) docfiles=${val} ;;
+	overwrite) overwrite=${val} ;;
+	upgrade) upgrade=${val} ;;
+	keep) keep=${val} ;;
+	recursive) recursive=${val} ;;
+	verify) verify=${val} ;;
+	waiting) waiting=${val} ;;
+	quiet) quiet=${val} ;;
+	configure) configure=${val} ;;
+	builddir) eval builddir=${val} ;;
+	cmtcache) cmtcache=${val} ;;
+	*) error "Invalid option: '${opt}'" $FUNCNAME; rm -f $tmpcfg; return 1 ;;
+    esac
+done <${tmpcfg}
+#rm -f $tmperr $tmpcfg
+rm -f $tmpcfg
+}
+
+config_dump () {
+cat <<EOF
+cmthome: $cmthome
+setuproot: $setuproot
+logdir: $logdir
+pacmancache: $pacmancache
+externcache: $externcache
+projcache: $projcache
+rpmdir: $rpmdir
+externdir: $externdir
+projdir: $projdir
+patchdir: $patchdir
+projbase: $projbase
+project: $project
+release: $release
+mainpkg: $mainpkg
+container: $container
+packages: $packages
+mode: $mode
+debuginfo: $debuginfo
+debuginfosuffix: $debuginfosuffix
+tags: $tags
+cmtconfig: $cmtconfig
+docfiles: $docfiles
+overwrite: $overwrite
+upgrade: $upgrade
+keep: $keep
+recursive: $recursive
+verify: $verify
+waiting: $waiting
+quiet: $quiet
+configure: $configure
+builddir: $builddir
+cmtcache: $cmtcache
+EOF
+}
+
+parse_bool ()
+{
+local i v
+for i; do
+    eval v=\$$i
+    case $v in [yY]*|1) eval $i=yes ;; *) eval $i=no ;; esac 
+done
+}
+
+config_read -e $scriptdir/defaults.cfg -i $HOME/.pack.cfg -w $PACKCFG || exit
+parse_opts $PACKOPTS "$@" || exit
+shift $#
+
+[ "${uname:-}" ] || uname=$(uname)
+
+[ -t 2 ] || printf "\n`version`\n\n" >&2
+
+parse_bool debuginfo docfiles overwrite upgrade keep recursive verify waiting quiet configure
+
+for pkg in $packages; do
+    pkg=`echo $pkg | sed -e 's#^[^/]#/&#' -e 's#[^/]$#&/#'`
+    if [ "$selected" ]; then
+	selected="$selected $pkg"
+    else selected=$pkg
+    fi
+done
+
+[ -z "$tags" ] || tags=$(tr -s ' \t' ',,' <<<"$tags" | sed 's/^,//;s/,$//')
+#config_dump; exit 18
+
+[ $(wc -w <<<"$container") -le 2 ] ||
+{ error "Wrong container package specification: '$container'\n\t(must be: [container-name [access-path]])" $FUNCNAME; exit 1; }
+[ "$container" ] && container=$(sed 's/[ \t]\+/ /g' <<<"$container")
+
+: ${project:?}
+[ $project = CMT ] || : ${release:?}
+#: ${release:?}
+#: ${projbase:?}
+
+#[ -d "$projbase" ] && { projbase=$(abspath $projbase) || exit; }
+: ${cmtcache:?}
+
+if [ "${debuginfo:-}" = yes ] && [ "${mode:-}" != dbg ]; then
+    [ -n "${debuginfosuffix:-}" ] || { error "'debuginfosuffix' must be non-empty" $FUNCNAME; exit 1; }
+fi
+
+_setuproot ()
+{
+setuproot=$(abspath $setuproot) || return
+export AtlasSetup=${setuproot}
+
+if [ -n "${projbase:-}" ]; then
+    if [ -d ${projbase} ]; then
+	cmtprojectpath=/afs/cern.ch/atlas/software/builds:/afs/cern.ch/atlas/project/tdaq/prod:/afs/cern.ch/atlas/offline/external
+####	_cmd=". $setuproot/scripts/asetup.sh ${project},${release},${mode},notest,ignore${tags:+,${tags}} --releasesarea=${projbase}:${cmtprojectpath} ${PROJRUNDBG:+--debugprint}"
+	_cmd=". $setuproot/scripts/asetup.sh ${project},${release},${mode},notest,ignore${tags:+,${tags}} ${cmtconfig:+--cmtconfig=${cmtconfig}} --releasebase=${projbase} ${PROJRUNDBG:+--debugprint}"
+    else
+	warn "${projbase}: No such directory" $FUNCNAME
+    fi
+    [ -d ${projbase}/${project}/${release} ] || unset projbase
+fi
+[ -n "${_cmd:-}" ] ||
+_cmd=". $setuproot/scripts/asetup.sh ${project},${release},${mode},notest,ignore,builds${tags:+,${tags}} ${cmtconfig:+--cmtconfig=${cmtconfig}} ${PROJRUNDBG:+--debugprint}"
+
+info "asetup command=${_cmd}" $FUNCNAME
+
+[ "$PROJRUNDBG" ] && set +x
+${_cmd} || { error "${_cmd}" $FUNCNAME; return 1; }
+[ "$PROJRUNDBG" ] && set -x
+
+if [ -n "${projbase:-}" ]; then
+    for p in $(echo $cmtprojectpath | tr -s ':' ' '); do
+	path_append CMTPROJECTPATH $p
+    done
+    path_prepend CMTPROJECTPATH ${projbase}
+fi
+
+if [ -z "${projbase:-}" ]; then
+    for _path in `echo "${CMTPATH:-}" | tr -s ':' ' '`; do
+	if [ -d ${_path} ]; then
+	    [ ${release} = $(basename ${_path}) ] || continue
+	    _p=$(dirname ${_path}) || return
+	    [ ${project} = $(basename ${_p}) ] || continue
+	    projbase=$(dirname ${_p}) || return
+	    #projbase=$(dirname $(dirname ${_p})) || return
+	    break
+	else
+	    warn "${_path}: No such directory" $FUNCNAME
+	fi
+    done
+fi
+unset CMTPATH
+if [ -z "${projbase:-}" ]; then
+    for _p in `echo "${CMTPROJECTPATH:-}" | tr -s ':' ' '`; do
+	if [ -d ${_p}/${project}/${release} ]; then
+	    projbase=${_p} || return
+	    break
+	else
+	    warn "${_p}: No such directory" $FUNCNAME
+	fi
+    done
+fi
+[ -n "${projbase:-}" ] ||
+{ error "${project} ${release}: Cannot locate" $FUNCNAME; return 2; }
+
+#asetup LCGCMT,LCGCMT_59,builds,notest --releasebase=/afs/cern.ch/atlas/software/builds
+#asetup LCGCMT,LCGCMT_59,builds,notest --releasebase=/afs/cern.ch/atlas/offline/external
+#asetup LCGCMT,LCGCMT_59,builds,notest
+#asetup LCGCMT,LCGCMT_59,notest --releasebase=/afs/cern.ch/atlas/offline/external
+
+#> cmt version                                                        v1r22
+#> echo $CMTCONFIG
+# i686-slc5-gcc43-opt
+#> echo $CMTPROJECTPATH
+# /afs/cern.ch/atlas/software/builds:/afs/cern.ch/atlas/project/tdaq/prod:/afs/cern.ch/atlas/offline/external
+#> echo $CMTEXTRATAGS 
+# ATLAS
+#> echo $CMTSITE 
+# CERN
+
+#asetup AtlasConditions,16.3.0,builds,notest,ignore,noruntime
+#source $AtlasSetup/scripts/asetup.sh AtlasConditions,16.3.0,builds,notest,ignore,noruntime
+#. $setuproot/scripts/asetup.sh AtlasConditions,16.3.0,builds,notest,ignore,noruntime
+#asetup 16.2.0,builds,notest --releasebase=/afs/cern.ch/atlas/software/builds
+}
+
+_cmthome ()
+{
+cmthome=$(abspath $cmthome) || exit
+cd ${cmthome} || return 1
+unset CMTPATH CMTPROJECTPATH
+unset CMTROOT CMTSITE
+if [ $project == AtlasRelease ]; then
+    [ "$PROJRUNDBG" ] && set +x
+    . ${cmthome}/setup.sh -tag=${release},${mode},noTest${tags:+,${tags}} || exit 1
+    [ "$PROJRUNDBG" ] && set -x
+    if [ -z ${projbase} ]; then
+	projbase=`cmt -q show macro_value ATLAS_DIST_AREA`
+	: ${projbase:?}
+    else
+	export CMTPATH=$(sed 's#^:*[^:]*#'${projbase}/${release}'#' <<<"$CMTPATH")
+    fi
+    [ -d ${projbase}/${release} ] || 
+    { error "${projbase}/${release} must exist and be a directory" $FUNCNAME; exit 1; }
+
+elif [ $project == LCGCMT -o $project == Gaudi ]; then
+    [ "$PROJRUNDBG" ] && set +x
+    . ${cmthome}/setup.sh -tag=${mode},noTest${tags:+,${tags}} || exit 1
+    [ "$PROJRUNDBG" ] && set -x
+    if [ -z ${projbase} ]; then
+	projbase=`cmt -q show macro_value EXTERNAL_PROJECT_AREA`
+	: ${projbase:?}
+    fi
+    [ -d ${projbase}/${project}/${release} ] ||
+    { error "${projbase}/${project}/${release}: No such directory" $FUNCNAME; exit 1; }
+#    export CMTPATH=${projbase}/${project}/${release}
+#    export CMTPROJECTPATH=${projbase}
+    path_prepend CMTPROJECTPATH ${projbase}
+    export CMTPROJECTPATH
+    unset CMTHOME
+    unset CMTPATH
+
+elif [ $project == CMT ]; then
+    [ "$PROJRUNDBG" ] && set +x
+    . ${cmthome}/setup.sh -tag=${mode},noTest${tags:+,${tags}} || exit 1
+    [ "$PROJRUNDBG" ] && set -x
+    cmtinfo=(`cmt show uses | awk '
+$1 == "use" && $2 == "CMT" { gsub(/[()]/, "", $4); print $4, $3; exit }
+'`)
+    [ ${#cmtinfo[*]} -eq 2 ] || 
+    { error "Wrong CMT info: ${cmtinfo[*]}" $FUNCNAME; exit 1; }
+    [ -z ${projbase} ] && { projbase=${cmtinfo[0]}; : ${projbase:?}; }
+    [ -z ${release} ] && { release=${cmtinfo[1]}; : ${release:?}; }
+
+    [ -d ${projbase}/${project}/${release} ] || 
+    { error "${projbase}/${project}/${release}: No such directory" $FUNCNAME; exit 1; }
+    #{ warn "${projbase}/${project}/${release}: No such directory" $FUNCNAME; }
+    export CMTPROJECTPATH=${projbase}
+    unset CMTHOME
+    unset CMTPATH
+
+else
+    [ "$PROJRUNDBG" ] && set +x
+    . ${cmthome}/setup.sh -tag=${project},${release},${mode},noTest,builds${tags:+,${tags}} || exit 1
+    [ "$PROJRUNDBG" ] && set -x
+    if [ -z ${projbase} ]; then
+	projbase=`echo $CMTPROJECTPATH | sed 's#^:\+##' | cut -d: -f1`
+	: ${projbase:?}
+    else
+	#export CMTPATH=${projbase}/${project}/${release}
+	#export CMTPROJECTPATH=$(sed 's#^:*[^:]*#'${projbase}'#' <<<"$CMTPROJECTPATH")
+	path_prepend CMTPROJECTPATH ${projbase}
+	export CMTPROJECTPATH
+    fi
+    unset CMTHOME
+    unset CMTPATH
+    [ -d ${projbase}/${project}/${release} ] || 
+    { error "${projbase}/${project}/${release}: No such directory" $FUNCNAME; exit 1; }
+fi
+cd $OLDPWD
+}
+
+if [ $project = CMT ]; then
+    unset setuproot
+    [ "${cmthome:-}" ] ||
+    { error "cmthome must be set" $FUNCNAME; exit 1; }
+fi
+
+if [ "${setuproot:-}" ]; then
+    _setuproot || exit
+elif [ "${cmthome:-}" ]; then
+    warn "Obsolete cmthome use" $FUNCNAME
+    _cmthome || exit
+else
+    error "Neither cmthome or setuproot set" $FUNCNAME; exit 1
+fi
+
+: ${CMTCONFIG:?}
+
+[ -z "$pacmancache" ] || pacmancache=$(abspath $pacmancache) || exit
+
+if [ -z "$externcache" ]; then
+    [ ! -d "$pacmancache" ] &&
+    { error "pacmancache or externcache must exist and be a directory" $FUNCNAME; exit 1; }
+    info "setting externcache to pacmancache=$pacmancache" $FUNCNAME; externcache=$pacmancache
+fi
+[ -d "$externcache" ] || { error "externcache=$externcache must exist and be a directory" $FUNCNAME; exit 1; }
+
+if [ -z "$projcache" ]; then
+    [ ! -d "$pacmancache" ] &&
+    { error "pacmancache or projcache must exist and be a directory" $FUNCNAME; exit 1; }
+    info "setting projcache to pacmancache=$pacmancache" $FUNCNAME; projcache=$pacmancache
+fi
+[ -d "$projcache" ] || { error "projcache=$projcache must exist and be a directory" $FUNCNAME; exit 1; }
+
+#[ -d "$pacmancache" ] || { error "$pacmancache must exist and be a directory" $FUNCNAME; exit 1; }
+
+for i in rpmdir externdir projdir; do
+    eval d=\$$i
+    if [ "$d" ]; then
+	[ -d "$d" ] || { error "$d: No such directory" $FUNCNAME; exit 1; }
+	eval export $i=$(abspath $d) || exit
+	[ "$PACKRPM" ] || export PACKRPM=$(dirname $scriptdir)/share
+    fi
+done
+
+if [ -z "$rpmdir" ]; then
+    if [ "$externdir" ] && [ -z "$projdir" ]; then
+	info "setting rpmdir to externdir=$externdir" $FUNCNAME
+	export rpmdir=$(abspath $externdir) || exit
+    elif [ -z "$externdir" ] && [ "$projdir" ]; then
+	info "setting rpmdir to projdir=$projdir" $FUNCNAME
+	export rpmdir=$(abspath $projdir) || exit
+    fi
+fi
+
+[ -d "$patchdir" ] || { error "patchdir=$patchdir must exist and be a directory" $FUNCNAME; exit 1; }
+
+[ -d "$logdir" ] || { error "logdir=$logdir must exist and be a directory" $FUNCNAME; exit 1; }
+
+# Make paths absolute
+for i in logdir externcache projcache patchdir projbase; do
+    eval v=\$$i; eval $i=$(abspath $v) || exit
+done
+[ -z "$builddir" ] || builddir=$(abspath $builddir) || exit
+
+if [ "$configure" == yes ]; then
+    config_dump
+    exit
+fi
+
+# Create auxiliary directories and files
+#[ -d $pacmancache/kits ] || mkdir $pacmancache/kits || exit 1
+#[ -d $pacmancache/cache ] || mkdir $pacmancache/cache || exit 1
+
+[ -d $externcache/kits ] || mkdir $externcache/kits || exit 1
+[ -d $externcache/cache ] || mkdir $externcache/cache || exit 1
+
+[ -d $projcache/kits ] || mkdir $projcache/kits || exit 1
+[ -d $projcache/cache ] || mkdir $projcache/cache || exit 1
+
+[ -d "$logdir/$project/$release" ] || mkdir -p $logdir/$project/$release || exit 1
+logfile=$logdir/$project/$release/`basename $0 .sh`-${CMTCONFIG}.log
+
+#TMPLOG=$(mktemp -t tmp.XXXXXXXXXX) || exit 1
+#mv --backup=t $TMPLOG $logfile || exit 1
+#chmod +r $logfile
+_backup ()
+{
+for f; do
+  [ -f "$f" ] || continue
+  i=1
+  while [ -f ${f}.~${i}~ ]; do
+    i=$(expr ${i} + 1) || { error "expr" $FUNCNAME; return 1; }
+  done
+  mv $f ${f}.~${i}~ || { error "mv" $FUNCNAME; return 1; }
+done
+}
+
+_backup $logfile || exit 1
+
+main ()
+{
+info "Start `date`\t@ `hostname`" $FUNCNAME
+
+[ -z "$mainpkg" -a $project == AtlasRelease ] && mainpkg=AtlasRelease
+: ${mainpkg:?}
+cd $projbase/${release}/$mainpkg/*/cmt || exit 1
+
+info "Start packing from `pwd -P`" $FUNCNAME
+
+if [ "$selected" ]; then
+#    cmd="pacmancache=${pacmancache} patchdir=${patchdir} overwrite=${overwrite} platform=${platform} cmt -quiet broadcast -global -select='${selected}' - ${scriptdir}/pack-extern.sh"
+    cmd="externcache=${externcache} patchdir=${patchdir} overwrite=${overwrite} cmt broadcast -global -select='${selected}' - ${scriptdir}/pack-extern.sh"
+    info "$cmd" $FUNCNAME
+    eval $cmd
+else
+    requires=$(mktemp -t tmp.XXXXXXXXXX) || return 1
+
+#    cmd="pacmancache=${pacmancache} patchdir=${patchdir} overwrite=${overwrite} platform=${platform} cmt -quiet broadcast -global - ${scriptdir}/pack-extern.sh"
+    cmd="externcache=${externcache} patchdir=${patchdir} overwrite=${overwrite} cmt broadcast -global - ${scriptdir}/pack-extern.sh"
+    info "$cmd" $FUNCNAME
+    eval $cmd | tee -a ${requires} || { error "tee" $FUNCNAME; return 1; }
+    sed '/^#/d' ${requires} >${requires}.tmp || { error "sed" $FUNCNAME; return 1; }
+    mv -f ${requires}.tmp ${requires} || { error "mv" $FUNCNAME; return 1; }
+#    sed -i '/^#/d' ${requires}
+
+    cmd="projbase=${projbase} project=${project} release=${release} projcache=${projcache} upgrade=${upgrade} mode=${mode} debuginfo=${debuginfo} debuginfosuffix=${debuginfosuffix} docfiles=${docfiles} builddir=${builddir} cmthome=${cmthome} uname=${uname} setuproot=${setuproot} ${scriptdir}/pack-proj.sh"
+    info "$cmd" $FUNCNAME
+    eval requires=${requires} $cmd
+
+    rm -f ${requires} || return 0
+
+fi
+
+info "Finish `date`\t@ `hostname`" $FUNCNAME
+}
+
+proj ()
+{
+info "Start `date`\t@ `hostname`" $FUNCNAME
+
+cmd="selected='$selected' projbase=${projbase} project=${project} release=${release} container='${container}' projcache=${projcache} upgrade=${upgrade} mode=${mode} debuginfo=${debuginfo} debuginfosuffix=${debuginfosuffix} docfiles=${docfiles} builddir=${builddir} cmthome=${cmthome} setuproot=${setuproot} externcache=${externcache} patchdir=${patchdir} overwrite=${overwrite} keep=$keep recursive=$recursive relocate=yes verify=$verify cmtcache=$cmtcache waiting=$waiting quiet=$quiet uname=${uname} ${scriptdir}/pack-proj.sh"
+    info "$cmd" $FUNCNAME
+    eval $cmd
+
+local retval=$? 
+info "Finish `date`\t@ `hostname`" $FUNCNAME
+return $retval
+}
+
+# Do the packing
+printf "\n`version`\n\n" >>$logfile
+case $quiet in
+    no) info "Current configuration:\n`config_dump`" $FUNCNAME 2>&1 | tee -a $logfile ;;
+    yes) info "Current configuration:\n`config_dump`" $FUNCNAME >>$logfile 2>&1 ;;
+    *) error "Invalid value: quiet: $quiet" $FUNCNAME ;;
+esac
+
+if [ $project == AtlasRelease ]; then
+    { time main; } >>$logfile 2>&1 &
+# elif [ $project == LCGCMT ]; then
+#     { time extern_proj; } >>$logfile 2>&1 &
+else
+
+case $waiting in
+    no) case $quiet in
+	    no) { time proj; } >>$logfile 2>&1 &
+	        info "`date`\tPID: $!\t@ `hostname`" $FUNCNAME ;;
+            yes) { time proj; } >>$logfile 2>&1 & ;;
+            *) error "Invalid value: quiet: $quiet" $FUNCNAME ;;
+        esac ;;
+    yes) case $quiet in
+            no) info "`date`\tPID: $$\t@ `hostname`" $FUNCNAME
+	        { time proj; } 2>&1 | tee -a $logfile ;;
+	    yes) { time proj; } >>$logfile 2>&1; retval=$? ;;
+	    *) error "Invalid value: quiet: $quiet" $FUNCNAME ;;
+	 esac ;;
+esac
+
+fi
+
+info "\n\nLog file: $logfile" $FUNCNAME
+
+exit $retval
diff --git a/PackDist/scripts/relink.py b/PackDist/scripts/relink.py
new file mode 100755
index 00000000000..74af744eb85
--- /dev/null
+++ b/PackDist/scripts/relink.py
@@ -0,0 +1,299 @@
+#!/usr/bin/env python
+
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+"""File: relink.py
+
+Developed against Python 2.2
+"""
+
+__version__ = '0.6.0'
+__date__ = 'Thu Oct 27 2011'
+__author__  = 'Grigori Rybkine <Grigori.Rybkine@cern.ch>'
+
+import os, sys
+import getopt
+import shutil
+
+def cwd():
+    _cwd = os.getenv('PWD')
+    _gcwd = os.getcwd()
+    if _cwd and os.path.samefile(_cwd, _gcwd):
+        return _cwd
+    else:
+        return _gcwd
+
+def cd(path):
+    new = os.path.normpath(os.path.join(cwd(), path))
+    os.chdir(path)
+    _gcwd = os.getcwd()
+    if os.path.samefile(new, _gcwd):
+        os.environ['PWD'] = new
+    else:
+        os.environ['PWD'] = _gcwd
+
+def commonhead(list1, list2):
+    c = -1
+    for i in xrange(min(len(list1), len(list2))):
+        if list1[i] == list2[i]: c = i
+        else: break
+    #if c > -1: print >> sys.stderr, 'commonhead:', c, list1, list2
+    return list1[:c + 1]
+
+#def relink(path, v = False):
+def relink(path, Arg = (None, False)):
+    """Convert absolute link `path' (within current directory, to file in PROJ_SRC) to relative link.
+    
+    Current directory is a copy of (a part of) PROJ_SRC.
+    Remove `path' if it is a dangling link, or points to a file outside PROJ_SRC.
+    If the conversion results in a dangling link, replace `path' with a copy
+    in case it originally pointed to a regular file in PROJ_SRC,
+    create the empty target directory in case it originally pointed to a directory.
+    """
+    if not os.path.islink(path): return
+
+    exps = Arg[0]
+    v = Arg[1]
+
+    path = os.path.normpath(path)
+    s = os.readlink(path)
+    snorm = os.path.normpath(s)
+    p = os.path.join(PROJ_SRC, path)
+    hatpath = os.path.join(PROJ_HAT, path)
+
+    if snorm.startswith(PROJ_SRC + os.sep):
+        srcpath = snorm[len(PROJ_SRC + os.sep):]
+
+        pathl = path.split(os.sep)
+        srcpathl = srcpath.split(os.sep)
+        head = commonhead(pathl, srcpathl)
+
+        if len(pathl) > len(head) + 1 or \
+            len(pathl) == len(head) + 1 and len(srcpathl) > len(head):
+            # pathl:    o o o a b            # pathl:    o o o a
+            # srcpathl: o o o c d e          # srcpathl: o o o c d e
+            # head:     o o o          or    # head:     o o o
+            # ---------------------          # ---------------------
+            # src:      ../c/d/e             # src:      c/d/e
+            srcl = [os.pardir for i in xrange(len(pathl) - 1 - len(head))] + srcpathl[len(head):]
+            src = os.path.join(*srcl)
+        elif len(pathl) == len(head) + 1 and len(srcpathl) == len(head):
+            # pathl:    o o o a
+            # srcpathl: o o o
+            # head:     o o o
+            # ---------------------
+            # src:      .
+            src = os.curdir
+            if v: print >> sys.stderr, 'detected symlink to current directory', `hatpath`, '->', `src`
+        elif len(pathl) == len(head):
+            src = os.path.join(*srcpathl[len(head) - 1:])
+            if len(srcpathl) == len(head):
+                # pathl:    o o a
+                # srcpathl: o o a
+                # ---------------------
+                # src:      a
+                if v: print >> sys.stderr, 'detected symlink to itself', `hatpath`, '->', `src`
+            else:
+                # pathl:    o o a
+                # srcpathl: o o a c
+                # ---------------------
+                # src:      a/c
+                if v: print >> sys.stderr, 'detected too many levels of symlinks', `hatpath`, '->', `src`
+        else:
+            print >> sys.stderr, 'detected UNFORESEEN', `path`, '->', `srcpath`
+            return
+
+        _srcpath = os.path.normpath(os.path.join(os.path.dirname(path), src))
+        assert srcpath == _srcpath, '%s:\n%s not equal to %s' % (path, `srcpath`, `_srcpath`)
+
+        os.remove(path)
+        if os.path.isfile(srcpath) or os.path.isdir(srcpath):
+            try:
+                os.symlink(src, path)
+            except (IOError, os.error), why:
+                print >> sys.stderr, 'Cannot symlink %s -> %s: %s' % (`hatpath`, `src`, str(why))
+            else:
+                if v: print 'symlinked', `hatpath`, '->', `src`
+        else:
+            if os.path.isfile(s):
+                print >> sys.stderr, 'missing:', hatpath, '->', src
+                try:
+                    shutil.copy2(s, path)
+                except (IOError, os.error), why:
+                    print >> sys.stderr, 'Cannot copy %s -> %s: %s' % (`s`, `hatpath`, str(why))
+                else:
+                    if v: print >> sys.stderr, 'copied', `s`, '->', `hatpath`
+            elif os.path.isdir(s):
+                print >> sys.stderr, 'missing:', hatpath, '->', src
+                try:
+                    os.makedirs(srcpath)
+                except (IOError, os.error), why:
+                    print >> sys.stderr, 'Cannot create directory %s: %s' % (`os.path.join(PROJ_HAT, srcpath)`, str(why))
+                else:
+                    if v: print >> sys.stderr, 'created directory', `os.path.join(PROJ_HAT, srcpath)`
+                try:
+                    os.symlink(src, path)
+                except (IOError, os.error), why:
+                    print >> sys.stderr, 'Cannot symlink %s -> %s: %s' % (`hatpath`, `src`, str(why))
+                else:
+                    if v: print 'symlinked', `hatpath`, '->', `src`
+            else:
+                print >> sys.stderr, 'dangling:', p, '->', s
+                if v: print >> sys.stderr, 'removed', `hatpath`
+#    elif os.path.normpath(os.path.join(os.path.dirname(p), s)).startswith(PROJ_SRC + os.sep):
+    else:
+        srcpath = os.path.normpath(os.path.join(os.path.dirname(p), s))
+#        os.path.normpath(os.path.join(os.path.dirname(p), s)).startswith(PROJ_SRC + os.sep):
+        if srcpath.startswith(PROJ_SRC + os.sep):
+            if os.path.isfile(path) or os.path.isdir(path):
+                if v: print 'relative:', hatpath, '->', s
+            else:
+                if os.path.isfile(p) or os.path.isdir(p):
+                    print >> sys.stderr, 'missing:', hatpath, '->', s
+                else:
+                    print >> sys.stderr, 'dangling:', p, '->', s
+                os.remove(path);
+                if v: print >> sys.stderr, 'removed', `hatpath`
+        else:
+            if os.path.isfile(p) or os.path.isdir(p):
+                if exps:
+                    dst = exps.destination(srcpath)
+                    if dst:
+                        upl = [os.pardir for i in xrange(len(hatpath.split(os.sep)) - 1)]
+                        src = os.path.join(os.path.join(*upl), dst)
+                        os.remove(path)
+                        try:
+                            os.symlink(src, path)
+                        except (IOError, os.error), why:
+                            print >> sys.stderr, 'Cannot symlink %s -> %s: %s' % (`hatpath`, `src`, str(why))
+                        else:
+                            if v: print 'symlinked', `hatpath`, '->', `src`
+                    else:
+                        print >> sys.stderr, 'not_exported:', srcpath
+                        #print >> sys.stderr, 'not_exported:', hatpath, '->', s
+                        os.remove(path);
+                        #if v: print >> sys.stderr, 'removed', `hatpath`
+                        if v: print >> sys.stderr, 'removed', `hatpath`, '->', `s`
+                else:
+                    print >> sys.stderr, 'external:', hatpath, '->', s
+                    os.remove(path);
+                    if v: print >> sys.stderr, 'removed', `hatpath`
+            else:
+                print >> sys.stderr, 'dangling:', p, '->', s
+                os.remove(path);
+                if v: print >> sys.stderr, 'removed', `hatpath`
+
+#def doTree(top = cwd(), v = True):
+def doTree(top = cwd(), v = (None, True)):
+    global PROJ_SRC, PROJ_HAT
+    PROJ_SRC = os.path.normpath(os.path.join(cwd(), os.environ['projsrc']))
+    PROJ_HAT = os.path.normpath(os.environ['projhat'])
+
+    assert os.path.normpath(os.path.join(cwd(), top)).endswith(PROJ_HAT), '%s: Parent directory not %s' % (top, `PROJ_HAT`)
+
+    def doList(v, dirpath, filenames):
+        #print  >> sys.stderr, dirpath, filenames
+        for filename in filenames:
+            path = os.path.join(dirpath, filename)
+            #print >> sys.stderr, path
+            if os.path.islink(path):
+                relink(path, v)
+
+    curdir = cwd()
+    cd(top)
+
+    os.path.walk(os.curdir, doList, v)
+
+    cd(curdir)
+
+#if __name__ == '__main__':
+    #fout = file(os.path.basename(sys.argv[0]) + '.out', 'w')
+    #sys.stdout = fout
+    #ferr = file(os.path.basename(sys.argv[0]) + '.err', 'w')
+    #sys.stderr = ferr
+#    if len(sys.argv) > 1:
+#        for arg in sys.argv[1:]: doTree(arg)
+#    else: doTree()
+
+class ExportPaths(object):
+    def __init__(self, path):
+            f = open(path)
+            self.paths = {}
+            for l in f:
+                i = l.split()
+                assert len(i) == 2, '%s: %s: Wrong line format' % (path, `l`)
+                #i = [os.path.normpath(p) for p in i]
+                i[0] = os.path.realpath(i[0])
+                i[1] = os.path.normpath(i[1])
+                if i[0] in self.paths:
+                    if i[1] == self.paths[i[0]]:
+                        print >>sys.stderr, '%s %s: Duplicate export path' % \
+                              (i[0], i[1])
+                    else:
+                        print >>sys.stderr, '%s %s, %s: Redundant export paths' % \
+                              (i[0], self.paths[i[0]], i[1])
+                self.paths[i[0]] = i[1]
+            f.close()
+
+    def destination(self, path):
+#        pathl = path.lstrip(os.sep).split(os.sep)
+        pathl = os.path.realpath(path).lstrip(os.sep).split(os.sep)
+        for s, d in self.paths.iteritems():
+            sl = s.lstrip(os.sep).split(os.sep)
+#            sl = os.path.realpath(s).lstrip(os.sep).split(os.sep)
+            head = commonhead(sl, pathl)
+#            print >>sys.stderr, 'destination: %s %s: %s' % \
+#                  (str(sl), str(pathl), str(head))
+            if len(sl) == len(head):
+                return os.path.join(*(d.split(os.sep) + pathl[len(sl):]))
+            elif len(pathl) == len(head):
+                dl = d.lstrip(os.sep).split(os.sep)
+                if len(dl) + len(pathl) - len(sl) > 0:
+                    return os.path.join(*(dl[:len(dl) + len(pathl) - len(sl)]))
+        return None
+
+def main(argv=[__name__]):
+    self = os.path.basename(argv[0])
+    try:
+        opts, args = getopt.getopt(argv[1:],
+                                   "hS:H:X:",
+                                   ["help", "version", "project-src=", "project-hat=",
+                                    "export-paths-from="])
+    except getopt.error, e:
+        print >>sys.stderr, '%s: %s' % (self, str(e))
+        print >>sys.stderr, "Try '%s --help' for more information." % self
+        return 1
+
+    for o, v in opts:
+        if o in ("-h", "--help"):
+            print sys.modules[__name__].__doc__
+            return 0
+        elif o in ("--version",):
+            print '%s %s (%s)' % (self, __version__, __date__)
+            print '%sWritten by %s.' % (os.linesep, __author__)
+            return 0
+        elif o in ("-S", "--project-src"):
+            os.environ['projsrc'] = v.rstrip(os.sep)
+        elif o in ("-H", "--project-hat"):
+            os.environ['projhat'] = v.strip(os.sep)
+        elif o in ("-X", "--export-paths-from"):
+            export_paths = ExportPaths(v)
+
+#    if not args:
+#        print >>sys.stderr, '%s: missing path argument' % self
+#        print >>sys.stderr, "Try '%s --help' for more information." % self
+#        return 1
+
+    try:
+        Arg = (export_paths, True)
+    except NameError:
+        Arg = (None, True)
+
+#    print >> sys.stderr, Arg
+#    return 17
+
+    if args:
+        for arg in args: doTree(arg, Arg)
+    else: doTree(cwd(), Arg)
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
diff --git a/PackDist/scripts/requirements.template b/PackDist/scripts/requirements.template
new file mode 100755
index 00000000000..fb2f8237699
--- /dev/null
+++ b/PackDist/scripts/requirements.template
@@ -0,0 +1,47 @@
+#
+# !!! DO NOT EDIT - GENERATED AUTOMATICALLY !!!
+#
+# Usage:
+# 
+# . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=<project>,<release>[,<cmtconfig>]
+#
+# or
+#
+# export ATLAS_TEST_AREA=<path-to-your-development-area>
+# . @INSTALL_PREFIX@/cmtsite/setup.sh -tag=<project>,<release>,<type>[,<cmtconfig>]
+#
+# where <type> is one of the following: simpleTest, oneTest, projectTest
+#
+# Two additional styles of override of the default CMTCONFIG value are possible:
+#   1. Specifying the forceConfig tag on the command line in which case the CMTCONFIG
+#      environment variable is used to setup the build and runtime environments
+#   2. Specifying a subset of the opt/dbg, gcc34/gcc43, 32/64 and slc4/slc5 tags on
+#      the command line, in which case the default configuration will be overridden
+#      accordingly.
+# 
+# Report bugs to <hn-atlas-releaseKitProblem@cern.ch>.
+#
+
+set CMTSITE STANDALONE
+set SITEROOT @INSTALL_PREFIX@
+
+macro ATLAS_DIST_AREA ${SITEROOT}
+
+apply_tag noTest
+tag_exclude simpleTest noTest
+tag_exclude oneTest noTest
+tag_exclude projectTest noTest
+
+apply_tag projectArea
+macro SITE_PROJECT_AREA ${SITEROOT}
+macro EXTERNAL_PROJECT_AREA ${SITEROOT}
+
+use AtlasLogin AtlasLogin-* $(ATLAS_DIST_AREA)
+
+#
+# This will be overridden by a known CMTCONFIG value (i.e. listed below),
+# if set via AtlasLogin above
+#
+macro cmtconfig_default @CMTCONFIG@
+
+set CMTCONFIG $(cmtconfig_default)
diff --git a/PackDist/scripts/src.ptn b/PackDist/scripts/src.ptn
new file mode 100755
index 00000000000..ed95aae52f8
--- /dev/null
+++ b/PackDist/scripts/src.ptn
@@ -0,0 +1,19 @@
+src/*.c
+*src/*.cc
+src/*.cxx
+*.cpp
+*.f
+*.F
+*.f90
+*.F90
+*.FF90
+*.y
+*.l
+configure
+*.in
+*.age
+test/*.cxx
+srctest/*.cxx
+pool/*.cxx
+pool_plugins/*.cxx
+cpp_any/*.cxx
diff --git a/PackDist/share/bin/pack-rpm-extern.sh b/PackDist/share/bin/pack-rpm-extern.sh
new file mode 100644
index 00000000000..6375b0e7c2b
--- /dev/null
+++ b/PackDist/share/bin/pack-rpm-extern.sh
@@ -0,0 +1,2 @@
+
+    $PACKRPM/bin/pack-rpm.py "$name $package $version $platform" "$tmpreq" "" "" $(_getver $name) "${src[*]}" "${dst[*]}"
diff --git a/PackDist/share/bin/pack-rpm-proj.sh b/PackDist/share/bin/pack-rpm-proj.sh
new file mode 100644
index 00000000000..51c3f78b736
--- /dev/null
+++ b/PackDist/share/bin/pack-rpm-proj.sh
@@ -0,0 +1,10 @@
+
+	if [ ${pltfm} == bin ]; then
+	    cmtver=$(awk '$2 == "CMT" { print $3; exit }' ${tmpreq}) || return 1
+	    _pre ${1} ${2} ${3} >|${tmppre} || return 1
+	    _post ${1} ${2} ${3} >|${tmppost} || return 1
+	    _preun ${1} ${2} ${3} >|${tmppreun} || return 1
+	    $PACKRPM/bin/pack-rpm.py "$name ${2} ${3} $pltfm" $tmpreq ${tmppost} ${tmppre} $(_getver $name) "" "" ${tmppreun} || return 1
+	else
+	    $PACKRPM/bin/pack-rpm.py "$name ${2} ${3} $pltfm" $tmpreq "" "" $(_getver $name) || return 1
+	fi
diff --git a/PackDist/share/bin/pack-rpm-settings.sh b/PackDist/share/bin/pack-rpm-settings.sh
new file mode 100644
index 00000000000..7be95047db4
--- /dev/null
+++ b/PackDist/share/bin/pack-rpm-settings.sh
@@ -0,0 +1,7 @@
+
+if [ ${pkg[0]} = AtlasSetup ]; then
+    _pre ${pkg[2]}/${pkg[0]} ${pkg[0]} ${pkg[1]} >|${tmppre}
+else
+    _pre ${pkg[2]}/${pkg[0]}/${pkg[1]} ${pkg[0]} ${pkg[1]} >|${tmppre}
+fi
+    $PACKRPM/bin/pack-rpm.py "$name ${pkg[0]} ${pkg[1]} noarch" "" "" ${tmppre} $(_getver $name)
diff --git a/PackDist/share/bin/pack-rpm.py b/PackDist/share/bin/pack-rpm.py
new file mode 100755
index 00000000000..9d876dc1f3c
--- /dev/null
+++ b/PackDist/share/bin/pack-rpm.py
@@ -0,0 +1,396 @@
+#!/usr/bin/env python
+"""File: pack-rpm.py
+
+This script builds (binary) rpm package
+based on meta-data provided and from a tarball built
+by the PackDist package.
+"""
+
+__version__ = '0.11.0'
+__date__ = 'Thu Dec 06 2012'
+__author__  = 'Grigori Rybkine <Grigori.Rybkine@cern.ch>'
+
+#
+# Write spec file and build (binary) rpm package
+#
+# Parameters: 'name package/project version [architecture]' ['requires-file'
+# ['postinstall-script' ['preinstall-script' ['version' ['source-paths' 'destination-paths'
+# ['preuninstall-script']]]]]]
+#
+
+import sys, os
+import re
+import commands
+
+try:
+    __path__ = [os.path.join(os.path.dirname(sys.modules[__name__].__file__), os.pardir, 'python')]
+except AttributeError, e:
+    # with Python 2.2.3, sys.modules['__main__']
+    # AttributeError: 'module' object has no attribute '__file__': even for scripts
+    if __name__ == '__main__':
+        __path__ = [os.path.join(os.path.dirname(sys.argv[0]), os.pardir, 'python')]
+    else:
+        raise
+from PackDistCommon import *
+
+def _getver(name, default='', type=None):
+    fpath = os.path.join(os.environ['projcache'], 'specs', name + '.spec')
+    if not os.access(fpath, os.R_OK): return default
+    s = file(fpath).read()
+    p = r'version[ \t]*:[ \t]*(?P<ver>[\w.]+)'
+    m = re.search(p, s, re.I)
+    if m: return m.group('ver')
+    else: return default
+
+def info(message='', location=''):
+    if message: message = ': ' + message
+    if location: location += ': '
+    print >> sys.stderr, "%s: %sINFO%s" % (os.path.basename(sys.argv[0]), location, message)
+
+def warn(message='', location=''):
+    if message: message = ': ' + message
+    if location: location += ': '
+    print >> sys.stderr, "%s: %sWARNING%s" % (os.path.basename(sys.argv[0]), location, message)
+
+def error(message='', location=''):
+    if message: message = ': ' + message
+    if location: location += ': '
+    print >> sys.stderr, "%s: %sERROR%s" % (os.path.basename(sys.argv[0]), location, message)
+
+def rpmfile(name, version, release, arch, type=None):
+    cmd = 'rpm -D "NAME %s" -D "VERSION %s" -D "RELEASE %s" -D "ARCH %s" -E `rpm -E %%_rpmfilename`' % (name, version, release, arch)
+    status, rpmfilename = commands.getstatusoutput(cmd)
+    if status != 0:
+        error(rpmfilename, rpmfile.__name__)
+        raise CommandError(cmd, rpmfilename, exitstatus(status))
+    if type == 'extern': rpmdir = os.getenv('externdir')
+    elif type == 'proj': rpmdir = os.getenv('projdir')
+    else: rpmdir = None
+    if not rpmdir: rpmdir = os.getenv('rpmdir')
+    if not rpmdir:
+        cmd = 'rpm -E %_rpmdir'
+        status, rpmdir = commands.getstatusoutput(cmd)
+        if status != 0:
+            error(rpmdir, rpmfile.__name__)
+            raise CommandError(cmd, rpmfilename, exitstatus(status))
+    return (rpmdir, rpmfilename)
+
+def _getalien(requires):
+    reqs = []
+    for r in requires:
+        i = r.rfind(':')
+        if i != -1: reqs.append((r[0:i], r[i+1:]))
+    return reqs
+        
+def _buildalien(aliendeps, buildarch):
+    errs = list()
+    builddir = _builddir()
+    buildrootdir = _buildrootdir()
+    tmppath = _tmppath()
+    sourcedir = tmppath
+    suffix = '.tar.gz'
+    for d in aliendeps:
+        i = d[1].find('-')
+        if i == -1:
+            warn('%s %s: No name or version specified' % (d[0], d[1]),
+                 _buildalien.__name__)
+            continue
+        else:
+            _name = d[1][0:i]
+            _version = d[1][i + 1:]
+        if not _name:
+            warn('%s %s: Empty name specified' % (d[0], d[1]),
+                 _buildalien.__name__)
+            continue
+        if not _version:
+            warn('%s %s: Empty version specified' % (d[0], d[1]),
+                 _buildalien.__name__)
+            continue
+        try:
+            rpmdir, rpmfilename = rpmfile(d[1], _version.replace('-', '.'), '1', buildarch, 'extern')
+        except Error, e:
+            errs.append(e)
+            e.write()
+            continue
+        rpmpath = os.path.join(rpmdir, rpmfilename)
+        if os.path.isfile(rpmpath):
+            info('%s: File exists' % rpmpath)
+            continue
+        specpath = os.path.join(os.path.dirname(sys.argv[0]), os.pardir, 'specs', _name + '.spec')
+        if not os.path.isfile(specpath):
+            warn('%s: No such file' % specpath,
+                 _buildalien.__name__)
+            continue
+        _swversion = os.getenv('release')
+        if not _swversion:
+            _swversion = _version
+        source0 = os.path.join(sourcedir, d[1] + suffix)
+        if d[0].startswith('http://'):
+            cmd = '{ cd %s && wget %s; } >&2' % (sourcedir, os.path.join(d[0], d[1] + suffix))
+            status = os.system(cmd)
+            if status != 0:
+                errs.append(Error(_buildalien.__name__, cmd, exitstatus(status)))
+                error(cmd, _buildalien.__name__)
+                if os.path.exists(source0):
+                    os.remove(source0)
+                continue
+        else:
+            warn('%s %s: No source found' % (d[0], d[1]),
+                 _buildalien.__name__)
+            continue
+        
+        cmd = 'rpmbuild --define "_version %s" --define "_swversion %s" --define "_sourcedir %s" --define "_builddir %s" --define "_buildrootdir %s" --define "_rpmdir %s" --define "_tmppath %s" --target=%s -bb %s >&2' % (_version, _swversion, sourcedir, builddir, buildrootdir, rpmdir, tmppath, buildarch, specpath)
+        status = os.system(cmd)
+        if status != 0:
+            errs.append(Error(_buildalien.__name__, cmd, exitstatus(status)))
+            error(cmd, _buildalien.__name__)
+        os.remove(source0)
+
+    if errs: raise errs.pop()
+
+#macro AtlasDBRelease_requires "http://atlas.web.cern.ch/Atlas/GROUPS/DATABASE/pacman4/DBRelease:DBRelease-$(AtlasDBRelease_native_version)"
+
+def _tmppath():
+    #tmppath = os.getenv('builddir')
+    tmppath = os.getenv('TMPDIR') # should always be set
+    if not tmppath:
+        cmd = 'rpm -E %_tmppath'
+        status, tmppath = commands.getstatusoutput(cmd)
+        if status != 0:
+            #error(tmppath, rpmfile.__name__)
+            raise CommandError(cmd, tmppath, exitstatus(status))
+    return tmppath
+
+def _builddir():
+    builddir = os.getenv('builddir') # should always be set
+    if not builddir:
+        cmd = 'rpm -E %_builddir'
+        status, builddir = commands.getstatusoutput(cmd)
+        if status != 0:
+            #error(builddir, rpmfile.__name__)
+            raise CommandError(cmd, builddir, exitstatus(status))
+    return builddir
+
+def _buildrootdir():
+    buildrootdir = os.getenv('buildrootdir') # should always be set
+    if not buildrootdir:
+        cmd = 'rpm -E %_buildrootdir'
+        status, buildrootdir = commands.getstatusoutput(cmd)
+        if status != 0:
+            #error(buildrootdir, rpmfile.__name__)
+            raise CommandError(cmd, buildrootdir, exitstatus(status))
+    return buildrootdir
+
+def _specdir():
+    specdir = os.getenv('specdir') # should always be set
+    if not specdir:
+        cmd = 'rpm -E %_specdir'
+        status, specdir = commands.getstatusoutput(cmd)
+        if status != 0:
+            #error(specdir, rpmfile.__name__)
+            raise CommandError(cmd, specdir, exitstatus(status))
+    return specdir
+
+##################################### main ##########################################
+
+NPVA = sys.argv[1].split() # Name Package Version Architecture (CMTCONFIG noarch)
+                           # Name Project Release Architecture (bin src doc noarch)
+if len(NPVA) < 3:
+    error('%s: Too few parameters' % ' '.join(NPVA))
+    sys.exit(2)
+if len(NPVA) == 3:
+    NPVA.append(os.getenv('CMTCONFIG'))
+
+name = NPVA[0] # 'ROOT_3_10_02_0411_slc3_gcc323'
+
+if len(sys.argv) > 7 and sys.argv[6] and sys.argv[7]: # external software paths
+    type = 'extern'
+else:
+    type = 'proj'
+
+if len(sys.argv) > 5 and sys.argv[5]:
+    version = sys.argv[5]
+else:
+    try: version = str(int(_getver(name)) + 1)
+    except ValueError:
+        version = '1'
+        print >> sys.stderr, "%s: Version set to %s" % (name, version)
+        warn('%s: Set version to %s' % (name, version))
+        
+summary = ' '.join(NPVA[1:3]) #name #'ROOT'
+
+if NPVA[3] in ['src', 'doc', 'noarch']:
+    buildarch = 'noarch'
+else:
+    buildarch = os.getenv('CMTCONFIG').split('-')[0] #'i686'
+
+# add dependencies
+extradeps = ['atlas-filesystem']
+requires = extradeps
+if len(sys.argv) > 2 and sys.argv[2]:
+    reqfile = file(sys.argv[2])
+    requires += reqfile.read().splitlines()
+requires = [r.split()[0] for r in requires if r]
+
+retval = 0
+# try to build dependencies from external tarballs, if can be found
+try:
+    _buildalien(_getalien(requires), buildarch)
+except Error, e:
+    retval += 1
+
+requires = ', '.join([r[r.rfind(':') + 1:] for r in requires])
+
+rpmdir, rpmfilename = rpmfile(name, version, '1', buildarch, type)
+rpmpath = os.path.join(rpmdir, rpmfilename)
+if os.path.isfile(rpmpath):
+    info('%s: File exists' % rpmpath)
+    sys.exit(retval)
+
+# add provides, if needed
+provides = []
+#if len(sys.argv) > 7 and sys.argv[6] and sys.argv[7]: # external software paths
+if type == 'extern':
+    p = '_'.join([NPVA[1], NPVA[2], '_'.join(NPVA[3].split('-'))])
+    if p != NPVA[0] and p not in provides:
+        provides += [p]
+# IndexError: list index out of range
+provides = ', '.join(provides)
+
+# write spec file
+specinfile=file(os.path.join(os.path.dirname(sys.argv[0]), os.pardir, 'specs', 'proj.spec.in'))
+#IOError: [Errno 2] No such file or directory: '/data/rybkine/PAD/bin/specs/extern.spec.in'
+spec = specinfile.read() % vars()
+# KeyError: provides
+specinfile.close()
+
+if not requires:
+    spec = re.sub(r'(?mi)^requires[ \t]*:[ \t\S]*\n', '', spec)
+if not provides:
+    spec = re.sub(r'(?mi)^provides[ \t]*:[ \t\S]*\n', '', spec)
+
+# fill in %files section
+if type == 'extern': sourcedir = os.path.join(os.environ['externcache'], 'kits')
+elif type == 'proj': sourcedir = os.path.join(os.environ['projcache'], 'kits')
+else: sourcedir = None
+if not sourcedir:
+    error('No source directory specified')
+    sys.exit(2)
+
+source0 = os.path.join(sourcedir, name + '.tar.gz')
+if os.path.isfile(source0):
+    if len(sys.argv) > 7 and sys.argv[6] and sys.argv[7]: # external software paths
+        src = sys.argv[6].split()
+        dst = sys.argv[7].split()
+        paths = ''
+        for f in zip(src, dst):
+            if not (os.path.isfile(f[0]) or os.path.isdir(f[0])):
+                error("%s: No such file or directory" % f[0])
+                retval += 1
+            paths += os.path.join('%{prefix}', f[1]) + '\n'
+        if paths:
+            spec = spec.replace('%defattr(-,root,root,-)\n',
+                                '%defattr(-,root,root,-)\n' + paths)
+
+    elif len(NPVA) > 3: # projects, settings
+        if NPVA[3] == 'bin':
+            cmd = 'find . -noleaf -name ' + os.getenv('CMTCONFIG') + ' -prune -print >|$RPM_BUILD_DIR/files.txt\n'
+            cmd += '%{__sed} -i "s#^\\.#%%{prefix}#" $RPM_BUILD_DIR/files.txt\n'
+            spec = spec.replace('%{_fixperms} .\n', '%{_fixperms} .\n' + cmd)
+            spec = spec.replace('%files', '%files -f files.txt')
+        elif NPVA[3] == 'debuginfo':
+            cmd = 'find . -noleaf -name "*' + os.getenv('debuginfosuffix') + '" -print >|$RPM_BUILD_DIR/files.txt\n'
+            cmd += '%{__sed} -i "s#^\\.#%%{prefix}#" $RPM_BUILD_DIR/files.txt\n'
+            spec = spec.replace('%{_fixperms} .\n', '%{_fixperms} .\n' + cmd)
+            spec = spec.replace('%files', '%files -f files.txt')
+        elif NPVA[3] in ['src', 'doc']:
+            cmd = 'find . -noleaf \\( \\! -type d -o -empty \\) -print >|$RPM_BUILD_DIR/files.txt\n'
+            cmd += '%{__sed} -i "s#^\\.#%%{prefix}#" $RPM_BUILD_DIR/files.txt\n'
+            spec = spec.replace('%{_fixperms} .\n', '%{_fixperms} .\n' + cmd)
+            spec = spec.replace('%files', '%files -f files.txt')
+        elif NPVA[3] == 'noarch':
+            cmd = 'find . -noleaf -type d -name cmt -exec test -f \'{}\'/requirements \\; \
+-exec touch -a \'{}\'/setup.sh \'{}\'/setup.csh \'{}\'/cleanup.sh \'{}\'/cleanup.csh \\; \
+-not -exec test -f \'{}\'/Makefile \\; -exec %{__cp} -p $PACKRPM/specs/Makefile.cmt  \'{}\'/Makefile \\;\n'
+            spec = spec.replace('%{_fixperms} .\n', '%{_fixperms} .\n' + cmd)
+            if NPVA[1] == 'AtlasSetup':
+                # %{prefix}/NPVA[1]
+                paths = os.path.join('%{prefix}', NPVA[1]) + '\n'
+            else:
+                # %{prefix}/NPVA[1]/NPVA[2]
+                paths = os.path.join('%{prefix}', NPVA[1], NPVA[2]) + '\n'
+            spec = spec.replace('%defattr(-,root,root,-)\n',
+                                '%defattr(-,root,root,-)\n' + paths)
+        else:
+            error("%s: Unknown platform: %s %s %s" % NPVA[3], NPVA[0], NPVA[1], NPVA[2])
+            sys.exit(1)
+    else:
+        error("%s: Cannot build file list: %s" % source0, sys.argv[1])
+        sys.exit(1)
+else:
+    warn("%s: No such file" % source0)
+    spec = re.sub(r'(?mi)^Source0[ \t]*:[ \t\S]*\n', '', spec)
+
+    spec = re.sub(r'(?m)^%{__gzip}.*$', 'touch %{name}.ghost', spec)
+    paths = '%ghost %{prefix}/%{name}.ghost\n'
+    spec = spec.replace('%defattr(-,root,root,-)\n',
+                        '%defattr(-,root,root,-)\n' + paths)
+    #spec = re.sub(r'(?s)\n%install.*\n%clean', '\n%install\n\n%clean', spec)
+
+    #spec = re.sub(r'(?s)\n%files.*\Z', '\n', spec)
+
+logpath = '$RPM_INSTALL_PREFIX/var/log/scripts.log'
+# add preinstall-script
+if len(sys.argv) > 4 and sys.argv[4]:
+    prefile = file(sys.argv[4])
+    pre = prefile.read().replace('@INSTALL_PREFIX@', '$RPM_INSTALL_PREFIX')
+    prefile.close()
+    if pre:
+        pre = '{ %s; } >>%s 2>&1' % (pre.rstrip(), logpath)
+        #spec += '\n%pre\n' + pre + '\n'
+        spec += '\n%pre\nshift $#\n' + pre + '\n' # better add to the script
+#    echo "shell('$(sed s/@INSTALL_PREFIX@/\$PACMAN_INSTALLATION/g $4)')" >>${fpath}
+
+# add postinstall-script
+if len(sys.argv) > 3 and sys.argv[3]:
+    postfile = file(sys.argv[3])
+    post = postfile.read().replace('@INSTALL_PREFIX@', '$RPM_INSTALL_PREFIX')
+    postfile.close()
+    if post:
+        post = '{ %s; } >>%s 2>&1' % (post.rstrip(), logpath)
+        #spec += '\n%post\n' + post + '\n'
+        spec += '\n%post\nshift $#\n' + post + '\n' # better add to the script
+#    echo "shell(\"$(sed s/@INSTALL_PREFIX@/\$PACMAN_INSTALLATION/g $3)\")" >>${fpath}
+
+# add preuninstall-script
+if len(sys.argv) > 8 and sys.argv[8]:
+    preunfile = file(sys.argv[8])
+    preun = preunfile.read().replace('@INSTALL_PREFIX@', '$RPM_INSTALL_PREFIX')
+    preunfile.close()
+    if preun:
+        preun = '{ %s; } >>%s 2>&1' % (preun.rstrip(), logpath)
+        spec += '\n%preun\n' + preun + '\n'
+
+builddir = _builddir()
+buildrootdir = _buildrootdir()
+tmppath = _tmppath()
+specdir = _specdir()
+
+specpath = os.path.join(specdir, name + '.spec')
+specfile = file(specpath, 'w')
+specfile.write(spec)
+specfile.close()
+#info "Writing ${fpath}, version ${ver}" $FUNCNAME
+info("Wrote: %s, version %s" % (specpath, version))
+
+cmd = 'rpmbuild --define "_sourcedir %s" --define "_builddir %s" --define "_buildrootdir %s" --define "_rpmdir %s" --define "_tmppath %s" --target=%s -bb %s >&2' \
+      % (sourcedir, builddir, buildrootdir, rpmdir, tmppath, buildarch, specpath)
+status = os.system(cmd)
+if status != 0:
+    if exitstatus(status):
+        retval = exitstatus(status)
+    else:
+        retval += 1
+    error(cmd)
+
+sys.exit(retval)
diff --git a/PackDist/share/create-cmthome.sh b/PackDist/share/create-cmthome.sh
new file mode 100755
index 00000000000..a86a684e5a3
--- /dev/null
+++ b/PackDist/share/create-cmthome.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# File: create-cmthome.sh
+#
+# Create cmthome with a customised requirements file
+# and a test area directory to use with the distribution kit
+#
+# Usage: ./create-cmthome.sh # from where the kit has been installed
+#
+# version 0.0.1
+#
+# Report bugs to <Grigori.Rybkine@cern.ch>.
+# Written by Grigori Rybkine.
+#
+
+[ -d cmtsite ] || { echo "cmtsite: No such directory"; exit 2; }
+if [ -d $HOME/cmthome ]; then
+    echo $HOME/cmthome exists
+    echo Trying to make a backup of $HOME/cmthome
+    mv -v $HOME/cmthome $HOME/cmthome.bak || exit 1
+fi
+
+echo Copying
+cp -av cmtsite $HOME/cmthome
+
+[ -f $HOME/cmthome/requirements ] || { echo "$HOME/cmthome/requirements: No such file"; exit 2; }
+
+echo Customising $HOME/cmthome/requirements to use with the kit
+sed -i -e 's%#.*$%%' -e '/^$/d' -e 's/apply_tag noTest/#apply_tag noTest/' \
+-e 's#\(use AtlasLogin.*\)#macro ATLAS_TEST_AREA ${HOME}/testarea\n\n\1#' \
+$HOME/cmthome/requirements
+echo ATLAS_TEST_AREA will be set to ${HOME}/testarea
+echo "check https://twiki.cern.ch/twiki/bin/view/Atlas/AtlasLoginPackage for further details"
+
+[ -d ${HOME}/testarea ] || mkdir -v ${HOME}/testarea
+
+echo Configuring to use CMT from the kit
+(. cmtsite/setup.sh >/dev/null 2>&1; cd $HOME/cmthome; cmt config)
diff --git a/PackDist/share/pack-relocate.sh b/PackDist/share/pack-relocate.sh
new file mode 100755
index 00000000000..4c8dcce13cf
--- /dev/null
+++ b/PackDist/share/pack-relocate.sh
@@ -0,0 +1,132 @@
+#!/bin/sh
+
+msg="Usage: `basename $0` [OPTION]... SOURCE DEST
+  or: `basename $0` [OPTION]... -t PATH...
+In first form, relocate the ATLAS distribution kit from SOURCE to DEST.
+In second form, locate the ATLAS distribution kit in PATH and transform
+as described for -t option (implies -i option).
+
+  -i  edit files in-place, without moving them from SOURCE to DEST
+  -c  only relocate files in cmtsite
+  -t  transform setup scripts so that full paths in them may be changed by setting ATLAS_RELEASE_BASE environment variable
+  -h  display this help and exit
+  -v  output version information and exit
+
+Report bugs to <Grigori.Rybkine@cern.ch>."
+
+ver="`basename $0` (PackDist) 0.7.0
+Written by Grigori Rybkine."
+
+unset _inplace _config _transform
+
+while getopts "icthv" opt; do
+  case $opt in
+    i) _inplace=y ;;
+    c) _config=y ;;
+    t) _transform=y ;;
+    h) echo "$msg"; exit 0 ;;
+    v) echo "$ver"; exit 0 ;;
+    \?) echo "$msg"; exit 1 ;;
+  esac
+done
+
+shift $(($OPTIND - 1))
+
+transform ()
+{
+    p=$(find "$1" -path '*/cmtsite/requirements' -print -quit) || return
+    [ -f "$p" ] || { echo >&2 "Cannot find release in $1"; return 1; }
+    siteroot=$(awk '$1 == "set" && $2 == "SITEROOT" {print $3; exit}' $p) || return
+    [ -d "$siteroot" ] || { echo >&2 "Cannot determine SITEROOT from $p"; return 1; }
+    resiteroot=$(echo "${siteroot}"|awk '{gsub("/", "\\/");print}') || return
+
+    for suffix in .sh .csh; do
+if [ ${suffix} = .csh ]; then
+sed_script='/^[^#]*'"${resiteroot}"'/{
+i\
+if (! ${?ATLAS_RELEASE_BASE}) then
+p
+i\
+else
+s/'"${resiteroot}"'/${ATLAS_RELEASE_BASE}/g
+a\
+endif
+}'
+elif [ ${suffix} = .sh ]; then
+sed_script='/^[^#]*'"${resiteroot}"'/{
+s/'"${resiteroot}"'/${ATLAS_RELEASE_BASE:-'"${resiteroot}"'}/g
+}'
+fi
+
+find "${siteroot}"/.cmtsite "${siteroot}"/cmtsite -noleaf -type f \( -name setup${suffix} -o -name cleanup${suffix} -o -name asetup${suffix} \) \! -exec grep -F -q ATLAS_RELEASE_BASE '{}' \; -exec sed -i "${sed_script}" '{}' \+ || retval=1
+
+[ "${_config:-}" != y ] || continue
+
+find "${siteroot}"/CMT -noleaf -type f \( -path \*/mgr/setup${suffix} -o -path \*/mgr/cleanup${suffix} \) \! -exec grep -F -q ATLAS_RELEASE_BASE '{}' \; -exec sed -i "${sed_script}" '{}' \+ || retval=1
+
+find "${siteroot}" -noleaf -type f \( -path \*/cmt/setup${suffix} -o -path \*/cmt/cleanup${suffix} \) \! -exec grep -F -q ATLAS_RELEASE_BASE '{}' \; -exec sed -i "${sed_script}" '{}' \+ || retval=1
+
+# optimised environment setup - setup scripts
+find "${siteroot}" -noleaf -type f \( -path \*/standalone-setup${suffix} -o -path \*/standalone-init${suffix} \) \! -exec grep -F -q ATLAS_RELEASE_BASE '{}' \; -exec sed -i "${sed_script}" '{}' \+ || retval=1
+done
+
+# optimised environment setup - requirements file
+sed_script='/^[^#]*'"${resiteroot}"'/{
+s/'"${resiteroot}"'/${SITEROOT}/g
+}'
+find "${siteroot}" -noleaf -type f -name requirements -exec grep -q '^# CMTFLAGS:' '{}' \; -exec grep -F -q "${siteroot}" '{}' \; -exec sed -i "${sed_script}" '{}' \+ || retval=1
+    return ${retval}
+}
+
+retval=0
+if [ "${_transform-}" = y ]; then
+    [ $# -ge 1 ] || set $PWD || exit
+    for p; do
+	transform "$p" || retval=1
+    done
+    exit ${retval}
+fi
+
+[ $# -eq 2 ] || { echo "$msg"; exit 1; }
+
+src=$(echo $1|sed -e 's#/\{1,\}#/#g' -e 's#/*$##')
+dst=$(echo $2|sed -e 's#/\{1,\}#/#g' -e 's#/*$##')
+
+if [ `expr $src : '/'` -eq 0 ]; then
+  src=${PWD}/${src}
+fi
+if [ `expr $dst : '/'` -eq 0 ] ; then
+  dst=${PWD}/${dst}
+fi
+
+[ -d ${src}/.cmtsite ] ||
+{ echo >&2 "Distribution kit in '$src' built with PackDist prior to PackDist-00-05-00: Cannot relocate"; exit 1; }
+
+if [ "${_inplace}" != y ]; then
+  [ ! -d ${dst} ] || { echo >&2 "Directory '${dst}' already exists"; exit 2; }
+  mv ${src} ${dst} || exit
+  _dst=${dst}
+else
+  _dst=${src}
+fi
+
+find ${_dst}/.cmtsite ${_dst}/cmtsite -noleaf -type f \( -name requirements\* -o -name asetup_defaults\* -o -name setup.sh -o -name setup.csh -o -name cleanup.sh -o -name cleanup.csh -o -name asetup.sh -o -name asetup.csh \) | xargs -r sed -i 's,'${src}','${dst}',g' || exit
+
+find ${_dst}/cmtsite -noleaf -type f -name asetup_defaults\* | xargs -r sed -i 's,'`dirname ${src}`','`dirname ${dst}`',g' || exit
+
+[ "${_config:-}" != y ] || exit 0
+
+find ${_dst}/CMT -noleaf -type f \( -path \*/mgr/setup.sh -o -path \*/mgr/setup.csh -o -path \*/mgr/cleanup.sh -o -path \*/mgr/cleanup.csh \) | xargs -r sed -i 's,'${src}','${dst}',g' || exit
+
+find ${_dst} -noleaf -type f \( -path \*/cmt/setup.sh -o -path \*/cmt/setup.csh -o -path \*/cmt/cleanup.sh -o -path \*/cmt/cleanup.csh \) | xargs -r sed -i 's,'${src}','${dst}',g' || exit
+
+find ${_dst}/DBRelease -noleaf -type f -name \*.xml | xargs -r sed -i 's,'${src}','${dst}',g' || exit
+
+sed_script='s,'"${src}"','"${dst}"',g'
+# optimised environment setup - setup scripts
+find "${_dst}" -noleaf -type f \( -path \*/standalone-setup.sh -o -path \*/standalone-init.sh -o -path \*/standalone-setup.csh -o -path \*/standalone-init.csh \) -exec sed -i "${sed_script}" '{}' \+ || retval=1
+
+# optimised environment setup - requirements file
+find "${_dst}" -noleaf -type f -name requirements -exec grep -q '^# CMTFLAGS:' '{}' \; -exec sed -i "${sed_script}" '{}' \+ || retval=1
+
+exit ${retval}
diff --git a/PackDist/share/pack-standalone.py b/PackDist/share/pack-standalone.py
new file mode 100755
index 00000000000..125ffb11bc6
--- /dev/null
+++ b/PackDist/share/pack-standalone.py
@@ -0,0 +1,283 @@
+#!/usr/bin/env python
+"""File: pack-standalone.py
+
+Usage: pack-standalone.py [OPTION]... PATH...
+Create a standalone pacman file from the pacman file built by the PackDist tools
+for project (binary) package(s) found in command line argument(s) PATH...
+Only dependencies on the same project packages and external software packages,
+if found in the same directory as the processed package, are preserved.
+
+  -d, --debug                  print lots of debugging information
+  -h, --help                   display this help and exit
+      --version                output version information and exit
+
+Report bugs to <Grigori.Rybkine@cern.ch>.
+"""
+
+__version__ = '0.3.1'
+__date__ = 'Sun Aug 01 2010'
+__author__ = 'Grigory Rybkin'
+
+import sys, os
+import re
+import commands
+import logging
+import shutil
+import getopt
+
+try:
+    __path__ = [os.path.join(os.path.dirname(sys.modules[__name__].__file__), 'python')]
+except AttributeError, e:
+    # with Python 2.2.3, sys.modules['__main__']
+    # AttributeError: 'module' object has no attribute '__file__': even for scripts
+    if __name__ == '__main__':
+        __path__ = [os.path.join(os.path.dirname(sys.argv[0]), 'python')]
+    else:
+        raise
+from PackDistCommon import *
+
+class Parser(object):
+    def __init__(self, package):
+        self.package = package
+        self.parsers = []
+        p_cmt = re.compile(r'package\(\'CMTv\d+(?:r\d+)?(?:p\d+)?.*\'\)\s*')
+        self.parsers.append((p_cmt, self.comment))
+        p_settings = re.compile(r'package\(\'Atlas(?:Settings|Login|Setup)\'\)\s*')
+        self.parsers.append((p_settings, self.comment))
+        p_self = re.compile(r'package\(\'%s.+\'\)\s*' % \
+                            re.sub('[-.]', '_', '%s_%s' % \
+                                   (self.package.project, self.package.release)))
+        self.parsers.append((p_self, self.keep))
+        p_other = re.compile(r'package\(\'(?P<package>.+)\'\)\s*')
+        self.parsers.append((p_other, self.other))
+        p_shell = re.compile(r'shell\s*\(.*\)\s*')
+        self.parsers.append((p_shell, self.shell))
+        p_any = re.compile(r'(?s).*')
+        self.parsers.append((p_any, self.keep))
+        self.pacman = []
+        self.pre = True
+        self.post = False
+    def comment(self, line, match):
+        self.pacman.append('#%s' % line)
+        logger.debug('comment: %r\n%s' % (line, self.pacman))
+    def keep(self, line, match):
+        self.pacman.append(line)
+        logger.debug('keep: %r\n%s' % (line, self.pacman))
+    def other(self, line, match):
+        logger.debug('other: %r %s' % (line, match.group('package')))
+        try:
+            pkg = Package(os.path.join(os.path.dirname(self.package.filename),
+                                       match.group('package') + self.package.name[1]
+                                       )
+                          )
+            if pkg.type == 'extern':
+                self.keep(line, match)
+                logger.warning('%s: Kept external dependency %r',
+                               self.package.name[0], match.group('package'))
+            else:
+                self.comment(line, match)
+        except IOError, e:
+            logger.debug('other: %s', e, exc_info=True)
+            self.comment(line, match)
+    def skip(self, line, match):
+        logger.debug('skip: %r\n%s' % (line, self.pacman))
+    def shell(self, line, match):
+        logger.debug('shell: %r\n%s' % (line, self.pacman))
+        if self.pre:
+            self.pre = False
+            self.post = True
+            l = self.package.pre + os.linesep
+            self.pacman.append(l)
+            logger.debug('append: %r\n%s' % (l, self.pacman))
+        elif self.post:
+            try:
+                self.post = False
+                l = self.package.post + os.linesep
+                self.pacman.append(l)
+                logger.debug('append: %r\n%s' % (l, self.pacman))
+            except AttributeError, e:
+                logger.debug('shell: %s', e, exc_info=True)
+                self.comment(line, match)
+        else:
+            logger.warning('unexpected: %r' % line)
+            self.comment(line, match)
+            
+    def parse(self):
+        for line in self.package.pacman.splitlines(True):
+            logger.debug('parsing: %r', line)
+            for (p, a) in self.parsers:
+                m = p.match(line)
+                if m:
+                    a(line, m)
+                    break
+
+        logger.debug('parsed: %s' % self.pacman)
+        return ''.join(self.pacman)
+
+class Package(object):
+    def __init__(self, filename):
+        self.name = os.path.splitext(os.path.basename(filename))
+        assert self.name[1] == '.pacman', '%s: Instantiated with file name' % `filename`
+        self.filename = filename
+
+        pacmanfile = open(self.filename)
+        self.pacman = pacmanfile.read()
+        pacmanfile.close()
+        
+        m = re.search(r'description(.*External.*)', self.pacman)
+        if m: self.type = 'extern'
+        else: self.type = 'proj'
+
+        if self.name[0].startswith('CMTv'): self.type = 'CMT'
+
+        if self.type in ('extern', 'CMT'): return
+
+        name = self.name[0].split('_')
+        self.project = name[0]
+        if name[0] in ('AtlasSettings', 'AtlasLogin', 'AtlasSetup'):
+            self.platform = 'noarch'
+            self.release = re.search(r'version\(\'(?P<version>.+)\'\)',
+                                     self.pacman).group('version')
+        elif name[-1] in ('src', 'noarch'):
+            self.platform = name[-1]
+            self.release = '.'.join(name[1:-1])
+        else:
+            self.platform = '-'.join(name[-4:])
+            self.release = '.'.join(name[1:-4])
+            self.pre = 'shell(\'[ "$CMTROOT" ] && [ "$CMTBIN" ] && [ "$CMTCONFIG" ] || { echo "Project environment not set" >&2; exit 1; }\')'
+
+            m = re.search(r'shell\s*\(".*?(?P<config>cd\s+\$PACMAN_INSTALLATION/(?P<project>[\w.-]+)/(?P<release>[\w.-]+)/(?P<cntnrcmt>([\w.-]+/)+cmt).*)"\)\s*', self.pacman)
+            if m:
+                self.project = m.group('project')
+                self.release = m.group('release')
+                self.cntnrcmt = m.group('cntnrcmt')
+                self.post = 'shell("unset CMTPATH; %s")' % m.group('config')
+                logger.debug('cntnrcmt: %s', m.group('cntnrcmt'))
+                logger.debug('postinstall script:\n%s', self.post)
+            else:
+                logger.warning('%s %s %s: Cannot determine postinstall script',
+                               self.project, self.release, self.platform)
+
+        logger.debug('%s %s %s: Initialised',
+                     self.project, self.release, self.platform)
+
+    def standalone(self):
+        if self.type in ('extern', 'CMT'):
+            logger.debug('type %s: %s: Nothing to change',
+                         `self.type`, self.name[0])
+            return 0
+        if self.platform in ('src', 'noarch'):
+            logger.debug('platform %s: %s: Nothing to change',
+                         `self.platform`, self.name[0])
+            return 0
+
+        if len(self.release.split('.')) < 4:
+            logger.warning('%s %s %s %s: Does not look a patch project',
+                           self.name[0], self.project, self.release, self.platform)
+            
+        try:
+            pacman_new = Parser(self).parse()
+#            if pacman_new == ''.join(pacman):
+            if pacman_new == self.pacman:
+                logger.info('standalone: %s' % self.filename)
+                return 0
+
+            filename_real = os.path.realpath(self.filename)
+            os.rename(filename_real, filename_real + '.save')
+#            shutil.copy2(filename_real, filename_real + '.save')
+#            logger.info('copied %s -> %s',
+            logger.info('renamed %s -> %s',
+                        `filename_real`, `filename_real + '.save'`)
+            
+            pacmanfile = open(filename_real, 'w')
+            pacmanfile.write(pacman_new)
+            pacmanfile.close()
+            logger.info('wrote: %s' % pacmanfile.name)
+            return 0
+
+        except (IOError, os.error), e:
+#            logger.error(e)
+            logger.error(e, exc_info=True)
+#            pacmanfile.close()
+            return 1
+
+def pkg_files(paths):
+    ps = []
+    errs = []
+    for p in paths:
+        if os.path.isfile(p) or os.path.isdir(p):
+            ps.append(p)
+        else:            
+            errs.append(p)
+    for p in errs:
+        print >> sys.stderr, 'No such file or directory:', p
+    if not ps:
+        raise InputError(' '.join(paths), 'No valid arguments')
+
+    cmd = 'find ' + ' '.join(ps) + ' -noleaf -name "*.pacman"'
+#    cmd = 'find ' + ' '.join(ps) + ' -noleaf \\( -name "*opt*.pacman" -o -name "*dbg*.pacman" \\)'
+    sc, filenames = commands.getstatusoutput(cmd)
+    if sc != 0:
+        # The exit status for the command can be interpreted
+        # according to the rules for the C function wait().
+        raise CommandError(cmd, filenames, sc)
+    return filenames.splitlines()
+
+def help():
+    print sys.modules[__name__].__doc__
+
+def main(argv=[__name__]):
+    self = os.path.basename(argv[0])
+    try:
+        opts, args = getopt.getopt(argv[1:],
+                                   "hd",
+                                   ["help", "version", "debug"])
+    except getopt.error, e:
+        print >>sys.stderr, '%s: %s' % (self, str(e))
+        print >>sys.stderr, "Try '%s --help' for more information." % self
+        return 1
+
+    global logger
+    logging.basicConfig()
+    logger = logging.getLogger(self)
+    logger.setLevel(logging.INFO)
+
+#     ch = logging.StreamHandler()
+#     ch.setFormatter(logging.Formatter("%(name)s: %(levelname)s: %(message)s"))
+#     ch.setLevel(logging.INFO)
+
+    for o, v in opts:
+        if o in ("-h", "--help"):
+            print sys.modules[__name__].__doc__
+            return 0
+        elif o in ("--version",):
+            print '%s %s (%s)' % (self, __version__, __date__)
+            print '%sWritten by %s.' % (os.linesep, __author__)
+            return 0
+        elif o in ("-d", "--debug"):
+            logger.setLevel(logging.DEBUG)
+#             ch.setLevel(logging.DEBUG)
+
+#     logger.addHandler(ch)
+
+    if not args:
+        print >>sys.stderr, '%s: missing path argument' % self
+        print >>sys.stderr, "Try '%s --help' for more information." % self
+        return 1
+
+    try:
+        filenames = pkg_files(args)
+    except InputError, e:
+        print >> sys.stderr, e
+        help()
+        return 1
+
+    sc = 0
+    for filename in filenames:
+        sc += Package(filename).standalone()
+
+    if sc != 0: return 1
+    else: return 0
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
diff --git a/PackDist/share/python/PackDistCommon.py b/PackDist/share/python/PackDistCommon.py
new file mode 100755
index 00000000000..0833847cfd1
--- /dev/null
+++ b/PackDist/share/python/PackDistCommon.py
@@ -0,0 +1,61 @@
+"""File: PackDistCommon.py
+
+Common classes and utility functions of the PackDist package.
+"""
+
+__author__  = 'Grigori Rybkine <Grigori.Rybkine@cern.ch>'
+__version__ = '0.2.1'
+__date__ = 'Wed Oct 03 2012'
+
+__all__ = ['Error', 'InputError', 'CommandError', 'exitstatus']
+
+import sys
+import os
+
+class Error(Exception):
+    """Base class for exceptions in this module."""
+    def __str__(self):
+        return ': '.join([str(arg) for arg in self.args])
+    def write(self, file = sys.stderr):
+        print >> file, '%s: %s' % (self.__class__.__name__, self)
+
+class InputError(Error):
+    """Exception raised for errors in the input.
+    
+    Attributes:
+    expression() -- input expression in which the error occurred
+    message() -- explanation of the error
+    """
+
+    def __init__(self, expression, message):
+        Error.__init__(self, expression, message)
+    def expression(self):
+        return self.args[0]
+    def message(self):
+        return self.args[1]
+
+class CommandError(Error):
+    """Exception raised for errors executing shell commands.
+    
+    Attributes:
+    args[0] -- shell command executing which the error occurred
+    args[1] -- stderr and stdout of the command
+    args[2] -- exit status of the command
+    """
+
+    def __init__(self, cmd, output, sc = None):
+        Error.__init__(self, cmd, output, sc)
+
+def exitstatus (status):
+    """Return child exit status, if child terminated normally, None otherwise.
+
+    Parameter status: child process status information as returned by os.wait(),
+    or os.waitpid(),
+    os.system(), close() method of file object returned by os.popen(),
+    commands.getstatusoutput()
+    """
+    
+    if os.WIFEXITED(status):
+        return os.WEXITSTATUS(status)
+    else:
+        return None
diff --git a/PackDist/share/rpm-erase.sh b/PackDist/share/rpm-erase.sh
new file mode 100755
index 00000000000..8c2b686104b
--- /dev/null
+++ b/PackDist/share/rpm-erase.sh
@@ -0,0 +1,239 @@
+#!/bin/sh
+# File: rpm-erase.sh
+#
+# Author: Grigori Rybkine <Grigori.Rybkine@cern.ch>.
+#
+__version__='0.3.1'
+__date__='Fri Mar 28 2008'
+__author__='Grigori Rybkine <Grigori.Rybkine@cern.ch>'
+
+_help ()
+{
+cat <<EOF
+Usage: `basename $0` [OPTION]... PACKAGE [PACKAGE]...
+Erase (uninstall) RPM PACKAGE(s).
+
+  -p <path>      use the database in directory <path>
+  -D             erase as many package(s) upon which PACKAGE(s) depend as possible
+  -k <pattern>   do not erase package(s) which match (basic) regular expression <pattern>
+  -y             assume Yes to all queries and do not prompt
+  -h             display this help and exit
+  -v             output version information and exit
+
+Report bugs to <Grigori.Rybkine@cern.ch>.
+EOF
+}
+
+_version ()
+{
+echo "`basename $0` version $__version__"
+echo Written by Grigori Rybkine.
+}
+
+_parse_opts ()
+{
+local msg="Try '`basename $0` -h' for more information."
+
+unset dbpath deps keep reply
+
+while getopts ":p:Dk:yhv" opt; do
+    case $opt in
+	p) eval dbpath=${OPTARG} ;;
+	D) deps=yes ;;
+	k) keep="${OPTARG}" ;;
+	y) reply=yes ;;
+	h) _help; exit 0 ;;
+	v) _version; exit 0 ;;
+	\?) echo -e "`basename $0`: invalid option: -${OPTARG}\n$msg"; exit 1;;
+	:) echo -e "`basename $0`: argument required for option: -${OPTARG}\n$msg"; exit 1;;
+    esac
+done
+
+shift $(($OPTIND - 1))
+
+[ $# -gt 0 ] || { echo -e "`basename $0`: no argument(s) specified\n$msg"; exit 1; }
+}
+
+_reqpkg_d ()
+{
+# 
+# depth-first
+#
+local created=no
+[ -f "$tmpdone" ] ||
+# Do not consider the /bin/sh capability
+{ tmpdone=$(mktemp) && created=yes && echo /bin/sh >>$tmpdone; } || return
+
+local tmpreq=$(mktemp) || return
+local tmppkg=$(mktemp) || return
+local reqnm pkg
+
+for pkg; do
+
+rpm ${dbpath:+--dbpath ${dbpath}} -q --quiet $pkg || continue
+rpm ${dbpath:+--dbpath ${dbpath}} -q --qf '[%{REQUIRENAME}\n]' $pkg >|$tmpreq || continue
+
+for reqnm in $(<$tmpreq); do
+    grep -q "^$reqnm\$" $tmpdone && continue
+    echo $reqnm >>$tmpdone || return
+    rpm ${dbpath:+--dbpath ${dbpath}} -q --qf '[%{NAME}\n]' --whatprovides $reqnm >|$tmppkg || continue
+    _exclude "$keep" $tmppkg || return
+    cat $tmppkg || return
+    if [ "$deps" ]; then
+	_reqpkg_d $(<$tmppkg) || return
+    fi
+done
+
+done
+
+rm -f $tmpreq $tmppkg
+[ $created == no ] || rm -f $tmpdone
+}
+
+_reqpkg ()
+{
+[ $# -gt 0 ] || return 0
+
+local created=no
+[ -f "$tmpdone" ] ||
+# Do not consider the /bin/sh capability
+{ tmpdone=$(mktemp) && created=yes && echo /bin/sh >>$tmpdone; } || return
+
+local tmpreq=$(mktemp) || return
+local tmpnm=$(mktemp) || return
+local tmppkg=$(mktemp) || return
+local pkg reqnm
+
+for pkg; do
+rpm ${dbpath:+--dbpath ${dbpath}} -q --quiet $pkg || continue
+rpm ${dbpath:+--dbpath ${dbpath}} -q --qf '[%{REQUIRENAME}\n]' $pkg >|$tmpnm || continue
+cat $tmpnm >>$tmpreq || return
+done
+sort -u -o $tmpreq $tmpreq || return
+
+for reqnm in $(<$tmpreq); do
+    grep -q "^$reqnm\$" $tmpdone && continue
+    echo $reqnm >>$tmpdone || return
+    rpm ${dbpath:+--dbpath ${dbpath}} -q --qf '[%{NAME}\n]' --whatprovides $reqnm >|$tmpnm || continue
+    cat $tmpnm >>$tmppkg || return
+done
+sort -u -o $tmppkg $tmppkg || return
+
+rm -f $tmpreq $tmpnm
+
+_exclude "$keep" $tmppkg || return
+cat $tmppkg || return
+if [ "$deps" ]; then
+    _reqpkg $(<$tmppkg) || return
+fi
+
+rm -f $tmppkg
+[ $created == no ] || rm -f $tmpdone
+}
+
+_erase ()
+{
+local tmpdone=$(mktemp) || return
+
+local total=`<$1 sort -u | wc -l` || return
+local nmbr=0 erased pkg
+while true; do
+    erased=0
+    for pkg in $(<$1); do
+	grep -q "^$pkg\$" $tmpdone && continue
+	rpm ${dbpath:+--dbpath ${dbpath}} --test -e "$pkg" >/dev/null 2>&1 || continue
+	rpm ${dbpath:+--dbpath ${dbpath}} -e "$pkg" || continue
+	#let erased++ nmbr++ || return
+	erased=`expr $erased + 1` || return
+	nmbr=`expr $nmbr + 1` || return
+	#echo -e "\t$nmbr: $pkg\t[$((nmbr*100/total))%]" || return
+	#echo -e "\t$nmbr: $pkg\t[$(expr $nmbr '*' 100 / $total)%]" || return
+	printf "%5d: %-65s [%3d%%]\n" $nmbr $pkg $(expr $nmbr '*' 100 / $total) || return
+	echo $pkg >>$tmpdone || return
+	_exclude "^$pkg\$" $1 || return
+    done
+    [ $erased -gt 0 ] || break
+done
+rm -f $tmpdone
+}
+
+_uniq ()
+{
+#
+# Discard all but one of identical lines from standard input,
+# writing to standard output.
+#
+awk '{ if (vue[$0] != 1) { vue[$0] = 1; print } }'
+}
+
+_exclude ()
+{
+#
+# Discard all lines of file $2 which match (basic) regular expression $1.
+#
+[ "$1" ] || return 0
+sed -i '\%'"$1"'%d' "$2"
+}
+
+main ()
+{
+_parse_opts "$@"
+shift $(($OPTIND - 1))
+
+local tmppkg=$(mktemp) || return
+
+if rpm ${dbpath:+--dbpath ${dbpath}} -q "$@" &&
+    rpm ${dbpath:+--dbpath ${dbpath}} --test -e "$@"; then
+
+    rpm ${dbpath:+--dbpath ${dbpath}} -q --qf '%{NAME}\n' "$@" | _uniq >>$tmppkg || return
+
+    _exclude "$keep" $tmppkg || return
+    if [ "$deps" ]; then
+	echo -n "Building Dependency Tree..."
+	local tmppkgs=$(mktemp) || return
+	if [ "$depth" != yes ]; then
+	    _reqpkg $(<$tmppkg) | _uniq >>$tmppkgs || return
+	else
+	    _reqpkg_d $(<$tmppkg) | _uniq >>$tmppkgs || return
+	fi
+	cat $tmppkgs >>$tmppkg || return
+	rm -f $tmppkgs
+	echo " Done"
+#	_exclude "$keep" $tmppkg || return
+    fi
+
+    if [ "$reply" != yes ]; then
+
+	echo "Try to REMOVE the following packages:"
+	<$tmppkg sort -u | sed 's/^/\t/' || return
+	echo "`<$tmppkg sort -u | wc -l` removed."
+	echo -n "Do you want to continue? [Y/n] "
+	read reply
+
+    fi
+
+    case "$reply" in
+	y*|Y*)
+	    echo "Executing RPM (-e)..."
+	    _erase $tmppkg || return
+	    echo "Done."
+	    if [ -s $tmppkg ]; then
+		echo "Could not REMOVE the following packages:"
+		<$tmppkg sort -u | sed 's/^/\t/' || return
+		echo "`<$tmppkg sort -u | wc -l` not removed."
+	    fi
+	    ;;
+	*) echo "Abort.";;
+    esac
+
+else
+    rm -f $tmppkg
+    return 1
+
+fi
+retval=$?
+rm -f $tmppkg
+return $retval
+}
+
+main "$@"
diff --git a/PackDist/share/setup-standalone.sh b/PackDist/share/setup-standalone.sh
new file mode 100644
index 00000000000..67dbd3e5337
--- /dev/null
+++ b/PackDist/share/setup-standalone.sh
@@ -0,0 +1,33 @@
+#
+# Usage: . ./setup-standalone.sh [-H CMTHOME] [TAG]...
+# Setup the environment for standalone installation of a project
+# containing patches for the projects via asetup command [found in CMTHOME]
+# with the tags [TAG]...
+#
+# Example:
+# . ./setup-standalone.sh -H /afs/cern.ch/atlas/software/releases/17.0.3/cmtsite 17.0.3 32
+#
+
+unset cmthome
+if [ $# -ge 1 ]; then
+    if [ $1 = -H ]; then
+	shift
+	if [ $# -ge 1 ]; then
+	    cmthome=$1; shift
+	else
+	    echo "setup-standalone.sh: ERROR: Argument required for option: -H" >&2; return 1
+	fi
+    fi
+fi
+
+tags=$(echo $* | tr -s ' ' ',')
+shift $#
+
+if [ -n "$cmthome" ]; then
+    source $cmthome/asetup.sh ${tags}
+else
+    asetup ${tags}
+fi
+setupstandalonestatus=$?
+unset cmthome tags
+return $setupstandalonestatus
diff --git a/PackDist/share/specs/DBRelease.spec b/PackDist/share/specs/DBRelease.spec
new file mode 100644
index 00000000000..b66b16a02d8
--- /dev/null
+++ b/PackDist/share/specs/DBRelease.spec
@@ -0,0 +1,123 @@
+%global __os_install_post /usr/lib/rpm/brp-compress %{nil}
+
+%{!?_version: %{error:_version not defined}}
+%{!?_release: %{expand:%define _release 1}}
+
+%{!?_swversion: %{error:_swversion not defined}}
+
+Name:           DBRelease-%{_version}
+Version:        %(echo %{_version} | %{__sed} 's/-/./g')
+Release:        %{_release}
+Epoch:          0
+Summary:        DBRelease
+
+Group:          Application
+License:        ATLAS
+URL:            http://atlas.web.cern.ch/Atlas/GROUPS/DATABASE/pacman4/DBRelease/%{name}.tar.gz
+Packager:       ATLAS Offline
+Source0:        %{name}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildArch:      noarch
+
+AutoReqProv:    no
+#Requires:       AtlasLogin
+
+Prefix:         /opt/atlas
+
+%description
+Package DBRelease for s/w rel %{_swversion}
+
+%prep
+
+%build
+
+%define _fixowner  [ `%{__id_u}` = '0' ] && %{__chown_Rhf} root
+%define _fixgroup  [ `%{__id_u}` = '0' ] && %{__chgrp_Rhf} root
+
+%install
+%{__rm} -rf $RPM_BUILD_ROOT
+%{__mkdir_p} $RPM_BUILD_ROOT%{prefix}
+cd $RPM_BUILD_ROOT%{prefix}
+%{__gzip} -dc %{SOURCE0} | %{__tar} -xvvf -
+if [ -h DBRelease/current ]; then
+    %{__rm} -f DBRelease/current
+fi
+STATUS=$?
+if [ $STATUS -ne 0 ]; then
+  exit $STATUS
+fi
+%{_fixowner} .
+%{_fixgroup} .
+%{_fixperms} .
+
+%clean
+%{__rm} -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root,-)
+%{prefix}/DBRelease/%{_version}
+
+%post
+{
+dbdir=$RPM_INSTALL_PREFIX/DBRelease/%{_version}
+# Edit XML configuration files, insert the full path to SQLite replicas
+fn=dblookup.xml
+fp=$dbdir/XMLConfig/$fn
+sed -i "s#sqliteGenerated:#sqlite_file:$dbdir/#" $fp
+# Edit file catalogs, insert the full paths to CondDB payload files
+fns="PoolCat_oflcond.xml PoolCat_tbcond.xml PoolCat_cmccond.xml \
+PoolCat_comcond.xml"
+fps=
+for fn in $fns; do
+  fps="$fps $dbdir/poolcond/$fn"
+done
+sed -i "s#--GENERATED--#$dbdir/poolcond/#" $fps
+# Modify the installed kit
+#echo "Updating $RPM_INSTALL_PREFIX/cmtsite/requirements..."
+#sed -i.dborig '$a\
+#set DBRELEASE_INSTALLED %{_version}
+#/DBRELEASE/d' \
+#$RPM_INSTALL_PREFIX/cmtsite/requirements
+
+if [ -h $RPM_INSTALL_PREFIX/DBRelease/current ]; then
+    rm -f $RPM_INSTALL_PREFIX/DBRelease/current
+fi
+ln -s %{_version} $RPM_INSTALL_PREFIX/DBRelease/current
+} >>$RPM_INSTALL_PREFIX/var/log/scripts.log 2>&1
+
+%changelog
+* Thu Dec 06 2012 Grigori Rybkine <Grigori.Rybkine@cern.ch>
+- Override system __os_install_post macro
+- Define _fixowner, _fixgroup macros since they are missing with RPM 4.8.0 and later
+- In %%install section, do not exit (so as to let RPM run __spec_install_post actions)
+
+* Tue Aug 08 2007 Grigori Rybkine <Grigori.Rybkine@cern.ch>
+- Make spec file more generic by introducing the _version, _release, _swversion macros
+- Prints message to stderr and return BADSPEC if the _version or _swversion macro
+  not defined on the command line
+- Set the _release macro to 1 if not defined on the command line
+- Drop dependency on AtlasLogin (starting from DBRelease 4.1.1)
+
+* Sun Jul 01 2007 Grigori Rybkine <Grigori.Rybkine@cern.ch>
+- Make spec file more generic by introducing the dbversion, swversion parameters
+- Redirect the post scriptlet stdout and stderr to a log file
+
+* Mon Jan 22 2007 Grigori Rybkine <Grigori.Rybkine@cern.ch>
+- Update to version 3.1.1
+
+* Sun Dec 17 2006 Grigori Rybkine <Grigori.Rybkine@cern.ch>
+- Update to version 3.0.1
+
+* Sat Dec 02 2006 Grigori Rybkine <Grigori.Rybkine@cern.ch>
+- Update to version 2.9.1
+
+* Fri Dec 01 2006 Grigori Rybkine <Grigori.Rybkine@cern.ch>
+- Update to new version (3.0-LST)
+- Modify the post scriptlet
+
+* Sat Oct 21 2006 Grigori Rybkine <Grigori.Rybkine@rhul.ac.uk>
+- Modify the post scriptlet (2.8-2)
+
+* Sun Oct 15 2006 Grigori Rybkine <Grigori.Rybkine@rhul.ac.uk>
+- First spec file for DBRelease (2.8-1)
diff --git a/PackDist/share/specs/Makefile.cmt b/PackDist/share/specs/Makefile.cmt
new file mode 100644
index 00000000000..c2c9dbbed79
--- /dev/null
+++ b/PackDist/share/specs/Makefile.cmt
@@ -0,0 +1,4 @@
+include $(CMTROOT)/src/Makefile.header
+
+include $(CMTROOT)/src/constituents.make
+
diff --git a/PackDist/share/specs/proj.spec.in b/PackDist/share/specs/proj.spec.in
new file mode 100644
index 00000000000..63a475aa61d
--- /dev/null
+++ b/PackDist/share/specs/proj.spec.in
@@ -0,0 +1,58 @@
+%%undefine _enable_debug_packages
+%%global __os_install_post /usr/lib/rpm/brp-compress %%{nil}
+
+Name:           %(name)s
+Version:        %(version)s
+Release:        1
+Epoch:          0
+Summary:        %(summary)s
+
+Group:          Application/Physics
+License:        ATLAS
+URL:            http://atlas.web.cern.ch/Atlas
+Packager:       ATLAS Offline
+Source0:        %%{name}.tar.gz
+BuildRoot:      %%{_tmppath}/%%{name}-%%{version}-%%{release}-root-%%(%%{__id_u} -n)
+
+AutoReqProv:    no
+Requires:       %(requires)s
+Provides:       %(provides)s
+
+Prefix:         /opt/atlas
+
+%%description
+High Energy Physics Application
+
+%%prep
+
+%%build
+
+%%define _fixowner  [ `%%{__id_u}` = '0' ] && %%{__chown_Rhf} root
+%%define _fixgroup  [ `%%{__id_u}` = '0' ] && %%{__chgrp_Rhf} root
+
+%%install
+%%{__rm} -rf $RPM_BUILD_ROOT
+%%{__mkdir_p} $RPM_BUILD_ROOT%%{prefix}
+cd $RPM_BUILD_ROOT%%{prefix}
+%%{__gzip} -dc %%{SOURCE0} | %%{__tar} -xvvf -
+STATUS=$?
+if [ $STATUS -ne 0 ]; then
+  exit $STATUS
+fi
+%%{_fixowner} .
+%%{_fixgroup} .
+%%{_fixperms} .
+
+%%clean
+%%{__rm} -rf $RPM_BUILD_ROOT
+
+%%files
+%%defattr(-,root,root,-)
+
+%%changelog
+* Thu Dec 06 2012 Grigori Rybkine <Grigori.Rybkine@cern.ch>
+- Undefine _enable_debug_packages macro (so as to disable building debuginfo packages)
+- Override system __os_install_post macro
+- Define _fixowner, _fixgroup macros since they are missing with RPM 4.8.0 and later
+- In %%%%install section, do not exit (so as to let RPM run __spec_install_post actions)
+
-- 
GitLab