diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ea86b58d92deceaae353d795f88470d68d496a18..428b063b7abf90537bffd9f331017fd1a5c638e1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,18 +3,23 @@ stages:
   - test
   - deploy
 
+image: gitlab-registry.cern.ch/lhcb-core/lbdocker/centos7-build
+
+variables:
+  NO_LBLOGIN: 1
+
 before_script:
   - export BINARY_TAG=x86_64-centos7-gcc7-opt
   - export LCG_hostos=x86_64-centos7
   - export PATH=/cvmfs/sft.cern.ch/lcg/contrib/CMake/3.8.1/Linux-x86_64/bin:/cvmfs/sft.cern.ch/lcg/contrib/ninja/1.7.1/x86_64-slc6:/cvmfs/sft.cern.ch/lcg/releases/Python/2.7.13-597a5/${BINARY_TAG}/bin:${PATH}
   - export LCG_release_area=/cvmfs/sft.cern.ch/lcg/releases
   - export PATH=/cvmfs/lhcb.cern.ch/lib/lhcb/LBSCRIPTS/dev/InstallArea/scripts:${PATH}
+  - export PYTHONPATH=/cvmfs/lhcb.cern.ch/lib/lhcb/LBSCRIPTS/dev/InstallArea/python:${PYTHONPATH}
   - export CMAKE_PREFIX_PATH=/cvmfs/sft.cern.ch/lcg/releases:/cvmfs/projects.cern.ch/intelsw/psxe/linux/x86_64/2017/vtune_amplifier_xe
   - export CCACHE_DIR=${PWD}/.ccache
   - export CCACHE_CPP2=1
 
 build:
-  image: lhcbdev/centos7-build:latest
   tags:
     - cvmfs
   stage: build
@@ -33,13 +38,12 @@ build:
     expire_in: 1 week
 
 coding-conventions:
-  image: lhcbdev/centos7-build:latest
   tags:
     - cvmfs
   stage: test
   script:
     - export LCG_release_area=${LCG_release_area}:/cvmfs/lhcb.cern.ch/lib/lcg/external
-    - pip install autopep8
+    - sudo pip install autopep8
     - make BUILDDIR=build apply-formatting
     - git diff > apply-formatting.patch
     - git diff --stat --exit-code
@@ -50,7 +54,6 @@ coding-conventions:
     expire_in: 1 day
 
 doxygen:
-  image: lhcbdev/centos7-build:latest
   tags:
     - cvmfs
   stage: test
@@ -70,7 +73,6 @@ doxygen:
     expire_in: 1 day
 
 test:
-  image: lhcbdev/centos7-build:latest
   tags:
     - cvmfs
   stage: test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ce7878a3983b9f127b665f5acb2d15023a8499cc..cfdaa458204c2db5f8110016b9830ef8d623bf17 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -30,8 +30,6 @@ include(${CMAKE_SOURCE_DIR}/cmake/externals.cmake)
 gaudi_project(Gaudi v29r2)
 
 # These tests do not really fit in a subdirectory.
-gaudi_add_test(cmake.EnvConfigTests
-               COMMAND nosetests --with-doctest ${CMAKE_SOURCE_DIR}/cmake/EnvConfig)
 gaudi_add_test(cmake.CMakeModules
                COMMAND nosetests ${CMAKE_SOURCE_DIR}/cmake/tests)
 gaudi_add_test(cmake.QMTDeps
diff --git a/cmake/BinaryTagUtils.cmake b/cmake/BinaryTagUtils.cmake
index 63616fef47be3c2415df0db720c6eff6be6f1cd5..12c40da82c096d4114b48cbc4ae0a315dfcefb31 100644
--- a/cmake/BinaryTagUtils.cmake
+++ b/cmake/BinaryTagUtils.cmake
@@ -151,7 +151,10 @@ function(check_compiler)
   endif()
 endfunction()
 
-set(_GET_HOST_BINARY_TAG_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/get_host_binary_tag.py" CACHE INTERNAL "")
+find_program(HOST_BINARY_TAG_COMMAND
+             NAMES host-binary-tag get_host_binary_tag.py
+             HINTS "${CMAKE_CURRENT_LIST_DIR}")
+mark_as_advanced(HOST_BINARY_TAG_COMMAND)
 #.rst
 # .. command:: get_host_binary_tag
 #
@@ -171,14 +174,11 @@ function(get_host_binary_tag variable)
   else()
     set(type opt)
   endif()
+  if(NOT HOST_BINARY_TAG_COMMAND)
+    message(FATAL_ERROR "No host-binary-tag command, cannot get host binary tag")
+  endif()
   if(NOT HOST_BINARY_TAG)
-    if(NOT PYTHON_EXECUTABLE)
-      find_package(PythonInterp QUIET)
-      if(NOT PYTHONINTERP_FOUND)
-        message(FATAL_ERROR "Python interpreter required to get host binary tag")
-      endif()
-    endif()
-    execute_process(COMMAND ${PYTHON_EXECUTABLE} "${_GET_HOST_BINARY_TAG_SCRIPT}"
+    execute_process(COMMAND "${HOST_BINARY_TAG_COMMAND}"
                     OUTPUT_VARIABLE HOST_BINARY_TAG
                     OUTPUT_STRIP_TRAILING_WHITESPACE)
     set(HOST_BINARY_TAG ${HOST_BINARY_TAG} CACHE STRING "BINARY_TAG of the host")
diff --git a/cmake/EnvConfig/Control.py b/cmake/EnvConfig/Control.py
deleted file mode 100644
index 1a8b719cc59e43184a583297d4534d9ebbe43fe9..0000000000000000000000000000000000000000
--- a/cmake/EnvConfig/Control.py
+++ /dev/null
@@ -1,385 +0,0 @@
-'''
-Created on Jun 27, 2011
-
-@author: mplajner
-'''
-import xmlModule
-import os
-from time import gmtime, strftime
-import Variable
-import EnvConfig
-import logging
-
-
-class Environment(object):
-    '''object to hold settings of environment'''
-
-    def __init__(self, loadFromSystem=True, useAsWriter=False, searchPath=None):
-        '''Initial variables to be pushed and setup
-
-        append switch between append and prepend for initial variables.
-        loadFromSystem causes variable`s system value to be loaded on first encounter.
-        If useAsWriter == True than every change to variables is recorded to XML file.
-        reportLevel sets the level of messaging.
-        '''
-        self.log = logging.getLogger('Environment')
-
-        self.separator = ':'
-
-        # Prepeare the internal search path for xml files (used by 'include' elements)
-        if searchPath is None:
-            self.searchPath = []
-        else:
-            self.searchPath = list(searchPath)
-
-        def addToSearchPath(n, _1, _2):
-            '''
-            Add entries to the search path expanding variables inside.
-            '''
-            entries = Variable.List('_SEARCH_PATH')
-            entries.set(n, os.pathsep, environment=self.variables)
-            self.searchPath.extend(entries)
-
-        self.actions = {}
-        self.actions['include'] = lambda n, c, h: self.loadXML(
-            self._locate(n, c, h))
-        self.actions['append'] = lambda n, v, _: self.append(n, v)
-        self.actions['prepend'] = lambda n, v, _: self.prepend(n, v)
-        self.actions['set'] = lambda n, v, _: self.set(n, v)
-        self.actions['unset'] = lambda n, v, _: self.unset(n, v)
-        self.actions['default'] = lambda n, v, _: self.default(n, v)
-        self.actions['remove'] = lambda n, v, _: self.remove(n, v)
-        self.actions['remove-regexp'] = lambda n, v, _: self.remove_regexp(
-            n, v)
-        self.actions['declare'] = self.declare
-        self.actions['search_path'] = addToSearchPath
-
-        self.variables = {}
-
-        self.loadFromSystem = loadFromSystem
-        self.asWriter = useAsWriter
-        if useAsWriter:
-            self.writer = xmlModule.XMLFile()
-            self.startXMLinput()
-
-        self.loadedFiles = set()
-
-        # Prepare the stack for the directory of the loaded file(s)
-        self._fileDirStack = []
-        # Note: cannot use self.declare() because we do not want to write out
-        #       the changes to ${.}
-        dot = Variable.Scalar('.', local=True)
-        dot.expandVars = False
-        dot.set('')
-        self.variables['.'] = dot
-
-    def _locate(self, filename, caller=None, hints=None):
-        '''
-        Find 'filename' in the internal search path.
-        '''
-        from os.path import isabs, isfile, join, dirname, normpath, abspath
-        if isabs(filename):
-            return filename
-
-        self.log.debug('looking for %s', filename)
-        if hints is None:
-            hints = []
-        elif type(hints) is str:
-            hints = hints.split(self.separator)
-
-        if caller:
-            calldir = dirname(caller)
-            localfile = join(calldir, filename)
-            self.log.debug('trying %s', localfile)
-            if isfile(localfile):
-                self.log.debug('OK (local file)')
-                return localfile
-            # allow for relative hints
-            hints = [join(calldir, hint) for hint in hints]
-
-        sp = EnvConfig.path + self.searchPath + hints
-
-        def candidates():
-            for d in sp:
-                f = normpath(join(d, filename))
-                self.log.debug('trying %s', f)
-                yield f
-        try:
-            f = (abspath(f) for f in candidates() if isfile(f)).next()
-            self.log.debug('OK')
-            return f
-        except StopIteration:
-            from errno import ENOENT
-            raise OSError(ENOENT, 'cannot find file in %r' % sp, filename)
-
-    def vars(self, strings=True):
-        '''returns dictionary of all variables optionally converted to string'''
-        if strings:
-            return dict([(n, v.value(True))
-                         for n, v in self.variables.items()
-                         if n != '.'])
-        else:
-            # clone the dictionary to remove the internal special var '.'
-            vars_ = dict(self.variables)
-            if '.' in vars_:
-                del vars_['.']
-            return vars_
-
-    def var(self, name):
-        '''Gets a single variable. If not available then tries to load from system.'''
-        if name in self.variables:
-            return self.variables[name]
-        else:
-            return os.environ[name]
-
-    def search(self, varName, expr, regExp=False):
-        '''Searches in a variable for a value.'''
-        return self.variables[varName].search(expr, regExp)
-
-    def _guessType(self, varname):
-        '''
-        Guess the type of the variable from its name: if the name contains
-        'PATH' or 'DIRS', then the variable is a list, otherwise it is a scalar.
-        '''
-        varname = varname.upper()  # make the comparison case insensitive
-        if 'PATH' in varname or 'DIRS' in varname:
-            return 'list'
-        else:
-            return 'scalar'
-
-    def declare(self, name, vartype, local):
-        '''Creates an instance of new variable. It loads values from the OS if the variable is not local.'''
-        if self.asWriter:
-            self._writeVarToXML(name, 'declare', '', vartype, local)
-
-        if not isinstance(local, bool):
-            if str(local).lower() == 'true':
-                local = True
-            else:
-                local = False
-
-        if name in self.variables.keys():
-            if self.variables[name].local != local:
-                raise Variable.EnvError(name, 'redeclaration')
-            else:
-                if vartype.lower() == "list":
-                    if not isinstance(self.variables[name], Variable.List):
-                        raise Variable.EnvError(name, 'redeclaration')
-                else:
-                    if not isinstance(self.variables[name], Variable.Scalar):
-                        raise Variable.EnvError(name, 'redeclaration')
-
-        if vartype.lower() == "list":
-            a = Variable.List(name, local)
-        else:
-            a = Variable.Scalar(name, local)
-
-        if self.loadFromSystem and not local and name in os.environ:
-            a.expandVars = False  # disable var expansion when importing from the environment
-            a.set(os.environ[name], os.pathsep, environment=self.variables)
-            a.expandVars = True
-
-        self.variables[name] = a
-
-    def append(self, name, value):
-        '''Appends to an existing variable.'''
-        if self.asWriter:
-            self._writeVarToXML(name, 'append', value)
-        else:
-            if name not in self.variables:
-                self.declare(name, self._guessType(name), False)
-            self.variables[name].append(value, self.separator, self.variables)
-
-    def prepend(self, name, value):
-        '''Prepends to an existing variable, or create a new one.'''
-        if self.asWriter:
-            self._writeVarToXML(name, 'prepend', value)
-        else:
-            if name not in self.variables:
-                self.declare(name, self._guessType(name), False)
-            self.variables[name].prepend(value, self.separator, self.variables)
-
-    def set(self, name, value):
-        '''Sets a single variable - overrides any previous value!'''
-        name = str(name)
-        if self.asWriter:
-            self._writeVarToXML(name, 'set', value)
-        else:
-            if name not in self.variables:
-                self.declare(name, self._guessType(name), False)
-            self.variables[name].set(value, self.separator, self.variables)
-
-    def default(self, name, value):
-        '''Sets a single variable only if it is not already set!'''
-        name = str(name)
-        if self.asWriter:
-            self._writeVarToXML(name, 'default', value)
-        else:
-            # Here it is different from the other actions because after a 'declare'
-            # we cannot tell if the variable was already set or not.
-            # FIXME: improve declare() to allow for a default.
-            if name not in self.variables:
-                if self._guessType(name) == 'list':
-                    v = Variable.List(name, False)
-                else:
-                    v = Variable.Scalar(name, False)
-                if self.loadFromSystem and name in os.environ:
-                    v.set(os.environ[name], os.pathsep,
-                          environment=self.variables)
-                else:
-                    v.set(value, self.separator, environment=self.variables)
-                self.variables[name] = v
-            else:
-                v = self.variables[name]
-                if not v.val:
-                    v.set(value, self.separator, environment=self.variables)
-
-    def unset(self, name, value=None):  # pylint: disable=W0613
-        '''Unsets a single variable to an empty value - overrides any previous value!'''
-        if self.asWriter:
-            self._writeVarToXML(name, 'unset', '')
-        else:
-            if name in self.variables:
-                del self.variables[name]
-
-    def remove(self, name, value, regexp=False):
-        '''Remove value from variable.'''
-        if self.asWriter:
-            self._writeVarToXML(name, 'remove', value)
-        else:
-            if name not in self.variables:
-                self.declare(name, self._guessType(name), False)
-            self.variables[name].remove(value, self.separator, regexp)
-
-    def remove_regexp(self, name, value):
-        self.remove(name, value, True)
-
-    def searchFile(self, filename, varName):
-        '''Searches for appearance of variable in a file.'''
-        XMLFile = xmlModule.XMLFile()
-        variable = XMLFile.variable(filename, name=varName)
-        return variable
-
-    def loadXML(self, fileName=None, namespace='EnvSchema'):
-        '''Loads XML file for input variables.'''
-        XMLfile = xmlModule.XMLFile()
-        fileName = self._locate(fileName)
-        if fileName in self.loadedFiles:
-            self.log.info('ignore %s: already loaded', fileName)
-            return  # ignore recursion
-        self.log.debug('loading %s', fileName)
-        self.loadedFiles.add(fileName)
-        dot = self.variables['.']
-        # push the previous value of ${.} onto the stack...
-        self._fileDirStack.append(dot.value())
-        # ... and update the variable
-        dot.set(os.path.dirname(fileName))
-        variables = XMLfile.variable(fileName, namespace=namespace)
-        for i, (action, args) in enumerate(variables):
-            if action not in self.actions:
-                self.log.error(('Node {0}: No action taken with var "{1}". '
-                                'Probably wrong action argument: "{2}".')
-                               .format(i, args[0], action))
-            else:
-                self.actions[action](*args)  # pylint: disable=W0142
-        # restore the old value of ${.}
-        dot.set(self._fileDirStack.pop())
-        # ensure that a change of ${.} in the file is reverted when exiting it
-        self.variables['.'] = dot
-
-    def startXMLinput(self):
-        '''Renew writer for new input.'''
-        self.writer.resetWriter()
-
-    def finishXMLinput(self, outputFile=''):
-        '''Finishes input of XML file and closes the file.'''
-        self.writer.writeToFile(outputFile)
-
-    def writeToFile(self, fileName, shell='sh'):
-        '''Creates an output file with a specified name to be used for setting variables by sourcing this file'''
-        f = open(fileName, 'w')
-        if shell == 'sh':
-            f.write('#!/bin/bash\n')
-            for variable in self.variables:
-                if not self[variable].local:
-                    f.write('export ' + variable + '=' +
-                            self[variable].value(True, os.pathsep) + '\n')
-        elif shell == 'csh':
-            f.write('#!/bin/csh\n')
-            for variable in self.variables:
-                if not self[variable].local:
-                    f.write('setenv ' + variable + ' ' +
-                            self[variable].value(True, os.pathsep) + '\n')
-        else:
-            f.write('')
-            f.write('REM This is an enviroment settings file generated on ' +
-                    strftime("%a, %d %b %Y %H:%M:%S\n", gmtime()))
-            for variable in self.variables:
-                if not self[variable].local:
-                    f.write('set ' + variable + '=' +
-                            self[variable].value(True, os.pathsep) + '\n')
-
-        f.close()
-
-    def writeToXMLFile(self, fileName):
-        '''Writes the current state of environment to a XML file.
-
-        NOTE: There is no trace of actions taken, variables are written with a set action only.
-        '''
-        writer = xmlModule.XMLFile()
-        for varName in self.variables:
-            if varName == '.':
-                continue  # this is an internal transient variable
-            writer.writeVar(
-                varName, 'set', self.variables[varName].value(True, self.separator))
-        writer.writeToFile(fileName)
-
-    def presetFromSystem(self):
-        '''Loads all variables from the current system settings.'''
-        for k, v in os.environ.items():
-            if k not in self.variables:
-                self.set(k, v)
-
-    def process(self):
-        '''
-        Call the variable processors on all the variables.
-        '''
-        for v in self.variables.values():
-            v.val = v.process(v.val, self.variables)
-
-    def _concatenate(self, value):
-        '''Returns a variable string with separator separator from the values list'''
-        stri = ""
-        for it in value:
-            stri += it + self.separator
-        stri = stri[0:len(stri) - 1]
-        return stri
-
-    def _writeVarToXML(self, name, action, value, vartype='list', local='false'):
-        '''Writes single variable to XML file.'''
-        if isinstance(value, list):
-            value = self._concatenate(value)
-        self.writer.writeVar(name, action, value, vartype, local)
-
-    def __getitem__(self, key):
-        return self.variables[key]
-
-    def __setitem__(self, key, value):
-        if key in self.variables.keys():
-            self.log.warning(
-                'Addition canceled because of duplicate entry. Var: "%s" value: "%s".', key, value)
-        else:
-            self.append(key, value)
-
-    def __delitem__(self, key):
-        del self.variables[key]
-
-    def __iter__(self):
-        for i in self.variables:
-            yield i
-
-    def __contains__(self, item):
-        return item in self.variables.keys()
-
-    def __len__(self):
-        return len(self.variables.keys())
diff --git a/cmake/EnvConfig/TestEnvOps.py b/cmake/EnvConfig/TestEnvOps.py
deleted file mode 100644
index b615ef65f995bd521ea504d813924b5f7f22febc..0000000000000000000000000000000000000000
--- a/cmake/EnvConfig/TestEnvOps.py
+++ /dev/null
@@ -1,677 +0,0 @@
-'''
-Created on Jul 12, 2011
-
-@author: mplajner
-'''
-import unittest
-import os
-import sys
-import shutil
-from tempfile import mkdtemp
-
-from EnvConfig import Variable
-from EnvConfig import Control
-
-# Keep only some Variable processors.
-saved_processors = Variable.processors
-Variable.processors = [Variable.EnvExpander,
-                       Variable.PathNormalizer,
-                       Variable.DuplicatesRemover]
-
-
-def buildDir(files, rootdir=os.curdir):
-    '''
-    Create a directory structure from the content of files.
-
-    @param files: a dictionary or list of pairs mapping a filename to the content
-                  if the content is a dictionary, recurse
-    @param rootdir: base directory
-    '''
-    if type(files) is dict:
-        files = files.items()
-
-    # ensure that the root exists (to allow empty directories)
-    if not os.path.exists(rootdir):
-        os.makedirs(rootdir)
-
-    # create all the entries
-    for filename, data in files:
-        filename = os.path.join(rootdir, filename)
-        if type(data) is dict:
-            buildDir(data, filename)
-        else:
-            d = os.path.dirname(filename)
-            if not os.path.exists(d):
-                os.makedirs(d)
-            f = open(filename, "w")
-            if data:
-                f.write(data)
-            f.close()
-
-
-class TempDir(object):
-    '''
-    Class for easy creation, use and removal of temporary directory structures.
-    '''
-
-    def __init__(self, files=None):
-        self.tmpdir = mkdtemp()
-        if files is None:
-            files = {}
-        buildDir(files, self.tmpdir)
-
-    def __del__(self):
-        shutil.rmtree(self.tmpdir, ignore_errors=False)
-
-    def __call__(self, *args):
-        '''
-        Return the absolute path to a file in the temporary directory.
-        '''
-        return os.path.join(self.tmpdir, *args)
-
-
-class TemporaryDir(object):
-    '''
-    Helper class to create a temporary directory and manage its lifetime.
-
-    An instance of this class can be used inside the 'with' statement and
-    returns the path to the temporary directory.
-    '''
-
-    def __init__(self, chdir=False, keep=False):
-        '''Constructor.'''
-        self.chdir = chdir
-        self.keep = keep
-        self.path = mkdtemp()
-        self.old_dir = None
-
-    def join(self, *args):
-        '''
-        Equivalent to os.path.join(self.path, *args).
-        '''
-        return os.path.join(self.path, *args)
-
-    def __str__(self):
-        '''String representation (path to the temporary directory).'''
-        return self.path
-
-    def remove(self):
-        '''
-        Remove the temporary directory.
-        After a call to this method, the object is not usable anymore.
-        '''
-        if self.path:  # allow multiple calls to the remove method
-            shutil.rmtree(self.path, ignore_errors=True)
-            self.path = None
-
-    def __enter__(self):
-        '''
-        Context Manager protocol 'enter' function.
-        '''
-        if self.chdir:
-            self.old_dir = os.getcwd()
-            os.chdir(self.path)
-        return self.path
-
-    def __exit__(self, exc_type, exc_val, exc_tb):
-        '''
-        Context Manager protocol 'exit' function.
-        Remove the temporary directory and let the exceptions propagate.
-        '''
-        if self.old_dir:
-            os.chdir(self.old_dir)
-            self.old_dir = None
-        if not self.keep:
-            self.remove()
-        else:
-            print "WARNING: not removing temporary directory", self.path
-        return False
-
-
-class Test(unittest.TestCase):
-
-    def setUp(self):
-        pass
-
-    def tearDown(self):
-        pass
-
-    def testValues(self):
-        '''Test of value appending, prepending, setting, unsetting, removing'''
-        control = Control.Environment()
-
-        self.assertFalse('MY_PATH' in control.vars())
-        control.append('MY_PATH', 'newValue')
-        self.assertTrue('MY_PATH' in control.vars())
-        var = control.var('MY_PATH')
-
-        control.append('MY_PATH', 'newValue:secondVal:valval')
-        self.assertTrue(var[len(var) - 1] == 'valval')
-
-        self.assertTrue('newValue' in var)
-        control.remove('MY_PATH', 'newValue')
-        self.assertFalse('newValue' in var)
-
-        control.prepend('MY_PATH', 'newValue')
-        self.assertTrue('newValue' == var[0])
-
-        control.set('MY_PATH', 'hi:hello')
-        self.assertTrue(len(var) == 2)
-        self.assertTrue('hi' == var[0])
-
-        control.unset('MY_PATH')
-        self.assertTrue('MY_PATH' not in control)
-
-    def testHidingDotVar(self):
-        control = Control.Environment()
-        control.variables['.'].set('some/dir')
-
-        self.assertTrue('.' in control.variables)
-        self.assertTrue('.' not in control.vars())
-        self.assertTrue('.' not in control.vars(strings=False))
-
-        control.set('MY_DIR', '${.}')
-        self.assertEqual(control.var('MY_DIR').value(True), 'some/dir')
-        self.assertEqual(control.vars()['MY_DIR'], 'some/dir')
-
-    def testWrite(self):
-        """XML file write and load test"""
-        control = Control.Environment(useAsWriter=True)
-        control.unset('MY_PATH')
-        control.set('MY_PATH', 'set:toDelete')
-        control.append('MY_PATH', 'appended:toDelete')
-        control.prepend('MY_PATH', 'prepended:toDelete')
-        control.remove('MY_PATH', 'toDelete')
-        control.finishXMLinput('testOutputFile.xml')
-
-        control = Control.Environment()
-        self.assertFalse('MY_PATH' in control.vars())
-        control.loadXML('testOutputFile.xml')
-
-        self.assertTrue('MY_PATH' in control.vars())
-        var = control.var('MY_PATH')
-        self.assertTrue(var[0] == 'prepended')
-        self.assertTrue(var[1] == 'set')
-        self.assertTrue(var[2] == 'appended')
-        self.assertFalse('toDelete' in var)
-
-        os.remove('testOutputFile.xml')
-
-    def testWriteWithList(self):
-        """XML file write and load test"""
-        control = Control.Environment(useAsWriter=True)
-        control.unset('MY_PATH')
-        control.set('MY_PATH', ['set', 'toDelete'])
-        control.append('MY_PATH', ['appended', 'toDelete'])
-        control.prepend('MY_PATH', ['prepended', 'toDelete'])
-        control.remove('MY_PATH', ['toDelete'])
-        control.finishXMLinput('testOutputFile.xml')
-
-        control = Control.Environment()
-        self.assertFalse('MY_PATH' in control.vars())
-        control.loadXML('testOutputFile.xml')
-
-        self.assertTrue('MY_PATH' in control.vars())
-        var = control.var('MY_PATH')
-        self.assertTrue(var[0] == 'prepended')
-        self.assertTrue(var[1] == 'set')
-        self.assertTrue(var[2] == 'appended')
-        self.assertFalse('toDelete' in var)
-
-        os.remove('testOutputFile.xml')
-
-    def testSaveToXML(self):
-        """XML file write and load test"""
-        control = Control.Environment()
-
-        control.unset('MY_PATH')
-        control.set('MY_PATH', 'set:toDelete')
-        control.append('MY_PATH', 'appended:toDelete')
-        control.prepend('MY_PATH', 'prepended:toDelete')
-        control.remove('MY_PATH', 'toDelete')
-        control.writeToXMLFile('testOutputFile.xml')
-
-        control = Control.Environment()
-        self.assertFalse('MY_PATH' in control.vars())
-        control.loadXML('testOutputFile.xml')
-
-        self.assertTrue('MY_PATH' in control.vars())
-        var = control.var('MY_PATH')
-        self.assertTrue(var[0] == 'prepended')
-        self.assertTrue(var[1] == 'set')
-        self.assertTrue(var[2] == 'appended')
-        self.assertFalse('toDelete' in var)
-
-        os.remove('testOutputFile.xml')
-
-    def testSaveToFile(self):
-        '''Test addition of variable to system'''
-        control = Control.Environment()
-
-        control.append('sysVar', 'newValue:lala')
-        control.writeToFile('setupFile.txt')
-
-        with open('setupFile.txt', "r") as f:
-            f.readline()
-            stri = f.readline()
-        f.close()
-
-        self.assertEqual(stri, 'export sysVar=newValue:lala\n')
-
-        os.remove('setupFile.txt')
-
-    def testSearch(self):
-        '''Testing searching in variables'''
-        control = Control.Environment()
-
-        control.append('MY_PATH', 'newValue:mess:something new:aaaabbcc')
-
-        def count(val, regExp=False):
-            return len(control.search('MY_PATH', val, regExp))
-
-        self.assertEqual(count('new'), 0)
-        self.assertEqual(count('newValue'), 1)
-
-        self.assertEqual(count('me', False), 0)
-        self.assertEqual(count('me', True), 2)
-
-        self.assertEqual(count('cc', False), 0)
-        self.assertEqual(count('cc', True), 1)
-
-        self.assertEqual(count('a{2}b{2}c{2}', True), 1)
-        self.assertEqual(count('a{2}b{2}', True), 1)
-        self.assertEqual(count('a{1}b{2}c{2}', True), 1)
-        self.assertEqual(count('a{1}b{1}c{2}', True), 0)
-        self.assertEqual(count('a{1,2}b{1,2}c{2}', True), 1)
-        self.assertEqual(count('a{2,3}', True), 1)
-        self.assertEqual(count('a{2,3}?', True), 1)
-
-    def testVariables(self):
-        '''Tests variables creation and redeclaration.'''
-        control = Control.Environment()
-
-        control.append('MY_PATH', 'newValue')
-        self.assertFalse(control.var('MY_PATH').local)
-        self.assertTrue(isinstance(control.var('MY_PATH'), Variable.List))
-
-        control.declare('loc', 'list', True)
-        self.assertTrue(control.var('loc').local)
-        self.assertTrue(isinstance(control.var('loc'), Variable.List))
-
-        control.declare('myVar2', 'scalar', False)
-        self.assertFalse(control.var('myVar2').local)
-        self.assertTrue(isinstance(control.var('myVar2'), Variable.Scalar))
-
-        control.declare('loc2', 'scalar', True)
-        self.assertTrue(control.var('loc2').local)
-        self.assertTrue(isinstance(control.var('loc2'), Variable.Scalar))
-
-        control.declare('MY_PATH', 'list', False)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'MY_PATH', 'list', True)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'MY_PATH', 'scalar', True)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'MY_PATH', 'scalar', True)
-
-        control.declare('loc', 'list', True)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'loc', 'list', False)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'loc', 'scalar', True)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'loc', 'scalar', True)
-
-        control.declare('myVar2', 'scalar', False)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'myVar2', 'list', False)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'myVar2', 'list', True)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'myVar2', 'scalar', True)
-
-        control.declare('loc2', 'scalar', True)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'loc2', 'list', False)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'loc2', 'list', True)
-        self.failUnlessRaises(
-            Variable.EnvError, control.declare, 'loc2', 'scalar', False)
-
-    def testDelete(self):
-        control = Control.Environment()
-
-        control.append('MY_PATH', 'myVal:anotherVal:lastVal')
-        control.remove('MY_PATH', 'anotherVal')
-
-        self.assertFalse('anotherVal' in control['MY_PATH'])
-        self.assertTrue('myVal' in control['MY_PATH'])
-        self.assertTrue('lastVal' in control['MY_PATH'])
-
-        control.set('MY_PATH', 'myVal:anotherVal:lastVal:else')
-        control.remove('MY_PATH', '^anotherVal$', False)
-        self.assertTrue('anotherVal' in control['MY_PATH'])
-        control.remove('MY_PATH', '^anotherVal$', True)
-        self.assertFalse('anotherVal' in control['MY_PATH'])
-        self.assertTrue('myVal' in control['MY_PATH'])
-        self.assertTrue('lastVal' in control['MY_PATH'])
-        self.assertTrue('lastVal' in control['MY_PATH'])
-        control.remove('MY_PATH', 'Val', True)
-        self.assertTrue('else' in control['MY_PATH'])
-        self.assertTrue(len(control['MY_PATH']) == 1)
-
-        control.declare('myLoc', 'scalar', False)
-        control.append('myLoc', 'myVal:anotherVal:lastVal')
-        control.remove('myLoc', 'Val:', True)
-        self.assertTrue(str(control['myLoc']) == 'myanotherlastVal')
-
-    def testSystemEnvironment(self):
-        control = Control.Environment()
-
-        os.environ['MY_PATH'] = '$myVal'
-        os.environ['myScal'] = '$myVal'
-
-        control.set('ABC', 'anyValue')
-        control.declare('MY_PATH', 'list', False)
-        control.append('MY_PATH', '$ABC')
-        self.assertTrue(control['MY_PATH'].value(True) == '$myVal:anyValue')
-
-        control.declare('myScal', 'scalar', False)
-        control.append('myScal', '$ABC')
-        self.assertTrue(control['myScal'].value(True) == '$myValanyValue')
-
-    def testDependencies(self):
-        control = Control.Environment()
-
-        control.declare('myVar', 'list', False)
-
-        control.declare('loc', 'list', True)
-        control.append('loc', 'locVal')
-        control.append('loc', 'locVal2')
-
-        control.declare('scal', 'scalar', False)
-        control.append('scal', 'scalVal')
-        control.append('scal', 'scalVal2')
-
-        control.declare('scal2', 'scalar', True)
-        control.append('scal2', 'locScal')
-        control.append('scal2', 'locScal2')
-
-        control.set('myVar', 'newValue:$loc:endValue')
-        self.assertEqual(str(control['myVar']),
-                         'newValue:locVal:locVal2:endValue')
-
-        control.set('myVar', 'newValue:$scal:endValue')
-        self.assertEqual(str(control['myVar']),
-                         'newValue:scalValscalVal2:endValue')
-
-        control.set('myVar', 'new${scal}Value:endValue')
-        self.assertEqual(str(control['myVar']),
-                         'newscalValscalVal2Value:endValue')
-
-        control.set('myVar', 'bla:$myVar:Value')
-        self.assertEqual(
-            str(control['myVar']), 'bla:newscalValscalVal2Value:endValue:Value')
-
-        control.set('scal', 'new${scal2}Value')
-        self.assertEqual(str(control['scal']), 'newlocScallocScal2Value')
-
-        control.set('scal', 'new${loc}Value')
-        self.assertEqual(str(control['scal']), 'newlocVal:locVal2Value')
-
-        control.set('scal2', 'new${scal2}Value')
-        self.assertEqual(str(control['scal2']), 'newlocScallocScal2Value')
-
-    def testInclude(self):
-        tmp = TempDir({'first.xml':
-                       '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:set variable="main">first</env:set>
-<env:append variable="test_path">data1</env:append>
-<env:include>first_inc.xml</env:include>
-</env:config>''',
-                       'second.xml':
-                       '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:set variable="main">second</env:set>
-<env:include>second_inc.xml</env:include>
-<env:append variable="test_path">data1</env:append>
-</env:config>''',
-                       'third.xml':
-                       '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:set variable="main">third</env:set>
-<env:append variable="test_path">data1</env:append>
-<env:include>subdir/first_inc.xml</env:include>
-</env:config>''',
-                       'fourth.xml':
-                       '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:set variable="main">fourth</env:set>
-<env:include hints="subdir2">fourth_inc.xml</env:include>
-</env:config>''',
-                       'recursion.xml':
-                       '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:set variable="main">recursion</env:set>
-<env:include>recursion.xml</env:include>
-</env:config>''',
-                       'first_inc.xml':
-                       '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:append variable="test_path">data2</env:append>
-<env:append variable="derived">another_${main}</env:append>
-</env:config>''',
-                       'subdir': {'second_inc.xml':
-                                  '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:append variable="test_path">data0</env:append>
-<env:set variable="map">this_is_second_inc</env:set>
-</env:config>''',
-                                  'first_inc.xml':
-                                  '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:append variable="derived">second_${main}</env:append>
-</env:config>''',
-                                  'fourth_inc.xml':
-                                  '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:append variable="included">from subdir</env:append>
-</env:config>''', },
-                       'subdir2': {'fourth_inc.xml':
-                                   '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:append variable="included">from subdir2</env:append>
-</env:config>''', }})
-
-        # set the basic search path to the minimal default
-        if 'ENVXMLPATH' in os.environ:
-            del os.environ['ENVXMLPATH']
-        import EnvConfig
-        saved_path = list(EnvConfig.path)
-        EnvConfig.path[:] = ['.']
-
-        control = Control.Environment(searchPath=[])
-
-        #self.assertRaises(OSError, control.loadXML, tmp('first.xml'))
-        control.loadXML(tmp('first.xml'))
-        self.assertEqual(str(control['main']), 'first')
-        self.assertEqual(str(control['test_path']), 'data1:data2')
-        self.assertEqual(str(control['derived']), 'another_first')
-
-        control = Control.Environment(searchPath=[tmp()])
-        control.loadXML(tmp('first.xml'))
-        self.assertEqual(str(control['main']), 'first')
-        self.assertEqual(str(control['test_path']), 'data1:data2')
-        self.assertEqual(str(control['derived']), 'another_first')
-
-        control = Control.Environment(searchPath=[tmp()])
-        control.loadXML('first.xml')
-        self.assertEqual(str(control['main']), 'first')
-        self.assertEqual(str(control['test_path']), 'data1:data2')
-        self.assertEqual(str(control['derived']), 'another_first')
-
-        control = Control.Environment(searchPath=[tmp()])
-        self.assertRaises(OSError, control.loadXML, tmp('second.xml'))
-
-        control = Control.Environment(searchPath=[tmp(), tmp('subdir')])
-        control.loadXML(tmp('second.xml'))
-        self.assertEqual(str(control['main']), 'second')
-        self.assertEqual(str(control['test_path']), 'data0:data1')
-        self.assertEqual(str(control['map']), 'this_is_second_inc')
-
-        control = Control.Environment(searchPath=[tmp(), tmp('subdir')])
-        control.loadXML(tmp('first.xml'))
-        self.assertEqual(str(control['main']), 'first')
-        self.assertEqual(str(control['test_path']), 'data1:data2')
-        self.assertEqual(str(control['derived']), 'another_first')
-
-        control = Control.Environment(searchPath=[tmp('subdir'), tmp()])
-        control.loadXML(tmp('first.xml'))
-        self.assertEqual(str(control['main']), 'first')
-        self.assertEqual(str(control['test_path']), 'data1:data2')
-        self.assertEqual(str(control['derived']), 'another_first')
-
-        control = Control.Environment(searchPath=[tmp('subdir'), tmp()])
-        control.loadXML('first.xml')
-        self.assertEqual(str(control['main']), 'first')
-        self.assertEqual(str(control['test_path']), 'data1:data2')
-        self.assertEqual(str(control['derived']), 'another_first')
-
-        #os.environ['ENVXMLPATH'] = os.pathsep.join([tmp(), tmp('subdir')])
-        EnvConfig.path[:] = ['.', tmp(), tmp('subdir')]
-        control = Control.Environment(searchPath=[])
-        control.loadXML(tmp('second.xml'))
-        self.assertEqual(str(control['main']), 'second')
-        self.assertEqual(str(control['test_path']), 'data0:data1')
-        self.assertEqual(str(control['map']), 'this_is_second_inc')
-        #del os.environ['ENVXMLPATH']
-        EnvConfig.path[:] = ['.']
-
-        control = Control.Environment(searchPath=[])
-        control.loadXML(tmp('third.xml'))
-        self.assertEqual(str(control['main']), 'third')
-        self.assertEqual(str(control['test_path']), 'data1')
-        self.assertEqual(str(control['derived']), 'second_third')
-
-        control = Control.Environment(searchPath=[tmp('subdir')])
-        control.loadXML(tmp('fourth.xml'))
-        self.assertEqual(str(control['main']), 'fourth')
-        self.assertEqual(str(control['included']), 'from subdir')
-
-        control = Control.Environment(searchPath=[])
-        control.loadXML(tmp('fourth.xml'))
-        self.assertEqual(str(control['main']), 'fourth')
-        self.assertEqual(str(control['included']), 'from subdir2')
-
-        control = Control.Environment(searchPath=[])
-        #self.assertRaises(OSError, control.loadXML, tmp('first.xml'))
-        control.loadXML(tmp('recursion.xml'))
-
-        # restore search path
-        EnvConfig.path = saved_path
-
-    def testsVariablesInSearchPath(self):
-        with TemporaryDir(chdir=True) as tmp:
-            with open('EntryPoint.xenv', 'w') as f:
-                f.write('''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">'
-<env:default variable="INCLUDED_FILE_PATH">${.}/subdir</env:default>
-<env:search_path>${INCLUDED_FILE_PATH}</env:search_path>
-<env:include>Included.xenv</env:include>
-</env:config>''')
-            os.makedirs('subdir')
-            with open('subdir/Included.xenv', 'w') as f:
-                f.write('''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:set variable="INCLUDED_FILE">OK</env:set>
-</env:config>''')
-
-            control = Control.Environment(searchPath=[])
-            control.loadXML('EntryPoint.xenv')
-
-            self.assertEqual(
-                str(control['INCLUDED_FILE_PATH']), os.path.join(tmp, 'subdir'))
-            self.assertEqual(str(control['INCLUDED_FILE']), 'OK')
-
-    def testFileDir(self):
-        tmp = TempDir({'env.xml':
-                       '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:set variable="mydirs">${.}</env:set>
-<env:set variable="myparent">${.}/..</env:set>
-</env:config>'''})
-
-        control = Control.Environment()
-        control.loadXML(tmp('env.xml'))
-        self.assertEqual(str(control['mydirs']), tmp())
-        self.assertEqual(str(control['myparent']), os.path.dirname(tmp()))
-
-        olddir = os.getcwd()
-        os.chdir(tmp())
-        try:
-            control = Control.Environment()
-            control.loadXML('env.xml')
-            self.assertEqual(str(control['mydirs']), tmp())
-            self.assertEqual(str(control['myparent']), os.path.dirname(tmp()))
-        finally:
-            os.chdir(olddir)
-
-    def testDefaults(self):
-        tmp = TempDir({'env.xml':
-                       '''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:default variable="var1">value1</env:default>
-<env:declare variable="var2" local="true" />
-<env:default variable="var2">test2</env:default>
-</env:config>'''})
-
-        if 'var1' in os.environ:
-            del os.environ['var1']
-        control = Control.Environment()
-        control.loadXML(tmp('env.xml'))
-        self.assertEqual(str(control['var1']), "value1")
-        self.assertEqual(str(control['var2']), "test2")
-
-        os.environ['var1'] = "some_value"
-        control = Control.Environment()
-        control.loadXML(tmp('env.xml'))
-        self.assertEqual(str(control['var1']), "some_value")
-        self.assertEqual(str(control['var2']), "test2")
-
-    def testVariableManipulations(self):
-        l = Variable.List('PATH')
-
-        l.set("/usr/bin:/some//strange/../nice/./location")
-        assert l.value(asString=True) == "/usr/bin:/some/nice/location"
-
-        l.append("/another/path")
-        assert l.value(
-            asString=True) == "/usr/bin:/some/nice/location:/another/path"
-
-        # duplicates removal
-        l.append("/usr/bin")
-        assert l.value(
-            asString=True) == "/usr/bin:/some/nice/location:/another/path"
-        l.prepend("/another/path")
-        assert l.value(
-            asString=True) == "/another/path:/usr/bin:/some/nice/location"
-
-        s = Variable.Scalar('VAR')
-
-        s.set("/usr/bin")
-        assert s.value(asString=True) == "/usr/bin"
-
-        s.set("/some//strange/../nice/./location")
-        assert s.value(asString=True) == "/some/nice/location"
-
-        # This is undefined
-        # l.set("http://cern.ch")
-
-        s.set("http://cern.ch")
-        assert s.value(asString=True) == "http://cern.ch"
-
-
-if __name__ == "__main__":
-    #import sys;sys.argv = ['', 'Test.testName']
-    unittest.main()
diff --git a/cmake/EnvConfig/TestXMLOps.py b/cmake/EnvConfig/TestXMLOps.py
deleted file mode 100644
index e5167622a7aff26380b380252d4dc130267394a8..0000000000000000000000000000000000000000
--- a/cmake/EnvConfig/TestXMLOps.py
+++ /dev/null
@@ -1,125 +0,0 @@
-'''
-Created on Jul 15, 2011
-
-@author: mplajner
-'''
-import unittest
-import os
-from StringIO import StringIO
-
-from EnvConfig import Control
-from EnvConfig import xmlModule
-from tempfile import mkstemp
-
-
-class Test(unittest.TestCase):
-
-    def setUp(self):
-        pass
-
-    def tearDown(self):
-        pass
-
-    def testFileLoad(self):
-        '''Test loading of previously written file.'''
-        self.control = Control.Environment(useAsWriter=True)
-        self.control.unset('varToUnset')
-
-        self.control.declare('myVar', 'list', True)
-        self.control.set('myVar', 'setVal:$local')
-        self.control.append('myVar', 'appVal:appVal2')
-        self.control.prepend('myVar', 'prepVal:prepVal2')
-
-        self.control.declare('myScalar', 'scalar', False)
-        self.control.set('myScalar', 'setValscal')
-        self.control.append('myScalar', 'appValscal')
-        self.control.prepend('myScalar', 'prepValscal')
-
-        self.control.declare('myScalar2', 'scalar', True)
-
-        self.control.finishXMLinput('testOutputFile.xml')
-
-        loader = xmlModule.XMLFile()
-        variables = loader.variable('testOutputFile.xml')
-
-        expected = [('declare', ('varToUnset', 'list', 'false')),
-                    ('unset', ('varToUnset', '', None)),
-                    ('declare', ('myVar', 'list', 'true')),
-                    ('set', ('myVar', 'setVal:$local', None)),
-                    ('append', ('myVar', 'appVal:appVal2', None)),
-                    ('prepend', ('myVar', 'prepVal:prepVal2', None)),
-                    ('declare', ('myScalar', 'scalar', 'false')),
-                    ('set', ('myScalar', 'setValscal', None)),
-                    ('append', ('myScalar', 'appValscal', None)),
-                    ('prepend', ('myScalar', 'prepValscal', None)),
-                    ('declare', ('myScalar2', 'scalar', 'true'))]
-
-        self.assertEqual(variables, expected)
-
-        os.remove('testOutputFile.xml')
-
-    def testParsing(self):
-        data = StringIO('''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:declare local="false" type="list" variable="varToUnset"/>
-<env:unset variable="varToUnset"/>
-<env:declare local="true" type="list" variable="myVar"/>
-<env:set variable="myVar">setVal:$local</env:set>
-<env:append variable="myVar">appVal:appVal2</env:append>
-<env:prepend variable="myVar">prepVal:prepVal2</env:prepend>
-<env:declare local="false" type="scalar" variable="myScalar"/>
-<env:set variable="myScalar">setValscal</env:set>
-<env:append variable="myScalar">appValscal</env:append>
-<env:prepend variable="myScalar">prepValscal</env:prepend>
-<env:declare local="true" type="scalar" variable="myScalar2"/>
-<env:include>some_file.xml</env:include>
-<env:include hints="some:place">another_file.xml</env:include>
-</env:config>''')
-
-        loader = xmlModule.XMLFile()
-        variables = loader.variable(data)
-
-        expected = [('declare', ('varToUnset', 'list', 'false')),
-                    ('unset', ('varToUnset', '', None)),
-                    ('declare', ('myVar', 'list', 'true')),
-                    ('set', ('myVar', 'setVal:$local', None)),
-                    ('append', ('myVar', 'appVal:appVal2', None)),
-                    ('prepend', ('myVar', 'prepVal:prepVal2', None)),
-                    ('declare', ('myScalar', 'scalar', 'false')),
-                    ('set', ('myScalar', 'setValscal', None)),
-                    ('append', ('myScalar', 'appValscal', None)),
-                    ('prepend', ('myScalar', 'prepValscal', None)),
-                    ('declare', ('myScalar2', 'scalar', 'true')),
-                    ('include', ('some_file.xml', None, '')),
-                    ('include', ('another_file.xml', None, 'some:place'))]
-
-        self.assertEqual(variables, expected)
-
-    def testParsingError(self):
-        fd, filename = mkstemp()
-        f = os.fdopen(fd, 'w')
-        f.write('''<?xml version="1.0" ?>
-<env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
-<env:set variable="error">invalid</env:default>
-</env:config>''')
-        f.close()
-        try:
-            import logging
-            stream = StringIO()
-            hdlr = logging.StreamHandler(stream)
-            logging.getLogger().addHandler(hdlr)
-
-            loader = xmlModule.XMLFile()
-            self.assertRaises(SystemExit, loader.variable, filename)
-
-            self.assertTrue(('Failed to parse %s:' % filename)
-                            in stream.getvalue(), 'missing error message')
-
-        finally:
-            logging.getLogger().removeHandler(hdlr)
-            os.remove(filename)
-
-
-if __name__ == "__main__":
-    #import sys;sys.argv = ['', 'Test.testName']
-    unittest.main()
diff --git a/cmake/EnvConfig/Variable.py b/cmake/EnvConfig/Variable.py
deleted file mode 100644
index 7cfc8bcefea9e40edf43988f63163c213285943c..0000000000000000000000000000000000000000
--- a/cmake/EnvConfig/Variable.py
+++ /dev/null
@@ -1,413 +0,0 @@
-'''
-Created on Jun 27, 2011
-
-@author: mplajner
-'''
-import re
-import os
-import logging
-import functools
-from os import listdir
-from os.path import normpath
-from zipfile import is_zipfile
-
-
-class VariableProcessor(object):
-    '''
-    Base class for the objects used to process the variables.
-    '''
-
-    def __init__(self, env):
-        '''
-        @param env: dictionary with the reference environment to use
-        '''
-        if env is None:
-            env = {}
-        self._env = env
-
-    def isTarget(self, variable):
-        '''
-        Return True if this processor can operate on the given variable.
-        '''
-        return True
-
-    def process(self, variable, value):
-        '''
-        Process the variable.
-
-        @param value: the content of the variable to be processed
-        @return: the processed value
-        '''
-        # by default do nothing
-        return value
-
-    def __call__(self, variable, value):
-        return self.process(variable, value)
-
-
-class ListProcessor(VariableProcessor):
-    '''
-    Base class for processors operating only on lists.
-    '''
-
-    def isTarget(self, variable):
-        '''
-        Return True if this variable is a list.
-        '''
-        return isinstance(variable, List)
-
-
-class ScalarProcessor(VariableProcessor):
-    '''
-    Base class for processors operating only on scalars.
-    '''
-
-    def isTarget(self, variable):
-        '''
-        Return True if this variable is a scalar.
-        '''
-        return isinstance(variable, Scalar)
-
-
-class EnvExpander(VariableProcessor):
-    '''
-    Variable processor to expand the reference to environment variables.
-    '''
-
-    def __init__(self, env):
-        super(EnvExpander, self).__init__(env)
-        self._exp = re.compile(
-            r"\$([A-Za-z_][A-Za-z0-9_]*)|\$\(([A-Za-z_][A-Za-z0-9_]*)\)|\$\{([A-Za-z_][A-Za-z0-9_]*)\}|\$\{(\.)\}")
-
-    def isTarget(self, variable):
-        return (super(EnvExpander, self).isTarget(variable)
-                and variable.expandVars)
-
-    def _repl(self, value):
-        m = self._exp.search(value)
-        if m:
-            try:
-                value = (value[:m.start()]
-                         + str(self._env[filter(None, m.groups())[0]])
-                         + value[m.end():])
-            except KeyError, k:
-                logging.debug(
-                    'KeyError: %s unknown while expanding %s', k, value)
-                return value
-            return self._repl(value)
-        else:
-            return value
-
-    def process(self, variable, value):
-        if isinstance(value, str):
-            value = self._repl(value)
-        else:
-            # expand only in the elements that are new
-            old_values = set(variable.val)
-            value = map(
-                lambda v: v if v in old_values else self._repl(v), value)
-        return value
-
-
-class PathNormalizer(VariableProcessor):
-    '''
-    Call os.path.normpath for all the entries of the variable.
-    '''
-
-    def process(self, variable, value):
-        if not value:  # do not process empty strings/lists
-            return value
-        if isinstance(value, str):
-            if '://' not in value:  # this might be a URL
-                value = normpath(value)
-        else:
-            value = [normpath(v) for v in value if v]
-        return value
-
-
-class DuplicatesRemover(ListProcessor):
-    '''
-    Remove duplicates entries from lists.
-    '''
-
-    def process(self, variable, value):
-        val = []
-        for s in value:
-            if s not in val:
-                val.append(s)
-        return val
-
-
-def memoize(func):
-    '''
-    Memoization decorator for a function taking a single argument.
-    '''
-
-    cache = func.cache = {}
-
-    @functools.wraps(func)
-    def memoizer(arg):
-        try:
-            return cache[arg]
-        except KeyError:
-            return cache.setdefault(arg, func(arg))
-
-    return memoizer
-
-
-normpath = memoize(normpath)
-is_zipfile = memoize(is_zipfile)
-
-
-@memoize
-def isnonemptydir(path):
-    '''
-    Return whether a path is a list-able non-empty directory.
-    '''
-
-    try:
-        return bool(listdir(path))
-    except OSError:
-        return False
-
-
-class EmptyDirsRemover(ListProcessor):
-    '''
-    Remove empty or not existing directories from lists.
-    '''
-
-    def process(self, variable, value):
-        return [s for s in value if s.endswith('.zip') or isnonemptydir(s)]
-
-
-class UsePythonZip(ListProcessor):
-    '''
-    Use .zip files instead of regular directories in PYTHONPATH when possible.
-    '''
-
-    def isTarget(self, variable):
-        return (super(UsePythonZip, self).isTarget(variable)
-                and variable.varName == 'PYTHONPATH')
-
-    def process(self, variable, value):
-        val = []
-        for s in value:
-            z = s + '.zip'
-            if is_zipfile(z):
-                val.append(z)
-            else:
-                val.append(s)
-        return val
-
-
-# Default (minimal) set of processors.
-processors = [EnvExpander, PathNormalizer, DuplicatesRemover,
-              # special processors
-              EmptyDirsRemover, UsePythonZip
-              ]
-
-# FIXME: these are back-ward compatibility hacks: we need a proper way to add/remove processors
-if ('no-strip-path' in os.environ.get('CMTEXTRATAGS', '')
-    or 'GAUDI_NO_STRIP_PATH' in os.environ
-        or 'LB_NO_STRIP_PATH' in os.environ):
-    processors.remove(EmptyDirsRemover)
-
-if 'no-pyzip' in os.environ.get('CMTEXTRATAGS', ''):
-    processors.remove(UsePythonZip)
-
-
-class VariableBase(object):
-    '''
-    Base class for the classes used to manipulate the environment.
-    '''
-
-    def __init__(self, name, local=False):
-        self.varName = name
-        self.local = local
-        self.expandVars = True
-        self.log = logging.getLogger('Variable')
-
-    def process(self, value, env):
-        '''
-        Call all the processors defined in the processors list on 'value'.
-
-        @return: the processed value
-        '''
-        for p in [c(env) for c in processors]:
-            if p.isTarget(self):
-                value = p(self, value)
-        return value
-
-
-class List(VariableBase):
-    '''
-    Class for manipulating with environment lists.
-
-    It holds its name and values represented by a list.
-    Some operations are done with separator, which is usually colon. For windows use semicolon.
-    '''
-
-    def __init__(self, name, local=False):
-        super(List, self).__init__(name, local)
-        self.val = []
-
-    def name(self):
-        '''Returns the name of the List.'''
-        return self.varName
-
-    def set(self, value, separator=':', environment=None):
-        '''Sets the value of the List. Any previous value is overwritten.'''
-        if isinstance(value, str):
-            value = value.split(separator)
-        self.val = self.process(value, environment)
-
-    def unset(self, value, separator=':', environment=None):  # pylint: disable=W0613
-        '''Sets the value of the List to empty. Any previous value is overwritten.'''
-        self.val = []
-
-    def value(self, asString=False, separator=':'):
-        '''Returns values of the List. Either as a list or string with desired separator.'''
-        if asString:
-            return separator.join(self.val)
-        else:
-            # clone the list
-            return list(self.val)
-
-    def remove_regexp(self, value, separator=':'):
-        self.remove(value, separator, True)
-
-    def remove(self, value, separator=':', regexp=False):
-        '''Removes value(s) from List. If value is not found, removal is canceled.'''
-        if regexp:
-            value = self.search(value, True)
-
-        elif isinstance(value, str):
-            value = value.split(separator)
-
-        for i in range(len(value)):
-            val = value[i]
-            if val not in value:
-                self.log.info(
-                    'Value "%s" not found in List: "%s". Removal canceled.', val, self.varName)
-            while val in self.val:
-                self.val.remove(val)
-
-    def append(self, value, separator=':', environment=None):
-        '''Adds value(s) at the end of the list.'''
-        if isinstance(value, str):
-            value = value.split(separator)
-        self.val = self.process(self.val + value, environment)
-
-    def prepend(self, value, separator=':', environment=None):
-        '''Adds value(s) at the beginning of the list.
-        resolve references and duplications'''
-        if isinstance(value, str):
-            value = value.split(separator)
-        self.val = self.process(value + self.val, environment)
-
-    def search(self, expr, regExp):
-        '''Searches in List's values for a match
-
-        Use string value or set regExp to True.
-        In the first case search is done only for an exact match for one of List`s value ('^' and '$' added).
-        '''
-        if not regExp:
-            expr = '^' + expr + '$'
-        v = re.compile(expr)
-        res = []
-        for val in self.val:
-            if v.search(val):
-                res.append(val)
-
-        return res
-
-    def __getitem__(self, key):
-        return self.val[key]
-
-    def __setitem__(self, key, value):
-        if value in self.val:
-            self.log.info(
-                'Var: "%s" value: "%s". Addition canceled because of duplicate entry.', self.varName, value)
-        else:
-            self.val.insert(key, value)
-
-    def __delitem__(self, key):
-        self.remove(self.val[key])
-
-    def __iter__(self):
-        for i in self.val:
-            yield i
-
-    def __contains__(self, item):
-        return item in self.val
-
-    def __len__(self):
-        return len(self.val)
-
-    def __str__(self):
-        return ':'.join(self.val)
-
-
-class Scalar(VariableBase):
-    '''Class for manipulating with environment scalars.'''
-
-    def __init__(self, name, local=False):
-        super(Scalar, self).__init__(name, local)
-        self.val = ''
-
-    def name(self):
-        '''Returns the name of the scalar.'''
-        return self.varName
-
-    def set(self, value, separator=':', environment=None):  # pylint: disable=W0613
-        '''Sets the value of the scalar. Any previous value is overwritten.'''
-        self.val = self.process(value, environment)
-
-    def unset(self, value, separator=':', environment=None):  # pylint: disable=W0613
-        '''Sets the value of the variable to empty. Any previous value is overwritten.'''
-        self.val = ''
-
-    def value(self, asString=False, separator=':'):  # pylint: disable=W0613
-        '''Returns values of the scalar.'''
-        return self.val
-
-    def remove_regexp(self, value, separator=':'):
-        self.remove(value, separator, True)
-
-    def remove(self, value, separator=':', regexp=True):  # pylint: disable=W0613
-        '''Removes value(s) from the scalar. If value is not found, removal is canceled.'''
-        value = self.search(value)
-        for val in value:
-            self.val = self.val.replace(val, '')
-
-    def append(self, value, separator=':', environment=None):  # pylint: disable=W0613
-        '''Adds value(s) at the end of the scalar.'''
-        self.val += self.process(value, environment)
-
-    def prepend(self, value, separator=':', environment=None):  # pylint: disable=W0613
-        '''Adds value(s) at the beginning of the scalar.'''
-        self.val = self.process(value, environment) + self.val
-
-    def search(self, expr):
-        '''Searches in scalar`s values for a match'''
-        return re.findall(expr, self.val)
-
-    def __str__(self):
-        return self.val
-
-
-class EnvError(Exception):
-    '''Class which defines errors for locals operations.'''
-
-    def __init__(self, value, code):
-        super(EnvError, self).__init__()
-        self.val = value
-        self.code = code
-
-    def __str__(self):
-        if self.code == 'undefined':
-            return 'Reference to undefined environment element: "' + self.val + '".'
-        elif self.code == 'ref2var':
-            return 'Reference to list from the middle of string.'
-        elif self.code == 'redeclaration':
-            return 'Wrong redeclaration of environment element "' + self.val + '".'
diff --git a/cmake/EnvConfig/__init__.py b/cmake/EnvConfig/__init__.py
deleted file mode 100644
index d74ce7b1ce87be115e5feaf0e760f610e1a5f1d7..0000000000000000000000000000000000000000
--- a/cmake/EnvConfig/__init__.py
+++ /dev/null
@@ -1,281 +0,0 @@
-__author__ = "Marco Clemencic <marco.clemencic@cern.ch>"
-
-import os
-import sys
-
-assert sys.version_info >= (2, 6), "Python 2.6 required"
-
-import logging
-
-from string import Template
-
-__all__ = []
-
-# Prepare the search path for environment XML files
-path = ['.']
-if 'ENVXMLPATH' in os.environ:
-    path.extend(os.environ['ENVXMLPATH'].split(os.pathsep))
-
-import Control
-
-
-class EnvError(RuntimeError):
-    '''
-    Simple class to wrap errors in the environment configuration.
-    '''
-    pass
-
-
-def splitNameValue(name_value):
-    """split the "NAME=VALUE" string into the tuple ("NAME", "VALUE")
-    replacing '[:]' with os.pathsep in VALUE"""
-    if '=' not in name_value:
-        raise EnvError("Invalid variable argument '%s'." % name_value)
-    n, v = name_value.split('=', 1)
-    return n, v.replace('[:]', os.pathsep)
-
-
-class Script(object):
-    '''
-    Environment Script class used to control the logic of the script and allow
-    extensions.
-    '''
-    __usage__ = "Usage: %prog [OPTION]... [NAME=VALUE]... [COMMAND [ARG]...]"
-    __desc__ = "Set each NAME to VALUE in the environment and run COMMAND."
-    __epilog__ = ("The operations are performed in the order they appear on the "
-                  "command line. If no COMMAND is provided, print the resulting "
-                  "environment. (Note: this command is modeled after the Unix "
-                  "command 'env', see \"man env\")")
-
-    def __init__(self, args=None):
-        '''
-        Initializes the script instance parsing the command line arguments (or
-        the explicit arguments provided).
-        '''
-        self.parser = None
-        self.opts = None
-        self.cmd = None
-        self.control = None
-        self.log = None
-        self.env = {}
-        # Run the core code of the script
-        self._prepare_parser()
-        self._parse_args(args)
-        self._check_args()
-
-    def _prepare_parser(self):
-        '''
-        Prepare an OptionParser instance used to analyze the command line
-        options and arguments.
-        '''
-        from optparse import OptionParser, OptionValueError
-        parser = OptionParser(prog=os.path.basename(sys.argv[0]),
-                              usage=self.__usage__,
-                              description=self.__desc__,
-                              epilog=self.__epilog__)
-        self.log = logging.getLogger(parser.prog)
-
-        def addOperation(option, opt, value, parser, action):
-            '''
-            Append to the list of actions the tuple (action, (<args>, ...)).
-            '''
-            if action not in ('unset', 'loadXML'):
-                try:
-                    value = splitNameValue(value)
-                except EnvError:
-                    raise OptionValueError(
-                        "Invalid value for option %s: '%s', it requires NAME=VALUE." % (opt, value))
-            else:
-                value = (value,)
-            parser.values.actions.append((action, value))
-
-        parser.add_option("-i", "--ignore-environment",
-                          action="store_true",
-                          help="start with an empty environment")
-        parser.add_option("-u", "--unset",
-                          metavar="NAME",
-                          action="callback", callback=addOperation,
-                          type="str", nargs=1, callback_args=('unset',),
-                          help="remove variable from the environment")
-        parser.add_option("-s", "--set",
-                          metavar="NAME=VALUE",
-                          action="callback", callback=addOperation,
-                          type="str", nargs=1, callback_args=('set',),
-                          help="set the variable NAME to VALUE")
-        parser.add_option("-a", "--append",
-                          metavar="NAME=VALUE",
-                          action="callback", callback=addOperation,
-                          type="str", nargs=1, callback_args=('append',),
-                          help="append VALUE to the variable NAME (with a '%s' as separator)" % os.pathsep)
-        parser.add_option("-p", "--prepend",
-                          metavar="NAME=VALUE",
-                          action="callback", callback=addOperation,
-                          type="str", nargs=1, callback_args=('prepend',),
-                          help="prepend VALUE to the variable NAME (with a '%s' as separator)" % os.pathsep)
-        parser.add_option("-x", "--xml",
-                          action="callback", callback=addOperation,
-                          type="str", nargs=1, callback_args=('loadXML',),
-                          help="XML file describing the changes to the environment")
-        parser.add_option("--sh",
-                          action="store_const", const="sh", dest="shell",
-                          help="Print the changes to the environment as shell commands for 'sh'-derived shells.")
-        parser.add_option("--csh",
-                          action="store_const", const="csh", dest="shell",
-                          help="Print the changes to the environment as shell commands for 'csh'-derived shells.")
-        parser.add_option("--py",
-                          action="store_const", const="py", dest="shell",
-                          help="Print the changes to the environment as Python dictionary.")
-        parser.add_option("-A", "--all",
-                          action="store_true",
-                          help="Print all variables, instead of just the changes, with --sh, --csh and --py.")
-
-        parser.add_option('--verbose', action='store_const',
-                          const=logging.INFO, dest='log_level',
-                          help='print more information')
-        parser.add_option('--debug', action='store_const',
-                          const=logging.DEBUG, dest='log_level',
-                          help='print debug messages')
-        parser.add_option('--quiet', action='store_const',
-                          const=logging.WARNING, dest='log_level',
-                          help='print only warning messages (default)')
-
-        parser.disable_interspersed_args()
-        parser.set_defaults(actions=[],
-                            ignore_environment=False,
-                            log_level=logging.WARNING)
-
-        self.parser = parser
-
-    def _parse_args(self, args=None):
-        '''
-        Parse the command line arguments.
-        '''
-        opts, args = self.parser.parse_args(args)
-
-        # set the logging level
-        logging.basicConfig(level=opts.log_level)
-
-        cmd = []
-        # find the (implicit) 'set' arguments in the list of arguments
-        # and put the rest in the command
-        try:
-            for i, a in enumerate(args):
-                opts.actions.append(('set', splitNameValue(a)))
-        except EnvError:
-            cmd = args[i:]
-
-        self.opts, self.cmd = opts, cmd
-
-    def _check_args(self):
-        '''
-        Check consistency of command line options and arguments.
-        '''
-        if self.opts.shell and self.cmd:
-            self.parser.error(
-                "Invalid arguments: --%s cannot be used with a command." % self.opts.shell)
-
-    def _makeEnv(self):
-        '''
-        Generate a dictionary of the environment variables after applying all
-        the required actions.
-        '''
-        # prepare the environment control instance
-        control = Control.Environment()
-        if not self.opts.ignore_environment:
-            control.presetFromSystem()
-
-        # apply all the actions
-        for action, args in self.opts.actions:
-            apply(getattr(control, action), args)
-
-        # extract the result env dictionary
-        env = control.vars()
-
-        # set the library search path correctly for the non-Linux platforms
-        if "LD_LIBRARY_PATH" in env:
-            # replace LD_LIBRARY_PATH with the corresponding one on other systems
-            if sys.platform.startswith("win"):
-                other = "PATH"
-            elif sys.platform.startswith("darwin"):
-                other = "DYLD_LIBRARY_PATH"
-            else:
-                other = None
-            if other:
-                if other in env:
-                    env[other] = env[other] + \
-                        os.pathsep + env["LD_LIBRARY_PATH"]
-                else:
-                    env[other] = env["LD_LIBRARY_PATH"]
-                del env["LD_LIBRARY_PATH"]
-
-        self.env = env
-
-    def dump(self):
-        '''
-        Print to standard output the final environment in the required format.
-        '''
-        if not self.opts.shell or self.opts.all:
-            # 'env' behaviour: print the whole environment
-            env = self.env
-        else:
-            # special dumps: print only the diffs
-            env = dict((name, value)
-                       for name, value in sorted(self.env.items())
-                       if os.environ.get(name) != value)
-
-        if self.opts.shell == 'py':
-            from pprint import pprint
-            pprint(env)
-        else:
-            template = {'sh':  "export {0}='{1}'",
-                        'csh': "setenv {0} '{1}';"}.get(self.opts.shell,
-                                                        "{0}={1}")
-            print '\n'.join(template.format(name, value)
-                            for name, value in sorted(env.items()))
-
-    def expandEnvVars(self, iterable):
-        '''
-        Return a copy of iterable where all the elements have the environment
-        variables expanded.
-
-        >>> s = Script([])
-        >>> s.env = {'A': '1', 'B': 'test'}
-        >>> s.expandEnvVars(['$A', '${B}-$A', '$DUMMY-$A', '$$B'])
-        ['1', 'test-1', '$DUMMY-1', '$B']
-        '''
-        return [Template(elem).safe_substitute(self.env) for elem in iterable]
-
-    def runCmd(self):
-        '''
-        Execute a command in the modified environment and return the exit code.
-        '''
-        from subprocess import Popen
-        cmd = self.expandEnvVars(self.cmd)
-        try:
-            proc = Popen(cmd, env=self.env)
-        except OSError, x:
-            print >> sys.stderr, '{0}: {1}: {2}'.format(sys.argv[0],
-                                                        cmd[0],
-                                                        x.strerror)
-            sys.exit(127)
-        while proc.poll() is None:
-            try:
-                proc.wait()
-            except KeyboardInterrupt:
-                self.log.fatal('KeyboardInterrupt, '
-                               'waiting for subprocess %d to end', proc.pid)
-        rc = proc.returncode
-        # There is a mismatch between Popen return code and sys.exit argument in
-        # case of signal.
-        # E.g. Popen returns -6 that is translated to 250 instead of 134
-        return rc if rc >= 0 else 128 - rc
-
-    def main(self):
-        '''
-        Main function of the script.
-        '''
-        self._makeEnv()
-        if not self.cmd:
-            self.dump()
-        else:
-            sys.exit(self.runCmd())
diff --git a/cmake/EnvConfig/_runtests.py b/cmake/EnvConfig/_runtests.py
deleted file mode 100644
index 8788bf3910decc1d28f6ab289811666f9573d7ba..0000000000000000000000000000000000000000
--- a/cmake/EnvConfig/_runtests.py
+++ /dev/null
@@ -1,7 +0,0 @@
-"""
-Wrapper to run the tests.
-"""
-import os
-from nose import main
-
-main(defaultTest=os.path.normpath(__file__ + "/../.."))
diff --git a/cmake/EnvConfig/xmlModule.py b/cmake/EnvConfig/xmlModule.py
deleted file mode 100644
index b148386498852380cbf8627545ddeae821044e95..0000000000000000000000000000000000000000
--- a/cmake/EnvConfig/xmlModule.py
+++ /dev/null
@@ -1,142 +0,0 @@
-'''
-Created on Jul 2, 2011
-
-@author: mplajner
-'''
-
-import logging
-
-from cPickle import load, dump
-from hashlib import md5  # pylint: disable=E0611
-
-from xml.dom import minidom
-from xml.parsers.expat import ExpatError
-
-
-class XMLFile(object):
-    '''Takes care of XML file operations such as reading and writing.'''
-
-    def __init__(self):
-        self.xmlResult = '<?xml version="1.0" encoding="UTF-8"?><env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">\n'
-        self.declaredVars = []
-        self.log = logging.getLogger('XMLFile')
-
-    def variable(self, path, namespace='EnvSchema', name=None):
-        '''Returns list containing name of variable, action and value.
-
-        @param path: a file name or a file-like object
-
-        If no name given, returns list of lists of all variables and locals(instead of action 'local' is filled).
-        '''
-        isFilename = type(path) is str
-        if isFilename:
-            checksum = md5()
-            checksum.update(open(path, 'rb').read())
-            checksum = checksum.digest()
-
-            cpath = path + "c"  # preparsed file
-            try:
-                f = open(cpath, 'rb')
-                oldsum, data = load(f)
-                if oldsum == checksum:
-                    return data
-            except IOError:
-                pass
-            except EOFError:
-                pass
-
-            caller = path
-        else:
-            caller = None
-
-        # Get file
-        try:
-            doc = minidom.parse(path)
-        except ExpatError, exc:
-            self.log.fatal('Failed to parse %s: %s', path, exc)
-            self.log.fatal(list(open(path))[exc.lineno - 1].rstrip())
-            self.log.fatal(' ' * exc.offset + '^')
-            raise SystemExit(1)
-
-        if namespace == '':
-            namespace = None
-
-        ELEMENT_NODE = minidom.Node.ELEMENT_NODE
-        # Get all variables
-        nodes = doc.getElementsByTagNameNS(namespace, "config")[0].childNodes
-        variables = []
-        for node in nodes:
-            # if it is an element node
-            if node.nodeType == ELEMENT_NODE:
-                action = str(node.localName)
-
-                if action == 'include':
-                    if node.childNodes:
-                        value = str(node.childNodes[0].data)
-                    else:
-                        value = ''
-                    variables.append(
-                        (action, (value, caller, str(node.getAttribute('hints')))))
-
-                elif action == 'search_path':
-                    if node.childNodes:
-                        value = str(node.childNodes[0].data)
-                    else:
-                        value = ''
-                    variables.append((action, (value, None, None)))
-
-                else:
-                    varname = str(node.getAttribute('variable'))
-                    if name and varname != name:
-                        continue
-
-                    if action == 'declare':
-                        variables.append((action, (varname, str(
-                            node.getAttribute('type')), str(node.getAttribute('local')))))
-                    else:
-                        if node.childNodes:
-                            value = str(node.childNodes[0].data)
-                        else:
-                            value = ''
-                        variables.append((action, (varname, value, None)))
-
-        if isFilename:
-            try:
-                f = open(cpath, 'wb')
-                dump((checksum, variables), f, protocol=2)
-                f.close()
-            except IOError:
-                pass
-        return variables
-
-    def resetWriter(self):
-        '''resets the buffer of writer'''
-        self.xmlResult = '<?xml version="1.0" encoding="UTF-8"?><env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">\n'
-        self.declaredVars = []
-
-    def writeToFile(self, outputFile=None):
-        '''Finishes the XML input and writes XML to file.'''
-        if outputFile is None:
-            raise IOError("No output file given")
-        self.xmlResult += '</env:config>'
-
-        doc = minidom.parseString(self.xmlResult)
-        with open(outputFile, "w") as f:
-            f.write(doc.toxml())
-
-        return outputFile
-
-    def writeVar(self, varName, action, value, vartype='list', local=False):
-        '''Writes a action to a file. Declare undeclared elements (non-local list is default type).'''
-        if action == 'declare':
-            self.xmlResult += '<env:declare variable="' + varName + '" type="' + \
-                vartype.lower() + '" local="' + (str(local)).lower() + '" />\n'
-            self.declaredVars.append(varName)
-            return
-
-        if varName not in self.declaredVars:
-            self.xmlResult += '<env:declare variable="' + varName + '" type="' + \
-                vartype + '" local="' + (str(local)).lower() + '" />\n'
-            self.declaredVars.append(varName)
-        self.xmlResult += '<env:' + action + ' variable="' + \
-            varName + '">' + value + '</env:' + action + '>\n'
diff --git a/cmake/GaudiProjectConfig.cmake b/cmake/GaudiProjectConfig.cmake
index d1f0f9592d6ba149d69e5aeb19cf358d9632182f..2ea8e2d2aaead285fe49ae23c6734b0d5e99edbd 100644
--- a/cmake/GaudiProjectConfig.cmake
+++ b/cmake/GaudiProjectConfig.cmake
@@ -398,8 +398,37 @@ macro(gaudi_project project version)
   # (python scripts are located as such but run through python)
   set(binary_paths ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_SOURCE_DIR}/GaudiPolicy/scripts ${CMAKE_SOURCE_DIR}/GaudiKernel/scripts ${CMAKE_SOURCE_DIR}/Gaudi/scripts ${binary_paths})
 
-  find_program(env_cmd xenv HINTS ${binary_paths})
-  set(env_cmd ${PYTHON_EXECUTABLE} ${env_cmd})
+  find_program(env_cmd NAMES xenv)
+  if(NOT env_cmd)
+    if(NOT EXISTS ${CMAKE_BINARY_DIR}/contrib/xenv)
+      execute_process(COMMAND git clone https://gitlab.cern.ch/gaudi/xenv.git ${CMAKE_BINARY_DIR}/contrib/xenv)
+    endif()
+    # I'd like to generate the script with executable permission, but I only
+    # found this workaround: https://stackoverflow.com/a/45515418
+    # - write a temporary file
+    file(WRITE "${CMAKE_BINARY_DIR}/xenv"
+"#!/usr/bin/env python
+from os.path import join, dirname, pardir
+import sys
+sys.path.append(join(dirname(__file__), pardir, 'python'))
+from xenv import main
+main()")
+    # - copy it to the right place with right permissions
+    file(COPY "${CMAKE_BINARY_DIR}/xenv" DESTINATION "${CMAKE_BINARY_DIR}/bin"
+         FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
+                          GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+    # - remove the temporary
+    file(REMOVE "${CMAKE_BINARY_DIR}/xenv")
+    # we have to copy the Python package to the bin directory to be able to run xenv
+    # without setting PYTHONPATH
+    file(COPY ${CMAKE_BINARY_DIR}/contrib/xenv/xenv DESTINATION "${CMAKE_BINARY_DIR}/python")
+
+    set(env_cmd "${CMAKE_BINARY_DIR}/bin/xenv" CACHE FILEPATH "Path to xenv command" FORCE)
+
+    install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/xenv DESTINATION scripts)
+    install(DIRECTORY ${CMAKE_BINARY_DIR}/contrib/xenv/xenv DESTINATION python
+            FILES_MATCHING PATTERN "*.py" PATTERN "*.conf")
+  endif()
 
   find_program(default_merge_cmd quick-merge HINTS ${binary_paths})
   set(default_merge_cmd ${PYTHON_EXECUTABLE} ${default_merge_cmd})
@@ -462,9 +491,6 @@ macro(gaudi_project project version)
                            PATTERN "*.cmake.in"
                            PATTERN "*.py"
                            PATTERN ".svn" EXCLUDE)
-  install(PROGRAMS cmake/xenv DESTINATION scripts OPTIONAL)
-  install(DIRECTORY cmake/EnvConfig DESTINATION scripts
-          FILES_MATCHING PATTERN "*.py" PATTERN "*.conf")
 
   if (CMAKE_EXPORT_COMPILE_COMMANDS)
     install(FILES ${CMAKE_BINARY_DIR}/compile_commands.json DESTINATION . OPTIONAL)
diff --git a/cmake/tests/test_LBCORE_716.py b/cmake/tests/test_LBCORE_716.py
index cd891691ec1e5e7e551845052f7e565e10129c77..3b74565b3caeef50eb8591eb94191bf595b956a4 100644
--- a/cmake/tests/test_LBCORE_716.py
+++ b/cmake/tests/test_LBCORE_716.py
@@ -7,7 +7,7 @@ from subprocess import Popen, PIPE
 
 base_dir = os.path.join(os.path.dirname(__file__), 'data', 'LBCORE-716')
 
-xenv_cmd = os.path.join(os.path.dirname(__file__), os.pardir, 'xenv')
+xenv_cmd = 'xenv'
 
 build_log = None
 build_returncode = None
diff --git a/cmake/tests/test_LBCORE_725.py b/cmake/tests/test_LBCORE_725.py
index fec888169c0e6ff35e700e537ae8bc0704ea8b61..5fcc55c94eebdbe9c7cc3103a1a807a677e50d5b 100644
--- a/cmake/tests/test_LBCORE_725.py
+++ b/cmake/tests/test_LBCORE_725.py
@@ -8,7 +8,7 @@ base_dir = os.path.join(os.path.dirname(__file__), 'data', 'LBCORE-725')
 build_dir = os.path.join(base_dir, 'tmp')
 release_dir = os.path.join(base_dir, 'dest')
 
-xenv_cmd = os.path.join(os.path.dirname(__file__), os.pardir, 'xenv')
+xenv_cmd = 'xenv'
 
 build_log = None
 build_returncode = None
diff --git a/cmake/xenv b/cmake/xenv
deleted file mode 100755
index 785dee588bcaa19a9b3355eaee8e853c750484e0..0000000000000000000000000000000000000000
--- a/cmake/xenv
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env python
-import EnvConfig
-EnvConfig.Script().main()